diff --git a/BT-Task b/BT-Task index 140ee245..58b237f9 100644 --- a/BT-Task +++ b/BT-Task @@ -1,5 +1,5 @@ #!/www/server/panel/pyenv/bin/python -#coding: utf-8 +# coding: utf-8 # +------------------------------------------------------------------- # | aaPanel # +------------------------------------------------------------------- @@ -7,11 +7,20 @@ # +------------------------------------------------------------------- # | Author: hwliang # +------------------------------------------------------------------- - +import argparse import os + os.chdir('/www/server/panel') -from BTTask import task - -task.main() +if __name__ == "__main__": + parser = argparse.ArgumentParser(description='BT Task Service') + parser.add_argument( + '--max-workers', + type=int, + default=None, + help='Maximum number of worker threads' + ) + args = parser.parse_args() + from BTTask import task + task.main(max_workers=args.max_workers) diff --git a/BTPanel/__init__.py b/BTPanel/__init__.py index ef7f4925..37feb085 100755 --- a/BTPanel/__init__.py +++ b/BTPanel/__init__.py @@ -210,6 +210,7 @@ menu_map = { 'memu_btwaf': '/btwaf', # Waf 'memu_mailsys': '/mail', # Mail Server 'memuafiles': '/files', # Files + 'menunode': '/node', # Node Management 'memualogs': '/logs', # Logs 'menu_ssl': '/ssl_domain', # SSL 'memuaxterm': '/xterm', # Terminal @@ -1518,7 +1519,7 @@ def ajax(pdata=None): ajaxObject = ajax.ajax() defs = ('get_lines', 'php_info', 'change_phpmyadmin_ssl_port', 'set_phpmyadmin_ssl', 'get_phpmyadmin_ssl', 'get_pd', - 'check_user_auth', 'to_not_beta', 'get_beta_logs', 'apple_beta', + 'check_user_auth', 'to_not_beta', 'get_beta_logs', 'get_version_logs','apple_beta', 'GetApacheStatus', 'GetCloudHtml', 'get_pay_type', 'get_load_average', 'GetOpeLogs', 'GetFpmLogs', 'GetFpmSlowLogs', 'SetMemcachedCache', 'GetMemcachedStatus', 'GetRedisStatus', @@ -2406,7 +2407,7 @@ def panel_public(): def panel_other(name=None, fun=None, stype=None): # 左侧栏路由 if name in ('site', 'database', 'docker', 'wp', 'mail', 'security', 'crontab', 'waf', 'setting', 'logs', - 'monitor/system', 'control', 'binds', 'softs', 'modify_password', 'flow', 'ssl_domain'): + 'monitor/system', 'control', 'binds', 'softs', 'modify_password', 'flow', 'ssl_domain', 'node'): return index_new('{}/{}'.format(name, fun)) # 插件接口 @@ -4049,7 +4050,8 @@ def ssh_security_v2(pdata=None): 'stop_jian', 'get_jian', 'get_logs', 'set_root', 'stop_root', 'start_auth_method', 'stop_auth_method', 'get_auth_method', 'check_so_file', 'get_so_file', 'get_pin', 'set_login_send', - 'get_login_send', 'get_msg_push_list', 'clear_login_send', 'set_root_password') + 'get_login_send', 'get_msg_push_list', 'clear_login_send', 'set_root_password', + 'get_sshd_anti_logs', 'set_anti_conf', 'get_anti_conf', 'del_ban_ip') return publicObject(firewallObject, defs, None, pdata, is_csrf) @@ -4209,19 +4211,13 @@ def abnormal_v2(pdata=None): return publicObject(dataObject, defs, None, pdata) -@app.route(route_v2 + '/project/nodejs/', methods=method_all) -@app.route(route_v2 + '/project/nodejs//html', methods=method_all) -@app.route(route_v2 + '/project/docker/', methods=method_all) -@app.route(route_v2 + '/project/docker//html', methods=method_all) -@app.route(route_v2 + '/project/quota/', methods=method_all) -@app.route(route_v2 + '/project/quota//html', methods=method_all) -@app.route(route_v2 + '/project/proxy/', methods=method_all) -@app.route(route_v2 + '/project/proxy//html', methods=method_all) -@app.route(route_v2 + '/project/webbasicscanning/', methods=method_all) -def project_v2(def_name): +@app.route(route_v2 + '/project//', methods=method_all) +@app.route(route_v2 + '/project///', methods=method_all) +def project_v2(mod_name, def_name, stype=None): + # ps: classV2 projectModelV2 动态调用 if request.method not in ['GET', 'POST']: return - path_split = request.path.split("/") - if len(path_split) < 5: return + if not mod_name: return abort(404) + if not def_name: return abort(404) comReturn = comm.local() if comReturn: return comReturn from panelProjectControllerV2 import ProjectController @@ -4229,9 +4225,10 @@ def project_v2(def_name): defs = ('model',) get = get_input() get.action = 'model' - get.mod_name = path_split[3] + get.mod_name = mod_name get.def_name = def_name - if request.path.endswith('/html'): + get.stype = stype + if stype == 'html': return project_obj.model(get) return publicObject(project_obj, defs, None, get) @@ -4608,7 +4605,7 @@ def ajax_v2(pdata=None): ajaxObject = ajax_v2.ajax() defs = ('get_lines', 'php_info', 'change_phpmyadmin_ssl_port', 'set_phpmyadmin_ssl', 'get_phpmyadmin_ssl', 'get_pd', - 'check_user_auth', 'to_not_beta', 'get_beta_logs', 'apple_beta', + 'check_user_auth', 'to_not_beta', 'get_beta_logs', 'get_version_logs','apple_beta', 'GetApacheStatus', 'GetCloudHtml', 'get_pay_type', 'get_load_average', 'GetOpeLogs', 'GetFpmLogs', 'GetFpmSlowLogs', 'SetMemcachedCache', 'GetMemcachedStatus', 'GetRedisStatus', @@ -5517,6 +5514,7 @@ def databaseModel_v2(def_name): @app.route(route_v2 + '/safe/security/', methods=method_all) @app.route(route_v2 + '/safe/ssh/', methods=method_all) @app.route(route_v2 + '/safe/syslog/', methods=method_all) +@app.route(route_v2 + '/safe/serversafe/', methods=method_all) def safeModel_v2(def_name): if request.method not in ['GET', 'POST']: return path_split = request.path.split("/") @@ -6289,43 +6287,32 @@ def push_v2(pdata=None): # 2024/1/24 上午 11:42 新场景模型的路由 -# def panel_mod_v2(name=None, sub_name=None, fun=None, stype=None): -@app.route(route_v2 + '/mod/push/msgconf/', methods=method_all) -@app.route(route_v2 + '/mod/push/task/', methods=method_all) -@app.route(route_v2 + '/mod/proxy/com/', methods=method_all) -@app.route(route_v2 + '/mod/proxy/com//', methods=method_all) -@app.route(route_v2 + '/mod/docker/com/', methods=method_all) -@app.route(route_v2 + '/mod/docker/com//', methods=method_all) -@app.route(route_v2 + '/mod/ssh/com/', methods=method_all) -@app.route(route_v2 + '/mod/ssh/com//', methods=method_all) -@app.route(route_v2 + '/mod/backup_restore/com/', methods=method_all) -@app.route(route_v2 + '/mod/backup_restore/com//', methods=method_all) -def panel_mod_v2(fun=None, stype=None): +@app.route(route_v2 + '/mod///', methods=method_all) +@app.route(route_v2 + '/mod////', methods=method_all) +def panel_mod_v2(name=None, sub_name=None, fun=None, stype=None): """ @name 新场景模型的路由 @param "data":{"参数名":""} <数据类型> 参数描述 @return dict{"status":True/False,"msg":"提示信息"} + + PS: mod/project/... 动态调用 + name为场景名称,如push、proxy、docker, java, php等 + sub_name为该场景下子模块名称,如push下的 msgconfMod、taskMod等, 不带Mod + fun为调用 main类的方法 + stype为响应类型,json或html,默认json """ + # 取消 /mod/ 路由下的强制绑定账号限制 2025/06/19 # if not public.is_bind(): # return redirect('/bind', 302) if public.is_error_path(): return redirect('/error', 302) - path_split = request.path.split("/") - if len(path_split) < 5: return - name = path_split[3] - sub_name = path_split[4] - - if not name: - return abort(404) - if not sub_name: - return abort(404) - if not re.match(r"^[\w\-]+$", name): - return abort(404) - if not re.match(r"^[\w\-]+$", sub_name): - return abort(404) - if fun and not re.match(r"^[\w\-.]+$", fun): - return abort(404) + if not name: return abort(404) + if not sub_name: return abort(404) + if sub_name.endswith('Mod'): sub_name = sub_name[:-3] + if not re.match(r"^[\w\-]+$", name): return abort(404) + if not re.match(r"^[\w\-]+$", sub_name): return abort(404) + if fun and not re.match(r"^[\w\-.]+$", fun): return abort(404) comReturn = comm.local() if comReturn: return comReturn diff --git a/BTPanel/languages/all/pt.json b/BTPanel/languages/all/pt.json index bfc52802..38239491 100644 --- a/BTPanel/languages/all/pt.json +++ b/BTPanel/languages/all/pt.json @@ -1,70 +1,133 @@ { - "f41a4952dfc4caafbed0a6afdd243bff": "Erro de certificado, por favor verifique!", + "f41a4952dfc4caafbed0a6afdd243bff": "Erro de certificado, verifique!", "2dfadbc8b23727991de7eb9457f56252": "O certificado foi salvo!", - "7961d31b9b6db7593b5f8795273b5b64": "Falha ao solicitar certificado. Por favor, tente solicitar manualmente um certificado para o domínio do painel na página de gerenciamento do site.", + "7961d31b9b6db7593b5f8795273b5b64": "Falha ao solicitar certificado, tente solicitar manualmente um certificado para o domínio do painel na página de gerenciamento do site", "d29c0b7e434fe9f40120f2a7f8111c9e": "Arquivo SSL não encontrado! {}", "c4ca4238a0b923820dcc509a6f75849b": "1", "96ee8f18814766fdf066df97d3e1f6ea": "Você precisa vincular o domínio ao painel antes de solicitar o certificado Let's Encrypt.", "7c14ab8a86515227c637d1d045e8d422": "Configurado com sucesso!", "a453af2e4da41ca8c5035d61b961c1ae": "O banco de dados não existe", - "ca9c87b1d4c2f8af80c61cf22e43250d": "Já existe uma tarefa de backup neste período. Recomenda-se escolher outro horário.", + "ca9c87b1d4c2f8af80c61cf22e43250d": "Já existe uma tarefa de backup neste período. Recomendado escolher outro horário", "e0aa021e21dddbd6d8cecec71e9cf564": "OK", "4db53632205257cce66f7b93d6c71e84": "O site não existe", "dc542b3a7ffb20d7a1fc0c2b35f208d8": "O diretório não existe", - "4cc4ddc196a295ee4ab82daec08f91a6": "O site não existe", + "4cc4ddc196a295ee4ab82daec08f91a6": "Site não existe", "25bb121145f918572eea2ef07ff8e89c": "Erro de backup", "f8320b26d30ab433c5a54546d21f414c": "Falso", - "18928426418954e3a8bc166c892af5c5": "Usuário ou senha não podem estar vazios!", - "14422683e14b8a03fd02b84480703c41": "Você falhou ao fazer login muitas vezes, tente novamente em {} segundos!", - "179b0ad118200b66c6e90535d9d8ad4f": "Os inodes do disco foram esgotados, o painel tentou liberar inodes. Por favor, tente novamente...", - "7edd0140c2f050286273be74039b1df7": "Falha na verificação, atualize a página e faça login novamente!", - "9a9b0bf6269ba974cc6a00bb0f0de1d0": "O código de verificação não pode estar vazio!", - "2b7ae590e0538e70b7a359a94d30f1f4": "Código de verificação incorreto, tente novamente!", - "21f763b26858bf8ff40f931d714ab106": "usuário ou senha incorretos, 1. Verifique se o domínio está vinculado ao site correspondente.

2. Verifique se o domínio está resolvido corretamente para o servidor ou se a resolução ainda não está totalmente efetiva.

3. Se seu site tem proxy reverso ou usa CDN, desative primeiro.

4. Se seu site tem redirecionamento 301, desative primeiro.

5. Se as verificações acima confirmarem que não há problema, tente mudar o provedor de serviço DNS.

", + "4d6822ed3bd01f379f2ab4b1e68068d7": "|-Não há certificados para renovar no momento.", + "b74c00ca5fee122c49cd66ce3d91b2cf": "|-Falha na renovação:", + "f6039d44b29456b20f8f373155ae4973": "Nome de usuário", + "3544848f820b9d94a3f3871a382cf138": "Nova senha", + "6b1bc4e672d58d46d23502dcd78129be": "Limpando informações de log", + "0e900c57ee4635719ba671229ead12ff": "Limpando histórico de tarefas", + "1dfefaa079cbde4da09e89af6b49ff33": "Limpando registros de monitoramento de rede", + "f59489317e210ec566cf6b6c9e3b20b9": "Limpando registros de monitoramento de CPU", + "e0976b426e3109ee01a1182b7c04b987": "Limpando registros de monitoramento de disco", + "2c1eb277ff700f04b65306399784f875": "Limpando informações de IP", + "4abfe31831aa15dc27ff44067b2bf0d1": "Limpando histórico do sistema", + "0c06c1eb5ef47b883f7cbcab9be84e97": "O painel foi empacotado com sucesso. Por favor, NÃO faça login no painel para realizar outras operações!", + "b60091f633dedd493b16f5548e32233d": "Endereço de inicialização do painel", + "b097eb5212f13c74d1c96b59f65c4dd6": "Tarefas {} limpas com sucesso!", + "e82eb2921856b4230611dc1406f60a6f": "Lixo do sistema limpo, total de [{}] arquivos excluídos, espaço em disco liberado [{}]", + "0d793de4ae05511630a2eeea9b5528d9": "|-Limpo [{}], excluídos [{}] arquivos, espaço liberado [{}]", + "db62071d34202efa3a0aa1a743394938": "|-Spool limpo, excluídos [{}] arquivos, espaço liberado [{}]", + "a1d3c6c221b8ceaaef8881e09d0a2945": "|-Limpando Sessão PHP...", + "c16f6a333c0ba871467568be496cbea0": "|-Sessão PHP limpa, excluídos [{}] arquivos, espaço liberado [{}]", + "5d88b58a1c0ba0dee9eeb89a8bcdda36": "|-Limpando arquivos temporários e logs do site...", + "e038ca57ad9c03f40bec42908af2ccff": "|-Arquivos temporários e logs do site limpos, excluídos [{}] arquivos, espaço liberado [{}]", + "fa3d217e80478d3c03c437b7fc11432f": "|-ERRO, nome de usuário não pode ter menos de 5 caracteres", + "4cffae9f32bf898c859a5937268b9727": "|-ERRO, não pode usar nome de usuário muito simples", + "fbcb6a4b1126170666b4c4102afbb43d": "|-Novo nome de usuário: {}", + "cbe2d798534f872748b7cba6615596d8": "Edição personalizada com aaPanel", + "ec1d9ff2578e1f231696217b2c2d15ab": "Falha, impossível excluir a porta atual do painel!", + "51708089c15820800d3dd7bd8d8cdfba": "aaPanel", + "fee066b1b93fecf9545758cf9a87c3de": "Atualizando plugin...", + "c6462fea6d27e4ecfc68ae1944051f77": "Login bem-sucedido, carregando...", + "c11f9218de293117d2cd58a009534167": "Todos os plugins atualizados com sucesso para compatibilidade 6.0!", + "cc478711642936a519c27b7c388fbb50": "CLI aaPanel", + "cfef992430ab5a7b2373138d4b86425c": "Reiniciar painel", + "95b8b68d1c80ca75e1ab15bf5b9a8394": "Alterar porta do painel", + "f3013e54b467cdb2fac9a424bae963e4": "Parar painel", + "15ea17031cb6a968e3b9ea2b28546c53": "Limpar cache do painel", + "20cdfcd210da305d900d25ec4c084184": "Limpar limite de login", + "ab41db99c7941ef74c37bd97733f7707": "Recarregar painel", + "315f4fdd99e49c6a2e80a95ce82ba534": "Cancelar limite de entrada", + "07ed88796641228c3602122cf5075fc2": "Alterar senha do painel", + "63d8f2a0e51e9243f91b0285e4e44667": "Cancelar limite de vinculação de domínio", + "3913f08c2fa53f4c413cc0772f9401d1": "Alterar nome de usuário do painel", + "b773a80578cdc8f50d57393d6b0a3d67": "Cancelar limite de acesso IP", + "a6a23a4004f99fef13372de56433edbc": "Forçar alteração da senha root do MySQL", + "bc449263dd0183a82a3d0a03cd8f26dc": "Ver informações padrão do painel", + "0b1c93d38c86c8d379886293cdf8ba66": "Tarefa cancelada!", + "975687e8a64e2c2842a34ca6d6bf8e85": "Limpar lixo do sistema", + "84bc199f1a5ce205b0f5fc3e64ef3e95": "Por favor, insira o número do comando:", + "954be127268a1704a7af22b23bb440e8": "Cancelado!", + "51c6348531daaf0fb1e84fafa12b5f15": "Por favor, insira a nova senha: ", + "34c4edd98a45ea8a13556965a6c4f2b0": "Por favor, insira o novo nome de usuário (>5 caracteres): ", + "219863186dddc079747a525bb7877a88": "Por favor, insira a nova senha root do MySQL:", + "c172da334fdcac77f704fa4408dd2f16": "|-ERRO, senha não pode estar vazia", + "a79cf67c04d379c4916dc584c9d8333f": "|-ERRO, senha não pode ter menos de 8 caracteres", + "06f5000079703a33b91564159f07770a": "|-ERRO, senha não pode conter caracteres especiais", + "913153f9957100bcf3029e8f3d5bc5e9": "Por favor, insira a nova porta do painel: ", + "39ea14ec0df812219c450ba15230ad2d": "|-ERRO, nenhuma porta válida inserida", + "bab5cb07adebbfbd938180d6862a7ce7": "|-ERRO, por favor NÃO use portas comuns como porta do painel", + "00213d6b5423971311e5a47f83081a24": "|-ERRO, a nova porta é a mesma da atual, não há necessidade de mudar", + "e1e57838b2c7e1567fb96e20bfd474e0": "|-ERRO, a porta especificada já está em uso", + "5093d954f09d473d091355fe292920a8": "|-Limite de entrada cancelado", + "e0b1cb1725c8fb29d42fa69d679a73ea": "|-Limite de domínio cancelado", + "968c7b9246b5ab3d3e7659cea211a20b": "|-Limite de acesso IP cancelado", "169137d790f7352d616082ad8498e7dc": "Configurado com sucesso!", - "7901466782835534ad8736db6ef1f5f1": "Chave de login inválida1", - "f155037a804d9eb3e28318ac56b4cce7": "A chave especificada não existe ou expirou1", - "6eef9dff3428b19422dbbfe061fc8266": "Chave de login inválida2", - "ea4dede6817ca735a9df32b4e63fd1ac": "Chave de login inválida3", - "4682250bcbe96f4c0c59712ef1ff1560": "Chave de login inválida4", - "8b4bcc31cc9ad0a259e17a1ebfcfb859": "A chave especificada não existe ou expirou5", - "c132c7b820d6b4d23038989f10dc7d90": "Tempo de validade do código QR expirou6", - "ab72200c3852bb7165e1e0d9456c5679": "Código escaneado com sucesso, entrando!", - "d003e41a7688df391d78442602802077": "Chave de login inválida", - "8b7e4d42188dd3064e99d4cc76f2f94d": "O código QR atual expirou, atualize a página e escaneie novamente!", - "238baadc7351e6af7625f2b3c888adfd": "Este servidor está vinculado a um máximo de {} dispositivos, o limite foi atingido!", - "e615667ab7e4ce542cc2de0e95b5983c": "Falha na verificação!", - "9d45236535b39cb2afdc976ef584dc89": "Um servidor permite até {} vínculos de dispositivos!", - "883102f20053b7b88799f5712192fcec": "Vinculado com sucesso!", - "eb21cf2eed85a178a9cb642a0175f402": "Excluído com sucesso!", - "c332d7ea3375e567e1b586dfb79c2156": "Não é possível configurar a API através da interface da API", - "166be1ba5c792888e84a51c48f5a5eed": "Chaves temporárias só podem ser obtidas através da interface da API", - "dd923e13e2389e764f7d833482dc58d3": "Email ou senha do usuário não podem estar vazios!", - "a72005cea9c8d0e8925115a09f62e834": "Por favor, insira um email válido", - "583e0c5cfd4be57cb9bef0a1745f81c8": "informação de erro : {}", - "086a727d5b55e2ccedc7cd0c194936f0": "informação de erro2 : {}", - "2b770a5bd35c0e286c6296f942990bf7": "Registrado com sucesso", - "a3dcb5c816b8d611f73cddb3c53578d4": "informação de erro6 : {}", - "8089be0bb8586c6081d4cd8dd9223d76": "O email não foi validado", - "2bdacd9b8281d94958a8da4d29420926": "Vinculado com sucesso", - "7826987ad3c4b2226b8f7a601657d23b": "Usuário, email ou senha inválidos! Verifique e tente novamente!", - "a7ea66c7a7ca61c727cf1ebe830ffed2": "Falha ao conectar ao servidor!", "3f96c422b7a59fe6e8bf7531c647a64c": "A conta especificada não existe", "cb5e7fdc51569eedfbf3a9a0d3c819cc": "O pedido especificado não existe!", "8bd32b310825307a909c682871008642": "Pedido excluído com sucesso!", @@ -72,45 +135,43 @@ "023d5992564106099e169c79963e8ed8": "Nenhum certificado encontrado para o pedido especificado!", "572097b2302e2c7fe0a3375db4e3ad9b": "Falha na leitura do certificado!", "a28e320cb6513b4ad7e9b07318173cb5": "Certificado revogado!", - "d0b3af29d4790521c7850f4955d66745": "Necessário pelo menos um nome de domínio!", + "d0b3af29d4790521c7850f4955d66745": "Precisa de pelo menos um nome de domínio!", "48203f43edd25a6df396ff263a02ea45": "Falha ao gravar arquivo de verificação: {}", "ebe9660f1426b037f25101329deed827": "Nenhuma informação válida de chave DNSAPI encontrada", - "a618b4f6cda69737d20199139556d955": "Informações de verificação do pedido ausentes, tente solicitar novamente!", - "9ab9f8e94ee4cde7ab0c2f516cb12367": "Falha na verificação do nome de domínio. Por favor, tente solicitar novamente!", + "a618b4f6cda69737d20199139556d955": "Informações de verificação do pedido ausentes, tente reaplicar!", + "9ab9f8e94ee4cde7ab0c2f516cb12367": "Falha na verificação de domínio. Por favor, tente aplicar novamente!", "585f0e7802a68df8899b96bc67ae11bc": "O pedido não existe!", - "a10a65f23fcb6e0ac204f2de7b5fe9f3": "Tempo limite de conexão com o servidor CA, tente novamente mais tarde.", - "188c4e0ff2d4cb58ecfcd2608cfeea2c": "Falha na conexão com servidor DNS, verifique se a chave está correta.", + "a10a65f23fcb6e0ac204f2de7b5fe9f3": "Conexão com servidor CA expirou, tente novamente mais tarde.", + "188c4e0ff2d4cb58ecfcd2608cfeea2c": "Conexão com servidor DNS falhou, verifique se a chave está correta.", "d568b4df4d83c54698fe15ad656181ed": "Falha na emissão, o domínio {} excedeu o limite de reemissões semanais!", - "5ac0673b95a9e6af88bb008e24c09bf4": "Falha na conexão com o servidor CA, tente novamente mais tarde.", - "2948ef630d1bdb0b2e7209d83f13af67": "Nome de domínio não suportado {}, verifique se o nome está correto!", - "27bad102d3dd6f86d5f6c680c8353089": "Falha na criação do pedido, tente novamente mais tarde!", - "1a728d28f052c9956f9d014d60c61bff": "Acesso negado pelo servidor CA, tente novamente mais tarde!", - "35390f482d893d9c9c0c0bb055e70572": "Muitas solicitações para este domínio. Tente novamente em 3 horas", - "cae6404c4aecf46684930fe2a86676a6": "Deixar", + "5ac0673b95a9e6af88bb008e24c09bf4": "Falha na conexão com servidor CA, tente novamente mais tarde.", + "2948ef630d1bdb0b2e7209d83f13af67": "Domínio não suportado {}, verifique se o domínio está correto!", + "35390f482d893d9c9c0c0bb055e70572": "Muitas requisições para este domínio. Tente novamente em 3 horas", + "cae6404c4aecf46684930fe2a86676a6": "Let's Encrypt", "ab511534580180bb5c56aab7331d0c36": "A CA não consegue encontrar ou obter o registro DNSKEY usado para verificar a assinatura DNSSEC", "d957a97cf30dda2b8d8969c068a32eaf": "Falha ao baixar certificado: {}", "7c1bcdcad166aaaec98c557f8c12d2cf": "O arquivo de certificado especificado não existe!", - "22d9a8450558b9bf05b71c456bf07e4c": "Falha na aquisição das informações do certificado!", - "bab62ab47e998a0ca716266835bf8a31": "|-Criando pedido..", - "6517db66d510fdaea47a55ff778a0c94": "|-Obtendo informações de verificação..", - "655a6038ba5837b278b39e18d93adea0": "|-Verificando nome de domínio..", - "2d51882843ffc29148c2ced7741663dc": "|-Enviando CSR..", - "dfa86860b18fd5248e3e72415c19233c": "|-Baixando certificado..", - "7e0173b4f1e9e78c08a70a0350422af2": "Solicitação bem-sucedida!", - "02900bf9834436584397d0e1ed6d6385": "|-Solicitação bem-sucedida, implantando no site..", + "22d9a8450558b9bf05b71c456bf07e4c": "Falha na aquisição de informações do certificado!", + "bab62ab47e998a0ca716266835bf8a31": "|-Criando pedido...", + "6517db66d510fdaea47a55ff778a0c94": "|-Obtendo informações de verificação...", + "655a6038ba5837b278b39e18d93adea0": "|-Verificando domínio...", + "2d51882843ffc29148c2ced7741663dc": "|-Enviando CSR...", + "dfa86860b18fd5248e3e72415c19233c": "|-Baixando certificado...", + "7e0173b4f1e9e78c08a70a0350422af2": "Aplicação bem-sucedida!", + "02900bf9834436584397d0e1ed6d6385": "|-Aplicação bem-sucedida, implantando no site...", "cc7bd98381615b01789afbd472cb8ed3": "ID do site não pode estar vazio!", - "decd4452e2e4872aa81049fea69a0c24": "Site perdido, não é possível continuar solicitando certificado", + "decd4452e2e4872aa81049fea69a0c24": "Site perdido, impossível continuar aplicando para certificado", "7c3971b737ee58a9dec0e00a1df8f943": "O arquivo de configuração do serviço ({}) do projeto atual foi modificado e ", - "4dd7615dbb05a4e001b3b5fa6d71bc16": "O site está faltando e ele", - "5963b5b95c2063d2668607bac1fde358": "SITE_SSL_ERRO_301", - "6c24a729c1cf9fc0159e92cb2f35f055": "Sites com proxy reverso ativado não podem solicitar SSL!", - "48a7613459bf65ba48bf9994a3104f2f": "O site já ativou o redirecionamento.", + "4dd7615dbb05a4e001b3b5fa6d71bc16": "O site está faltando e", + "5963b5b95c2063d2668607bac1fde358": "SITE_SSL_ERR_301", + "6c24a729c1cf9fc0159e92cb2f35f055": "Sites com proxy reverso habilitado não podem aplicar para SSL!", + "48a7613459bf65ba48bf9994a3104f2f": "O site já habilitou redirecionamento.", "28c497ddb0cfa97dd612d83c5efdc225": "Após configurar HTTPS obrigatório ", "50e7b6d6602a2f42e45ee7c147824b04": "Falha no download. O pedido não foi encontrado.", - "d4d3f12047351f973751b65b50bf54ea": "|-Solicitação bem-sucedida!", - "cf6c5b924aa4aede56b3e0e0373ec1f8": "Por favor, especifique o domínio para solicitar o certificado", + "d4d3f12047351f973751b65b50bf54ea": "|-Aplicação bem-sucedida!", + "cf6c5b924aa4aede56b3e0e0373ec1f8": "Por favor, especifique o domínio para aplicar o certificado", "e08c1382c834439d0fdccbc24d36ec86": "Por favor, especifique o tipo de verificação", - "ed5c4feb5edcfbb95544d094d451921e": "Por favor, especifique o diretório raiz do site", + "ed5c4feb5edcfbb95544d094d451921e": "Por favor, especifique a raiz do documento do site", "fb3d957c8fad98876c10db10e32c0126": "Por favor, especifique DNSAPI", "e3b11e6d575174fdb838e311bb404fd5": "Por favor, especifique a chave DNSAPI", "dcbd3fcb143a3101480566f5c1f07ad3": "Por favor, especifique o segredo DNSAPI", @@ -119,28 +180,61 @@ "976ac0dffedabc5b60bf5a009a5a4e05": "renovar certificado v2", "0810d42ec985c7c4beb6416c649c82a8": "renovar certificado v3", "6953519c64b998226d0294b961deca62": "Revogar certificado", - "1bbd31373b98ad5a6320af00b2a15ee0": "Renovar quando o tempo de expiração for menor ou igual a certo tempo", + "1bbd31373b98ad5a6320af00b2a15ee0": "Renovar quando o tempo de expiração for menor que certo tempo", "8fcc1d6fd24fad55d9e8fea6631886db": "Por favor, insira o índice do pedido a ser revogado no parâmetro --index", - "b0698ab9adefa7515299f311c725ba4d": "Ordenação limpa com sucesso", - "8611f56e253646a455ceeb020052fa97": "Falha ao modificar", - "ebdcf538e79de6922f498cc8c735eab5": "O firewall do sistema não está aberto", - "a296add6341b715925c0be2b83514ee3": "O endereço IP inserido é ilegal!", - "3433b9709eed7423f1900061ef743af6": "Desativar este IP fará com que seu servidor falhe", - "57e7b2320dd3984312335605d57ee0f8": "O IP existe na lista de bloqueio, não é necessário repetir o processo!", - "4bb8df740a7119979ff7854d034200a8": "Endereço IP ilegal!", - "998ad6f12ce5285a1b72d4265d9b36cc": "Excluído com sucesso", - "ff9c66f005c08efd15752fb261057b46": "O intervalo de portas deve estar entre 22 e 65535!", - "b26b09909c3b090f31dba4a0986e1b84": "A porta existe, não é necessário repetir a liberação!", - "408f58c25fc55295236fbb64a2d884ff": "Falha, não é possível excluir a porta atual do painel", - "e274abcaad0a7fff74d9adb67e578d5f": "Falha ao excluir", - "ad6fc2abb89b42d391b4bf84e8e6cd2d": "Serviço SSH desligado", - "0692d6f0819524aaa05e73f03022ec5b": "Serviço SSH ligado", - "d0749aaba8b833466dfcbb0428e4f89c": "SUCESSO", - "ffdc24f916f3071233ca7710aff032c8": "{}", - "6e264f3408e9b769d3fb7e2c807f301f": "A operação falhou. Verifique se a chave está correta", - "d4ac5985eccd334896e3cf23706e43b0": "Adicionado com sucesso", - "92188d43af4373bacbf00951da16532a": "Falha ao obter o caminho do site. Verifique se o site existe", - "ceaefd9a46d78491b9fdb912b5c71eeb": "Falha ao criar o arquivo de validação. Verifique se a gravação foi bloqueada", - "1bb3608b1bc684c3dc85090db249346b": "Nenhuma informação de certificado foi obtida", - "b0a783e3ada9e792e3ff3ca4eb477c80": "Certificado não existe!", - "fca4e47d90253577901e874737b87dc0": "Erro de leitura do certificado!", - "813595d6c41e417bea96adb1ad89043f": "Erro de formato do certificado", - "16e6977cb4d0694335f3492ad8767370": "Certificado não encontrado", - "b267d8a6cbf23d69056263e194742c06": "Certificado inválido", - "f8ad04059d0821e2ece2ed287bb3cd13": "Erro no formato das informações do certificado", - "a441b2686419ee07dac67ba6bbf3ddf5": "erro de gravação no banco de dados", - "34c7694451633cb615e98b06d040c5c7": "erro de consulta no banco de dados:", - "ba709b27ba6099126b4162a916a20174": "não logado, então ele", - "ae01e57647be41f3c1e2a0e49dae3de8": "falha ao obter dados da nuvem!", - "8d1747726b316e3a1063e5db9fe65864": "falha ao obter nuvem!", - "ff34f52bf8f702f83843e0d8f3e6bfac": "parâmetros errados", - "41309f5b21613cfea3728a55036f9970": "não logado, portanto, não é possível fazer upload para a nuvem!", - "6e4a26963219701ba8e062a1255fe089": "Nenhum certificado especificado.", - "2c7d38ab0f7a91f5474efc897eaf4b2a": "Sucesso na exclusão do arquivo local. Mas falha na exclusão do arquivo na nuvem.", - "501ffa672acb20c4764563d6e839879b": "Falha ao conectar à nuvem. Não foi possível excluir dados na nuvem.", - "a810cdf921c5b92a3f6d29667ec78ffc": "exclusão bem-sucedida", - "df569fbc92d17644e83b44541596633f": "Falha ao conectar à nuvem.", - "140bda69874872f8402052c613c0b3b9": "Email de Teste de Alerta do aaPanel", - "76a1ec4a3fcdc304394ff14dc90f8072": "O número de threads do painel deve estar entre 1-1024", - "dd7e82b5fb3c67e3e41d96f22ba838fd": "Nova porta do painel", - "248336101b461380a4b2391a7625493d": "Salvo", - "40624aabb99173387dd6d575759b12db": "O parâmetro certPem está faltando!", - "37db9679113eef382992a1478f1b79ff": "O parâmetro privateKey está faltando!", - "7063e5fbf2ea8d0809fe307b6df00467": "Certificado salvo!", - "d2174fc17fcd785706114088b84dbbce": "URL de login temporário foi gerado", - "b5101eb6e685091719013d1a75756a53": "\\1", - "0bfe47819da04212a33dac83b71430e8": "\\2", - "bef28b813bf12be3924925bbb62883dd": "Executado com sucesso!", - "fda63bff3e0143980e5761376859b00b": "Falha na execução, verifique se o Apache está instalado", - "22012355700877ab73f89de8014ab20b": "Erro de configuração de regra do Apache:
falha ao ativar:

", - "9848c96a046adb1759233241661ff694": "O serviço {} falhou ao iniciar", - "6ed577cdce37bbd9c66871ac1677dc53": "Falha ao parar o serviço!", - "572e5703371c43aae299181c0e3567d4": "Por favor, execute o programa quando todas as tarefas de instalação terminarem!", - "c7138b4b5f7ded833942aef4e230771d": "Comando enviado com sucesso!", - "d56f0ed99825b4d62ab84753a65f7f1e": "Painel reiniciado", - "3d8c9e517719022b27ad5f27c578fa31": "Obter RAM Falso", - "d47ab7b9ce539ba13f4e045561bb8ed7": "Obter Uptime Falso", - "8e39175bab478762d3d029bee327c704": "Obter Tempo de Reinício Falso", - "e16cf27704f83c8b0a0efc16886ea75d": "Obter data Falso", - "c158c8096b76b85803e71232b2dd5e74": "Obter detalhes de tempo Falso", - "a6ec06b5eb6a42e13e072d2e992e31a0": "Obter reqpersec Falso", - "cdd32490a46567fd0c1ee9d4b170b762": "Obter TotalAccesses Falso", - "62b939086708b37d68c00cb713994b52": "Obter TotalKBytes Falso", - "13b06d17b35dfeeafa50e12ad9ec1735": "Obter BusyWorkers Falso", - "724fc9214ccce3e6a5787648240a4533": "Obter IdleWorkers Falso", - "7a7f329389283fdd3290c735f90946e9": "configuração mpm_event_module não encontrada ou /www/server/apache/conf/extra/httpd-mpm.conf está vazio", - "c22cf8376b1893dcfcef0649fe1a7d87": "Segundo", - "db669c6377ab90eef78800a48fd4a453": "Tempo limite da solicitação (Request timeout)", - "af52f5340c065f4d38182f7a27d59f75": "Manter vivo (Keep alive)", - "70b46e57f3c33abdb9558bc5c3a234d9": "Máximo de solicitações keep-alive por conexão", - "6868568c3abc547e622a303891a906b0": "Processos padrão", - "224114c62dceb7ebee2db43c6c79a961": "Número máximo de threads ociosos", - "3c60809d9a5a0900dfbc28bb017e410b": "Número mínimo de threads ociosos disponíveis para lidar com picos de solicitação", - "3783030daf8154be6e11fc4160c229c3": "Número de threads criados por cada processo filho", - "2f25e4b1a2cb84576740da749a2daef2": "Número máximo de conexões que serão processadas simultaneamente", - "72e3edfd72758944413b1e4e9c432f1e": "Limite no número de conexões que um servidor filho individual manipulará durante sua vida", - "26c74a59d7d10bd927dce45e449943f1": "ERRO de configuração", - "b2d87dda66a4643c6cf673f787c5f226": "Arquivo de configuração não existe", - "bff9ef87fdda677f86ae6dddec54a104": "Nenhuma versão compatível do PHP encontrada, instale primeiro", - "4bbfcde12aa36ec375a332f51bf905d6": "Por Dia", - "60956b50bb8e8c711d3adb889a70137f": "Por Dia, executar às {} Hora(s) {} Min", + "fa57fd4dd2f47d6e5e076c347fbee513": "SITE_ADD_ERR_DOMAIN_TOW", + "4eb35aa4b95736df133dd3ad772f1ec9": "Diretório crítico do sistema não pode ser usado como diretório do site", + "4bbfcde12aa36ec375a332f51bf905d6": "Diariamente", + "60956b50bb8e8c711d3adb889a70137f": "Diariamente, executar às {} Horas {} Min", "78748f15bb65939b6d130c3a5cf8b7dc": "A cada {} Dias", - "cf9af10dcebe2f12092ff6028a535f08": "A cada {} Dias, executar às {} Hora(s) {} Min", + "cf9af10dcebe2f12092ff6028a535f08": "A cada {} Dias, executar às {} Horas {} Min", "e114abed903b9d26c476d4f6cd59c04b": "Por Hora", "0aef48ea8132b0551fa25a10fd0a6585": "Por Hora, executar aos {} Min", "50419faf9662e0c3f283d496bcb8eb72": "A cada {} Horas", @@ -292,9 +283,9 @@ "84d94bf0382f611906b7edd65d6af169": "A cada {} Minutos", "14d27796d1c96457c7c019661a2f32d4": "Executar a cada {} Minutos", "6c25e6a6da95b3d583c6ec4c3f82ed4d": "Semanalmente", - "e1df614d393ab86fd63c5062f7e77936": "Todo(a) {}, executar às {} Hora(s) {} Min", + "e1df614d393ab86fd63c5062f7e77936": "Todo(a) {}, executar às {} Horas {} Min", "9030e39f00132d583da4122532e509e9": "Mensalmente", - "69c5e99b9ad8d2b8f11be9a60cbf71da": "Mensalmente, executar no dia {} às {} Hora(s) {}Min", + "69c5e99b9ad8d2b8f11be9a60cbf71da": "Mensalmente, executar no dia {}, às {} Horas {} Min", "9d1a0949c39e66a0cd65240bc0ac9177": "Domingo", "6f8522e0610541f1ef215a22ffa66ff6": "Segunda-feira", "5792315f09a5d54fb7e3d066672b507f": "Terça-feira", @@ -302,362 +293,265 @@ "78ae6f0cd191d25147e252dc54768238": "Quinta-feira", "c33b138a163847cdb6caeeb7c9a126b4": "Sexta-feira", "8b7051187b9191cdcdae6ed5a10e5adc": "Sábado", - "e00d5128f631253b7b6ed8d5454c0c81": "Não foi possível gravar no arquivo, verifique se o [Fortalecimento do Sistema] está ativado!", + "e00d5128f631253b7b6ed8d5454c0c81": "Não foi possível gravar no arquivo, verifique se [Fortalecimento do Sistema] está ativado!", "685689743579a8f09fcec5d7df04e39e": "O nome da tarefa não pode estar vazio!", "a5c04aced897c770105858268324b53f": "A tarefa atual está com status Desativado, abra a tarefa antes de modificar!", "85305ee6be0f078791c7437ec54dda12": "Falha ao adicionar", - "08a1ce771119bb393fa49478216ae809": "o log está vazio", + "08a1ce771119bb393fa49478216ae809": "log está vazio", "b8fd4dbe5c3650beaec0a3d44d7f0245": "Logs esvaziados", - "ff47c70e853d0b3635935be883b018e9": "Falha ao esvaziar os logs da tarefa!", + "ff47c70e853d0b3635935be883b018e9": "Falha ao esvaziar logs de tarefa!", "e0c4da1afd18acbb66bc5fac261a42ef": "A tarefa especificada não existe!", + "998ad6f12ce5285a1b72d4265d9b36cc": "Excluído com sucesso", + "e274abcaad0a7fff74d9adb67e578d5f": "Falha ao excluir", "38fa2d4f8f9a13062c0c9007d97f6a84": "Falha ao ler arquivo!", - "f57d5686d9dd67f0e81924de8d13af95": "Tarefa executada!", - "da07d14105efb3ba634c1d35618447ab": "O parâmetro está incorreto!", + "f57d5686d9dd67f0e81924de8d13af95": "Tarefa foi executada!", + "7b84e677e97bd4943a6639a22c1a1704": "Parâmetro de senha não pode estar vazio", + "5f3160e82bc0c5278923b609841e588b": "Habilitado com sucesso", + "f288f8c23f8d03a699a49bf1fb8e7f53": "Falha na opção ssh", + "d3118650da719b6b0cc83230204491de": "Erro no método de criptografia", + "24513dc8c02bb021a1c944009c19215b": "Falha ao habilitar", + "8a3140f96ba5c5df5560d0bd27aa4cd8": "Desabilitado com sucesso", + "bff9ef87fdda677f86ae6dddec54a104": "Nenhuma versão PHP compatível encontrada, instale primeiro", + "3c8ad9e6e9c39de49294aa2db8630f25": "Nginx não está instalado", + "8bdafc47214a88c8cc4bc6326771040a": "Falha na aquisição de dados!", + "d84c752e17017ec4b4987497ce15dfd0": "Falha na aquisição de status de carga do PHP!", + "ee83f5efe8a95f2e8529da7d4bb01d2b": "Desinstalação bem-sucedida", + "cf6e5eb2bfedf2e0529a552c1017c21e": "falha ao gravar arquivo!", + "842bbd281516b01e70be499dbe67d3aa": "Configurado com sucesso", + "ff7ca5d4ef00526f701d3ae0b3833940": "Falha ao obter a lista, verifique se a configuração [AK/SK/Armazenamento] está correta!", + "517fa3f50147b216828f9aca9fd08927": "Servidor de demonstração, operação proibida!", + "e39bf0b6a74eb0459abefe075607833f": "Erro, impossível encerrar processos da tarefa!", + "c40f1a202bfa106ac04f83a4740b3bd1": "Falha ao conectar ao servidor!", + "ca3eb6afad663b2881fababde6d59d63": "Por favor, vincule sua conta primeiro!", + "572e5703371c43aae299181c0e3567d4": "Por favor, execute o programa quando todas as tarefas de instalação terminarem!", + "df1f69a87b498b8b12c90be5a3b885db": "Falha no download do arquivo, tente novamente ou atualize manualmente!", + "e448bd5c1c654d1ef33cf40620808693": "A versão PHP solicitada NÃO existe!", + "7c769ceaad458456d4c3bc8276015a8d": "Permissão negada!", + "178d2e6a3f4abd4552188dcf36df7687": "Logs do Painel esvaziados!", + "99a0d283490c238c6faf2d0387dbcda7": "O servidor web atual é openlitespeed. Esta função ainda não é suportada.", + "20b4593b7de7ef359c1a0269f83e896b": "Intervalo de porta incorreto!", + "0e656ce1afc98099f2e01e8f71362f92": "Por favor, insira o número correto da porta", + "88897967b12e6907309204ad6d0647af": "Por favor, NÃO use a porta usual como porta do phpMyAdmin!", + "e4859a777f8d4f300baf8fff0284fe81": "Não encontrou o arquivo de configuração apache phpmyadmin ssl, tente fechar as configurações de porta ssl antes de abrir", + "6bd4e79acd767010d96091baf9daba77": "Não detectou a porta que o nginx phpmyadmin escuta, confirme se o arquivo foi modificado manualmente.", + "7478cfa7a09bbe61467b07dea2e9721d": "Não detectou a porta que o apache phpmyadmin escuta, confirme se o arquivo foi modificado manualmente.", + "a7dad48fefe8778dd10744a8a4dbae8e": "Nova Porta SSL phpMyAdmin", + "a168cddbe84613b0a468887d44e7eaf5": "O certificado do painel não existe. Por favor, solicite o certificado do painel e tente novamente.", + "c0c23cdf9e9329e576cfbddcc85666a3": "Aberto com sucesso, por favor libere manualmente a porta ssl phpmyadmin", + "b7f3560235e37cebdbde7db33c3df64c": "Operação falhou", + "7f91451dfcb0045a4684fa68b35d0365": "Nova Porta phpMyAdmin", + "bb1ca97ec761fc37101737ba0aa2e7c5": "ERRO", + "14c525aba20f0a52255a799f51ced885": "Lista de avisos NÃO existe!", + "586a19c1eeaf6fe9d57f1d894fc487fc": "Arquivo de log NÃO existe!", + "190045c03f9a72a1900c60d63e1e2b8b": "A vinculação da conta expirou, vincule novamente na página [Configurações]!", + "907fddd6007347a0daffc4a64156f0de": "Ignorado com sucesso, esta versão não será mais lembrada para atualização.", + "e06d1ba70f1331e9f9a113cc2f887d3f": "Não autorizado", + "6c89f438bb1463ecd92f1832d0aaa277": "Código QR expirado", + "a11371c8ae1f6978f0dd88d0bddaa1be": "Escaneamento QRCORE bem-sucedido", + "ab9f853a311a37b0fdc50cdfb4e7ac05": "Falha no login 2", + "735ff2bcf3bc80998a077ba01d50ab8c": "Falha no login 1", + "3dfca5981995cf406aed48842d0e44ba": "Não vinculado!", + "5b0308d8fa9b2acb17601e300f789005": "API não está ativada", + "55c294cfb3e6b69997d8b5cf04369914": "Telefone não vinculado", + "13b08ce52b782ebdc94a64637cd3c992": "Aguardando login por escaneamento de código APP 1", + "21d947c00f0d5b4ca710f7db100b8af3": "Aguardando login por escaneamento de código APP 2", + "9d7820cd626f61af19de756761a2280f": "Aguardando login por escaneamento de código APP", + "ed8abe55f77bc3512706869b791aa8f0": "Código QR atual inválido 222", + "727f11bf8b090ccbf27efcfb530e262f": "login bem-sucedido!", + "b0a783e3ada9e792e3ff3ca4eb477c80": "O certificado não existe!", + "fca4e47d90253577901e874737b87dc0": "Erro de leitura de certificado!", + "813595d6c41e417bea96adb1ad89043f": "Erro de formato de certificado", + "16e6977cb4d0694335f3492ad8767370": "Certificado não encontrado", + "b267d8a6cbf23d69056263e194742c06": "Certificado inválido", + "f8ad04059d0821e2ece2ed287bb3cd13": "Erro de formato de informações do certificado", + "a441b2686419ee07dac67ba6bbf3ddf5": "erro de gravação db", + "34c7694451633cb615e98b06d040c5c7": "erro de consulta db:", + "ba709b27ba6099126b4162a916a20174": "não logado, então", + "ae01e57647be41f3c1e2a0e49dae3de8": "falha ao obter dados da nuvem!", + "8d1747726b316e3a1063e5db9fe65864": "falha ao obter nuvem!", + "ff34f52bf8f702f83843e0d8f3e6bfac": "parâmetros errados", + "41309f5b21613cfea3728a55036f9970": "não logado, portanto incapaz de fazer upload para a nuvem!", + "6e4a26963219701ba8e062a1255fe089": "Nenhum certificado especificado.", + "2c7d38ab0f7a91f5474efc897eaf4b2a": "Sucesso na exclusão de arquivo local. Mas falha na exclusão de arquivo na nuvem.", + "501ffa672acb20c4764563d6e839879b": "Falha ao conectar à nuvem. Impossível excluir dados na nuvem.", + "a810cdf921c5b92a3f6d29667ec78ffc": "exclusão bem-sucedida", + "df569fbc92d17644e83b44541596633f": "Falha ao conectar à nuvem.", + "14230d11143a03f4330c6433d5032a9d": "Ant", + "10ac3d04253ef7e1ddc73e6091c0cd55": "Prox", + "a6122a65eaa676f700ae68d393054a37": "Início", + "d55b30607c2a9a2616347d6edb789f6b": "Último", + "5da618e8e4b89c66fe86e32cdafde142": "De", + "9952a15e524c95759c3580205db6fac1": "Depende do seguinte software, instale [{1}] primeiro", + "da07d14105efb3ba634c1d35618447ab": "O parâmetro está incorreto!", "ea2b2676c28c0db26d39331a336c6b92": "iniciar", "ef399b2d446bb37b7c32ad2cc1b6045b": "parar", "0b12c9f33fde8b15970c7390c54d7ca5": "falha ao fechar o log", - "b55eed05ce4922d8a6c881f0f2b05bbf": "definido com sucesso", + "b55eed05ce4922d8a6c881f0f2b05bbf": "configurado com sucesso", "5afb8de2bbb11b44592503000290c173": "O plugin especificado não existe!", "8b266978ab5161642a2d95d3f03f3945": "Por favor, desinstale [{}] primeiro", "ad626ac6de7ea412c9156f73b7666cd4": "Depende do seguinte software, instale [{}] primeiro", "acf7b210e1f5fbdb2e24af573f0e1831": "Pelo menos [{0}] núcleos de CPU são necessários para instalar", "d0c8fa89a1eccf8a377d11eea540fd0c": "Pelo menos [{0} MB] de memória são necessários para instalar", - "52e44340370925b110c7fba475b805e3": "Suporta apenas o sistema [{}]", + "52e44340370925b110c7fba475b805e3": "Apenas suporta sistema [{}]", "e3b16d9e5a24c8d27578d7670e840200": "Depende do seguinte software, instale primeiro [{}]", "a0405fa5f045a30ba3aeff1c65ad8c38": "Processo de instalação cancelado!", "a13ed989898e4c7529942fa656ff6733": "Diretório crítico do sistema não é gravável!", - "7a71d673b95a1bd0d10705c865f5a626": "1. Se o [Fortalecimento do Sistema] estiver instalado, desligue-o", - "c5041819fd15366b66dd9539116ea6ad": "2. Se o Yunsuo estiver instalado, desligue o recurso [System Hardening]", - "101935ed7ea8a021a536a614363350eb": "3. Se o Safedog estiver instalado, desligue o recurso [System Protection]", + "7a71d673b95a1bd0d10705c865f5a626": "1. Se [Fortalecimento do Sistema] estiver instalado, desative-o", + "c5041819fd15366b66dd9539116ea6ad": "2. Se Yunsuo estiver instalado, desative o recurso [Fortalecimento do Sistema]", + "101935ed7ea8a021a536a614363350eb": "3. Se Safedog estiver instalado, desative o recurso [Proteção do Sistema]", "8c4aa1aa63c24703138358074a515b99": "4. Se outro software de segurança for usado, desinstale-o", "2eaba30c177044d12634b22016f5dd99": "Por favor, especifique o nome do software!", "0d3811da2c2a4315b921093d36e6759d": "Desculpe, atualmente o OLS oficial não suporta php8.1", "0d06a64610d5755d0d395305f9b3a664": "Por favor, faça login como conta aaPanel primeiro", - "2c9056dcb1285057d5248e7ed16d2b4d": "Falha na verificação de hash do arquivo, instalação parada!", + "2c9056dcb1285057d5248e7ed16d2b4d": "Falha na verificação de hash do arquivo, instalação interrompida!", "fb95b07b4c663c0a52cda545eef1d869": "Instalação bem-sucedida!", - "fac5f4d9d430e77699ec114d346c9bb2": "Falha na instalação", + "fac5f4d9d430e77699ec114d346c9bb2": "Instalação falhou", "349838fb1d851d3e2014b9fe39203275": "Instalar", "a9ba3c226edabcfe1978d6f4c5daf404": "Nginx 1.8.1 é muito antigo, não está mais disponível, escolha outra versão!", "75d7d596e2cc30d482111fae7b4f6d88": "Tarefa de instalação adicionada à fila", - "ee83f5efe8a95f2e8529da7d4bb01d2b": "Desinstalação bem-sucedida", - "4432eb207b29c9ead490158b76397532": "A lista de banco de dados não está vazia. Para a segurança dos seus dados, faça backup e exclua o banco de dados existente.
Comando de desinstalação forçada: rm -rf /www/server/mysql", + "4432eb207b29c9ead490158b76397532": "A lista de banco de dados não está vazia. Para segurança dos seus dados, faça backup e exclua o banco de dados existente.
Comando de desinstalação forçada: rm -rf /www/server/mysql", "ba922eb50c83147a9bc0e9f40877d986": "Desinstalação bem-sucedida", "b860df98df6ab84521a4cef036973028": "Faixa de pontuação [1-5]", - "eb536feb2c569974c2b5cf85cae91041": "Falha na conexão!", + "eb536feb2c569974c2b5cf85cae91041": "Falha de conexão!", "a70188f907ee9df93a4b749109a23460": "Falha ao obter lista de software ({})", "16ad37f5aafc6478f2f6d63d70554530": "Por favor, NÃO repita a adição", - "18ea7bdb25b2a66507ffb1bb8b42fefa": "O Painel exibe apenas até 12 softwares!", - "2aa461271893ae0493789e9e8f248fdc": "A Barra de Atalhos exibe apenas até 5 softwares!", - "98cb93d354af289a900cd9e03cee2df2": "Falha na instalação!", + "18ea7bdb25b2a66507ffb1bb8b42fefa": "Painel exibe apenas até 12 softwares!", + "2aa461271893ae0493789e9e8f248fdc": "Barra de atalhos exibe apenas até 5 softwares!", + "98cb93d354af289a900cd9e03cee2df2": "Instalação falhou!", "17e4e003ade65cd7a54131d3404d2f98": "NÃO aberto", "bda730e0e5c7444ef6f4f49957ab4f39": "A pagar", "24fe48030f7d3097d5882535b04c3fa8": "Expirado", "cbfcfe47e7420af71ce1666844c565a3": "Ordenação salva", "6a20d0daaec1ce3950a321704041dc90": "Este plugin NÃO tem modelo!", - "6f5cb320fb3a7e303403054320ad943c": "Lista de softwares atualizada!", + "6f5cb320fb3a7e303403054320ad943c": "Lista de software atualizada!", "b269cd272a31017961c245e2c84a1a2f": "Falha no download do arquivo!", "88183b946cc5f0e8c96b2e66e1c74a7e": "Desconhecido", - "84f7539fe8674bb0689347dc7acd7b43": "Nenhuma informação do plugin encontrada no arquivo, verifique o pacote do plugin!", - "affc007de5f6791707f3de155a3a642a": "O arquivo temporário NÃO existe, faça o upload novamente!", - "117f1bb083c7d556079a3c77093be5e2": "Falha na exportação, verifique as permissões!", - "a8f375e795e0a130837f2a468518a413": "Nomes não compatíveis podem ser apenas números, letras, sublinhados", + "84f7539fe8674bb0689347dc7acd7b43": "Nenhuma informação de plugin encontrada no arquivo, verifique o pacote do plugin!", + "affc007de5f6791707f3de155a3a642a": "Arquivo temporário NÃO existe, reenvie!", + "117f1bb083c7d556079a3c77093be5e2": "Exportação falhou, verifique permissões!", + "a8f375e795e0a130837f2a468518a413": "Nomes não conformes podem ser apenas números, letras, sublinhados", "a06490b9729d0868e31d834c9bffa0bd": "Os parâmetros de compilação personalizados especificados não existem!", "5e71fccee12caedf853a7313ea204721": "Erro: Nome ou serviço desconhecido", "b6e3d7366f73e2c5e32717d679db6474": "Erro: Falha ao estabelecer uma nova conexão", - "cdffdb1c794cf0dd777b3941a31459e4": "Erro: Tempo limite de leitura esgotado", + "cdffdb1c794cf0dd777b3941a31459e4": "Erro: Tempo limite de leitura", "4573823cc04a9cbf8a7bb254b762db91": "Erro: Conexão recusada", - "e3c2e426ad1b23571c48ec572ca675bf": "Erro: O terminal remoto fechou a conexão sem resposta", + "e3c2e426ad1b23571c48ec572ca675bf": "Erro: Extremidade remota fechou conexão sem resposta", "db3a5c61130d7ca2046f5f9d0cd08073": "Erro: {}", "fe723570085e5cc1ecc3dfc88a46aa2d": "Tempo limite de download: {}", - "0eeb116408665d50a2f2092a6c277ee6": "Sem espaço disponível em disco.", - "57a43d6e8c479df3a51421eba70d5621": "Falha ao verificar soma de verificação do pacote.", + "0eeb116408665d50a2f2092a6c277ee6": "Sem espaço em disco disponível.", + "57a43d6e8c479df3a51421eba70d5621": "Falha na verificação de checksum do pacote.", "c12c62dd767caf90d62356b47349d871": "Não é possível obter barra de progresso para este plugin.", - "8fde9a929c417549ed2f9144fa68c0d2": "O nome da regra pode ser composto apenas por letras, números e sublinhados!", + "8fde9a929c417549ed2f9144fa68c0d2": "O nome da regra só pode ser composto por letras, números e sublinhados!", "868a6f377594831b39e91745c7807e28": "O nome da regra especificado não existe! [ {} ]", "5d9cf1940fae6317dd43a7f1b5ca8f36": "O nome da regra especificado já existe! [ {} ]", - "473bc9055d76e148db4d28e7bec67295": "O nome da regra precisa ser maior que 3 bytes", + "473bc9055d76e148db4d28e7bec67295": "Nome da regra precisa ser maior que 3 bytes", "5b097df78b1d8c65d8b524354029f114": "O sufixo do arquivo não pode estar vazio", "496e2dfba11ca4381ef6277e6e9a62dc": "O diretório não pode estar vazio", - "84278582ca50b97777b2c8ce780f9715": "Para Suporte|Sugestões, visite o Fórum aaPanel", - "aa00d1012298d40c84daf11e09956c65": "Baixando:", - "3c8ad9e6e9c39de49294aa2db8630f25": "Nginx não está instalado", - "8bdafc47214a88c8cc4bc6326771040a": "Falha na aquisição de dados!", - "d84c752e17017ec4b4987497ce15dfd0": "Falha na aquisição do status de carga do PHP!", - "cf6e5eb2bfedf2e0529a552c1017c21e": "falha ao gravar arquivo!", - "842bbd281516b01e70be499dbe67d3aa": "Definido com sucesso", - "ff7ca5d4ef00526f701d3ae0b3833940": "Falha ao obter a lista, verifique se a configuração [AK/SK/Armazenamento] está correta!", - "517fa3f50147b216828f9aca9fd08927": "Servidor de demonstração, esta operação é proibida!", - "e39bf0b6a74eb0459abefe075607833f": "Erro, não é possível encerrar os processos da tarefa!", - "c40f1a202bfa106ac04f83a4740b3bd1": "Falha ao conectar ao servidor!", - "ca3eb6afad663b2881fababde6d59d63": "Por favor, vincule sua conta primeiro!", - "df1f69a87b498b8b12c90be5a3b885db": "Falha no download do arquivo, tente novamente ou atualize manualmente!", - "e448bd5c1c654d1ef33cf40620808693": "A versão do PHP solicitada NÃO existe!", - "7c769ceaad458456d4c3bc8276015a8d": "Permissão negada!", - "178d2e6a3f4abd4552188dcf36df7687": "Logs do painel esvaziados!", - "99a0d283490c238c6faf2d0387dbcda7": "O servidor web atual é openlitespeed. Esta função ainda não é suportada.", - "20b4593b7de7ef359c1a0269f83e896b": "O intervalo de portas está incorreto!", - "0e656ce1afc98099f2e01e8f71362f92": "Por favor, insira o número da porta correto", - "88897967b12e6907309204ad6d0647af": "Por favor, NÃO use a porta usual como porta do phpMyAdmin!", - "e4859a777f8d4f300baf8fff0284fe81": "Não encontrou o arquivo de configuração SSL do Apache phpMyAdmin, tente fechar as configurações da porta SSL antes de abrir", - "6bd4e79acd767010d96091baf9daba77": "Não detectou a porta que o Nginx phpMyAdmin escuta, confirme se o arquivo foi modificado manualmente.", - "7478cfa7a09bbe61467b07dea2e9721d": "Não detectou a porta que o Apache phpMyAdmin escuta, confirme se o arquivo foi modificado manualmente.", - "a7dad48fefe8778dd10744a8a4dbae8e": "Nova Porta SSL do phpMyAdmin", - "a168cddbe84613b0a468887d44e7eaf5": "O certificado do painel não existe. Solicite o certificado do painel e tente novamente.", - "c0c23cdf9e9329e576cfbddcc85666a3": "Aberto com sucesso, libere manualmente a porta SSL do phpMyAdmin", - "b7f3560235e37cebdbde7db33c3df64c": "Operação falhou", - "7f91451dfcb0045a4684fa68b35d0365": "Nova Porta do phpMyAdmin", - "bb1ca97ec761fc37101737ba0aa2e7c5": "ERRO", - "14c525aba20f0a52255a799f51ced885": "Lista de avisos NÃO existe!", - "586a19c1eeaf6fe9d57f1d894fc487fc": "O arquivo de log NÃO existe!", - "190045c03f9a72a1900c60d63e1e2b8b": "O vínculo da conta expirou, vincule novamente na página [Configurações]!", - "907fddd6007347a0daffc4a64156f0de": "Ignorar sucesso, esta versão não será mais lembrada para atualizar.", - "131c05252110792212e3e3666a351154": "Configuração relacionada ao SSL, NÃO exclua ou modifique a próxima linha de regras 404 comentadas", - "4ba7e24ac1607ab761c124ca7352ad08": "Configuração da página de erro, permitido comentar, excluir ou modificar", - "31bb30ca4135945adbe0c2daa9545b39": "Configuração de referência PHP, permitido comentar, excluir ou modificar", - "f9da3e5ae75ce0ae39884ae2ea295a66": "Referência de regra de reescrita de URL, qualquer modificação invalidará as regras de reescrita definidas pelo painel", - "73e1f7d487ad73d55414fe26ea11cbf0": "Parâmetro não especificado [sitePath]", - "6aabca3a3e1c79bd5837a1ddae95fe70": "Houve um erro ao criar, tente novamente.", - "256c9a85375f57f2dc9f6f318c6578f1": "Site [ {} ] criado com sucesso", - "481df7dbcd4c0317088bde8c913d5893": "Por favor, preencha o caminho do site", - "b1b2484c013c646d7f41d6b2f495b6ef": "O caminho do site não pode ser o diretório raiz [/]", - "1c3bff99564f1370a5b1bf6c0773f8c4": "Verifique se o formato do [Email] está correto", - "af9091566e669f016edf16ba97464cbe": "Senha muito fraca, se tiver certeza de usá-la, marque [ Permitir senhas fracas ]", - "b0dbad478d4f07c38aec8f440ed98b66": "Por favor, instale MySQL e PHP primeiro!", - "46491fef7553177ef58a55b2db917072": "Por favor, não defina o diretório raiz do site para o diretório principal do sistema:
{}", - "59d5fef323e89ded50ed6036848a97f3": "O formato do parâmetro webname está incorreto, deve ser uma string JSON analisável", - "078a3d3e263be2851ddfd9fa059d098f": "O intervalo de portas está incorreto! deve ser entre 100-65535", - "50370024fdd22dc69099a46d011b20e2": "A versão do PHP não pode estar vazia", - "44bd68c6703adf65ff21c63e9a876aa1": "O formato do domínio primário está incorreto", - "23eded6de9c06451f67ecb7ed3a8c95b": "O domínio primário não pode ser um registro DNS curinga (wildcard)", - "f54249d2613e48be05837ec9cd615a5f": "O site que você tentou adicionar já existe!", - "b537e2d1946d559d3de4fb3c045d290f": "O domínio que você tentou adicionar já existe!", - "f91c641aef33cf8ef4a29bc5d3a7193a": "Falha ao adicionar, ERRO de gravação de configuração!", - "c3c7869d22051eaa78a831834a398351": "Houve um erro ao excluir, tente novamente.", - "e2d272e229674e4c6765fab24a323604": "Site [{}] excluído com sucesso", - "aa5f20e061736fe68a915163e7e6d122": "O site especificado NÃO existe", - "f11e72daff0ce484f4c401bd0bd28ae5": "Site excluído com sucesso!", - "c57d58c6bbd34144325871d75b42a577": "Por favor, insira o nome de domínio do host", - "5c7b7c2f6ed78eefdd77aaa3dddde61a": "O domínio não pode estar vazio!", - "ef446d50df1605a582f9b44b57327536": "O formato do nome de domínio está incorreto!", - "68ae44808f90043dee02358ee768bf6e": "O formato do domínio é inválido!", - "1628c2a26ab6d1211b435f85782f8acc": "O nome de domínio especificado foi vinculado pelo site [{}]", - "925dc658ddf0f69509632848bcd39577": "O nome de domínio especificado foi vinculado por um subdiretório do site [{}]!", - "7b02cf82181f516626a36b86c6a686f5": "Site adicionado com sucesso!", - "9b3c4205f2f408790c9c1c5da53c3bfb": "Falha ao obter a versão do PHP!", - "abc3db87d5608cc9559556468a696a35": "Por favor, escolha um nome de domínio", - "7807e17f2bf49fb802bba1a04822ea16": "Por favor, escolha uma porta", - "e5925c3a126a66c0565df6d8ef49550e": "O último domínio não pode ser excluído!", - "17088ffed1e537b917a6ecc9dc957159": "ERRO de Chave Privada, por favor verifique!", - "26924bd958e212f07c31b6ffca9cbf8c": "ERRO de Certificado, por favor verifique!", - "44e2c1c3cfd8d248d7c9190a8f07c0ee": "Erro ao obter certificado", - "fc0d039d9dcf3905ae8032c9cb33f475": "ERRO:
{}", - "ddc2be35a5ed0bf09a88139c4ad10b4a": "Igual ao caminho original, não é necessário alterar!", - "84a8921b25f505d0d2077aeb5db4bc16": "Estático", - "ad74aa2854e988c3157f92e0120bb19e": "Apache2.2 NÃO suporta MultiPHP!,{}", - "4018ce634a10d352867f04962f107c14": "Houve um erro ao definir, tente novamente.", - "f1bef4fd5183ae83a5896c32a3d5e81d": "Configuração PHP personalizada suporta apenas Nginx", - "879e0d022ff268704f93a7e2b504c224": "A configuração de conexão PHP não pode estar vazia ao personalizar a versão!", - "73d6e709b568b43405052cec999798c5": "O formato da configuração de conexão PHP está incorreto, consulte o exemplo!", - "90a0cb1e2a8bee7ba3bcc51d8b80ee2e": "O socket unix especificado [{}] não existe!", - "751ac8fd72a0acd79772370efcae9c89": "Não foi possível conectar a [{}], verifique se a máquina pode conectar ao servidor de destino", - "3cb7d414f8ae92b2b29057f91346f7dc": "Falha na configuração, nenhum item de configuração relacionado a enable-php-xx foi encontrado no arquivo de configuração do site!", - "c7a6a892c6cdfc9b0fedefb0a1d2083a": "O diretório solicitado não existe", - "4622561ceaaecb6ef7dd51e65c9f4ec5": "Diretório base desligado!", - "e4ec1f40794bdf92e7261e6e0c51895a": "Diretório base ligado!", - "eeddf79f68ffe029ed83fddcba46b35f": "Proxy antigo", - "1592678472ea1b601fd74abff47c56b1": "NÃO é possível obter a URL de destino", - "18edd294853d381dbe0d612ab58bc123": "Um erro foi detectado no arquivo de configuração. Por favor, resolva antes de prosseguir", - "8b5899be4df3aedb03c6fbad9055ed1c": "O nome do banco de dados não pode ter mais de 40 caracteres!", - "111376d92c49c1a6c1522a2ef1dac23c": "O nome do proxy reverso especificado ou pasta de proxy já existe", - "09a988aa2e3185fce9fa8f4e8710b862": "Não é possível definir proxies de diretório e globais simultaneamente", - "012a8e497feddccb8e4a47aa5e2dc156": "Por favor, insira um número", - "90da7d2de9aa12ec32ee04172ca0d2d3": "Erro de formato de domínio enviado :", - "440544138d3ed8a2229792c88bad3bd8": "A URL de destino não pode ser acessada", - "faf2457853593b3296699c4adacc7825": "Por favor, insira o conteúdo a ser substituído", - "748e5ad33460a17cf26c8024bb0a1620": "O conteúdo de substituição não pode ser o mesmo que o conteúdo a ser substituído", - "195d5db9e1559f06348715bc3a822036": "Um proxy reverso global já existe na configuração principal de reescrita/nginx/arquivo vhost", - "cc38d47ec9ac62ffc67a5db9c08d5d52": "A URL de destino não pode estar vazia", - "fb79afbbe0688565b7894b644dfd798d": "A URL de destino não pode ser [http:// ou https://], preencha a URL completa, como: https://aapanel.com", - "29c9da826ae868c8c6444328f48bcf40": "Proxies reversos não estão disponíveis atualmente para sites Wordpress que usam implantação em um clique", - "a59dfc3ae22fd96d46011503a4f40744": "Proxy suspenso", - "078bb5f960587121c7cd606ddba5ad58": "Por favor, ative o proxy reverso antes de editar!", - "fe7185cec796e18d58f8e84dc4da946f": "Atualmente suporta apenas Nginx", - "222a267cc5778206b253be35ee3ddab5": "Atual", - "38441d4a89765279852ca2830aa89c83": "Nova regra de reescrita de URL foi salva!", - "b9c1dcb37c44dca19765636de065b1c1": "Backup bem-sucedido!", - "c27a45bf16475a157ca1014cf886bb56": "Por favor, insira uma nota", - "9a962a24e9b7b07800d6b7c7efd86f30": "Usuário ou senha não podem ter menos de 3 dígitos!", - "7eb904262649f9b2e4ba52e2bba9db71": "O formato da senha está errado, não use símbolos especiais nos dois primeiros dígitos!", - "492c7f01035f1cf9b88756f897f02b87": "ERRO, o domínio primário não pode ser um endereço IP!", - "0a2b8c4a98495f6af19be9c1c342844e": "Sucesso, por favor teste o programa JSP!", - "49281f9c7680652b1d110625da5c8cca": "Mapeamento Tomcat fechado!", - "ec3b07b78fd4f3307c84858957ddbd0f": "Obter caminho de execução do site Falso", - "02e602e968050352febfc4ddcae332f0": "OpenLiteSpeed não suporta definir o site padrão", - "362538d60f495840284c667e67831b16": "Verificar diretório", - "4f137439eb93e6c752873c8af2d3d1cb": "Tarefa de verificação está na fila!", - "613a6375944c3035efe735e87766fbbd": "Atualização bem-sucedida!", - "6177805463a6a4f28e61bb3435bee13b": "Definido com sucesso, o site irá parar automaticamente quando expirar!", - "1a69486f70b6baf749e6e1c4d5fcf689": "O sufixo da URL não pode estar vazio!", - "2f858201b6da6a5419c5af8fd26f815c": "O domínio da corrente anti-roubo (hotlink) não pode estar vazio!", - "f36c15e89d61e07fb44095ae920b8fbc": "Por favor, ative o hotlink primeiro!", - "70dc560b6f4af6d210c9eeb8434c571c": "Recursos de resposta devem usar caminho URI ou código de status HTTP, como: /test.png ou 404", - "aa8722f512ecebf5dae454e526402508": "Por favor, ative o anti-roubo primeiro!", - "bd0d7585c64988d80747a32fb0e3e15e": "O log está vazio", - "a17f5bc22553d897f6363867c0165256": "Categoria padrão", - "0d0d87a34e787b2f4a59d912d4d441e4": "O nome da categoria não pode estar vazio", - "6818a5095a78431eb3c99fe022b687b0": "O nome da categoria não pode exceder 16 letras", - "c4f16bb3d87b92062f73954c86485f64": "Adicione até 10 categorias!", - "5fd53f59be2a3dee94df28886840b9a3": "O nome da categoria especificada já existe!", - "1c44b4096bb88e459ddadef895bea1c2": "A categoria especificada NÃO existe!", - "8f52253b1f007fd14ed0f60b89593d2d": "Categoria excluída!", - "b51515085fc6ea6a07192c61e068c124": "Modificado com sucesso", - "8d5a0b5b1a1c8691e1c0918e5a4da1a7": "Esta função suporta apenas Nginx/Apache", - "6678fd91bc04eb1e34e3474809387e7a": "Falha na consulta, endereço não existe", - "7ac0a27b48f2931c7f294b996fe6b273": "Erro ao analisar arquivo de configuração", - "ee3a15a26aee235ac255e37342b444bb": "Configurado com sucesso", - "79799f8c2f024685df774550ea5b427d": "O site [proxy, redirecionamento, http para https] não está configurado para reiniciar automaticamente", - "29faf053a22c387532298233399e66f9": "Erro de análise do arquivo de configuração", - "6c881e76c76b1f102bcb97a8b4f682f6": "Este site ativou o reinício automático de [proxy, redirecionamento, http para https]", - "13fc1b8a101214be1a472db8de1bd8fd": "O site desativou o reinício automático", - "1fb58c8e2967a648359d13aa22d9e493": "O site não existe!", - "b0cd0c2bc5c6ce9f71127d60872209ce": "Site [{}] renomeado: [{}]", + "140bda69874872f8402052c613c0b3b9": "Email de Teste de Alerta aaPanel", + "76a1ec4a3fcdc304394ff14dc90f8072": "O número de threads do painel deve estar entre 1-1024", + "dd7e82b5fb3c67e3e41d96f22ba838fd": "Nova porta do painel", + "248336101b461380a4b2391a7625493d": "Salvo", + "40624aabb99173387dd6d575759b12db": "O parâmetro certPem está faltando!", + "37db9679113eef382992a1478f1b79ff": "O parâmetro privateKey está faltando!", + "7063e5fbf2ea8d0809fe307b6df00467": "Certificado salvo!", + "d2174fc17fcd785706114088b84dbbce": "URL de login temporário foi gerada", + "b5101eb6e685091719013d1a75756a53": "\\1", + "0bfe47819da04212a33dac83b71430e8": "\\2", + "b0698ab9adefa7515299f311c725ba4d": "Limpar ordenação com sucesso", + "8611f56e253646a455ceeb020052fa97": "Falha ao modificar", + "bef28b813bf12be3924925bbb62883dd": "Executado com sucesso!", + "fda63bff3e0143980e5761376859b00b": "Falha na execução, verifique se o Apache está instalado", + "22012355700877ab73f89de8014ab20b": "Erro de configuração de regra Apache:
falha ao ativar:

", + "9848c96a046adb1759233241661ff694": "O serviço {} falhou ao iniciar", + "6ed577cdce37bbd9c66871ac1677dc53": "Falha na parada do serviço!", + "c7138b4b5f7ded833942aef4e230771d": "Comando enviado com sucesso!", + "d56f0ed99825b4d62ab84753a65f7f1e": "Painel reiniciado", + "ebdcf538e79de6922f498cc8c735eab5": "O firewall do sistema não está aberto", + "a296add6341b715925c0be2b83514ee3": "O endereço IP que você inseriu é ilegal!", + "3433b9709eed7423f1900061ef743af6": "Desativar este IP fará com que seu servidor falhe", + "57e7b2320dd3984312335605d57ee0f8": "O IP existe na lista de bloqueio, não é necessário repetir o processamento!", + "4bb8df740a7119979ff7854d034200a8": "O endereço IP é ilegal!", + "ff9c66f005c08efd15752fb261057b46": "O intervalo de portas deve estar entre 22 e 65535!", + "b26b09909c3b090f31dba4a0986e1b84": "A porta existe, não é necessário repetir a liberação!", + "408f58c25fc55295236fbb64a2d884ff": "Falha, impossível excluir a porta atual do painel", + "ad6fc2abb89b42d391b4bf84e8e6cd2d": "Serviço SSH desligado", + "0692d6f0819524aaa05e73f03022ec5b": "Serviço SSH ligado", + "d0749aaba8b833466dfcbb0428e4f89c": "SUCESSO", + "ffdc24f916f3071233ca7710aff032c8": " Acesso por senha", - "1cc6b0e84b90d0ca0b863fccc0f33b36": "Diretório foi protegido", - "b7526fc6f8b21e71ea1e290a982df4c9": "Criado com sucesso", - "7c0f11514254eedfffc86cf0bd09b98f": "Apache2.2 NÃO suporta MultiPHP!", - "69be778c38b9edc0ab3040c478c39370": "ERRO: %s
1. Verifique se o nome de domínio está vinculado ao site correspondente.

2. Verifique se o nome de domínio está resolvido corretamente para o servidor ou se a resolução não é totalmente efetiva.

3. Se o seu site tiver um proxy reverso configurado ou se você estiver usando uma CDN, desligue-o primeiro.

4. Se o seu site tiver um redirecionamento 301, desligue-o primeiro

5. Se as verificações acima confirmarem que não há problema, tente alterar o provedor de serviço DNS.

", - "4d6822ed3bd01f379f2ab4b1e68068d7": "|-Não há certificados para renovar no momento.", - "b74c00ca5fee122c49cd66ce3d91b2cf": "|-Falha na renovação:", - "0b1c93d38c86c8d379886293cdf8ba66": "Tarefa cancelada!", + "0161305479129bbe47bb020605a15d40": "Configuração bem-sucedida!", + "5c9b599b99f7a169b9cd25f7045eaac5": "Sincronização bem-sucedida!", + "b6601359f1ae1067d4c4d271b7407639": "Sincronização bem-sucedida 1!", + "10a1984f6c5b935c5d8c7d4b4345e1e5": "Sincronização bem-sucedida!", + "86da84e8e3aacf73ee745caee5904268": "Sincronização falhou!", + "8ed30fe61ac59c9e1cb4a75d9a48d477": "Criado com sucesso!", + "330e51da1228a070540f82eb8e78155c": "Configurado com sucesso!", + "7ac73ef676faaa8a5f8e3924b4d151e3": "Nome de usuário ou senha não podem ter menos de 3 caracteres", + "88d8a4565feba5ad270c00e85564b96d": "OpenLiteSpeed não é suportado atualmente", + "c1f8cf125da0d6db1c4e0d09033c9ddd": "Por favor, insira uma conta ou senha", + "bd7fb7b4280616cbe5de49eb1ee8cc3a": "Por favor, insira o diretório a ser protegido", + "8c48114518721e3966cd4553a0cee705": "Por favor, insira o Nome", + "dd65d82f6868cfa127f86e5658674829": "Proteção de senha do site foi configurada, cancele e configure novamente. Diretório do site --> Acesso com senha", + "1cc6b0e84b90d0ca0b863fccc0f33b36": "Diretório foi protegido", + "b7526fc6f8b21e71ea1e290a982df4c9": "Criado com sucesso", + "7c0f11514254eedfffc86cf0bd09b98f": "Apache2.2 NÃO suporta MultiPHP!", + "69be778c38b9edc0ab3040c478c39370": "ERRO: %s
{}", + "6e264f3408e9b769d3fb7e2c807f301f": "A operação falhou. Verifique se a chave está correta", + "d4ac5985eccd334896e3cf23706e43b0": "Adicionado com sucesso", + "92188d43af4373bacbf00951da16532a": "Falha ao obter o caminho do site. Verifique se o site existe", + "ceaefd9a46d78491b9fdb912b5c71eeb": "Falha ao criar o arquivo de validação. Verifique se a gravação foi bloqueada", + "1bb3608b1bc684c3dc85090db249346b": "Nenhuma informação de certificado foi obtida", "d5ef96e383d376beeec28da7acfea516": "Baixar arquivo", "f24f6c5f5841340f898a6baaa6478bcd": "Baixar arquivo {}", - "9fdd777388a418cef77bce46c1b2511a": "O formato de compactação especificado não é suportado!", - "4fa407ee74026903dc3013d0b2471eac": "Compactação bem-sucedida!", - "ece43dcaac9352f58c422e500266a927": "Descompactação bem-sucedida!", + "9fdd777388a418cef77bce46c1b2511a": "O formato de compressão especificado não é suportado!", + "95b045c4bc0ef440acd6156fb42b50c6": "Compressão falhou: O arquivo de destino {} não foi gerado", + "4fa407ee74026903dc3013d0b2471eac": "Compressão bem-sucedida!", + "ece43dcaac9352f58c422e500266a927": "Descompressão bem-sucedida!", + "b9c1dcb37c44dca19765636de065b1c1": "Backup Bem-sucedido!", "ac4eb62573e34c36ff426c8a6360c781": "Erro de backup!", "438ca4ffcf6fbd44ec129e73a24f0deb": "Selecione arquivo sql/gz/zip!", "0edfb4a54d6cf45209a6c7929b8b9919": "Banco de dados importado com sucesso!", - "f6039d44b29456b20f8f373155ae4973": "Nome de usuário", - "3544848f820b9d94a3f3871a382cf138": "Nova senha", - "6b1bc4e672d58d46d23502dcd78129be": "Limpando informações de log", - "0e900c57ee4635719ba671229ead12ff": "Limpando histórico de tarefas", - "1dfefaa079cbde4da09e89af6b49ff33": "Limpando registros de monitoramento de rede", - "f59489317e210ec566cf6b6c9e3b20b9": "Limpando registros de monitoramento de CPU", - "e0976b426e3109ee01a1182b7c04b987": "Limpando registros de monitoramento de disco", - "2c1eb277ff700f04b65306399784f875": "Limpando informações de IP", - "4abfe31831aa15dc27ff44067b2bf0d1": "Limpando histórico do sistema", - "0c06c1eb5ef47b883f7cbcab9be84e97": "O painel foi empacotado com sucesso. Por favor, NÃO faça login no painel para fazer outras operações!", - "b60091f633dedd493b16f5548e32233d": "Endereço de inicialização do painel", - "b097eb5212f13c74d1c96b59f65c4dd6": "Limpou com sucesso {} tarefas!", - "e82eb2921856b4230611dc1406f60a6f": "Lixo do sistema limpo, totalmente excluídos [{}] arquivos, espaço em disco liberado [{}]", - "0d793de4ae05511630a2eeea9b5528d9": "|-Limpou [{}], excluídos [{}] arquivos, espaço em disco liberado [{}]", - "db62071d34202efa3a0aa1a743394938": "|-Spool limpo, excluídos [{}] arquivos, espaço em disco liberado [{}]", - "a1d3c6c221b8ceaaef8881e09d0a2945": "|-Limpando Sessão PHP ...", - "c16f6a333c0ba871467568be496cbea0": "|-Sessão PHP limpa, excluídos [{}] arquivos, espaço em disco liberado [{}]", - "5d88b58a1c0ba0dee9eeb89a8bcdda36": "|-Limpando arquivos temporários e logs do site...", - "e038ca57ad9c03f40bec42908af2ccff": "|-Arquivos temporários e logs do site limpos, excluídos [{}] arquivos, espaço em disco liberado [{}]", - "fa3d217e80478d3c03c437b7fc11432f": "|-ERRO, o nome de usuário não pode ter menos de 5 caracteres", - "4cffae9f32bf898c859a5937268b9727": "|-ERRO, não é possível usar um nome de usuário muito simples", - "fbcb6a4b1126170666b4c4102afbb43d": "|-Novo nome de usuário: {}", - "cbe2d798534f872748b7cba6615596d8": "Edição personalizada com aaPanel", - "ec1d9ff2578e1f231696217b2c2d15ab": "Falha,não é possível excluir a porta atual do painel!", - "51708089c15820800d3dd7bd8d8cdfba": "aaPanel", - "fee066b1b93fecf9545758cf9a87c3de": "Atualizando plugin...", - "c6462fea6d27e4ecfc68ae1944051f77": "Login bem-sucedido, carregando...", - "c11f9218de293117d2cd58a009534167": "Todos os plugins atualizados com sucesso para compatibilidade com 6.0!", - "cc478711642936a519c27b7c388fbb50": "CLI do aaPanel", - "cfef992430ab5a7b2373138d4b86425c": "Reiniciar painel", - "95b8b68d1c80ca75e1ab15bf5b9a8394": "Alterar porta do painel", - "f3013e54b467cdb2fac9a424bae963e4": "Parar painel", - "15ea17031cb6a968e3b9ea2b28546c53": "Limpar cache do painel", - "20cdfcd210da305d900d25ec4c084184": "Limpar limite de login", - "ab41db99c7941ef74c37bd97733f7707": "Recarregar painel", - "315f4fdd99e49c6a2e80a95ce82ba534": "Cancelar limite de entrada", - "07ed88796641228c3602122cf5075fc2": "Alterar senha do painel", - "63d8f2a0e51e9243f91b0285e4e44667": "Cancelar limite de vínculo de domínio", - "3913f08c2fa53f4c413cc0772f9401d1": "Alterar nome de usuário do painel", - "b773a80578cdc8f50d57393d6b0a3d67": "Cancelar limite de acesso IP", - "a6a23a4004f99fef13372de56433edbc": "Alterar forçosamente a senha root do MySQL", - "bc449263dd0183a82a3d0a03cd8f26dc": "Ver informações padrão do painel", - "975687e8a64e2c2842a34ca6d6bf8e85": "Limpar lixo do sistema", - "84bc199f1a5ce205b0f5fc3e64ef3e95": "Por favor, insira o número do comando:", - "954be127268a1704a7af22b23bb440e8": "Cancelado!", - "51c6348531daaf0fb1e84fafa12b5f15": "Por favor, insira a nova senha: ", - "34c4edd98a45ea8a13556965a6c4f2b0": "Por favor, insira o novo nome de usuário (>5 caracteres): ", - "219863186dddc079747a525bb7877a88": "Por favor, insira a nova senha root do MySQL:", - "c172da334fdcac77f704fa4408dd2f16": "|-ERRO, a senha não pode estar vazia", - "a79cf67c04d379c4916dc584c9d8333f": "|-ERRO, a senha não pode ter menos de 8 caracteres", - "06f5000079703a33b91564159f07770a": "|-ERRO, a senha não pode conter caracteres especiais", - "913153f9957100bcf3029e8f3d5bc5e9": "Por favor, insira a nova porta do painel: ", - "39ea14ec0df812219c450ba15230ad2d": "|-ERRO, nenhuma porta válida inserida", - "bab5cb07adebbfbd938180d6862a7ce7": "|-ERRO, por favor NÃO use a porta comum como porta do painel", - "00213d6b5423971311e5a47f83081a24": "|-ERRO, a nova porta é a mesma que a porta atual do painel, não é necessário alterar", - "e1e57838b2c7e1567fb96e20bfd474e0": "|-ERRO, a porta especificada já está em uso", - "5093d954f09d473d091355fe292920a8": "|-Limite de entrada cancelado", - "e0b1cb1725c8fb29d42fa69d679a73ea": "|-Limite de domínio cancelado", - "968c7b9246b5ab3d3e7659cea211a20b": "|-Limite de acesso IP cancelado", - "e06d1ba70f1331e9f9a113cc2f887d3f": "Não autorizado", - "6c89f438bb1463ecd92f1832d0aaa277": "Código QR expirado", - "a11371c8ae1f6978f0dd88d0bddaa1be": "Escaneamento de QRCODE bem-sucedido", - "ab9f853a311a37b0fdc50cdfb4e7ac05": "Falha no login 2", - "735ff2bcf3bc80998a077ba01d50ab8c": "Falha no login 1", - "5b0308d8fa9b2acb17601e300f789005": "API não está ligada", - "55c294cfb3e6b69997d8b5cf04369914": "Telefone não vinculado", - "13b08ce52b782ebdc94a64637cd3c992": "Aguardando login por código de escaneamento do APP 1", - "21d947c00f0d5b4ca710f7db100b8af3": "Aguardando login por código de escaneamento do APP 2", - "9d7820cd626f61af19de756761a2280f": "Aguardando login por código de escaneamento do APP", - "ed8abe55f77bc3512706869b791aa8f0": "Código QR atual inválido222", - "727f11bf8b090ccbf27efcfb530e262f": "login bem-sucedido!", - "8d4d13a3836227d377455b5dc0256d5a": "Desculpe, OLS atualmente não suporta este recurso", - "6ca3d3b27428d22e047e13a552f1600e": "Adicionado com Sucesso", - "868903fa7bc939d9ff39df264589c0fd": "Excluído com Sucesso", - "4f7e04eb8dba15474e74e11df0c02a13": "definido com sucesso!", - "aa8e78fa88d0bfaaf68110219583ba96": "Foi testado novamente.", - "e1bb08ea6a5543e3d7076c8dd55496c8": "Falha na detecção", - "621a965bba1442f39a3491d7442e968b": "O sistema atual não suporta temporariamente", - "5ec14542d76e320be548502216749b04": "Escaneamento falhou", - "1df790ce75c2644b8d1a0708874340b6": "Escaneamento concluído", - "949aea6b29e43fcceab11ac1b13d07f9": "{} falha na configuração!", + "131c05252110792212e3e3666a351154": "Configuração relacionada ao SSL, NÃO exclua ou modifique a próxima linha de regras 404 comentadas", + "4ba7e24ac1607ab761c124ca7352ad08": "Configuração de página de erro, permitido comentar, excluir ou modificar", + "31bb30ca4135945adbe0c2daa9545b39": "Configuração de referência PHP, permitido comentar, excluir ou modificar", + "f9da3e5ae75ce0ae39884ae2ea295a66": "Referência de regra de reescrita de URL, qualquer modificação invalidará as regras de reescrita definidas pelo painel", + "73e1f7d487ad73d55414fe26ea11cbf0": "Parâmetro não especificado [sitePath]", + "6aabca3a3e1c79bd5837a1ddae95fe70": "Ocorreu um erro ao criar, tente novamente.", + "256c9a85375f57f2dc9f6f318c6578f1": "Criação do site [ {} ] bem-sucedida", + "481df7dbcd4c0317088bde8c913d5893": "Por favor, preencha o caminho do site", + "b1b2484c013c646d7f41d6b2f495b6ef": "O caminho do site não pode ser o diretório raiz [/]", + "1c3bff99564f1370a5b1bf6c0773f8c4": "Por favor, verifique se o formato do [E-mail] está correto", + "af9091566e669f016edf16ba97464cbe": "Senha muito fraca, se tiver certeza de usá-la, marque [ Permitir senhas fracas ]", + "b0dbad478d4f07c38aec8f440ed98b66": "Por favor, instale Mysql e PHP primeiro!", + "46491fef7553177ef58a55b2db917072": "Por favor, não defina o diretório raiz do site como o diretório principal do sistema:
{}", + "59d5fef323e89ded50ed6036848a97f3": "O formato do parâmetro webname está incorreto, deve ser uma string JSON analisável", + "078a3d3e263be2851ddfd9fa059d098f": "Intervalo de porta incorreto! deve ser entre 100-65535", + "50370024fdd22dc69099a46d011b20e2": "A versão PHP não pode estar vazia", + "44bd68c6703adf65ff21c63e9a876aa1": "O formato do domínio principal está incorreto", + "23eded6de9c06451f67ecb7ed3a8c95b": "O domínio principal não pode ser um registro DNS curinga", + "f54249d2613e48be05837ec9cd615a5f": "O site que você tentou adicionar já existe!", + "b537e2d1946d559d3de4fb3c045d290f": "O domínio que você tentou adicionar já existe!", + "f91c641aef33cf8ef4a29bc5d3a7193a": "Falha ao adicionar, ERRO de gravação de configuração!", + "c3c7869d22051eaa78a831834a398351": "Houve um erro ao excluir, tente novamente.", + "e2d272e229674e4c6765fab24a323604": "Exclusão do site [{}] bem-sucedida", + "aa5f20e061736fe68a915163e7e6d122": "O site especificado NÃO existe", + "f11e72daff0ce484f4c401bd0bd28ae5": "Site excluído com sucesso!", + "c57d58c6bbd34144325871d75b42a577": "Por favor, insira o nome de domínio do host", + "5c7b7c2f6ed78eefdd77aaa3dddde61a": "O domínio não pode estar vazio!", + "ef446d50df1605a582f9b44b57327536": "O formato do nome de domínio está incorreto!", + "68ae44808f90043dee02358ee768bf6e": "O formato do domínio é inválido!", + "1628c2a26ab6d1211b435f85782f8acc": "O nome de domínio especificado foi vinculado pelo site [{}]", + "925dc658ddf0f69509632848bcd39577": "O nome de domínio especificado foi vinculado por um subdiretório do site [{}]!", + "7b02cf82181f516626a36b86c6a686f5": "Site adicionado com sucesso!", + "9b3c4205f2f408790c9c1c5da53c3bfb": "Falha ao obter a versão PHP!", + "abc3db87d5608cc9559556468a696a35": "Por favor, escolha um nome de domínio", + "7807e17f2bf49fb802bba1a04822ea16": "Por favor, escolha uma porta", + "ecdc6ad598bdc08ff236f448e1d03e13": "Registro de domínio não encontrado", + "e5925c3a126a66c0565df6d8ef49550e": "O último domínio não pode ser excluído!", + "17088ffed1e537b917a6ecc9dc957159": "ERRO de Chave Privada, por favor verifique!", + "26924bd958e212f07c31b6ffca9cbf8c": "ERRO de Certificado, por favor verifique!", + "44e2c1c3cfd8d248d7c9190a8f07c0ee": "Erro ao obter certificado", + "fc0d039d9dcf3905ae8032c9cb33f475": "ERRO:
{}", + "ddc2be35a5ed0bf09a88139c4ad10b4a": "Igual ao caminho original, sem necessidade de alteração!", + "84a8921b25f505d0d2077aeb5db4bc16": "Estático", + "ad74aa2854e988c3157f92e0120bb19e": "Apache2.2 NÃO suporta MultiPHP!,{}", + "4018ce634a10d352867f04962f107c14": "Houve um erro na configuração, tente novamente.", + "f1bef4fd5183ae83a5896c32a3d5e81d": "A configuração personalizada do PHP suporta apenas Nginx", + "879e0d022ff268704f93a7e2b504c224": "A configuração de conexão PHP não pode estar vazia ao personalizar a versão!", + "73d6e709b568b43405052cec999798c5": "O formato da configuração de conexão PHP está incorreto, consulte o exemplo!", + "90a0cb1e2a8bee7ba3bcc51d8b80ee2e": "O socket unix especificado [{}] não existe!", + "751ac8fd72a0acd79772370efcae9c89": "Incapaz de conectar a [{}], verifique se a máquina pode conectar ao servidor de destino", + "3cb7d414f8ae92b2b29057f91346f7dc": "Falha na configuração, nenhum item de configuração relacionado a enable-php-xx foi encontrado no arquivo de configuração do site!", + "4622561ceaaecb6ef7dd51e65c9f4ec5": "Diretório base desativado!", + "e4ec1f40794bdf92e7261e6e0c51895a": "Diretório base ativado!", + "eeddf79f68ffe029ed83fddcba46b35f": "Proxy antigo", + "1592678472ea1b601fd74abff47c56b1": "NÃO foi possível obter URL de destino", + "18edd294853d381dbe0d612ab58bc123": "Um erro foi detectado no arquivo de configuração. Por favor, resolva antes de prosseguir", + "8b5899be4df3aedb03c6fbad9055ed1c": "O nome do banco de dados não pode ter mais de 40 caracteres!", + "111376d92c49c1a6c1522a2ef1dac23c": "Nome do proxy reverso ou pasta de proxy especificado já existe", + "09a988aa2e3185fce9fa8f4e8710b862": "Não é possível definir proxies de diretório e globais simultaneamente", + "012a8e497feddccb8e4a47aa5e2dc156": "Por favor, insira um número", + "90da7d2de9aa12ec32ee04172ca0d2d3": "Erro de formato de domínio enviado :", + "440544138d3ed8a2229792c88bad3bd8": "A URL de destino não pode ser acessada", + "faf2457853593b3296699c4adacc7825": "Por favor, insira o conteúdo a ser substituído", + "748e5ad33460a17cf26c8024bb0a1620": "O conteúdo de substituição não pode ser o mesmo que o conteúdo a ser substituído", + "195d5db9e1559f06348715bc3a822036": "Um proxy reverso global já existe no arquivo de configuração mestre rewrite/nginx/vhost", + "cc38d47ec9ac62ffc67a5db9c08d5d52": "A URL de destino não pode estar vazia", + "fb79afbbe0688565b7894b644dfd798d": "A URL de destino não pode ser [http:// ou https://], preencha a URL completa, como: https://aapanel.com", + "29c9da826ae868c8c6444328f48bcf40": "Proxies reversos não estão disponíveis atualmente para sites Wordpress que usam implantação com um clique", + "a59dfc3ae22fd96d46011503a4f40744": "Proxy suspenso", + "078bb5f960587121c7cd606ddba5ad58": "Por favor, ative o proxy reverso antes de editar!", + "fe7185cec796e18d58f8e84dc4da946f": "Atualmente suporta apenas Nginx", + "222a267cc5778206b253be35ee3ddab5": "Atual", + "38441d4a89765279852ca2830aa89c83": "Nova regra de reescrita de URL foi salva!", + "c27a45bf16475a157ca1014cf886bb56": "Por favor, insira uma nota", + "9a962a24e9b7b07800d6b7c7efd86f30": "Nome de usuário ou senha não podem ter menos de 3 dígitos!", + "7eb904262649f9b2e4ba52e2bba9db71": "O formato da senha está errado, por favor, não use símbolos especiais para os dois primeiros dígitos!", + "492c7f01035f1cf9b88756f897f02b87": "ERRO, o domínio principal não pode ser endereço IP!", + "0a2b8c4a98495f6af19be9c1c342844e": "Bem-sucedido, teste o programa JSP!", + "49281f9c7680652b1d110625da5c8cca": "Mapeamento Tomcat fechado!", + "ec3b07b78fd4f3307c84858957ddbd0f": "Obter caminho de execução do Site Falso", + "02e602e968050352febfc4ddcae332f0": "OpenLiteSpeed não suporta a configuração do site padrão", + "362538d60f495840284c667e67831b16": "Diretório de verificação", + "4f137439eb93ec752873c8af2d3d1cb": "Tarefa de verificação na fila!", + "613a6375944c3035efe735e87766fbbd": "Atualização Bem-sucedida!", + "6177805463a6a4f28e61bb3435bee13b": "Configurado com sucesso, o site parará automaticamente quando expirar!", + "1a69486f70b6baf749e6e1c4d5fcf689": "O sufixo da URL não pode estar vazio!", + "2f858201b6da6a5419c5af8fd26f815c": "O domínio anti-hotlink não pode estar vazio!", + "f36c15e89d61e07fb44095ae920b8fbc": "Por favor, ligue o hotlink primeiro!", + "70dc560b6f4af6d210c9eeb8434c571c": "Recursos de resposta devem usar caminho URI ou código de status HTTP, como: /test.png ou 404", + "aa8722f512ecebf5dae454e526402508": "Por favor, ligue o anti-roubo primeiro!", + "bd0d7585c64988d80747a32fb0e3e15e": "Log está vazio", + "a17f5bc22553d897f6363867c0165256": "Categoria padrão", + "0d0d87a34e787b2f4a59d912d4d441e4": "O nome da categoria não pode estar vazio", + "6818a5095a78431eb3c99fe022b687b0": "O nome da categoria não pode exceder 16 letras", + "c4f16bb3d87b92062f73954c86485f64": "Adicione até 10 categorias!", + "5fd53f59be2a3dee94df28886840b9a3": "O nome da categoria especificado já existe!", + "1c44b4096bb88e459ddadef895bea1c2": "A categoria especificada NÃO existe!", + "8f52253b1f007fd14ed0f60b89593d2d": "Categoria excluída!", + "8d5a0b5b1a1c8691e1c0918e5a4da1a7": "Esta função suporta apenas Nginx/Apache", + "6678fd91bc04eb1e34e3474809387e7a": "Consulta falhou , endereço não existe", + "7ac0a27b48f2931c7f294b996fe6b273": "Erro ao analisar arquivo de configuração", + "ee3a15a26aee235ac255e37342b444bb": "Configuração bem-sucedida", + "79799f8c2f024685df774550ea5b427d": "Site [proxy,redirect,http to https] não estão definidos para reiniciar automaticamente", + "29faf053a22c387532298233399e66f9": "Erro de análise de arquivo de configuração", + "6c881e76c76b1f102bcb97a8b4f682f6": "Este site ativou a reinicialização automática de [proxy,redirect,http to https]", + "13fc1b8a101214be1a472db8de1bd8fd": "Site desativou a reinicialização automática", + "1fb58c8e2967a648359d13aa22d9e493": "O site não existe!", + "b0cd0c2bc5c6ce9f71127d60872209ce": "Site [{}] renomeado: [{}]", + "3d8c9e517719022b27ad5f27c578fa31": "Obter RAM Falso", + "d47ab7b9ce539ba13f4e045561bb8ed7": "Obter Tempo de Atividade Falso", + "8e39175bab478762d3d029bee327c704": "Obter Tempo de Reinicialização Falso", + "e16cf27704f83c8b0a0efc16886ea75d": "Obter data Falso", + "c158c8096b76b85803e71232b2dd5e74": "Obter detalhes de tempo Falso", + "a6ec06b5eb6a42e13e072d2e992e31a0": "Obter reqpersec Falso", + "cdd32490a46567fd0c1ee9d4b170b762": "Obter TotalAccesses Falso", + "62b939086708b37d68c00cb713994b52": "Obter TotalKBytes Falso", + "13b06d17b35dfeeafa50e12ad9ec1735": "Obter BusyWorkers Falso", + "724fc9214ccce3e6a5787648240a4533": "Obter IdleWorkers Falso", + "7a7f329389283fdd3290c735f90946e9": "conf mpm_event_module não encontrado ou /www/server/apache/conf/extra/httpd-mpm.conf está vazio", + "c22cf8376b1893dcfcef0649fe1a7d87": "Segundo", + "db669c6377ab90eef78800a48fd4a453": "Tempo limite de solicitação", + "af52f5340c065f4d38182f7a27d59f75": "Manter vivo", + "70b46e57f3c33abdb9558bc5c3a234d9": "Máximo de solicitações keep-alive por conexão", + "6868568c3abc547e622a303891a906b0": "Processos padrão", + "224114c62dceb7ebee2db43c6c79a961": "Número máximo de threads ociosos", + "3c60809d9a5a0900dfbc28bb017e410b": "Número mínimo de threads ociosos disponíveis para lidar com picos de solicitação", + "3783030daf8154be6e11fc4160c229c3": "Número de threads criados por cada processo filho", + "2f25e4b1a2cb84576740da749a2daef2": "Número máximo de conexões que serão processadas simultaneamente", + "72e3edfd72758944413b1e4e9c432f1e": "Limite no número de conexões que um servidor filho individual manipulará durante sua vida", + "8d4d13a3836227d377455b5dc0256d5a": "Desculpe, OLS não suporta este recurso atualmente", + "6ca3d3b27428d22e047e13a552f1600e": "Adicionar com Sucesso", + "868903fa7bc939d9ff39df264589c0fd": "Excluir com Sucesso", + "4f7e04eb8dba15474e74e11df0c02a13": "configurado com sucesso!", + "aa8e78fa88d0bfaaf68110219583ba96": "Foi retestado.", + "e1bb08ea6a5543e3d7076c8dd55496c8": "Detecção falhou", + "621a965bba1442f39a3491d7442e968b": "Sistema atual não suportado", + "5ec14542d76e320be548502216749b04": "Varredura falhou", + "1df790ce75c2644b8d1a0708874340b6": "Varredura concluída", + "949aea6b29e43fcceab11ac1b13d07f9": "{}configuração falhou!", "ccf864247f7985a86e14f7fe4b9ce5a7": "Configurado com sucesso!", - "83fca103ffe22d911a49196e3065ff25": "Testado novamente", + "83fca103ffe22d911a49196e3065ff25": "Retestado", "aab2b67d697c82001fc3764f03df953e": "Terminal aaPanel", "9eee7650a676d53dc51e3361f2b2b99f": "Endereço de conexão errado", "f2dbc6dd77ebd7ee6e635d2e88a29388": "Tentativas de reconexão:{}", - "7b4a3e2ccafd5410416625d455f7db44": "Falha na tentativa de conexão, {}", + "7b4a3e2ccafd5410416625d455f7db44": "Falha na tentativa de reconexão, {}", "770d0e3e69e2bdb0f4688d602253fa28": "Autenticando chave privada", - "f86ecbf6201e5cd8df8b72fa2063029c": "Senha da chave privada incorreta:{}", + "f86ecbf6201e5cd8df8b72fa2063029c": "Senha de chave privada incorreta:{}", "71c1d999795c8090f7935a505db13faf": "Erro de chave privada: {}", "35c953aecb570759e062d478bc5947c0": "Erro de chave privada!", "38b5977db90e0d87467a6dead02cc9d4": "conexão bem-sucedida", - "3dbc3d6f340c62446d5e19a7a338474c": "Falha na autenticação {}", + "3dbc3d6f340c62446d5e19a7a338474c": "Autenticação falhou {}", "e0825948c99299a2d2f7171634bd5fe8": "O servidor de destino recusou ativamente a conexão", - "a51fb75bde49493b290d1d654cbd018f": "O cabeçalho do protocolo expirou e a qualidade da rede com o servidor de destino estava muito ruim: {}", - "59cd37aca5d30b4bd0c1b746c8dc4cc0": "Chaves privadas podem exigir acesso por senha: {}", + "a51fb75bde49493b290d1d654cbd018f": "A resposta do cabeçalho do protocolo expirou e a qualidade da rede com o servidor de destino estava muito ruim: {}", + "59cd37aca5d30b4bd0c1b746c8dc4cc0": "Chaves privadas podem exigir senha de acesso: {}", "aae28d19de861fdbd60625f5924b0ffe": "O handshake do protocolo SSH expirou e a qualidade da rede com o servidor de destino é muito ruim", "41f6f8e498eb036ae69adbe2f80c3dd6": "erro desconhecido: {}", "0122cb69d6c480c4e5a18fcb0acdfd49": "A autenticação foi bem-sucedida e o canal de sessão está sendo construído", "fa2f0078903e1fbd1f06fb383cded8e6": "Sucesso no login\\n", "1a0fc31214912c08b49032069b6c0ab4": "Sucesso no login", "0b2b278588fab56ed760e52a21ed5a15": "Canal desconectado", - "20536b8e623d518be1f31d393839ef70": "A conexão foi desconectada, pressione enter para tentar reconectar!", + "20536b8e623d518be1f31d393839ef70": "A conexão foi desconectada, pressione Enter para tentar reconectar!", "94c94a73ad6c35edec9bcd4bfb100c88": "Erro ao ler dados do buffer tty, {}", "9d46aa2efa419ff4a75df14577f1e629": "O cliente desconectou ativamente", "d566f8db7ec2abe7de92e59c901c4077": "Ocorreu um erro ao ler dados do websocket. Tentando novamente", - "0a6dc00cd150c5a1a776182bb2ea7406": "INFO_LOGIN_SSH", - "01993e4270c796db59ba22b3c2f53241": "As informações SSH especificadas não existem!", + "0a6dc00cd150c5a1a776182bb2ea7406": "SSH_LOGIN_INFO", + "01993e4270c796db59ba22b3c2f53241": "A informação SSH especificada não existe!", "ebd1aed8f2ab2f1ad08660f609f60206": "O endereço de host especificado foi adicionado a outras informações SSH!", - "649ba4179316d90343c8169038958400": "Especifique que as informações SSH foram adicionadas!", + "649ba4179316d90343c8169038958400": "Especifique que a informação SSH foi adicionada!", "9d048cf9fd858ea33d6607855e4c8219": "Por favor, passe o campo [sort_list]", - "e13d2375856de89c040c6eadfe65d699": "O nome do comando especificado já existe", + "e13d2375856de89c040c6eadfe65d699": "O nome de comando especificado já existe", "f64f7d7e07ab5fd2c7a8eed2274793c3": "O comando especificado não existe", "0b69cd55a690bee672a1fb91091222f1": "Iniciar backup", "a2eabcbade98a44462292c4666e62044": "Backup concluído", "7b73b93bef61012a61ae023017d02721": "O diretório especificado {} não existe!", "360cd057ad479f8662f7d1ba66f5cc8e": "Enviando para {}, aguarde ...", "95130692a2979832dc4d2143403f3a11": "Enviado com sucesso para {}", - "46d0294b3bb11e927f96319ee81395cf": "Falha no envio do arquivo, pular este backup!", - "d5d68ebd5292fcb5196ec251ba873f6c": "As configurações do usuário não mantêm backups locais, excluído {}", + "46d0294b3bb11e927f96319ee81395cf": "Falha no envio do arquivo, pule este backup!", + "d5d68ebd5292fcb5196ec251ba873f6c": "Configurações do usuário não retêm backups locais, excluído {}", "d2f7749d7de8ce82ae866155351919b3": "Backup local foi mantido", "778f2718d7245db0fad84757bad751d6": "Falha ao limpar backup expirado, erro: {}", "dd78b9ebd58a8dea880563698d4c4330": "Manter o número mais recente de backups: {} cópias", "5e2616a34c7b01f741cd85ad10bb9cbc": "Arquivos de backup expirados foram limpos do disco: {}", "a0adb8f2e5f0d4397d48466bafd6f230": "Arquivos de backup expirados foram limpos de {}: {}", - "380e4afa19e793ff5f8c1ecd6e2a228a": "Site de backup: {}", + "380e4afa19e793ff5f8c1ecd6e2a228a": "Backup do site: {}", "9572c95333f896e891521e61d7c5a297": "Raiz do documento do site: {}", "7a9a182fc01b961feb593d180d13aeb8": "Diretório de backup: {}", "8f116bc202c47d146df58722a3ac30c6": "Tamanho do diretório: {}", "1f9491d864cba19c180abe8941a92023": "Configuração de exclusão: {}", - "0a474e5e60d667669b163e7a561d1868": "O espaço em disco disponível da partição {} é: {}, Inode disponível é: {}", - "0064cb4c6495eb71bc7dc65c5d87d19b": "O espaço em disco disponível da partição de destino é inferior a {}, e o backup não pode ser concluído. Aumente a capacidade do disco ou altere o diretório de backup padrão na página de configurações!", - "48f2f0381d27c0907c8f4be1bbe3db3b": "O Inode disponível da partição de destino é inferior a {}, e o backup não pode ser concluído. Aumente a capacidade do disco ou altere o diretório de backup padrão na página de configurações!", - "1d5217f82b4cef426f8ee3fdde465424": "Iniciar compactação de arquivos: {}", - "5d38cd7c4d8e2b0c4fa5591f8eab0c37": "Falha na compactação!", + "0a474e5e60d667669b163e7a561d1868": "Espaço em disco disponível na partição {} é: {}, Inode disponível é: {}", + "0064cb4c6495eb71bc7dc65c5d87d19b": "O espaço em disco disponível da partição de destino é menor que {}, e o backup não pode ser concluído. Aumente a capacidade do disco ou altere o diretório de backup padrão na página de configurações!", + "48f2f0381d27c0907c8f4be1bbe3db3b": "O Inode disponível da partição de destino é menor que {}, e o backup não pode ser concluído. Aumente a capacidade do disco ou altere o diretório de backup padrão na página de configurações!", + "1d5217f82b4cef426f8ee3fdde465424": "Iniciando compactação de arquivos: {}", + "5d38cd7c4d8e2b0c4fa5591f8eab0c37": "Compactação falhou!", "78aeba095e656fa57452b915487c1b99": "Compactação concluída, levou {} segundos, tamanho do pacote compactado: {}", - "5789a3a4123ffb9fd9073fbda416e9c6": "Site com backup em: {}", - "6cb4511c7761c4cdaab742496c122023": "Diretório com backup em: {}", - "003ee27348243be75678b9cff2903eb3": "Backup do WordPress [{}] com sucesso", + "5789a3a4123ffb9fd9073fbda416e9c6": "Site backupeado para: {}", + "6cb4511c7761c4cdaab742496c122023": "Diretório foi backupeado para: {}", + "003ee27348243be75678b9cff2903eb3": "Backup do wordpress [{}] com sucesso", "a58667d22a7d741f6c90bc6082acf1c4": "Falha na exportação do banco de dados!", - "640a52c8f34bbd9ed9f214353440a490": "Notificação enviada", + "640a52c8f34bbd9ed9f214353440a490": "Notificação foi enviada", "3875029ec22001de5ece63df8ea8286d": "Backup para {}, um total de {} {}, e falhas {}.", - "af3eb0c9d6b3f6e7e32d6b81df04a186": "Falha no backup de {}/total de {} sites", + "af3eb0c9d6b3f6e7e32d6b81df04a186": "Falha no backup {}/total {} sites", "0dbafec38271230939c0fc9d41e9667c": "Falha ao enviar notificação", "2e828c10c1802fcfb4b8cabf63941c95": "Já existe", "d24776f54a44056b81759c279541eaa1": "IP não existe", "c377bd51882c2de13c05f3fd77364d1e": "Aberto com sucesso", "35011518f3d61995df94ae0f52ce71f2": "Falha ao abrir", "4bd6cd0bd1b02515d1f2a1ef87840fb6": "Fechado com sucesso", - "0eda49d395586a0e870e7da49c5bc640": "ERRO: arquivo de configuração sshd config não existe, não é possível continuar!", - "10ebe4455acdf740afe863011118db72": "falha na opção ssh", + "0eda49d395586a0e870e7da49c5bc640": "ERRO: arquivo de configuração sshd config não existe, não pode continuar!", + "10ebe4455acdf740afe863011118db72": "opção ssh falhou", "021210c97d1980259846f925154cd17f": "Método de criptografia errado", "d9a55194048476c17552e9355a257855": "Alarme de login cancelado com sucesso!", "cdc36eac77de70b19abc76387b634df4": "Este tipo de envio não é suportado", "57b2840409403678623872ce30eb14b6": "O canal de mensagem não está instalado.", - "a58320e783e827f26bcf2a246b8983b1": "Erro: o arquivo de configuração sshd_config não existe, não é possível continuar!", - "ba3811adeb131e9c127f72a3e07000a7": "Desativado com sucesso", - "109ff77e4cc09bb260a8603d0f56321b": "Erro de passagem de parâmetro!", + "a58320e783e827f26bcf2a246b8983b1": "Erro: arquivo de configuração sshd_config não existe, impossível continuar!", + "ba3811adeb131e9c127f72a3e07000a7": "Desativar com sucesso", + "109ff77e4cc09bb260a8603d0f56321b": "Erro na passagem de parâmetros!", "d2e5be778eb1cc374dbc6241f9a74aac": "Arquivo de chave não encontrado!", "4f20922485d59ff65db53473b17c0df9": "Conteúdo da pesquisa não pode estar vazio", - "7a428a0050c9d556e632a5f7175b24ed": "O sufixo não pode estar vazio; insira [ *.* ] para pesquisar todos os arquivos", + "7a428a0050c9d556e632a5f7175b24ed": "O sufixo não pode estar vazio; por favor insira [ *.* ] para pesquisar todos os arquivos", "cdd28535892f88791917e7ed77a8245c": "O diretório não pode estar vazio ou /", "e7582a886ed8861ac63d9b2a7d94b973": "O conteúdo a ser substituído não pode estar vazio", - "90d0982f5d024da53b21f69d3f0c8cbb": "O banco de dados NÃO existe!", - "b376175f0c97d2ab7c37e44ec3b3a1b9": "Mysql5.1 não suportado!", - "4ff3b49771b3e27d533b9f4757e8e405": "Sem logs", + "e3fa50f6413dbb7bfe7cb26e1acd3d98": "Por favor, faça login com a conta primeiro", + "121303c67f81a8ebda41de51c8afaf27": "Por favor, faça login na sua conta aaPanel no painel primeiro!", + "d5670370d84473122d8e4d5a3b27b4bf": "erro de parâmetro: num", + "6b1c16b7a785029c0a11de3ab31cb125": "Status de limpeza com sucesso", + "e06c1ddc33f674068e3ca201094145d1": "Ativar com sucesso", + "819b23804f66eddddfba39e7bdc53e68": "Falha na ativação", + "4f57c5dce8b638737a368af15409439f": "Falha na Ativação", + "fe94df1697f309269e00428cae6bd141": "Falha na Renovação", + "b2ac1158b825f44cb363648fa3ad60cb": "Renovação com sucesso", + "78d29c0fadebf704e471a63afd430250": "Falha na Aplicação", + "3649e869737aa87f263194ce7f88f19e": "Aplicação com sucesso", + "34c4dc380e690d2ff6ebb6aaed103401": "ERRO de Parâmetro product_id!", + "28731318aa493586f88894355a79cb48": "Falha ao conectar ao servidor!", + "4ff3b49771b3e27d533b9f4757e8e405": "Sem Logs", "e50f043316845a08a945f69e097f1a54": "Aberto com sucesso", "9bac3879208bc174db83cbf159528cc6": "Sem autenticação de senha", - "47615fee65c01faa2563c55350de8a80": "Autenticação de senha ativada com sucesso", + "47615fee65c01faa2563c55350de8a80": "Ligar autenticação de senha com sucesso", "679732c39dc813cb331ab3840f2409dd": "O sistema não é suportado", "6d981b7b2e975f5b7717b27abe1f8ad3": "Falha ao abrir", "03f4a47830f97377a35321051685071e": "Fechado", "3cab03c00dbd11bc3569afa0748013f0": "Inativo", "cb456215c3333db0551bd0788bc258c7": "Ativado", - "d07fa2f572b6d22996d25439da3f5d88": "Arquivo baixado com sucesso", - "db1cbd9059a4f043534a00142cdfffde": "falha no download", - "c614196ffa00bf43880f547acfab993b": "Painel não encontra o arquivo de backup: {}", - "8080ccf57df49ce6d4792cc5041be1b8": "Atualmente suporta apenas a restauração de backups locais, Google Storage e AWS S3", - "6f3446d8579a066540c5d7e68ff05f0b": "Restauração Bem-sucedida", + "d07fa2f572b6d22996d25439da3f5d88": "Baixar o arquivo com sucesso", + "db1cbd9059a4f043534a00142cdfffde": "download falhou", + "c614196ffa00bf43880f547acfab993b": "Painel não encontrou o arquivo de backup: {}", + "8080ccf57df49ce6d4792cc5041be1b8": "Atualmente suporta apenas restauração de backups locais, Google storage e AWS S3", + "6f3446d8579a066540c5d7e68ff05f0b": "Restauração Bem-Sucedida", "260ca9dd8a4577fc00b7bd5810298076": "sucesso", "1cbb155db1ca49d77f886c41b7850b48": "Erro de download!", - "5bf31cdecebf4cba00879d9088cc0a2d": "Por favor, instale primeiro o serviço Pure-FTPd na loja de software.", + "5bf31cdecebf4cba00879d9088cc0a2d": "Por favor, instale o serviço Pure-FTPd na loja de software primeiro.", "6fa956d3a9e880b4190bfc1de47faa90": "Nome de usuário é ilegal, caracteres especiais NÃO são permitidos!", "d684964cf02bdb37eb086fb2470c0135": "Nome de usuário é ilegal, não pode ter menos de 3 caracteres!", "a6825ba054814d831e71f83ac090740e": "Diretório crítico do sistema não pode ser usado como diretório FTP!", @@ -987,38 +990,38 @@ "d154a5ff03bd9ccd568018f5e51d00cb": "Ligar", "977bb0ee804c260d3a00b2b36e161c34": "Por favor, insira um número inteiro para a porta", "bdd5c4786695af78089e85f507e5643c": "Porta FTP", - "a3ccdafa1b1c0701991598cb4b2d9036": "Conta FTP não foi configurada", - "4a743f34ec3bb93a8ad7cb4d36a17308": "Conta FTP não foi configurada1", - "195822d3b030f5055e98e823153daa76": "Correspondência de várias configurações, esta operação foi interrompida!", + "a3ccdafa1b1c0701991598cb4b2d9036": "A conta FTP não foi configurada", + "4a743f34ec3bb93a8ad7cb4d36a17308": "A conta FTP não foi configurada1", + "195822d3b030f5055e98e823153daa76": "Correspondendo a múltiplas configurações, esta operação foi interrompida!", "e649cd842085301ff7921625076905fb": "O nome do banco de dados não pode ter mais de 16 caracteres!", - "a0813a2a76fdb183b1b15f92221b404a": "O nome de redirecionamento especificado já existe", + "a0813a2a76fdb183b1b15f92221b404a": "Nome de redirecionamento especificado já existe", "5b35ea4807e1b63678ff55b391d9b39d": "Por favor, selecione o domínio redirecionado", "a971e4ab85bfbda4fb6b1d57c1c8ed7d": "Por favor, insira o caminho redirecionado", - "5f74874b100d16e90aa999e06b3e222f": "O formato do caminho está incorreto, o formato é /xxx", - "d5ba0768cd61aa8e0cc9b9b2addc2d43": "O diretório de proxy não pode ter os seguintes símbolos especiais ?,=,[,],),(,*,&,^,%,$,#,@,!,~,`,{,},>,<,\\\\,", + "5f74874b100d16e90aa999e06b3e222f": "Formato de caminho incorreto, o formato é /xxx", + "d5ba0768cd61aa8e0cc9b9b2addc2d43": "O diretório do proxy não pode ter os seguintes símbolos especiais ?,=,[,],),(,*,&,^,%,$,#,@,!,~,`,{,},>,<,\\\\,", "f0f290884251850f0d9fa6afc91d39c1": "O nome de domínio {} é o mesmo que o nome de domínio de destino, desmarque-o", "ff1251600d8019bbf4280cafc534a39c": "{}, a URL de destino é a mesma que o caminho redirecionado", "664d009c794ec236879112599b14a697": "Por favor, selecione para onde você precisa redirecionar", "e63cd7427eff8a5cb737dfd1118f11ff": "O site não pode ser acessado, verifique se o site está funcionando corretamente", "2f0e4710a58107860d6332f0d0192ba9": "servidor web não instalado ou servidor web desconhecido", - "79ec80b46087125542314cc116850dd4": "Redirecionamento 404 definido com sucesso", + "79ec80b46087125542314cc116850dd4": "Redirecionamento 404 configurado com sucesso", "f1af189cd525a4d5180b8ccdc305a926": "%s
Por favor, entre no SSH e execute o comando: pip install mysql-python", - "ea8dca4dbb80a367725ec532356d4ad1": "ERRO ao conectar ao banco de dados, verifique o status do banco de dados!", - "da422f411f10ca19fbfc0c49d7b27279": "A senha de root ou do usuário Mysql está incorreta, tente redefinir!", - "99e3ce74a83862e58ec4ef7c7e141aae": "O usuário do banco de dados NÃO existe!", - "a6c2bafea90fd4f58496b7de0c879daa": "Falha na exclusão do banco de dados escravo, o diretório de dados não existe!", - "c5352c3364b49f09f07e517d6f5e2a93": "Falha na execução, tentou reparo automático, tente novamente mais tarde!", + "ea8dca4dbb80a367725ec532356d4ad1": "ERRO ao conectar banco de dados, verifique o status do banco de dados!", + "da422f411f10ca19fbfc0c49d7b27279": "Senha root ou usuário Mysql incorreta, tente redefinir!", + "99e3ce74a83862e58ec4ef7c7e141aae": "Usuário do banco de dados NÃO existe!", + "a6c2bafea90fd4f58496b7de0c879daa": "Falha na exclusão do banco de dados escravo, diretório de dados não existe!", + "c5352c3364b49f09f07e517d6f5e2a93": "Execução falhou, tentativa de reparo automático, tente novamente mais tarde!", "ced1ff377b05e3ba5ae9837ac8c05b80": "Banco de dados [{}] não existe!", - "c38111d1a26efef2f1d89b0dfbef1ee7": "Falha na conexão com o banco de dados [{}]", - "24a92be5bb3acba016a9274b9fb19c02": "Falha ao excluir, falha ao conectar ao banco de dados!", + "c38111d1a26efef2f1d89b0dfbef1ee7": "Falha na conexão do banco de dados [{}]", + "24a92be5bb3acba016a9274b9fb19c02": "Exclusão falhou, falha ao conectar ao banco de dados!", "d10533dec09d380264317010ec3e5af8": "Os dados do banco de dados não existem!", "db548c645b7e4e30814165cd703be4cc": "Falha ao mover dados do banco de dados para a lixeira!", "06e6d1c8954814a2b29d4b4372b81b59": "Banco de dados movido para a lixeira!", - "c54a0be87c240156a0403ba306527fa7": "A Lixeira não existe para este banco de dados!", + "c54a0be87c240156a0403ba306527fa7": "A lixeira não existe para este banco de dados!", "3709ae738cf2d6d0c179d816c02c66ae": "Existe um banco de dados com o mesmo nome no banco de dados atual. Para garantir a segurança dos dados, pare a recuperação!", "2fe4287f5ec52dd09118ba4d6a42747b": "Banco de dados recuperado!", "1381dce91057a208e5a3e202526fbf6e": "Falha na recuperação de dados!", - "0f6b8bb328918f160baf00077eb21846": "A senha de root não pode estar vazia", + "0f6b8bb328918f160baf00077eb21846": "A senha root não pode estar vazia", "e6271141086fae7863bfe1d5b6ac3e24": "A senha do banco de dados não pode conter caracteres especiais!", - "5ed48eedb205aa687178500c75228409": "Senha de root modificada com sucesso!", - "0c18dde1f9edfcff23eb2c2ec06673a2": "Não é possível alterar a senha de root do banco de dados remoto", + "5ed48eedb205aa687178500c75228409": "Senha root modificada com sucesso!", + "0c18dde1f9edfcff23eb2c2ec06673a2": "Não é possível alterar a senha root do banco de dados remoto", "5acf42ae8ac3a8558964691403e32ead": "Falha ao modificar, o usuário do banco de dados não existe!", - "10b75740108b26c220eb7e9bdfe18182": "Falha ao verificar o arquivo de configuração do banco de dados, verifique se o arquivo de configuração do MySQL existe [/etc/my.cnf]", + "10b75740108b26c220eb7e9bdfe18182": "Falha na verificação do arquivo de configuração do banco de dados, verifique se o arquivo de configuração MySQL existe [/etc/my.cnf]", "98925ed54b314b48c7584b73affb9556": "A senha do banco de dados não pode estar vazia", "4d15b1b40d88837aa34b5fd3c5cf1cce": "Tipo de banco de dados não suportado", - "39120f2e6a6a039741500e300f1dfe5f": "Falha no backup!", - "d30de818714c05511e9bcf3333bcc664": "ERRO_ENTRADA_BANCO_DE_DADOS", + "39120f2e6a6a039741500e300f1dfe5f": "Backup falhou!", + "d30de818714c05511e9bcf3333bcc664": "DATABASE_INPUT_ERR", "12c37754d1604dc1b9154eee1f460efe": "Sincronização bem-sucedida", - "85b08b086888f8ee2680ddd3398f3574": "Falha na sincronização", + "85b08b086888f8ee2680ddd3398f3574": "Sincronização falhou", "e9ca862378b02ba5fea97e3a6f9fdd5e": "Testar Banco de Dados", "5c846631ce72048c89ced433e4906107": "O endereço IP não pode estar vazio!", "712d5c60bf965a53ad98f51a18328fb3": "O comprimento do diretório de dados não pode exceder 32 bits", @@ -1070,12 +1073,12 @@ "cfcd208495d565ef66e7dff9f98764da": "0", "a030c44033df4fd3ed1e860220df8d65": "Por favor, desinstale o plugin de replicação mestre-escravo Mysql antes de fechar o log binário! !", "22875aa10a21e1f51ae93cd2ee20fa07": "innodb_log_buffer_size não pode ser inferior a 8MB", - "c7846dcb854a38c1e2e62793d648c0a7": "ERRO de senha do MySQL!", - "8435eeb739684eaee648c5ddb368543a": "Binlog não está ativado ou o arquivo binlog não existe!", - "b1dd73e742e604bdbb83829a41c6846a": "Status do Mysql está anormal!", - "c5c74be29ca306d24bddd4f6031d0220": "Parâmetros ausentes! dias", + "c7846dcb854a38c1e2e62793d648c0a7": "Senha MySQL ERRO!", + "8435eeb739684eaee648c5ddb368543a": "Binlog não está habilitado ou arquivo binlog não existe!", + "b1dd73e742e604bdbb83829a41c6846a": "Status do Mysql é anormal!", + "c5c74be29ca306d24bddd4f6031d0220": "Parâmetros estão faltando! dias", "8bfe471aeee92b5cfc257706f3667e80": "Para garantir a segurança dos dados, binlogs recentes não podem ser excluídos!", - "2e3b42799f015adb46c85d60b8b1d7bb": "Limpeza concluída!", + "2e3b42799f015adb46c85d60b8b1d7bb": "Limpeza completa!", "048b0b74236019df8c9f2c0e9470765f": "Falha ao obter bancos de dados", "34e30525f59e7e2202d51d1314c119aa": "Reparado com sucesso!", "9133beb60bf19699376626515071105e": "Falha ao reparar!", @@ -1084,84 +1087,83 @@ "b263d2d0b9a2fe2cb5ea3c37240e7fe7": "Alterado com sucesso", "d72873c28781d7d42a8a50e344a38c65": "Falha ao alterar", "5a513bca80ba9e849cd64e6df029b53a": "Não há token", - "beb887915b2334d0bcb0f23910ee03fa": "O cancelamento da inscrição do email {} foi bem-sucedido", - "ced5be071465948d917518318181e530": "Falha na operação, o token expira", - "ed0b8b7de7d6124343c2c12f29c84a2d": "Falha na operação, tokens inválidos", - "2759543b1abc5021bf03258b0032b6fb": "Não há email", + "beb887915b2334d0bcb0f23910ee03fa": "O cancelamento da inscrição do e-mail {} foi bem-sucedido", + "ced5be071465948d917518318181e530": "Operação falhou, O token expira", + "ed0b8b7de7d6124343c2c12f29c84a2d": "Operação falhou, Tokens inválidos", + "2759543b1abc5021bf03258b0032b6fb": "Não há e-mail", "238865a1f3c33fae77a59ce42a641346": "Por favor, preencha as informações completas", "9bd45853e9c7cca825b227f1472901c8": "O nome da nota não pode exceder 7 caracteres", "bdd1b7bb74543fb0fae1e75f372551d8": "Falha ao adicionar, verifique se a URL está correta", - "1cb8f68ece43505dde623d0e297426ac": "Notificação definida com sucesso", + "1cb8f68ece43505dde623d0e297426ac": "Notificação configurada com sucesso", "557738e2e8b82bbb847ab9ecc6d83c8a": "As informações do DingTalk estão configuradas incorretamente.", "3781473f4af411ebb3610977e7275a3d": "Erro de configuração do DingTalk, reconfigure o robô DingTalk.", "94418c3f275f6e8bca8e35751495f370": "As informações do Feishu não estão configuradas corretamente.", - "16ff838f760194a432da12e9bb4895d9": "Falha no envio, verifique se a configuração do remetente ou as informações do destinatário estão corretas.", - "203b93a974c7142ca4b203443af817d9": "As informações de email não estão configuradas corretamente.", - "8b42e24f005c452259add632215a77a8": "A complexidade da entrada de segurança não é suficiente
1, o comprimento não deve ser inferior a 9
2, combinação de inglês + números.", - "9ad1940cfc7c1786a62bb3d784420413": "operação bem-sucedida!", - "14e1e77b50aaf60272775c43894560ad": "As informações do telegram estão configuradas incorretamente.", + "16ff838f760194a432da12e9bb4895d9": "Envio falhou, verifique se a configuração do remetente ou as informações do receptor estão corretas.", + "203b93a974c7142ca4b203443af817d9": "As informações de e-mail não estão configuradas corretamente.", + "8b42e24f005c452259add632215a77a8": "A complexidade da entrada de segurança não é suficiente
1, o comprimento não deve ser inferior a 9
2, combinação de inglês + digital.", + "9ad1940cfc7c1786a62bb3d784420413": "operar com sucesso!", + "14e1e77b50aaf60272775c43894560ad": "As informações do telegrama estão configuradas incorretamente.", "39ddfbf65700efc9a7d16b22ebb867f3": "Erro de configuração do Telegram, reconfigure o robô.", "691e87b47c012051a2e82b3c87a829be": "envio completo, resultado do envio: Verdadeiro.", "c13967b1cbadeb9e2138223c0ed9fa0d": "envio completo, resultado do envio: Falso.", "ed702c2212ce3c1acf4b5435100b44c2": "As informações não estão configuradas corretamente.", "b1ffdb005a4c842221dd8267c47de40a": "As notificações foram desativadas, ative-as e tente novamente.", - "75983b18d2ecbb82d71afea42138a28b": "As informações de vínculo do usuário não foram obtidas", + "75983b18d2ecbb82d71afea42138a28b": "As informações de vinculação do usuário não foram obtidas", "f9d875367d71359c197b5fe0894cdfa8": "O link para a nuvem falhou, verifique a rede", "4ad85d46374d522bcd3bf2eff2cf2600": "Nenhuma informação de usuário foi obtida", "2f9fc94872130dd0fb976fc6b0b96514": "Falha na entrega da mensagem WeChat. --> {}", "0b27e119bbc4a725cbf863dfd52dc473": "fun_name indefinido", - "a969a46fc07219c039a985f8f7b61cf6": "parâmetros errados, nome de função indefinido", + "a969a46fc07219c039a985f8f7b61cf6": "parâmetros errados,nome func indefinido", "cbf8d9b9372ca5f52268a5dbbb6af5e9": "dns_id desconhecido", - "36150f18886cfdedefd8e0ce031ebaa6": "Falha na execução:{}", - "315e5172120e0508a5da1da63fe80903": "Falha na configuração!", + "36150f18886cfdedefd8e0ce031ebaa6": "Execução falhou:{}", + "315e5172120e0508a5da1da63fe80903": "Configuração falhou!", "d78db61be0fee99b043b646bcb10a1cd": "configuração bem-sucedida!", "22af6aacc48ecde709e357b7f689fa4a": "Por favor, selecione o nome de domínio que você deseja configurar!", "703f48fb3880275147fb6341a601d75a": "O DNS especificado não existe!", - "6afe3a685b340d46d1eb5e96f46d8b53": "falha na configuração!", + "6afe3a685b340d46d1eb5e96f46d8b53": "configuração falhou!", "25d70741ea5481da5457bc36f316f2cd": "A configuração foi bem-sucedida e {} registros foram atualizados!", "a0db66604e4493a5782f45097fcad859": "Este tipo já existe.", "ffbeb35495d2bfaaf4957cc8db9cd8e6": "adicionado com sucesso!", "e7d698b3874686530ce8eade7d46cd89": "exclusão bem-sucedida", - "5ccf1f7d5db89204eee4cfdcdb0944d4": "falha na exclusão", + "5ccf1f7d5db89204eee4cfdcdb0944d4": "exclusão falhou", "7c7d6bc523a6ba94346ef9419f4b93a6": "excluído com sucesso", "838d94727e13707491b9d9c9510ba453": "Sincronização bem-sucedida.", "33c678a30e066da93ac44a17629f3900": "dns_type indefinido", "ac612c51ba24c8559bd045e2c3706011": "O arquivo de módulo {} não existe.", "4c9eea0839e8a2516ca1d34407cf0305": "Falha ao definir o registro DNS:{}", - "7bc387e9ae161a403dac4ccfebbf012e": "Nenhuma informação de chave API DNS válida foi encontrada para o nome de domínio {}.", + "7bc387e9ae161a403dac4ccfebbf012e": "Nenhuma informação válida de chave de API DNS foi encontrada para o nome de domínio {}.", "e5a1f5bb9e10d065f27eac8d4e8c2e8d": "Falha ao excluir o registro DNS:{}", "7c89ed1def10408d3584152d2ad2eb33": "O nome de domínio já existe.", - "55ab92952e1b4dca79cda76843eebe99": "sucesso ao adicionar", - "584a4244515646b153102a8d302e8546": "O painel não está logado, portanto, o upload para a nuvem não é possível!", + "55ab92952e1b4dca79cda76843eebe99": "adição bem-sucedida", + "584a4244515646b153102a8d302e8546": "O painel não está logado, então o upload para a nuvem não é possível!", "347dae5469b16521e17a37cc2e3168ad": "Não há certificado especificado.", - "cf25e0eebbaec98c374104d843fb31fe": "A exclusão local foi bem-sucedida, ", - "6e1fa7be6a999db147fe218c1e5a85ca": "Falha ao conectar à nuvem. Não foi possível excluir dados da nuvem.", + "cf25e0eebbaec98c374104d843fb31fe": "Exclusão local foi bem-sucedida, ", + "6e1fa7be6a999db147fe218c1e5a85ca": "Falha ao conectar à nuvem. Impossível excluir dados da nuvem.", "efbfd7f8e586c8efafccb9260aec988e": "parâmetros errados", "1c9a090e06b2f4d3858bd2141b97133f": "Erro de operação:", "69d0b962baab44b9e0df62a51012996b": "O painel não está logado e o upload para a nuvem não é possível!", "3e5b88adc8b76d44032b4f54f2a4dc29": "Não há informações de certificado especificadas.", - "4fa5aad0ed4116fef4e615297106ca98": "Erro de leitura do arquivo de certificado", + "4fa5aad0ed4116fef4e615297106ca98": "Erro de leitura de arquivo de certificado", "e61a80b8cfc84266cc6da96a589f389e": "Falha ao conectar à nuvem", "3098a079086bc6216453ef84da5b9504": "sem parâmetros", "670a25b9478103f18df9dae288ea9680": "O certificado não existe!", - "ef703ece601c1e3204353eaba0cd7062": "tipo de parâmetro errado", + "ef703ece601c1e3204353eaba0cd7062": "tipo de parâmetros errados", "cad878a2802e3f05a8f0b94822b123ef": "Não há informações de certificado.", "c3c25b414fbc136ec923a6d770fceedf": "O certificado já existe.", "a93ac12141fcab1f5ddb502e738a4494": "Salvo com sucesso", - "9fe357faf3332a5040d055fc390945ad": "Informações do certificado não encontradas", + "9fe357faf3332a5040d055fc390945ad": "Informações de certificado não encontradas", "3ff7e4a7ba896ece34407eed8e2c6489": "O certificado não é emitido por Let", "44eb815db7510a33f531b5b062964bb6": "Criado com sucesso!", - "2e69adb0366a9a6daea00860367ac03c": "Falha na criação!", + "2e69adb0366a9a6daea00860367ac03c": "Criação falhou!", "378dfed31bb76afb115821875780c68f": "O painel não está logado, ", "c68d5b6b7aa83937b4d12f88fbd1b130": "Falha ao obter dados da nuvem", - "49b5863032401b0857eaeaa17c0cddad": "Informações do certificado não foram encontradas", + "49b5863032401b0857eaeaa17c0cddad": "Informações de certificado não foram encontradas", "2de69e10f0a8a2c7e640011e06eaf229": "Parâmetros obrigatórios estão faltando.", "6e28b57028810b7101ed93200348e6fd": "Nenhuma informação de certificado foi encontrada.", - "5ff082a692a93d7aff84fffe2515e9d9": "Sem log de erro", + "5ff082a692a93d7aff84fffe2515e9d9": "Nenhum log de erro", "5efde395239afdd2df0b9a32c159768f": "MySQL não está instalado!", - "dacf49abac88060f508283464e6488b3": "O arquivo de log não existe!", + "dacf49abac88060f508283464e6488b3": "Arquivo de log não existe!", "cc04dd5405df97665d385bf9f945a1a5": "[{}] Falha ao obter o caminho do site, verifique se o IIS existe neste site, se não existir, exclua este site no painel após a criação.", - "5043b4dd5ee84b81c695150ce7b71a1d": "Por favor, não use portas padrão para programas comuns!", "6bfd22d9b1190dd6f3252ffc5f07843c": "Instalação bem-sucedida", "9ce49cccc03f08a6f144e6b2951065ca": "instalação falhou", "6ec9c7ee4154392f5dcc682fc786e84b": "comando de controle desconhecido!", @@ -1171,41 +1173,42 @@ "d27cddcec5e0f66a566fbcdceb5dfef6": "Excluído com sucesso!", "271bac9db0d6fb9f971271a8f37ca6c5": "Por favor, instale o módulo dnspython primeiro: btpip install dnspython", "4fe093af429d1f1fc2198447a1025931": "Erro de parâmetro", - "03460a8fbae274ee5f04e0ba1fa34812": "Os recursos atuais são exclusivos da versão profissional", + "03460a8fbae274ee5f04e0ba1fa34812": "Recursos atuais são exclusivos da versão profissional", "7f17f95382055aefa5d3e915c72a98d4": "Por favor, insira o nome de domínio", "35c9657c6576e84644303a7ad43318f5": "O nome de domínio é resolvido para um endereço IPv6 e regras de porta não são suportadas.", - "49f648bea338734c76f49de41c91aebe": "Resolução do nome de domínio {} adicionada com sucesso", - "2edad93b0f08e091c3cc25470e8ddf6f": "A resolução do nome de domínio não foi resolvida ou a resolução não entrou em vigor. Se tiver sido resolvida, tente novamente após 10 minutos.", - "7a3359de6c4391fe9a15eb0425846fd8": "O nome de domínio {} já existe", + "49f648bea338734c76f49de41c91aebe": "Resolução de nome de domínio {} adicionada com sucesso", + "2edad93b0f08e091c3cc25470e8ddf6f": "A resolução de nome de domínio não foi resolvida ou a resolução não entrou em vigor. Se foi resolvida, tente novamente após 10 minutos.", + "7a3359de6c4391fe9a15eb0425846fd8": "Nome de domínio {} já existe", "4fb42cb76f14ea60b67f9bceb6c4a49e": "Todas as regras de IP foram removidas.", "0b3157eba7dd3451bc0de1c6ca480ec2": "Operação bem-sucedida", - "932c825a6aee54ff754f33c628cd90bc": "Esta porta já existe, por favor não adicione novamente!", + "932c825a6aee54ff754f33c628cd90bc": "Esta porta já existe, por favor, não adicione novamente!", "c49175dd1fdb203713f6c1476a7f91b3": "Comando de controle desconhecido!", - "2faec1f9f8cc7f8f40d521c4dd574f49": "Habilitar", - "8d66632de28752245beaa40b1ccc1cbf": "Desativar encaminhamento de porta", + "2faec1f9f8cc7f8f40d521c4dd574f49": "Ativar", + "8d66632de28752245beaa40b1ccc1cbf": "Desligar encaminhamento de porta", "2d5f7bdbdb53fff3cd55702cbdbfa8bd": "Por favor, insira o nome do país!", "f8bacfec9ade03b0f3584356b898fca8": "Falha ao adicionar", - "eac00ab48eb660db9a0929e6f036ecf2": "Esta área já foi adicionada, por favor não adicione novamente!", + "eac00ab48eb660db9a0929e6f036ecf2": "Esta área já foi adicionada, por favor, não adicione novamente!", "805139d226669cfd0320c760cb10e87c": "Por favor, insira o nome da área correto!", - "969a6c87a281f49bd8fc2c1e43f66ec4": "falha na operação", - "0683e26aace0f0c175199272031ce3e6": "A porta não pode estar vazia!", - "8e7387f80c2d22c7515b38afef01b9c2": "Erro de passagem de parâmetro, por favor passe o campo de porta", - "926dba790adb1d53c53941a06ccb2da7": "A porta não pode estar vazia", - "705c5fd65ddbcaea039c3aa2f5e135ee": "Intervalo de portas não suportado", - "84cd1055b1130ac448baec04de07d986": "A porta deve ser numérica", + "969a6c87a281f49bd8fc2c1e43f66ec4": "operação falhou", + "0683e26aace0f0c175199272031ce3e6": "Porta não pode estar vazia!", + "8e7387f80c2d22c7515b38afef01b9c2": "Erro de passagem de parâmetro, por favor passe o campo porta", + "926dba790adb1d53c53941a06ccb2da7": "Porta não pode estar vazia", + "705c5fd65ddbcaea039c3aa2f5e135ee": "Portas de intervalo não suportadas", + "84cd1055b1130ac448baec04de07d986": "Porta deve ser numérica", "7d134add7af4d8e6fdf31cde8332da30": "O intervalo de portas é 1-65535", - "f11c2e32a42274ed9160658e259b2e58": "Falha ao ignorar regra,{}!", - "8c7cabcdcfe7a6ed8b0e27b04ad408e6": "Regras ignoradas com sucesso!", - "f5800cf5bc9b3d8aee2ea9222951ac93": "Ignorar regra cancelado com sucesso!", - "85056ee18e1ac6fefa9f955da5a155e0": "O plugin fail2ban não está instalado", + "f11c2e32a42274ed9160658e259b2e58": "Ignorar regra falhou,{}!", + "8c7cabcdcfe7a6ed8b0e27b04ad408e6": "Ignorar regras com sucesso!", + "f5800cf5bc9b3d8aee2ea9222951ac93": "Regra de ignorar cancelada com sucesso!", + "85056ee18e1ac6fefa9f955da5a155e0": "Plugin fail2ban não está instalado", "dfda9d0c9d44e155e4125ebccfcbea99": "Desbloqueado com sucesso", - "6ed05063a343a4a8c2fb6bb191f57644": "Status normal, pular.", - "29833bee6957ec87ae7e9f81346a0929": "Serviço não instalado, pular.", - "f99d5d784d98d4e59b100ffb596fbc9a": "Enviado uma vez ao dia, pular.", - "2e11d603b68f16cce28a92f1fee630d4": "Versão profissional permanente, pular.", - "887755b06aa757db733fcdb5c4b90d8e": "Limite não atingido, pular.", - "944ec5555dd02ca9855e2aad5f31ecc3": "Certificado expirado não encontrado, pular.", - "d7316ce06449be2b2961a61bc8b90044": "O intervalo não foi atingido, pular.", + "5043b4dd5ee84b81c695150ce7b71a1d": "Por favor, não use portas padrão para programas comuns!", + "6ed05063a343a4a8c2fb6bb191f57644": "Status normal, pulando.", + "29833bee6957ec87ae7e9f81346a0929": "Serviço não instalado, pulando.", + "f99d5d784d98d4e59b100ffb596fbc9a": "Enviar uma vez por dia, pulando.", + "2e11d603b68f16cce28a92f1fee630d4": "Pro Vitalício, pulando.", + "887755b06aa757db733fcdb5c4b90d8e": "Limite não atingido, pulando.", + "944ec5555dd02ca9855e2aad5f31ecc3": "Certificado expirado não encontrado, pulando.", + "d7316ce06449be2b2961a61bc8b90044": "O intervalo não foi atingido, pulando.", "b388dbfa7884f3af33ba7551726ec631": "O alarme de login do painel suporta apenas um modo de alarme.", "bc5339f81ff38e283bb920dfb33ca914": "Não suporta suspender o alarme de login do painel, se precisar suspender, exclua-o diretamente.", "b5db9d7f14a728ef1b07894e6c776f4b": "O alarme de login SSH suporta apenas um modo de alarme.", @@ -1223,159 +1226,224 @@ "8f17aebb2889752cf3c60ac571167c8b": "Nenhum diretório de proteção especificado", "100f712f58657782dda9a5bc070e0248": "O parâmetro está incorreto", "b0186e5e273a163a78c04376a5756b1e": "O diretório especificado não existe", - "2226683c8d89df274e2ded7e04fc4a82": "Você não pode usar o diretório crítico do sistema como o diretório de backup padrão", + "2226683c8d89df274e2ded7e04fc4a82": "Você não pode usar o diretório crítico do sistema como diretório de backup padrão", "e69cc1102c087a819764e93d50ab3ef0": "O site especificado não pôde ser encontrado.", "a584585f2e3445e4d2d93865bb0c7952": "O banco de dados especificado não pôde ser encontrado.", - "fdf95ff2f0a3298c8a83aad5255780e5": "Banco de dados [", - "35936286a74058c49c309b2a7b6bcc27": "O nome de usuário do banco de dados é inválido!", - "e2d70330883c9001c29e0225b6c99e9c": "O nome do banco de dados é inválido!", - "68519350e49a18c7380764a80dd6daa9": "Erro de passagem de parâmetro, parâmetro ausente {}!", - "152b651d5c0151cc3864d20d187d77fe": "Passou!", - "bea367683a2238e537e3833d0b15622e": "O servidor especificado já existe: [{}:{}]", - "0b5f04d53d3af37f88b9b46b568d1dee": "Falha ao adicionar: {}", - "0667c3c8ef82f94545b286b69ef83030": "Erro de parâmetro passado, tente novamente!", - "4621e9c9b573b1bc868d310934d04cac": "O servidor remoto especificado não existe!", - "81eef63c48701d6d256ad3e7789bd8f6": "Excluído com sucesso: {}", - "c1f0a2e54f38603c731c9625f35aaa11": "Modificado com sucesso!", - "072b1fb2c5c32e99fea89190987f1511": "Falha ao editar: {}", - "0267067a2f76a814e9f2c9c111fa6a2e": "Componente MySQLdb está faltando!", - "b1b74781e4481f083f18ad6719a6b583": "ERRO ao conectar banco de dados", - "94bce4b2a745d07c681c29af6824d435": "Tempo limite de conexão com o banco de dados esgotado, verifique se a configuração está correta.", - "34fbe37d35b2a1bc1a58bdcc559be395": "Erro de senha do MySQL.", - "3d28138b07e32fc589d1a654980b1c28": "Excedeu o número máximo de conexões, tente novamente mais tarde.", - "f5f1c56c404d98779a4fbe5630f7d778": "Falha na conexão com o banco de dados, verifique se o usuário root está autorizado a acessar 127.0.0.1.", - "a9905dc3078535a661eb1aeb06f5a6da": "A senha do banco de dados está incorreta!", - "b99ad6bb4ca9c32cc31655c1f26ad347": "A conexão expira, ative manualmente a função TCP/IP (Menu Iniciar->SQL 2005->Ferramentas de Configuração->Configuração de Rede 2005->TCP/IP->Ativar)", - "734539622328115b6a79770792621598": "O banco de dados especificado já existe, por favor, não adicione repetidamente.", - "d0f9cbbc082071764bd58cb868dc86d8": "A operação falhou, o banco de dados remoto não suporta a operação.", - "2ff54c9774281fd464a75fac44b2bbee": "Permissões insuficientes, por favor use o usuário root.", - "d4e4cbdf86adbbf8338c46fa850b0d97": "Falha na criação, o SQL Server requer suporte a GUI", - "0e50ad3c23c4eb42db81e7ea3da4848e": "Erro de passagem de parâmetro.", - "9c367cb765f842bfe6a0465674b8d311": "A operação foi bem-sucedida.", - "7a48d7e0ce17e4a5ad1dadbfa199e464": "Restauração Bem-sucedida.", - "e9bc861d80a7d42ec15bcdb7e5529cda": "Falha na restauração.", "011f5bc126ef873c518707207467b8bf": "O serviço Mongodb ainda não foi iniciado!", "22ccd99629b3c3d5a8533884821f4189": "A senha do banco de dados não pode estar vazia ou ter caracteres especiais!", - "c976dec7ee3b051c53f9761bd9aa73c2": "A senha do banco de dados não pode conter caracteres chineses, por favor altere o nome!", + "c976dec7ee3b051c53f9761bd9aa73c2": "A senha do banco de dados não pode ser chinesa, por favor mude o nome!", "282a7d2dabc5b37dfe75dc697dbbacae": "O tipo de banco de dados sid precisa ser do tipo int!", "e1fa0193b4a126d332026f2c608681c9": "O nome do banco de dados não pode estar vazio!", "5c58f12f149b01b546d97b25b95c0df3": "O banco de dados especificado não existe.", "89f2b141f7790003d85cee94389a5899": "O caminho de importação não", "579cd57c80fb53784de0bd606c14891e": "Apenas arquivos compactados podem ser importados!", - "c3522356d75eaa63da51f2c2f6c9bd84": "Falta de ferramentas de backup, instale o MongoDB através da [Loja de Aplicativos] primeiro!", + "c3522356d75eaa63da51f2c2f6c9bd84": "Falta de ferramentas de backup, instale o MongoDB através da [Loja de APP] primeiro!", "4143861cb7ed8d905267a8ea56ad5935": "O formato do arquivo está incorreto!", - "2e36f9ef630e2714cd71fe91d4e8bf15": "A autenticação de senha foi ativada. A senha não pode estar vazia quando o banco de dados é copiado. Por favor, defina uma senha e tente novamente!", - "d28fa16e1236163fbc5787469193f18f": "Falha no backup do banco de dados, o arquivo não existe", + "2e36f9ef630e2714cd71fe91d4e8bf15": "A autenticação de senha foi ativada. A senha não pode estar vazia quando o banco de dados é copiado. Defina uma senha e tente novamente!", + "d28fa16e1236163fbc5787469193f18f": "Falha no backup do banco de dados, arquivo não existe", "04aa3a99d1550de2a89aa408790e0234": "Falha no backup,{}.", "2a389cf13e591eb8202af139c82a762c": "O backup foi executado com sucesso, o arquivo de backup é menor que 1b, verifique a integridade do backup.", "37ef1150b54080db22f4de766c00a902": "O tipo de banco de dados sid precisa ser do tipo int!!", "bb372e9b5c377f89809981e38570e41b": "O serviço Mongodb ainda não foi iniciado!!", "1a80d7a1efd89c63a3f8f33bd9b07397": "O tipo de banco de dados SID requer um INT!", - "e36f515323b0caa721c681b2d378a695": "O serviço Mongodb não está ativado!", - "c254f52cdaeb7f1a88c6bdd3e3e3c3f8": "Falha ao modificar,O banco de dados[", + "e36f515323b0caa721c681b2d378a695": "O serviço Mongodb não está habilitado!", + "c254f52cdaeb7f1a88c6bdd3e3e3c3f8": "Falha na modificação,O banco de dados[", "d9533af3481500e4eab2d71bc0d80f50": "A senha do banco de dados não pode estar vazia ou conter caracteres especiais", "5e2ab00d16dbc00c7fc25cbade8fab26": "A modificação falhou porque o banco de dados especificado não existe.", - "e3d61b8e9ff54176be78612b4de00321": "O acesso por senha não está ativado para o banco de dados.", + "e3d61b8e9ff54176be78612b4de00321": "O acesso por senha não está habilitado para o banco de dados.", "b949f2f31ecdc2714448b254511fb797": "O nome do banco de dados não pode conter caracteres especiais", "42ea48e57900c1ca39c38b7740b156e5": "O banco de dados não existe!", "ff14e82e3d1041c3fe4986830981065d": "A senha do banco de dados está vazia. Defina a senha primeiro.", - "2de872b07fddc8df9c2085fa214e780b": "Falta de ferramentas de backup, por favor instale primeiro o gerenciador PGSQL através da loja de software!", + "2de872b07fddc8df9c2085fa214e780b": "Falta de ferramentas de backup, instale o gerenciador PGSQL através da loja de software primeiro!", "200e48e96725c9ce425d7dbf388cbb8e": "O tamanho do arquivo de backup é menor que 2Kb. Verifique a integridade do backup.", - "894f4e4dbeef39cd673987e501f8c2ab": "Selecione o arquivo sql、gz、zip!", - "f5905bb1f1098b37b11d1e1787296924": "Falta de ferramenta de recuperação, use o gerenciamento de software para instalar PGSQL!", + "894f4e4dbeef39cd673987e501f8c2ab": "Selecione arquivo sql、gz、zip!", + "f5905bb1f1098b37b11d1e1787296924": "Falta de ferramenta de recuperação, use o gerenciamento de software para instalar o PGSQL!", "ba32600a98bc2e63a7609dfd18f7a764": "A senha do banco de dados não pode estar vazia.", - "e7381be5e7f44708306bc9816f83481c": "Falha ao modificar,O banco de dados especificado não existe.", - "7d354324037030e692b06b94f9d024c7": "Se o PgSQL não estiver instalado ou iniciado, instale ou inicie-o primeiro", + "e7381be5e7f44708306bc9816f83481c": "Falha na modificação,O banco de dados especificado não existe.", + "7d354324037030e692b06b94f9d024c7": "Se o PgSQL não estiver instalado ou iniciado, instale ou inicie primeiro", "a877289c330ccbad75d3674c560e89d3": "A senha não deve ter menos de 8 dígitos.", - "da3304c09f836a15a0c1ef43d28ce833": "O arquivo {} não existe, verifique se a instalação está completa!", + "da3304c09f836a15a0c1ef43d28ce833": "{}Arquivo não existe, verifique se a instalação está completa!", "e6d4787574cefef9b9dd6b3ab549bf68": "A senha do administrador foi alterada com sucesso. Procedimento.", - "b67d85c71006c071b58767216be65eb2": "A conexão com o PGSQL remoto falhou. Execute as seguintes operações para corrigir a falha:
1、A porta do banco de dados está correta e o firewall permite o acesso
2、Verifique se a senha da conta do banco de dados está correta
3、pg_hba.conf: Se foi adicionado um registro de liberação de cliente
4、postgresql.conf: Adicione listen_addresses ao endereço IP do servidor correto.", + "b67d85c71006c071b58767216be65eb2": "A conexão ao PGSQL remoto falhou. Realize as seguintes operações para corrigir a falha:
1、A porta do banco de dados está correta e o firewall permite acesso
2、Verifique se a senha da conta do banco de dados está correta
3、pg_hba.confSe deve adicionar um registro de liberação de cliente
4、postgresql.conf Adicione listen_addresses ao endereço IP correto do servidor.", "0fbbe53688d144223b78036507d85b47": "Bancos de dados SQLServer não podem começar com números!", - "27cfc7c44317601d8cbdc241c928d17c": "A política de complexidade de senha do SQLServer não corresponde, deve ter 8-128 caracteres e conter quaisquer 3 deles: maiúsculas, minúsculas, dígitos, símbolos especiais!", + "27cfc7c44317601d8cbdc241c928d17c": "A política de complexidade de senha do SQLServer não corresponde, deve ter de 8 a 128 caracteres e conter 3 deles em maiúsculas, minúsculas, dígitos, símbolos especiais!", "f06bab2dcffc83aa9e8e3be555a9e56f": "Operação falhou. O banco de dados remoto não pode ser copiado.", "20fe68f46608aefa2c884b9390aa4cd2": "A importação falhou porque o arquivo não é um arquivo ZIP válido.", "a52ecc2f72eafcf3453f9a50ffb7d0aa": "A senha do banco de dados [", - "df4ac7366fa4fda98e94ea68f0e40d3c": "O SQL Server não está instalado ou iniciado. Instale ou inicie-o primeiro", - "935e0f201a754f406575ec14bde54a21": "A senha do sa não pode estar vazia ou ter símbolos especiais", - "896543f6d67a62d4c594b28eeee3c923": "A senha do sa foi alterada com sucesso.", + "df4ac7366fa4fda98e94ea68f0e40d3c": "O SQL Server não está instalado ou iniciado. Instale ou inicie primeiro", + "935e0f201a754f406575ec14bde54a21": "saA senha não pode estar vazia ou ter símbolos especiais", + "896543f6d67a62d4c594b28eeee3c923": "A senha de sa foi alterada com sucesso.", + "fdf95ff2f0a3298c8a83aad5255780e5": "Banco de dados [", + "35936286a74058c49c309b2a7b6bcc27": "O nome de usuário do banco de dados é inválido!", + "e2d70330883c9001c29e0225b6c99e9c": "O nome do banco de dados é inválido!", + "68519350e49a18c7380764a80dd6daa9": "Erro na passagem de parâmetros, faltando parâmetro {}!", + "152b651d5c0151cc3864d20d187d77fe": "Passou!", + "bea367683a2238e537e3833d0b15622e": "O servidor especificado já existe: [{}:{}]", + "0b5f04d53d3af37f88b9b46b568d1dee": "Falha ao adicionar: {}", + "0667c3c8ef82f94545b286b69ef83030": "Erro na passagem de parâmetros, tente novamente!", + "4621e9c9b573b1bc868d310934d04cac": "O servidor remoto especificado não existe!", + "81eef63c48701d6d256ad3e7789bd8f6": "Excluído com sucesso: {}", + "c1f0a2e54f38603c731c9625f35aaa11": "Modificado com sucesso!", + "072b1fb2c5c32e99fea89190987f1511": "Falha ao editar: {}", + "0267067a2f76a814e9f2c9c111fa6a2e": "Componente MySQLdb ausente!", + "b1b74781e4481f083f18ad6719a6b583": "ERRO ao conectar banco de dados", + "94bce4b2a745d07c681c29af6824d435": "Tempo limite de conexão ao banco de dados, verifique se a configuração está correta.", + "34fbe37d35b2a1bc1a58bdcc559be395": "Erro de senha do MySQL.", + "3d28138b07e32fc589d1a654980b1c28": "Número máximo de conexões excedido, tente novamente mais tarde.", + "f5f1c56c404d98779a4fbe5630f7d778": "Falha na conexão ao banco de dados, verifique se o usuário root está autorizado a acessar 127.0.0.1.", + "a9905dc3078535a661eb1aeb06f5a6da": "A senha do banco de dados está incorreta!", + "b99ad6bb4ca9c32cc31655c1f26ad347": "A conexão expirou, ative manualmente a função TCP/IP (Menu Iniciar->SQL 2005->Ferramentas de Configuração->Configuração de Rede 2005->TCP/IP->Ativar)", + "734539622328115b6a79770792621598": "O banco de dados especificado já existe, não adicione repetidamente.", + "d0f9cbbc082071764bd58cb868dc86d8": "A operação falhou, o banco de dados remoto não suporta a operação.", + "2ff54c9774281fd464a75fac44b2bbee": "Permissões insuficientes, use o usuário root.", + "d4e4cbdf86adbbf8338c46fa850b0d97": "Falha ao criar, SQL Server requer suporte GUI", + "0e50ad3c23c4eb42db81e7ea3da4848e": "Erro na passagem de parâmetros.", + "9c367cb765f842bfe6a0465674b8d311": "A operação foi bem-sucedida.", + "7a48d7e0ce17e4a5ad1dadbfa199e464": "Restauração Bem-sucedida.", + "e9bc861d80a7d42ec15bcdb7e5529cda": "Falha na restauração.", "bb0b766f654bd8338d9dabb8c57378ff": "Falha na criação do banco de dados. Verifique o status de execução do mysql e tente novamente.", - "439d4d68575132c1a273fc36bbf6f72c": "Não foram encontradas informações do site com id {}", - "bff0e83714a9073c270776c37cc64791": "Erro de parâmetro", + "439d4d68575132c1a273fc36bbf6f72c": "Nenhuma informação do site encontrada com id {}", + "bff0e83714a9073c270776c37cc64791": "erro de parâmetro", "5766c6d37d04fdab31ce8622fcf6fab6": "Por favor, inicie o firewall antes de importar regras!", "277467377ce35c4535ce0c9e36f4978f": "Nenhuma regra pode ser exportada", "686160d344e24c2dbcac934048f03baf": "O arquivo não pode estar vazio", - "d9523e347c0a2971241d3ac4120a2854": "Arquivo não existe", - "cf36e08b3ff2cfd7bb952c062cc79f49": "Conteúdo do arquivo anormal ou formato incorreto", + "d9523e347c0a2971241d3ac4120a2854": "arquivo não existe", + "cf36e08b3ff2cfd7bb952c062cc79f49": "Conteúdo do arquivo anormal ou erro de formato", "b6d16a8173dd0d43f580bc6882dc5e9a": "Importação bem-sucedida", - "67abf11af36ac64a147218d125e8418f": "Formato de endereço de destino incorreto", + "67abf11af36ac64a147218d125e8418f": "Erro no formato do endereço de destino", "d11dfae04c7fd00b48b744926f7e733b": "A configuração foi bem-sucedida, a seguinte regra falhou :{}", "434f027ff1a807413707c94a43c9a578": "Por favor, inicie o firewall antes de definir regras!", "7b6454aa962895f5d5147d035f91a0e2": "A porta de destino não pode estar vazia", - "9c6da8c31a9a2d7a04756b09f01696e7": "A porta {} já existe, por favor não adicione novamente", - "229ce80f45424e882fdc5274cf37f295": "Formato de endereço IP especificado incorreto", + "9c6da8c31a9a2d7a04756b09f01696e7": "A porta {} já existe, não adicione repetidamente", + "229ce80f45424e882fdc5274cf37f295": "Erro no formato do endereço IP especificado", "444bcb3a3fcf8389296c49467f27e1d6": "ok", "6e68a14dc03d5bc90eea5ca623dd61c8": "Por favor, passe old_data", "fd643caf7884ce64697fb2a670cc3304": "Por favor, passe new_data", - "4f87808ff2ae8fa99b12357b7837bc78": "O formato do endereço IP especificado modificado está incorreto", - "69be671786f62ce872f87de1ab761746": "Modificado com sucesso", + "4f87808ff2ae8fa99b12357b7837bc78": "Erro no formato do endereço IP especificado após modificação", + "69be671786f62ce872f87de1ab761746": "Modificação bem-sucedida", "99404700c0746498a22a6ac82f3a78ba": "Nome de domínio: 【{}】 falha na resolução", - "91166df490bd1ced7a0aac6daebc96ca": "O nome de domínio de destino não pode estar vazio", - "af9a54527ffd3f962a61e34911f918dc": "Formato do nome de domínio de destino incorreto", - "7f9c4436cdf25844dcd0cd46b62c2916": "Por favor, passe id", - "905d5834754a81bea63ea590793346bc": "O endereço de destino {} já existe, por favor não adicione novamente", - "315208d3066fd1615ba13b698c0af371": "O IP de destino não pode estar vazio", - "5bd31a01422acec34ec752e0a46f9415": "Não é possível adicionar seu próprio IP", + "91166df490bd1ced7a0aac6daebc96ca": "O domínio de destino não pode estar vazio", + "af9a54527ffd3f962a61e34911f918dc": "Erro no formato do domínio de destino", + "7f9c4436cdf25844dcd0cd46b62c2916": "Por favor, passe o id", + "905d5834754a81bea63ea590793346bc": "O endereço de destino {} já existe, não adicione repetidamente", + "315208d3066fd1615ba13b698c0af371": "O ip de destino não pode estar vazio", + "5bd31a01422acec34ec752e0a46f9415": "Não pode adicionar seu próprio ip", "ba797e05926242a5135289c98dcd9d36": "A porta de origem não pode estar vazia", "3ec1da1913c04a2c53dd6d6379f99d4c": "O endereço de destino não pode estar vazio", - "efef8b005464719937a7daa96ed5b3d8": "A regra de encaminhamento de porta já existe, por favor não adicione novamente", - "4943a6954b9887aa5989713fcbb2a0d1": "ERRO: Não foi possível conectar ao servidor {}, verifique se a configuração [AK/SK/Storage] está correta!", - "da10c98ffbf34b30edec9cf47d998a68": "Solicitação bem-sucedida!", - "24380483226504475d196fdcff7a6c77": "Falha ao conectar ao servidor! -1", - "353d91a7655b3ef5e024d07eef1888ab": "Falha ao conectar ao servidor! -2", - "75809e3b321efe1afbdf9773494d5dd9": "Não encontrou o arquivo de configuração {}, tente fechar as configurações da porta SSL antes de abrir", - "7d7014331b485392e1d6055aad5c26cd": "Não encontrou o arquivo de configuração SSL do nginx phpmyadmin, tente fechar as configurações da porta SSL antes de abrir", - "35e15c0be5bb51b628d96c9a520c9b01": "A porta [{}] está em uso!", - "f471efd0f135fbddafdce4ad1febf5bb": "O servidor web atual é openlitespeed. ", - "4a32aac45fa22d0c693a646d5e265bf1": "O certificado do painel não existe. ", - "c6b59c5c3d29862a6dc85e9375094c83": "O servidor web atual é local e de acesso privado.", - "056197513cf8b469874e09b037fa5aaf": "O servidor web atual não é suportado.", - "7ec0387d04c7d7c8259b497464fa3282": "phpMyAdmin já {}!", - "4790f238a5706fa03ed78c98efabd5f2": "Vínculo é válido!", - "c6fdc537935f8c3e97a442e8be9adf20": "Existe um arquivo com o mesmo nome que a pasta enviada. Verifique e tente novamente", - "055df73dfeac55aa4ddb8b31e98d3fea": "O usuário atual não tem permissões suficientes para acessar ou modificar {}", - "3ff13f637b9e318936f8d30f77c57c64": "O diretório atual é somente leitura", - "8c7dd0d2966be0d1427bb839c94a993a": "Falha no upload:{}", - "fc937a95d443a5accb3dc43dabf8a4c0": "Espaço em disco insuficiente", - "dc494cbbc1dad9fe8a2d219d561840d5": "Ocorreu um erro ao enviar o arquivo, exclua o arquivo temporário 【{}】 e tente novamente", - "45cd3dad5e3ac153966eff8aaf30c33d": "Existe uma pasta com o mesmo nome do arquivo enviado, verifique e tente novamente", - "eaf87474bf8e355eb84fadd0caf91f14": "O usuário atual não tem permissões suficientes para acessar ou modificar", - "fe56b3a6f3a8b6a24f60a62408351b0e": "Este é o diretório da Lixeira, pressione o botão [Lixeira] no canto superior direito para abrir", - "8ec1fba8a89cb67bc958d7b2424156e9": "Arquivo movido para a lixeira", - "99a091a444e6e207f60506fb4f0bdcce": "Arquivo excluído com sucesso", - "5873103908815f34241636e336e1f463": "A tarefa de compactação foi adicionada à fila de mensagens!", - "e57b7bae408dd226fabe86773cd6b3c3": "Operação em lote bem-sucedida [{}], falha [{}]", - "c28802f8d7f5a40cb9f17cace202e59f": "Erro de consulta, {}", - "11c99562b6212de14ddf1dcb06ea1696": "Nenhuma tarefa na FILA {}", - "94f33212bde1cd76797fe4fe78b2167f": "Atualizar composer de {} para {}", + "efef8b005464719937a7daa96ed5b3d8": "A regra de encaminhamento de porta já existe, não adicione repetidamente", + "62dc2bbb0528fe87522c74b113883a48": "O site especificado não existe!", + "89ae4391631ed393c6c0ac36a2a0810a": "Existem arquivos restritos no diretório Cache. Tente limpá-los do LiteSpeed Cache", + "825d333e554f58230379a1cbc8372480": "Falha na limpeza de cache. Verifique se o plugin Nginx Helper está funcionando corretamente.", + "4675bfcf662ee236a05dcb763cf9d520": "A configuração de cache Apache falhou. Verifique se o site está funcionando corretamente!", + "0b9aca52d360d6f7a8f2c5c897c93005": "As configurações de cache Apache foram bem-sucedidas!", + "a2cd28fcd32e92be995b2335768fdea3": "Cache Apache é suportado atualmente apenas em Hospedagem Multi-Servidor Web", + "b288b8637582cc38c1d4c902ed03cbec": "A instalação do plugin de cache falhou", + "aebabb72ad41fbe46f73abcc9dc00b9f": "O plugin de cache falhou ao ativar. Tente ativá-lo manualmente e então habilite o cache", + "3981bd44ca3f1d5abafc6b15ba8c7435": "As configurações de cache OLS foram bem-sucedidas!", + "3777f748e5535e7e38261b2e0afc8274": "Configuração de cache OLS falhou: {}", + "93916600bce5b19586cbf51d558b5d78": "Por favor, verifique se o formato [{}] está correto Exemplo: {}", + "8e342838d5cf3a93e34956c9550db4d0": "Falha na implantação: {}", + "e783e39c78ccc8fa455396f454b86c79": "Falha ao obter as informações de configuração do WP Toolkit", + "ef63d93aec22bed16012080faa44b635": "Falha ao salvar configuração: {}", + "9bb70ddd7b082fbaafb0b47a989b5cf5": "Falha ao obter fuso horário!", + "38f40438a6c7e12eca9b4ea2ad297b3e": "Definido no topo com sucesso!", + "257ee5f5c18f04e3a83fd18b33babf08": "Por favor, insira o ID para desafixar!", + "c6afe11bc7f565bb0a423883101ce67f": "Consulta falhou: ", + "45b3768a0b9da76f12937e20e17ff8c9": "{} Executar uma vez", + "403470819fb903a95a8fd9a22b01a3ee": "CRONTAB_MENSAL", + "7207ebce07676b20d98ec74a0ff65c77": "Executar uma vez por dia às {}:{}", + "4f4ae97ac3a0f45ef67bda70d5e4fe0b": "Executar uma vez a cada {} dias às {}:{}", + "82dccd8eb88a5611e453cbf6f25fa90f": "Executar uma vez a cada {} minutos da hora", + "a84b2e49920d839395e3f93812f9ac03": "Começando às 0:00 todos os dias, executar a cada {} minutos de {} horas", + "41924db412ce09aa5ef5c9f1f9c88ee8": "Começando do minuto 0 de cada hora, executar a cada {} minutos", + "45abd276fba3519ea010cb5b3c44a484": "Executar uma vez a cada {} em {}:{}", + "06ce21d9c603152315f749e19fab3148": "Executar uma vez em {}:{} do dia {} de cada mês", + "f2fc5ae4c94a95a754c58b15197bc135": "Executar a cada {} segundos", + "eb8cb9c97e5888beefc46d6c0645ff4f": "Inicializar e executar uma vez", + "7b9732c358c4e407030aca56ccb7a72b": "Nenhum dado encontrado para a tarefa agendada correspondente. Atualize a página para verificar se a tarefa agendada existe!", + "b55a6e4ebb6e988c6d46840ca6cc3315": "Incapaz de gravar no arquivo, verifique se o fortalecimento do sistema está ativado!", + "fff2eb19d097654514fc97c4a6e6d233": "tarefas crontab", + "64e1288887b58a1c65d05676f7197477": "Modificar o status da tarefa agendada [", + "ef1a7595dfa94a12b47bb18d3ac94313": "A tarefa agendada com este ID não existe", + "1844e0f52715901c376dca67e5742aa9": "Falha ao gravar tarefa agendada, verifique se o disco é gravável ou se o fortalecimento do sistema está ativado!", + "5a7b17945b660284bb813be218c04c71": "{} Falha na configuração", + "5e7205744bd38904dcbc7c0b77456fc7": "Excluir {}", + "140fb31d1756ae3c75b297f0c17f8b24": "O nome da categoria não pode conter declarações HTML", + "e5e2e32bece629fcba864f7f5e8df60f": "CRONTAB_NOMETAREFA_VAZIO", + "7a13562d776fdfdc9213a82f7f01d501": "O arquivo do temporizador não existe. Tente excluir esta tarefa e recriá-la!", + "f3b898619b284003475f2039ce53968c": "Tarefa planejada modificada com sucesso [", + "72a21489a541757ee98b54790e5f431f": "Modificado com sucesso", + "92f1227778f186dd8c5f6cae42f5285a": "Tarefa agendada adicionada com sucesso [", + "e55c44fbd41784b7731f71e2789cad65": "ADICAO_SUCESSO", + "b4d708d96e24278a93a6609b9e8002a8": "Parâmetro obrigatório ausente: execute_time (formato: AAAA-MM-DD HH:MM:SS)", + "c506f17bfd828a4aeaf5a7978103f6b9": "CRONTAB_CORPOTAREFA_VAZIO", + "1311d0f2576e30afceaa616f06a0fa53": "Falha ao adicionar tarefa única", + "5a3c3438dbcadf4a0d59858f17a8522f": "Logs de tarefa estão vazios!", + "e8ab4d6107eaf37c98f250be20f146e1": "Logs de tarefa esvaziados!", + "a0d347c48839cab209fa3827c667a5c8": "Excluir tarefas agendadas", + "46039515107ea576bdaf75935b8b5f0d": "Excluir tarefas agendadas: {}", + "a3c72de16808f111cbe7e4c6dacc401b": "DEL_SUCESSO", + "49b236322476b6e7baf65369b4b61565": "DEL_ERRO", + "d5925f01eeb5596fed21f5dae6ffed30": "CRONTAB_EXEC_TAREFA", + "72bf657fef1eeafa1c8ecde5e4c06405": "Execução da tarefa falhou! Nenhum registro de tarefa correspondente encontrado.", + "8804f9a6882b09397bbc0599ba59b7ca": "Execução da tarefa falhou! O ", + "e9ca7bae70907408382135107fb85a13": "Download falhou!", + "272892ac18608e0a1ad6bf080afd2e51": "Limpar com sucesso!", + "06511118622e143af60d10d0877c9a3d": "Limpeza falhou!", + "424a90061acbe105658b97a0d86a4de2": "Por favor, insira o nome do arquivo!", + "14854122a7fb5958664a8d840dc0bead": "Por favor, instale o armazenamento webdav primeiro!", + "a027ff0717f56bf016b2f023d92e0c32": "Nenhum arquivo correspondente encontrado, baixe manualmente do armazenamento em nuvem", + "f7314eff61e017245b088eecfee0c418": "Objeto de armazenamento em nuvem não inicializado corretamente!", + "a09c248c44ca9548bce41bc3e79b400d": "O arquivo não foi encontrado no armazenamento em nuvem!", + "9b23d05e4cb1d3ee22dd3dd7212817ab": "Nome da classificação não pode estar vazio", + "fade4a03622ee745aaf87044d697203f": "O comprimento do nome da categoria não pode exceder 16 dígitos", + "c875cf8f63d81c7fb198018d5c4bfa79": "O nome da categoria especificada já existe", + "f66442d89b8c613c082425a93b417695": "A categoria especificada não existe", + "caf573e6b4299b7f60e24635b0295e9d": "Categoria excluída", + "9133e7faf0b9fc202294e495163b1ced": "O nome não pode ser alterado para o nome de classificação de tarefa padrão do sistema", + "a3ee2a93b0a298de033ca1b784f62f04": "Não pode ser definido como classificação do sistema ou classificação padrão!", + "f300a6ee81c71057acc7beecdaf472c7": "Configuração bem-sucedida!", + "290435bc045f16e4d099d721b7f706c3": "Configuração falhou", + "8d49c76279564d3127e45cae01976d37": "/tmp/cron_task_data.json", + "d7ee2f4d054a35aab002985b80644f24": "Exportação falhou:", + "1cd20eabfaa5ad5793b4075f976bf475": "Incapaz de analisar arquivo JSON!", + "205904d76b14dbdb456fc2a2997ba5b1": "O formato do conteúdo do arquivo JSON está incorreto!", + "f63f66d08d61a3b16c11e0dfce9510e1": "Importado com sucesso {} tarefas agendadas", + "414522bb8a68d31211190865a1cefdd0": "Por favor, escolha importar o arquivo!", + "8342696568c9b58f16cf29e2492cddea": "Importação falhou! {0}", + "51b34794854788b7e5eb8c3a8fab0242": "Por favor, passe o parâmetro de tempo!", + "860f363ecfcf11c8740b9068152b910c": "Desligamento temporário e reforço do sistema bem-sucedidos!", + "acbe969acf9b4925e963f102f3430f84": "Desligamento temporário do reforço do sistema falhou!", + "14a7c9c4ed221e7b3234de80bb8b9ef9": "Corte de log ativado com sucesso", + "15af2c7a6a5766d84ad8c57c5d2fb0dc": "Corte de log desativado com sucesso", + "636cccf0b373acec35770f9f26710396": "Falha ao ativar corte de log", + "bd6df8255e394034ebcf93fcebfe06d3": "Aquisição falhou:", + "90a80c8e64ee80e8577c44699b6faa7b": "Falha ao criar tarefa agendada {}, verifique se o fortalecimento do sistema está ativado ou a condição do disco", + "796b4f2a019427bc554ef1166faad8aa": "Fechar com sucesso", + "f222f6f9531a00476e39863b53bcde07": "Abertura falhou", + "52d812a7c0b57b35fac4e668122191a3": "Execução de script falhou", + "f804ceef9dd122e198f13357be514e41": "Backup Automático Banco de Dados[TODOS]--mysql", + "26e64121956b9e7e55244a508f146864": "Backup Automático Site[TODOS]", + "dd1ddef2d75c7c80540db8c12270af8a": "O parâmetro passado não é um objeto interno universal", "f5484a1a111b9d70ecaafb36a7df48f6": "E-mail não existe", "59d26291d38cd716232dd08e1c6c5304": "Por favor, insira seu e-mail", "d76fd2d8c3dffcbab0885c9bdf78fe16": "E-mail já existe", "fec0532445dc524beeac7255c4d34ef8": "Por favor, complete as informações", - "ffa0dfd81ff9459785617a7a73a7d9f4": "Falha no envio do e-mail, verifique se a senha SMTP está correta ou se os hosts estão corretos", + "ffa0dfd81ff9459785617a7a73a7d9f4": "Envio de e-mail falhou, verifique se a senha STMP está correta ou se os hosts estão corretos", "ae73c4d1db318d09f4792e23f1b80584": "Sem Dados", - "7ee533d91b6b3524d4fcfcde77dc4987": "Esvaziado com sucesso", + "7ee533d91b6b3524d4fcfcde77dc4987": "Esvaziar com sucesso", "11f60f1528977a463a3ef16a8876e4f6": "A caixa de correio não existe, adicione-a à lista de caixas de correio", "009654d37f429367967bd49ee47c26f2": "Por favor, preencha o título do e-mail", "2ab41d39d3f12250b5dc3ae0d610caa4": "Por favor, insira o conteúdo do e-mail", - "0c1828ed3fbaf5eec3fb8ad0a7aa957a": "Informações SMTP não encontradas, adicione novamente as informações SMTP de e-mail personalizado nas configurações", + "0c1828ed3fbaf5eec3fb8ad0a7aa957a": "Informação STMP não encontrada, readicione informações STMP de correio personalizadas nas configurações", "03212d3e6324204bce266e74779ab3c9": "Enviado com sucesso", "494247bcb984f09ad09176c8256e64ac": "Falha ao enviar", "6f81b0f19f4ef82bf31eeb9c20979f90": "Falha ao adicionar, verifique se a URL está correta", - "3d17d5b07e5aaa72a35e60707027d352": "As informações de configuração do DingTalk que você configurou não foram encontradas, adicione nas configurações", + "3d17d5b07e5aaa72a35e60707027d352": "As informações de configuração dos pregos que você configurou não foram encontradas, adicione nas configurações", "a75863f88c3c7b7cb43989b7b406a82a": "Por favor, insira os dados que você precisa enviar", - "5de6533189f891dc2a44ac945f53efce": "A verificação de complexidade de senha está desativada", - "06fae24317d8f2b5ef156f11a0fba311": "A verificação de complexidade de senha foi ativada", - "946cc3a7fae7508e3d34b4ed139ee2d8": "A autenticação de expiração de senha está desativada", + "5de6533189f891dc2a44ac945f53efce": "Verificação de complexidade de senha desativada", + "06fae24317d8f2b5ef156f11a0fba311": "Verificação de complexidade de senha foi ativada", + "946cc3a7fae7508e3d34b4ed139ee2d8": "Autenticação de expiração de senha desativada", "f00369482ba4cd8b50446356d3fad724": "O período de expiração da senha não pode ser inferior a {} dias", "501b1c01d3b31cb34cbcad5a19ae851e": "O período de expiração da senha não pode ser superior a {} dias", "db6890122bbd9e97fb8e1b117b367358": "O tempo de expiração da senha está definido para [{}] dias", @@ -1384,6 +1452,7 @@ "6c6b6e84490b34b36f33dcc8ae85fdc2": "As senhas inseridas duas vezes são inconsistentes, tente novamente!", "55f5bbcf01ad984ea402d50061609240": "A senha não pode ter menos de 5 caracteres!", "59b39458556877d386a837773736eb2d": "A senha deve ter pelo menos oito caracteres de comprimento e conter pelo menos três combinações de dígitos, letras maiúsculas, letras minúsculas e caracteres especiais", + "08423404caee54eae13add8fe145d84f": "Verificação de senha falhou!", "704372ffb884853d30e3b247765bb73a": "Os nomes de usuário inseridos duas vezes são inconsistentes, tente novamente!", "1bea42b66bb313cab948558e2d27b4e5": "O nome de usuário deve ter pelo menos 2 caracteres", "4772625698c6c1ed00afd0848fd2b57b": "A senha deve ter pelo menos 8 caracteres", @@ -1391,52 +1460,60 @@ "330080a87414678839a05adf12a4bb1d": "Falha ao criar novo usuário!", "c94d622c80e3f5af884fcccef35808b6": "Não é possível excluir o usuário padrão inicial!", "e19e85e7bd5fde471d513ef747e88021": "O nome de usuário especificado não existe!", - "7d435c8b5780fd83a10ee8f69abf04c4": "Falha na exclusão do usuário!", + "7d435c8b5780fd83a10ee8f69abf04c4": "Exclusão de usuário falhou!", "65e81e9b6c91bdde17fca09089852265": "Nenhuma alteração enviada", "c8e9c31bced80905134de34df6f67d66": "backup_number deve ser um número inteiro!", "526d961c343986a803395eb22a3accab": "backup_number deve ser maior que 0!", - "d944a195e19ea2a91eb143a4600a5fe6": "Falha ao desativar o backup automático de dados do painel!", - "cb476d0f3d678a0f1746d6d91f8c24c2": "Falha ao ativar o backup automático de dados do painel!", + "d944a195e19ea2a91eb143a4600a5fe6": "Falha ao desativar o backup automático dos dados do painel!", + "cb476d0f3d678a0f1746d6d91f8c24c2": "Falha ao ativar o backup automático dos dados do painel!", "77c1047380de3f54df74a3e84ed5ec15": "O formato de IP autorizado está incorreto, e a escrita de segmento de sub-rede não é suportada", - "52d7cd44ec88df37e528f140e2affcf4": "O tempo limite deve ser um número inteiro!", - "5ad475cca538c88655b2299588b9a091": "O tempo limite precisa estar entre 300s e 30 dias", + "52d7cd44ec88df37e528f140e2affcf4": "Tempo limite deve ser um número inteiro!", + "5ad475cca538c88655b2299588b9a091": "O tempo limite deve estar entre 300s-30dias", "7b66709539a01edb71eacc470ce7f4bc": "O domínio não pode vincular endereço ip", - "f522b971d05877c869be6f81b9eb7fe8": "Por favor, defina o IP do Servidor correto", - "716e57b0f48924438fc1209c06353fc7": "Não é possível usar o diretório crítico do sistema como diretório de backup padrão", - "17ceb8d2128aa1ce5f2f51ef5b19a809": "Não é possível usar o diretório crítico do sistema como diretório padrão do site", + "f522b971d05877c869be6f81b9eb7fe8": "Por favor, defina o IP do servidor correto", + "35e15c0be5bb51b628d96c9a520c9b01": "Porta [{}] está em uso!", + "716e57b0f48924438fc1209c06353fc7": "Não é possível usar diretório crítico do sistema como diretório de backup padrão", + "17ceb8d2128aa1ce5f2f51ef5b19a809": "Não é possível usar diretório crítico do sistema como diretório de site padrão", "e60263ac381ae4a9ad460a5c706b9b5a": "Configuração salva", + "494345d63759dcd623286d448def8778": "Ocorreu uma exceção durante a execução {}", "b1f79322ef609c5ad200c552dfbeba85": "O período de tempo limite não pode ser inferior a 300 segundos", "59bfee3685345c8facd75248b7f17a8c": "O período de tempo limite não pode ser superior a 30 dias", - "b1770445e55578871051298a4bca2ba8": "Você não pode usar o diretório de chaves como o diretório padrão para construção de sites", + "b1770445e55578871051298a4bca2ba8": "Você não pode usar o diretório de chave como o diretório padrão para construção de site", "395fa878a1482de198dd9765e03cb0df": "Entrada de Segurança não pode ter menos de 6 caracteres!", - "7030414be42829df4fa2102738ad98f8": "Esta entrada foi usada pelo painel, por favor defina outras entradas!", - "3aadff910a401b163029bd5915aea8ee": "Formato de endereço de entrada incorreto, ex: /meu_painel", + "7030414be42829df4fa2102738ad98f8": "Esta entrada foi usada pelo painel, defina outras entradas!", + "3aadff910a401b163029bd5915aea8ee": "Formato de endereço de entrada incorreto, ex. /meu_painel", "ac67b91773937f05690f0eed86ddc37c": "Limite de tamanho de upload não pode ser inferior a 2 MB", "f2c35784d83c39c7804be9817c498d97": "Por favor, preencha o valor entre 30 e 86400!", - "10951b15ad70ad91dd672b3942e85954": "Modo de operação incorreto", - "c277ef8831d8bcad68fafb826e050fe1": "Falha ao conectar ao servidor de horário!", + "fac487bbd20975aaf778e95a2ea78a85": "O arquivo de configuração PHP-FPM não existe. {}", + "7dd858aa480b572b903caa7b71000954": "O arquivo de configuração Nginx {} não existe!", + "69c86a0788cb7553486d3fe54bdc5232": "Falha ao ler o arquivo de configuração Nginx {}", + "192ae9cd563752bdd188b54231f828b6": "O arquivo de configuração Nginx {} está faltando configurações de tempo limite FastCGI, verifique!", + "10951b15ad70ad91dd672b3942e85954": "Modo de operação errado", + "c277ef8831d8bcad68fafb826e050fe1": "Falha ao conectar ao servidor de tempo!", "7d8946452a1ad712185ad106a09d83cb": "Número de dias de salvamento é ilegal!", - "4218a6e9c12f1fa453fa8e5c1b00bd44": "O formato de e-mail é ilegal", - "df6565d8975cca7ba4276300b9c38bdf": "SSL desligado,Por favor use o protocolo http para acessar o painel!", - "e99cd51a6216bc73a3e8ea8de05a54d8": "Atualize a página e tente novamente!", - "74f3d2f09425457bc7a3fd34017631c9": "Erro, não foi possível instalar automaticamente o pyOpenSSL!

Por favor, tente instalar manualmente: pip install pyOpenSSL

", - "8e4aa3a825e526915c867d103bc88064": "SSL está ativado, por favor use o protocolo https para acessar o painel!", + "4218a6e9c12f1fa453fa8e5c1b00bd44": "O formato do E-Mail é ilegal", + "df6565d8975cca7ba4276300b9c38bdf": "SSL desligado,Por favor use protocolo http para acessar o painel!", + "e99cd51a6216bc73a3e8ea8de05a54d8": "Por favor atualize a página e tente novamente!", + "74f3d2f09425457bc7a3fd34017631c9": "Erro, incapaz de instalar automaticamente pyOpenSSL!

Por favor tente instalar manualmente: pip install pyOpenSSL

", + "8e4aa3a825e526915c867d103bc88064": "SSL está ligado, por favor use protocolo https para acessar o painel!", "e47079f267dd01176afaa962dcd62358": "Notas ou endereço do painel duplicados!", - "8c7a5b3c69236d00b3577be9c91a71cc": "Informações do painel solicitadas NÃO existem!", + "8c7a5b3c69236d00b3577be9c91a71cc": "Info do painel solicitada NÃO existe!", "5b8ce0c16a86626165e93796b14d4bf6": "Erro ao ler arquivo de configuração PHP, tente reinstalar este PHP!", + "3d023dffe875ddfbc013d6052c83bf56": "Falha ao ler arquivo de configuração PHP, pode não existir: {}", "0631278069374277ff3b2cc2949940fd": "Por favor, insira o [domínio ou IP] correto!", "ac40ea6dbb38e754acea879d58701424": "{} Dia(s)", "7a3fd8f7ddf80ae2db423aa55177d22a": "{} Dia(s) {} Hora(s)", "377e7b3a05033be3164d7900c2feb2a6": "{} Hora(s)", "b2a09ec7e869bb555211fe7b26b5cf3e": "{} Hora(s) {} Minuto(s)", "9c9a5e9d306cf687381d8f1924b43b9c": "{} Minuto(s)", + "e599e181a3cc24b59e781c5a52c9da0b": "Nenhuma versão PHP instalada, não pode configurar automaticamente", "0656e1b2562955020afc339b3c9a1838": "PHP não está instalado", - "375a8ffa8b733dd5f6b069de80c57d48": "Falha ao obter versão do php!", + "375a8ffa8b733dd5f6b069de80c57d48": "Falha ao obter versão php!", "2b5266cb205519f70b1bcf7e2654982a": "Versão PHP especificada não instalada", "f54dcdd36a3b22d81acbd5358cb2a0b7": "Nome de usuário e senha de autenticação BasicAuth não podem estar vazios!", "5dc91c307ada29366c842b16a5de6913": "Limpo!", - "22ad45d745e31a8dbdb6a64f94289bbb": "A chave não existe. Por favor, ligue e tente novamente.", - "53ca2a75c705f11ff1096ffef2762084": "O nome de usuário não existe. Por favor, ligue e tente novamente.", + "22ad45d745e31a8dbdb6a64f94289bbb": "A chave não existe. Por favor ligue e tente novamente.", + "53ca2a75c705f11ff1096ffef2762084": "O nome de usuário não existe. Por favor ligue e tente novamente.", "2323ea8555972da4c7321e11488c97fe": "Por favor, insira o modo de operação", "5995c475ba8ebf9ca5a5a48623ce3df3": "Sem dados de código QR, reabra", "40e23dd18b1ba7d11eae146c3a6f0c3b": "Falha ao gerar URL de login temporário", @@ -1447,41 +1524,67 @@ "e6be2adc545cca56a638fc1b7793ebed": "O certificado de autenticação bidirecional do painel foi salvo!", "e7cf53b84401535396c856570a5bc40f": "Autenticação bidirecional do painel {} bem-sucedida!", "3400b1e0bf5f54e0230a7e272698e73b": "O arquivo de modelo não existe.", - "c9541884ca9b19170e4d300b16e9c10b": "Falha na configuração, [{}] não está instalado", + "c9541884ca9b19170e4d300b16e9c10b": "Configuração falhou, [{}] não está instalado", "ed39c2105eef1ae435e6a332bd0b716f": "[{}] foi definido como a notificação padrão.", "0b3d1848b5648a7ac08ec7425043059b": "[{}] foi removido como notificação padrão do painel.", - "67c052db394411fdf2755100c5028f94": "Falha na configuração", - "c2806eed218fbfc91e0b4f37b08ce547": "Falha ao instalar o módulo [{}]. Verifique a rede.", + "67c052db394411fdf2755100c5028f94": "Configuração falhou", + "c2806eed218fbfc91e0b4f37b08ce547": "Falha ao instalar módulo [{}]. Verifique a rede.", "4ccd9bbf79fcc60bef3a1aca5d577e85": "Módulo [{}] instalado com sucesso.", "643fb3483415124df30e40a2559a02c3": "Falha na instalação do módulo [{}].", "92013d9cfaae3995581927729dc898b8": "Desinstalação do módulo [{}] bem-sucedida", - "2eccda3dec7fa3a985668d79c718be23": "Questionário foi enviado", - "692323a652529dc1bb482078ebd98fd0": "Nenhum questionário foi enviado", + "2eccda3dec7fa3a985668d79c718be23": "Questionário enviado", + "692323a652529dc1bb482078ebd98fd0": "Nenhum questionário enviado", "7a18188353d1d06b3ab9af842dd6f0f2": "Falha ao obter questionário", - "eb010361bab3ef9e74a27fdc883b1bd5": "Erro de parâmetro questions", - "25baa40bd86bb31a5095cf5457e87f74": "O texto enviado é muito longo, ajuste e envie novamente (MÁX: 512)", + "eb010361bab3ef9e74a27fdc883b1bd5": "Erro de Parâmetro questions", + "25baa40bd86bb31a5095cf5457e87f74": "O texto enviado é muito longo, ajuste e reenvie (MÁX: 512)", "1cc5a8ad869ce7dd47987b6eb278260a": "Enviado com sucesso", - "7e4182fc0365b28328ac2ec8896f73b1": "Falha na configuração! {}", - "94e431cde2ffda2ef08526fa2af1b0b5": "Ativo definido com sucesso!", - "fe1887f5db433aa5f5b4b35e78aa2a93": "Falha ao definir ativo {}", - "bedfc521aa92e68b04430d33289c6b3c": "Na Hospedagem Multi-WebServer, apenas versões nginx 1.24 e superiores são suportadas!", - "e6c81af465e7bdf8761e0072eb217ca6": "Não é suportado pelo sistema atual", - "44164f2aee5b6836802ff8142f495629": "A verificação falhou", + "7e4182fc0365b28328ac2ec8896f73b1": "Configuração falhou! {}", + "94e431cde2ffda2ef08526fa2af1b0b5": "Ativo Definido com Sucesso!", + "fe1887f5db433aa5f5b4b35e78aa2a93": "Definição de Ativo Falhou {}", + "dd2b16eb608e5838d556598d479e9264": "Aguarde o início da restauração", + "749707db319ac2fa02785c1bdb58083b": "ERRO: arquivo de configuração sshd config não existe", + "80b695b495da54ed6a76eac8a965bc7b": "Alarme de login cancelado com sucesso", + "40d3b22b13a0b11ed727aa257e2228c0": "O canal de mensagem não está instalado", + "87597848076b873c1a9bb9ffea64950b": "Erro: arquivo de configuração sshd config não existe", + "bdb119e343438b628e7ba8b20e4632ed": "Erro: sshd config não existe", + "45de64a88b25b6527ccd3efbce76ed3b": "Erro na passagem de parâmetros", + "387e90104fbc0261c1ae5db9443f0b22": "Definir o método de login root como: {}", + "0fd775e0a957d247e199d2cd911078e8": "A senha não pode estar vazia", + "2279ae228c06ace23e59cc218f2536f8": "A senha não pode ter menos de 8 bits de comprimento", + "207d2e497f2ca0d97f1453671d4d824a": "O nome de usuário já existe", + "e1c5fbbb3782936fa209244fcc62ea7e": "A senha deve conter letras e números ou símbolos", + "4c94c49ecaebd37c52172946778fc296": "Falha na configuração", + "c601909c952f2064e91d6f3c1d1a7128": "★iniciar backup[{}]", + "890b5b1ca2b1aa96f0781c9fdc77ab88": "☆backup concluído[{}]", + "5316694cae24d434370be2d76146a500": "|-Erro:{}", + "b763e7e9f6b23d4b5066458506d26d55": "Execução da tarefa de backup falhou.", + "713660262f5ab9c3af9aa17c8d8a412c": "Backup para ", + "de5ac4bddf9b72b649c0cbd4243f76c6": "tente novamente após alguns segundos...aguarde...", + "6905a88552caae6df77f56bd19f6d76a": "Configurações de tarefa cron mantêm local. Backup local retido.", + "63701b3fa795bcd399aab5d489f8eae9": "Configurações de tarefa cron não mantêm local. Backup local não retido.", + "837cc24a222df21e74245f4cfac6ad09": "Configuração do usuário para não", + "57d4380c974a85fe8db5914c934addf4": "A tarefa agendada não existe! {}", + "038ae15d38f9f027abda2aabf18324ab": "Manter o número mais recente de backups: {} cópias para {}", + "58c65e272cfde6fc8cf73d0ffcde4bbd": "Enviando para {}, aguarde...", + "243c0f3ec002883d6fa7770957ecf9bd": "A tarefa agendada não existe!", + "78df833c741b9814545d76a83f2db9b5": "{} Banco de dados de backup {} não existe", + "472f0ed974a6a2aec9b70fe7d39b27ee": "MongoDB ativou autenticação de segurança. ", "ee6cb8cccfef01a6931ac569767b7303": "banco de dados local foi instalado", "65d7c486a72e5ad1b6bd2efb8956f3f6": "Falha ao editar: {}", "f62e45c2a8ed2cfcfd94370111f2a7b3": "Um banco de dados com o mesmo nome já existe: [{}]", - "c0845b39485db26e69520bd402a139b7": "Banco de dados [{}] já está na lixeira, recupere da lixeira!", + "c0845b39485db26e69520bd402a139b7": "Banco de dados [{}] já na lixeira, recupere da lixeira!", "4660d7ac939f0ce64023bd24bc25b663": "O nome do banco de dados não pode ter mais de 16 caracteres", "299cf735a7b842c5bc2eaedf2e266387": "O nome do banco de dados não pode conter caracteres especiais", "d1e3ea8b4d692d87d876428f0cf476c4": "O nome do banco de dados é ilegal", - "32e1edf20dad771b315ddb3da35bacd3": "O banco de dados especificado já existe no MySQL, por favor mude o nome!", - "54fac16736efc268ae61cc17bf80dcef": "Falha na conexão com o banco de dados remoto [{}]", + "32e1edf20dad771b315ddb3da35bacd3": "O banco de dados especificado já existe no MySQL, mude o nome!", + "54fac16736efc268ae61cc17bf80dcef": "Falha na conexão com Banco de Dados Remoto [{}]", "ad62ead53c1f43865593805aab80df4b": "Falha ao modificar : {}", - "d3a51b64fa563dfcd901485db4cf5777": "A senha do banco de dados [{}] não pode estar vazia", + "d3a51b64fa563dfcd901485db4cf5777": "Senha do Banco de Dados [{}] não pode estar vazia", "157aebc66e02126c7568365a18392758": "A senha do banco de dados não pode conter caracteres chineses {}", "480b606c09fb9d52b9e47995e04641de": "banco de dados não encontrado!", "f730258407ac8fda3c780e7c59a09f16": "Senha modificada com sucesso para o banco de dados [{}]!", - "36856cc0aff5e4d792ab1919ec9e24f9": "Backup do banco de dados [{}] bem-sucedido!", + "36856cc0aff5e4d792ab1919ec9e24f9": "Backup do banco de dados [{}] com sucesso!", + "d0a3141dec105a6fd820524ae77b928c": "Não há tarefas de backup por enquanto !", "cd338377817d5286c26f62c0562ebe72": "Banco de dados [{}] importado com sucesso", "4461199265eb82e1de46055d7f4568b6": "Backup Bem-sucedido", "ecc5e49aaee7ba7dc9a1b1b89e008c13": "Selecione arquivo sql/gz/zip", @@ -1489,35 +1592,162 @@ "c811067e114e07cbb188afd110ddc579": "Sincronizar {} banco(s) de dados do servidor!", "a47891f08609cb38f4de9fd50def4650": "Obter {} banco(s) de dados do servidor!", "8aec4a4bd998059f3dbb932da4714b00": "IP não encontrado!", - "a62053a8ff838da8ba33aae82d8fda5b": "Erro de conexão com o banco de dados!", - "65a61bd2b3c632fd1d27b19db5abf197": "A senha do banco de dados MySQL expira", + "a62053a8ff838da8ba3aae82d8fda5b": "Erro de conexão com banco de dados!", + "65a61bd2b3c632fd1d27b19db5abf197": "Senha do banco de dados MySQL expirada", "dfcaac01b569325ec535229328d52f6d": "Erro de consulta ao banco de dados!", - "efc33dbd7910fde6ce3fe364a7d43bfc": "O arquivo de configuração rsyslog não existe!\\nVerifique se o rsyslog está instalado ou se /etc/rsyslog.cn existe!\\nSe o sistema debian não estiver instalado, execute:apt-get install rsyslog\\nPara sistema Centos execute:yum install rsyslog", + "66924214c228f7eb631ac940281c7190": "Configuração bem-sucedida", + "d55e6e0c13df775ea0eabea4f36ff8da": "Por favor, habilite pelo menos um comando e firewall", + "322d678e45d68284d90503f36da32648": "A operação foi executada", + "26eaf477d247c668a143b415491995dd": "Seu endereço IP atual [{}] não está na lista branca.", + "c26b7075352954fb3e96fbe983dbd083": "Seu endereço IP atual [{}] está na lista branca.", + "f9cfac18ac1fe92adcc47b139d0617a8": "Adição falhou", + "bf31291dfc89be9a8af12c3fa15e7e4d": "Operação executada", + "71a1c5f19c8e300d350f5f68c71e4559": "Exclusão falhou", + "01f144a7cfd324d0dab94f8aa6e29374": "Excluído com sucesso", + "e6c81af465e7bdf8761e0072eb217ca6": "Não é suportado pelo sistema atual", + "44164f2aee5b6836802ff8142f495629": "A varredura falhou", + "a499f309ac7a223d611d7a0a85900342": "Nenhum registro de reinicialização encontrado.", + "d23fb11ea541cd5f1c0b05851d54fd58": "Marcado como lido.", + "e9a08443260e6f3b795eb57419a6ad77": "Falha ao vincular ao armazenamento em nuvem!", + "efc33dbd7910fde6ce3fe364a7d43bfc": "O arquivo de configuração rsyslog não existe!\\nVerifique se o rsyslog está instalado ou se /ect/rsyslog.cn existe!\\nSe o sistema debian não estiver instalado, execute:apt-get install rsyslog\\nPor favor execute o sistema Centos:yum install rsyslog", "a6fba111c7d0f418059856c4160b4d0d": "O parâmetro está incorreto!", - "3f8ee4f649b32e181c15c39682629844": "Usuário [{}] existe!", - "b23886f3380c4a9500a7614474ff6bf8": "A senha deve ter pelo menos [{}] caracteres", - "f20eaf62a87c2072f7c09ec70a6b90c9": "Erro de exclusão", - "49b236322476b6e7baf65369b4b61565": "ERRO_DE_EXCLUSÃO", - "9607dbc43fb07121ebd102497290c15b": "{} usuário FTP falhou!", - "8b73e5696a44d470ee99c274152c1b54": "A porta[{}] está em uso!", - "384169bf557e2785a74c6ab4c8ca0d9c": "Erro de edição", - "e420cebff3e23fb8eedd388024ce1839": "Formato de URL de destino incorreto {}", - "62dc2bbb0528fe87522c74b113883a48": "O site especificado não existe!", - "4675bfcf662ee236a05dcb763cf9d520": "A configuração de cache do Apache falhou. Por favor, verifique se o site está funcionando corretamente!", - "0b9aca52d360d6f7a8f2c5c897c93005": "As configurações de cache do Apache foram bem-sucedidas!", - "a2cd28fcd32e92be995b2335768fdea3": "O cache do Apache é atualmente suportado apenas em Hospedagem Multi-WebServer", - "b288b8637582cc38c1d4c902ed03cbec": "A instalação do plugin de cache falhou", - "aebabb72ad41fbe46f73abcc9dc00b9f": "Falha ao ativar o plugin de cache. Tente ativá-lo manualmente e, em seguida, habilitar o cache", - "3981bd44ca3f1d5abafc6b15ba8c7435": "As configurações de cache OLS foram bem-sucedidas!", - "3777f748e5535e7e38261b2e0afc8274": "Falha na configuração de cache OLS: {}", - "93916600bce5b19586cbf51d558b5d78": "Verifique se o formato [{}] está correto Por exemplo: {}", - "8e342838d5cf3a93e34956c9550db4d0": "Falha na implantação: {}", - "0dbd3323f74314d1cf85c7db5ac2fd1d": "A versão atual do navegador IE é muito antiga para exibir alguns recursos, use outro navegador. Ou, se você usar um navegador desenvolvido por uma empresa chinesa, mude para o Modo Extremo!", - "47b1cbb355da8faa6415f12c96469ba1": "20 falhas consecutivas de verificação, proibido por 1 hora", - "dd1ddef2d75c7c80540db8c12270af8a": "O parâmetro passado não é um objeto interno universal", + "c77d5ef44d6a21abe99c3e370a0f5364": "erro de parâmetro: coupon_id", + "1cb4143e9dbb7515e606ab6854578a00": "erro de parâmetro: cycle_unit", + "2121d979fb82aae9f0a62572bf36217f": "Solicitação de interface falhou ({})!", + "287e14ef978fb00ce99942e799c36649": "Parâmetro limit_time ausente ou parâmetro não pode estar vazio!", + "8feb15ff2883086bba98d9d791d10bf7": "O tempo não pode ser menor que o tempo atual!", + "e420cebff3e23fb8eedd388024ce1839": "Formato de URL de destino errado {}", + "4943a6954b9887aa5989713fcbb2a0d1": "ERRO: Incapaz de conectar ao servidor {}, verifique se a configuração [AK/SK/Armazenamento] está correta!", + "da10c98ffbf34b30edec9cf47d998a68": "Aplicação bem-sucedida!", + "24380483226504475d196fdcff7a6c77": "Falha ao conectar servidor! -1", + "353d91a7655b3ef5e024d07eef1888ab": "Falha ao conectar servidor! -2", + "340c4a30e533798f76f8deba605ff6c4": "Erro de parâmetro!", + "f98c446d194c4fbb566c3becc91255e1": "Versão deve ser numérica!", + "75809e3b321efe1afbdf9773494d5dd9": "Não encontrou o arquivo de configuração {}, tente fechar as configurações de porta ssl antes de abrir", + "7d7014331b485392e1d6055aad5c26cd": "Não encontrou o arquivo de configuração nginx phpmyadmin ssl, tente fechar as configurações de porta ssl antes de abrir", + "f471efd0f135fbddafdce4ad1febf5bb": "O servidor web atual é openlitespeed. ", + "4a32aac45fa22d0c693a646d5e265bf1": "O certificado do painel não existe. ", + "c6b59c5c3d29862a6dc85e9375094c83": "O servidor web atual é local e de acesso privado.", + "056197513cf8b469874e09b037fa5aaf": "O servidor web atual não é suportado.", + "e15ac24f41e856e08e494f9d2ab51af0": "Há um erro na configuração do phpMyAdmin.", + "7ec0387d04c7d7c8259b497464fa3282": "phpMyAdmin já {}!", + "4790f238a5706fa03ed78c98efabd5f2": "Vinculação é válida!", + "0dbd3323f74314d1cf85c7db5ac2fd1d": "A versão atual do navegador IE é muito baixa para exibir alguns recursos, use outro navegador. Ou se você usa um navegador desenvolvido por uma empresa chinesa, mude para o Modo Extremo!", + "47b1cbb355da8faa6415f12c96469ba1": "20 falhas de verificação consecutivas, proibido por 1 hora", + "492478fa7955b2282528aefe56d42ec4": "Perfil não existe!", + "71804f43c7fe50a625e9fd1f930365ce": "Falha ao obter da nuvem!", + "46fb7ccd0be31ec840d524d8f99f1368": "Atualização concluída!", + "d631f73db41ac42021c522b61fba3274": "Não é necessário atualizar!", + "11ce17a8cf1f195a0687c00fc4201d2f": "Importação Sucesso!", + "d49c4e6f0a63eb94dfb921be5d804e8b": "Site não existe!", + "0b5efcfb8a290faab14ebce65ece59e7": "Diretório raiz do site perigoso!", + "d747c3e10f8c5fd5c0aec8b422883292": "O pacote especificado não existe.!", + "22e806afb25ddcb6cf205be320eb2350": "Não foi possível encontrar [Arquivo de Configuração de Implantação Automática aaPanel] no pacote de instalação", + "7658d0092e96ef38859c12f2a91f641f": "Não há tarefas de implantação no momento!", + "b404834ec20850fd1de15f52dc43cb06": "Falha ao conectar ao repositório remoto. Certifique-se de que a chave esteja configurada corretamente!", + "152b976545ff1ee50e0de21da7af1266": "Verificação em andamento.....", + "e6a6fa2d0bcc8bfc2af5bcd4640ade03": "Verificação de parâmetro", + "80f9a0a476836be5fdec10fe414e88a9": "{} O site está sendo criado....", + "064aa7114f7c7430dcf2b0cdc05ad20c": "Criar site", + "38cb441d840ed6579ca6f1f876de2b61": "Adicionar configurações opcionais: Banco de dados, FTP", + "b7575e63439333749c6e7d6a27b8a0e4": "Adicionar configurações opcionais", + "d0977de06e41fbd31702d7ddba64c3da": "O site wordpress está sendo implantado....", + "a2bc816cd7abf7b134e56b39edae6fda": "Implantar wordpress", + "2a5e8b7e4116ee81db89ba173f60bf90": "Verificação de parâmetro falhou", + "2f35a151cc0256f0d9ad5410eccbe5d0": "Verificação de parâmetro falhou: {}", + "af2a8e2174ea327f9fbf77d84029d58b": "Verificação de parâmetro bem-sucedida", + "181fc26e7b655ba36b3b075ca1ebc350": "Falha ao criar o site", + "7118aff13541bf3d74a9c47fb458e102": "Falha ao criar o site: {}", + "be33773093fc2e135ba4bc26f4bb5509": "O site foi criado com sucesso", + "7e8ca7bb5dd0e69e0cd0d0e66832e2cd": "Criação de banco de dados falhou. Verifique o status de execução do mysql e tente novamente. {}", + "8d823a9933eefd02bf1003481f816f64": "Falhou: {}", + "505a83f220c02df2f85c3810cd9ceb38": "Sucesso", + "b0b4a6c23347406736732380f3798be4": "inicialização do wordpress falhou", + "e7b3deb11aabca0f7ae217ccccd10772": "Inicialização bem-sucedida!", + "31b88b436695f7e0bc5dad1cb8999737": "Não use as portas do serviço do painel!", + "d0d4ff47e6dc25f0069a1d74d2f995b4": "A porta está ocupada ou o intervalo de portas está incorreto! Deve estar entre 100 e 65535", + "7dde7f2ae7cb4ed56b1b683b479ad303": "Aviso: versão {} ainda não foi instalada, ", + "839067817c5a1e7fcce2f905284d630e": "Diretório de origem de reescrita e diretório de destino de reescrita devem ser preenchidos ao mesmo tempo", + "4b6ad864ce62dac8466dde7ec62e7ea9": "Diretório de origem de reescrita e diretório de destino de reescrita não podem ser os mesmos", + "ed6fe3e47d3686c7af83b67535b426b5": "Diretório de origem de reescrita deve começar com /", + "8230eb6af0c1c2863c0c2f6bfaa9b37e": "Diretório de destino de reescrita deve começar com /", + "e718ce7b8a5d4b41b3c129b477323bb2": "Falha ao ler arquivo de configuração Nginx", + "fa5e4af74d3d68ba371e6dcf84595c3d": "O site não existe", + "45f9a99535dea651b8f160f6cf23f826": "Leitura do arquivo de configuração falhou!", + "cfecbb41158d2f815c4a0b820108aeaf": "A análise do arquivo de configuração falhou. Verifique se a configuração está correta.", + "5e3b84200bea6d70f6fed1d5802a7fa0": "Consulta falhou, endereço não existe", + "5fa721871e93bc4121df74ce51454519": "Ativação do plugin falhou, tente novamente mais tarde.", + "9f139adb77c26c263ff2a956d66f80fe": "Desativação do plugin falhou, tente novamente mais tarde.", + "5abebd9b1d5ca579c051e1094ab375cf": "O pacote de tema já existe!", + "e35ca748f8c5a0e78731bae94fb7d68a": "Falha ao remover Conjuntos", + "468baaa7179c8b181d1de35fa00267e9": "Tipo inválido de itens de Conjunto", + "a01e808b2be07634b0e3714bff919ae1": "Falha ao remover itens do Conjunto", + "35c9b2817b191a3f60553d46b748068b": "Falha ao mudar estado dos itens do Conjunto", + "87a9a388a3ef42018ceb866756c4ee39": "Conexão com banco de dados falhou, verifique o status do banco de dados!", + "73b1d7767613c6300db27ade773369fa": "Falha ao remover site wordpress remoto", + "a75c113f53d4342010d140325fa29eec": "O multi-serviço do site foi ativado. ", + "b0a517b4d596e5fc1351f8dc12e73a74": "Por favor, selecione o serviço retido", + "7e953c855b391ac0716a4eeb47c5c5c3": "Por favor, habilite múltiplos serviços primeiro", + "55d523aa501b0e7e93e172a9e6829a8a": "Erro ao obter informações da versão nginx", + "08f18bb6c6293307f68d5f822ed7dbe1": "Atualmente, openresty não é suportado", + "45020a62e40bbb43f6e05c62ad50288e": "Já existe uma tarefa de instalação. Aguarde a conclusão primeiro!", + "4052df86d5a8dd12943cc8b1d53162e4": "Instalação do serviço falhou. Tente novamente!", + "8033c09e6fedf841205b29b57c0ae0d1": "Inicialização do serviço falhou: {}", + "442d02a722dc331f8b85d328fb99a174": "O modo multi-serviço foi ativado com sucesso", + "a0b289e4caa220dcd62692401d5083f5": "Falha ao desinstalar serviço {}. Tente novamente!", + "0045406cf97cbdca708c795aa9554145": "O serviço {} falhou ao reiniciar. Tente reiniciar manualmente ou verifique o arquivo de configuração.", + "52cd203105425f66daf42d81f05c540f": "O modo multi-serviço foi desativado com sucesso", + "9c116a9cbc0701ec9e9d6b6ab2755fc8": "O serviço falhou ao reiniciar. Verifique o arquivo de configuração do apache!", + "a949ed64edc73a99f9f9c801a84b6390": "O tipo de serviço especificado não existe", + "408f206d494c5f26144f7492315dfa21": "Ocorreu um erro ao alternar serviços em lote!", + "e9fd26be1a67520e66f2e99d61977c32": "ID do site não existe", + "d80972d5dfb46c1f11b8dba2b7aa04d3": "O serviço de site atual já é {}", + "99914b932bd37a50b983c5e7c90ae93b": "{}", + "2422c065bd4ef8d950bbf17c43f907dc": "A modificação da configuração falhou.", + "98e762d03fc5ffcb381010aff10c7bde": "Alternado com sucesso para {}", + "293f667205bd8aa91c72f966c03c3de5": "O tipo de serviço de site obtido está incorreto", + "8562d96fc303411ee017a30b83d75712": "Reparado com sucesso", + "d9d76120c8c13b40d2e8e49b0d6117da": "Ocorreu um erro no multi-serviço e o reparo falhou. Tente fechar o multi-serviço e reabri-lo!:{}", + "c8622023712105e9e7328396976a2667": "O arquivo de configuração de backup não existe: {}", + "d81f83ae44da0682974272b976e8e550": "Recuperação bem-sucedida", + "12572c9827392d4bd4c028881ed06242": "Existem conflitos de proxy global ou reescrita de url no site. Exclua e tente novamente!", + "92bce01ab77d0d50efec1d424cab583b": "Este site tem um proxy reverso. Exclua e tente novamente!", + "30c74a0981da2edec86936cd288479f7": "O site configurou um proxy reverso global. Cancele primeiro!", + "c3fe8f7adf26d613d9593acede34303b": "O site está configurado com vinculação de nome de domínio de subdiretório. Cancele primeiro!", + "26b15536eb5ad2d4c9c8d2b964ba175b": "Ocorreu um erro ao analisar o arquivo de configuração {}. Verifique se o formato está normal.", + "69d02d928b14a9c948c2b11955071b64": "Configurações CDN suportam apenas modo nginx!", + "da643dc091537f1db50480faba8f32ec": "O sucesso geral do site", + "e162577ca7feeab927137eaff9a9895c": "Cabeçalho CDN não pode estar vazio!", + "ef99e1222fa88fac33b622a1083b0dc4": "O cabeçalho da solicitação não pode conter espaços", + "1caa7a57a628cfd5aace9db67697efa0": "O arquivo de configuração nginx não existe", + "3a0c73aeadcfa1a6a548fb68fe4cd83d": "Há um erro no arquivo de configuração. Verifique!", + "bedfc521aa92e68b04430d33289c6b3c": "Em Hospedagem Multi-Servidor Web, apenas versões nginx 1.24 e superiores são suportadas!", + "75242ba6bf8096739ee8274c30658e46": "O nome do arquivo contém caracteres ilegais", + "25a4bafb86b96174698461c8ea8f1a6d": "Nome do arquivo não pode estar vazio", + "f2ae8a2dbe55304c1cd4ce000143d868": "Caminho do arquivo não pode estar vazio", + "9277b5ccc09173ca1596107809de89fc": "Se o caminho de destino já tiver um diretório com o mesmo nome, altere o nome do arquivo", + "fe56b3a6f3a8b6a24f60a62408351b0e": "Este é o diretório da lixeira, pressione o botão [Reciclar] no canto superior direito para abrir", + "8ec1fba8a89cb67bc958d7b2424156e9": "Arquivo movido para a lixeira", + "99a091a444e6e207f60506fb4f0bdcce": "Arquivo excluído com sucesso", + "06769a815392464e2095dd3aee30ab60": "Se a pasta falhar ao ser copiada, verifique se o diretório está bloqueado ou se a proteção contra adulteração está ativada", + "dc1aa8bc00246f2357576c2c04e74728": "O diretório atual é somente leitura", + "d10fab43227e65d40f86bbdc947c8092": "Cópia da pasta falhou:{}", + "5992e9701e2496a26893b7f11d350418": "Parâmetros estão faltando! caminho", + "f94b62cff0c45cb08b61da3ca2615d72": "O arquivo não existe", + "f44751d36b8c0672bc68bb2fa57c1069": "O parâmetro filename está faltando", + "2bfac17a1e400b07b888e0435034d6a5": "Parâmetro history faltando", + "70cfa9e1ffa7477cf00bd39d0dd4facd": "O arquivo não existe!", + "b441db7060ad3a732e49045679b2b1ae": "O arquivo especificado não existe!", + "3900f94dba983d245fd2e264d4398914": "Não tem permissões suficientes para manipular arquivos ou diretórios!", + "8a8b016e2f55506d3d7f8a86c4e2a118": "Falha ao restaurar cópia histórica!", + "5873103908815f34241636e336e1f463": "A tarefa de compactação foi adicionada à fila de mensagens!", + "e57b7bae408dd226fabe86773cd6b3c3": "Operação em lote bem-sucedida [{}], falhou [{}]", + "c28802f8d7f5a40cb9f17cace202e59f": "Erro de consulta, {}", + "11c99562b6212de14ddf1dcb06ea1696": "Sem tarefas na FILA {}", + "94f33212bde1cd76797fe4fe78b2167f": "Atualizar composer de {} para {}", "e7e807310035d5b348cbf55c28df2968": "Obter RAM do worker Falso", - "dc2e22fb7940c00998017d342198a9e2": "Obter Uptime do worker Falso", - "f5332a2b815ca2e09f3e658e8c81a282": "Obter Tempo de Reinício do worker Falso", + "dc2e22fb7940c00998017d342198a9e2": "Obter Tempo de Atividade do worker Falso", + "f5332a2b815ca2e09f3e658e8c81a282": "Obter Tempo de Reinicialização do worker Falso", "2d052af48937c6a8916f84a9a5d2a5e1": "Obter data do worker Falso", "6880f4164c935867cecf3a89e8ac01ce": "Obter detalhes de tempo do worker Falso", "a3589163c43210f6d8f52f6a2d46823f": "Obter reqpersec do worker Falso", @@ -1525,230 +1755,44 @@ "d1448a41deace3e0a5cb3555cee67b97": "Obter TotalKBytes do worker Falso", "1bdd788c6927c1fd0420ca6e2316642e": "Obter BusyWorkers do worker Falso", "f656a1e1c80cdf1eb1c63d3a0b121a65": "Obter IdleWorkers do worker Falso", - "dd2b16eb608e5838d556598d479e9264": "Aguarde o início da restauração", - "9bb70ddd7b082fbaafb0b47a989b5cf5": "Falha ao obter fuso horário!", - "38f40438a6c7e12eca9b4ea2ad297b3e": "Definido para o topo com sucesso!", - "257ee5f5c18f04e3a83fd18b33babf08": "Por favor, insira o ID desafixado!", - "c6afe11bc7f565bb0a423883101ce67f": "Consulta falhou: ", - "403470819fb903a95a8fd9a22b01a3ee": "CRONTAB_MES", - "7207ebce07676b20d98ec74a0ff65c77": "Executar uma vez por dia às {}:{}", - "4f4ae97ac3a0f45ef67bda70d5e4fe0b": "Executar uma vez a cada {} dias às {}:{}", - "82dccd8eb88a5611e453cbf6f25fa90f": "Executar uma vez a cada {} minuto da hora", - "a84b2e49920d839395e3f93812f9ac03": "Começando às 0:00 todos os dias, executar a cada {} minuto de {} horas", - "41924db412ce09aa5ef5c9f1f9c88ee8": "Começando do minuto 0 de cada hora, executar a cada {} minutos", - "45abd276fba3519ea010cb5b3c44a484": "Executar uma vez a cada {} em {}:{}", - "06ce21d9c603152315f749e19fab3148": "Executar uma vez às {}:{} do dia {} de cada mês", - "f2fc5ae4c94a95a754c58b15197bc135": "Executar a cada {} segundos", - "eb8cb9c97e5888beefc46d6c0645ff4f": "Inicializar e executar uma vez", - "7b9732c358c4e407030aca56ccb7a72b": "Nenhum dado foi encontrado para a tarefa agendada correspondente. Atualize a página para verificar se a tarefa agendada existe!", - "b55a6e4ebb6e988c6d46840ca6cc3315": "Não foi possível gravar no arquivo, verifique se o fortalecimento do sistema está ativado!", - "fff2eb19d097654514fc97c4a6e6d233": "tarefas crontab", - "64e1288887b58a1c65d05676f7197477": "Modificar o status da tarefa agendada [", - "ef1a7595dfa94a12b47bb18d3ac94313": "A tarefa agendada com este ID não existe", - "1844e0f52715901c376dca67e5742aa9": "Falha ao gravar tarefa agendada, verifique se o disco é gravável ou se o fortalecimento do sistema está ativado!", - "5a7b17945b660284bb813be218c04c71": "{} Falha na configuração", - "5e7205744bd38904dcbc7c0b77456fc7": "Excluir {}", - "140fb31d1756ae3c75b297f0c17f8b24": "O nome da categoria não pode conter instruções HTML", - "e5e2e32bece629fcba864f7f5e8df60f": "CRONTAB_NOMETAREFA_VAZIO", - "f3b898619b284003475f2039ce53968c": "Tarefa planejada modificada com sucesso [", - "72a21489a541757ee98b54790e5f431f": "Modificado com sucesso", - "92f1227778f186dd8c5f6cae42f5285a": "Tarefa agendada adicionada com sucesso [", - "e55c44fbd41784b7731f71e2789cad65": "ADICIONADO_SUCESSO", - "5a3c3438dbcadf4a0d59858f17a8522f": "Logs de tarefa estão vazios!", - "e8ab4d6107eaf37c98f250be20f146e1": "Logs de tarefa esvaziados!", - "a0d347c48839cab209fa3827c667a5c8": "Excluir tarefas agendadas", - "46039515107ea576bdaf75935b8b5f0d": "Excluir tarefas agendadas: {}", - "a3c72de16808f111cbe7e4c6dacc401b": "EXCLUIDO_SUCESSO", - "d5925f01eeb5596fed21f5dae6ffed30": "CRONTAB_TAREFA_EXEC", - "72bf657fef1eeafa1c8ecde5e4c06405": "Falha na execução da tarefa! Nenhum registro de tarefa correspondente encontrado.", - "8804f9a6882b09397bbc0599ba59b7ca": "Falha na execução da tarefa! O ", - "e9ca7bae70907408382135107fb85a13": "Download falhou!", - "272892ac18608e0a1ad6bf080afd2e51": "Limpo com sucesso!", - "06511118622e143af60d10d0877c9a3d": "Falha na limpeza!", - "424a90061acbe105658b97a0d86a4de2": "Por favor, insira o nome do arquivo!", - "14854122a7fb5958664a8d840dc0bead": "Por favor, instale o armazenamento webdav primeiro!", - "a027ff0717f56bf016b2f023d92e0c32": "Nenhum arquivo correspondente encontrado, faça o download manualmente do armazenamento em nuvem", - "f7314eff61e017245b088eecfee0c418": "Objeto de armazenamento em nuvem não inicializado corretamente!", - "a09c248c44ca9548bce41bc3e79b400d": "O arquivo não foi encontrado no armazenamento em nuvem!", - "9b23d05e4cb1d3ee22dd3dd7212817ab": "O nome da classificação não pode estar vazio", - "fade4a03622ee745aaf87044d697203f": "O comprimento do nome da categoria não pode exceder 16 dígitos", - "c875cf8f63d81c7fb198018d5c4bfa79": "O nome da categoria especificada já existe", - "f66442d89b8c613c082425a93b417695": "A categoria especificada não existe", - "caf573e6b4299b7f60e24635b0295e9d": "Categoria excluída", - "9133e7faf0b9fc202294e495163b1ced": "O nome não pode ser alterado para o nome de classificação de tarefa padrão do sistema", - "a3ee2a93b0a298de033ca1b784f62f04": "Não pode ser definido como classificação do sistema ou classificação padrão!", - "f300a6ee81c71057acc7beecdaf472c7": "Configuração bem-sucedida!", - "290435bc045f16e4d099d721b7f706c3": "Falha na configuração", - "8d49c76279564d3127e45cae01976d37": "/tmp/cron_task_data.json", - "d7ee2f4d054a35aab002985b80644f24": "Falha na exportação:", - "1cd20eabfaa5ad5793b4075f976bf475": "Não foi possível analisar o arquivo JSON!", - "205904d76b14dbdb456fc2a2997ba5b1": "O formato do conteúdo do arquivo JSON está incorreto!", - "f63f66d08d61a3b16c11e0dfce9510e1": "Importado com sucesso {} tarefas agendadas", - "414522bb8a68d31211190865a1cefdd0": "Por favor, escolha importar o arquivo!", - "8342696568c9b58f16cf29e2492cddea": "Falha na importação! {0}", - "51b34794854788b7e5eb8c3a8fab0242": "Por favor, passe o parâmetro de tempo!", - "860f363ecfcf11c8740b9068152b910c": "Desligamento temporário e fortalecimento do sistema bem-sucedidos!", - "acbe969acf9b4925e963f102f3430f84": "Falha no desligamento temporário do fortalecimento do sistema!", - "14a7c9c4ed221e7b3234de80bb8b9ef9": "Corte de log ativado com sucesso", - "15af2c7a6a5766d84ad8c57c5d2fb0dc": "Corte de log fechado com sucesso", - "636cccf0b373acec35770f9f26710396": "Falha ao ativar corte de log", - "bd6df8255e394034ebcf93fcebfe06d3": "Aquisição falhou:", - "90a80c8e64ee80e8577c44699b6faa7b": "Falha ao criar tarefa agendada {}, verifique se o fortalecimento do sistema está ativado ou a condição do disco", - "796b4f2a019427bc554ef1166faad8aa": "Fechar com sucesso", - "f222f6f9531a00476e39863b53bcde07": "Falha ao abrir", - "52d812a7c0b57b35fac4e668122191a3": "Falha na execução do script", - "f804ceef9dd122e198f13357be514e41": "Backup Automático de Banco de Dados [TODOS]--mysql", - "26e64121956b9e7e55244a508f146864": "Backup Automático de Site [TODOS]", - "a499f309ac7a223d611d7a0a85900342": "Nenhum registro de reinicialização encontrado.", - "d23fb11ea541cd5f1c0b05851d54fd58": "Marcado como lido.", - "c77d5ef44d6a21abe99c3e370a0f5364": "erro de parâmetro: coupon_id", - "1cb4143e9dbb7515e606ab6854578a00": "erro de parâmetro: cycle_unit", - "2121d979fb82aae9f0a62572bf36217f": "Falha na solicitação de interface ({})!", - "287e14ef978fb00ce99942e799c36649": "Parâmetro limit_time ausente ou parâmetro não pode estar vazio!", - "8feb15ff2883086bba98d9d791d10bf7": "O tempo não pode ser menor que o tempo atual!", + "f5fa57ce44938aa510e6cb68bd52c24b": "Sem arquivo de log", + "1bb87a5feb9e217c858933afdce8f4e7": "O arquivo de log é muito grande!", + "21290da79237752afe963ecef5d89b5a": "Início da varredura bem-sucedido", + "8e0e316031928c8c96c94ad6d57bd03e": "O diretório não foi varrido", + "9208374e1391bb886971bad99b2380f1": "Tipo incompatível", + "580d97d0b321127650cf1901cc3524b2": "Registro não existe", "b4e82db400aed46c6a1d61b93ff20f0f": "Falha na conexão: {}", "aa40ceff8d69dc0bf2a3887e2d5c778c": "Falha na conexão: {} {}", "69ee350f3262c97f7e3f35cc66443942": "O módulo paramiko não existe e a instalação falhou!", "d580ca3289757bd32c3e11df44ccea78": "Senha ou chave privada não podem estar ambas vazias: {}:{}", - "dfdc7c6d010fa7d486ab5c61159450f": "Tempo limite de autenticação esgotado, pressione enter para tentar novamente!{}", + "df9dc7c6d010fa7d486ab5c61159450f": "Tempo limite de autenticação, pressione enter para tentar novamente!{}", "05d673d467b6e721ff5ee92b285e5072": "A verificação da chave privada falhou, a chave privada pode estar incorreta ou o tipo de autenticação de chave privada ssh-dss pode não estar ativado no arquivo de configuração /etc/ssh/sshd_config", - "cae18886e1496f99e56fe64dae2a0947": "Falha na autenticação, verifique se a chave privada está correta: {}", - "7e850998d3cb8c4dc8b204766721e846": "Conta ou Senha incorreta: {}", - "dfd29171bd018b7352abb2cf085404fd": "Nome de usuário ou Senha incorretos: {}", + "cae18886e1496f99e56fe64dae2a0947": "Autenticação falhou, verifique se a chave privada está correta: {}", + "dfd29171bd018b7352abb2cf085404fd": "Nome de usuário ou senha incorretos: {}", "8a857e7b7b8835de19ffb7404445b30f": "Tipo de autenticação não suportado: {}", + "1fe35be7f4e10cbb7f972445cc8209fa": "Conexão bem-sucedida! {}", "8f4a5b1853e2c68682303a3ac016e97b": "A importação foi bem-sucedida", "bb07cf4e0082f6181204bf785e625924": "A importação falhou", "4e19c797e19c111b1fad1470cc2c18e3": "Não há comandos exportáveis", "bd35e8b82c9450d88a62a318773a2244": "A exportação falhou", - "e9a08443260e6f3b795eb57419a6ad77": "Falha ao vincular ao armazenamento em nuvem!", - "66924214c228f7eb631ac940281c7190": "Configuração bem-sucedida", - "d55e6e0c13df775ea0eabea4f36ff8da": "Por favor, ative pelo menos um comando e firewall", - "322d678e45d68284d90503f36da32648": "A operação foi executada", - "26eaf477d247c668a143b415491995dd": "Seu endereço IP atual [{}] não está na lista branca.", - "c26b7075352954fb3e96fbe983dbd083": "Seu endereço IP atual [{}] está na lista branca.", - "f9cfac18ac1fe92adcc47b139d0617a8": "Falha ao adicionar", - "bf31291dfc89be9a8af12c3fa15e7e4d": "Operação executada", - "71a1c5f19c8e300d350f5f68c71e4559": "Falha na exclusão", - "01f144a7cfd324d0dab94f8aa6e29374": "Excluído com sucesso", - "749707db319ac2fa02785c1bdb58083b": "ERRO: arquivo de configuração sshd config não existe", - "80b695b495da54ed6a76eac8a965bc7b": "Alarme de login cancelado com sucesso", - "40d3b22b13a0b11ed727aa257e2228c0": "O canal de mensagem não está instalado", - "87597848076b873c1a9bb9ffea64950b": "Erro: arquivo de configuração sshd config não existe", - "bdb119e343438b628e7ba8b20e4632ed": "Erro: sshd config não existe", - "45de64a88b25b6527ccd3efbce76ed3b": "Erro de passagem de parâmetro", - "387e90104fbc0261c1ae5db9443f0b22": "Definir o método de login root como: {}", - "0fd775e0a957d247e199d2cd911078e8": "A senha não pode estar vazia", - "2279ae228c06ace23e59cc218f2536f8": "A senha não pode ter menos de 8 bits", - "207d2e497f2ca0d97f1453671d4d824a": "O nome de usuário já existe", - "e1c5fbbb3782936fa209244fcc62ea7e": "A senha deve conter letras e números ou símbolos", - "4c94c49ecaebd37c52172946778fc296": "Falha na configuração", - "492478fa7955b2282528aefe56d42ec4": "Perfil não existe!", - "71804f43c7fe50a625e9fd1f930365ce": "Falha ao obter da nuvem!", - "46fb7ccd0be31ec840d524d8f99f1368": "Atualização concluída!", - "d631f73db41ac42021c522b61fba3274": "Não há necessidade de atualizar!", - "11ce17a8cf1f195a0687c00fc4201d2f": "Importação bem-sucedida!", - "d49c4e6f0a63eb94dfb921be5d804e8b": "Site não existe!", - "0b5efcfb8a290faab14ebce65ece59e7": "Diretório raiz do site perigoso!", - "d747c3e10f8c5fd5c0aec8b422883292": "O pacote especificado não existe.!", - "22e806afb25ddcb6cf205be320eb2350": "Não é possível encontrar [Arquivo de Configuração de Implantação Automática aaPanel] no pacote de instalação", - "7658d0092e96ef38859c12f2a91f641f": "Não há tarefas de implantação no momento!", - "f5fa57ce44938aa510e6cb68bd52c24b": "Sem arquivo de log", - "1bb87a5feb9e217c858933afdce8f4e7": "O arquivo de log é muito grande!", - "21290da79237752afe963ecef5d89b5a": "Varredura iniciada com sucesso", - "8e0e316031928c8c96c94ad6d57bd03e": "O diretório não foi varrido", - "9208374e1391bb886971bad99b2380f1": "Tipo incompatível", - "580d97d0b321127650cf1901cc3524b2": "O registro não existe", - "152b976545ff1ee50e0de21da7af1266": "A verificação está em andamento.....", - "e6a6fa2d0bcc8bfc2af5bcd4640ade03": "Verificação de parâmetro", - "80f9a0a476836be5fdec10fe414e88a9": "{} O site está sendo criado....", - "064aa7114f7c7430dcf2b0cdc05ad20c": "Criar site", - "8a9535f05c52e58f46e3237b9da019cc": "Adicionar configurações opcionais: banco de dados, FTP", - "b7575e63439333749c6e7d6a27b8a0e4": "Adicionar configurações opcionais", - "2a5e8b7e4116ee81db89ba173f60bf90": "Falha na verificação de parâmetro", - "2f35a151cc0256f0d9ad5410eccbe5d0": "Falha na verificação de parâmetro: {}", - "af2a8e2174ea327f9fbf77d84029d58b": "Verificação de parâmetro bem-sucedida", - "181fc26e7b655ba36b3b075ca1ebc350": "Falha ao criar o site", - "7118aff13541bf3d74a9c47fb458e102": "Falha ao criar o site: {}", - "be33773093fc2e135ba4bc26f4bb5509": "O site foi criado com sucesso", - "505a83f220c02df2f85c3810cd9ceb38": "Sucesso", - "8d823a9933eefd02bf1003481f816f64": "Falha: {}", - "e7b3deb11aabca0f7ae217ccccd10772": "Inicialização bem-sucedida!", - "31b88b436695f7e0bc5dad1cb8999737": "Não use as portas do serviço do painel!", - "d0d4ff47e6dc25f0069a1d74d2f995b4": "A porta está ocupada ou o intervalo de portas está incorreto! Deve estar entre 100 e 65535", - "7dde7f2ae7cb4ed56b1b683b479ad303": "Aviso: a versão {} ainda não foi instalada, ", - "839067817c5a1e7fcce2f905284d630e": "O diretório de origem de reescrita e o diretório de destino de reescrita devem ser preenchidos ao mesmo tempo", - "4b6ad864ce62dac8466dde7ec62e7ea9": "O diretório de origem de reescrita e o diretório de destino de reescrita não podem ser os mesmos", - "ed6fe3e47d3686c7af83b67535b426b5": "O diretório de origem de reescrita deve começar com /", - "8230eb6af0c1c2863c0c2f6bfaa9b37e": "O diretório de destino de reescrita deve começar com /", - "fa5e4af74d3d68ba371e6dcf84595c3d": "O site não existe", - "45f9a99535dea651b8f160f6cf23f826": "Falha na leitura do arquivo de configuração!", - "5e3b84200bea6d70f6fed1d5802a7fa0": "Consulta falhou, endereço não existe", - "5fa721871e93bc4121df74ce51454519": "Falha ao ativar o plugin, tente novamente mais tarde.", - "9f139adb77c26c263ff2a956d66f80fe": "Falha ao desativar o plugin, tente novamente mais tarde.", - "f8e169b0ef8d58f84c71e375141852ed": "Falha ao criar Conjunto", - "e35ca748f8c5a0e78731bae94fb7d68a": "Falha ao remover Conjuntos", - "468baaa7179c8b181d1de35fa00267e9": "Tipo inválido de itens de Conjunto", - "a01e808b2be07634b0e3714bff919ae1": "Falha ao remover itens do Conjunto", - "35c9b2817b191a3f60553d46b748068b": "Falha ao alterar o estado dos itens do Conjunto", - "87a9a388a3ef42018ceb866756c4ee39": "Falha na conexão com o banco de dados, verifique o status do banco de dados!", - "73b1d7767613c6300db27ade773369fa": "Falha ao remover site remoto wordpress", - "a75c113f53d4342010d140325fa29eec": "O multiserviço do site foi ativado. ", - "b0a517b4d596e5fc1351f8dc12e73a74": "Selecione o serviço retido", - "7e953c855b391ac0716a4eeb47c5c5c3": "Por favor, ative vários serviços primeiro", - "55d523aa501b0e7e93e172a9e6829a8a": "Erro ao obter informações da versão nginx", - "08f18bb6c6293307f68d5f822ed7dbe1": "Atualmente, openresty não é suportado", - "45020a62e40bbb43f6e05c62ad50288e": "Já existe uma tarefa de instalação. Aguarde a conclusão primeiro!", - "4052df86d5a8dd12943cc8b1d53162e4": "Falha na instalação do serviço. Por favor, tente novamente!", - "8033c09e6fedf841205b29b57c0ae0d1": "Falha na inicialização do serviço: {}", - "442d02a722dc331f8b85d328fb99a174": "O modo multiserviço foi ativado com sucesso", - "a0b289e4caa220dcd62692401d5083f5": "Falha ao desinstalar o serviço {}. Por favor, tente novamente!", - "0045406cf97cbdca708c795aa9554145": "O serviço {} falhou ao reiniciar. Tente reiniciar manualmente ou verifique o arquivo de configuração.", - "52cd203105425f66daf42d81f05c540f": "O modo multiserviço foi desativado com sucesso", - "9c116a9cbc0701ec9e9d6b6ab2755fc8": "A reinicialização do serviço falhou. Verifique o arquivo de configuração do apache!", - "a949ed64edc73a99f9f9c801a84b6390": "O tipo de serviço especificado não existe", - "408f206d494c5f26144f7492315dfa21": "Ocorreu um erro ao alternar serviços em lotes!", - "e9fd26be1a67520e66f2e99d61977c32": "O ID do site não existe", - "d80972d5dfb46c1f11b8dba2b7aa04d3": "O serviço atual do site já é {}", - "99914b932bd37a50b983c5e7c90ae93b": "{}", - "2422c065bd4ef8d950bbf17c43f907dc": "A modificação da configuração falhou.", - "98e762d03fc5ffcb381010aff10c7bde": "Alternado com sucesso para {}", - "293f667205bd8aa91c72f966c03c3de5": "O tipo de serviço de site obtido está incorreto", - "8562d96fc303411ee017a30b83d75712": "Reparado com sucesso", - "d9d76120c8c13b40d2e8e49b0d6117da": "Ocorreu um erro no multiserviço e o reparo falhou. Tente fechar o multiserviço e reabri-lo!:{}", - "e1b5191ef3dd64eaba9ab3c787d1fa67": "O arquivo de configuração não existe", - "c8622023712105e9e7328396976a2667": "O arquivo de configuração de backup não existe: {}", - "d81f83ae44da0682974272b976e8e550": "Recuperação bem-sucedida", - "12572c9827392d4bd4c028881ed06242": "Existem conflitos de proxy global ou reescrita de url no site. Por favor, exclua-o e tente novamente!", - "92bce01ab77d0d50efec1d424cab583b": "Este site tem um proxy reverso. Por favor, exclua-o e tente novamente!", - "30c74a0981da2edec86936cd288479f7": "O site configurou um proxy reverso global. Por favor, cancele-o primeiro!", - "c3fe8f7adf26d613d9593acede34303b": "O site está configurado com vinculação de nome de domínio de subdiretório. Por favor, cancele-o primeiro!", - "c601909c952f2064e91d6f3c1d1a7128": "★iniciar backup[{}]", - "890b5b1ca2b1aa96f0781c9fdc77ab88": "☆o backup está completo[{}]", - "5316694cae24d434370be2d76146a500": "|-Erro:{}", - "b763e7e9f6b23d4b5066458506d26d55": "Falha na execução da tarefa de backup.", - "713660262f5ab9c3af9aa17c8d8a412c": "Backup para ", - "de5ac4bddf9b72b649c0cbd4243f76c6": "tente novamente após alguns segundos... aguarde...", - "6905a88552caae6df77f56bd19f6d76a": "Configurações de tarefa Cron mantêm local. Backup local é mantido.", - "63701b3fa795bcd399aab5d489f8eae9": "Configurações de tarefa Cron não mantêm local. Backup local não é mantido.", - "837cc24a222df21e74245f4cfac6ad09": "Configuração do usuário para não", - "57d4380c974a85fe8db5914c934addf4": "A tarefa agendada não existe! {}", - "038ae15d38f9f027abda2aabf18324ab": "Manter o número mais recente de backups: {} cópias para {}", - "58c65e272cfde6fc8cf73d0ffcde4bbd": "Enviando para {}, aguarde...", - "243c0f3ec002883d6fa7770957ecf9bd": "A tarefa agendada não existe!", - "78df833c741b9814545d76a83f2db9b5": "{} Banco de dados de backup {} não existe", - "472f0ed974a6a2aec9b70fe7d39b27ee": "O MongoDB ativou a autenticação de segurança. ", + "3f8ee4f649b32e181c15c39682629844": "Usuário [{}] existe!", + "b23886f3380c4a9500a7614474ff6bf8": "A senha deve ter pelo menos [{}] caracteres", + "f20eaf62a87c2072f7c09ec70a6b90c9": "Erro de exclusão", + "9607dbc43fb07121ebd102497290c15b": "{} Usuário FTP falhou!", + "8b73e5696a44d470ee99c274152c1b54": "Porta[{}] está sendo usada!", + "384169bf557e2785a74c6ab4c8ca0d9c": "Erro de edição", "8a09aa6b7131f71b3ba97f13d5b7823f": "O número do pedido especificado não existe e não pode ser renovado!", "72905fe72d071dffbc0c1a20eb8def87": "Nenhuma informação sobre este pedido foi encontrada.", - "0b033e06e17e9fb14f93e6f11eed6599": "O pedido expirou. Por favor, solicite novamente!", + "0b033e06e17e9fb14f93e6f11eed6599": "O pedido expirou. Por favor, aplique novamente!", "3497d17853f8a84d0b552dcea4fabad2": "As informações deste pedido não foram encontradas.", - "972f14a9afdebc7e5b366f465171776a": "O pedido expirou. Por favor, solicite novamente.", + "972f14a9afdebc7e5b366f465171776a": "O pedido expirou. Por favor, aplique novamente.", "1008d1a5b18463e45c0bdb930bc0087c": "Este certificado não foi encontrado.", - "2e95d6e834bed89e1e199808d0cfd8aa": "Especifique o diretório raiz do documento do site no parâmetro --path!", - "4a8d983505848031c77a15c408cd1f3e": "|-Tentar novamente o comando", + "2e95d6e834bed89e1e199808d0cfd8aa": "Por favor, especifique a raiz do documento do site no parâmetro --path!", + "4a8d983505848031c77a15c408cd1f3e": "|-Tentar comando novamente", "ed069811f3c302d22a0f4aafc6903826": "|-O usuário abandona a aplicação e sai do programa!", "daa9a175b001e007de4d7ca89ec19aec": "Tipo de nó inválido: {}", "abb41b16dcebff17c55d75000fe3cabf": "Automação inválida", - "e9d2603582f4a20d640b8e7d3b3e08b7": "Não é possível editar a automação no estado de execução.", + "e9d2603582f4a20d640b8e7d3b3e08b7": "Não é possível editar automação em estado de execução.", "d2fcac4ec8e0f366bff10d45d37bb3d3": "automation_id inválido: {}", "d171abccfa056d262e7e081b84510c4f": "Automação inválida: falha ao carregar gatilhos", "ae3ff0ee4b1a6c1dfe230d9b15a4d4a0": "Automação inválida: gatilhos incompletos", @@ -1756,111 +1800,109 @@ "0fdf6b21eacd19ce746639f1c4613607": "end_time deve ser maior que start_time", "18fc7ff48f030eda26c7446cdccd441d": "dados inválidos", "dcb3fc2a35a17abb01744383ebf3cdc4": "dados inválidos -2", - "7122d35c3532d63c8d9fc5c5bd320558": "Falha ao obter lista de pedidos, tente novamente mais tarde!", "079217f7bb63fed72af9bb79048e3967": "'*", - "b3248ad84a12659b1599607f969741a0": "A permissão CloudFlareDns deve ser ", - "0ad00e6c415af62cdaa8537c32574052": "O alias já existe!", - "9c82954b2bf15dc7a9462145d9782aac": "Por favor, atualize para a Versão PRO!", + "b3248ad84a12659b1599607f969741a0": "Permissão CloudFlareDns deve ser ", + "0ad00e6c415af62cdaa8537c32574052": "Alias já existe!", + "9c82954b2bf15dc7a9462145d9782aac": "Por favor, atualize para a versão PRO!", "3a306f42856e51481470e9702cc22169": "Salvo com Sucesso!", "9758ed50c1e1816e1eecb98e0c3ed1ec": "Excluído com Sucesso!", "4b9f49d0625305474bd478ed077bba0b": "id é obrigatório", "615df74f7d5141a1084369b9da4ccb4a": "Provedor não encontrado!", "4a9382b97abdf8cb5b237bf7d64873e2": "search_and e search não podem ser usados ao mesmo tempo", - "7d7d9ba1a8780278b2a05b91eacfb2e7": "Registro DNS não encontrado!", - "8d49c4cd608eaa6d8d9a1e0ab6658fb4": "Provedor de DNS não encontrado!", - "79922b861a42a4e2350f69501eb25ca0": "Registro DNS não encontrado!", + "7d7d9ba1a8780278b2a05b91eacfb2e7": "Registro DNS Não Encontrado!", + "8d49c4cd608eaa6d8d9a1e0ab6658fb4": "Provedor DNS Não Encontrado!", + "79922b861a42a4e2350f69501eb25ca0": "Registro DNS Não Encontrado!", "39b361ca64471b92b1b1e84dee7d5226": "Atualizado com Sucesso!", - "84e9feba40d0aed963505e503cf821e3": "Falha na Atualização...", - "8ef6a7854d197b829e350936856847fc": "Certificado SSL não encontrado!", - "02d59ec01b27b9b07cc92b56b4590690": "O certificado SSL tem menos de 30 dias, não é necessário renovar!", - "c85411871b8773e799e64d0c23ef79d3": "Pedido não encontrado!", - "9dd5fcad400ad7db65baa55be5535d94": "Solicitação bem-sucedida!", + "8ef6a7854d197b829e350936856847fc": "Certificado SSL Não Encontrado!", + "02d59ec01b27b9b07cc92b56b4590690": "Certificado SSL tem menos de 30 dias, não precisa renovar!", + "c85411871b8773e799e64d0c23ef79d3": "Pedido Não Encontrado!", + "9dd5fcad400ad7db65baa55be5535d94": "Aplicado com Sucesso!", "3f5a9a220cd8c53770c59c4931beb2be": "auth_type deve ser ", "4fadb14ca725c013569fc00385d750fd": "domínios está vazio", - "2a6bb1bdd798217656edecf672b6df3c": "Erro de verificação Http01, mas o site não foi encontrado.", - "962682f10423a33a75f4b1277b3690c9": "Erro de verificação Http01, mas o site não está em execução", - "fdbdc3e70ef01cae6ba7f67b34622aa1": "Tipo de autenticação desconhecido", + "2a6bb1bdd798217656edecf672b6df3c": "Erro de Verificação Http01, mas Site Não Encontrado.", + "962682f10423a33a75f4b1277b3690c9": "Erro de Verificação Http01, mas Site Não Está Rodando", + "fdbdc3e70ef01cae6ba7f67b34622aa1": "Tipo de Autenticação Desconhecido", "52357aa86932ebcc9ff6e741ef6244b5": "falha na atualização do certificado", - "2e54bae7cebff2ed29eee92ee852cf0f": "Certificado SSL não encontrado!", + "2e54bae7cebff2ed29eee92ee852cf0f": "Certificado SSL Não Encontrado!", "022c6efa50cd0022ffa66b42f08caadc": "Removido com Sucesso!", - "9ecbde266be14f2c038c06f339f7ee46": "SSL não encontrado!", - "9bb50ed8d9b14f51d1a44a423db43e6e": "Configuração bem-sucedida!", - "049734a8ec5a38304b7e0dff089b05fe": "Implantar Correio", + "9ecbde266be14f2c038c06f339f7ee46": "SSL Não Encontrado!", + "9bb50ed8d9b14f51d1a44a423db43e6e": "Configurado com Sucesso!", + "049734a8ec5a38304b7e0dff089b05fe": "Implantar Email", "6df4bb58ee6967a48b38e093858091de": "Implantar Conta", "ec220f32ceb0ad39d785439e3d442464": "Implantar Painel", - "7f689dbbf6341be1e07e8e96d16b95db": "Domínio curinga (wildcard) não é suportado!", - "2ac3f96d3c4f34f9ab7627bf5f1fb444": "Domínio inválido!", + "7f689dbbf6341be1e07e8e96d16b95db": "Domínio curinga não é suportado!", + "2ac3f96d3c4f34f9ab7627bf5f1fb444": "Domínio Inválido!", "8346bf5e43bfb945866b734da5e365fb": "domínio está vazio", + "7122d35c3532d63c8d9fc5c5bd320558": "Falha ao obter lista de pedidos, tente novamente mais tarde!", "f53f8d0c6e47f742892e21dc6d0ffcba": "Firewall não inicializado.", "7aa738bc7717148a9518c0d37e0bdcc2": "instalado.", - "10cf4b73623a047cd8c039899a68678f": "Firewall não ligado.", + "10cf4b73623a047cd8c039899a68678f": "Firewall não ativado.", "f2ec5e710cf0c84fd474abdc993360e8": "Tarefa de inicialização do firewall criada.", "98dd43dfae05b11befe1f140e0ec787a": "Instalado", - "032c6f0f72bf846bf80205f83cfbbfdf": "O nome de domínio de destino não pode estar vazio", - "d3e42cf08c9dd4657e1ec738bcd7fa4f": "A porta de destino não pode estar vazia", - "2e983c6be925499dd08a349a82f9e215": "O nome de domínio de destino está no formato incorreto", - "2101cff923c114c46970531cebe61e9c": "Nome de domínio: 【{}】Falha na resolução", - "484a79b99ea7c89818e54bc86611e0ab": "Por favor, passe o id", - "8bc83520b9c5e0cb6a83e1cf6961cfdf": "A configuração foi bem-sucedida, mas as seguintes configurações de regra falharam::{}", - "373ee51dfa98aab065593b352f395b59": "O endereço de destino está no formato incorreto", - "26fe283bcf5841270188165305b2f876": "O endereço de destino {} já existe, por favor não adicione repetidamente", - "4b8abdf7e8565603bc0b09534e1c53aa": "Por favor, ative o firewall antes de configurar as regras!", - "50c7672327d3879977f1672bac1ee999": "O IP de destino não pode estar vazio", "b9c6715ad1caf1dd7f933c42ab63707a": "Por favor, passe old_data", "842a116f755d53aacda61c8d5b90125e": "Por favor, passe new_data", "edbe2ffb112ecc945237a594ab786679": "A modificação foi bem-sucedida", - "f94b62cff0c45cb08b61da3ca2615d72": "O arquivo não existe", + "032c6f0f72bf846bf80205f83cfbbfdf": "O nome de domínio de destino não pode estar vazio", + "d3e42cf08c9dd4657e1ec738bcd7fa4f": "A porta de destino não pode estar vazia", + "2e983c6be925499dd08a349a82f9e215": "O nome de domínio de destino está no formato errado", + "2101cff923c114c46970531cebe61e9c": "Nome de domínio: 【{}】Falha na resolução", + "484a79b99ea7c89818e54bc86611e0ab": "Por favor, passe id", + "8bc83520b9c5e0cb6a83e1cf6961cfdf": "A configuração foi bem-sucedida, mas as seguintes configurações de regra falharam::{}", + "373ee51dfa98aab065593b352f395b59": "O endereço de destino está no formato errado", + "26fe283bcf5841270188165305b2f876": "O endereço de destino {} já existe, por favor não adicione repetidamente", + "4b8abdf7e8565603bc0b09534e1c53aa": "Por favor, ative o firewall antes de configurar as regras!", + "50c7672327d3879977f1672bac1ee999": "O IP de destino não pode estar vazio", "0976b2102c7a8af33f04ab2059e997ca": "O conteúdo do arquivo é anormal ou malformado", "774b94869c0844749626b1bf637fafbb": "A porta de origem não pode estar vazia", "e9b371dd7b29cd7373c524d880b031fe": "Se a regra já existe, não adicione repetidamente", - "13bd44b7e23ee792948ec122677bf1b3": "Falha ao configurar regra: O endereço IP não pode estar vazio", - "7f6cd3026825eae0d35775a932e0fb46": "Falha ao configurar regra: Endereços IPV6 não suportados", + "13bd44b7e23ee792948ec122677bf1b3": "Falha ao configurar regra: endereço IP não pode estar vazio", + "7f6cd3026825eae0d35775a932e0fb46": "Falha ao configurar regra: endereços IPV6 não suportados", "bbc83d63860d8fddbe9b5f0769f8d108": "Falha ao configurar regra", - "52de0a29b9e9289bd6598a5d4610774f": "A configuração da regra foi bem-sucedida", - "40e79165af94fb353f73532550d50dbc": "O firewall atual do sistema é iptables e não suporta configuração de status.", - "7f643aa5c0ac22eb56b8e0283a245537": "O firewall atual do sistema é iptables e não suporta parada.", - "759cbd156929358f44fea3d7a2303d12": "O firewall atual do sistema é iptables e não suporta reinicialização.", - "9eeb5949442ea424abb29b42f4f3763d": "O firewall atual do sistema é iptables, que não suporta recarga.", - "6fe3c8f7481574a858f4c4e3dcb190b8": "Falha ao definir uma regra de porta:{}", + "52de0a29b9e9289bd6598a5d4610774f": "Configuração da regra foi bem-sucedida", + "40e79165af94fb353f73532550d50dbc": "O firewall do sistema atual é iptables e não suporta configuração de status.", + "7f643aa5c0ac22eb56b8e0283a245537": "O firewall do sistema atual é iptables e não suporta parar.", + "759cbd156929358f44fea3d7a2303d12": "O firewall do sistema atual é iptables e não suporta reiniciar.", + "9eeb5949442ea424abb29b42f4f3763d": "O firewall do sistema atual é iptables, que não suporta recarregar. ", + "6fe3c8f7481574a858f4c4e3dcb190b8": "Falha ao configurar uma regra de porta:{}", "cc84ff9fa77f59978d67ebe5c21c4cc6": "A regra de porta foi configurada com sucesso", - "5fb5bec15f0680c0f8281e2a77f01564": "Falha ao definir a regra:{}", - "202ed89223bc105db8c706695994099e": "A regra foi definida com sucesso", - "31bdde170e92eb68e5cf19070a0257b2": "Falha ao definir uma regra de encaminhamento de porta:{}", + "5fb5bec15f0680c0f8281e2a77f01564": "Falha ao configurar a regra:{}", + "202ed89223bc105db8c706695994099e": "A regra foi configurada com sucesso", + "31bdde170e92eb68e5cf19070a0257b2": "Falha ao configurar uma regra de encaminhamento de porta:{}", "14af00e29f1c7f276529a7f13d37bcf3": "Nomes de tabela não suportados: {}", "37859bf15c1d49002153157ecdd4ad45": "A configuração da regra falhou:{}", "9fcd0fb925f2f1f9fc5157a937c1527a": "A configuração da regra falhou: {}", - "9ef9f6bcb8cd56f9b4d8be162918810e": "Falha ao iniciar o firewall:{}", + "9ef9f6bcb8cd56f9b4d8be162918810e": "Falha ao iniciar firewall:{}", "afa08ad3f9767240b0219e668944beee": "O firewall foi iniciado com sucesso", "bc1ad4532116f7e179339e07a39be1a3": "Falha ao parar o firewall:{}", "50ac40822152a67e4195c04488aa7129": "O firewall foi parado", "c8b9e1198399365ab380361c761ab78d": "Falha ao reiniciar o firewall:{}", - "04105f039f2850a3472f9b79c7ae5111": "Recarga do firewall falhou:{}", - "2be1a57d150c047f0c5d936a904d884a": "Falha ao definir a regra de porta de saída:{}", - "af95b488978d644c7ef7b4b856def666": "A regra de porta de saída foi definida com sucesso", + "04105f039f2850a3472f9b79c7ae5111": "Firewall sobrecarregado falhou:{}", + "2be1a57d150c047f0c5d936a904d884a": "Falha ao configurar a regra de porta de saída:{}", + "af95b488978d644c7ef7b4b856def666": "A regra de porta de saída configurada com sucesso", "194fbdb576220abe3bc3ae3746af89a7": "Parâmetros de política desconhecidos:{}", "f006b06691ecd76b8a34e2825c17b6aa": "Estratégia desconhecida: {}", - "55bbeb07229c08c530c5119918035594": "A regra de saída foi definida com sucesso", - "8be2d40f6fa3e12c46ba68bfb23951d1": "Falha na configuração da regra de saída:{}", + "55bbeb07229c08c530c5119918035594": "A regra de saída configurada com sucesso", + "8be2d40f6fa3e12c46ba68bfb23951d1": "saídaA configuração da regra falhou:{}", "5d6e1e45c8d58b5f2800aabe961be7e6": "Serviço de conta não iniciado, inicie o serviço primeiro", - "9f570fb82d621c780cae5d4a3b7b21fa": "Iniciado com Sucesso", - "d6fd80e8f386ec01318ebbd911b3cb8c": "Falha ao iniciar", - "54b737c15ee80b356bed65d1e4bbdf11": "Falha ao parar", - "ca5ae41ecee3659791384fbb49c573f2": "Parado com Sucesso", - "f9458b55789fb6b79f107c061d9050e0": "Reiniciado com Sucesso", - "ce070d796c159496ab8253cc60891b9e": "Falha ao reiniciar", - "ca0431c082d8980ad8a7fbfff9a3cc4e": "Recarregado com Sucesso", - "f61bf123501eb5094cd6782409088c6f": "No momento, apenas o nginx é suportado como servidor web. Ajuste o servidor web para nginx primeiro e faça backup dos dados do site ao ajustar o servidor web", - "01b4fc496d491eed58270beca1664e66": "Falha no download do script de instalação", + "9f570fb82d621c780cae5d4a3b7b21fa": "início com Sucesso", + "d6fd80e8f386ec01318ebbd911b3cb8c": "início Falhou", + "54b737c15ee80b356bed65d1e4bbdf11": "parada Falhou", + "ca5ae41ecee3659791384fbb49c573f2": "parada com Sucesso", + "f9458b55789fb6b79f107c061d9050e0": "reinício com Sucesso", + "ce070d796c159496ab8253cc60891b9e": "reinício Falhou", + "ca0431c082d8980ad8a7fbfff9a3cc4e": "recarregamento com Sucesso", + "f61bf123501eb5094cd6782409088c6f": "No momento, apenas nginx é suportado como servidor web. Por favor, ajuste o servidor web para nginx primeiro e faça backup dos dados do site ao ajustar o servidor web", + "01b4fc496d491eed58270beca1664e66": "Download do script de instalação falhou", "b6bbb24d50175d3a920095caccfc8cc7": "A tarefa já existe", "22e6df6f7a837552a50ec27a63418a99": "A tarefa de instalação foi adicionada à fila de tarefas", "01545ec6a6d49b956f303f9ac0f7aeed": "A atualização foi bem-sucedida", - "f43df7708267595d8c8ee27cca2e25c7": "O conteúdo do certificado não pode estar vazio", - "749c4e1e3720c1aa28459dd4953cf782": "Verifique se o formato e o conteúdo do certificado estão corretos", + "f43df7708267595d8c8ee27cca2e25c7": "Conteúdo do certificado não pode estar vazio", + "749c4e1e3720c1aa28459dd4953cf782": "Verifique se o formato e conteúdo do certificado estão corretos", "5e6ddd918845e96916d903a667e65da6": "definido com Sucesso", "9aad9a87ef3911e202093b08b2f570ed": "fechado com Sucesso", "b4987b794be5974dd020719b9c1d0a41": "Endereço IPv6 não é suportado", "793f2b3ffa18b3513258114b0216cb7b": "Verifique se o endereço do host está correto, por exemplo: 192.168.1.20", - "af8d2d8e000adaed48feb1c1502cea6d": "Desculpe, falha ao abrir, vá para a Loja de Aplicativos --Anti-adulteração para Empresas para ver detalhes", + "af8d2d8e000adaed48feb1c1502cea6d": "Desculpe, falha ao abrir, vá para a App Store --Tamper-proof for Enterprise para ver detalhes", "e9f9d8e8358b9291af5e41417184ddd2": "Proteção de arquivo adicionada com sucesso", "c4faf633a3fd32e8b5d8138dbddc1693": "Falha ao abrir firewall", "5ebd3aeb7b2c96cf6c64f82bfa333f02": "Firewall aberto com sucesso", @@ -1870,404 +1912,438 @@ "55df5f27012531e176be79f81b90d779": "Excluído com sucesso", "785a530106a46c897769c1cf2df6c2f3": "Iniciado com sucesso", "274fbf19776d1b6efee0e71f075739cd": "Parado com sucesso", + "b9940e6be68b04502240b4d9dcadf31f": "Instalando...", + "402e7a087747cb56c718bde84651f96a": "Sucesso!", + "24742fdc8b10e0c22da043b82ec2d034": "Zona adicionada com sucesso.", + "7f3784e809f273b0b5c184bc54b9faa9": "Zona excluída com sucesso.", + "e844d65ff09d2632eac952b3aead39b4": "Servidor de nomes definido com sucesso.", + "6974e9e250b2c667198d058eea716a82": "Registro SOA definido com sucesso.", + "527c6f13367a6c6fe6eccafdcee477a1": "Logs limpos com sucesso.", + "1772fbb5207afbb9dbdc5ebbac4a1207": "Falha ao limpar logs.", + "3e529bb4952f89cfbcae3a72a246e629": "Registro DMARC adicionado com sucesso.", + "cb99ed01c97dce56abf2ec0b44861a63": "Registros DKIM/SPF adicionados com sucesso.", + "c29aa49e3d3d91c08b207563bad272f5": "Verificador DNS está Rodando. Por favor Aguarde.", + "324b9550f30c392158d06e38781f1d17": "Verificador DNS está Suspenso.", + "03b9251db02492d622c55683ef2ae6d1": "Verificador DNS já está Rodando. Por favor Aguarde.", + "70d8963372aa6cd19254cfdfce2150eb": "Verificador DNS Executado com Sucesso.", + "fdeec8a42f9bca6eb42c417d9da14d80": "Ação inválida.", + "cb9004d0406249266c644782d5446c31": "Todas as zonas corrigidas com sucesso.", + "af88c4ef2e220eba86b35140aba3b680": "Tipo de registro é obrigatório.", + "282e6a8a0bba12c773eeee76d800d34c": "TTL definido com sucesso para todos os domínios.", "81c5f87b76468dbe7a152121fee71663": "Não há logs redundantes para limpar", "12af24fd6d32854160728cffa4ea2150": "Nenhuma limpeza foi bem-sucedida", - "90b0ccf9b077f2cadeef3daaf17d86b8": "firewall tem {}", - "3d2fb8221a478c63e13b494d7279e2ac": "Adicionado com sucesso, {} A mesma regra existe para a porta e foi ignorada", - "fc66f87cb8d92e3caf13485d65ecc309": "operação bem-sucedida", - "9a321cf078154e6594a8a29fb7847738": "Por favor, instale o módulo dnspython primeiro", + "90b0ccf9b077f2cadeef3daaf17d86b8": "fire/wall tem {}", + "3d2fb8221a478c63e13b494d7279e2ac": "Adicionado com sucesso, {} A mesma regra existe para a porta e foi pulada", + "fc66f87cb8d92e3caf13485d65ecc309": "operar com sucesso", + "9a321cf078154e6594a8a29fb7847738": "Por favor instale o módulo dnspython primeiro", "2463904b74dc3ffd3fb849f87a0e3a3a": "O conteúdo do arquivo está incorreto!!", "7a3f417adbeb8a69180134c6f2373c36": "O arquivo está vazio!", "29b89ed8f1aa15665f877c12e0d14bac": "A importação falhou. O formato das regras está errado. Tente novamente de acordo com o formato das regras de exportação!", - "002827869c69ad72bc41ca442547bbac": "Cancelar ignorar regra com sucesso", + "002827869c69ad72bc41ca442547bbac": "Regra de ignorar cancelada com sucesso", "63ecd16effc3eab31bf1eec574ece639": "Desbloqueio bem-sucedido!", "eacd845def6fe750cfc0986f24565045": "Senha de login local está vazia", "fea087517c26fadd409bd4b9dc642555": "normal", "e1a4b8afc2cb3f56f0c98876c06d6d58": "Falha ao conectar ao banco de dados!", - "a18fb7f91f74b73e7326700913e7e35c": "O servidor especificado já existe: [{}:{}]", + "a18fb7f91f74b73e7326700913e7e35c": "Especifica que o servidor já existe: [{}:{}]", "079d7d1539d30a76e53b6fb54d370d32": "Adicionado com sucesso!", - "72bfbe1d7dd57250382b570043041e82": "Falha ao Adicionar: {}", + "72bfbe1d7dd57250382b570043041e82": "Falha na Adição: {}", "270b19b2e9da5da821c7b54a1a8d7fd6": "Erro de passagem de parâmetro, tente novamente!", "ffcba623cf91331a0ba5b3ab969db1f9": "Excluído com sucesso!", "43bf15425909c99f2cc1553eaffaf476": "Falha ao excluir: {}", "0947887a435eff51a71f1e54615af33c": "Falha ao conectar ao banco de dados [{}:{}].", - "844eea2c94a872941b4e4fe66c92c659": "Falha na conexão com o banco de dados [localhost:27017]!{}", - "90b65217be3c698d9b1fbff0dccdc71b": "O serviço Mongodb ainda não está ativado!", + "844eea2c94a872941b4e4fe66c92c659": "Conectando ao banco de dados [localhost:27017] falhou!{}", + "90b65217be3c698d9b1fbff0dccdc71b": "Serviço Mongodb ainda não está ativado!", "7d1a075632098426af1e2197d274bdb6": "O nome do banco de dados não pode conter os seguintes caracteres. /\\\\. \\", "48b2c30b0f984cdcc6cd7ed4ee376fdc": "O nome do banco de dados contém espaços e não pode ser adicionado corretamente!", - "93efcc7fc4e9d402978828bacd4a5bc2": "O usuário do banco de dados já existe, use outro nome de banco de dados!", - "393223cf51f8e25df5d53ae425de74a9": "o banco de dados não existe.", - "2162130c1a1937f839cc660f5e70ebdb": "O serviço Mongodb ainda não está ativado!", - "45da541afaa00457a2f4617a1dd4855f": "A exclusão do banco de dados com nome admin é proibida devido a restrições do Mongodb!", + "93efcc7fc4e9d402978828bacd4a5bc2": "Usuário do banco de dados já existe, use outro nome de banco de dados!", + "393223cf51f8e25df5d53ae425de74a9": "banco de dados não existe.", + "2162130c1a1937f839cc660f5e70ebdb": "Serviço Mongodb ainda não está ativado!", + "45da541afaa00457a2f4617a1dd4855f": "Exclusão do banco de dados de nome admin é proibida devido a restrições do Mongodb!", "2465ac13d0470c6414b77dc59fbcdbbc": "Falta de ferramentas de backup, instale o MongoDB via Gerenciador de Software primeiro!", - "d2af5fe1710856e97dbfdf1adc6d5e98": "Parâmetro ausente! id", + "d2af5fe1710856e97dbfdf1adc6d5e98": "Parâmetro faltando! id", "9c17c1312620910f7c3d27a20f01e968": "O banco de dados não existe! {db_id}", "57bb958a6998e558b00b5d89d240b240": "O formato bson json csv é suportado atualmente!", "3b4ee1461f518d1bd1ed20615d670df1": "Você precisa especificar os campos de exportação ao exportar para o formato csv!", - "d2c7790b1f776ce6ad06426b03fa71b1": "A senha de login local está vazia, defina a senha do banco de dados primeiro!", + "d2c7790b1f776ce6ad06426b03fa71b1": "Senha de login local está vazia, defina a senha do banco de dados primeiro!", "699c43a1633256e97b95615a562eef88": "A senha do banco de dados está vazia! Por favor, defina a senha do banco de dados primeiro!", - "1acdae1719cee0ce5c586cd6995b70a9": "O MongoDB ativou a autenticação de segurança, ", + "1acdae1719cee0ce5c586cd6995b70a9": "MongoDB ativou autenticação de segurança, ", "67e943332602d7a5b9765306caa8604d": "Tipo de banco de dados desconhecido", - "04c651a70b89bd4fd8fc8702c0bf61e9": "Falha no backup do banco de dados, arquivo de exportação não existe!", - "e880101cd795726a7c8e2c2f4033f9dc": "Falha no backup!", + "04c651a70b89bd4fd8fc8702c0bf61e9": "Backup do banco de dados falhou, arquivo de exportação não existe!", + "e880101cd795726a7c8e2c2f4033f9dc": "Backup falhou!", "ae1110dd560e4e7968b297620be7ea36": "BACKUP_SUCESSO", - "bff09c8822165bf816a5b5a4d1fe9140": "O caminho de importação não existe!", - "3d003d1417aec658cd020f9faf66a5c1": "A importação de arquivos zip é a única suportada!", - "3397a2bc97209578e6c113606a4c7b7b": "ENTRADA_BANCODEDADOS_SUCESSO", + "bff09c8822165bf816a5b5a4d1fe9140": "Caminho de importação não existe!", + "3d003d1417aec658cd020f9faf66a5c1": "Importar arquivos zip é suportado apenas!", + "3397a2bc97209578e6c113606a4c7b7b": "BANCODEDADOS_INPUT_SUCESSO", "94b43778dbd724133db47ee2126da3a9": "Nenhum banco de dados sincronizado", - "aae27fc3d2273773edab02e15288cb14": "Sucesso na sincronização do banco de dados {}", + "aae27fc3d2273773edab02e15288cb14": "Sincronização de banco de dados com sucesso {}", "164c5fa905dbffad015f4593d1b85fb9": "O tipo de banco de dados sid requer o tipo int!", - "3a621b20dadc66881772503620282533": "OBTER_BANCODEDADOS_SUCESSO", - "505a6be34cf7e61f93f2665896cfafaa": "Falha na modificação, banco de dados [", + "3a621b20dadc66881772503620282533": "BANCODEDADOS_GET_SUCESSO", + "505a6be34cf7e61f93f2665896cfafaa": "Modificação falhou, banco de dados [", "13966ea12f4ed389be50c95e65d8a2dd": "A senha do banco de dados não pode estar vazia ou ter caracteres especiais.", - "361cbf31511a2bf38fc664157d183328": "A senha do banco de dados não pode ser chinesa, mude o nome!", + "361cbf31511a2bf38fc664157d183328": "Senha do banco de dados não pode ser chinesa, mude o nome!", "252d8cfbb164b773c5f84ce9d814ae3c": "A modificação falhou, o banco de dados especificado não existe.", - "aea43e9b982f6105e584e46b778d9f9e": "A modificação falhou, a autenticação de segurança não está ativada no banco de dados.", + "aea43e9b982f6105e584e46b778d9f9e": "Modificação falhou, o banco de dados não está ativado para autenticação de segurança.", "0b46bb64ce97c64f6dddc87bccf949e8": "Informações do banco de dados remoto não existem!", - "9e1a9b35939cc4887854eb2ed84f401f": "O nome do banco de dados não pode conter caracteres especiais, redefina-o.", + "9e1a9b35939cc4887854eb2ed84f401f": "O nome do banco de dados não pode conter caracteres especiais, por favor redefina.", "90299d1fb53fdf7a570db71a1b61c127": "Por favor, defina a senha Root do PgSQL primeiro!", "01d3922e30b7aff9c7265e91c57cc829": "O formato ip está incorreto!", - "b2349e65b04baa3a0d50ad030535b73e": "que você digitou não é legal, a modificação falhou", + "b2349e65b04baa3a0d50ad030535b73e": "o que você digitou não é legal, a modificação falhou", "932c4edd1a70a505be1099f4e7874692": "Modificar direitos de acesso do usuário pgsql com sucesso", - "f562938bcf2a52b32261e4f4a99c3e00": "Falha na exclusão! O banco de dados atual está sendo conectado!", + "f562938bcf2a52b32261e4f4a99c3e00": "Exclusão falhou! O banco de dados atual está sendo conectado!", "573ba454733eee7cd866addcd11ea21c": "Falha ao excluir o banco de dados!", "fec7dbd4f36266728d6eda5e168d1cc0": "O banco de dados não existe!", - "69579eb94ffe47354dac42abc8cac9d1": "A senha do banco de dados está vazia, configure-a primeiro.", + "69579eb94ffe47354dac42abc8cac9d1": "A senha do banco de dados está vazia, por favor defina primeiro.", "fb642275547236f1fb2ea7717ace26d8": "Por favor, defina a senha de administrador primeiro!", - "95abdbd5890c3ceec62026c6246d8030": "A execução do backup foi bem-sucedida, ", + "95abdbd5890c3ceec62026c6246d8030": "Execução do backup foi bem-sucedida, ", "7307a92023c68b6842a8dafb1b500f16": "Falta de ferramentas de recuperação, ", - "eef4302ce8a129e5d70767668a9e9110": "Por favor, escolha o formato de arquivo sql, tar.gz, gz, zip!", - "c5aafcc6af38d67c22ccc8d19f60ed0b": "Sucesso do banco de dados {}", + "eef4302ce8a129e5d70767668a9e9110": "Por favor, escolha formato de arquivo sql, tar.gz, gz, zip!", + "c5aafcc6af38d67c22ccc8d19f60ed0b": "Banco de dados sucesso {}", "a8de1650a48acf0e91c7ba840bd48295": "A senha do banco de dados não pode estar vazia", - "9a53422dee5315eb489d4e448f4ea976": "Falha ao modificar,O banco de dados especificado não existe", - "3ca4ea8082e41867cee227d4686a4c17": "Sucesso da senha do banco de dados {}", + "9a53422dee5315eb489d4e448f4ea976": "Falha na modificação,O banco de dados especificado não existe", + "3ca4ea8082e41867cee227d4686a4c17": "Senha do banco de dados sucesso {}", "0033a9566af4f930bebbd45802be5427": "falha na conexão", - "ae576ea2a8c76765fa69287fb1347d1a": "Falha na conexão com o banco de dados remoto!", - "d1b44799de985cad123821498285dfbd": "ERRO_FORMATO_ENTRADA_BANCODEDADOS", - "df5647a7421161dcbda85323db41cc99": "Sucesso na sincronização do banco de dados", - "2a52f6106614dfbd519714df03ebb16a": "Sucesso do banco de dados", - "1182c39d730924cb4f4d8d229fadb0f3": "Sucesso da senha do banco de dados", - "15a8af9e80d0a0c2d87314c154fff181": "cluster redis não suportado!", + "ae576ea2a8c76765fa69287fb1347d1a": "Conexão com banco de dados remoto falhou!", + "d1b44799de985cad123821498285dfbd": "BANCODEDADOS_INPUT_ERRO_FORMATO", + "df5647a7421161dcbda85323db41cc99": "Sincronização de banco de dados com sucesso", + "2a52f6106614dfbd519714df03ebb16a": "Banco de dados sucesso", + "1182c39d730924cb4f4d8d229fadb0f3": "Senha do banco de dados sucesso", + "15a8af9e80d0a0c2d87314c154fff181": "não suporta cluster redis!", "c2dafded2689dc11914376d72a70dfc2": "falha na conexão redis!", - "b283988bc23c61b2e6393195064ccc5f": "A operação foi bem-sucedida", - "a9ed7f25ce1ffcf98cf5ec7db86abdf4": "O backup de bancos de dados remotos não é suportado no momento!", - "9d1ee7d092060a4d3418a979fba5e46b": "ERRO_BACKUP", + "b283988bc23c61b2e6393195064ccc5f": "Operação é bem-sucedida", + "a9ed7f25ce1ffcf98cf5ec7db86abdf4": "Fazer backup de bancos de dados remotos não é suportado no momento!", + "9d1ee7d092060a4d3418a979fba5e46b": "BACKUP_ERRO", "1fcdee5d4329f1f638bc2d818f3e510a": "arquivo não encontrado", "517b554160a14e74d52943ea29ab5a66": "falha na conexão redis", - "ec010eeffc0a20399b186f334b3b6769": "falha na conexão com o banco de dados remoto {}", + "ec010eeffc0a20399b186f334b3b6769": "falha na conexão banco de dados remoto {}", "2322848a32fd761a98a0bd76e633bc97": "Informações do banco de dados remoto não existem!", + "0511237752a4bf05b3470f55a920a13c": "{} site tem divulgação da versão Nginx", + "c1634d768da5b138e9d7f30da5776f72": "A divulgação da versão Nginx pode expor informações sensíveis do servidor e apresentar riscos de segurança", + "3377a5b197173de4cffe41bdc42e0c06": "Abra o arquivo nginx.conf para o site {} e adicione ", + "45a1cb21f9639223152e01c1d6213cc9": "{} site tem divulgação da versão PHP", + "70ddb8e4ac75601221d15393379aec22": "A divulgação da versão PHP pode expor informações sensíveis do servidor e apresentar riscos de segurança", + "d8b10647324c74f52a3b24aee5b34316": "Abra o arquivo php.ini para o site {} e defina ", + "44971bb65cdcdb059767f15e4ff265e6": "Firewall não instalado para o site {}", + "7e26e59bba292ecc0bda0c7f69e091a1": "Não ter um firewall instalado pode expor informações sensíveis do servidor e apresentar riscos de segurança", + "633b7a612198f42925356962c605daf0": "Instale ou ative o firewall Nginx", + "114b3dda67fc0b22bce73684f5872804": "Proteção contra ataques cross-site não ativada para o site {}", + "5c040e1ad447e5408b0e3eecdd455c1d": "Sem proteção contra ataques cross-site, dados sensíveis do servidor podem ser expostos via travessia de diretório", + "0fc62e3733f8eebdc41ac57a3497f653": "Ative a proteção open_basedir no diretório do site para impedir que atacantes leiam arquivos sensíveis entre diretórios", + "d76b44c3726a549e02705d04d20572bb": "{} site tem SSL desativado", + "24e1cf7550e6cff5c9a86b136f4738af": "SSL não implantado pode expor informações sensíveis do servidor e apresentar riscos de segurança", + "598483f5877ad9bfe0a2c30a24d846d9": "Implante SSL em Site → SSL", + "0741d3f8bd49c7058a9a7e0a1e615bf1": "Arquivo sensível detectado no site {}", + "f98a053d674dbfc507c028cb69799413": "Arquivo sensível 【{}】exposto — pode vazar informações sensíveis do servidor e apresentar riscos de segurança", + "9a3a5f290b230622980f79252dc0bb19": "Exclua ou mova o arquivo sensível para fora do diretório raiz do site", + "781718c074dfa4fba0c1ab86af7322c3": "Arquivo de banco de dados SQL detectado no site {}", + "5fc606066b231ce034d1f894a2f56a87": "Arquivo de banco de dados SQL 【{}】exposto — pode vazar informações sensíveis do servidor e apresentar riscos de segurança", + "7fb29e80e1607255b4889149d814d6cc": "Exclua ou mova o arquivo SQL para fora do diretório raiz do site", + "7d793f5d45f692f8234cb14d77d43526": "Arquivo Trojan detectado no diretório raiz do site {}", + "2126356e872681f2c18ab8999d55977a": "Arquivo Trojan 【{}】detectado — pode expor informações sensíveis do servidor e apresentar riscos de segurança", + "34cbe317411bc8ece32e89b2ccb3ea8c": "Exclua o arquivo trojan ou realize uma auditoria de segurança", + "2ad6c8ba78234ac5d731bb9311eb92e5": "Arquivo de backup detectado no site {}", + "d5d425447ff390eaf69be751e20bf6b6": "Arquivo de backup 【{}】exposto — pode vazar informações sensíveis do servidor e apresentar riscos de segurança", + "c09aa2e529fe7c6658b8b534110d7e46": "Exclua o arquivo de backup ou mova-o para um local seguro", + "a4ec7bd83939b217a71b216c895e16ff": "{} banco de dados do site usa uma senha fraca", + "083b68b9c95c87161f91b810150a1cb3": "Banco de dados do site %s 【{}】usa uma senha fraca: {}", + "f522c28207b8c85833e454afdfb59ac3": "Recomenda-se alterar a senha do usuário do banco de dados no painel para evitar ataques de força bruta e roubo de dados", + "32ed3512099db2d97450af9c6ee23099": "{} conta FTP do site usa uma senha fraca", + "8a071d6ddba4edecc3e44089e1b24fb7": "Conta FTP do site {} 【{}】usa uma senha fraca: {}", + "bc9fb759c38c587070326ba0aaae12f4": "Altere a senha fraca imediatamente para evitar que atacantes forcem credenciais FTP e adulterem arquivos do site", + "6a0cf1bea780ff39333eb522d8f181aa": "Ataque XSS (Cross-Site Scripting)", + "b021dbe80c4037e66959a930b37e6f8b": "Para proteger seu site, recomenda-se habilitar o [Nginx WAF] para bloquear efetivamente ataques XSS neste site.", + "6e60d80e8f41ac0b2d0579bdf22f130d": "Ataque de Injeção SQL", + "82a2980b928e2ee7590dad990c70aca4": "Para proteger seu site, recomenda-se habilitar o [Nginx WAF] para bloquear efetivamente ataques de injeção SQL neste site.", + "34c46b685b63d1d8ce17528acc9a3f18": "Travessia de Diretório / Ataque de Inclusão de Arquivo", + "6af6785994f3ea3ea2c67bf07f947721": "Para proteger seu site, recomenda-se habilitar o [Nginx WAF] para bloquear efetivamente ataques de travessia de diretório e inclusão de arquivo neste site.", + "8ce854a4c99ec334244274a7eec82d02": "Ataque de Execução de Código PHP", + "946e8c378800662bf5c10a2cb7eff9fb": "Para proteger seu site, recomenda-se habilitar o [Nginx WAF] para bloquear efetivamente ataques de execução de código PHP neste site.", + "60d2c5ef1c4bb2dfb7e99eb659812f6a": "Tentativa de Acesso a Arquivos Sensíveis", + "b4e160dd6370e872200b9a7d12b980aa": "Para proteger seu site, recomenda-se habilitar o [Nginx WAF] para bloquear efetivamente tentativas de acesso a arquivos sensíveis neste site.", + "98c0b1eca58e1f2580ad3e8f5b542e54": "Ocorreu um erro durante a análise de log", + "b7040f1f73ad7726d2141879aaa0f3bb": "Verifique as permissões e o formato do arquivo de log. Erro: {}", "61dccc90b62286cfe99a0836cd7016f4": "O diretório do projeto não existe!", "393f59f008214da917a3644f9bddd08c": "O item especificado não existe!", "76f7795cbd69658732375d59e3ac4443": "O arquivo de configuração package.json não foi encontrado no diretório do projeto!", - "da87ee74f07713dc1fb6d97d770c6b9a": "A versão do nodejs especificada não existe!", + "da87ee74f07713dc1fb6d97d770c6b9a": "A versão nodejs especificada não existe!", "53dc11c67093dc8650a2a0bcc739af9e": "Por favor, instale o pacote de dependência primeiro!", "9e37cac0b6ac4947a8eaab9c4741d096": "O módulo especificado foi instalado!", "a23324d67a76505b9485e1925b49ce69": "Falha ao instalar o módulo especificado!", "e175807189b9fed334d7fa1d9517e302": "O módulo especificado não está instalado!", "7d837b25ee483c045c3d27e461661024": "Este módulo depende de outros módulos instalados e não pode ser desinstalado!", - "a06864f6c23b22710bc49fa3794247aa": "Não foi possível desinstalar este módulo!", + "a06864f6c23b22710bc49fa3794247aa": "Incapaz de desinstalar este módulo!", "3378916dcc3a51351a823bf417959965": "O tipo de parâmetro está errado, precisa de objeto dict obj", - "2ab730bc17ad482c454d62e5d6dda728": "Por favor, instale o gerenciador de versão do nodejs primeiro", + "2ab730bc17ad482c454d62e5d6dda728": "Por favor, instale o gerenciador de versão nodejs primeiro", "683eecd5ab2302a02009bb53528a8206": "O formato do nome do projeto está incorreto e suporta letras, números, sublinhados e expressões: ^[0-9A-Za-z_]$", "9360c6893e4ca4d7030d99d9ae4b34c7": "Por favor, instale Nginx ou Apache primeiro", "999e1ffe680ef91f5cf9795c34aa7acc": "O tipo de parâmetro está errado, precisa de dict obj", - "9f474c0c49ec1c30e3c19f13e9d2a52e": "Por favor, instale o gerenciador de versão do nodejs antes de instalar pelo menos um nodejs", - "9791ddabd2954257bfed271e0e7254dd": "O comando de início não pode estar vazio", + "9f474c0c49ec1c30e3c19f13e9d2a52e": "Por favor, instale o gerenciador de versão nodejs antes de instalar pelo menos um nodejs", + "9791ddabd2954257bfed271e0e7254dd": "Comando de início não pode estar vazio", "f8498a22f4e43acaae880208f0980675": "O item especificado não existe", "26aa1657ebfac1237da6a1f8ccae86b4": "O nome de domínio não pode estar vazio", "8f5e21613d5cfe258f7965986f95b750": "Pelo menos um nome de domínio é necessário para o projeto mapeado", "bd397222b97310807e5ecfdcec2c30ff": "O nome de domínio especificado não existe", "8f04dfa02fe0ef0106680e1a3e9f1759": "Item não existe", "64bc3d77e07e9e2757509ce626273a99": "Por favor, adicione pelo menos um nome de domínio na opção [Gerenciamento de Domínio]", - "7514fe0af7b6f84f1c3c0a01613010fe": "Por favor, vá para o [Módulo] e clique em [Instalação com um clique] para instalar as dependências do módulo!", + "7514fe0af7b6f84f1c3c0a01613010fe": "Vá para o [Módulo] e clique em [Instalação com um clique] para instalar as dependências do módulo!", "11382e970be52495256dd21192a671a7": "Nenhum script de inicialização configurado", "ef6b21f990d5f7f0a881e354a365063d": "O comando de inicialização foi interceptado por software de segurança desconhecido, verifique o log do software de instalação", "bbffcc99d1822ea57ca5e7dc614157ec": "Projeto não existe", - "53797f7f191af4c7851d0419ca27b334": "O projeto não iniciou", - "f45bc552cdf8369ab9fe2213eec7b802": "O arquivo de log não existe", - "f9be861aad3eda81843c7797487da8e9": "O status de segurança atual do sistema é bom e não há vulnerabilidades ou riscos óbvios", + "53797f7f191af4c7851d0419ca27b334": "Projeto não iniciou", + "f45bc552cdf8369ab9fe2213eec7b802": "Arquivo de log não existe", + "f9be861aad3eda81843c7797487da8e9": "O status de segurança do sistema atual é bom, e não há vulnerabilidades ou riscos óbvios", "890e24b14414e3da9bc2ad63d6d0befb": "Existem certos riscos de segurança no sistema, e algumas configurações ou políticas precisam ser melhoradas", - "951c23a91dfe39b5ea5d00405b4dc2c5": "O sistema tem vulnerabilidades de segurança óbvias, repare-as a tempo", + "951c23a91dfe39b5ea5d00405b4dc2c5": "O sistema tem vulnerabilidades de segurança óbvias, por favor corrija a tempo", "de36cae19b2a65a45cb4dfccb435530b": "O sistema está em um estado de alto risco, repare os itens de risco relevantes o mais rápido possível", - "ea848f5d6978f5916cd3df4191195e2a": "O host já existe!", - "7aa425b3819e79208faaed38fe137f34": "Falha ao conectar ao servidor, verifique se o docker foi iniciado!", - "c90ca78b1fc8554e867a696d30255cba": "Host docker adicionado com sucesso!", - "8ee5196fbd93bf345bf018132e808a0a": "Host excluído com sucesso!", - "c0ef08aa7bd6276137ccd491a8041223": "Não há volume para fazer backup", - "584e35dd4a55da88bd232ac7a19b9b95": "A tarefa de backup foi criada com sucesso.", - "0b08674e1c87f3f8508a4ae9b0c160f8": "Falha ao criar uma tarefa de backup {}", - "2a0f93407bb61e2403ccd032cbc64e3e": "excluído com sucesso", - "13d829d3f2b78c971207d944f2a96c55": "Falha ao excluir o arquivo, motivo: {}", - "0af5787b053c4bf5dbe610731f7d4199": "O caminho do arquivo não pode conter caracteres chineses!", - "719ee030d81490fc055af0c4426aacb9": "Falha na detecção: {}", - "ee3936ffdc910e2cb8578ad1fae322f0": "Detecção aprovada!", - "2e5c9168b81de403131125abe3537861": "Nomes de modelos não podem conter caracteres especiais; apenas letras, números, sublinhados, pontos e traços são suportados", - "1ef49203b5ddab4a6b30eddab93c6d73": "Este nome de modelo já existe!", - "356dbf2911e78ebedbd99f13df311ce1": "Modelo adicionado com sucesso!", - "4f6a25bc1019404777b1a95b85c375f3": "Não alterou o modelo!", - "029a1a33fb7a828191eac587a4d98db4": "Erro no formato do conteúdo do modelo, insira um modelo docker-compose válido!", - "052009ea42871f16153ca6fb451be303": "Modelo modificado com sucesso!", - "550993f7a7c3863e988dc02458bb413b": "Este modelo não foi encontrado!", - "86eb5f101087c690c1229fffceb97cba": "excluído com sucesso!", - "c541f51f11868ef56cf50524eeddd226": "O item não foi encontrado!", - "c3f9a083e42b21151560ba7e23667129": "O modelo não foi encontrado!", - "d5d3eedff8acf67756e21b4612aaa380": "O nome do contêiner já existe!:
[{}]", - "05073a33c4bfcb8113af6b3222a0cccd": "Esta porta [{}] já está sendo usada por outros modelos", - "69a22232c25cb907570f837e4032ed7e": "Erro de parâmetro, por favor passe template_id!", - "35698a69135017d7f8345e32cb5a87fe": "Este modelo não foi encontrado ou o arquivo está corrompido!", - "49d5a6420e1b84d63826fa1d79e5236d": "O arquivo de modelo não existe", - "e199ad07ae94664293828e753ec2a9a8": "O modelo [{}] foi implantado pelo projeto: [{}], altere um modelo e tente novamente!", - "a3017095090064d0ec98861e35d3849c": "O nome do projeto já existe!", - "a9a92ec33cfb8eb3288cfc84edcd48ad": "Implantação bem-sucedida!", - "a180787fbf3d2e3fac72a13cb98ce513": "A versão do docker-compose é muito antiga, atualize para a versão mais recente!", - "d8b370ee0351106fe38046541c421361": "O nome do projeto não foi encontrado!", - "30159c83433a6845a080ad879c0fb61d": "A limpeza foi bem-sucedida!", - "6483a5effa8c7ebce28c3838ee6f6e6e": "Limpo com sucesso!", - "5ded1fa085b4c46667f9c8871d00a46c": "{}O projeto falhou: {}", - "0e0ae38580f51369586ba6933a7c3105": "Parâmetro project_id ausente!", - "78f91123fc323aab6eb38f2bfb8e26d7": "Configuração do projeto não encontrada!", - "c3905cecf4f4eb28fcee1f4a4ad21bb0": "O parâmetro status está ausente!", - "f3655b96aad3f0771354a12af79571dd": "Parâmetro template_id ausente!", - "79f89afa2eaf7c8da6f0ac44295dba90": "Não", - "5b0854983625160cfbf1295ceb6ec327": "Pull (extração) realizado com sucesso!", - "ce932f534479bae87f0615fa7214e5a1": "Não foi possível verificar o diretório raiz", - "bf3d793f9f908f7d2d26a1be8dbb80fe": "O caminho não existe!", - "d2fe452a7fa69442d5296b8e4832ede3": "Modelo adicionado com sucesso: [{}]", - "8d92d05b95b166c5683fdb88f7de8bed": "Falha ao adicionar modelo: o nome do modelo já existe ou está formatado incorretamente [{}], use docker-compose -f [especificar arquivo compose.yml] config para verificar", - "428ed92bf9d3198f4c9885c11fdb2be3": "Estes modelos tiveram sucesso: [{}]
Estes modelos falharam: o nome do modelo já existe ou está formatado incorretamente [{}]", - "70975749d256333f1b3b62c864ca265a": "Falha ao modificar!", - "2360e954ae9eecac28b2a3edad5e8ce0": "Modificado com sucesso!", - "7c6f761019365f8a5cfb2fb54d9e199d": "info.json foi baixado!", - "10066fce84fe34e9cc33e0338532988b": "Falha no download de info.json!", - "0672e579ab0e3454713eb683ddcc4859": "{} Falha no download, ressincronize!", - "8e790e81fffa7f51d099f710bd8f82cf": "{} teste de arquivo yml falhou,{}", - "371acfea202589c4efd6724888f66595": "{} Download concluído!", - "51cf61e34b3f71ce1e430cdfcf129b80": "{} Falha na descompactação", - "c59b65890496cdf2b14d127a1f76f73d": "{} extraído com sucesso", - "0117718c35c7a16a62de5c259e1d35ee": "Falha na criação do diretório pelos seguintes motivos: {}", - "374e3fe41b55a0b29420e455fb514dd6": "O volume de armazenamento foi criado", - "6d0d40f64f89227daf345eb2257638e8": "{} não pode conter Espaços", - "a00b49ace55de909015029a0d6d6096f": "{} não pode ser nulo!", - "54498312bb8f97ce07a9a0b0b47cfad1": "A porta do servidor [ {}] está ocupada, mude para outra porta!", - "47b74e08252747225c49ea0cb011c79e": "Falha na inicialização do projeto {}", - "838089af9a2941a49862f342c056a8ca": "Começar a criar o projeto", - "9b149598fb30f54fec9e82a3d121a464": "{} já existe, altere o nome do projeto", - "634370637f6a5b88940c75f826953d0c": "Falha ao criar diretório do projeto do usuário, detalhes: {}", - "f7b14d3f642d711a23d5a0cca725fd0d": "Falha ao copiar diretório do projeto. Detalhes: {}", - "7bdaccb3d20432c5e0150862ab1cc3f3": "Faltando parâmetro name", - "9b90b5b49486a61d9b0e6dbbbcb56cad": "Faltando parâmetro container_info", - "b23d7110e9bf6539b4964afe0d4934e2": "O agrupamento já existe", - "a90ca6939fe71693c145f50596c6e0e6": "O contêiner {} já foi adicionado pelo grupo {}!", - "e3cf7e2f2d14257e7ea33657b135d534": "Falha ao adicionar:{}", - "fcbeb38a63ced9d3de476fb08c31d71e": "Faltando parâmetro id", - "fe4e0032f69b4100ed143d475e8b5050": "Edição com Sucesso", - "6c4ed52bea35c4c43839b8f0b44489f9": "Falha na edição:{}", - "6c0129a45e9da4e1820335f3d06a869f": "Falha na exclusão:{}", - "2a743a86676fd52214d3c0af1b0238b5": "Erro no parâmetro status", - "f95136e5c1f3ccbb09ace8fc24f1e0ca": "Operação do contêiner [{}] falhou", - "2e01172e31495f41fcebcf3f831cc82c": "Operação bem-sucedida", - "244a98f8c45f938980f48b168aef02c9": "Falha na operação:{}", - "fc431240dfc80a731900d5f2ddb6dfc3": "Ordem de início do contêiner {}", - "5ea6c6eea14c24c92eeeccaeea5c46dc": "Estado inválido!", - "0f3f874698792dc81c7c00b9e74fea34": "{}\\r\\n", - "aad4acc1243565c5c2ca41e5733e5fe0": "bem-sucedido\\r\\n", - "d8f5a29760a4f000dd754819b1faadcc": "falhou\\r\\n", - "73977612ef83925db43df7745df9c5eb": "\\r\\nSem resposta por mais de 10 minutos!\\r\\n", - "6345c76d66a8a9e9cdd3f9d996ff062d": "Por favor, passe o cmd", - "bba401eadefa8222f3e60a312cc19f34": "Apenas comandos docker run ou docker pull podem ser executados", - "b5592904212696df3e5bcec990c8676a": "Existe comando perigoso: [ {}], execução não permitida!", - "cfff471dc04b6ba4aeb2cc2844b2c94b": "Existe símbolo perigoso: [ {}], execução não permitida!", - "f1d9b154a0c2625d828a504a8cb35682": "O comando foi executado!", - "45a0bbacbe8d5ea062167e88423e4573": "Servidor nginx ou apache não detectado, instale um primeiro!", - "bdaf560796795d6a303bc9a1d75a34c5": "Tipo de Projeto [{}] Domínio Existente: {}", - "4588a786e80c83c2cbde37b930c3d778": "A porta do servidor [ {}] não é usada, insira a porta em uso para reverter!", - "6888cf6586ce3c187150146a2d1db0ac": "Falha ao adicionar, banco de dados não pode ser gravado!", + "5395cc8155f62a666b8f0d0f9f207676": "Informações do repositório já existem!", "9f9663b59d32947ff1f2c5b364c571b8": "adicionado com sucesso!", - "e6bddfc6a0bbf72d592236c61b411f9a": "Falha ao adicionar com erro: {}", - "1bfa1b1738332c4835f5efe7c54ab9c2": "erro de parâmetro!", - "0d66954ff42aa042c219a356266f5bc0": "Nenhuma informação de proxy reverso detectada!", - "ae178e022cf2fe30f402145572528de8": "Nomes de volumes não podem ter menos de 2 caracteres!", - "365c770f123d22093084908ebcdc75fc": "Nome do volume já existe!", - "2dc51ae60242f0e5b56a9f0d176f91d4": "falha na adição {}", - "307feea9ab8928f39595316b11992cb1": "Tags de opção de driver devem ser pares dicionário/chave-valor!", - "f529949f8a98615c109ee8b8eb9f7656": "Falha ao adicionar! {}", - "a4ec5c1fa47f2ce0c875f91ea4e7dd08": "O volume de armazenamento está em uso e não pode ser excluído!", - "11ff7153b67d275618dd3a62d1e56373": "O volume de armazenamento não existe!", - "2aa70dad9bff94a855fdde3fc113e6c5": "Falha ao excluir! {}", - "55c31f03e88bd6ad4ce7f68d425648dd": "Nenhum volume de armazenamento inútil!", - "6169a7282b361deb5f6f5b6e18f9426e": "erro no parâmetro cmd", - "286933a4f24bee0eed1f9300f70a30c7": "Apenas o comando docker run pode ser executado", - "a46a6b274dcbfc5a629d234c2816a165": "Existem símbolos perigosos: [{}],Execução não permitida!", - "8135363a6a5e2c145c6cedab8ac1e510": "O formato da porta está errado, este método não é suportado!", - "3b825826968319b6256c4020cc49676f": "A porta do servidor [{}] já está ocupada, substitua-a por uma porta diferente!", - "70b35bb3bb2fe425a981e8cc68c06906": "Por favor, faça o pull da imagem que você precisa", - "e768fcd4ff22e2f3cc2535f1ea9c5682": "A imagem não existe!", - "7dc29c1ed7012513111b11f56c73a4f8": "A cota de memória excedeu o montante disponível!", - "73aff7a8ab244bc5d0d1448e9a0ae6f0": "A cota de memória não pode ser inferior a 6MB!", - "2c4eca852599890038970a7e0f384470": "A imagem [{}] não existe, você pode tentar [Forçar Pull]!", - "56a727f1edc5f008ee8f41a638662322": "A cota de cpu excedeu os núcleos disponíveis!", - "45c163fd880ce5a21373fbd53bbcd642": "A reserva de memória não pode ser inferior a 6MB!", - "bf6b8400e1726aadf1cee7d6c1c5d173": "O formato do nome da imagem está incorreto. ex: nginx:latest", - "f0beb6e739348ae10c9f15cb91638d2f": "Falha na criação do contêiner, detalhes: {}!", - "e5d4020fc5f8c26e22add8db8a62f06a": "A cota de memória não pode ser menor que a reserva de memória!", - "c68d012ef602a12e38636c306c10c894": "O nome do contêiner ou bridge de rede já existe. Altere o nome do contêiner e tente novamente!", - "c4272ed0aaf1e7e2bcc08f1003c2391d": "Não há comando de inicialização nesta imagem, especifique o comando de inicialização do contêiner!", - "a73eb9f1fb82232c9f70bb80024a9d9c": "Exceção de permissão! Detalhes:{}", - "196a4f415d73b007e0627563a530967e": "Falha na criação do contêiner! Reinicie o serviço docker no momento apropriado!", - "ea7b2beec49a425b5742339d00a5aeb8": "A imagem [{}] não existe!", - "c29c7e4f72858367cd21d10303411592": "O nome do contêiner já existe!", - "c4dc041770b8a0e34d1399141d0e4de8": "O nome do contêiner é inválido", - "97bcbd1e3b4df0f1c6ec642e7be17afe": "Porta do servidor {} em uso! Mude para outra porta", - "994e5a057aca3524ba773ec33228e184": "Falha na criação! {}", - "00ff90441ea0bdece5d9e5c72efa14a7": "A criação do contêiner falhou e a conexão com o docker expirou!", - "8879635d66ad75dcbfc8c31ba1351116": "Falha ao executar o contêiner! {}", - "71dc70f7ab3abc0c2a7141718d3a9b2": "Falha na criação!", - "1983b37067c7e94095a5113786fdef9c": "Falha na edição, conexão com docker expirou, reinicie o docker e tente novamente!", - "c558fedcb5850939202e684ff32c7c50": "Falha na atualização!{}", - "ed0029af5f77a5dfacbc2452e8c3ec92": "O ID do contêiner é anormal", - "c5b3db7efde90edcb803a4a79e559b21": "O novo nome da imagem não pode estar vazio!", - "b10305369ebb41ef24699b8137733465": "A imagem não existe!", - "9e90efb62702b147b71e8731290caf44": "A imagem [{}] não existe, tente verificar [Forçar pull da imagem] e tente novamente!", - "6cfa55c53df6db8efa59aa2ae6cef97a": "O novo contêiner não foi criado com sucesso, e o contêiner antigo foi restaurado. {}", - "1f004e412319b7ed472624e011b3d2ba": "Atualização bem-sucedida!", - "a2ea046c20d2da5cebf2dea01a62dabe": "Falha na atualização! O estado do contêiner foi restaurado", - "b84bf4d95051856f9965b55bb5402de3": "O contêiner não existe!", - "d567f353b12e618571935661f31c2a16": "A edição do contêiner falhou e a conexão com o docker expirou.", - "f2124ee490df203b3f86509401c76a09": "O contêiner foi editado com sucesso, e a sub-rede não é especificada quando a rede [{}] atualmente especificada é criada, e o IP não pode ser personalizado, e o IP foi atribuído automaticamente a você!", - "b95d75cd8e04e9cca297c3cd1091b2eb": "O contêiner foi editado com sucesso, a configuração da rede [{}] falhou e o endereço IP foi atribuído automaticamente a você, detalhes do erro:{}!", - "4363bb34365a67238ecc6a98ce46b361": "A imagem foi gerada, e {}", - "4bb30e8d57a6a7e548758daf4ac33983": "enviado com sucesso!", - "a32e1f09fc2739d94c51a7168675e0e9": "Falha no Envio!{}", - "172f51d3307b02aeb6dc703a442f4724": "Falha ao obter contêiner", - "684fc00ae67504a56c09ef71431b1261": "Exportado com sucesso para:{}", - "f9a48b804d917398e795016687f3b0f4": "Por favor, desative o [Anti-adulteração para Empresas] antes de tentar!", - "3ab9d9b76e8d22434930622b5f0acc6a": "O contêiner foi excluído!", - "d1fe1d6e5e8c17b60f749ad36ff3bcaa": "A porta do servidor ipv6 [ {}] está ocupada!", - "9f13645ac42f0c9908a35637a525d561": "A porta do servidor ipv4 [ {}] está ocupada!", - "8708a53096a7d7bce5d3042be8feb736": "Parada bem-sucedida!", - "5dc7c5bba9e3ff6d293a9cd6459bc1ae": "O contêiner pausou.", - "458c9e6b1324cc3843c313c99a9c8623": "Falha ao parar!{}", - "d40b23e847e0619c6e2133eebfd51807": "O ID do contêiner está vazio", - "239aa38adb7ae2339600a015d8695f3d": "O contêiner não", - "b10f78da3571670e8567e599aba8d475": "Falha ao obter informações do contêiner!{}", - "4e62f10d98b7560d22cf614879790624": "Sem registro de contêiner", - "4bfb779dfe8300c1f2da1f1dae06a4ce": "falha na conexão docker", - "e9b0defc5226436d7d2580972376cad0": "erro de parâmetro, Passe: type", - "d0e42e6dd40adc10d0027ab9993d8741": "O diretório de log do contêiner não existe, o corte de log não pode ser definido!", - "3af555ace78d310a5db6e9449ed6843b": "Aberto com sucesso!", - "641fe4d504d197e8570f3bc693f5c15b": "Fechado com sucesso!", - "e04e8dc32dc0f13aea94cb4996a0057c": "O arquivo de log não existe", - "3e0f56b62a18226db6b8c71e8c917be4": "A limpeza do log foi bem-sucedida!", - "81259d9e5861e65db29844c19d9feb80": "Nenhum contêiner inútil!", - "53a5658dfa0a2e85083fd63b961d35be": "excluído com sucesso!", - "dac7d97aeb94cf9d3b3b5d7d072c4cff": "Por favor, desative a proteção contra adulteração empresarial antes de tentar novamente!", - "32ca87e65c5fc75d3857767417b56439": "falha ao excluir! {}", - "b0ea22ff0b389c2a32b8f4367ab650db": "Erro de parâmetro, por favor passe a política de reinicialização restart_policy!", - "179a2001e96bb8d0475488f80c7216a8": "Atualizado com sucesso!", - "3b2f70397fa8a27c7146cbd900f7222": "Falha na atualização! {}", - "c147897a9d1746a58de531e9c0158c23": "O contêiner não foi iniciado e não pode ser renomeado!", - "a89c2e8f7eb81399f984330e55014c6f": "Renomeado com sucesso!", - "8a615b544c027899738b19f2cc40fd93": "Falha ao renomear! {}", - "3506ae5524d7b5dbd75ed328349e065e": "Definido no topo com sucesso!", - "363b76cd4207ec1adb31b9f7ee3930c8": "Desafixado com sucesso!", - "0fffc4397713115e14ef45273241dfbb": "Erro de parâmetro, por favor passe: remark!", - "dce2cbc7791016e4876ab144e53b4f82": "Erro de parâmetro, por favor passe: id!", - "ca1bc3e1d32b99b90395da47b88576a9": "Erro de parâmetro, por favor passe: ws_callback!", - "b4770fb21a608a5ba1ecacae409093d0": "Erro de parâmetro, por favor passe: _ws!", - "11cde3a2ca81c845978b98e4a6ec471e": "O tempo de salvamento do monitoramento deve ser um número inteiro positivo!", - "b314fb25bf654a2256bf53b0f6986c93": "Os dados de monitoramento não podem ser mantidos por mais de 999 dias!", - "60e46aeaed758964902dd7ae99858f03": "Lá", - "c28bc5c07ec6f2b56777ac7c852dd64b": "Configuração Bem-sucedida!", - "422f78617d6852c41e370982d73235ed": "Falha na configuração! Motivo da falha:{}", - "dca5bd22c99a74f74074a3a53d78a58b": "{} sucesso", - "ec1ec17a5862a949e277432e1d09484d": "Falha na configuração! Motivo da falha :{}", - "f4dc83b81fe6993f99c2b54494eeeec1": "Monitoramento iniciado com sucesso!", - "af79fd88d4b6f7e8a1ac05e199747fdb": "Falha ao iniciar monitoramento!", - "6f4d03d4d1ee0bd282ea744730b7ceda": "Monitoramento do Docker parado com sucesso!", - "4cc06d8560bb116a38a5aae1458cbe4a": "O caminho do arquivo docker-compose não pode estar vazio!", - "8d885b86e8562c2128689c4a2601c054": "O arquivo docker-compose não existe!", - "a87b64b2d19f29438274f80ce36a3579": "A tarefa de instalação foi adicionada à fila!", - "d388487780fba74e4ff3f3b9ffbce58b": "Pode ser desinstalado!", - "c4ba6d01fd53333a6e7e85707758c550": "Desinstalação bem-sucedida!", - "b7affa7cc663144bc99b9edb3f1a027f": "A tarefa de reparo foi adicionada à fila!", - "cb49a4daafc9d27bd460967891968225": "Salvo com sucesso!", - "58fcf0699f38a60c8025330585ac205a": "Falha ao salvar, motivo: {}", - "6c3e5d603d8845422e861fb0b4eed350": "Um item de configuração que não", - "f324009782d2d9e73d1087884ebc2c4c": "A raiz do Docker não pode estar vazia!", - "538960e1336f919e37a0d2c024c56830": "O diretório raiz atual do Docker é o diretório de destino e não precisa ser alterado!", - "f2bd8f0373084151bbc07e8c1409e37c": "Falha na configuração!{}", - "a848bbd79221dfdce1c9dca536dbfada": "O formato JSON das configurações de proxy está errado!", - "edf6eb680187066c4dea216b3b20d6d2": "Configuração de proxy bem-sucedida!", - "720d2290c3082615c0f79894bfdcabd7": "Por favor, insira o endereço IPv6 correto!", - "b01f9411136207ad7df28b9bf2387e2a": "Falha na atualização! Motivos da falha:{}", - "da896b628e3ded58445e4b015320f327": "Sobrecarga falha devido a:{}", - "efb869976990f78b3d6fcbaf270e3323": "Recarga bem-sucedida!", - "1b3b50aa7886ea66845ced2c18cbf6b1": "Falha na sobrecarga do perfil global:{}", - "75bbb7a00c3b5b510913952fe089f52a": "Parâmetro errado, parâmetro de caminho!", - "273609d18876f5f9e3f021032e5b57a3": "Falha na configuração!", + "9b10e472adfe6372c9175b9002f098fd": "[Repositório Docker Oficial] Não editável!", + "5858be44c285048a8f51c126b2fd23e9": "Edição falhou! Razão: Descriptografia da senha da conta falhou! Exclua o repositório e adicione novamente", + "7e51d0e26e1b467aff3c89d3e0751ec0": "Edição falhou! Razão:{}", + "6478f13dd58e5a4329e19be9020243ff": "Este repositório não pôde ser encontrado", + "d5309f3186607eb36bee41e8a28cea3a": "Edição com sucesso!", + "9e20bffc0d4093d18fcbc5c98fa0fd87": "[Repositório Docker Oficial] não pode ser removido!", + "a62336a87697ab6911ba550015a798ef": "Exclusão falhou, o id do repositório pode não existir!", + "c28bc5c07ec6f2b56777ac7c852dd64b": "Configuração Bem-Sucedida!", + "f2bd8f0373084151bbc07e8c1409e37c": "Configuração falhou!{}", + "657a0b7e82731fb4ae516d14081f17d0": "Teste de login falhou! Razão: {}", + "54197759827cfaf0cdb1e213fa49771e": "Teste de login falhou! Razão: Pode ser erro de senha da conta, por favor verifique!", "5e022f79dcc774c79bc55ee28774e2e7": "O nome da imagem não pode conter /", "c00be60f9f3f7d747aadfdb124e855ef": "Salvo com sucesso em:{}", - "cb1f8d99b492340cf701101c87884a8c": "Não é possível exportar a imagem!", - "afaa91d141ded3e37b8b9ebf8bc31c51": "A exportação da imagem falhou e a conexão com o docker expirou. Tente reiniciar o docker e tente novamente!", + "cb1f8d99b492340cf701101c87884a8c": "Não é possível exportar imagem!", + "afaa91d141ded3e37b8b9ebf8bc31c51": "Exportação da imagem falhou e a conexão com o docker expirou. Tente reiniciar o docker e tente novamente!", "5b980f2e1c82c04c91376d55d4306a91": "Falha ao exportar imagem!
{}", "e5e8c7cac8b71e94280fa08301d21e78": "Por favor, insira o caminho da imagem!", "5441400ea3bd16cffdf70c46c34f61d4": "Falha ao importar a imagem. A extensão do arquivo deve ser .tar!", "0720c6c4f478b3a374b4a438f7cf80ad": "Falha ao importar a imagem, a conexão com o docker expirou, tente reiniciar o docker e tente novamente!", - "22cc0388137842df9649b3bbcff345e8": "Se a importação da imagem falhar e o diretório temporário do contêiner não for criado, verifique se o software de proteção possui um registro de interceptação.", - "67b97e4746a2faf5d59206a80bb28649": "A importação da imagem foi bem-sucedida!{}", - "deceb44868a29ae5d579114348736cbb": "A importação da imagem falhou e o diretório temporário do contêiner não pôde ser criado. Verifique se o software de proteção possui um registro de interceptação!", + "22cc0388137842df9649b3bbcff345e8": "Se a importação da imagem falhar e o diretório temporário do contêiner não for criado, verifique se o software de proteção tem um registro de interceptação.", + "67b97e4746a2faf5d59206a80bb28649": "Importação de imagem bem-sucedida!{}", + "deceb44868a29ae5d579114348736cbb": "A importação da imagem falhou e a criação do diretório temporário do contêiner falhou. Verifique se o software de proteção tem um registro de interceptação!", "8eb05618b0f04e727b0685427fd49c8e": "Falha ao importar imagem!
{}", "721aa02577670c1049ea9d12caa8938c": "Por favor, insira o caminho correto do DockerFile!", - "736df9a7c491f3299efdeb9f7d7e9e0f": "Imagem construída com sucesso!", - "6e85568dae869303ca7a4486f55458a3": "Falha na construção, tempo limite de conexão esgotado", - "5bb301b85cc1f42e56174d3d9a4c0286": "Falha na construção! {}", - "f51455b323ec2db8004c812001043330": "Falha na construção! O Dockerfile especificado não foi encontrado", - "8e1b9c9b75950d0feba6813d32766e61": "Falha na construção!{}", - "eba0ec758a6464a20c14c0f23ceee62e": "Imagem excluída com sucesso!", + "736df9a7c491f3299efdeb9f7d7e9e0f": "Construir imagem com sucesso!", + "6e85568dae869303ca7a4486f55458a3": "Construção falhou, tempo limite de conexão", + "5bb301b85cc1f42e56174d3d9a4c0286": "Construção falhou! {}", + "f51455b323ec2db8004c812001043330": "Construção falhou! O Dockerfile especificado não foi encontrado", + "8e1b9c9b75950d0feba6813d32766e61": "Construção falhou!{}", + "eba0ec758a6464a20c14c0f23ceee62e": "Espelho excluído com sucesso!", "8dd326278d09a3ac4bc56cf725c8f262": "A exclusão falhou e a imagem pode não existir!", "11ead921bc0e3d94f1f9e0db4bf8ed8d": "O ID da imagem é usado em mais de uma imagem, force a exclusão da imagem!", "43993616c7433350755d30a3b4d065dd": "A imagem está em uso. Por favor, exclua o contêiner antes de excluir a imagem!", "d6992c3fcf2269c249cd5f18f1ac2c11": "Falha ao excluir imagem!
{}", - "0c6c071174fde5b47c9eef8088c17a89": "Falha ao excluir imagem, a conexão com o docker expirou, reinicie e tente novamente!", - "a3ba80a8e1e0d9af94c809e909431b3c": "falhou, login no repositório [{}] falhou, tente fazer login neste repositório novamente!\\r\\n", - "cc40077b6ee61fbfa35713a21e8eb866": "bt_failed, login no repositório [{}] falhou, tente fazer login neste repositório novamente! {}", + "0c6c071174fde5b47c9eef8088c17a89": "Falha ao excluir imagem, A conexão com o docker expirou, reinicie e tente novamente!", + "0f3f874698792dc81c7c00b9e74fea34": "{}\\r\\n", + "a3ba80a8e1e0d9af94c809e909431b3c": "falhou, Login no repositório [{}] falhou, tente fazer login neste repositório novamente!\\r\\n", + "cc40077b6ee61fbfa35713a21e8eb866": "bt_failed, Login no repositório [{}] falhou, tente fazer login neste repositório novamente! {}", "60b488c60b6747bf34a86a69740b636d": "A imagem enviada não pode conter [/], use o seguinte formato: imagem:v1 (nome da imagem: versão)", - "44dbec830b87eb037e8fcbb0e1b56160": "Não foi possível enviar para o repositório público Docker!", + "44dbec830b87eb037e8fcbb0e1b56160": "Incapaz de enviar para o repositório público Docker!", "b4c46001066c912344e3bdb0df86e848": "Login no repositório [{}] falhou!", - "0ebfb094c6482acb049e0dd0d3107307": "Falha no envio (push), erro de etiqueta da imagem, insira como: v1.0.1", - "d26bdd6e86002ed92089dc71347822ce": "Falha no envio (push), não tem permissão para enviar para este repositório!", - "82058092ad7d2c7aa5e2f012b6544e59": "Falha no envio (push)!{}", - "2b228d4775d23d2725ec227ba648bd43": "Envio (push) bem-sucedido, imagem:{}", - "9e396f640866ded9c3a47268f96a36e3": "Baixando (pulling) a imagem, aguarde...\\r\\n", - "7e5f4d488d318dc7c235095c8456f5e4": "Baixar (pull) ou pesquisar imagens...\\r\\n", - "97a6dfe3a273202edffe31af7a43e220": "Falha ao usar a estação de espelhamento padrão para baixar a imagem! Tentando usar outra estação de espelhamento para baixar para você, aguarde...\\r\\n", + "0ebfb094c6482acb049e0dd0d3107307": "Envio falhou, erro de etiqueta de imagem, insira como: v1.0.1", + "d26bdd6e86002ed92089dc71347822ce": "Envio falhou, não tem permissão para enviar para este repositório!", + "82058092ad7d2c7aa5e2f012b6544e59": "Falha no envio!{}", + "2b228d4775d23d2725ec227ba648bd43": "Envio com sucesso, espelho:{}", + "9e396f640866ded9c3a47268f96a36e3": "Baixando a imagem, por favor aguarde...\\r\\n", + "7e5f4d488d318dc7c235095c8456f5e4": "Baixar ou procurar por imagens...\\r\\n", + "97a6dfe3a273202edffe31af7a43e220": "Falha ao usar a estação de espelho padrão para baixar a imagem! Tentando usar outra estação de espelho para baixar para você, por favor aguarde...\\r\\n", "484616540fc726ef4f52e97a1c2f0fef": "Falha ao baixar imagem!\\r\\n", "1cd77329b2bddfb200e656214b1fdf32": "Falha ao baixar a imagem!", - "63c709b9759af42fef890d539d822575": "Falha no download (pull)!{}\\r\\n", - "b4aba972332d1f3728171905a033fb99": "Download da imagem [{}] bem-sucedido\\r\\n", + "63c709b9759af42fef890d539d822575": "Baixar falhou!{}\\r\\n", + "b4aba972332d1f3728171905a033fb99": "Download de imagem [{}] bem-sucedido\\r\\n", "2fae21ffd185d9e9730b39bc7de23852": "Imagem baixada com sucesso!", "8a635442294fd90195a43d9a1672fc3f": "Falha ao baixar imagem!", - "711de72d616e7abb29dfa919244d382d": "Falha no download, a imagem não existe ou pode ser uma imagem privada. Você precisa inserir a senha da sua conta dockerhub!\\r\\n", - "e9511e26273da5b4537b4683668b548e": "falha no download (pull)!{}\\r\\n", - "05d13bf5dcc37754db74b2356e6e117c": "falha no download, não existe tal imagem no repositório!\\r\\n", - "714841af7f3de6c8d99ba03f4cee0ee5": "falha no download, O formato da imagem está errado, como: nginx:v 1!\\r\\n", + "711de72d616e7abb29dfa919244d382d": "Baixar falhou, A imagem não existe, ou a imagem pode ser privada. Você precisa inserir a senha da sua conta dockerhub!\\r\\n", + "e9511e26273da5b4537b4683668b548e": "baixar falhou!{}\\r\\n", + "05d13bf5dcc37754db74b2356e6e117c": "baixar falhou, Não existe tal imagem no repositório!\\r\\n", + "714841af7f3de6c8d99ba03f4cee0ee5": "baixar falhou, O formato da imagem está errado, como: nginx:v 1!\\r\\n", "2d941c4fa4da32ccafa8670a07f23c1d": "A imagem foi baixada com sucesso.", - "5282194697748d9fcd1ccd8a90428424": "Pode não haver esta imagem espelhada.", - "d6facab17334983e7c6f8c561c239820": "Falha ao baixar a imagem, esta é uma imagem privada, por favor, insira a senha da conta!", - "b507deb7848d566982b339265c8f5482": "Falha ao baixar imagem

Motivo: {}", - "e90811ef0a60b6d299b4e1064d7788d0": "Nenhuma imagem inútil!", + "5282194697748d9fcd1ccd8a90428424": "Pode não haver esta imagem espelho.", + "d6facab17334983e7c6f8c561c239820": "Falha ao baixar a imagem, esta é uma imagem privada, por favor insira a senha da conta!", + "b507deb7848d566982b339265c8f5482": "Falha no download da imagem

Razão: {}", + "e90811ef0a60b6d299b4e1064d7788d0": "Sem imagens inúteis!", + "86eb5f101087c690c1229fffceb97cba": "excluído com sucesso!", "f343313c101aeaff0516990ebea3dcef": "falha ao excluir!{}", "90ecd58b3feb0b2be11f0af685ad39fe": "A exclusão de imagens inúteis falhou e a conexão com o docker expirou. Tente reiniciar o serviço docker e tente novamente!", "0568e5e8aa7c811dd420c818189a0d46": "segundos atrás", "53c53a79f864561f8b6886b3dde7cd51": "minutos atrás", "f329a0dab82282e50e3aea9260e95d53": "horas atrás", "7a1af30a5ce889031cbc2472766159e3": "dias atrás", - "558a41d55884223583b3542e802d2b64": "O nome da imagem não pode estar vazio!", - "4097585e32152eb74bbee5ab8c463718": "O serviço docker está sendo executado de forma anormal, reinicie e tente novamente!", - "26a0931677e111565f3ff7d059b94d8b": "A configuração do gateway está errada, insira um gateway que corresponda à sub-rede: {}", - "def2ba1ce0e4d77692c14e5b984636fa": "Erro de formato de endereço de sub-rede, insira por exemplo: 172.16.0.0/16", - "716eeeb727fd667635ccf1d18891d46e": "Erro de formato de intervalo de IP, insira o intervalo de IP apropriado para esta sub-rede:", - "e310a873e7812c7f994d482604061fee": "O intervalo de IP [ {}] já existe!", + "558a41d55884223583b3542e802d2b64": "O nome do espelho não pode estar vazio!", + "aad4acc1243565c5c2ca41e5733e5fe0": "bem-sucedido\\r\\n", + "d8f5a29760a4f000dd754819b1faadcc": "falhou\\r\\n", + "73977612ef83925db43df7745df9c5eb": "\\r\\nSem resposta por mais de 10 minutos!\\r\\n", + "6345c76d66a8a9e9cdd3f9d996ff062d": "Por favor, passe cmd", + "bba401eadefa8222f3e60a312cc19f34": "Apenas comandos docker run ou docker pull podem ser executados", + "b5592904212696df3e5bcec990c8676a": "Comando perigoso existe: [ {}], execução não permitida!", + "cfff471dc04b6ba4aeb2cc2844b2c94b": "Símbolo perigoso existe: [ {}], execução não permitida!", + "f1d9b154a0c2625d828a504a8cb35682": "O comando foi executado!", + "ae178e022cf2fe30f402145572528de8": "Nomes de volume não podem ter menos de 2 caracteres!", + "365c770f123d22093084908ebcdc75fc": "Nome do volume já existe!", + "2dc51ae60242f0e5b56a9f0d176f91d4": "adição falhou {}", + "307feea9ab8928f39595316b11992cb1": "Tags de opção de driver devem ser pares dicionário/chave-valor!", + "f529949f8a98615c109ee8b8eb9f7656": "Adição falhou! {}", + "2a0f93407bb61e2403ccd032cbc64e3e": "excluído com sucesso", + "a4ec5c1fa47f2ce0c875f91ea4e7dd08": "O volume de armazenamento está em uso e não pode ser excluído!", + "11ff7153b67d275618dd3a62d1e56373": "O volume de armazenamento não existe!", + "2aa70dad9bff94a855fdde3fc113e6c5": "Exclusão falhou! {}", + "55c31f03e88bd6ad4ce7f68d425648dd": "Sem volumes de armazenamento inúteis!", + "0af5787b053c4bf5dbe610731f7d4199": "O caminho do arquivo não pode conter caracteres chineses!", + "719ee030d81490fc055af0c4426aacb9": "Detecção falhou: {}", + "ee3936ffdc910e2cb8578ad1fae322f0": "Detecção passou!", + "2e5c9168b81de403131125abe3537861": "Nomes de modelos não podem conter caracteres especiais; apenas letras, números, sublinhados, pontos e sublinhados são suportados", + "1ef49203b5ddab4a6b30eddab93c6d73": "Este nome de modelo já existe!", + "356dbf2911e78ebedbd99f13df311ce1": "Modelo adicionado com sucesso!", + "4f6a25bc1019404777b1a95b85c375f3": "Não alterou o modelo!", + "029a1a33fb7a828191eac587a4d98db4": "Erro de formato de conteúdo do modelo, insira um modelo docker-compose válido!", + "052009ea42871f16153ca6fb451be303": "Modelo modificado com sucesso!", + "550993f7a7c3863e988dc02458bb413b": "Este modelo não foi encontrado!", + "c541f51f11868ef56cf50524eeddd226": "O item não foi encontrado!", + "c3f9a083e42b21151560ba7e23667129": "O modelo não foi encontrado!", + "d5d3eedff8acf67756e21b4612aaa380": "O nome do contêiner já existe!:
[{}]", + "05073a33c4bfcb8113af6b3222a0cccd": "Esta porta [{}] já é usada por outros modelos", + "69a22232c25cb907570f837e4032ed7e": "Erro de parâmetro, por favor passe template_id!", + "35698a69135017d7f8345e32cb5a87fe": "Este modelo não foi encontrado ou o arquivo está corrompido!", + "49d5a6420e1b84d63826fa1d79e5236d": "Arquivo de modelo não existe", + "e199ad07ae94664293828e753ec2a9a8": "Modelo [{}] foi implantado pelo projeto: [{}], mude um modelo e tente novamente!", + "a3017095090064d0ec98861e35d3849c": "O nome do projeto já existe!", + "a9a92ec33cfb8eb3288cfc84edcd48ad": "Implantação bem-sucedida!", + "a180787fbf3d2e3fac72a13cb98ce513": "docker-compose muito baixo, atualize para a versão mais recente!", + "d8b370ee0351106fe38046541c421361": "O nome do projeto não foi encontrado!", + "30159c83433a6845a080ad879c0fb61d": "A limpeza foi bem-sucedida!", + "6483a5effa8c7ebce28c3838ee6f6e6e": "Limpo com sucesso!", + "5ded1fa085b4c46667f9c8871d00a46c": "{}O projeto falhou: {}", + "0e0ae38580f51369586ba6933a7c3105": "Parâmetro project_id faltando!", + "78f91123fc323aab6eb38f2bfb8e26d7": "Configuração do projeto não encontrada!", + "c3905cecf4f4eb28fcee1f4a4ad21bb0": "O parâmetro de status está faltando!", + "f3655b96aad3f0771354a12af79571dd": "Parâmetro template_id faltando!", + "79f89afa2eaf7c8da6f0ac44295dba90": "Não fez", + "5b0854983625160cfbf1295ceb6ec327": "Baixado com sucesso!", + "ce932f534479bae87f0615fa7214e5a1": "Incapaz de varrer o diretório raiz", + "bf3d793f9f908f7d2d26a1be8dbb80fe": "O caminho não existe!", + "d2fe452a7fa69442d5296b8e4832ede3": "Modelo adicionado com sucesso: [{}]", + "8d92d05b95b166c5683fdb88f7de8bed": "Falha ao adicionar modelo: nome do modelo já existe ou está formatado incorretamente [{}],Use docker-compose -f [especificar arquivo compose.yml] config para verificar", + "428ed92bf9d3198f4c9885c11fdb2be3": "Estes modelos tiveram sucesso: [{}]
Estes modelos falharam: o nome do modelo já existe ou está formatado incorretamente [{}]", + "70975749d256333f1b3b62c864ca265a": "Falha ao modificar!", + "2360e954ae9eecac28b2a3edad5e8ce0": "Modificado com sucesso!", + "11cde3a2ca81c845978b98e4a6ec471e": "O tempo de salvamento do monitoramento precisa ser um número inteiro positivo!", + "b314fb25bf654a2256bf53b0f6986c93": "Dados de monitoramento não podem ser retidos por mais de 999 dias!", + "60e46aeaed758964902dd7ae99858f03": "Lá", + "422f78617d6852c41e370982d73235ed": "Configuração falhou! Razão da falha:{}", + "dca5bd22c99a74f74074a3a53d78a58b": "{} sucesso", + "ec1ec17a5862a949e277432e1d09484d": "Configuração falhou! Razão da falha :{}", + "179a2001e96bb8d0475488f80c7216a8": "Atualizado com sucesso!", + "f4dc83b81fe6993f99c2b54494eeeec1": "Monitoramento iniciado com sucesso!", + "af79fd88d4b6f7e8a1ac05e199747fdb": "Falha ao iniciar monitoramento!", + "6f4d03d4d1ee0bd282ea744730b7ceda": "Monitoramento Docker parado com sucesso!", + "4cc06d8560bb116a38a5aae1458cbe4a": "Caminho do arquivo docker-compose não pode estar vazio!", + "8d885b86e8562c2128689c4a2601c054": "Arquivo docker-compose não existe!", + "a87b64b2d19f29438274f80ce36a3579": "A tarefa de instalação foi adicionada à fila!", + "d388487780fba74e4ff3f3b9ffbce58b": "Pode ser desinstalado!", + "c4ba6d01fd53333a6e7e85707758c550": "Desinstalação bem-sucedida!", + "b7affa7cc663144bc99b9edb3f1a027f": "A tarefa de reparo foi adicionada à fila!", + "cb49a4daafc9d27bd460967891968225": "Salvo com sucesso!", + "58fcf0699f38a60c8025330585ac205a": "Falha ao salvar, razão: {}", + "6c3e5d603d8845422e861fb0b4eed350": "Um item de configuração que não", + "f324009782d2d9e73d1087884ebc2c4c": "O root do Docker não pode estar vazio!", + "538960e1336f919e37a0d2c024c56830": "O diretório raiz atual do Docker é o diretório de destino e não precisa ser alterado!", + "a848bbd79221dfdce1c9dca536dbfada": "O formato JSON das configurações de proxy está errado!", + "edf6eb680187066c4dea216b3b20d6d2": "Configuração de proxy bem-sucedida!", + "720d2290c3082615c0f79894bfdcabd7": "Por favor, insira o endereço I Pv 6 correto!", + "b01f9411136207ad7df28b9bf2387e2a": "Atualização falhou! Razões para falha:{}", + "da896b628e3ded58445e4b015320f327": "Sobrecarga falha devido a:{}", + "efb869976990f78b3d6fcbaf270e3323": "Recarregamento bem-sucedido!", + "1b3b50aa7886ea66845ced2c18cbf6b1": "Falha na sobrecarga do perfil global:{}", + "75bbb7a00c3b5b510913952fe089f52a": "Parâmetro errado, parâmetro path!", + "273609d18876f5f9e3f021032e5b57a3": "Configuração falhou!", + "459ed27083c25b82135efedccaa60ada": "Escaneando comando de histórico de exceção {}", + "37c614d5d300e6c391808efd5363ec82": "Escaneando informações sensíveis {}", + "5ddc98a53573410c7cb65727946c5d3f": "Escaneando backdoor {}", + "6bb6be880d819a93af392183d16fccdf": "Escaneando fugas de contêiner {}", + "cd7fb7cf576b22469514b5b30f365158": "{}Escaneamento concluído", + "7d643f192968be3f8a54be28592e9176": "Falha ao escanear a imagem:{}", + "acc2731ee0f5b78d4e801d2daf814c32": "Comando de histórico anormal suspeito encontrado", + "3069c277261d044bb309e4b09ae798fa": "Foi descoberto que a imagem tem um comando histórico anormal [{}], que pode implantar malware ou código no sistema host quando o contêiner estiver em execução, causando riscos de segurança.", + "6d64734fff5534f48029ffba4aa3678d": "1.Recomenda-se verificar se o comando é necessário para negócios normais
2.Recomenda-se escolher infraestrutura oficial e confiável para evitar perdas desnecessárias.", + "6684913201a60be0b5e89c4dfb210719": "Backdoor bashrc encontrado{}", + "9a9f27d5f9f8c056fff7986c87a94c30": "Foi descoberto que a imagem tem backdoor bashrc: [{}], conteúdo de código malicioso:
{}", + "d8a828116070b9d92315ca309cca1991": "1. Entre no contêiner implantado usando a imagem e exclua o código malicioso sob o arquivo
2. Verifique se o contêiner foi invadido e atualize o token de acesso ou senha da conta do negócio no contêiner
3. Recomenda-se substituir a imagem oficial ou outros contêineres de implantação de imagem confiáveis", + "e1439f3f7d25d378078d513a82a3fa87": "Arquivo de backdoor encontrado{}", + "9ede9d4bd542eedf78e39b0acf0206e3": "Foi descoberto que o arquivo de backdoor bashrc [{}] existe na imagem, e o conteúdo do código malicioso é:
{}", + "686765b4612ecd8f774648db29a1541d": "backdoor cron descoberto{}", + "390bdc0b3c37a56ede9467b0c220a3b6": "Foi descoberto que o backdoor cron [{}] existe na imagem, e o conteúdo do código malicioso é:
{}", + "caea084281a3cb2515e5618cd3856163": "Backdoor do sistema encontrado:{}", + "d04061273caa56d5a0c3d74f3e9fd482": "Foi descoberto que o arquivo de backdoor systemd [{}] existe na imagem, e o conteúdo do código malicioso é:
{}", + "fc76e0fe415c49cc1c09bf76035fc4e9": "Backdoor sshd encontrado{}", + "00b2409f52ef5bc56afe29ccbe5cfa2c": "Encontrado o backdoor de link suave sshd: {}, o arquivo atinge o recurso malicioso [exe={};link_file={}]", + "e747da31a54cd71fb1a2860cae0f9f77": "Backdoor tcpwrapper encontrado{}", + "a2b09164c8d23894736bcc6a646861e0": "Foi descoberto que o arquivo de backdoor tcpwrapper [{}] existe na imagem, e o conteúdo do código malicioso é:
{}", + "a7fd9f6b190b8531039376fbbda5f482": "Usuários encontrados em risco de fuga{}", + "5d46ed5f4af3f30cfcc8bd66942f93b4": "O nome de usuário {} pode completar a fuga do contêiner através do comando [{}], permitindo que o atacante obtenha direitos de acesso ao host ou outros contêineres. Conteúdo malicioso:
{}", + "4ca0a18aa36a60613104cacdae514dec": "1. Recomenda-se excluir a imagem ou não usá-la mais
2. Se já houver um negócio usando a imagem, entre no ambiente do contêiner e exclua o conteúdo do usuário {} no arquivo /etc/sudoers.", + "611afea08ae3b216a34dfde4c143f46c": "Versão do sistema não suportada", + "221d1ea3c23f430e03a4486dca865014": "O contêiner não existe, atualize o navegador e tente novamente!", + "7e88e25ea6c628c2d03c526c04af3eed": "Falha ao obter status do contêiner: ", + "c0ef08aa7bd6276137ccd491a8041223": "Não há volume para fazer backup", + "584e35dd4a55da88bd232ac7a19b9b95": "A tarefa de backup foi criada com sucesso.", + "0b08674e1c87f3f8508a4ae9b0c160f8": "Falha ao criar uma tarefa de backup {}", + "13d829d3f2b78c971207d944f2a96c55": "Falha ao excluir o arquivo, razão: {}", + "ea848f5d6978f5916cd3df4191195e2a": "O host já existe!", + "7aa425b3819e79208faaed38fe137f34": "Falha ao conectar ao servidor, verifique se o docker foi iniciado!", + "c90ca78b1fc8554e867a696d30255cba": "Adicionar host docker com sucesso!", + "8ee5196fbd93bf345bf018132e808a0a": "Excluir host com sucesso!", + "7c6f761019365f8a5cfb2fb54d9e199d": "info.json foi baixado!", + "10066fce84fe34e9cc33e0338532988b": "O download de info.json falhou!", + "0672e579ab0e3454713eb683ddcc4859": "{} Download falhou, por favor ressincronize!", + "8e790e81fffa7f51d099f710bd8f82cf": "{}Teste de arquivo yml falhou,{}", + "371acfea202589c4efd6724888f66595": "{} Download concluído!", + "51cf61e34b3f71ce1e430cdfcf129b80": "{} Descompressão falhou", + "c59b65890496cdf2b14d127a1f76f73d": "{} extraído com sucesso", + "0117718c35c7a16a62de5c259e1d35ee": "Criação de diretório falhou pelas seguintes razões: {}", + "374e3fe41b55a0b29420e455fb514dd6": "O volume de armazenamento foi criado", + "6d0d40f64f89227daf345eb2257638e8": "{} não pode conter Espaços", + "a00b49ace55de909015029a0d6d6096f": "{} não pode ser nulo!", + "54498312bb8f97ce07a9a0b0b47cfad1": "Porta do servidor [ {}] está ocupada, mude para outra porta!", + "47b74e08252747225c49ea0cb011c79e": "Inicialização do projeto falhou {}", + "838089af9a2941a49862f342c056a8ca": "Iniciar criação do projeto", + "9b149598fb30f54fec9e82a3d121a464": "{} já existe, por favor mude o nome do projeto", + "634370637f6a5b88940c75f826953d0c": "Falha na criação do diretório do projeto do usuário, detalhes: {}", + "f7b14d3f642d711a23d5a0cca725fd0d": "Falha ao copiar diretório do projeto. Detalhes: {}", + "7bdaccb3d20432c5e0150862ab1cc3f3": "Faltando parâmetros name", + "9b90b5b49486a61d9b0e6dbbbcb56cad": "Faltando parâmetros container_info", + "b23d7110e9bf6539b4964afe0d4934e2": "O agrupamento já existe", + "a90ca6939fe71693c145f50596c6e0e6": "Contêiner {} foi adicionado pelo grupo {}!", + "e3cf7e2f2d14257e7ea33657b135d534": "Adição falhou:{}", + "fcbeb38a63ced9d3de476fb08c31d71e": "Faltando parâmetros id", + "fe4e0032f69b4100ed143d475e8b5050": "Edição com Sucesso", + "6c4ed52bea35c4c43839b8f0b44489f9": "Edição falhou:{}", + "6c0129a45e9da4e1820335f3d06a869f": "Exclusão falhou:{}", + "2a743a86676fd52214d3c0af1b0238b5": "Erro de Parâmetro status", + "f95136e5c1f3ccbb09ace8fc24f1e0ca": "Operação do contêiner [{}] falhou", + "2e01172e31495f41fcebcf3f831cc82c": "Operação bem-sucedida", + "244a98f8c45f938980f48b168aef02c9": "Operação falhou:{}", + "fc431240dfc80a731900d5f2ddb6dfc3": "Ordem de início do contêiner {}", + "5ea6c6eea14c24c92eeeccaeea5c46dc": "Estado inválido!", + "cb337dbfbc18aafa482051b6fc349dea": "Falha ao obter o arquivo de configuração", + "84d3fc0c1c70fcd6fdd7ca7c3be11225": "O projeto já existe!", + "a280b122a0b3249c26b1f94ad4573f50": "Gravação falhou!", + "72b8d771409a71a6650a65e1174cec30": "O projeto foi adicionado com sucesso!", + "0fa934d82d7863e34606d19520d12e48": "Ordem de contêiner inválida!", + "eedeb135fe678559787fe2cb304f24cc": "A ordem do contêiner foi modificada com sucesso!", + "0c1dcdb6582992fa9ec4169c7c958e47": "O projeto não existe.", + "4ec9c8311b7814ee0f17b634cb7a6ae0": "O intervalo do projeto foi modificado com sucesso!", + "cda91d4feb0c7cceb0fa1aeabcf536b4": "Iniciando contêineres sequencialmente!", + "97f2a2dcbe0d211b8972c6151950b213": "O seguinte contêiner está em execução: {}. É permitido forçar parada e depois iniciar? Você também pode optar por parar manualmente um contêiner em execução!", + "9d160eff84c44041cf4eb5c624874c4e": "Iniciar lançamento de contêineres sequencialmente!", + "33b5d440d17f3837309707b5b049e899": "Parando contêineres sequencialmente!", + "b687943a0a61ed9f039213d7c5e0fcca": "Contêineres começam a parar em ordem", + "ec7b13b39406a81e90df7b7d06a4b134": "Estado inválido!", + "0df1e0596d9e1835d62be1b5ba537fac": "Contêiner {} já foi adicionado pelo grupo de projeto {}!", + "d6d90f977089e176ec7443db17c41279": "Contêiner adicionado com sucesso!", + "04cd9210bf9290bda98bc76ca4bc59fd": "Contêiner excluído com sucesso!", + "d867a5e10a7a9485129c679b85453e3f": "Projeto excluído com sucesso!", + "4097585e32152eb74bbee5ab8c463718": "O serviço docker está rodando anormalmente, por favor reinicie e tente novamente!", + "26a0931677e111565f3ff7d059b94d8b": "A configuração do gateway está errada, Por favor insira um gateway que corresponda à sub-rede: {}", + "def2ba1ce0e4d77692c14e5b984636fa": "Erro de formato de endereço de sub-rede, por favor insira por exemplo: 172.16.0.0/16", + "716eeeb727fd667635ccf1d18891d46e": "Erro de formato de intervalo IP, por favor insira o intervalo IP apropriado para esta sub-rede:", + "e310a873e7812c7f994d482604061fee": "Intervalo IP [ {}] já existe!", "db88b911ea66744c24b22efcafef2101": "A versão do kernel do sistema é muito baixa, atualize o kernel ou escolha outro modo de rede", "9cebb294a44695984eaaf2134df63a51": "O nó atual não é um Swarm e precisa ser configurado antes de poder ser usado", "85ac438bd64f13e2ad61cf60e5ade3d3": "Falha ao adicionar rede! {}", @@ -2275,158 +2351,187 @@ "87574a543563d2e037b87a6cf705e3ff": "A rede padrão do sistema não pode ser excluída!", "23b6d9d6c36088deb928efad7fb9b63b": "A rede não pode ser excluída enquanto estiver em uso!", "8f512551c7ddf61331c3d068e80c642c": "Não há redes inúteis!", - "08efe6a4e12437b79225c8b59fd710eb": "O ID da rede não pode estar vazio", - "a636381ee5e6d6d021fff745ca132905": "O ID do contêiner não pode estar vazio", - "31a75a8d220d37dc4a7ea28d0f24cc19": "Desconexão de rede bem-sucedida!", - "a2b9895fca7698902da9319b52392366": "ID do contêiner: {}, não existe!", - "c81f03a558307d5aaf3b339af28e04ff": "ID da rede: {}, não existe!", - "12a90fe85b8863e1dea43284988d7750": "A desconexão da rede falhou! {}", + "08efe6a4e12437b79225c8b59fd710eb": "ID de Rede não pode estar vazio", + "a636381ee5e6d6d021fff745ca132905": "ID de Contêiner não pode estar vazio", + "31a75a8d220d37dc4a7ea28d0f24cc19": "Desconexão de rede foi bem-sucedida!", + "a2b9895fca7698902da9319b52392366": "ID de Contêiner: {}, não existe!", + "c81f03a558307d5aaf3b339af28e04ff": "ID de Rede: {}, não existe!", + "12a90fe85b8863e1dea43284988d7750": "Desconexão de rede falhou! {}", "6226d2fef3bf047236f0f3a57dcd71fb": "Conexão de rede bem-sucedida!", "d882b8375782b1bc56ccaf84ed27d20b": "Falha ao conectar à rede! {}", "0e8623af4dd4d3b732904872d22fbf83": "O nome da rede não pode estar vazio!", "5aa2044b58e63d58ddecc69421802404": "Gateways podem", - "ceaa20eefd6749452a947c7f5dfa4eb0": "Os intervalos de IP não podem estar vazios!", - "c3e2cce9a4a1b26f46f462f34ae391b9": "Falha ao criar uma rede!", - "ea5ceb520cc09fe27e09528b98bd2d": "Nome da rede: [{}] já existe!", + "ceaa20eefd6749452a947c7f5dfa4eb0": "Intervalos de IP não podem estar vazios!", + "c3e2cce9a4a1b26f46f462f34ae391b9": "Criação de rede falhou!", + "ea5ceb520cc9b09fe27e09528b98bd2d": "Nome da rede: [{}] já existe!", "9cdc09516d85ae057d1d9bedc988849e": "Rede criada com sucesso!", - "5395cc8155f62a666b8f0d0f9f207676": "As informações do repositório já existem!", - "9b10e472adfe6372c9175b9002f098fd": "[Repositório oficial Docker] Não editável!", - "5858be44c285048a8f51c126b2fd23e9": "Falha na edição! Motivo: Falha na descriptografia da senha da conta! Exclua o repositório e adicione-o novamente", - "7e51d0e26e1b467aff3c89d3e0751ec0": "Falha na edição! Motivo:{}", - "6478f13dd58e5a4329e19be9020243ff": "Este repositório não pôde ser encontrado", - "d5309f3186607eb36bee41e8a28cea3a": "Edição bem-sucedida!", - "9e20bffc0d4093d18fcbc5c98fa0fd87": "[Repositório oficial Docker] não pode ser removido!", - "a62336a87697ab6911ba550015a798ef": "Falha na exclusão, o id do repositório pode não existir!", - "54197759827cfaf0cdb1e213fa49771e": "Teste de login falhou! Motivo: Pode ser erro de senha da conta, verifique!", - "657a0b7e82731fb4ae516d14081f17d0": "Teste de login falhou! Motivo: {}", - "221d1ea3c23f430e03a4486dca865014": "O contêiner não existe, atualize o navegador e tente novamente!", - "7e88e25ea6c628c2d03c526c04af3eed": "Falha ao obter status do contêiner: ", - "cb337dbfbc18aafa482051b6fc349dea": "Falha ao obter o arquivo de configuração", - "84d3fc0c1c70fcd6fdd7ca7c3be11225": "O projeto já existe!", - "a280b122a0b3249c26b1f94ad4573f50": "Falha na gravação!", - "72b8d771409a71a6650a65e1174cec30": "O projeto foi adicionado com sucesso!", - "0fa934d82d7863e34606d19520d12e48": "Ordem de contêiner inválida!", - "eedeb135fe678559787fe2cb304f24cc": "A ordem do contêiner foi modificada com sucesso!", - "0c1dcdb6582992fa9ec4169c7c958e47": "O projeto não existe.", - "4ec9c8311b7814ee0f17b634cb7a6ae0": "O intervalo do projeto foi modificado com sucesso!", - "cda91d4feb0c7cceb0fa1aeabcf536b4": "Lançando contêineres em sequência!", - "97f2a2dcbe0d211b8972c6151950b213": "O seguinte contêiner está em execução: {}. É permitido forçar a parada e depois iniciar? Você também pode optar por parar manualmente um contêiner em execução!", - "9d160eff84c44041cf4eb5c624874c4e": "Começar a lançar contêineres em sequência!", - "33b5d440d17f3837309707b5b049e899": "Parando contêineres em sequência!", - "b687943a0a61ed9f039213d7c5e0fcca": "Contêineres começam a parar em ordem", - "ec7b13b39406a81e90df7b7d06a4b134": "Status inválido!", - "0df1e0596d9e1835d62be1b5ba537fac": "O contêiner {} já foi adicionado pelo grupo de projeto {}!", - "d6d90f977089e176ec7443db17c41279": "Contêiner adicionado com sucesso!", - "04cd9210bf9290bda98bc76ca4bc59fd": "Contêiner excluído com sucesso!", - "d867a5e10a7a9485129c679b85453e3f": "Projeto excluído com sucesso!", - "459ed27083c25b82135efedccaa60ada": "Verificando {} histórico de comandos de exceção", - "37c614d5d300e6c391808efd5363ec82": "Verificando {} informações sensíveis", - "5ddc98a53573410c7cb65727946c5d3f": "Verificando {} backdoor", - "6bb6be880d819a93af392183d16fccdf": "Verificando {} escapes de contêiner", - "cd7fb7cf576b22469514b5b30f365158": "{}Verificação concluída", - "7d643f192968be3f8a54be28592e9176": "Falha ao verificar a imagem:{}", - "acc2731ee0f5b78d4e801d2daf814c32": "Comando de histórico anormal suspeito encontrado", - "3069c277261d044bb309e4b09ae798fa": "Foi descoberto que a imagem tem um comando histórico anormal [{}], que pode implantar malware ou código no sistema host quando o contêiner estiver em execução, causando riscos de segurança.", - "6d64734fff5534f48029ffba4aa3678d": "1. É recomendado verificar se o comando é necessário para o negócio normal
2. É recomendado escolher infraestrutura oficial e confiável para evitar perdas desnecessárias.", - "6684913201a60be0b5e89c4dfb210719": "Backdoor bashrc encontrado{}", - "9a9f27d5f9f8c056fff7986c87a94c30": "Foi descoberto que a imagem tem backdoor bashrc: [{}], conteúdo do código malicioso:
{}", - "d8a828116070b9d92315ca309cca1991": "1. Entre no contêiner implantado usando a imagem e exclua o código malicioso no arquivo
2. Verifique se o contêiner foi invadido e atualize o token de acesso ou senha da conta do negócio no contêiner
3. É recomendado substituir a imagem oficial ou outros contêineres de implantação de imagem confiáveis", - "e1439f3f7d25d378078d513a82a3fa87": "Arquivo de backdoor encontrado{}", - "9ede9d4bd542eedf78e39b0acf0206e3": "Foi descoberto que o arquivo de backdoor bashrc [{}] existe na imagem, e o conteúdo do código malicioso é:
{}", - "686765b4612ecd8f774648db29a1541d": "Backdoor cron descoberto{}", - "390bdc0b3c37a56ede9467b0c220a3b6": "Foi descoberto que o backdoor cron [{}] existe na imagem, e o conteúdo do código malicioso é:
{}", - "caea084281a3cb2515e5618cd3856163": "Backdoor de sistema encontrado:{}", - "d04061273caa56d5a0c3d74f3e9fd482": "Foi descoberto que o arquivo de backdoor systemd [{}] existe na imagem, e o conteúdo do código malicioso é:
{}", - "fc76e0fe415c49cc1c09bf76035fc4e9": "Backdoor sshd encontrado{}", - "00b2409f52ef5bc56afe29ccbe5cfa2c": "Encontrado o backdoor de link simbólico sshd: {}, o arquivo atinge o recurso malicioso [exe={};link_file={}]", - "e747da31a54cd71fb1a2860cae0f9f77": "Backdoor tcpwrapper encontrado{}", - "a2b09164c8d23894736bcc6a646861e0": "Foi descoberto que o arquivo de backdoor tcpwrapper [{}] existe na imagem, e o conteúdo do código malicioso é:
{}", - "a7fd9f6b190b8531039376fbbda5f482": "Usuários encontrados em risco de fuga{}", - "5d46ed5f4af3f30cfcc8bd66942f93b4": "O nome de usuário {} pode completar a fuga do contêiner através do comando [{}], permitindo que o invasor obtenha direitos de acesso ao host ou outros contêineres. Conteúdo malicioso:
{}", - "4ca0a18aa36a60613104cacdae514dec": "1. É recomendado excluir a imagem ou não usá-la mais
2. Se já houver um negócio usando a imagem, entre no ambiente do contêiner e exclua o conteúdo do usuário {} no arquivo /etc/sudoers.", - "611afea08ae3b216a34dfde4c143f46c": "Versão do sistema não suportada", - "68ae8c43a52aac63c5c62e1974afdda6": "O ID do script não pode estar vazio", + "45a0bbacbe8d5ea062167e88423e4573": "servidor nginx ou apache não detectado, instale um primeiro!", + "bdaf560796795d6a303bc9a1d75a34c5": "Tipo de Projeto [{}] Domínio Existente: {}", + "4588a786e80c83c2cbde37b930c3d778": "Porta do servidor [ {}] não está em uso, insira a porta em uso para reverter!", + "6888cf6586ce3c187150146a2d1db0ac": "Falha ao adicionar, banco de dados não pode ser gravado!", + "e6bddfc6a0bbf72d592236c61b411f9a": "Adição falhou com erro: {}", + "1bfa1b1738332c4835f5efe7c54ab9c2": "erro de parâmetro!", + "0d66954ff42aa042c219a356266f5bc0": "Nenhuma informação de proxy reverso detectada!", + "6169a7282b361deb5f6f5b6e18f9426e": "erro de parâmetro cmd", + "286933a4f24bee0eed1f9300f70a30c7": "Apenas o comando docker run pode ser executado", + "a46a6b274dcbfc5a629d234c2816a165": "Existem símbolos de perigo: [{}], Execução não permitida!", + "8135363a6a5e2c145c6cedab8ac1e510": "O formato da porta está errado, este método não é suportado!", + "3b825826968319b6256c4020cc49676f": "A porta do servidor [{}] já está ocupada, substitua por uma porta diferente!", + "70b35bb3bb2fe425a981e8cc68c06906": "Por favor, baixe a imagem que você precisa", + "e768fcd4ff22e2f3cc2535f1ea9c5682": "A imagem não existe!", + "7dc29c1ed7012513111b11f56c73a4f8": "A cota de memória excedeu a quantidade disponível!", + "73aff7a8ab244bc5d0d1448e9a0ae6f0": "A cota de memória não pode ser inferior a 6MB!", + "2c4eca852599890038970a7e0f384470": "Imagem [{}] não existe, Você pode tentar [Forçar Download]!", + "56a727f1edc5f008ee8f41a638662322": "cota de cpu excedeu núcleos disponíveis!", + "45c163fd880ce5a21373fbd53bbcd642": "Reserva de memória não pode ser inferior a 6MB!", + "bf6b8400e1726aadf1cee7d6c1c5d173": "O formato do nome da imagem está incorreto.tal como:nginx:latest", + "f0beb6e739348ae10c9f15cb91638d2f": "Falha na criação do contêiner, detalhes: {}!", + "e5d4020fc5f8c26e22add8db8a62f06a": "A cota de memória não pode ser menor que a reserva de memória!", + "c68d012ef602a12e38636c306c10c894": "O nome do contêiner ou ponte de rede já existe. Por favor, mude o nome do contêiner e tente novamente!", + "c4272ed0aaf1e7e2bcc08f1003c2391d": "Não há comando de inicialização nesta imagem, especifique o comando de inicialização do contêiner!", + "a73eb9f1fb82232c9f70bb80024a9d9c": "Exceção de permissão! Detalhes:{}", + "196a4f415d73b007e0627563a530967e": "Falha na criação do contêiner! Reinicie o serviço docker no momento apropriado!", + "ea7b2beec49a425b5742339d00a5aeb8": "Imagem [{}] não existe!", + "c29c7e4f72858367cd21d10303411592": "Nome do contêiner já existe!", + "c4dc041770b8a0e34d1399141d0e4de8": "O nome do contêiner é inválido", + "97bcbd1e3b4df0f1c6ec642e7be17afe": "Porta do servidor {}em uso! Mude a outra porta", + "994e5a057aca3524ba773ec33228e184": "Falha na criação! {}", + "00ff90441ea0bdece5d9e5c72efa14a7": "A criação do contêiner falhou e a conexão com o docker expirou!", + "8879635d66ad75dcbfc8c31ba1351116": "Contêiner falhou ao rodar! {}", + "71dc70f7ab3a4bc0c2a7141718d3a9b2": "Falha na criação!", + "1983b37067c7e94095a5113786fdef9c": "Edição falhou, tempo limite de conexão com docker, reinicie o docker e tente novamente!", + "c558fedcb5850939202e684ff32c7c50": "Atualização falhou!{}", + "ed0029af5f77a5dfacbc2452e8c3ec92": "ID do contêiner anormal", + "c5b3db7efde90edcb803a4a79e559b21": "O nome da nova imagem não pode estar vazio!", + "b10305369ebb41ef24699b8137733465": "O espelho não existe!", + "9e90efb62702b147b71e8731290caf44": "A imagem [{}] não existe, tente verificar [Forçar download de imagem] e tente novamente!", + "6cfa55c53df6db8efa59aa2ae6cef97a": "O novo contêiner não foi criado com sucesso, e o contêiner antigo foi restaurado. {}", + "1f004e412319b7ed472624e011b3d2ba": "Atualização bem-sucedida!", + "a2ea046c20d2da5cebf2dea01a62dabe": "Atualização falhou! O estado do contêiner foi restaurado", + "b84bf4d95051856f9965b55bb5402de3": "Contêiner não existe!", + "d567f353b12e618571935661f31c2a16": "Edição do contêiner falhou e a conexão com o docker expirou.", + "f2124ee490df203b3f86509401c76a09": "O contêiner foi editado com sucesso, e a sub-rede não foi especificada quando a rede [{}] especificada atualmente foi criada, e o IP não pode ser personalizado, e o IP foi atribuído automaticamente a você!", + "b95d75cd8e04e9cca297c3cd1091b2eb": "O contêiner foi editado com sucesso, a configuração da rede [{}] falhou, e o endereço IP foi atribuído automaticamente a você, detalhes do erro:{}!", + "4363bb34365a67238ecc6a98ce46b361": "A imagem foi gerada, e{}", + "4bb30e8d57a6a7e548758daf4ac33983": "enviado com sucesso!", + "a32e1f09fc2739d94c51a7168675e0e9": "Falha no envio!{}", + "172f51d3307b02aeb6dc703a442f4724": "Falha ao obter contêiner", + "684fc00ae67504a56c09ef71431b1261": "Exportado com sucesso para:{}", + "f9a48b804d917398e795016687f3b0f4": "Por favor, desative a [Proteção contra violação para Empresas] antes de tentar!", + "3ab9d9b76e8d22434930622b5f0acc6a": "O contêiner foi excluído!", + "d1fe1d6e5e8c17b60f749ad36ff3bcaa": "porta do servidor ipv6 [ {}] está ocupada!", + "9f13645ac42f0c9908a35637a525d561": "porta do servidor ipv4 [ {}] está ocupada!", + "8708a53096a7d7bce5d3042be8feb736": "Parada bem-sucedida!", + "5dc7c5bba9e3ff6d293a9cd6459bc1ae": "O contêiner pausou.", + "458c9e6b1324cc3843c313c99a9c8623": "Parada falhou!{}", + "d40b23e847e0619c6e2133eebfd51807": "O ID do contêiner está vazio", + "239aa38adb7ae2339600a015d8695f3d": "O contêiner não", + "b10f78da3571670e8567e599aba8d475": "Falha ao obter informações do contêiner!{}", + "4e62f10d98b7560d22cf614879790624": "Sem registro de contêiner", + "4bfb779dfe8300c1f2da1f1dae06a4ce": "conexão docker falhou", + "e9b0defc5226436d7d2580972376cad0": "erro de parâmetro,Passe: type", + "d0e42e6dd40adc10d0027ab9993d8741": "Diretório de log do contêiner não existe, corte de log não pode ser definido!", + "3af555ace78d310a5db6e9449ed6843b": "Aberto com sucesso!", + "641fe4d504d197e8570f3bc693f5c15b": "Fechado com sucesso!", + "e04e8dc32dc0f13aea94cb4996a0057c": "O arquivo de log não existe", + "3e0f56b62a18226db6b8c71e8c917be4": "Limpeza de log bem-sucedida!", + "81259d9e5861e65db29844c19d9feb80": "Sem contêineres inúteis!", + "53a5658dfa0a2e85083fd63b961d35be": "excluído com sucesso!", + "dac7d97aeb94cf9d3b3b5d7d072c4cff": "Por favor, desative a proteção contra violação empresarial antes de tentar novamente!", + "32ca87e65c5fc75d3857767417b56439": "falha ao excluir! {}", + "b0ea22ff0b389c2a32b8f4367ab650db": "Erro de parâmetro, por favor passe política de reinício restart_policy!", + "3b2f70397fa8a827c7146cbd900f7222": "Atualização falhou! {}", + "c147897a9d1746a58de531e9c0158c23": "O contêiner não está iniciado e não pode ser renomeado!", + "a89c2e8f7eb81399f984330e55014c6f": "Renomear com sucesso!", + "8a615b544c027899738b19f2cc40fd93": "Falha ao renomear! {}", + "3506ae5524d7b5dbd75ed328349e065e": "Definir topo com sucesso!", + "363b76cd4207ec1adb31b9f7ee3930c8": "Desafixado com sucesso!", + "0fffc4397713115e14ef45273241dfbb": "Erro de parâmetro, Por favor passe: remark!", + "dce2cbc7791016e4876ab144e53b4f82": "Erro de parâmetro, Por favor passe: id!", + "ca1bc3e1d32b99b90395da47b88576a9": "Erro de parâmetro, Por favor passe: ws_callback!", + "b4770fb21a608a5ba1ecacae409093d0": "Erro de parâmetro, Por favor passe: _ws!", + "68ae8c43a52aac63c5c62e1974afdda6": "ID do Script não pode estar vazio", "eee298ea1d9259c2f0e2061ecd89c21c": "O script especificado não existe", "b68a8dd0c887719b7cc3e10dc11843ce": "O script integrado do aapanel não pode ser excluído", - "aefb82d7caf36c7f34a4cf60168a1297": "Este script está sendo usado atualmente pela tarefa [{}], exclua a tarefa primeiro!", - "4223589c4945a6757845760cf467a183": "Este script está sendo usado atualmente pelo evento da tarefa [{}], exclua o evento da tarefa primeiro!", + "aefb82d7caf36c7f34a4cf60168a1297": "Este script está sendo usado atualmente pela tarefa [{}], por favor exclua a tarefa primeiro!", + "4223589c4945a6757845760cf467a183": "Este script está sendo usado atualmente pelo evento da tarefa [{}], por favor exclua o evento da tarefa primeiro!", "2e32a56c4ec44d75ff6cf5c6ac366db8": "Script excluído com sucesso [", - "16687cbe6e87af3bc2762f0410453ec5": "O nome ou conteúdo do script não pode estar vazio", + "16687cbe6e87af3bc2762f0410453ec5": "Nome ou conteúdo do script não pode estar vazio", "1e156c08409accc1dc3da5c395c3ea22": "Erro de tipo de retorno", "4371a6ff5a908b5ed6f43d52b49f7d30": "Erro de tipo de script", - "91896a15daf4558843249e11b7aa1fc5": "Falha na modificação", + "91896a15daf4558843249e11b7aa1fc5": "Modificação falhou", "919c17a8f22c59f9af57399aa649003e": "Script modificado com sucesso [", "71c95be7ca536d92d8f175fa245ddeb0": "Este script requer parâmetros", - "7ef6898209b89f4ace813b19f5eac840": "Erro na execução do script, verifique se o código do script está correto:\\n{}", - "2086e84cd166412cf7236bdfb66e6d6f": "Falha na execução, mensagem de erro:\\n{}", + "7ef6898209b89f4ace813b19f5eac840": "Erro de execução de script, verifique se o código do script está correto:\\n{}", + "2086e84cd166412cf7236bdfb66e6d6f": "Execução falhou, mensagem de erro:\\n{}", "7a38e49c19eace49f0e9a0d03efadd1b": "Execução bem-sucedida: \\n{}", "5e1459e1ff5449309bd13d173dca1197": "O nome da tarefa não pode estar vazio", - "028f9aecc8c5edf83c2480f3ad9a62b0": "O conteúdo do script e o ID do script não podem estar vazios ao mesmo tempo", - "540b2cc165934ef688f12e044c500f69": "O tipo de tarefa não pode estar vazio", - "14ccb76798e0752c668bf447e7c536dd": "A expressão Crontab não pode estar vazia", + "028f9aecc8c5edf83c2480f3ad9a62b0": "Conteúdo do script e ID do script não podem estar vazios ao mesmo tempo", + "540b2cc165934ef688f12e044c500f69": "Tipo de tarefa não pode estar vazio", + "14ccb76798e0752c668bf447e7c536dd": "Expressão Crontab não pode estar vazia", "db17fc000dce92ec98ef53267f816b9c": "Expressão crontab inválida", "cb541ef3c967a13cb4b1185a661214cf": "Script não existe", "ed1bb81caf44e6b159848fcd0b28b0a4": "Este script requer parâmetros de script", - "14753fa53d0a8928c69d56611bdb43d7": "A tarefa já existe", - "aa76a4150f28fd8de372eb5fa2646a2f": "O horário de início definido não pode ser anterior ao horário atual", + "14753fa53d0a8928c69d56611bdb43d7": "Tarefa já existe", + "aa76a4150f28fd8de372eb5fa2646a2f": "O tempo de início definido não pode ser anterior ao tempo atual", "89c375395150b0550b20cdf31faf4ef5": "Tarefa não existe", - "1df9f0729d55ed5e561bdf73b6b14976": "O ID da tarefa não pode estar vazio", + "1df9f0729d55ed5e561bdf73b6b14976": "ID da Tarefa não pode estar vazio", "497b38d4da5f19ed3f041f4ae6af6059": "Run_stcript_id e run_stcript requerem pelo menos um valor válido", "cf76609030a04a8e357171a25d76f2e8": "Por favor, use um dos seguintes operadores:{}", "bb4d743f102448bf1ad62e1f1bd25e21": "A tarefa especificada não existe", - "56fcd6720b5bd174b1d614b7c7761fd5": "O script requer parâmetros, preencha os parâmetros", + "56fcd6720b5bd174b1d614b7c7761fd5": "O script requer parâmetros, por favor preencha os parâmetros", "809888a81d143c1118d056643719a133": "Falha ao adicionar evento de gatilho", - "dd66e7c4d78fab1dfd30524d47af971e": "O ID do evento não pode estar vazio", + "dd66e7c4d78fab1dfd30524d47af971e": "ID de Evento não pode estar vazio", "8abc3d5d0d73a76ae66603858617ad1b": "O evento especificado não existe", - "858080b55748bca57bca9006f2c36e10": "Modificação do evento bem-sucedida", - "f9fe8aba24799e53034cfd45a3c96824": "Falha na exclusão do evento", - "101da618f72223d3eac9e66fe510b04f": "O ID do evento da tarefa não pode estar vazio", - "bee903cc3d03ab2c237eefb1d601fbcb": "Falha na execução do script com mensagem de erro:\\n{}", + "858080b55748bca57bca9006f2c36e10": "Modificação de evento bem-sucedida", + "f9fe8aba24799e53034cfd45a3c96824": "Exclusão de evento falhou", + "101da618f72223d3eac9e66fe510b04f": "ID de evento de tarefa não pode estar vazio", + "bee903cc3d03ab2c237eefb1d601fbcb": "Execução de script falhou com mensagem de erro:\\n{}", "1d78758685e5e2f4efeeb490f8521abd": "\\n", "ca6977d373320a7fdb51047199d4cc59": "Adminer não está instalado!", - "38641e6ce3a6369e108eb595672c8edc": "Desinstalação bem-sucedida!", - "9cae26284a7ad2f46132c1e8e196d089": "Instalação bem-sucedida!", - "a9a92e55770213c8aa1fb2871dc43563": "Porta do Adminer definida com sucesso!", + "38641e6ce3a6369e108eb595672c8edc": "Desinstalar com Sucesso!", + "9cae26284a7ad2f46132c1e8e196d089": "Instalar com Sucesso!", + "a9a92e55770213c8aa1fb2871dc43563": "Definir porta Adminer com sucesso!", "b611124a9bad44e328d7ce809912802d": "Definido com sucesso!", - "2321763bf0b4cbf345b1e19dc9faec47": "Versão php do Adminer definida com sucesso!", + "2321763bf0b4cbf345b1e19dc9faec47": "Definir versão php Adminer com sucesso!", "40a1f70c155550ad2dafa5e556e10c3c": "Versão PHP não instala!", "e75e68c65607a7cfcc570d51345d7e33": "Monitor de arquivo", - "983e2622c48ae7231c5d29b135133b0e": "Adicionar diretório de monitoramento: {}", - "15c7df4ddd1d366c2cdfa2689c15369d": "Falha na compilação do programa de filtro de IP", - "423c2da1e20a5f2138cc810423475eef": "O endereço IP não pode estar vazio!", - "1e116dc22492b28a7a38a6029416d0e1": "O endereço IP está no formato incorreto!", + "983e2622c48ae7231c5d29b135133b0e": "Adicionar diretório monitor: {}", + "15c7df4ddd1d366c2cdfa2689c15369d": "Compilação do programa de filtro IP falhou", + "423c2da1e20a5f2138cc810423475eef": "Endereço IP não pode estar vazio!", + "1e116dc22492b28a7a38a6029416d0e1": "O endereço IP está no formato errado!", "8c8f15a1c1cce8bbdc465e865c804b40": "O período máximo de bloqueio não pode exceder 24 dias!", "fb86e24ffe47ba150610ba1efd96929a": "Bloqueio temporário de blocos CIDR de endereço IP não é suportado", "bdb199a03e52488d499ea6bb0cb0d1ed": "WAF é necessário para bloquear segmentos de endereço IP", "1ac8e9ffcea7cf6e9fa183c1b9038599": "Os dados de IP não existem!", - "04d46623edcb5663566cf43f575de9b2": "O nome do site não pode estar vazio!", + "04d46623edcb5663566cf43f575de9b2": "Nome do site não pode estar vazio!", "4dcde63f7fd4415f3b5eb6cb889d135c": "A adição foi bem-sucedida", "d303480175994c6ad240cf24a4a99640": "Configuração do site não existe!", - "87d1f7257214d09ba39656b72c864bac": "Configuração da conta bem-sucedida!", + "87d1f7257214d09ba39656b72c864bac": "Configuração de Conta bem-sucedida!", "aa5bb2d58da86c4b9160e94d0c4538f1": "URI não pode estar vazio!", - "ade0ab88aa0ee9c18f0979d5b62b517d": "O URI já existe, por favor não adicione novamente!", + "ade0ab88aa0ee9c18f0979d5b62b517d": "A URI já existe, por favor não adicione novamente!", "506d9cb0cb2468fd09048bcbe8b37497": "URI não existe", "cf180f27e678d4e297f690e581961417": "O formato do endereço de escuta está errado!", - "1ed0fa9bb8768d56bf2d3232d7067023": "Intervalo de porta de escuta incorreto!, requisito: 1024-65535", + "1ed0fa9bb8768d56bf2d3232d7067023": "Intervalo de porta de escuta errado!, requisito: 1024-65535", "e6aa58b2f41bc53f6b84657d47eb35c1": "O caminho de salvamento de dados não existe!", - "c87be59ecbed944c2b45fea87d62f473": "Erro de modo de estatística de IP, requisito: 0 ou 1", - "fbc4861b0190c90a5388e44d2bbac678": "A versão atual não está disponível, atualize o painel e tente novamente", - "8b1d5629a1346da21fcaeb9f8f0db6d2": "Erro de formato de hora de início!", - "7a238977c4b13d23ac3e6b151a914cab": "Erro de formato de hora de término!", + "c87be59ecbed944c2b45fea87d62f473": "Erro no modo de estatísticas de IP, requisito: 0 ou 1", + "fbc4861b0190c90a5388e44d2bbac678": "A versão atual não está disponível, por favor atualize o painel e tente novamente", + "8b1d5629a1346da21fcaeb9f8f0db6d2": "Erro no formato da hora de início!", + "7a238977c4b13d23ac3e6b151a914cab": "Erro no formato da hora de término!", "a87a482f3bced3ce16bc9a351e8b5ce8": "A hora de início não pode ser maior que a hora de término!", - "a0ef69b1680461368a9130e770256ca6": "Erro de formato de data!", + "a0ef69b1680461368a9130e770256ca6": "Erro no formato da data!", "2493958c6f4051bb8d254d77d77b622b": "Erro de granularidade de tempo, suporte: minuto, hora, data", "4c4258ffd9a69c8e332346241a3cbdae": "Os dados da condição de negação estão no formato errado!", - "b47f4e8b7540cae56e085231c3c984c1": "ID de acesso não pode estar vazio!", + "b47f4e8b7540cae56e085231c3c984c1": "ID de Acesso não pode estar vazio!", "fea04488a926034079dc00c5a60a9135": "O formato do ID de acesso está incorreto!", - "da206b8971dcba715ed8cdd1a82736e1": "ID de acesso não existe!", + "da206b8971dcba715ed8cdd1a82736e1": "ID de Acesso não existe!", "fd65e390dd8aa35ea3622658247776d0": "O formato da data está incorreto", "9a4f1ea39f3a554d4e5431f86eb0450b": "O nome do site não pode estar vazio!", "b59417ef234946819788acfde92a00a7": "A purga foi bem-sucedida", - "aaa3736c0541d4a4d82193c2204ec317": "A hora de início está no formato incorreto!", - "e579606ed1219291caeb3bfad786dd3f": "A hora de término está no formato incorreto!", + "aaa3736c0541d4a4d82193c2204ec317": "A hora de início está no formato errado!", + "e579606ed1219291caeb3bfad786dd3f": "A hora de término está no formato errado!", "7cf2a69e43dcdfc86ab3b2b4c378a7e8": "O formato da data está incorreto!", - "53c85b9d96ea14f3f8224a5d2e659894": "O parâmetro não pode estar vazio!", + "53c85b9d96ea14f3f8224a5d2e659894": "Parâmetro não pode estar vazio!", "9dc21ed8c6025cab9873847e6e1ca506": "O tipo de consulta está incorreto!", "236c6e2f9a266b929b283eda30c2b3b6": "Nenhum dado relevante está disponível!", "50fc65b5f19812ccf756b7ad7de7f4cb": "session_id não pode estar vazio!", @@ -2435,28 +2540,28 @@ "f3df0751d9522bf2e68034bab4cd49a5": "Limpeza de configuração concluída", "191fae10bdd9d3eb6cb110b524fe40b7": "O envio foi bem-sucedido", "f53208c04e48d7ee19222b6adf343810": "O nome de usuário não pode ter menos de 3 caracteres de comprimento!", - "251e2cae1dbed2b37f7d16961a606970": "A seleção do nível de permissão está incorreta!", + "251e2cae1dbed2b37f7d16961a606970": "Seleção de nível de permissão está incorreta!", "a835325a5600b6571a24111e4d318e2c": "Por favor, selecione um site!", - "a669655fa991afcfa0cfa3f62286d944": "O comprimento da senha não pode ser inferior a 5 caracteres!", + "a669655fa991afcfa0cfa3f62286d944": "O comprimento da senha não pode ser menor que 5 caracteres!", "4d8d30e66ad9aaccc738ad99d5083955": "O nome de usuário já existe!", "12152390a5bf2ebce0f00b0fb5c650a2": "A adição foi bem-sucedida!", "4d1b7f489e07d6ca02ca1910a3884c48": "O usuário não existe!", - "3e83aa40dd320efb027151c02aab2871": "O comprimento da senha não pode ser inferior a 8 caracteres!", + "3e83aa40dd320efb027151c02aab2871": "O comprimento da senha não pode ser menor que 8 caracteres!", "d3748b3102cc8ba898f0f0bec842ce9e": "A modificação foi bem-sucedida!", "ac75e534c7334e1fd02c68a3993f1568": "A exclusão foi bem-sucedida!", "ca281da1f13858d0b599d19e18a510bf": "O status da web foi selecionado incorretamente!", - "c88239bc4a113ab0f02acb9bc31b3437": "A porta web está incorreta!", + "c88239bc4a113ab0f02acb9bc31b3437": "A porta da web está incorreta!", "f06e6a5985a91ac55c651e0b573378f0": "O diretório de segurança da web não pode estar vazio!", - "41a871d7ec26993be1367226321e06fa": "O comprimento do endereço de entrada de segurança não pode ser inferior a 6 dígitos!", + "41a871d7ec26993be1367226321e06fa": "O comprimento do endereço da entrada de segurança não pode ser menor que 6 dígitos!", "16f83d0969b9f7fe56ac3b55f9dedb26": "Esta entrada já está ocupada pelo painel, por favor use uma entrada diferente!", - "066df5a1cf19314e0265a1eb396848ac": "O endereço de entrada está formatado incorretamente, por exemplo: /my_monitor", + "066df5a1cf19314e0265a1eb396848ac": "Endereço de ingresso está formatado incorretamente, por exemplo: /meu_monitor", "794ee58637251012717d7e565aafc2a1": "A configuração foi bem-sucedida!", "2531ce72ea98e5aa8f4953eee783b540": "Nenhum log de erro encontrado!", - "0fc543dae93d3f76f5f7ff8048f5c398": "Nenhum IP mascarado encontrado para exportação!", - "5552ac99360952da2cf289f556ad19a6": "Nenhum IP mascarado encontrado para sincronizar!", + "0fc543dae93d3f76f5f7ff8048f5c398": "Nenhum IP mascarado foi encontrado para exportação!", + "5552ac99360952da2cf289f556ad19a6": "Nenhum IP mascarado foi encontrado para sincronizar!", "3332452d6ecd015473b133de021a9e06": "SINCRONIZAÇÃO BEM-SUCEDIDA!", "e6afdb1b63ca733f5d1741c7eff7a64e": "Está sendo processado, não repita!", - "696212205a77e698860ff5195992642b": "A operação de reparo está concluída", + "696212205a77e698860ff5195992642b": "A operação de reparo está completa", "97cb85456b49af4258f4c8da38bb576a": "A tarefa agendada foi adicionada com sucesso!", "2739213f569742c0782252f41279c060": "Falha ao adicionar uma tarefa agendada", "1cc4efde4fab0b4bbc2812a8b58f59b0": "Por favor, especifique um nome de site", @@ -2465,15 +2570,15 @@ "96ed379ec1882dcf52f0ff65057efb92": "Por favor, especifique os campos que você deseja exportar", "4e698e0709485a0e93a706964b748c5b": "Tipo de exportação desconhecido", "2a2dbc12afac446fe408eb78453bc6c2": "A tarefa de exportação não existe", - "9ff8782f584db728284fadd719967806": "Ocorreu um erro com a tarefa de exportação", + "9ff8782f584db728284fadd719967806": "Houve um erro com a tarefa de exportação", "b4421542e9cff8ce336075b668b8f87e": "O registro de exportação não existe", "41564d1cd7f8ecb23bcc590cb2217518": "Por favor, insira um novo diretório de dados", "699856a3cc697d8afcfd04dcd2f0729a": "O diretório especificado é o mesmo que o diretório atual", - "103422cd692bcaf56a7367075caf2274": "O diretório especificado está particionado no mesmo disco que o diretório atual, portanto, nenhuma migração de dados é necessária", + "103422cd692bcaf56a7367075caf2274": "O diretório especificado é particionado no mesmo disco que o diretório atual, então nenhuma migração de dados é necessária", "bcbd9605d3b8753bb8afbc765b293e01": "As tarefas de modificação e migração de dados foram iniciadas", - "967a57ad58881afe2c5da6cf0d7fce8c": "Por favor, insira o endereço IP e o nome do rastreador", + "967a57ad58881afe2c5da6cf0d7fce8c": "Por favor, insira o endereço IP e nome do crawler", "62b73e6c2a169296e73edf8a4d1e02f0": "Por favor, insira um endereço IP correto", - "0e1a26f6137c04f0f80956210069e46d": "Por favor, insira o nome correto do rastreador", + "0e1a26f6137c04f0f80956210069e46d": "Por favor, insira o nome correto do crawler", "fe8d50ca26f2e864d2bf4a932801bb85": "Erro inesperado, tente corrigir o plugin", "21aa998a1dee8774bc88ce2a070bf4de": "Por favor, insira um endereço IP", "2e0c672edc06ef05e44de98ac1b7a47d": "A exclusão foi bem-sucedida", @@ -2484,32 +2589,32 @@ "86e9360dac1c5eece29f32c9aba8011d": "O salvamento foi bem-sucedido", "e5320166e7623b6a39f9a7af7c20c787": "Erro ao especificar um parâmetro de site diferente", "c21fbb62edf94306d2e73365e6e7d637": "O parâmetro especificando outro site não pode estar vazio", - "c7fae0c9886cac3924fe5e459e171ab1": "Falha na exclusão", + "c7fae0c9886cac3924fe5e459e171ab1": "Exclusão falhou", "9a84d2910d3d36b78d7060f1c77e27f6": "O nome do site não foi especificado", "0987458a95b8bb7d6cdf9fa0630b6407": "O servidor atual não é nginx e não suporta coleta personalizada", "b925dfe3295278bd81a85bded66da01d": "O código de status está no formato errado", "2a8793bbb8bc38a7df9d8c796648526a": "Nenhum nome de site selecionado", - "6878600890a41b84c145423618ea2431": "Nenhuma informação do site encontrada", + "6878600890a41b84c145423618ea2431": "Nenhuma informação de site encontrada", "eff712873c55654bf48eaf421a184e73": "Nenhum nome de coleta personalizada foi inserido", "116208583eac10a8769774a6eaaff926": "O tipo de aquisição está incorreto", "fff3d7679cb121a30e68a104b58c934e": "O conteúdo da coleta não foi inserido", "75db42595fc9aee34df76df808712f92": "Nomes de coleta personalizada não podem conter caracteres especiais({})", "9667904e74175dfde9824cb8cd099ce7": "O conteúdo do cabeçalho deve começar com $http_", - "4c61d0ee460aa25eb6b5c413c46c9236": "O conteúdo de coleta do tipo body deve conter [$ + nginx log variable]", - "c03680a7ae35b7ce5b62f67b854d3b06": "O conteúdo de coleta deve conter [$ + nginx log variable]", - "d621342512cf7910a6dc4e7d736bcc63": "O conteúdo de coleta não pode conter caracteres especiais【", + "4c61d0ee460aa25eb6b5c413c46c9236": " O conteúdo da coleta do tipo body deve conter [$ + variável de log nginx]", + "c03680a7ae35b7ce5b62f67b854d3b06": "O conteúdo da coleta deve conter [$ + variável de log nginx]", + "d621342512cf7910a6dc4e7d736bcc63": "O conteúdo da coleta não pode conter caracteres especiais【", "b4704dc559a05c5721c095b97c4dbbc0": "O nome da coleta personalizada está duplicado", - "6594b670e8bd06e352f112c1bf194fc1": "O conteúdo da coleta personalizada está duplicado", + "6594b670e8bd06e352f112c1bf194fc1": "Conteúdo da coleta personalizada está duplicado", "a531c58ef7fefbbbd79becda53ede191": "Um nome de coleta personalizada não foi especificado", - "88c0c3ae4ef97b6069a35672b2caa05c": "O conteúdo da coleta do tipo body deve conter [$ + variável de log do nginx]", - "41353000c0d351db90c9eec095bae879": "Já existem coletas duplicadas, chamadas:{}", + "88c0c3ae4ef97b6069a35672b2caa05c": "O conteúdo da coleta do tipo body deve conter [$ + variável de log nginx]", + "41353000c0d351db90c9eec095bae879": "Já existem coletas duplicadas, nomeadas:{}", "ce78b7a225f05ece35ed7adc68b08a88": "A configuração de aquisição para modificar não foi encontrada", "521df7df29b44fcee614de96cecca61c": "A exclusão foi bem-sucedida ", "3b0ccb5c759b0941d50e331b22013560": "Extensões não suportadas: {}", - "7ea48870539b84996d1b1691c22823a7": "O formato dos dados modificados está incorreto", + "7ea48870539b84996d1b1691c22823a7": "O formato de dados modificado está incorreto", "bc64045195c8ed198a69772b3a204ef2": "Os dados a serem modificados não foram especificados", "bb02871a5e118841b95b69c5bff55baf": "A lista negra está no formato errado", - "1aac00a8c681100fd27b287c0b0516f1": "O formato da configuração de compilação está sendo analisado incorretamente", + "1aac00a8c681100fd27b287c0b0516f1": "O formato da configuração de build está sendo analisado incorretamente", "f6df35a69157ae1fca6415b043485334": "O ID da tarefa não foi especificado", "524a477cee9485a5a80a860e2bc5b5d5": "O ID da tarefa está incorreto", "4b5d95ed20303e337aec42486a0fb3fd": "O site atual não foi consultado", @@ -2521,258 +2626,36 @@ "4fa3e528186292138b224a0a1d46ec59": "O nome do site está incorreto", "3769ee974734f97166d6bce6b96e9b4e": "Erros de dados", "daddfa03b4ea762e009a36ce970b2b59": "Não há conta Baidu configurada", - "0379d9c081b6fd9ec2fd86e8672a4e72": "Se você não conseguir obter os dados, pode ser que as informações de login tenham expirado, tente fazer login novamente", + "0379d9c081b6fd9ec2fd86e8672a4e72": "Se você não conseguir obter os dados, pode ser que as informações de login tenham expirado, e você pode tentar fazer login novamente", "8057e57596c33acf04619825d625a483": "A atualização foi bem-sucedida", "3149165696693c4f6fef18928261a50f": "Não há conta 360 configurada", - "add390e6467c956fbb7f6da0f51d23d6": "A tarefa de envio foi executada", - "e8edb193e1cb171a17efe2765d72af71": "Arquivo não existe", - "63d325d5c4dfd07afdf888fdf727542e": "Importação bem-sucedida, ignorados {} usuários descadastrados , endereços de e-mail duplicados:{}", - "6b803f13e4c829ed6a65c0d5976af511": "Conteúdo do arquivo anormal ou malformado: {}", - "d6cd6db68490fced73e7bcf3e269fc3d": "A lista de contatos selecionada está vazia", - "721537a954932be33814ab079df57c78": "Não há cota de envio, por favor compre o pacote de recarga ou aguarde a atualização no próximo mês", - "debbea6b34bd0edb5bed5be7d68044c1": "O valor restante {} o valor ocupado pela tarefa inacabada {} o valor necessário para a tarefa a ser enviada {}, por favor compre o pacote suplementar", - "cb8c344616c2690af7d75e87f9c80aea": "Escolha um número muito grande", - "4b0dae036acd930ca1c942474b04738f": "O remetente não existe", - "cd0c2875bbba989082b0bea54837c422": "Tarefa adicionada com sucesso", - "48a84605a7e7d8938acea34996b55bb9": "Falha ao adicionar tarefa: [{0}]", - "97b655f6f5593c96a89bfca9237ce36a": "O modelo não existe", - "2efc2204459539d0ed963d7df3a0b797": "arquivo {} não existe", - "2e8a8d9cfa45e93c3c8a673bee0833df": "Envio finalizado", - "2c09afb2ce9a25b5e33e0b5eb7e10cb9": "Falha ao enviar e-mail, motivo do erro [{0}]", - "2af4936790c12bc9522e844a3187f142": "Erro de parâmetro: mail_type", - "cf6a1096f4f9f5c3632f03ddd00f8436": "Este tipo já existe", - "c92cf27565701074c9297c9f6e001056": "Adicionado com sucesso {}, falhas {}, caixas de correio duplicadas {}", - "119acd39beb57884b7fce4275c0324d9": "Adicionado com sucesso {}, caixas de correio duplicadas {}", - "0b898fa833d00b281702ae7791a5624d": "Apenas tarefas em execução podem ser pausadas", - "4cd93d208ac9f476b452f930ced5e3e0": "{} com sucesso", - "e38bacaba20440245e0aae88f984f78d": "Faltando parâmetros necessários", - "ca561681c6ba497c7de8fdecd5c05eba": "Grupo de destino não existe", - "9f965fcbc009b2b75dcef2e32a211054": "Mesclados com sucesso {} contatos", - "aac60240e4a7b953b64974b957b43376": "Falha na mesclagem: {}", - "aeaae7277bd406b03c27e12734a0073b": "Erro de parâmetro: id", - "3642b2d34114d470809e030fce8de34c": "Erro de parâmetro: temp_id", - "60287ee434fca4db4b62ab7fdff8486a": "Erro de parâmetro: addresser", - "c11022f75c572cd1b4641941845bf87c": "Erro de parâmetro: task_name", - "2816e3fdfcafd8e052bd036c330ebda2": "Falha ao adicionar tarefa: [{}]", - "db5b08f3936abce2e99f9aa1466e7258": "Erro de parâmetro: temp_name", - "6f095d43a6d1080f4694b669909d030a": "Erro de parâmetro: type", - "f7ba379966ef8be4f17f1ac316a49daf": "Edição bem-sucedida", - "08aca4a0ec8954c5a6a29a983ecbc55c": "Este recurso é exclusivo da versão Pro", - "0f506b3e8117fe5c52c90146b2ee9e67": "Erro de parâmetro: a_record", - "33a5c77b138502b17baaa51f9bd88b2c": "Erro: Nenhum registro DNS encontrado para {} ", - "4c8c4f693124ee1b937567d3ced11636": "O teste levará dois minutos, por favor, seja paciente ", - "219f93d55b24b6791d3a5c63b808a191": "Erro de parâmetro: ids", - "8c2fb0d74bf0b951dd8ada148c16ecb8": "O arquivo {} não existe", - "168861bb3452cc8ed67893c706ed69e5": "Importado com sucesso!", - "08c91ce439acde3feb04454e8b2a4f59": "A operação foi bem-sucedida", - "1d099d9c8e30376440abb2b5c7d09826": "Não há destinatários no grupo", - "0c8a0434183377840948927ddf49c467": "Nenhum dado encontrado para qualquer grupo", - "da500c6dc5f1ca7ce4e470705b7182a5": "Erro de parâmetro: group_name", - "81fa0fe3c0d0b866d13f32f822668ce2": "Erro de parâmetro: is_new", - "5abc9343e29dd1d774a1ded26c0fbb56": "O nome do grupo não pode estar vazio", - "08e36a7534385774e7972fc88ea1ca5d": "Adição bem-sucedida", - "1457aacc3deb7a7f5efc28ff7bb84786": "Falha na adição {}", - "2ac1d92fabeb3bb03f8cdc961c26f46b": "O arquivo de importação não existe", - "7dde3a45eff5e71e3098852362fd1395": "O arquivo de importação está vazio", - "f4b7c8d194eba0221d53d49a71a9bed1": "O grupo não existe", - "7f9f8d114a082f1432fd4d508b39201e": "Falha na operação do grupo: {}", - "5ca563a6955a312b2962d754d2bca84d": "Importados com sucesso {} contatos", - "611be97ff2f405d97472f1e98352f5f0": "Falha na importação: {}", - "93eb05555388b86db78c49f986669329": "Edição bem-sucedida!", - "183da276619df3a31c7153852caa43b4": "Faltando parâmetros operacionais", - "6eeff7c159aeb90605c9eeaa1d900054": "Tarefa de verificação iniciada", - "616e6da41bf332fd4a725eced516860f": "Falha ao iniciar tarefa de verificação: {}", - "694ae897645ed4f6c18dd496f0916e2d": "E-mail enviado com sucesso", - "3c4eeb0e0301063ab4f7b6e12b3ccc65": "Falha ao enviar e-mail, motivo do erro[{0}]", - "47cb4d76e39373c5fbb474f01a7f9cdb": "Erro no parâmetro rc_user", - "ada2e3b01cdd14582e9bde6794e56de3": "Erro no parâmetro rc_pass", - "ee668afb3022f7a04020a4355995df08": "Usuário não existe", - "fe3adb79b459800ef1bb0f8042e7fe4a": "Por favor, instale o roundcube primeiro", - "ebdab9ee4ea6ea28adfd7da342b8af7a": "Faltando documentos necessários", - "d77f421bec3e1db5836f52aa5b53e61b": "Execute [{}] para instalar o pflogsumm primeiro", - "4980e2fc0b7bce4c83da3fe631a97bce": "Nenhum arquivo de configuração do postfix encontrado", - "2867124182a8a707a7e8aeb1faa60d4e": "O arquivo de configuração do postfix não encontrou o parâmetro mydestination", - "9a8b3de2d2fc5f9114798532eae929b5": "Falha ao configurar dovecot", - "a4cab041ab51d1c2f65f67d7d82ec8a5": "SERVIDOR DE EMAIL EXISTE", - "7fcbf57e8fe359587beb56c6d6a35059": "NÃO INSTALAR SERVIDOR DE EMAIL", - "1d25cf1f445bdffccf0c7c04f98e90d8": "Instalação bem-sucedida", - "b4575dff8587db1b71ea56ef26fa160e": "Nome do serviço não existe", - "c138b2ea9b2ce96219987b1dc34a1751": "Reparo Concluído", - "fab07dcaf5fa1e2468aed520eb12f60e": "Verifique se o serviço rspamd está em execução", - "4b1b92ddcc4d8d18e1fc6d6a2c23b290": "Limpeza bem-sucedida", - "ff6975219190cff0cd77a5d45a4e587a": "NOME DE DOMÍNIO", - "02909d9d9c7b1c15aca48a0f3b632849": "Registro em cache ({}) atualizado com sucesso", - "8d42017ed8d72f616fcbfae1705753bd": "O registro A [{}] não pertence ao nome de domínio", - "b13de3ba9a0a8e3aa8cfc4c7b124ffaa": "Falha na análise do registro A
Domínio: {}
IP: {}", - "cb98099b2d50b0ef968b5e35a208055e": "O nome de domínio já existe", - "05c53d8c333382f2a88a51e182be4f83": "Domínio [{}] adicionado com sucesso! ip err:{}", - "8b460c0a4ee7b9f9abf8b7d9cead2cba": "Domínio [{}] adicionado com sucesso!", - "17d9629d2f06c1ee2212061b91161d4e": "Por favor, passe o nome de domínio", - "232b6fcdd02dbb56d0b4680d54e2f357": "O nome de domínio não existe", - "2f1897169b16b705ba6a5b29a05a983d": "Registro A do nome de domínio [{0}] modificado com sucesso!", - "5e22d528a4b6e80126d13acec3f03e11": "NOME_DE_DOMINIO", - "2ca49954e8a7fb75ed4cd9e1bca24e00": "Excluindo o domínio com sucesso! ({})", - "20aa86e3c9f40c2469f13b3c03dd280e": "O parâmetro está vazio, força da senha insuficiente (precisa incluir letras maiúsculas e minúsculas e números e não menos que 8 em comprimento)", - "35dc5b31856636d5281ebc710edeaf24": "DIGITE O NOME DA CONTA", - "1f26a48fd4db1e46c21cdab41fdfd7bd": "Força da senha insuficiente (precisa incluir letras maiúsculas e minúsculas e números e não menos que 8 em comprimento)", - "69e1e781dd3949f8b6a6fff74bbc79b0": "Formato de endereço de e-mail incorreto", - "e387e797495f8e6068a2378ea2a9d46b": "O endereço de e-mail não pode ter letras maiúsculas!", - "406cd9bfbe188d7be6ed43ee087853e3": "A conta de e-mail já existe", - "e89b7947650b902c10dc72cd06c7ad62": "O número de caixas de correio para {} atingiu o limite de {}", - "a94bf19eb03a81e4860453ad9d4872b2": "O nome de domínio não está no MailServer1 {}", - "9a498355742b1efcc8e97085c9f68783": "Usuário de caixa de correio adicionado com sucesso {}", - "a2dde299178d98f8b9cf937549c885ef": "Força de senha insuficiente", - "5e2421be63aa860192d725b7b57d19f7": "O nome de domínio não está no MailServer {}", - "40a84c055443ba1f6fb569b8c9861595": "O número de caixas de correio para {} atingiu o {} , no máximo {} ", - "6f6551f3050a37bff1c0db57f9c819b7": "{} caixas de correio foram criadas com sucesso", - "8e3e96d2a9f285ae645e587477b14555": "Usuário da caixa de correio modificado com sucesso {}", - "3d0fd00e4f68fb6a1ebb5de73954f5ca": "Falha na Exclusão!", - "daa8873086f44ca2724f03513c8ca775": "Usuário da caixa de correio excluído com sucesso {}", - "f5a9438fc0a655d491b336ef4122d03d": "Não foi possível enviar e-mail, erro Causa: Alguns serviços não foram iniciados, verifique o status do serviço", - "9fab0f5f8d9a53a59587cc911de514f7": "Alguns fornecedores de nuvem (como Google, Amazon) fecham a porta 25 por padrão, e você precisa entrar em contato com o fornecedor para abrir a porta 25 antes de poder usar o serviço de correio normalmente", - "b11852c790672b942ed2c547c08d0767": "Falha ao enviar e-mail, motivo do erro: O formato do endereço de entrada está incorreto", - "1a4fd4fdd2dcf2d2f06f30522c1d4914": "A interface não suporta acesso público!", - "55252847683f299cdbdb6c8a6f2aaf69": "Não foi possível enviar e-mail, Motivo: Alguns serviços não foram iniciados, verifique o status do serviço", - "56865f3d8aa564a93ed26724862960d1": "Falha ao enviar e-mail, motivo do erro [{}]", - "e79b5fbde5e49479aaafd5a1fe379e61": "ERRO NOME DA CONTA", - "333b7343c6bf424033940a8a97b12bb7": "Falha ao obter e-mail, motivo do erro[{0}]", - "1fd6e81e08c403b6c111f4ca1a673d63": "Caminho do e-mail não existe", - "5778692e244a35e113e61ed5a4a36063": "E-mail excluído com sucesso", - "653869d8a742ca8c58e33b6c1530b403": "Formato JSON inválido para caminhos", - "beb65edc70a951b625901e5b198ed89e": "Nenhum caminho fornecido", - "894b5d9ee6b19333f6871fe484756116": "Alguns arquivos não foram excluídos:\\n", - "4bbfd3ed699b4545134a61ab737e05b1": "Todos os e-mails excluídos com sucesso", - "b400dc9934847d9fe1d234befb30054d": "O nome do serviço está incorreto", - "fcc0d9c357a8bfa2d83e3e250264d4c7": "Operação incorreta", - "29c102771255855883869f4bb3b4c2e4": "{} Execução bem-sucedida da operação {}", - "a35dd0bfd9996e07728358593562dccc": "Por favor, passe o nome da conta", - "f935fa53dce46fbb36cefa0a0b08ec65": "O nome da conta é inválido.", - "dd130650a1e48b849b7c61ec23d72cea": "Falha ao obter e-mail enviado, motivo do erro [{0}]", - "4168802788e2d2bcdf3238824b47b58e": "Não foi possível encontrar o arquivo de configuração do postfix {}", - "973ce6f8cad81b79484dfa9dd8d3e01c": "ERRO de certificado, por favor cole o certificado correto no formato pem!", - "12eb041051df6300c99c90844910086c": "Configuração bem-sucedida", - "ac293db78f750888fad60af17a550b4e": "O usuário de encaminhamento já existe", - "2ce7dae0c16a247318839d2c9dd05fa1": "O nome de domínio não existe no servidor de e-mail", - "7b7203def07b8609282c02213359f019": "Usuário encaminhado não existe", - "ecc64e7aae7d595dcfcc8e7f0f484e47": "Encaminhamento de e-mail adicionado com sucesso", - "78505c78baa039a350190dfaf296952b": "O usuário de encaminhamento não existe", - "2e9f5dd27bf2f972f374084fd8bc56be": "Encaminhamento de e-mail modificado com sucesso", - "666b75a042d5cd8cba3a6d1c2f270704": "Encaminhamento de e-mail excluído com sucesso", - "03c6490678727779b9a553b0e03c1d43": "Nome de encaminhamento já existe", - "b08e9212679fd4cf82dd5ea8beda84f4": "Configurado com sucesso", - "631cca78135ab71a389991d7155bea59": "O relay smtp já existe", - "0b5eff39ea7076bcc36235e042de422d": "Nenhuma informação de configuração encontrada", - "318cc2da7d028b5497ec2e2b7bcb577e": "O relay smtp não existe", - "b5a0fb08f3a04afbfbcd4ee57299dbdf": "Atualmente não suporta varredura remota, a função está sendo testada", - "293a6b04618c2ba7921e039c75f9c80d": "Por favor, vá para a loja de aplicativos para instalar o anti-spam", - "ccff040d3fd05435e247a3b204e55ef6": "A tarefa de backup não existe!", - "e3eec59bbd1bcf4ebc36213e6df758f1": "Fechamento bem-sucedido!", - "798ddcc716b5c9993e0d1f914e3f1bf3": "Recuperação completa", - "2ca583c8306948114efb114f6bb00c3d": "Este não é um arquivo de backup válido! O nome do arquivo deve começar com ", - "97f87b75c36da3aec2a952fa834627ac": "Configuração bem-sucedida", - "db8452315d0eb9f8aa56f5ba4e010254": "Não foi possível encontrar o arquivo de configuração do dovecot {}", - "54d5be9023bb0918159a58ef65e7cf46": "O nome de domínio definido não existe", - "bdc245ab2373b030a79738e5806967b4": "Falha na configuração, restaure o arquivo de configuração agora", - "af7746eac1b9f41d829e2f150be96440": "Configuração Bem-sucedida", - "45448be795807701f1d6d79c73a5e453": "Configuração Bem-sucedida", - "6b73df7e52420a0609340be53b559a27": "Por favor, insira o nome da conta", - "f3482253072b82f9099ba7b79bd694ce": "Nome de conta inválido, por exemplo: xx@example.com", - "75e698a13245f4ea49f033e336f9a7ae": "Falha na obtenção, motivo: [{0}]", - "4b590c993349c4a9332fe7c30cc3623b": "Marcar com sucesso", - "fd1c6c13e2281da435056d1cd3de0d19": "Movido com sucesso", - "d6b9ff1c86c87a4d3d169d19b8b803da": "Por favor, insira o FQDN (Nome de Domínio Totalmente Qualificado ex: mail.aapanel.com)", - "f003e31bb108bfc6e2dca6b6a493e2c4": "Por favor, insira o FQDN (Nome de Domínio Totalmente Qualificado ex: smtp.gmail.com),", - "b20c85e36016672347fc67d33c95b9e9": "A porta 25 está aberta", - "1af60deed5a95f10c9ee73efeff48999": "Não é possível conectar à porta 25 de outros serviços, entre em contato com seu provedor de hospedagem", - "540d99b4d5cfe696f6e46cde48eda194": "Erro ao obter arquivo de origem!", - "bef8386758cab502fd7b6edd15619c85": "Não existe tal arquivo!", - "22d422258dca7c9b0975f91f927678f0": "Download refeita com sucesso", - "56ecaac7a13c0ef171f753e6b1d835b3": "tarefa não existe!", - "48aff051338f9c2251ebdeb3fd211114": "Nenhum usuário pode exportar", - "28154bafa8a9826866b6e002c71d4fff": "Conteúdo do arquivo anormal ou malformado", - "3f7e44a7c5b57a82e56793cdbeb858d7": "{} importações foram bem-sucedidas", - "bed14b598283efb210f08792c0fd1ba4": "Nenhum novo endereço de e-mail", - "f98c2754442b046838d86a7f55ffc206": "EMAIL EXISTE", - "c656050d918fe06bf87fbe9819642be1": "Parâmetros necessários estão faltando", - "3878813a0744ed93ed2da272e42ab410": "Não há certificado", - "6d02e9d5b213cf3d523190f8f90fd3e5": "A implantação foi bem-sucedida", - "fc93888f42e90fe0bbfddfe2e3b8bde7": "O registro DNS está sendo criado e entrará em vigor, por favor, seja paciente", - "7bc1a5dc172f07bc2480c7b2067e08cd": "Domínio ausente", - "abe0a1bf4c110c5e912db5968951edb3": "Domínio modificado [{}] com sucesso!", - "de5085e3caa72f9417811a3a16fbdc5f": "roundcube já existe", - "bd85bad7c1cedffc46ae70e0db8034f6": "Nenhum serviço MySQL detectado, instale-o primeiro!", - "c6a51d5b1a7bd956ca4c4f338c086f83": "Nenhum serviço nginx detectado, instale-o primeiro!", - "04558b9e13998b32d658e8cd8b0d1ad0": "Erro no parâmetro site_name", - "90baf7cab644bc240457a2c47e6ebf00": "Erro no parâmetro php_version", - "cf84746ee6e7a5bb44a33492dcf06859": "Erro no parâmetro id", - "fcabc387917b8ffea3954ce306154a14": "Erro no parâmetro path", - "bdf7ec8b7b06dbcc5cdd37b7fcf0be78": "roundcube não está implantado neste site", - "162ee492c21d8ca85c113a5ed39cb19a": "Adicionado com sucesso", - "18aa77314905ba8cc4ebbbef5e5bfc61": "Erro no parâmetro emails_to_add", - "16bc256c4be0dc8ac8c57a502d76ed7d": "Lista negra adicionada com sucesso", - "8392e379584c66a9f7a4913c7d31fac5": "Erro no parâmetro emails_to_remove", - "b28deaa432321b73e5b6708c3cdb29a2": "A lista negra foi excluída", - "aea0ac1bc82821423517f7d240f4fc20": "Não há arquivos de lista negra", - "2eee30c225f61143cba34ce255c00b39": "Não há lista negra que possa ser exportada", - "04cc998ff38dc7b2a1850bab4def5ff9": "A lista negra foi importada com sucesso", - "1b11ccbdd39c606a4b00d06e306ce7da": "erro: {}", - "37e5741448f3fff98b04f3b24663ed5a": "Esvaziado {} com sucesso", - "040af72cf6c4a1e2b1c442829628d063": "Parâmetro ausente: active", - "456da492cfd986feef0e8b6172ee52b9": "O tipo foi alterado com sucesso", - "ee94cfd2755c5d0bc7c532a5550b0632": "Parâmetro ausente: recipient", - "2ab854061aad0aede6cc7164670391df": "Adicionar {} listas de cancelamento de inscrição", - "a721d48e1f148b2cbab44c96c5d5a27c": "falha ao adicionar {}", - "612ba9a3aadccbd5aee092178e59a95a": "Removido com sucesso", - "0f72c62155338caff34448acccab2065": "Os tipos padrão podem ser alterados", - "f354e294ef8e10dfa5d5330710ac2244": "O parâmetro id deve ser passado!", - "59ba6a6955b093d3d8ab3c8ad9e07907": "Desculpe. Este recurso é apenas para membros profissionais.", - "981b4b10fbb172510dd8bc6c78442abc": "A URL atual não pode ser acessada, configure o proxy reverso corretamente!", - "b016f3fad3a16d8ab6f834d028138bb2": "parâmetro ausente! path", - "4e1b0afecf8cca9bc1c7baefbbaa5020": "parâmetro ausente! quota_type", - "f17f1430a59b12a71518577a2ac98394": "parâmetro ausente! quota_storage", - "b147c4722e48cf85b07f12e8e4dc36b9": "erro de parâmetro! quota_storage", - "6b26e574db24819d9553ff97329f72c8": "este não é um diretório válido!", - "d265f15afa05b01c067e8a37d4db5f96": "O diretório especificado é um link simbólico!", - "31883af5f94e56074d46535fb885be81": "A operação foi bem-sucedida", - "cd605148babc76c2acdd97401fde84e4": "O parâmetro id obrigatório está faltando", - "24e2e9a2bb00384d2d5199605e8429c6": "Criado com sucesso", - "f18f18a50495f5b2cc683fa8b388d7a6": "Edição bem-sucedida", - "362dff77f7403550e886db901404856c": "Exclusão bem-sucedida", - "5219b0eed304e85ff3b5d223ad1a19ea": "Por favor, especifique o domínio principal", - "99e790a4dcecd5a50224da0a6bbfe290": "Disponível após atualizar o painel", - "21217aade801d79f727da6da4bbc9028": "Por favor, especifique o nome de usuário", - "c66b529d95d463970172da0cdb289df4": "O status da cota foi atualizado com sucesso", - "10d7350372e998438adf642e58055fe2": "Falha na atualização do status da cota", - "634709ee9a1f6829d28bf76ddf278711": "Por favor, especifique o domínio e ip", - "decc12f91f9703a201987fdeabe572a4": "O site com o mesmo nome [{}] já existe, modifique-o antes de criá-lo", - "de67e3b2c564a899fe3195606036a7f1": "Instalação bem-sucedida", - "8d5496d961b4d4e08474b20c1450737a": "Falha ao criar um site", "74a7684631b29d814a52e3401576411a": "O formato da hora está incorreto", "f146f571f352f376dda16114593afd32": "Não é arquivo php nesta pasta", "a5ef7f95136c8e93b70c99cdc25d3b1b": "A regra está vazia ou o arquivo de regra está errado", "8756f93b16b703129c155cf4bf950e64": "Esta regra já existe", "2163538a10246cd5973057248443e827": "Erro de análise da base de regras", - "876088098a14f073e5da6fb4bf9a435a": "Arquivo da base de regras não existe", + "876088098a14f073e5da6fb4bf9a435a": "Arquivo de base de regras não existe", "6342b28c7c40e67016eb255e0f6fd382": "Esta regra não existe na base de regras", + "e8edb193e1cb171a17efe2765d72af71": "Arquivo não existe", "1bbd886460827015e5d605ed44252251": "11111111", - "e1fa6849f823a00ea3ce2b63a584c918": "Nenhum risco encontrado, aguarde um período para verificar", + "e1fa6849f823a00ea3ce2b63a584c918": "Nenhum risco encontrado, aguarde um período de tempo para verificar", "4919ae009da24772f54033981c72e7e0": "Este arquivo é webshell", "c3ff5d517aa0206b89c0107494480efb": "O arquivo atual é webshell", "841be447d44ca7e7424592573211f34f": "Arquivos suspeitos, inspeção manual é recomendada", "512e1fecde26404204e6072b3a12dcda": "Sem risco", - "3dfa767ed09b94292e6ed5bd39fce5d0": "Sem risco", + "3dfa767ed09b94292e6ed5bd39fce5d0": "Livre de risco", "6f72fe3fe88bd53bf8f690d2b0c5f842": "Por favor, selecione o arquivo que você precisa enviar", "d27bc4b1f587e887d48e7fe92d7a5b23": "arquivo não existe", - "8d5b6682ddc9e4453c4d971d3044dc7b": "O arquivo foi detectado como webshell pelo sistema!", - "c21a06cf7008cdaa11bcc918d6ea1c0d": "O arquivo não foi encontrado, por favor, envie o teste", + "8d5b6682ddc9e4453c4d971d3044dc7b": "O arquivo é detectado como um webshell pelo sistema!", + "c21a06cf7008cdaa11bcc918d6ea1c0d": "O arquivo não foi encontrado, por favor carregue o teste", "786c8548bf1e0cfec63644e085f73ece": "erro do sistema", "449061dfe5a4b59740b41d2705ad0bcc": "Por favor, preencha o caminho que você precisa excluir", - "704ec17e6ea425b9acd1265f1dcd0072": "Não pode estar vazio", + "704ec17e6ea425b9acd1265f1dcd0072": "Não pode ser vazio", "43043017cb4d53a3d984d879a42e2ebb": "Importado com sucesso", "3874a2dc1de33534dd53275bf1e54004": "Não existe", "2608ba6b8d1d54f9ffbfc630123ec583": "Erro de tipo", "2684d8fd0fc1dfb52e16b70b47334f53": "Desligamento bem-sucedido", - "ef00da3502e70bd84fff4b5036ff8288": "Necessário definir números!", + "ef00da3502e70bd84fff4b5036ff8288": "Precisa definir números!", "1720bc60b372b85a213d6492cdb677e5": "já existe!", "2bc3cbf8db79ff0fac4659dc5c9b2dac": "Não existe!", "07dc67d62b952497160f106a5c499b9e": "Erro de análise de arquivo restaurar configurações de fábrica!", @@ -2782,12 +2665,12 @@ "6512bd43d9caa6e02c990b0a82652dca": "11", "698d51a19d8a121ce581499d7b701668": "111", "dab4bbd12ffc7517800304f0bdc4fc86": "Os dados a serem substituídos não podem estar vazios", - "436b3a5c35b1b4c27cd55cd2fd9e6f95": "Adicionado com sucesso reinicie o Nginx para entrar em vigor", + "436b3a5c35b1b4c27cd55cd2fd9e6f95": "Adicionar com sucesso reinicie Nginx para fazer efeito", "102779676feeffd385f7038542c05441": "já existe", "965983d46c2695569cdb4e9e12fd6571": "Os dados que precisam ser interceptados não podem estar vazios", "9416a531e05cf18f1c26b97263e3c96b": "não existe", - "52932c15b4fa68c60b470a4dbcdd9852": "O arquivo de substituição está vazio, adicione dados", - "8fcc9a1b8fb706211e066cd5f7df0a65": "Excluído com sucesso, reinicie o nginx para entrar em vigor", + "52932c15b4fa68c60b470a4dbcdd9852": "O arquivo de substituição está vazio, por favor adicione dados", + "8fcc9a1b8fb706211e066cd5f7df0a65": "Excluído com sucesso, reinicie o nginx para fazer efeito", "00203649d952e20d9611cfcd21b53034": "Falha ao excluir/não existe", "3365f0d08012012075d406cf271d77f6": "O conteúdo bloqueado que você precisa não pode estar vazio", "2c555efbcf00eec34e159cbb930a49fd": "O conteúdo bloqueado já existe", @@ -2796,39 +2679,39 @@ "95d19257def109989336b6347a8f0fc3": "Por favor, insira o endereço IPV6 correto", "c0481d94eb7e8c7f46f76fec921373e2": "Endereço não existe!", "f6c7ec89d03c9c2ac46e336abc81b7a3": "A lista está vazia!", - "5be36040b9fa33036a454c12f27b7375": "Não suporta Ubuntu!", + "5be36040b9fa33036a454c12f27b7375": "Não suporta Ubantu!", "11158f5edfbaa7a72e2e1e701b426a73": "Apenas Centos7 é suportado temporariamente", "0959d7ee773960b7193779c9fdadcb0c": "Não suporta a mudança de Ubuntu!", "9033e0e305f247c0c3c80d0c7848c8b3": "!", - "25e5fccc23b6134c8a7c5afa6befd508": "Atualização do spider bem-sucedida!", - "76e2205e6fc3d06106b783a710b1fe10": "Erro de conexão com a nuvem!", - "17cae6641b0b761574f69f864134bf7e": "Erro de conexão com a nuvem!", + "25e5fccc23b6134c8a7c5afa6befd508": "Atualizar spider com sucesso!", + "76e2205e6fc3d06106b783a710b1fe10": "Erro de conexão na nuvem!", + "17cae6641b0b761574f69f864134bf7e": "Erro de conexão na nuvem!", "ce5275d6e4a918c8236e31e85270d290": "Aberto!", - "a5b0cc35b2e38546efb8ae6118230925": "Fechado!", + "a5b0cc35b2e38546efb8ae6118230925": "Desligar!", "fee1c1b6bffab76b18b09b002c405753": "O número de vezes não pode ser inferior a 20", "b14aa6510f1cff54c60f576ef0731959": "O período não pode ser inferior a 20 segundos", "d8f4a1993546cc4b850cde3599e27aec": "não encontrado", "fd16ce6210fa8913fa6230549b264979": "Parâmetro errado!", - "b4bc1177cfc8a0d0758e49b6a16f96d5": "Arquivo de configuração corrompido, conserte o firewall!", + "b4bc1177cfc8a0d0758e49b6a16f96d5": "Arquivo de configuração corrompido, corrija o firewall!", "ef78de4bb739700e26b532d670638846": "Perfil não encontrado!", - "c02aa591c33647ad91bb649c1663bcd1": "Por favor, desinstale o plugin aaPanel WebSite Speed antes de usar este recurso!", + "c02aa591c33647ad91bb649c1663bcd1": "Por favor, desinstale o plugin aaPanel WebSite Speed antes de poder usar este recurso!", "07a7794bae1a87cab16d773ce4c9597d": "Proibir acesso estrangeiro não está ativado nas configurações globais!", "bbaae08a3d7f937d5524fdfd83b37894": "A configuração foi bem-sucedida! Para entrar em vigor imediatamente, você precisa reiniciar o Nginx", "3549141361cdf1fcb62983aa5965e7be": "O parâmetro cc_increase_type é obrigatório", - "f73016df38477cfb3c3cac7c339bfd44": "Erro no parâmetro cc_increase_type ", - "6da0a606488196a3f41f0654dff52782": "O parâmetro cc_ip_max está ausente 1", - "e37eabb7b29fc24037e7fd2b0c617ead": "Erro no parâmetro cc_ip_max 0", - "aa03bfe7b5a6290d1152302818b3cdc4": "Erro no parâmetro cc_ip_max 1", - "53d80dd2af2a957ff00a7869e82eb011": "Erro no parâmetro cc_ip_max 2", - "0f75238fa757d189104cbc3b745cc7e5": "Erro no parâmetro cc_ip_max 3", - "81079713d38580dfe7714d164626b505": "Erro no parâmetro cc_ip_max 4", + "f73016df38477cfb3c3cac7c339bfd44": "Erro de Parâmetro cc_increase_type ", + "6da0a606488196a3f41f0654dff52782": "O parâmetro cc_ip_max está faltando 1", + "e37eabb7b29fc24037e7fd2b0c617ead": "Erro de Parâmetro cc_ip_max 0", + "aa03bfe7b5a6290d1152302818b3cdc4": "Erro de Parâmetro cc_ip_max 1", + "53d80dd2af2a957ff00a7869e82eb011": "Erro de Parâmetro cc_ip_max 2", + "0f75238fa757d189104cbc3b745cc7e5": "Erro de Parâmetro cc_ip_max 3", + "81079713d38580dfe7714d164626b505": "Erro de Parâmetro cc_ip_max 4", "59c4751ec8fb1f80078f21a5d3d23483": "O número mínimo de vezes que um único endereço IP pode ser defendido é 2000", "7a39ee1d46dbe23c10a5a102e002ffe1": "O número mínimo de vezes que um único endereço IP pode ser defendido é 5000 (incluindo estático quando ativado)", "21d5a4dda3dccf2cde4a2453923ba0c1": "O tempo de bloqueio não pode exceder 86400 segundos", - "8998ac964e10fa904c6f44b9a1d45839": "Necessário parâmetro cc_increase_type", - "a199962dff306e167cd1e96ccd864892": "Necessário parâmetro cc_ip_max", + "8998ac964e10fa904c6f44b9a1d45839": "Precisa do parâmetro cc_increase_type", + "a199962dff306e167cd1e96ccd864892": "Precisa do parâmetro cc_ip_max", "123f5dc9d4ce755a22034ce48a34f0ac": "Você precisa definir os números!", - "2c6392950dd8b9feeaa322428f883d6f": "O formato do segmento IP está incorreto", + "2c6392950dd8b9feeaa322428f883d6f": "Formato do segmento IP está incorreto", "d7bdef3923c512c13a60dc05970ca1cf": "O IP inicial não pode ser maior que o IP final", "b1f0a374986c41eaeafaa08485b42b59": "O segmento IP especificado já existe!", "aef0de8ec2a48f9f94f54d41a008f8f9": "O IP já existe em:", @@ -2836,21 +2719,23 @@ "4e140d99b9d960dc0faf5d43d200eab0": "Formato de dados incorreto", "4295a035192a0fcd88c89d16f69972ef": "Importado com sucesso!", "acb8450d83f87a19ac444ce07dbeae96": "O formato de dados está incorreto", - "0b8faaf8776c5eb0c07dcebc13dc55bb": "Não é possível adicionar caminho raiz do site [", + "168861bb3452cc8ed67893c706ed69e5": "Importar com sucesso!", + "0b8faaf8776c5eb0c07dcebc13dc55bb": "Não pode adicionar caminho raiz do site [", "2128a6acdfae9f60c3a292ae9afa33d2": "A URL que você adicionou já existe", - "4229662446c462c1d5212338127e8036": "Por favor, insira a url!", + "4229662446c462c1d5212338127e8036": "Por favor, insira url!", "3862c72b9bbd0accd915f171d10b5df0": "Por favor, insira parâmetros!", "e4fd18cafa65c2071efa92e329fb1aed": "já existe!", + "08e36a7534385774e7972fc88ea1ca5d": "Adicionar com sucesso", "96dd1aef326fe2e13e360245d729f9a5": "inexistência!", - "f10ae1b19b9c946f277946863a7ef9de": "Por favor, insira o site que você deseja definir!", + "f10ae1b19b9c946f277946863a7ef9de": "Por favor, insira o site que você deseja configurar!", "340c2b3dcf52aad038d610aea126fdf8": "Por favor, insira um tipo!", "d7fda198ce652fc42e3b62bc39a87dcb": "Por favor, insira a região!", "fc28444072899e60e6b2cb526651db31": "O tipo de entrada está incorreto!", - "53267148f9e661f7ab274b68ffe21bd9": "Erro tipo de solicitação inserido!", + "53267148f9e661f7ab274b68ffe21bd9": "Tipo de erro de solicitação inserido!", "0956e47e87d4d56af7f3a5bc36ec80de": "O site inserido está incorreto!", "3964f2ebc20aec0215b29f34e4e9cc8e": "Por favor, insira: ID!", - "f30e2178ef2d7f61c9b4dbf1c73f6876": "Por favor, insira: open!", - "cfec0e080bc7d4ebaae29eaec8dcba24": "Por favor, insira: status!", + "f30e2178ef2d7f61c9b4dbf1c73f6876": "Por favor, insira:open!", + "cfec0e080bc7d4ebaae29eaec8dcba24": "Por favor, insira:status!", "0e69f6afc958a9a1e75f1eb93908e9a9": "O código de status inserido está incorreto!", "0fa9cb1eb677f9243d0737a37a69f89f": "Modificação bem-sucedida!", "40ae230e6831501721508b806e3e8f16": "Por favor, insira o ID do site!", @@ -2864,87 +2749,87 @@ "86484538f21c95f5d8b2e1df43135470": "Por favor, insira open!", "230f490b7f059873ba86a8ad13a8b007": "Por favor, insira status!", "ee89c7f6d23c70ad8f7f0072e3e0cb9e": "Nenhum parâmetro foi encontrado para esta URL!", - "d1a198fffa0319462af0ceca6bc39dca": "Adicionar uma URL com uma URL [/] não é permitido na lista branca", - "0711b255059aaab715cfb46f6c503af7": "A URL [ / ] não é permitida ser adicionada à lista branca", + "d1a198fffa0319462af0ceca6bc39dca": "Adicionar uma URL com uma URL [/] não é permitido para lista branca", + "0711b255059aaab715cfb46f6c503af7": "URL [ / ] não são permitidas para serem adicionadas à lista branca", "e233e412faa6c35ecb389c502a7b6537": "Configurado com sucesso", "e78511f517dc9b86fd743725e8eae766": "O tempo de bloqueio não pode exceder 86400!", "14fc8ce684c7f8c9cbd9357d46db244c": "O cabeçalho de solicitação que você adicionou já existe!", "0d2d762c7ed9b83476612b6c08dcb18e": "O cabeçalho de solicitação especificado não existe!", "9c3c6a1bed873cbb175e46b5cefc99e8": "A regra especificada não existe!", - "0d1596574ac7aa5d5ecb88d72c42f986": "O URI especificado já existe!", + "0d1596574ac7aa5d5ecb88d72c42f986": "A URI especificada já existe!", "e66a7a8d9d1f830988f1f4a5f37ece0f": "A regra especificada já existe!", "8528abe0d097e78242d535d5fe8d0753": "Por favor, insira o endereço IP", "2aae8271977f5ad9ae44838f2b68bf91": "Tipo de spider errado!", - "d9a32e26c6c673f85332bff9907e73bc": "falha ao adicionar!", + "d9a32e26c6c673f85332bff9907e73bc": "adição falhou!", "50ff5b4f63ca1d6f72ac0884ce10a274": "O IP atual não existe!", "0e565a84b75a86b5804641eeec450828": "Ocorreu um erro durante a importação!", - "de12faa543f0eb0c72ebc64849053f14": "A regra especificada já existe, por favor, não adicione repetidamente", + "de12faa543f0eb0c72ebc64849053f14": "A regra especificada já existe, por favor não adicione repetidamente", "5d1dc231a71676f0d96c0ea4308153b6": "Falha ao obter dados", "64b31dda1dfab5250169f4cca5684824": "Apenas servidores nginx são suportados", "8147e6e4e48008b09597cc2f7b70cd8d": "Sincronização bem-sucedida!", "432deaf800ca653afe458c204cbfbcad": "Falha ao conectar à nuvem", "7f3e6e3b62e446f04ab407e6aba2bb22": "atualização concluída!", - "1f5d3751c5fd0f0d7d110164be8a597a": "Falha ao editar", - "c2aaeb20ceb12d108a77c9383498a988": "Falha na importação", + "1f5d3751c5fd0f0d7d110164be8a597a": "Falha na edição", + "c2aaeb20ceb12d108a77c9383498a988": "Importação falhou", "62fa7116894b93d89d11ba4eb1e41268": "Exportação bem-sucedida", - "139fd85baeada3d9d7cd8c65cf418df1": "Falha na exportação, arquivo de log não existe", - "efb7b1e669a74d47a4baecbe1a2adc6e": "Falha na exportação", + "139fd85baeada3d9d7cd8c65cf418df1": "Exportação falhou, arquivo de log não existe", + "efb7b1e669a74d47a4baecbe1a2adc6e": "Exportação falhou", "852e9973e436256e109f3a02ec9c140c": "Falha ao esvaziar, opção errada", "bb145fd3bdcecf6ec853d1a887a58d6f": "Sem parâmetro safe_logs", "c8eaeeb8efa13219ac368b6e39204592": "Sem parâmetro site_logs", "883efdac3eb44df42fc05b2e8e3061f9": "Sem parâmetro site_all", - "af2d7b1ee22be2dc3928b7c57580aa23": "Por favor, insira a lista de sites correta", + "af2d7b1ee22be2dc3928b7c57580aa23": "Por favor, insira a lista correta de sites", "9f351e9815c428a76aecab3c2c4a4b75": "Limpar", "50e457f6032e9d93fe4b58aec073da31": "Valor de status incorreto", "631e7fc49fb8bdf2a3f13bdaf354915e": "A operação não é suportada", "42e2a4ce9fbfd7ecf5a60a66cab89887": "Analisar a lista de sites ruins", "8ce75a209ed6cd3ed34d38aa7ea167c3": "Acesso falhou!", "a127bc2882f46ea763349be63b7a43ec": "Por favor, insira os dados de backup corretos", - "d6b3a322a8c5e66d8e4e05b81456adff": "Não é permitido definir interceptação de código de status 200!", + "d6b3a322a8c5e66d8e4e05b81456adff": "Não é permitido definir a interceptação do código de status 200!", "a8be909d5c4c96eda1b9b53089187b9e": "Código de status não permitido!", "f471d5490f674bf6c0999d9291a911a5": "Código de status de retorno não permitido!", - "8b8e26f29b987d60a8decbd2e73be7a7": "Não é permitido definir interceptação de código de status de retorno 200!", + "8b8e26f29b987d60a8decbd2e73be7a7": "Não é permitido definir a interceptação do código de status de retorno 200!", "337f8ed984e970f2873fc42622d99521": "Código estático não existe", "6fc66d367ac0c5d115479b7f852e98f4": "Por favor, passe o nome do site", "c8f9ac5c9288a3f53cccd5555ad1ee07": "Erro de latitude e longitude", - "acc31522551404d50744536a2c1986a9": "Nenhum arquivo de banco de dados", + "acc31522551404d50744536a2c1986a9": "Sem arquivo de banco de dados", "eaafa722b4e623b2ac09f4ed2d9cee5a": "O parâmetro type deve ser passado", "2ac8aa908980e30a259bb8526527909b": "O parâmetro search deve ser passado1", "62de36f39113a05a97a245a6d3126ca5": "Por favor, selecione o nome do site a ser consultado", "7dbda89c64cdbf3c9afc9bceb5216308": "O parâmetro search deve ser passado2", "84611bf808a166c5c384e72c9290573e": "Este ID não existe", - "0960b1153519b9ab3f2e5fc5e39da8c0": "Parâmetro [uri] deve ser passado", - "acaf3f3e6dcd6d9151630196089ef423": "Parâmetro [param] deve ser passado", - "f2eda7fc24524105189f3ef3853071a0": "Parâmetro [type] deve ser passado", - "2f9d47a4a39f4ed99af1f20ddce75df6": "Parâmetro [stype] deve ser passado", - "eecc4f30c2c1ee3d9cf27edf9290c034": "O URI atual já existe", - "e200e571a58c37376c8498c2dc506c95": "O tipo de [param] está errado, precisa ser formato json", - "96ed9027cae5703401727a3d07764133": "O URI atual não existe", + "0960b1153519b9ab3f2e5fc5e39da8c0": "O parâmetro [uri] deve ser passado", + "acaf3f3e6dcd6d9151630196089ef423": "O parâmetro [param] deve ser passado", + "f2eda7fc24524105189f3ef3853071a0": "O parâmetro [type] deve ser passado", + "2f9d47a4a39f4ed99af1f20ddce75df6": "O parâmetro [stype] deve ser passado", + "eecc4f30c2c1ee3d9cf27edf9290c034": "A URI atual já existe", + "e200e571a58c37376c8498c2dc506c95": "O tipo de [param] está errado, ele precisa do formato json", + "96ed9027cae5703401727a3d07764133": "A URI atual não existe", "466767592170f74d16bcac3034109b33": "O argumento path deve ser passado", "c2d2481eafb29f7e1525c6c63441359e": "Por favor, passe o nome do site", "4950f82b4231ebbfa780bcf4eec4c545": "Por favor, insira o endereço IP correto!", "abd5af540ed5a858d02b03846d94c1f4": "inexistência!", "5c1392db72dc56bdf4ecfe41eb39622c": "Esvaziamento concluído!", "5f401d1d15e2b6346405fcd81caee5ed": "Por favor, selecione um site", - "df0af44dbb9037dfb3e4a23e2d22d184": "O tempo não foi atingido", + "df0af44dbb9037dfb3e4a23e2d22d184": "O tempo não foi alcançado", "74dc340e56666816aba1f2de4d8bda47": "A atualização falhou", - "6e57d6c47d23024e41f4a1aac73a3ea9": "Isto", - "b8c769fb426082acc16345608995c52f": "Atualização Bem-sucedida", + "6e57d6c47d23024e41f4a1aac73a3ea9": "Isso", + "b8c769fb426082acc16345608995c52f": "Atualização Bem-sucedida", "eda0e602069bd48f46f456d8c2eadd3f": "Limpo com sucesso", - "f1cee94f9171dfe24f63e3e4c701e6d1": "Atualização Bem-sucedida, Um total de {} itens foram atualizados", + "f1cee94f9171dfe24f63e3e4c701e6d1": "Atualização Bem-sucedida,Um total de {} itens foram atualizados", "34ad6868d5517e16532a27e67dd7b659": "O endereço IP do cliente não pode estar vazio", - "f9982dd2a6456912c0da42091c9843a6": "Erro de formato de IP do cliente {}", + "f9982dd2a6456912c0da42091c9843a6": "Erro de formato do IP do cliente {}", "d1adb09331d9afa950900abca1056553": "O intervalo de IP não pode estar vazio", - "dc5b7cdade7167836e1a128d7e4342c": "O segmento IP {} está no formato errado e deve ser uma expressão CIDR", + "dc5b7cdade7167836e1a128d7e4342c": "O segmento de IP {} está no formato errado e deve ser uma expressão CIDR", "193cb0af0143dc48f159b0fe55d2fc75": "A URL de origem não pode estar vazia", - "0708cc379456476aaba988b381c61782": "Por favor, passe o conteúdo de correspondência", + "0708cc379456476aaba988b381c61782": "Por favor, passe o conteúdo correspondente", "973aeb9471388c7321b04f3d921b98da": "Por favor, passe o conteúdo da URL que você precisa definir", "864ffd29519010eafc7c5a5b958fb6a9": "Por favor, insira o User-Agent que você deseja definir", - "9c5f65f543fc633b9f8d20fed389a3ee": "Digite o nome do cabeçalho de solicitação que você deseja definir", - "1822f04ebba43b9d3576660d94e4818d": "A verificação passa", + "9c5f65f543fc633b9f8d20fed389a3ee": "Insira o nome do cabeçalho de solicitação que você deseja definir", + "1822f04ebba43b9d3576660d94e4818d": "A verificação passou", "64f3408287530191cb9198dd02030e49": "O site associado não pode estar vazio", "a29f521a7a2794dded1316a1b00a8767": "A prioridade não pode estar vazia", - "d7687135850c7d6afb5041e912b33824": "O estado ativado não pode estar vazio", + "d7687135850c7d6afb5041e912b33824": "O estado habilitado não pode estar vazio", "6c671ab904133b581c1104942fe2c85e": "Se usado para uma regra global não pode ser nulo", "6f2a7d11851641b23d3f632552afa1bc": "A ação não pode estar vazia após uma correspondência bem-sucedida", "7636b5101fba6a060fb30e30278eaa73": "O portal de correspondência não pode estar vazio", @@ -2953,59 +2838,60 @@ "261d3dfaaca74f7fd29a4d304b036712": "A regra não pode estar vazia3", "06ce124a509953bf7031fcd480c960fd": "O ID da regra já existe", "6094a892b83d8bb51cf8197d39a7a25e": "Nome da regra já existe", + "362dff77f7403550e886db901404856c": "Exclusão bem-sucedida", "5538ee312635d0c82567238d58c23429": "As regras não", "c085d954281443e56fde4f00fc27a3c4": "A regra is_global não pode estar vazia", "151648106e4bf98297882ea2ea1c4b0e": "Atualização bem-sucedida", "e04a27d5fc3ba14c49f5e5383a21eaa5": "O estado precisa ser passado", "03ce2004f163fa785d50ee2fd790ab38": "Parâmetros estão faltando: type", - "afad5921afb5338dae127d8451819581": "Erro no parâmetro type", + "afad5921afb5338dae127d8451819581": "typeErro de parâmetro", "31edbe069268a91831424986f5b5f36b": "Parâmetros estão faltando", "b7c7b9e550d049c96732daefaed87f30": "A exclusão falhou e os dados não existem", "8a053f40d81ebe24c54b365c60ce453a": "Parâmetros estão faltando: ua", - "06febc0dd7b24b4ede244d87c6da9899": "Parâmetros estão faltando: type", + "06febc0dd7b24b4ede244d87c6da9899": "Parâmetros estão faltando:type", "5a111a2b93b4c9ace88c30243f3befd6": "A modificação falhou e os dados não existiam", - "beb17a764dd515a66b16905b019a4252": "Parâmetros estão faltando: :pdata", + "beb17a764dd515a66b16905b019a4252": "Parâmetros estão faltando::pdata", "e00dc8fc227ea447cb2698f5db98da48": "Os dados não estão no formato correto", "897756b1d00a36b9afeb5ef76ff845e8": "O IP foi importado com sucesso!", "79f9ab06ea335dd09d909872a7398e1e": "A URL foi importada com sucesso!", "e82e753924daf07d001e460901b6fd96": "O UA foi importado com sucesso!", "112dd48824aab35f4b9dc986b6313885": "Limpo com sucesso!", "4743684898b36b9ed3ac8e1ac5ca7024": "Exportação bem-sucedida!", - "baa8f76f78ba1a954406d06dacf64c10": "Ativado com sucesso!", + "baa8f76f78ba1a954406d06dacf64c10": "Habilitado com sucesso!", "79b200ebd87ad6863d1413cfa7f1d7a4": "O conteúdo do arquivo está vazio", "c1474294f9b2d0569833252c2dac48ec": "O conteúdo do arquivo não está no formato JSON", - "435e03d88220f757a95c64ad48a5727a": "O parâmetro está incorreto, parâmetro ausente: html", - "3d89842e7bfbe8e4647f2b75c86f2111": "O parâmetro está incorreto, parâmetro ausente: site", - "b0224414a41d57fd48147d635b0a9f49": "O parâmetro está incorreto, parâmetro ausente: html_fast", - "2413405e65a706d48f6a7085961802c3": "O parâmetro está incorreto, parâmetro ausente: js", - "7b7ad90f48da5f137d45d79f06317f47": "O parâmetro está incorreto, parâmetro ausente: picture", - "a2e1cf38d9a88555c830f5b0f1a59554": "O parâmetro está incorreto, parâmetro ausente: picturenew", - "ab003a3bb7b2000f3f7dd4cc1ed2e5d6": "O parâmetro está incorreto, parâmetro ausente: htmlnew", - "659e67f77b70550f43b989a82f431ad8": "O parâmetro está incorreto, o parâmetro picturenew não está no formato json", - "785400f0c6201ecea4df35207667eb60": "O parâmetro está incorreto, o parâmetro htmlnew não está no formato json", - "0ea0d28a307b650faafba51aeda35b6e": "O parâmetro está incorreto, o parâmetro type está faltando no parâmetro htmlnew", - "e3d8ffe389c1772f7eaec98fe78334e1": "O parâmetro está incorreto, o parâmetro text está faltando no parâmetro htmlnew", - "4b097fd2beaa3b114a72820f7b595269": "O parâmetro está incorreto, há um erro no parâmetro type em htmlnew", - "fffd4429bcf4305049e63d02b689d2cb": "O parâmetro está incorreto, o parâmetro text no parâmetro htmlnew não pode exceder 100", + "435e03d88220f757a95c64ad48a5727a": "O parâmetro está incorreto,parâmetro faltando: html", + "3d89842e7bfbe8e4647f2b75c86f2111": "O parâmetro está incorreto,parâmetro faltando: site", + "b0224414a41d57fd48147d635b0a9f49": "O parâmetro está incorreto,parâmetro faltando: html_fast", + "2413405e65a706d48f6a7085961802c3": "O parâmetro está incorreto,parâmetro faltando: js", + "7b7ad90f48da5f137d45d79f06317f47": "O parâmetro está incorreto,parâmetro faltando: picture", + "a2e1cf38d9a88555c830f5b0f1a59554": "O parâmetro está incorreto,parâmetro faltando: picturenew", + "ab003a3bb7b2000f3f7dd4cc1ed2e5d6": "O parâmetro está incorreto,parâmetro faltando: htmlnew", + "659e67f77b70550f43b989a82f431ad8": "O parâmetro está incorreto,O parâmetro picturenew não está no formato json", + "785400f0c6201ecea4df35207667eb60": "O parâmetro está incorreto,O parâmetro htmlnew não está no formato json", + "0ea0d28a307b650faafba51aeda35b6e": "O parâmetro está incorreto,O parâmetro type está faltando no parâmetro htmlnew", + "e3d8ffe389c1772f7eaec98fe78334e1": "O parâmetro está incorreto,O parâmetro text está faltando no parâmetro htmlnew", + "4b097fd2beaa3b114a72820f7b595269": "O parâmetro está incorreto,Há um erro no parâmetro type em htmlnew", + "fffd4429bcf4305049e63d02b689d2cb": "O parâmetro está incorreto,O parâmetro text no parâmetro htmlnew não pode exceder 100", "15f6f7030e3501001f4aed8e49f440ee": "Personalizações de página podem", - "f34203a4a9e3837f9c81fabffed77e40": "O parâmetro está incorreto, o parâmetro type está faltando no parâmetro picturenew", - "b5c610002dcc8b5ae0068141a7029ae2": "O parâmetro está incorreto, o parâmetro text está faltando no parâmetro picturenew", - "a2d9e4ce746f18cef7a917ffea7dd75b": "O parâmetro está incorreto, no parâmetro picturenew, apenas text e default são permitidos para o parâmetro type", - "36cf3d060b27c024b0fd85b85c533148": "O parâmetro está incorreto, o comprimento do parâmetro text no parâmetro picturenew não pode exceder 100", - "799b18f9ca831f3048d74df2feb31206": "O caractere de marca d'água não pode conter caracteres especiais < > \\", - "6e0dbbe7466271740e6609ed570d355b": "O caractere de marca d'água não pode conter chinês atualmente", + "f34203a4a9e3837f9c81fabffed77e40": "O parâmetro está incorreto,O parâmetro type está faltando no parâmetro picturenew", + "b5c610002dcc8b5ae0068141a7029ae2": "O parâmetro está incorreto,O parâmetro text está faltando no parâmetro picturenew", + "a2d9e4ce746f18cef7a917ffea7dd75b": "O parâmetro está incorreto,No parâmetro picturenew, apenas text e default são permitidos para o parâmetro type", + "36cf3d060b27c024b0fd85b85c533148": "O parâmetro está incorreto,O comprimento do parâmetro text no parâmetro picturenew não pode exceder 100", + "799b18f9ca831f3048d74df2feb31206": "O caractere da marca d'água não pode conter caracteres especiais < > \\", + "6e0dbbe7466271740e6609ed570d355b": "O caractere da marca d'água não pode conter chinês no momento", "198024662dba359f2392e60e88c40aa2": "Desinstale o plug-in Website Speed antes de poder usar este recurso!", "855804452a86a87b7698c481b8fa262b": "O pseudo-estático contém a diretiva [!-e $request_filename], que precisa ser removida antes que este recurso possa ser usado!", "788b7bc259014fc9c1991f11c3ac0917": "O endereço IP não é válido", "b53e7fec7f9097f923ac52bcb0b4c724": "O tempo não pode ser menor que 1", - "cc1dd0ad7dd389cad500d9c4d196a508": "O parâmetro está incorreto, o parâmetro open está faltando", - "d47aeb6c6f69e860d9c088ea55fba3ef": "O parâmetro está incorreto, o parâmetro qps está faltando", - "eb907b13315836fa781674c6e8f01c38": "O parâmetro está incorreto, o parâmetro time está faltando", - "c10df4de998fb928b030c2d590edd72d": "O parâmetro está incorreto, o parâmetro user está faltando", - "ab46bbdd4119a38d6ff4bdbd7c9065fc": "O parâmetro está incorreto, o parâmetro identity está faltando", - "25cf1a0c49aeb9d32801a5ab30507e7f": "O parâmetro está incorreto, o parâmetro type está faltando", - "00204d3b9a172174c943f8660ec75291": "O parâmetro está incorreto, o parâmetro text está faltando", - "30454e0ce7a66a8fddddadcf19fce8f0": "O parâmetro está incorreto, o parâmetro type permite apenas default e text", + "cc1dd0ad7dd389cad500d9c4d196a508": "O parâmetro está incorreto,O parâmetro open está faltando", + "d47aeb6c6f69e860d9c088ea55fba3ef": "O parâmetro está incorreto,O parâmetro qps está faltando", + "eb907b13315836fa781674c6e8f01c38": "O parâmetro está incorreto,O parâmetro time está faltando", + "c10df4de998fb928b030c2d590edd72d": "O parâmetro está incorreto,O parâmetro user está faltando", + "ab46bbdd4119a38d6ff4bdbd7c9065fc": "O parâmetro está incorreto,O parâmetro identity está faltando", + "25cf1a0c49aeb9d32801a5ab30507e7f": "O parâmetro está incorreto,O parâmetro type está faltando", + "00204d3b9a172174c943f8660ec75291": "O parâmetro está incorreto,O parâmetro text está faltando", + "30454e0ce7a66a8fddddadcf19fce8f0": "O parâmetro está incorreto,o parâmetro type permite apenas default e text", "5c1dcb6e10270159f05daa76de3b5437": "O QPS não pode ser menor que 0", "4443c53175005bd3105c50baddd81660": "O QPS não pode ser maior que 10.000", "262feefe0c785688578a5f642d683225": "O tempo não pode ser maior que 60", @@ -3013,41 +2899,43 @@ "215a4c6687559aa75d554670e06f3694": "O usuário não pode ser maior que 10.000", "902ee0e2b591f9872a41c319c402e0b9": "O comprimento do texto não pode ser maior que 200", "2307dba1bc155ca6f1a5bbf21dc4a258": "O pseudo-estático contém a diretiva [!-e $request_filename], que precisa ser removida antes que esta função possa ser usada!", - "db8b3ac7a5408e3bc0d103bb9b071c7b": "O parâmetro está incorreto, o parâmetro data está faltando", - "a0318cc60ff3297d4bef0399dc89fa8d": "O parâmetro está incorreto, o parâmetro data não está no formato json", - "8b682d8c8139c2ea686c7a87a03ba292": "O parâmetro está incorreto, o parâmetro name está faltando", - "58d1469872dea12b4db1dfc13af12e69": "O parâmetro está incorreto, o parâmetro site está faltando", - "2dc0483ba76fdacae8eb46978a77c449": "O parâmetro está incorreto, o parâmetro types está faltando", - "ae6b5c82d2858b70d9d5cfa2bf0a5b6e": "O parâmetro está incorreto, o parâmetro url está faltando", - "98f08e877f98b1cc132cf6af612f2c82": "O parâmetro está incorreto, o parâmetro region está faltando", - "6eb9eecd7f53241dba52168f6eed8ecb": "O parâmetro está incorreto, o parâmetro condition está faltando", - "dc781e44c06aee2588ef017aadb91f54": "O parâmetro está incorreto, o parâmetro action está faltando", - "2d613a4d2d768453594737ae21612354": "O parâmetro está incorreto, o parâmetro return está faltando", - "7c70d1e818ffa1c301fa76bdfa92d75d": "O parâmetro está incorreto, a condição de gatilho não pode estar vazia e pelo menos uma condição de gatilho deve ser selecionada", + "db8b3ac7a5408e3bc0d103bb9b071c7b": "O parâmetro está incorreto,O parâmetro data está faltando", + "a0318cc60ff3297d4bef0399dc89fa8d": "O parâmetro está incorreto,O parâmetro data não está no formato json", + "8b682d8c8139c2ea686c7a87a03ba292": "O parâmetro está incorreto,O parâmetro name está faltando", + "58d1469872dea12b4db1dfc13af12e69": "O parâmetro está incorreto,O parâmetro site está faltando", + "2dc0483ba76fdacae8eb46978a77c449": "O parâmetro está incorreto,O parâmetro types está faltando", + "ae6b5c82d2858b70d9d5cfa2bf0a5b6e": "O parâmetro está incorreto,O parâmetro url está faltando", + "98f08e877f98b1cc132cf6af612f2c82": "O parâmetro está incorreto,O parâmetro region está faltando", + "6eb9eecd7f53241dba52168f6eed8ecb": "O parâmetro está incorreto,O parâmetro condition está faltando", + "dc781e44c06aee2588ef017aadb91f54": "O parâmetro está incorreto,O parâmetro action está faltando", + "2d613a4d2d768453594737ae21612354": "O parâmetro está incorreto,O parâmetro return está faltando", + "7c70d1e818ffa1c301fa76bdfa92d75d": "O parâmetro está incorreto,A condição de gatilho não pode estar vazia, e pelo menos uma condição de gatilho deve ser selecionada", "7d44386dff18244f3dd75ad76546806e": "O nome não pode conter caracteres especiais < > \\", - "62200033fe539db0bbfaa9e811acd7ea": "O parâmetro está incorreto, o parâmetro types é anormal", - "2290ac303cc87f9fa23aa247ade17c33": "O parâmetro está incorreto, a URL não pode estar vazia", + "62200033fe539db0bbfaa9e811acd7ea": "O parâmetro está incorreto,O parâmetro types é anormal", + "2290ac303cc87f9fa23aa247ade17c33": "O parâmetro está incorreto,a URL não pode estar vazia", "d5c270bb074c184c3708fc628b969561": "A URL especificada não pode ser / ou todo o site será limitado", - "e30358a99b6522a7113a2a4ac661aa27": "O parâmetro está incorreto, a URL deve começar com /", - "8a3315f7e229831b5b472ad35db2eb32": "O limite de acesso por segundo não pode ser inferior a 1", - "1f361568ba48e247da6293cd08f2a36c": "O número de restrições de acesso por tempo não pode ser inferior a 20", - "6abf870d74b818886516c39b78ada43d": "Restrição de acesso por tempo - o tempo não pode ser inferior a 30 segundos", - "acdd003181b2fcf35ea8412f5ef17b24": "O parâmetro está incorreto, o parâmetro condition está incorreto", - "4d09f912a4e1e3f59e571464488c9b0b": "O parâmetro está incorreto, o parâmetro action está incorreto", - "554b32d33b741d86c3fdcd82a9974f9f": "O parâmetro está incorreto, o parâmetro return está incorreto", + "e30358a99b6522a7113a2a4ac661aa27": "O parâmetro está incorreto,A URL deve começar com /", + "8a3315f7e229831b5b472ad35db2eb32": "O limite de acesso por segundo não pode ser menor que 1", + "1f361568ba48e247da6293cd08f2a36c": "O número de restrições de acesso por tempo não pode ser menor que 20", + "6abf870d74b818886516c39b78ada43d": "Restrição de acesso por tempo - o tempo não pode ser menor que 30 segundos", + "acdd003181b2fcf35ea8412f5ef17b24": "O parâmetro está incorreto,parâmetro condition incorreto", + "4d09f912a4e1e3f59e571464488c9b0b": "O parâmetro está incorreto,parâmetro action incorreto", + "554b32d33b741d86c3fdcd82a9974f9f": "O parâmetro está incorreto,parâmetro return incorreto", "a6ff8cce246c28eae5895c4bc14fcf77": "O nome já existe", "d3054b81f5e76b0e297d0befe0c1a796": "A URL já existe", - "a53a9497f06d0158be0c57dae2447056": "O parâmetro está incorreto, o parâmetro id está faltando", + "a53a9497f06d0158be0c57dae2447056": "O parâmetro está incorreto,O parâmetro id está faltando", "2671382a359fe628f261c16c61618b41": "O ID não existe", - "e75627abf7a3fa307ab09e63cf246627": "O parâmetro está incorreto, o parâmetro types permite apenas all e urls", - "12ac2e613f94beddddfdbbd8cd90ebd3": "O parâmetro está incorreto, a URL não pode estar vazia", - "62b55b3dc9bd026c840e7e89d39eecd3": "O parâmetro está incorreto, o parâmetro attack está faltando", - "19fd6f5b0c2034b36bfe924611057664": "O parâmetro está incorreto, o parâmetro cc está faltando", - "0f5b3e572f9dd832eebf01fdc0d7ce8c": "O parâmetro está incorreto, por favor envie um método de alerta", + "e75627abf7a3fa307ab09e63cf246627": "O parâmetro está incorreto,O parâmetro types permite apenas all e urls", + "12ac2e613f94beddddfdbbd8cd90ebd3": "O parâmetro está incorreto,A URL não pode estar vazia", + "62b55b3dc9bd026c840e7e89d39eecd3": "O parâmetro está incorreto,O parâmetro attack está faltando", + "19fd6f5b0c2034b36bfe924611057664": "O parâmetro está incorreto,O parâmetro cc está faltando", + "0f5b3e572f9dd832eebf01fdc0d7ce8c": "O parâmetro está incorreto,Por favor envie um método de alerta", "3979187f0bae65dc1fca4f1967742397": "Falha ao ler o arquivo de configuração", "c9bbcef0c80ca1a2859dd61d0210a117": "O parâmetro [send_type] está incorreto", - "a79ff4350874c27408a1858a88058344": "Se a instanciação do canal de mensagem falhar, verifique se o canal de mensagem está configurado corretamente", + "a79ff4350874c27408a1858a88058344": "Se a instanciação do canal de mensagem falhar, verifique se o canal de mensagem está definido corretamente", "50f223163c6f8e9f6b46d66165252cab": "Desligamento bem-sucedido!", + "886051a73fe04f873d814dc9823b4064": "Informações do DingTalk não estão configuradas corretamente", + "2d1b0e55888d196484a0bfd0f85ff71c": "A configuração do DingTalk está incorreta, por favor reconfigure o robô DingTalk", "02eef33534a6f8b3c95fc65e4f98bea9": "Informações incompletas", "2f45c6e0ccf998c7d31b3764e7da3751": "Nomes de notas não podem ter mais de 15 caracteres", "6e3ce0906145a9641111ebbf7735f145": "Telegram Falha ao enviar {}", @@ -3056,31 +2944,29 @@ "4ccc991965b1b5bbe3efd6b65a1cd6fb": "O tipo de corpo deve ser json, form data ou null", "b0b017688b107601f2b3439381c4c61b": "O método de envio está incorreto", "4f4979589df1b84ac44fc64a92e2b3f3": "Verifique se a opção SSL está errada", - "85284ecbde15ff997e89e6e8f07e399b": "As informações do WeChat não estão configuradas corretamente", - "3fb32283f52bea8068006817c5b9b95b": "O desvinculamento foi bem-sucedido", + "3fb32283f52bea8068006817c5b9b95b": "A desvinculação foi bem-sucedida", "8acd58125d3f7cc181a71926ef5c8a4b": "Falha ao vincular à nuvem", - "886051a73fe04f873d814dc9823b4064": "As informações do DingTalk não estão configuradas corretamente", - "2d1b0e55888d196484a0bfd0f85ff71c": "A configuração do DingTalk está incorreta, reconfigure o robô DingTalk", - "eee590fc0d0f3382fe436b60b02e37f0": "As informações da caixa de correio não estão configuradas corretamente", + "eee590fc0d0f3382fe436b60b02e37f0": "Informações da caixa de correio não estão configuradas corretamente", "e4e7eb56340203583dd940475fc6e924": "A caixa de correio de recebimento não está configurada", - "c6beb4efa41b5adbf89191be9d139c70": "Falha ao enviar mensagem, Destinatário da falha ao enviar:{}", + "1b95893c201cd2100d5eac3a5af8c937": "Falha ao enviar mensagem, Destinatário da falha no envio:{}, Erro: {}", "e401ec76f9a9d1dfe7d484e6c4b49656": "Falha ao enviar e-mail para alguns destinatários, incluindo:{}", + "85284ecbde15ff997e89e6e8f07e399b": "Informações do WeChat não estão configuradas corretamente", "703480d2938f7c89b563e1d731e94118": "Teste de envio falhou", "fdc137942b6f2d81fa922d7ace16a94c": "Um tipo que não é suportado pela interface atual", "37f17a256a93646ef0ac721096ec0ce8": "A mesma configuração de envio já existe e não pode ser adicionada repetidamente", "2783bb2e5b99dce08138bf58d0880603": "Remetente correspondente não encontrado", "b5a30e6f46753c06ada44d6bbd757599": "Excluído com sucesso", "81550843cd0a2d7e046cb23a868f8e8e": "O envio foi bem-sucedido", - "bb8f2701fa6b013fe8aa74659ceda547": "Não foi possível ler os dados da tarefa.", + "bb8f2701fa6b013fe8aa74659ceda547": "Impossível ler dados da tarefa.", "b12cc83d0b14fe739a930fd84d10ae8d": "A tarefa não foi encontrada.", "88b5bf7d36b1f1a8f4c4c010b22e849a": "Apenas tipos container e app são suportados", - "e8335bb4286f52074f6a6b7a0c3c7bf8": "Versão {} para aplicação {} não existe", + "e8335bb4286f52074f6a6b7a0c3c7bf8": "Versão {} para aplicar {} não existe", "a5c1e82e4d1142b8c7e0bc1499446181": "ENDEREÇO GIT NÃO ESTÁ DEFINIDO", "4e24bbe093c9dfb90092a0f4e71733dc": "O nome da ramificação não está definido", "b3c02fc58b92f549f529992c8a696a66": "O caminho do arquivo zip não está definido", "eecf07d92b354565df633b06401206a1": "Por favor, selecione o caminho do arquivo", "eb9eb53b7ac221c64f6f32c547317d22": "O parâmetro path não pode estar vazio", - "0444d0f0434a4d910eb7a06039e39066": "[{}] arquivo não existe", + "0444d0f0434a4d910eb7a06039e39066": "Arquivo [{}] não existe", "f4c3904df3aa98458b5f99bd5519e409": " {} concluído, se o log não tiver exceção feche esta janela!\\r\\n", "a6d56fd22b5a2243f3d9584478b90e0e": "Avançar", "42aea4a90d1ba39b31851f63479d20c7": "Falha ao obter", @@ -3088,18 +2974,18 @@ "952345fe8555c6ba578f251a317f85bc": "O parâmetro config não pode estar vazio", "08dd0ea6d64131b95ad64ca11233bd0a": "O parâmetro env não pode estar vazio", "8dea3a35e564837dd758e1f814e24f92": "Falha ao salvar, verifique se o formato do arquivo compose.yaml está correto: 【{}】", - "2a3a9ebecbcd261e0550cb4469910ed1": "O salvamento falhou. A versão do docker-compose é muito antiga. Por favor, atualize para a versão mais recente!", - "e32a4e5887229cc3ce7412591de16cff": "Falha ao salvar", + "2a3a9ebecbcd261e0550cb4469910ed1": "A salvamento falhou. A versão do docker-compose é muito baixa. Por favor, atualize para a versão mais recente!", + "e32a4e5887229cc3ce7412591de16cff": "Salvar falhou", "4e06eef94d131a0203e8f1f87db4fee5": "O parâmetro project_name não pode estar vazio", "c80ca81b19893dafd2629ce74407d5cf": "Criação falhou, verifique se o formato do arquivo compose.yaml está correto: \\r\\n{}", - "66855212f1fe552bf49c4388155b3082": "Criação falhou, a versão do docker-compose é muito antiga, atualize para a versão mais recente!", + "66855212f1fe552bf49c4388155b3082": "Criação falhou, a versão do docker-compose é muito baixa, por favor atualize para a versão mais recente!", "5a135e409fdee335e0f4397a4293835a": "parâmetro template_name não pode estar vazio", - "1cc869c0afb0c2f94e0937d9eb364e34": "O nome do modelo já existe, exclua o modelo e adicione-o novamente!", + "1cc869c0afb0c2f94e0937d9eb364e34": "O nome do modelo já existe, exclua o modelo e adicione novamente!", "cd21239456a2d52fb2317cc699bbd93c": "O nome do projeto já existe, exclua-o antes de adicioná-lo!", "5076d42e5242f2b79244d73f13da367e": "Excluir orquestração de contêiner", "02867c418e07f941a1c5d3f6bc926f86": "O parâmetro project_list não pode estar vazio", "a88321660a22f931bc1f0861baa5dc1e": "erro de formato do parâmetro project_list: {}", - "468c559ee2d3d5e39aeef93e62b006d1": "Exclusão falhou, a versão do docker-compose é muito antiga, atualize para a versão mais recente!", + "468c559ee2d3d5e39aeef93e62b006d1": "Exclusão falhou, a versão do docker-compose é muito baixa, por favor atualize para a versão mais recente!", "3590612b29e5aa49645f02d01c9e520e": "O parâmetro container_id não pode estar vazio", "d7fc188f711a4c3eb5b85949dfd9a696": "O contêiner não existe", "77ae5114c51a32c268b0bf7a03c0c528": "Por favor, passe o parâmetro name!", @@ -3108,32 +2994,32 @@ "c7f98cd83b58fad3ab719bfa337bdb6b": "Erro de parâmetro, por favor passe o parâmetro app_name", "043e4ffcd792692d7b7acb5a2504c329": "O serviço docker não foi iniciado, por favor inicie o serviço docker primeiro!", "9f1dcd0020905875a6a48744ffe17766": "O serviço docker não foi instalado com sucesso, por favor instale o serviço docker primeiro!", - "bfec153394be0516b0d79d4653c9e19d": "O aplicativo frps já existe, por favor não instale novamente!", - "fce729be4320e9afbdad888641d08f8d": "O aplicativo frpc já existe, por favor não instale novamente!", - "f6f8ff9f4c8990d7e24ac682a50c40a4": "O mesmo nome de serviço já existe: {}, por favor mude para outro nome", + "bfec153394be0516b0d79d4653c9e19d": "A aplicação frps já existe, por favor não instale novamente!", + "fce729be4320e9afbdad888641d08f8d": "A aplicação frpc já existe, por favor não instale novamente!", + "f6f8ff9f4c8990d7e24ac682a50c40a4": "O mesmo nome de serviço já existe: {}, por favor mude outro nome", "66fd0bc16d0f3c5c9e61779749a93c56": "O formato do nome de domínio [{}] está incorreto", - "c68494100dc74cced33c845f35e5aaac": "Inicialização {} falhou. Foi detectado que o arquivo docker-compose.yml não existe. Por favor, desinstale e reinstale e tente novamente.", - "76a5e52d7834e4cdf7984adc785f720e": "O aplicativo foi criado com sucesso, mas a criação do proxy reverso falhou. Detalhes do erro: {}", - "e59b647380ea44f97645f979773c683a": "O aplicativo foi criado com sucesso, aguardando a inicialização do aplicativo, o que pode levar de 1 a 5 minutos...", + "c68494100dc74cced33c845f35e5aaac": "Inicialização de {} falhou. Detectado que o arquivo docker-compose.yml não existe. Por favor, desinstale, reinstale e tente novamente.", + "76a5e52d7834e4cdf7984adc785f720e": "A aplicação foi criada com sucesso, mas a criação do proxy reverso falhou. Detalhes do erro: {}", + "e59b647380ea44f97645f979773c683a": "A aplicação foi criada com sucesso, aguardando a inicialização da aplicação, o que pode levar de 1 a 5 minutos...", "c71b369171a386e4df59acf49f5203b0": "Erro de parâmetro, por favor passe: {} ", "5e60e6550487262a79210c48736c2cba": "A porta [{}] já está sendo usada por [{}], por favor mude para outra porta.", "dc60f8a111d142dbdc1605dc047e23e6": "Por favor, selecione o banco de dados ao qual você precisa se conectar!", "667d37fe4593e52760bc51ada7287988": "Por favor, selecione o cache ao qual você deseja se conectar!", "1b6d9f6dc5480584f937681a5d9f0a80": "Informações de cache não encontradas", "f013f8c1d30136733e3d476dbe3a238e": "A configuração atualizada foi bem-sucedida", - "3d928c01114361a57fb24c42d9a1ee2d": "Falha ao atualizar configuração: {}", + "3d928c01114361a57fb24c42d9a1ee2d": "Falha ao atualizar a configuração: {}", "795d1693702d930f7fc18edfb0f1c0d3": "Configuração incorreta do servidor MCP", "a16d1dbe265c57e0417ae396c3c30043": "Nenhum serviço encontrado [{}] ", "8987b626b78029fdd11fe51351195830": "[{}] Imagem não encontrada", "092ca03f32caffd34d3f0532836283b7": "O arquivo de script para deepseek_r1 não foi encontrado", - "17ee8c2efafe32a5d204e039e971aee4": "Menos de 1550 MB de memória impedem que deepseek r 1 seja implantado", + "17ee8c2efafe32a5d204e039e971aee4": "Menos de 1550 MB de memória impedem a implantação do deepseek r 1", "d3eb7a147ac81b2f691a6e7ad42cc83c": "Nenhum processamento necessário", "ade726fc2adbfc1c18a6a601a6670b2f": "deepseek_r1 foi configurado com sucesso", "2ab241c8ca04b4760bc844e3133821d1": "Aplicações Desconhecidas: {}", - "fc0d20951439bcc2d1101019e09556ff": "{} perfil não detectado: {}", - "3bceda9d61ef4cfc8559796178503164": "A configuração {} foi atualizada com sucesso", + "fc0d20951439bcc2d1101019e09556ff": "Perfil {} não detectado: {}", + "3bceda9d61ef4cfc8559796178503164": "A configuração de {} foi atualizada com sucesso", "b1d0019ab8cbb83b1b99016c4927c1fd": "A configuração do Alist foi atualizada", - "7194829138a21af26d26fb0d57426fc8": "Por favor, selecione o banco de dados ao qual você deseja se conectar!", + "7194829138a21af26d26fb0d57426fc8": "Por favor, selecione o banco de dados ao qual deseja se conectar!", "0a17156f2603044863d54b67ac1f7a07": "Tipo de banco de dados desconhecido: {}", "62a2454d1d40411885721e465168a016": "A configuração do Nocodb foi atualizada", "1c757f474b2cf26c14c591709c6963a6": "Configuração do Homeassistant atualizada com sucesso", @@ -3142,50 +3028,50 @@ "05ea75c6d686df18830714369dc078ed": "Por favor, passe o parâmetro app_name", "975ecde111f2dfe514b71b4d4941ba1c": "Reconstruído com sucesso!", "9b70785b1f6c44d42a1fa85dbb7000b2": "Por favor, passe o parâmetro id", - "2321c03a1d4fc4cb5b9b87275a0d4712": "O aplicativo especificado não foi encontrado!", - "63428213090160e31085eadae3508244": "Nenhum aplicativo instalado ainda!", + "2321c03a1d4fc4cb5b9b87275a0d4712": "O app especificado não foi encontrado!", + "63428213090160e31085eadae3508244": "Nenhum app instalado ainda!", "43dc377c8c1929c0c2bc959d94337657": "Por favor, passe o parâmetro id!", - "d4188b564c1af018074056fffde42fba": "por favor passe o parâmetro m_version!", - "2a65ff2dedaa3b18bf4d4678b99ff77b": "por favor passe o parâmetro s_version!", - "e7df495f8488ec05ebf913bceccbc8d4": "Você só pode escolher o mesmo número de versão que a versão principal para atualização!", - "fc15d16befa9eb8ccfb25da964a284de": "O aplicativo atual já é a versão mais recente e não precisa ser atualizado!", - "cd260af0ae4915ee07569fc877f77495": "Você só pode escolher um número de versão maior que a versão original para atualizar!", + "d4188b564c1af018074056fffde42fba": "por favor, passe o parâmetro m_version!", + "2a65ff2dedaa3b18bf4d4678b99ff77b": "por favor, passe o parâmetro s_version!", + "e7df495f8488ec05ebf913bceccbc8d4": "Você só pode escolher o mesmo número de versão da versão principal para atualização!", + "fc15d16befa9eb8ccfb25da964a284de": "A aplicação atual já é a versão mais recente e não precisa ser atualizada!", + "cd260af0ae4915ee07569fc877f77495": "Você só pode escolher um número de versão superior à versão original para atualizar!", "7ac82bcde612b1a109d988d4b3dbf626": "A atualização foi bem-sucedida!", - "01b722bbe474a50d8291bbe2e71804c6": "O aplicativo especificado não foi encontrado!!", - "2140e826934629d9a43ba2bf4f2b1774": "por favor passe o parâmetro depend_app!", - "2ab5fb77429e37f42b87e205d6e51728": "por favor passe o parâmetro service_name!", - "9d6521661f6a152c21bf6d4305d5c9b3": "por favor passe o parâmetro app_name!", + "01b722bbe474a50d8291bbe2e71804c6": "O app especificado não foi encontrado!!", + "2140e826934629d9a43ba2bf4f2b1774": "por favor, passe o parâmetro depend_app!", + "2ab5fb77429e37f42b87e205d6e51728": "por favor, passe o parâmetro service_name!", + "9d6521661f6a152c21bf6d4305d5c9b3": "por favor, passe o parâmetro app_name!", "e020f13e1a68b8030d7038cea78b3aaa": "Backup bem-sucedido!", "c4dcfb467d82071a7a4cbbe0b5036f9e": "Ainda não há dados de backup!", - "76b5c77ee72a9ffa0f4b3a8e0101ad41": "por favor passe o parâmetro file_name!", + "76b5c77ee72a9ffa0f4b3a8e0101ad41": "por favor, passe o parâmetro file_name!", "1281e3ed765ec369a06400340f4beb78": "O backup especificado não foi encontrado!", "012967525dac4f0c5395c210223ca2ef": "Por favor, passe o parâmetro file_name!", "8cc2feae92bd228672051763130e6d49": "O arquivo de backup não existe!", "3c06b7d1ee52e760b361d12cd00f55b5": "O arquivo de backup está anormal!", "010c30483dbe836d24382a368f482770": "Recuperação bem-sucedida!", - "543fa46832267ce6cb3b47594d8d8f82": "Aplicativo não existe!", + "543fa46832267ce6cb3b47594d8d8f82": "App não existe!", "c52891f1485d1070a2e063358ae71fa9": "Por favor, passe o parâmetro f_path!", "df107ded5612d825c3db3bd46a9845f0": "Por favor, passe o parâmetro f_name!", "ef41e47b4ea1bd4143562bd0989b9b20": "Por favor, passe o parâmetro f_size!", "b9290da45e148202dccf0058dfc3b27a": "Por favor, passe o parâmetro blob!", - "a27dfcdb7619659552bfdfc79930b7d9": "Existe um arquivo de backup com o mesmo nome, se precisar carregá-lo novamente, exclua o arquivo com o mesmo nome!", - "37a9a30931e079caf79fb61eed10547f": "O arquivo de backup foi carregado com sucesso!", + "a27dfcdb7619659552bfdfc79930b7d9": "Existe um arquivo de backup com o mesmo nome, se precisar reenviar, exclua o arquivo com o mesmo nome!", + "37a9a30931e079caf79fb61eed10547f": "O arquivo de backup foi enviado com sucesso!", "490068785260b543087967659d79b496": "Por favor, passe o parâmetro status!", "1204853b15f4234a8cb88df5a46b5a42": "Por favor, passe o parâmetro start/stop/restart/rebuild!", "062f4a8230dd8af4311344fcdbf6f1ea": "A desinstalação foi bem-sucedida!", "7b016fb85c09d39e89eb1875e590a6ac": "Falha ao obter a categoria do aplicativo, clique em [Atualizar Lista de Aplicativos] no canto superior direito", - "20552a0ed8eef740c631cc049fd940b9": "Erro de tipo de aplicativo, por favor passe:{}!", + "20552a0ed8eef740c631cc049fd940b9": "Erro no tipo de aplicativo, por favor passe:{}!", "c0963001ffeaec423d1be82d464d6a1a": "Por favor, passe o parâmetro id/service_name!", "4de8e45b499205551f4a09fd074e5246": "Parâmetros ausentes! id", "02e85c0a0fa01fabdb5426af13e87853": "Parâmetros ausentes! appname", - "d910ee67a0875a17b6e663f9e19369a4": "Este link de aplicativo não é suportado!", + "d910ee67a0875a17b6e663f9e19369a4": "Este link de app não é suportado!", "32d030406e8d755a59468a50bd385b22": "Falha ao obter o contêiner", "c8e0f1ed3c37b015ee446297591d172f": "Parâmetros ausentes! app_name", - "dad9445733497150b5f2cd29a5aed506": "O nome do aplicativo não é legal, por favor não inclua caracteres ilegais!", - "a04daa98db618d6c2a19aeed5af39448": "Nenhum arquivo docker-compose.yml encontrado para o aplicativo especificado!", + "dad9445733497150b5f2cd29a5aed506": "O nome do app não é legal, por favor não inclua caracteres ilegais!", + "a04daa98db618d6c2a19aeed5af39448": "Nenhum arquivo docker-compose.yml encontrado para o app especificado!", "75d0c803cc4694e08d99d958ef762fcc": "O nome de domínio não pode estar vazio!", "676c8a7788ad0ddcb68d53fc7d960679": "Falha ao criar uma rede baota net. err: {}", - "23d07f1e537a8809b268a60a6881f44c": "Erro de intervalo de porta, insira uma porta entre 0-65535!", + "23d07f1e537a8809b268a60a6881f44c": "Erro de intervalo de porta, por favor insira uma porta entre 0-65535!", "f26d903f2f99c2bb4a214a2dd863e8f9": "A porta {} foi ocupada por [{}], por favor mude a porta!", "86c1887e12c52e7da3d3c413fe6e20d1": "O acesso ao nome de domínio falhou ao ser adicionado pelos seguintes motivos:{}", "b4bf995bdf5a4506e8286bbd9b24fc2b": "Por favor, passe o parâmetro domain!", @@ -3206,7 +3092,7 @@ "f70386f0f4846336b6eee06d16a55a33": "Por favor, passe os parâmetros app db!", "2fe5b2b5ae4c0c601076922f34391c6b": "Por favor, passe o parâmetro username!", "b046515d91d43d56962b42eb216b11c9": "Por favor, passe o parâmetro password!", - "e997ba4648bad603fc310169de46e0ea": "O aplicativo de banco de dados especificado não foi encontrado!", + "e997ba4648bad603fc310169de46e0ea": "A aplicação de banco de dados especificada não foi encontrada!", "2025d918448073508d336b72a7a28093": "O banco de dados já existe!", "4a8f0a2ac362e62ba4e76f52b5791f0e": "A criação foi bem-sucedida!", "76f3f12040afb77724966e2af67ab403": "Por favor, passe o parâmetro database!", @@ -3215,9 +3101,9 @@ "2a88d88050ddcc0e28f0da4576be2232": "O parâmetro service_name não pode ser nulo", "fd0f83d70400b1dd9f6ae9c093638411": "Falha ao obter informações do contêiner, execução do docker-compose é excepcional!", "2aec223006d3894d3c1a48bca642c141": "O modelo está sendo baixado, verifique os logs mais tarde", - "d4503f6b7fe9af6267e7ff25b7b8d3fe": "Falha ao excluir modelo, exceção de execução do docker-compose!", + "d4503f6b7fe9af6267e7ff25b7b8d3fe": "Falha ao excluir modelo, exceção na execução do docker-compose!", "d75a01e0d2c0cb8dad89216653024903": "Exclusão bem-sucedida do modelo!", - "bf483666a33d372f729985363d512d74": "O nome de domínio primário não pode ser um DNS genérico", + "bf483666a33d372f729985363d512d74": "O nome de domínio principal não pode ser um DNS genérico", "3c4b1f6d2d9ef27ace95adceea599588": "A adição falhou e os dados não puderam ser inseridos no banco de dados do site", "20825a634340a0b49b1a5e7f2fe47ea3": "A adição falhou e os dados não puderam ser inseridos no banco de dados do site docker", "653f81d3e5516550e6d5e35abcdbe97c": "[{}] é a geração reversa do painel, e a autenticação http de [/] não pode ser excluída!", @@ -3226,27 +3112,27 @@ "608113c9694987fa65b22ecb164aee59": "O ambiente foi instalado com sucesso", "3f68fc9dcbe1e4581f2e5aae5adec9f8": "O diretório apphub não existe", "7ec67f9826a24ca4a930a6e168ee9611": "A resolução foi bem-sucedida", - "af2c4fa868813e47b80859a0b36e00f4": "INFORMAÇÕES DO GIT CONFIGURADAS COM SUCESSO", + "af2c4fa868813e47b80859a0b36e00f4": "AS INFORMAÇÕES DO GIT FORAM CONFIGURADAS COM SUCESSO", "2b038e106d4ca5c11b787e16c73253ef": "Se você não", - "12d1b3062be6f8bb374511323c349ed7": "Por favor, defina as informações do git primeiro", + "12d1b3062be6f8bb374511323c349ed7": "Por favor, configure as informações do git primeiro", "798cd5a257af539ecfe6bb44f45ee788": "Falha na importação do git", "8170f5d37a617dcbf16fe8dd414073dc": "Importação do git bem-sucedida", - "6e40e5a8ad741ca4bd714fa52ef32333": "O formato do arquivo está incorreto, selecione o arquivo zip ou gz", + "6e40e5a8ad741ca4bd714fa52ef32333": "O formato do arquivo está incorreto, por favor selecione o arquivo zip ou gz", "c4996991c50032c9b296c11da356acb2": "Falha na importação:{}", "8ad9bdaced3b1cd99f1fa9d32c9a7eca": "Importação bem-sucedida", - "e48121dc556643fd31b26c190eedbad3": "Apenas Nginx é suportado, instale o Nginx antes de usar!", - "135f7ef9aeb50bf7b988416b0a679dff": "O nome de domínio não pode estar vazio, insira pelo menos um nome de domínio!", - "c82b42d921224a0699f854c28c2450d2": "O destino do proxy não pode estar vazio!", + "e48121dc556643fd31b26c190eedbad3": "Apenas Nginx é suportado, por favor instale o Nginx antes de usar!", + "135f7ef9aeb50bf7b988416b0a679dff": "O nome de domínio não pode estar vazio, por favor insira pelo menos um nome de domínio!", + "c82b42d921224a0699f854c28c2450d2": "O alvo do proxy não pode estar vazio!", "fe092e7668cf0e9e6dafef6a1fa084a4": "O caminho do arquivo Unix deve começar com /, como /tmp/flash.app.sock!", "f68c204aa9e12e0513aa7a4569449cfe": "Arquivos Unix devem terminar com .lock, como /tmp/flash.app.lock!", - "5c23a6c025d7071599c70575dc858f26": "O destino do proxy não existe!", - "2fba0b6c1602ec254b1bc06bacba575d": "O destino do proxy deve começar com http:// ou https://!", - "98abf95a1fa63ca8f31cc49eee5f3958": "Proxy_path é o diretório raiz, não é possível fechar Exibir Caminho do Proxy!", - "772c6f93b20b52d5c998f4b58dbcf8f7": "Porta [{}] é ilegal!", + "5c23a6c025d7071599c70575dc858f26": "O alvo do proxy não existe!", + "2fba0b6c1602ec254b1bc06bacba575d": "O alvo do proxy deve começar com http:// ou https://!", + "98abf95a1fa63ca8f31cc49eee5f3958": "Proxy_path é o diretório raiz, não pode fechar Mostrar Caminho do Proxy!", + "772c6f93b20b52d5c998f4b58dbcf8f7": "A porta [{}] é ilegal!", "f76df64b8f66e4f6050adf633c91c7fb": "O site [{}] já existe, por favor não adicione novamente!", "6599f1c3d3d3760768d9023827e8edf0": "Projeto de proxy reverso adicionado com sucesso!", - "85e34f49357adccd76d557a540a2e5d8": "Sitename não pode estar vazio!", - "1daab0a25efad301906af4874ee4c8ac": "O tipo de log está incorreto. Por favor, passe default/file/rsyslog/off!", + "85e34f49357adccd76d557a540a2e5d8": "Nome do site não pode estar vazio!", + "1daab0a25efad301906af4874ee4c8ac": "O tipo de log está incorreto. Por favor passe default/file/rsyslog/off!", "ff9e0ecf6c4926c0a309e67f9baedf39": "Falha ao ler o arquivo de configuração, exclua o site e adicione-o novamente!", "2a6176cc22256a713204964a34fd1384": "O caminho do log não pode estar vazio!", "18292d8929b9f9b6639dcc6e49d4f4a7": "O caminho do log deve começar com /", @@ -3254,12 +3140,12 @@ "b9f153e64173504e3700aa30b08fa0aa": "Auth_path não pode estar vazio!", "c9ab8ba4f7de925b29414bbb86bd3d1f": "Auth_path deve começar com /!", "cd44f9dcf9679c8151ce2b721f2fc6eb": "O nome de usuário e a senha não podem estar vazios!", - "6750646f694a0c3dd46f9617ff055e61": "[{}] não existe na autenticação HTTP, adicione-o primeiro!", + "6750646f694a0c3dd46f9617ff055e61": "[{}] não existe na autenticação HTTP, adicione primeiro!", "714145aeae9a04f8ecf9e1f54072202a": "O nome de usuário não pode estar vazio!", "36eb0a1bb3c002f5ed0fbf8f010881e3": "A senha não pode estar vazia!", "f20db7351e9cf57ecb9f79ad3e032081": "[{}] já existe na autenticação HTTP e não pode ser adicionado novamente!", - "218fd0a172e37293fc001328b3daca79": "[{}] é uma representação reversa do painel, e a autenticação HTTP de [/] não pode ser excluída!", - "8b6cabd487e5ab76183addd53bea2d87": "Excluído com sucesso!", + "218fd0a172e37293fc001328b3daca79": "[{}] é uma representação inversa do painel, e a autenticação HTTP de [/] não pode ser excluída!", + "8b6cabd487e5ab76183addd53bea2d87": "Exclusão bem-sucedida!", "3034cdc7475c3fa220d4092128ff9c48": "Gzip_status não pode estar vazio, passe o número 1 ou 0!", "76661faaa298338bf731c737a62b7d6c": "O parâmetro gzip_min_length é inválido. Digite um número maior que 0!", "f11df0d336c64058321a01bcbdc4667c": "O parâmetro gzip_comp_level é inválido. Digite um número maior que 0!", @@ -3270,25 +3156,25 @@ "aed0d6fc7665b30b1db8cd429e48c90d": "id não pode estar vazio!", "81ec4e731430cca9b3d8bff6372bfafc": "Proxy_path não pode estar vazio!", "9aecc647ffb6f126e5aa1f6c16af43b0": "Proxy_pass não pode estar vazio!", - "d591e0043cbf6d14950a46178a537626": "O destino do proxy deve começar com http:// ou https://", + "d591e0043cbf6d14950a46178a537626": "O alvo do proxy deve começar com http:// ou https://", "247d1a7dc144bd12d4c9f8797387babe": "【 {} 】 já existe no proxy reverso e não pode ser adicionado novamente!", - "36a7891857288c55bc5d87c470212812": "O ID não pode estar vazio!", + "36a7891857288c55bc5d87c470212812": "ID não pode estar vazio!", "c8a68e4ff275e827bbbe348eddecbf2b": "Projeto de proxy reverso excluído com sucesso!", "88f9a8852b822982a9a3e839813d91bb": "Domínios não podem estar vazios!", "85fb0c03511da1e4d308fd135dec4486": "O nome de domínio não pode conter vírgulas!", "a1e7a2f08295c8f8161a8feb9e2110b0": "O número da porta do nome de domínio [{}] é ilegal!", "5f77e0a83a9aa0e7e534e5136c99ab31": "Mantenha pelo menos um nome de domínio!", - "b9902ea698ded06e8ef4f31ba1057795": "domains não pode estar vazio!", + "b9902ea698ded06e8ef4f31ba1057795": "domínios não podem estar vazios!", "5f04c54facbae56e5cdebc22b5ecbf73": "Conf_type não pode estar vazio!", "bec317d58a8302e2aaf523e28f100710": "Salvo com sucesso!", "ba4088d3a70108e609823381c7f81f96": "oid não pode estar vazio!", - "ebfb6fcc2f55debe2703d50d58255f8f": "key não pode estar vazia!", + "ebfb6fcc2f55debe2703d50d58255f8f": "chave não pode estar vazia!", "fc83b0fa2366a3136f1fd8874d0bee65": "csr não pode estar vazio!", "60f1b04984ea15b008a9ae1b2bd9e07f": "partnerOrderId não pode estar vazio!", "a8fde220ad2740e38585d34948899556": "auth_type não pode estar vazio!", "b3ad191bcb992b29302385e446e78f8a": "auth_to não pode estar vazio!", "95725cbba013b9a62d4895a2f3e5a2a9": "auto_wildcard não pode estar vazio!", - "08fd165421792573ef13d1a83e487088": "index não pode estar vazio!", + "08fd165421792573ef13d1a83e487088": "índice não pode estar vazio!", "08cbd4b3fa3941156162657f2b69e8b8": "BatchInfo não pode estar vazio!", "49d1b2d015f9e81d31ca60b63c2ef378": "force_https não pode estar vazio!", "21e0b44e0a302af58d59ca9d8948f4e1": "Domainorpath não pode estar vazio!", @@ -3297,21 +3183,21 @@ "352289584d886d4f04591b6f9b7785b8": "Tour não pode estar vazio!", "ddcb1cafcc4b5e308f6057e07af2d10a": "Redirectdomain não pode estar vazio!", "58bad30cc21797d832b361fcedff61b9": "Redirectname não pode estar vazio!", - "320968539b06847a07f9c48f39a73120": "Path não pode estar vazio!", - "51d2fd3c34890a88eafbb2801fe0827f": "O redirecionamento parou ou o diretório do arquivo de configuração não existe!", - "38e380b5535be56ebae6addcf29390ba": "Fix não pode estar vazio!", + "320968539b06847a07f9c48f39a73120": "Caminho não pode estar vazio!", + "51d2fd3c34890a88eafbb2801fe0827f": "Redirecionamento parou ou o diretório do arquivo de configuração não existe!", + "38e380b5535be56ebae6addcf29390ba": "Correção não pode estar vazia!", "ad89a60d7720b8bb5095f2752e5006ae": "Return_rule não pode estar vazio!", - "b74b269372107d024f6c9e13cf911a4e": "Https status não pode estar vazio!", + "b74b269372107d024f6c9e13cf911a4e": "Status Https não pode estar vazio!", "cefc1b6af0b80a883304b58651283f02": "Status não pode estar vazio!", - "f8a019279d00484c29abaf1cb4b9260c": "O parâmetro ip_type está incorreto, black ou white deve ser passado!", + "f8a019279d00484c29abaf1cb4b9260c": "O parâmetro ip_type está incorreto, preto ou branco deve ser passado!", "f8e8cf373fa65891fe5a6e65505d30d0": "IPS não pode estar vazio, por favor insira IP, um por linha!", - "0677c4ecb9efdab30c5077e69b1745ba": "IP não pode estar vazio, por favor insira o IP!", + "0677c4ecb9efdab30c5077e69b1745ba": "IP não pode estar vazio, por favor insira IP!", "b8c0bc6452f788c758a4f7bedd761757": "Sem informações de proxy!", "70a9558c31a978ce2b1297a2a21c1317": "Nenhuma informação de proxy encontrada para esta URL [{}]!", "82ca4452a42da1388fd435ca8a2801e7": "Proxy_host não pode estar vazio!", "6dac7e9b2cbc32789bde984cddb699f4": "Proxy_type não pode estar vazio!", - "0dc7d98b8a487dfa0794f7c792240e4c": "O caminho do arquivo Unix deve começar com / ou http://unix:, como /tmp/flash.app.lock!", - "5c6869f159feda62d0e6441f3eb1f97c": "O websocket global está em um estado aberto, e não é permitido desativar individualmente o suporte a websocket para esta URL!", + "0dc7d98b8a487dfa0794f7c792240e4c": "Caminho do arquivo Unix deve começar com / ou http://unix:, como /tmp/flash.app.lock!", + "5c6869f159feda62d0e6441f3eb1f97c": "O websocket global está em um estado aberto, e não é permitido desabilitar individualmente o suporte websocket para esta URL!", "ff6c12be57557ce452395adac7e02b30": "Oldstr e Newstr não podem estar vazios ao mesmo tempo!", "8c9bac9aea3d7a22d3789f837dd40d3c": "Get.sub_type só pode conter combinações de letras de ", "2ac2f7203f5049438855d537f52cfee4": "O conteúdo que você digitou contém chinês. Detectamos que a versão atual do nginx não suporta isso. Tente reinstalar uma versão do nginx 1.20 ou superior e tente novamente!", @@ -3319,31 +3205,31 @@ "0d57a0216b328aeba6ef5fc3cbf3b7e9": "Nenhuma informação de configuração encontrada para o conteúdo antes da substituição: [{}]!", "e00f42f6421b797439a64e3ef24c132a": "site_name não pode estar vazio!", "a6fd23485ca8abe4ab7d0580d28c4bf9": "Limpeza bem-sucedida!", - "61e795d02f4452904f2574d936c571e6": "Falha na limpeza, o diretório de cache não existe!", + "61e795d02f4452904f2574d936c571e6": "Limpeza falhou, diretório de cache não existe!", "3c99c479e3c65eac24272afc13cec604": "porta https [{}] é ilegal!", - "b9629c2dea839825c2f1916b44a154a1": "Erro no arquivo de configuração do Nginx, inventário!:{}", + "b9629c2dea839825c2f1916b44a154a1": "Erro no arquivo de configuração Nginx, inventário!:{}", "32b169f72b293ef80d35435e9894f8e2": "Inicializando", "58ba018dcbe1c47ea0a293fdcee21e63": "Instalação do Painel", "67355337eaf300b91de09a8083c93ebf": "Backup Local", "99e8ebaa5ad2fafe4e141574f6b4a73f": "Upload de Arquivo", "bd6d996cdca2252e9b99253b2a587287": "Restauração de Dados", "03a2bd12e8b51af547a08985d4882d6d": "Migração Concluída", - "0fd957e5b2d9c535c344e9a8f86a225c": "Falha ao ler o status da tarefa: {}", - "181f2da22cdbf536f67e46452108d95d": "Falha ao salvar o status da tarefa: {}", - "4439b17c5e0977e0c73c643cea950424": "Falha ao salvar o registro de tarefa global: {}", - "74c6e9c56a9d836f2dac86fe8e0770e3": "Não foi possível ler o ID da tarefa em execução atual", + "0fd957e5b2d9c535c344e9a8f86a225c": "Falha ao ler status da tarefa: {}", + "181f2da22cdbf536f67e46452108d95d": "Falha ao salvar status da tarefa: {}", + "4439b17c5e0977e0c73c643cea950424": "Falha ao salvar registro de tarefa global: {}", + "74c6e9c56a9d836f2dac86fe8e0770e3": "Incapaz de ler o ID da tarefa em execução atual", "62688aeae1c92fc7d92caaa83f22a411": "Status da tarefa recuperado com sucesso", "087b165a5f0bd5a04f2ce4be7dca14dd": "Nenhuma tarefa em execução", - "37a5c6e23237ddff7185d375c34eed60": "A tarefa {} não existe", + "37a5c6e23237ddff7185d375c34eed60": "Tarefa {} não existe", "f613fc3fb0aee3affafcae3477d42bf8": "Uma tarefa já está em execução, ID da tarefa: {}", - "367b4a21be07204266d306508cc92dc7": "Tarefa de migração inicializando", + "367b4a21be07204266d306508cc92dc7": "Inicializando tarefa de migração", "793c8358adb487f79f85acfdc44d54bb": "Criando tarefa de migração: {} -> {}", "e597529fcdfa1dab69eadaf1c44088ba": "Tarefa de migração criada com sucesso", "c304dcebe892b468725402a369b3dd46": "Conectando ao servidor {}:{}", "d2f3c14129fe059cf6d99f1583abc23e": "[+] Conectado com sucesso ao servidor {}", "ae3c4e96fa1411ea25c05ce9a18ae2ae": "Conectado com sucesso ao servidor {}", "c7203791b356c5f3faf5d8c43d54a575": "Falha na autenticação: nome de usuário ou senha incorretos", - "10adeeeb866978b5ae637ae2bc13fb96": "Exceção de conexão SSH: {}", + "10adeeeb866978b5ae637ae2bc13fb96": "Exceção na conexão SSH: {}", "1e36faff765dbbbe631f424983a21783": "Erro de conexão de rede: {}", "f9d5c96265bf9a99b163f5adf699cde9": "Falha ao conectar ao servidor: {}", "cd4dc264f41eda817374af0bddcea259": "Conectando usando chave RSA", @@ -3354,7 +3240,7 @@ "f618338d0d56f440d7fb1b59d8add72c": "Falha ao carregar chave ECDSA: {}", "f579ce14b1e98ae9ad4d392279730d9a": "Conectando usando chave {}", "696797724fc3db3f012761759f720c23": "Falha ao carregar chave {}: {}", - "fa4e18c6d3b0c0fa6a5ac1303dda02a7": "Não foi possível reconhecer ou carregar a chave, verifique se o formato do arquivo de chave está correto", + "fa4e18c6d3b0c0fa6a5ac1303dda02a7": "Incapaz de reconhecer ou carregar a chave, verifique se o formato do arquivo de chave está correto", "369709628dacb54949b2c711acd93968": "[*] Tentando reconectar ao servidor (tentativa {}/{})...", "88aefbc5392deac3ab63223d6d82b66b": "[!] Falha ao reconectar ao servidor, número máximo de tentativas atingido ({})", "908300abff5dfdf254726c2193f3e550": "Falha ao reconectar ao servidor, número máximo de tentativas atingido ({})", @@ -3363,23 +3249,23 @@ "43234c4b446ff41810dcf807d317cba7": "[*] Executando comando: {}", "db4d271e5cb8fe3192ed73bd624a86fe": "[+] Saída:", "c519185a1f47d37b21866e5f05928dc8": "[!] Erro:", - "6a2909a7dbeca5d8c85843ecd4cd3fae": "[!] Conexão SSH desconectada ao executar o comando: {}", - "88783238ef5d081aade9e63160d329fb": "[*] Reconectado com sucesso, tentando o comando novamente...", + "6a2909a7dbeca5d8c85843ecd4cd3fae": "[!] Conexão SSH desconectada ao executar comando: {}", + "88783238ef5d081aade9e63160d329fb": "[*] Reconectado com sucesso, tentando comando novamente...", "8692bb08477b83615b1ae995552e2c92": "[*] Detectando tipo de SO do servidor...", "95adf53ab7c91ed98c77d3c0e38a2a1a": "[+] Tipo de SO: {}", - "2ab043e41d8fd10931cfa912b4b11bf8": "[!] Não foi possível determinar o tipo de SO", - "2d23313d6e3e201771154cf99d5dab34": "Falha na instalação do curl ou wget, instale-o manualmente", + "2ab043e41d8fd10931cfa912b4b11bf8": "[!] Incapaz de determinar o tipo de SO", + "2d23313d6e3e201771154cf99d5dab34": "Instalação de curl ou wget falhou, instale manualmente", "b44992b4430f7759108e5242176b7871": "[+] curl ou wget está instalado", "4ba07005cef8f98a0625a7d1eb0a142e": "curl ou wget está instalado", "e3a56811a35322959c535d38d2e91f7e": "[!] curl ou wget não está instalado, tentando instalar...", - "613a8be93fcd44002e549e0767c85a86": "Não foi possível detectar o tipo de SO, instale curl ou wget manualmente", - "8a4d20948ccc8034e3118af3bb683da3": "Iniciar a instalação do aapanel", - "df97b5d4f31c5cd4a3611774abb6de52": "[*] Começando a instalar o aapanel...", - "d91a58f92edb4b30de7e5399908922da": "[*] Instalando aapanel com o comando: {}", + "613a8be93fcd44002e549e0767c85a86": "Incapaz de detectar o tipo de SO, instale curl ou wget manualmente", + "8a4d20948ccc8034e3118af3bb683da3": "Iniciar instalação do aapanel", + "df97b5d4f31c5cd4a3611774abb6de52": "[*] Iniciando a instalação do aapanel...", + "d91a58f92edb4b30de7e5399908922da": "[*] Instalando aapanel com comando: {}", "f20af8613aed0194f191d660977de57c": "Instalação concluída", "4357633f73240ceb1b14d13877a90ac2": "aapanel instalado com sucesso, iniciando tarefa de backup...", "f109f7ce6f98f5a3cbf2d273c5749911": "[+] endereço: http://{}:{}{}", - "79fca63f99a824fc4015d93604433ea1": "Falha na instalação do aapanel", + "79fca63f99a824fc4015d93604433ea1": "instalação do aapanel falhou", "b1508aec34af599979d919e20b64e385": "Progresso da instalação: {}", "7b6725a19c46bc6d47e5a49c5764991f": "[+] nome de usuário: {}", "cd3d4cf5a75fd5f9467f6d0f196dbec8": "[+] senha: {}", @@ -3387,12 +3273,12 @@ "c550206bc8daea4b287573ee31f839de": "[+] Diretório de backup {} criado", "9e3f708636e9ea820d608629fdf47c65": "[!] Falha ao criar diretório de backup {}", "9f22d9cb59270cf0f6382a66a63ed8cd": "Falha ao obter tamanho do arquivo remoto: {}", - "ff490ab3be22afd2f2a06842935eedd3": "O arquivo de backup {} não existe", - "e69d7c21f42d046b365c56045ffca873": "Iniciar upload do arquivo de backup {} para o servidor", - "df6ecb94c7a5f06b78d0bde168e769e9": "[*] Começando a fazer upload do arquivo de backup {} para o servidor...", + "ff490ab3be22afd2f2a06842935eedd3": "Arquivo de backup {} não existe", + "e69d7c21f42d046b365c56045ffca873": "Iniciar envio do arquivo de backup {} para o servidor", + "df6ecb94c7a5f06b78d0bde168e769e9": "[*] Iniciando envio do arquivo de backup {} para o servidor...", "217c9c3fec268ff4d6c35bd4d5d564ea": "Falha ao criar diretório de backup", "2942f90ee3b191c0b98add719760e356": "[*] Tamanho do arquivo: {:.2f} MB", - "08b57d594c99a8339461fe78ebf95f1a": "Preparando para fazer upload do arquivo, tamanho: {:.2f} MB", + "08b57d594c99a8339461fe78ebf95f1a": "Preparando para enviar arquivo, tamanho: {:.2f} MB", "2f24607a7361d721459e3a12584fd340": "Arquivo já totalmente enviado, pulando etapa de upload", "4d57fe7dc3462ad55cc9bb1623a3eb5e": "[*] Arquivo de upload incompleto detectado, tentando retomar...", "9c30f21dd1175d2e9b7503e873a52b2f": "[*] Enviado: {:.2f}% ({:.2f}MB / {:.2f}MB)", @@ -3400,19 +3286,19 @@ "426e1c0eadfad630c5433af2757cee8f": "[*] Iniciando novo upload...", "61eb03fffeb48e199890a5a8a24a5dc9": "Iniciando novo upload", "148b2912de8b29f47dc234983554ea2b": "\\r[*] Progresso do upload: {:.2f}% - {:.2f} KB/s - Tempo restante: {}", - "470e645fe1f07b6d4e77fc7b16b2a9a0": "Verificação do tamanho do arquivo aprovada: {:.2f}MB", + "470e645fe1f07b6d4e77fc7b16b2a9a0": "Verificação de tamanho de arquivo passou: {:.2f}MB", "40070e1f0867f97db0fa33039fae2063": "Arquivo enviado com sucesso", - "95dd52c0ce48e72f2021dee1a7a86433": "Incompatibilidade de tamanho de arquivo: local {:.2f}MB, remoto {:.2f}MB", + "95dd52c0ce48e72f2021dee1a7a86433": "Tamanho de arquivo incompatível: local {:.2f}MB, remoto {:.2f}MB", "f7dac1a705d6bd05b3a42086923cf932": "Upload interrompido: {}", "554472ae3f1db37c67fe53e4a2fb53cd": "[*] Tentará retomar do ponto de interrupção {:.2f}MB (tentativa {}/{})...", - "1e6aeb0dc8e2567bdec31246c27233a2": "Falha no upload do arquivo, número máximo de tentativas atingido", - "31c53955195484e892d36d1815e2e5cd": "[*] Começando a extrair arquivo de backup {}...", - "21ec696ab5bc206eac1cf62268824cf0": "[!] O arquivo de backup {} não existe", - "e344a18f13f2b196f3b56938c824dd5f": "[!] Não foi possível extrair carimbo de data/hora do nome do arquivo de backup", - "d4a81ed03254ca37166d84ccb7de0bd6": "[!] Falha na extração do arquivo de backup", + "1e6aeb0dc8e2567bdec31246c27233a2": "Falha no envio do arquivo, número máximo de tentativas atingido", + "31c53955195484e892d36d1815e2e5cd": "[*] Iniciando extração do arquivo de backup {}...", + "21ec696ab5bc206eac1cf62268824cf0": "[!] Arquivo de backup {} não existe", + "e344a18f13f2b196f3b56938c824dd5f": "[!] Incapaz de extrair timestamp do nome do arquivo de backup", + "d4a81ed03254ca37166d84ccb7de0bd6": "[!] Extração do arquivo de backup falhou", "0838e64585e87c91bdfa34890445346e": "[+] Arquivo de backup extraído com sucesso, diretório: {}", - "0fddb4bae41a7fc9e2de8896d8cb819f": "Iniciar restauração do backup (carimbo de data/hora: {})", - "5a275e6386d2d3c647f6ccecb422debc": "[*] Começando a restaurar backup (carimbo de data/hora: {})...", + "0fddb4bae41a7fc9e2de8896d8cb819f": "Iniciar restauração de backup (timestamp: {})", + "5a275e6386d2d3c647f6ccecb422debc": "[*] Iniciando restauração de backup (timestamp: {})...", "e9b7b10566a85a5356096a630d64d2d7": "[*] Aguardando o serviço aapanel iniciar...", "8d7b4f7247dec431d103af1ce34d0233": "Módulo de restauração não existe: {}", "304e687ee7c78fdae6e70226f61d9708": "Executando adicionar tarefa de restauração...", @@ -3421,18 +3307,18 @@ "846cdc02545d18e4b5308d076aa93e95": "Backup restaurado com sucesso", "062ca961d059ebd358098ffdb12f42bb": "Falha na restauração do backup, verifique o log", "f857f6dc6a146a3b125ea3253052ca43": "Iniciar tarefa de migração", - "53779b59d2ae1ff96f4afdfa6bbc6c7f": "Verifique se curl ou wget está instalado", - "39679b63dca413a83cf5b664d46c929b": "Verificação de curl ou wget aprovada", + "53779b59d2ae1ff96f4afdfa6bbc6c7f": "Verificar se curl ou wget está instalado", + "39679b63dca413a83cf5b664d46c929b": "Verificação curl ou wget passou", "0de6a624fa64af38f9a880430e72607e": "Preparando para instalar aapanel", "28dbda7cf25735198d7695702b18aad5": "Instalando aapanel... estimado 5 minutos....", "7a58e7034a9db769af197c85beccafd5": "Instalação do aapanel concluída, iniciando tarefa de backup...", - "a850af0d3bf3586319178228af5698bf": "Começar a executar tarefa de backup nesta máquina", + "a850af0d3bf3586319178228af5698bf": "Iniciar execução da tarefa de backup nesta máquina", "28ec7aad1cd6afdbbc35a6aeaa95761a": "Aguardando conclusão do backup local", "82550a0ece235f0d0b363135e8d94d28": "Tarefa de backup cancelada ou falhou", - "c8f2865e1e43bb2fd88a0e16f3cd4c17": "A tarefa de backup expirou e não foi concluída dentro do tempo especificado", - "4bb768be41853a0aed9f56d5907be1bd": "Carimbo de data/hora do backup obtido: {}", - "c129e18a625645767772504cf77e279a": "Falha ao ler carimbo de data/hora do backup", - "39869251ca57148d747cfd6ee60bf604": "Arquivo de carimbo de data/hora do backup não existe", + "c8f2865e1e43bb2fd88a0e16f3cd4c17": "Tarefa de backup expirou e não completou dentro do tempo especificado", + "4bb768be41853a0aed9f56d5907be1bd": "Timestamp de backup obtido: {}", + "c129e18a625645767772504cf77e279a": "Falha ao ler timestamp de backup", + "39869251ca57148d747cfd6ee60bf604": "Arquivo de timestamp de backup não existe", "60f1d8c19f5fbb046deac4aab745f63c": "Arquivo de backup não existe: {}", "d67c60b6be8ebfd9f73816a7e8e4abfe": "Falha ao ler caminho do arquivo de backup", "9e6caab47781582f556a81245571d8a7": "Backup local concluído: {}", @@ -3446,8 +3332,8 @@ "fdf17802146b46b291164d7c933950c1": "Arquivo de backup enviado com sucesso", "97dc827b342454de3a5f9416ee1e513b": "Preparando para extrair arquivo de backup {}", "67c40d3544174eb6d6fa63dccaa6bf6e": "Preparando para adicionar tarefa de restauração de backup", - "7ec7fd83e38b6d53374f37bd32a3da09": "Preparando para restaurar backup (carimbo de data/hora: {})", - "7fd19264d09d2ff33f1f8b5867354fdb": "Ocorreu uma exceção durante o backup e restauração", + "7ec7fd83e38b6d53374f37bd32a3da09": "Preparando para restaurar backup (timestamp: {})", + "7fd19264d09d2ff33f1f8b5867354fdb": "Ocorreu uma exceção durante backup e restauração", "ef05e1295515a64356e53d3c11498f25": "Tarefa de restauração de backup adicionada com sucesso", "f90b7afaee99210e74fa3bc47d4f4918": "Todas as operações de migração foram concluídas", "9e5e797901f9870ebf7a96266bc1e972": "Tarefa de migração concluída", @@ -3461,70 +3347,72 @@ "c0b860cd7155af1e642fd0c41ee29262": "Caminho do arquivo de backup não especificado", "fa1ab4e94bafd1f5b6ea55e3e9dc33a4": "Falha na extração do arquivo de backup", "d36c2f46c959ee1fb416a947f8e75a47": "Falha na restauração do backup", - "de6b9cefab1a252ada4463ee8f015f07": "[+] Todas as operações foram concluídas", - "496249e9e1cd99dd54146ed6565fe3f8": "Todas as operações foram concluídas", - "20c605607dbf9d6d1d7bb62ddc792ee0": "[!] Ocorreu um erro durante a execução: {}", - "4020efc99e8c60a0e7d27a5598d501e4": "Ocorreu um erro durante a execução: {}", + "de6b9cefab1a252ada4463ee8f015f07": "[+] Todas as operações concluídas", + "496249e9e1cd99dd54146ed6565fe3f8": "Todas as operações concluídas", + "20c605607dbf9d6d1d7bb62ddc792ee0": "[!] Erro ocorrido durante execução: {}", + "4020efc99e8c60a0e7d27a5598d501e4": "Erro ocorrido durante execução: {}", "55be882ba3aef502f3a93ad90bb9d613": "[*] Executando comando de backup...", "1a6da8233a4a66ccc90d767967f22d35": "[+] Tarefa de backup adicionada com sucesso", "af3c2b419ba0779d81ac91cd3ca246b6": "[*] Aguardando conclusão da tarefa de backup...", "c8eb8110632bb540ca112819e96dc770": "[+] Tarefa de backup concluída: {}", "0d1135061a5b00b63bdb12c2f3c9461f": "Tarefa de backup falhou, arquivo de backup não gerado", "f6c3d2e26255f8c185cbcd95ccf2ccfa": "[+] Tarefa de backup concluída (arquivo detectado após tempo limite): {}", - "637452f337bdc2991f23593124d62440": "[!] A tarefa de backup expirou e não foi concluída dentro do tempo especificado", - "ec3a935e2442ef55924ad758e17b92cb": "Empacotamento concluído", + "637452f337bdc2991f23593124d62440": "[!] Tarefa de backup expirou e não completou dentro do tempo especificado", + "b02ab16f5a7d45a871789d3944a41c69": "Backup concluído mas incapaz de obter timestamp", "ffad0690fefe9ebaaf4d847a42b19f90": "Arquivo de configuração de backup não existe", + "46f183fbf6bd1e64702d6930667cf117": "Erro ao obter informações de conclusão de backup: {}", + "b16acd08872bef5685bddff85a29f625": "Empacotamento de Dados", + "df4bb29cbb7fe7e3dbc82e961d5b5b53": "Preparando dados", + "2b2a2a0b0596507029dd0feb9485a216": "Nenhuma tarefa em andamento encontrada. Por favor verifique", + "ec3a935e2442ef55924ad758e17b92cb": "Empacotamento concluído", "40379fed8ad84c0869a1b3e94f8a56fb": "Um processo de backup já está em execução!", - "20bf8648c4a3ea91ad3057f9aeca5f88": "Iniciar compactação e empacotamento de todos os dados", - "dc72aa669e82dd5ec7cff2ed35f2762d": "Compactação e empacotamento de todos os dados concluídos. Tamanho dos dados: {}", + "20bf8648c4a3ea91ad3057f9aeca5f88": "Iniciar compressão e empacotamento de todos os dados", + "dc72aa669e82dd5ec7cff2ed35f2762d": "Compressão e empacotamento de todos os dados concluídos. Tamanho dos dados: {}", "bacf615d02bfa3c58728f62490489e9a": "Backup concluído. Arquivo de backup: {}", "ad69c11076734ffc4c0532b54e6f5be3": "Enviando arquivo de backup para armazenamento em nuvem...", - "c3a6378e06ff3e479a85b0f15c41cb1e": "{} Enviando em partes...", + "c3a6378e06ff3e479a85b0f15c41cb1e": "{} Enviando em pedaços...", "c722636ded0be8237386a427242ff3b2": "{} Enviando...", - "bb914d2441ee988dcd4d616350272f10": "Ocorreu um erro ao enviar para {}: {}", - "8085ded0444fcde19b9ea4d365502f67": "Informações de backup não encontradas", - "b02ab16f5a7d45a871789d3944a41c69": "Backup concluído, mas incapaz de recuperar carimbo de data/hora", - "46f183fbf6bd1e64702d6930667cf117": "Erro ao recuperar informações de conclusão de backup: {}", - "2cb88461938b0c418391af13f65a727d": "Processo de backup está em execução, mas incapaz de recuperar carimbo de data/hora", + "bb914d2441ee988dcd4d616350272f10": "Erro ocorrido ao enviar para {}: {}", + "8085ded0444fcde19b9ea4d365502f67": "Info de backup não encontrada", + "2cb88461938b0c418391af13f65a727d": "Processo de backup está em execução, mas incapaz de obter timestamp", "269159feb2faab7515c90b9f5de791a5": "Arquivo de configuração de backup não existe: {}", - "daa55a73708f906c8cee0bb87284740c": "Erro ao recuperar informações de progresso do backup: {}", + "daa55a73708f906c8cee0bb87284740c": "Erro ao obter informações de progresso de backup: {}", "01ecbbb2b353cf4d915bbe1c1cd5505c": "Configuração do Servidor", "ca3c22c9c94069053b85db0f50373639": "Fazendo backup da configuração do servidor", - "b16acd08872bef5685bddff85a29f625": "Empacotamento de Dados", "d41c74fcc2dd04880a0285c147188bf7": "Preparando dados de backup", "806cb06592627effa1a4073fa2f66ce2": "Um processo de restauração já está em execução!", - "37dfdfda0ab7a98140943484fe70a76c": "Iniciar descompactação do pacote de dados", + "37dfdfda0ab7a98140943484fe70a76c": "Iniciar descompressão do pacote de dados", "c415a70c8540eb59121587b3ab5d5cfa": "Iniciar restauração de dados", "c76bac64baa6fbf5c51ec144c70d91d3": "Restauração de dados concluída", - "da7f5eb715a1a1a2378ee56a5ee24bbd": "Falha na restauração de dados: {}", - "ca0af2ce76c89e3bfa4bad3105c21203": "Restauração concluída, mas incapaz de obter carimbo de data/hora de restauração", + "da7f5eb715a1a1a2378ee56a5ee24bbd": "Restauração de dados falhou: {}", + "ca0af2ce76c89e3bfa4bad3105c21203": "Restauração concluída mas incapaz de obter timestamp de restauração", "0f4f13d63e87130a24667c6bd4cb5e2e": "Arquivo de configuração de restauração não existe", - "0c5d25bf5706190b8ad0d8289a93aeba": "Erro ao obter informações de conclusão da restauração: {}", + "0c5d25bf5706190b8ad0d8289a93aeba": "Erro ao obter informações de conclusão de restauração: {}", "667a68bf7113541f218081fac58f6815": "Arquivo de configuração de restauração não existe: {}", - "e7a91a4400b67b84e7cca61642b93f4d": "Erro ao obter informações de progresso da restauração: {}", + "e7a91a4400b67b84e7cca61642b93f4d": "Erro ao obter informações de progresso de restauração: {}", "1b4c2c21e77ac36e4097a92dabd55bc0": "Desconhecido {}", "c1173fa3bd3d44530eead89e7edeefe1": "Descompressão de Dados", "a76a19147d36f4f2d6801cf602de2718": "Tarefa Desconhecida", "5ba4673aac259be67bac9db8cfc9c5b2": "Preparando para restaurar dados", - "5b43e0e228169e5df9cec81876cd3710": "Erro: o parâmetro force deve ser 0 ou 1", + "5b43e0e228169e5df9cec81876cd3710": "Erro: parâmetro force deve ser 0 ou 1", "4c3880bb027f159e801041b1021e88e8": "Método", - "7d3c180ded4dcc8eade80cd031ab1b5d": "Por favor, não opere com frequência, aguarde um momento", + "7d3c180ded4dcc8eade80cd031ab1b5d": "Por favor, não opere frequentemente, aguarde um momento", "37b15a5d1e4fa625ea8996de5e378a84": "Recuperado com sucesso", "616e012bcc90980f6ddfd2b3c17345f8": "Falha ao obter progresso", "9e0a136b55af822e72c8d6716d2d4bf3": "Tipo Desconhecido", "6ac0b58e56cefd76e61bc840dfad94fa": "Tarefa parada com sucesso", "b808472e703dfd53fdcb59fbe89e3436": "Executado com sucesso", "12b65fbe011be723b4ae981c0d42c44d": "Tarefa de restauração adicionada com sucesso", - "741e160bb129a548e26fbad37c8f674d": "Teste de conexão SSH falhou, verifique se o IP e a porta estão corretos", + "741e160bb129a548e26fbad37c8f674d": "Teste de conexão SSH falhou, verifique se o IP e porta estão corretos", "e0867cf8c8a1935e8bd681f0ff28a612": "Conexão SSH verificada com sucesso", "f94e94b4ec479336f36fdf9fe1004b83": "Minha Tarefa de Migração", "b100f6e1c91f013adf0ca5ce6606a89d": "Tarefa de migração adicionada com sucesso", "fd0099266c1971c5c40036e615d67fd4": "Migrado com sucesso", - "87aa2e739755a6fea3a63876b5a1d48e": "Com Sucesso", - "d7db03701029007097b8e0cd61a983f6": "Nenhuma tarefa de migração no momento", - "808781229f7b019ba6a44ea3871e3b6d": "falha na leitura da tarefa de migração, tente novamente mais tarde!", + "87aa2e739755a6fea3a63876b5a1d48e": "Com sucesso", + "d7db03701029007097b8e0cd61a983f6": "Nenhuma tarefa de migração atualmente", + "808781229f7b019ba6a44ea3871e3b6d": "leitura de tarefa de migração falhou, tente novamente mais tarde!", "e728b6a004aa5e61efd25bf815a6e290": "Iniciando tarefa de backup...", - "c9d48d6a4ebe28917b5439c91faaff68": "Instalação do aapanel concluída!", + "c9d48d6a4ebe28917b5439c91faaff68": "instalação do aapanel concluída!", "f5e7895e7c31fedd32b520012910f960": "Tarefa de Migração", "3a94451860f0c20374128e61e8783d26": "Instalação do aapanel", "f02f38d885226197e729453ea104feac": "Tarefa de Restauração", @@ -3534,176 +3422,174 @@ "3a02e4b05ad1b321e855aa6116699b6e": "Lembrete de migração excluído com sucesso", "334afd10871f8c52a884e307d2e17ccf": "Histórico de migração excluído com sucesso", "2f393a2518f5668880822f47fcdb5cc0": "Histórico de migração não existe", - "df4bb29cbb7fe7e3dbc82e961d5b5b53": "Preparando dados", - "2b2a2a0b0596507029dd0feb9485a216": "Nenhuma tarefa em andamento encontrada. Por favor, verifique", "d4e8a75d522d3e77ae80eadd49b0865e": "A lista de bancos de dados remotos está vazia", "5d806f11bb91996cafe7836b27a4e770": "Exceção de conexão Redis!", - "1d69261c05f6ce03d2cab5528d443fa7": "Iniciando um backup dos dados do banco de dados", - "0cf1803cfdfda6f67d12fa7e1c4a25a7": "Backup {}banco de dados {}remoto", - "32d68be800692faddb12c5252fded05e": "{}Informações do banco de dados {}remoto ✓", + "1d69261c05f6ce03d2cab5528d443fa7": "Iniciando backup dos dados do banco de dados", + "0cf1803cfdfda6f67d12fa7e1c4a25a7": "Backup {}banco de dados remoto {}", + "32d68be800692faddb12c5252fded05e": "{}Informação de banco de dados remoto {} ✓", "0c64283397c43effb13a2cbe818ce929": "Backup dos dados do banco de dados concluído", - "2f7d7cfc04be64fa087e964d41cb26b4": "Iniciar restauração da lista de bancos de dados SQLite", - "a1248c409fec22277ab13a6bb433188e": "O arquivo de backup da lista de bancos de dados SQLite não existe, ignorando restauração", - "d03ebecb5f420070192de8712926151a": "Restauração da lista de bancos de dados SQLite concluída", - "ad6937d61b4d6e93a13f03308c66f2eb": "O serviço Mongodb não está em execução!", - "f60644c6526c4d9afe5b20db75fc2e5b": "Falha no backup do banco de dados, o diretório de exportação não existe!", - "161bb420493657920405937a2cf42c96": "Falha na compactação do backup!", + "2f7d7cfc04be64fa087e964d41cb26b4": "Iniciar restauração da lista de banco de dados SQLite", + "a1248c409fec22277ab13a6bb433188e": "Arquivo de backup da lista de banco de dados SQLite não existe, pulando restauração", + "d03ebecb5f420070192de8712926151a": "Restauração da lista de banco de dados SQLite concluída", + "ad6937d61b4d6e93a13f03308c66f2eb": "Serviço Mongodb não está rodando!", + "f60644c6526c4d9afe5b20db75fc2e5b": "Falha no backup do banco de dados, diretório de exportação não existe!", + "161bb420493657920405937a2cf42c96": "Falha na compressão do backup!", "20a42330f9241c13c91e3e203449a8a6": "Falta de ferramenta de backup, instale o gerenciador pgsql via loja de software primeiro!", "7eff7c4aeb6bfe736f8a78c0096f92c7": "Por favor, defina a senha do administrador primeiro!", - "6e907b499869ab16105a7aba198e13a7": "A senha do banco de dados está vazia! Por favor, defina a senha do banco de dados primeiro!", + "6e907b499869ab16105a7aba198e13a7": "A senha do banco de dados está vazia! Por favor defina a senha do banco de dados primeiro!", "d8a3336243e1c08e8a29c75af1eb528c": "Inicialização do MySQL bem-sucedida!", - "ee9017df13cf59a9b0d6588c5e8d9e5a": "MySQL será reiniciado, por favor aguarde...", + "ee9017df13cf59a9b0d6588c5e8d9e5a": "MySQL irá reiniciar, por favor aguarde...", "73af95fd2322196e0d9792df4ca1f566": "Inicialização do MongoDB bem-sucedida!", - "8c9718f3235e7c36c9f400bc68db1ef5": "Falha na autenticação do MongoDB! erro: {}", + "8c9718f3235e7c36c9f400bc68db1ef5": "Falha ao definir auth do MongoDB! erro: {}", "79d1fd8783e1723ef3617be74f8f5fdd": "Inicialização do PostgreSQL bem-sucedida!", "c46866b7bc29cf9d478835bda10e43ce": "Inicialização do Redis bem-sucedida!", "4e889bbbfc5e25ebf611e5764b8a358c": "Iniciar restauração do banco de dados", - "c9206e74b8d32e1e0a5710c0fe322cee": "Restaurando banco de dados {} {}", - "ecea29915732c5d0001ece74601f3d20": "Banco de dados {} {} ✓", - "b61a878149263a02fa99cc635409ee25": "Banco de dados {} {} ✗ ({})", - "3fa7c5a9beafa67bb44999cab5cff52c": "Falha ao restaurar banco de dados {} {} Motivo: {}", + "c9206e74b8d32e1e0a5710c0fe322cee": "Restaurando {} banco de dados {}", + "ecea29915732c5d0001ece74601f3d20": "{} banco de dados {} ✓", + "b61a878149263a02fa99cc635409ee25": "{} banco de dados {} ✗ ({})", + "3fa7c5a9beafa67bb44999cab5cff52c": "Falha ao restaurar {} banco de dados {} Razão: {}", "e89775cca910deb5e484f631606cceb1": "Restauração dos dados do banco de dados concluída", "9750547146e22f364299bc5f561a3fb6": "Iniciar restauração do banco de dados remoto", "23f2db47eb6ff16785e5a222c8657f93": "Restauração do banco de dados remoto concluída", - "b17f6f187c4ecfd392c6367ec2ba6498": "id de backup {} não existe, importação terminada", - "3e686ed1f6a0bc9ccba7a3cc119b5008": "id do banco de dados {} não existe, recuperação de dados terminada", + "b17f6f187c4ecfd392c6367ec2ba6498": "{} id de backup não existe, importação terminada", + "3e686ed1f6a0bc9ccba7a3cc119b5008": "{} id de banco de dados não existe, recuperação de dados terminada", "611881e9f5d01b22a447c282aa8aca23": "Banco de dados MySQL {} já existe", - "ea31cbc6134300ca816c913d227b605f": "Falha ao criar banco de dados {}. Motivo: {}", - "3fdbf50d7a2f33c3d48d4cfe69a3ba77": "Banco de dados já existe, ignorando restauração SQL", + "ea31cbc6134300ca816c913d227b605f": "Falha ao criar {} banco de dados. Razão: {}", + "3fdbf50d7a2f33c3d48d4cfe69a3ba77": "Banco de dados já existe, pulando restauração SQL", "556843e4a406b780b0cf83c43366a8dd": "Importação bem-sucedida", "af71c2c0e3813c9a77fe48507ea8e4d1": "Banco de dados MongoDB {} já existe", "84b4d8c8cdd02488c0f868e97b22a3c2": "Criação bem-sucedida", - "10aec3a9e9564a9851c117b259245136": "Banco de dados já existe, ignorando restauração de dados", + "10aec3a9e9564a9851c117b259245136": "Banco de dados já existe, pulando restauração de dados", "b819d4259ca3ab0042562acea69e83e1": "Banco de dados PostgreSQL {} já existe", "31b21eca2e62de420cf05e8135089114": "Arquivo de backup não existe!", "3eed4851380704f25eec3921befde38f": "Restauração bem-sucedida", - "cbea0a592d6a3c48f2418d687cf54200": "Iniciar backup dos dados do terminal", - "e7e06b2dd59401dcf79acf2e3124d2fb": "Backup dos dados do terminal concluído. Tamanho dos dados: {}", - "a273d4d4d0cf13abc1d7a4f96b8c851e": "Iniciar restauração dos dados do terminal", + "5e211e4fb46748c1d243b59a15645df7": "Iniciando uma Tarefa Agendada de Backup", + "a9d58d413bd48f1bd7e8041b6d8ceab0": "Tarefa Crontab {} ✓", + "ff0550fa0270ac20419790a51900d815": "Backup de Tarefa Crontab concluído", + "a7609aefd5330a1384704e73dc0b4dc0": "Iniciar restauração de Tarefa Crontab", + "48ed083561c2f201d9fe52f6a35ee982": "Tarefa Crontab realizada", + "cbea0a592d6a3c48f2418d687cf54200": "Iniciar backup de dados do terminal", + "e7e06b2dd59401dcf79acf2e3124d2fb": "Backup de dados do terminal concluído. Tamanho dos dados: {}", + "a273d4d4d0cf13abc1d7a4f96b8c851e": "Iniciar restauração de dados do terminal", "1a15a2b43f1dd92e836a592fb180843d": "Restauração falhou, arquivo não existe", - "95d831166994e434da49f3ed70b73e8e": "Restauração dos dados do terminal concluída", - "e3a04ee4c0a034510866948e571c7966": "Iniciando backup dos dados do firewall", - "9a176a20c15e3dc096ed8bc5a05182ba": "Regras de porta do firewall ✓", - "ce693968cbf6e5f66af91e3dd2317d78": "Regras de IP do firewall ✓", - "7ebd5e6b35357be0d5079f674f68ed8f": "Regras de encaminhamento do firewall ✓", - "8dfa78d85bb1d152b0cafe398b27e1ae": "Regras de região do firewall ✓", - "927bb2298acc2c29d1beaff4d1656371": "Backup dos dados do firewall concluído", - "d076d2dde53272dc55d47f34a465ebef": "Inicializando dados do firewall", - "3e0b3a3e90cc4a1f5abbf3fd1a38c2b7": "Instalado.", - "d1b0c3d7a1b5f80626ec1a2395b4f990": "Iniciando restauração dos dados do firewall", - "1f35b1eac1045718a64b4133a8e8829b": "Iniciando restauração das regras de porta do firewall", - "a168f915263109733b87807a0db41e01": "Regras de porta do firewall restauradas com sucesso ✓", - "ce04afdfe07dead0b0fb34e6bc00b6e5": "Falha ao restaurar regras de porta do firewall", - "c32b29f59e8b553998c75c5d7bc44dc6": "Iniciando restauração das regras de IP do firewall", - "b68673b625a1d48b3953e37bb39fcbab": "Regras de IP do firewall restauradas com sucesso ✓", - "ee0294aac018e0ab5f4e5e020f8d867c": "Falha ao restaurar regras de IP do firewall", - "326c03834ea4914dbb02cf04e0c0164f": "Iniciando restauração das regras de encaminhamento do firewall", - "b077ba90ec76f05d0e541733e8291e3f": "Regras de encaminhamento do firewall restauradas com sucesso ✓", - "5ed68fe9a3e0530485018c0704d91035": "Falha ao restaurar regras de encaminhamento do firewall", - "03f3f31fd240913a083a78fc2d60f6f8": "Iniciando restauração das regras de região do firewall", - "6f9922502feac3b7e6ede129664e3e18": "Regras de região do firewall restauradas com sucesso ✓", - "771b376bf4473fc2f1cea6958de2afeb": "Falha ao restaurar regras de região do firewall", - "6331b46ffa70ff97b558022d5ae8098a": "Iniciando reinicialização do firewall", - "1bb2a65f17d7e3c685f36f7ff1794338": "Reinicialização do firewall concluída", - "246f6edb1d9df9b3abe78fc810876c28": "Falha ao restaurar dados do firewall: {}", - "2c3f740bd2d0ca6e5f9cb79ededf0a5d": "Iniciar backup dos dados do site", + "95d831166994e434da49f3ed70b73e8e": "Restauração de dados do terminal concluída", + "2c3f740bd2d0ca6e5f9cb79ededf0a5d": "Iniciar backup de dados do site", "c886466d255b20be0dbde7f1b44b7f20": "Fazendo backup do projeto {}: {}", "7ecf25c18499d663d2e636d0a99f73a3": "Projeto {} {} ✓ ({})", - "0fc5eeb9bebed19653578a5df99d3e6e": "Backup dos dados do site concluído", - "9a2e8778b2a816fedb9f83afadcc2341": "Iniciando restauração das dependências Python do site...", - "fd16d36423b43735556724e0395e8f91": "Restauração das dependências Python do site concluída", + "0fc5eeb9bebed19653578a5df99d3e6e": "Backup de dados do site concluído", + "9a2e8778b2a816fedb9f83afadcc2341": "Iniciando restauração de dependências Python do site...", + "fd16d36423b43735556724e0395e8f91": "Restauração de dependências Python do site concluída", "bbf57ca8231bce958a3e528a08491874": "Falha na inserção no banco de dados do site: {}", - "389f018ba17dc25cb23a5300d8f630db": "O diretório de backup do site não existe: {}", - "21654e03b247d5e25abaa0ad542883c0": "Iniciar restauração dos dados do site", + "389f018ba17dc25cb23a5300d8f630db": "Diretório de backup do site não existe: {}", + "21654e03b247d5e25abaa0ad542883c0": "Iniciar restauração de dados do site", "c8cecd19f4f4a680a5879f828d1c5578": "Restaurando projeto {}: {}", - "35850d3654332477522ee06c756a3c85": "Falha ao excluir diretório de origem do site: {}", + "35850d3654332477522ee06c756a3c85": "Falha ao excluir diretório fonte do site: {}", "c88b730f7a6a312159272ce532947de2": "Projeto {}: {} ✓", - "24ee51964e4ece856493ca28fdb075ed": "Restauração dos dados do site concluída", - "483829cb5ae13bb190eb59acdf4f3231": "Iniciar backup dos dados do servidor de e-mail", - "8c7a0774ab14bae83a69b8562102fb0a": "Backup dos dados do servidor de e-mail concluído. Tamanho dos dados: {}", - "e8480272035737a247832288f618c270": "Iniciar restauração dos dados do servidor de e-mail", + "24ee51964e4ece856493ca28fdb075ed": "Restauração de dados do site concluída", + "483829cb5ae13bb190eb59acdf4f3231": "Iniciar backup de dados do servidor de correio", + "8c7a0774ab14bae83a69b8562102fb0a": "Backup de dados do servidor de correio concluído. Tamanho dos dados: {}", + "e8480272035737a247832288f618c270": "Iniciar restauração de dados do servidor de correio", "e058c7e1fd9cd1a4fd7ac7240a7765d2": "Restauração falhou, arquivo não existe", - "6e6e9dcfdf7bd846ab85a4ff0e0e2f95": "Restauração dos dados do servidor de e-mail concluída", - "1502c42b339a3dfe20e4c95186b38dc3": "Iniciar backup das informações da conta FTP", + "6e6e9dcfdf7bd846ab85a4ff0e0e2f95": "Restauração de dados do servidor de correio concluída", + "1502c42b339a3dfe20e4c95186b38dc3": "Iniciar backup de informações de conta FTP", "b5cf2f2c48fb5978825d3341759dd6d6": "Usuário {} ✓", - "120446d8a303de2396a1bb62ba8e8755": "Falha ao fazer backup das informações da conta FTP: {}", - "b18010e000c073a3587a89b2931c2770": "Backup das informações da conta FTP concluído", + "120446d8a303de2396a1bb62ba8e8755": "Falha ao fazer backup de informações de conta FTP: {}", + "b18010e000c073a3587a89b2931c2770": "Backup de informações de conta FTP concluído", "c9073077bfd7adb73cbe253177b08833": "Restaurando conta {}", - "c5df3d6bec6157b48fb24bf8fe2a2add": "Falha na criação do FTP: {}", + "c5df3d6bec6157b48fb24bf8fe2a2add": "Falha na criação de FTP: {}", "f3f8d4ba630fa6a7de1e9f4e34bad5dc": "Conta {} ✓", - "af4ff8fd3803d5496f74604eb1665e81": "Iniciar restauração da configuração da conta FTP", + "af4ff8fd3803d5496f74604eb1665e81": "Iniciar restauração de configuração de conta FTP", "2bf94c9147c8220fc83f955175216c40": "ftp: conta [{}] restaurada com sucesso ✓", - "9417f3027d6326176c986ffeee1f4491": "Falha ao restaurar configuração da conta FTP: {}", - "8ed95b2c3c38acf7e9532a582f08bb86": "Restauração da configuração da conta FTP concluída", - "49237b104331e8724e521b2fe6fdf6d8": "Iniciar backup dos dados do plugin", + "9417f3027d6326176c986ffeee1f4491": "Falha ao restaurar configuração de conta FTP: {}", + "8ed95b2c3c38acf7e9532a582f08bb86": "Restauração de configuração de conta FTP concluída", + "69d45b5b241dac0fa1efaf7b6966520b": "Iniciar backup de informações de certificado SSL", + "835601ead78ba62b89c4b27956645362": "{} {} Arquivo de certificado não existe ✗", + "025de5f8c791241d326ec4e086e9898e": "{} [{}] Certificado expirou ✗", + "ecd204c03ea44719e6fa4ea25569266a": "{} {} ✓", + "aa6b67db23e9cb0b943aa6c0def92cb4": "{} {} Falha no backup: {} ✗", + "ec56d7aedc9c5242d094ebbaeda5047e": "Backup de informações do provedor de API DNS concluído", + "b561b1ca5fd89d639144a099f5fe096d": "Backup de informações de certificado SSL concluído", + "7aa422d849ba11b569187382a3a509d1": "Restaurando sites de implantação para certificado {}...", + "4573d024bbb8e1f8c8efb2582a6a01c0": "Sites de implantação restaurados para certificado {}: {}", + "baa339aa8e95d46851fd48574cb1d902": "Restaurando caixas de correio de implantação para certificado {}...", + "9307ae55fb4a7b878e377790e040eec4": "Caixas de correio de implantação restauradas para certificado {}: {}", + "b057e2d52c20f76bf3c788eb9b4873fa": "Restaurando painel de implantação para certificado {}...", + "41596c0d36a66c44434d5882c3cfa793": "Painel de implantação restaurado para certificado {}: {}", + "6ffcb0a3e8cdf728b3e7bc45ae221e5a": "Falha na inserção do certificado, verifique o log", + "c8a71420e709d8a4d02914a78d9a0e06": "Iniciar restauração de configuração de certificado SSL de domínio", + "0672a3dc402dc9657fd0a0f1580d1c12": "Nenhum dado de restauração encontrado", + "52f23f668fced51c3e25c781299fbff8": "Diretório de backup {} não existe, impossível restaurar informações de certificado SSL", + "ad93ef11d3e4238618571f517e11e80d": "Restaurando {} Assunto: {}", + "c49480308ee71202cc5fff5ea96eaaed": "Arquivo de certificado não existe", + "42db220bc931b97aecdef6b6f0362bc4": "Certificado ou arquivo de chave privada faltando", + "9f88b7ffec183a54f2e7e6136b4f5ac7": "Restauração de informações de certificado SSL concluída", + "e9ed6b2a27deb5699565f0441dc713e9": "Iniciar backup de informações de software", + "e690c7866c5dbacbbc7860af5e6a3af1": "Backup de informações de software concluído", + "cabf299a6cfa5874e23582c535f301c6": "Iniciar instalação nginx-{}", + "33ec71107108ed89c0b526d5473526c8": "Iniciar instalação serviço apache", + "b815f2a7e299ea99d41d665c728756d9": "Instalação do servidor web concluída", + "70510d59e30015790f07ca53c80c5bec": "Iniciar instalação php-{}", + "2de6c0aa3c26285104f898b368bcf287": "Iniciar instalação node-{}", + "7d5cf115afd8be7c2a36d03b31d1ce44": "Iniciar instalação mariadb-{}", + "92e77c2b107f440d6d54062228112f73": "Iniciar instalação mysql-{}", + "4b09abb2edd44a4510395a297a2ff155": "Iniciar instalação mongodb-{}", + "69fa45968c5cc7a9115bff54e70c95c1": "Iniciar instalação memcached-{}", + "fbabb869ff01746bd144289622b277fc": "Iniciar instalação redis-{}", + "da7d69765f1876fba52c21a17e8c74c6": "Iniciar instalação pgsql-{}", + "99782b6a478e499d45a91f9d78e1c73a": "Iniciar instalação phpmyadmin-{}", + "640c4e334dc9587e212d36e685059478": "Iniciar instalação ftp-{}", + "aecfeaaa9e3bcff1f6169598772e90c0": "Iniciar restauração do ambiente de execução do painel", + "3b83e3fdb17c70ca190e263e0bd7173e": "Pulará instalação se o mesmo ambiente existir", + "e3a04ee4c0a034510866948e571c7966": "Iniciando backup de dados do firewall", + "9a176a20c15e3dc096ed8bc5a05182ba": "Regras de porta do Firewall ✓", + "ce693968cbf6e5f66af91e3dd2317d78": "Regras de IP do Firewall ✓", + "7ebd5e6b35357be0d5079f674f68ed8f": "Regras de encaminhamento do Firewall ✓", + "8dfa78d85bb1d152b0cafe398b27e1ae": "Regras de região do Firewall ✓", + "927bb2298acc2c29d1beaff4d1656371": "Backup de dados do firewall concluído", + "d076d2dde53272dc55d47f34a465ebef": "Inicializando dados do firewall", + "3e0b3a3e90cc4a1f5abbf3fd1a38c2b7": "Instalado.", + "d1b0c3d7a1b5f80626ec1a2395b4f990": "Iniciando restauração de dados do firewall", + "1f35b1eac1045718a64b4133a8e8829b": "Iniciando restauração de regras de porta do firewall", + "a168f915263109733b87807a0db41e01": "Regras de porta do firewall restauradas com sucesso ✓", + "ce04afdfe07dead0b0fb34e6bc00b6e5": "Falha ao restaurar regras de porta do firewall", + "c32b29f59e8b553998c75c5d7bc44dc6": "Iniciando restauração de regras de IP do firewall", + "b68673b625a1d48b3953e37bb39fcbab": "Regras de IP do firewall restauradas com sucesso ✓", + "ee0294aac018e0ab5f4e5e020f8d867c": "Falha ao restaurar regras de IP do firewall", + "326c03834ea4914dbb02cf04e0c0164f": "Iniciando restauração de regras de encaminhamento do firewall", + "b077ba90ec76f05d0e541733e8291e3f": "Regras de encaminhamento do firewall restauradas com sucesso ✓", + "5ed68fe9a3e0530485018c0704d91035": "Falha ao restaurar regras de encaminhamento do firewall", + "03f3f31fd240913a083a78fc2d60f6f8": "Iniciando restauração de regras de região do firewall", + "6f9922502feac3b7e6ede129664e3e18": "Regras de região do firewall restauradas com sucesso ✓", + "771b376bf4473fc2f1cea6958de2afeb": "Falha ao restaurar regras de região do firewall", + "6331b46ffa70ff97b558022d5ae8098a": "Iniciando reinício do firewall", + "1bb2a65f17d7e3c685f36f7ff1794338": "Reinício do firewall concluído", + "246f6edb1d9df9b3abe78fc810876c28": "Falha ao restaurar dados do firewall: {}", + "49237b104331e8724e521b2fe6fdf6d8": "Iniciar backup de dados do plugin", "26d785a1a32377e0e0e9498f4a7da12e": "Firewall Nginx ✓ ({})", "7f578816e3867140ee56ccbbc1d69f55": "Relatório de monitoramento do site ✓ ({})", "ff083aca075c6543c2999781b6677c19": "Proteção contra adulteração empresarial ✓ ({})", "2f29dad748ac1d8d50481ecbd7e05091": "Fortalecimento do sistema ✓ ({})", - "79bb9b38c599612b8b8f38ddc50f5c25": "Iniciar restauração dos dados do plugin", - "ee84e47223f5ce39b8bb239376db4af3": "Se a máquina migrada não estiver vinculada a um usuário aapanel e atualizada para a versão Profissional, podem ocorrer falhas na restauração do plugin", + "79bb9b38c599612b8b8f38ddc50f5c25": "Iniciar restauração de dados do plugin", + "ee84e47223f5ce39b8bb239376db4af3": "Se a máquina migrada não estiver vinculada a um usuário aapanel e atualizada para a versão Profissional, falhas na restauração do plugin podem ocorrer", "30560687e27ef30b6f1cde26359eea6c": "Iniciar instalação do firewall Nginx", "a776b4ccf7343a25223817c8597ca7cf": "Firewall Nginx ✓", - "d0c97e94eb5061783de7bbad8e7bd295": "Iniciar restauração dos dados do firewall Nginx", + "d0c97e94eb5061783de7bbad8e7bd295": "Iniciar restauração de dados do firewall Nginx", "0010c09bd9f322c3b88a89dd0b52c831": "Dados do firewall Nginx ✓", "427ad80bf462a92719fcff5c1a1be755": "Firewall Nginx ✗", "29ad27f749c3f913779d432115de597f": "Iniciar instalação do relatório de monitoramento do site", "66f3f8adc854963e94a643b706157309": "Relatório de monitoramento do site ✓", - "a0dded50b067929299258b3c8fc1b0e6": "Iniciar restauração dos dados do relatório de monitoramento do site", + "a0dded50b067929299258b3c8fc1b0e6": "Iniciar restauração de dados do relatório de monitoramento do site", "bd43add14ebbd0f448c207c48e1d5ac8": "Dados do relatório de monitoramento do site ✓", "a7b8bc831a9b36cc5127b5f8ecbec22a": "Relatório de monitoramento do site ✗", "c922c95c5f7973050d08412a26aab462": "Iniciar instalação da proteção contra adulteração empresarial", "31d844f4dd95b8a71e8ddbd1b9912ae5": "Proteção contra adulteração empresarial ✓", - "8fcd5da199e1e04830a686a576a2e914": "Iniciar restauração dos dados da proteção contra adulteração empresarial", + "8fcd5da199e1e04830a686a576a2e914": "Iniciar restauração de dados da proteção contra adulteração empresarial", "941b78173e944c6737a858bada098311": "Dados da proteção contra adulteração empresarial ✓", "50bcd3813a4b18663b0bdc29f73b8c90": "Proteção contra adulteração empresarial ✗", "cdcfb9e176572fe14bdc4c88474d8baf": "Iniciar instalação do fortalecimento do sistema", "4d86b9c9f554fa3d477a86d2f62aaa1b": "Fortalecimento do sistema ✓", - "5633c4d754985da6c7fab116964ac501": "Iniciar restauração dos dados do fortalecimento do sistema", + "5633c4d754985da6c7fab116964ac501": "Iniciar restauração de dados do fortalecimento do sistema", "bda583fc184a8e079a37e169a9614e10": "Dados do fortalecimento do sistema ✓", "479557cf249b3145d91a94ed130c5ecb": "Fortalecimento do sistema ✗", - "746e85b89c25244ae397c06029badc9c": "Restauração dos dados do plugin concluída", - "69d45b5b241dac0fa1efaf7b6966520b": "Iniciar backup das informações do certificado SSL", - "835601ead78ba62b89c4b27956645362": "{} {} Arquivo de certificado não existe ✗", - "025de5f8c791241d326ec4e086e9898e": "{} [{}] O certificado expirou ✗", - "ecd204c03ea44719e6fa4ea25569266a": "{} {} ✓", - "aa6b67db23e9cb0b943aa6c0def92cb4": "{} {} Falha no backup: {} ✗", - "ec56d7aedc9c5242d094ebbaeda5047e": "Backup das informações do provedor de API DNS concluído", - "b561b1ca5fd89d639144a099f5fe096d": "Backup das informações do certificado SSL concluído", - "7aa422d849ba11b569187382a3a509d1": "Restaurando sites de implantação para o certificado {}...", - "4573d024bbb8e1f8c8efb2582a6a01c0": "Sites de implantação restaurados para o certificado {}: {}", - "baa339aa8e95d46851fd48574cb1d902": "Restaurando caixas de correio de implantação para o certificado {}...", - "9307ae55fb4a7b878e377790e040eec4": "Caixas de correio de implantação restauradas para o certificado {}: {}", - "b057e2d52c20f76bf3c788eb9b4873fa": "Restaurando painel de implantação para o certificado {}...", - "41596c0d36a66c44434d5882c3cfa793": "Painel de implantação restaurado para o certificado {}: {}", - "6ffcb0a3e8cdf728b3e7bc45ae221e5a": "Falha na inserção do certificado, verifique o log", - "c8a71420e709d8a4d02914a78d9a0e06": "Iniciar restauração da configuração do certificado SSL do domínio", - "0672a3dc402dc9657fd0a0f1580d1c12": "Nenhum dado de restauração encontrado", - "52f23f668fced51c3e25c781299fbff8": "O diretório de backup {} não existe, impossível restaurar informações do certificado SSL", - "ad93ef11d3e4238618571f517e11e80d": "Restaurando {} Assunto: {}", - "c49480308ee71202cc5fff5ea96eaaed": "Arquivo de certificado não existe", - "42db220bc931b97aecdef6b6f0362bc4": "Faltando certificado ou arquivo de chave privada", - "9f88b7ffec183a54f2e7e6136b4f5ac7": "Restauração das informações do certificado SSL concluída", - "5e211e4fb46748c1d243b59a15645df7": "Iniciando Backup da Tarefa Agendada", - "a9d58d413bd48f1bd7e8041b6d8ceab0": "Tarefa Crontab {} ✓", - "ff0550fa0270ac20419790a51900d815": "Conclusão do Backup da Tarefa Crontab", - "a7609aefd5330a1384704e73dc0b4dc0": "Iniciar restauração da Tarefa Crontab", - "48ed083561c2f201d9fe52f6a35ee982": "Tarefa Crontab concluída", - "e9ed6b2a27deb5699565f0441dc713e9": "Iniciar backup das informações de software", - "e690c7866c5dbacbbc7860af5e6a3af1": "Backup das informações de software concluído", - "cabf299a6cfa5874e23582c535f301c6": "Iniciar instalação do nginx-{}", - "33ec71107108ed89c0b526d5473526c8": "Iniciar instalação do serviço apache", - "b815f2a7e299ea99d41d665c728756d9": "Instalação do servidor web concluída", - "70510d59e30015790f07ca53c80c5bec": "Iniciar instalação do php-{}", - "2de6c0aa3c26285104f898b368bcf287": "Iniciar instalação do node-{}", - "7d5cf115afd8be7c2a36d03b31d1ce44": "Iniciar instalação do mariadb-{}", - "92e77c2b107f440d6d54062228112f73": "Iniciar instalação do mysql-{}", - "4b09abb2edd44a4510395a297a2ff155": "Iniciar instalação do mongodb-{}", - "69fa45968c5cc7a9115bff54e70c95c1": "Iniciar instalação do memcached-{}", - "fbabb869ff01746bd144289622b277fc": "Iniciar instalação do redis-{}", - "da7d69765f1876fba52c21a17e8c74c6": "Iniciar instalação do pgsql-{}", - "99782b6a478e499d45a91f9d78e1c73a": "Iniciar instalação do phpmyadmin-{}", - "640c4e334dc9587e212d36e685059478": "Iniciar instalação do ftp-{}", - "aecfeaaa9e3bcff1f6169598772e90c0": "Iniciar restauração do ambiente de execução do painel", - "3b83e3fdb17c70ca190e263e0bd7173e": "A instalação será ignorada se o mesmo ambiente existir" + "746e85b89c25244ae397c06029badc9c": "Restauração de dados do plugin concluída" } diff --git a/BTPanel/languages/pt/server.json b/BTPanel/languages/pt/server.json index bfc52802..38239491 100644 --- a/BTPanel/languages/pt/server.json +++ b/BTPanel/languages/pt/server.json @@ -1,70 +1,133 @@ { - "f41a4952dfc4caafbed0a6afdd243bff": "Erro de certificado, por favor verifique!", + "f41a4952dfc4caafbed0a6afdd243bff": "Erro de certificado, verifique!", "2dfadbc8b23727991de7eb9457f56252": "O certificado foi salvo!", - "7961d31b9b6db7593b5f8795273b5b64": "Falha ao solicitar certificado. Por favor, tente solicitar manualmente um certificado para o domínio do painel na página de gerenciamento do site.", + "7961d31b9b6db7593b5f8795273b5b64": "Falha ao solicitar certificado, tente solicitar manualmente um certificado para o domínio do painel na página de gerenciamento do site", "d29c0b7e434fe9f40120f2a7f8111c9e": "Arquivo SSL não encontrado! {}", "c4ca4238a0b923820dcc509a6f75849b": "1", "96ee8f18814766fdf066df97d3e1f6ea": "Você precisa vincular o domínio ao painel antes de solicitar o certificado Let's Encrypt.", "7c14ab8a86515227c637d1d045e8d422": "Configurado com sucesso!", "a453af2e4da41ca8c5035d61b961c1ae": "O banco de dados não existe", - "ca9c87b1d4c2f8af80c61cf22e43250d": "Já existe uma tarefa de backup neste período. Recomenda-se escolher outro horário.", + "ca9c87b1d4c2f8af80c61cf22e43250d": "Já existe uma tarefa de backup neste período. Recomendado escolher outro horário", "e0aa021e21dddbd6d8cecec71e9cf564": "OK", "4db53632205257cce66f7b93d6c71e84": "O site não existe", "dc542b3a7ffb20d7a1fc0c2b35f208d8": "O diretório não existe", - "4cc4ddc196a295ee4ab82daec08f91a6": "O site não existe", + "4cc4ddc196a295ee4ab82daec08f91a6": "Site não existe", "25bb121145f918572eea2ef07ff8e89c": "Erro de backup", "f8320b26d30ab433c5a54546d21f414c": "Falso", - "18928426418954e3a8bc166c892af5c5": "Usuário ou senha não podem estar vazios!", - "14422683e14b8a03fd02b84480703c41": "Você falhou ao fazer login muitas vezes, tente novamente em {} segundos!", - "179b0ad118200b66c6e90535d9d8ad4f": "Os inodes do disco foram esgotados, o painel tentou liberar inodes. Por favor, tente novamente...", - "7edd0140c2f050286273be74039b1df7": "Falha na verificação, atualize a página e faça login novamente!", - "9a9b0bf6269ba974cc6a00bb0f0de1d0": "O código de verificação não pode estar vazio!", - "2b7ae590e0538e70b7a359a94d30f1f4": "Código de verificação incorreto, tente novamente!", - "21f763b26858bf8ff40f931d714ab106": "usuário ou senha incorretos, 1. Verifique se o domínio está vinculado ao site correspondente.

2. Verifique se o domínio está resolvido corretamente para o servidor ou se a resolução ainda não está totalmente efetiva.

3. Se seu site tem proxy reverso ou usa CDN, desative primeiro.

4. Se seu site tem redirecionamento 301, desative primeiro.

5. Se as verificações acima confirmarem que não há problema, tente mudar o provedor de serviço DNS.

", + "4d6822ed3bd01f379f2ab4b1e68068d7": "|-Não há certificados para renovar no momento.", + "b74c00ca5fee122c49cd66ce3d91b2cf": "|-Falha na renovação:", + "f6039d44b29456b20f8f373155ae4973": "Nome de usuário", + "3544848f820b9d94a3f3871a382cf138": "Nova senha", + "6b1bc4e672d58d46d23502dcd78129be": "Limpando informações de log", + "0e900c57ee4635719ba671229ead12ff": "Limpando histórico de tarefas", + "1dfefaa079cbde4da09e89af6b49ff33": "Limpando registros de monitoramento de rede", + "f59489317e210ec566cf6b6c9e3b20b9": "Limpando registros de monitoramento de CPU", + "e0976b426e3109ee01a1182b7c04b987": "Limpando registros de monitoramento de disco", + "2c1eb277ff700f04b65306399784f875": "Limpando informações de IP", + "4abfe31831aa15dc27ff44067b2bf0d1": "Limpando histórico do sistema", + "0c06c1eb5ef47b883f7cbcab9be84e97": "O painel foi empacotado com sucesso. Por favor, NÃO faça login no painel para realizar outras operações!", + "b60091f633dedd493b16f5548e32233d": "Endereço de inicialização do painel", + "b097eb5212f13c74d1c96b59f65c4dd6": "Tarefas {} limpas com sucesso!", + "e82eb2921856b4230611dc1406f60a6f": "Lixo do sistema limpo, total de [{}] arquivos excluídos, espaço em disco liberado [{}]", + "0d793de4ae05511630a2eeea9b5528d9": "|-Limpo [{}], excluídos [{}] arquivos, espaço liberado [{}]", + "db62071d34202efa3a0aa1a743394938": "|-Spool limpo, excluídos [{}] arquivos, espaço liberado [{}]", + "a1d3c6c221b8ceaaef8881e09d0a2945": "|-Limpando Sessão PHP...", + "c16f6a333c0ba871467568be496cbea0": "|-Sessão PHP limpa, excluídos [{}] arquivos, espaço liberado [{}]", + "5d88b58a1c0ba0dee9eeb89a8bcdda36": "|-Limpando arquivos temporários e logs do site...", + "e038ca57ad9c03f40bec42908af2ccff": "|-Arquivos temporários e logs do site limpos, excluídos [{}] arquivos, espaço liberado [{}]", + "fa3d217e80478d3c03c437b7fc11432f": "|-ERRO, nome de usuário não pode ter menos de 5 caracteres", + "4cffae9f32bf898c859a5937268b9727": "|-ERRO, não pode usar nome de usuário muito simples", + "fbcb6a4b1126170666b4c4102afbb43d": "|-Novo nome de usuário: {}", + "cbe2d798534f872748b7cba6615596d8": "Edição personalizada com aaPanel", + "ec1d9ff2578e1f231696217b2c2d15ab": "Falha, impossível excluir a porta atual do painel!", + "51708089c15820800d3dd7bd8d8cdfba": "aaPanel", + "fee066b1b93fecf9545758cf9a87c3de": "Atualizando plugin...", + "c6462fea6d27e4ecfc68ae1944051f77": "Login bem-sucedido, carregando...", + "c11f9218de293117d2cd58a009534167": "Todos os plugins atualizados com sucesso para compatibilidade 6.0!", + "cc478711642936a519c27b7c388fbb50": "CLI aaPanel", + "cfef992430ab5a7b2373138d4b86425c": "Reiniciar painel", + "95b8b68d1c80ca75e1ab15bf5b9a8394": "Alterar porta do painel", + "f3013e54b467cdb2fac9a424bae963e4": "Parar painel", + "15ea17031cb6a968e3b9ea2b28546c53": "Limpar cache do painel", + "20cdfcd210da305d900d25ec4c084184": "Limpar limite de login", + "ab41db99c7941ef74c37bd97733f7707": "Recarregar painel", + "315f4fdd99e49c6a2e80a95ce82ba534": "Cancelar limite de entrada", + "07ed88796641228c3602122cf5075fc2": "Alterar senha do painel", + "63d8f2a0e51e9243f91b0285e4e44667": "Cancelar limite de vinculação de domínio", + "3913f08c2fa53f4c413cc0772f9401d1": "Alterar nome de usuário do painel", + "b773a80578cdc8f50d57393d6b0a3d67": "Cancelar limite de acesso IP", + "a6a23a4004f99fef13372de56433edbc": "Forçar alteração da senha root do MySQL", + "bc449263dd0183a82a3d0a03cd8f26dc": "Ver informações padrão do painel", + "0b1c93d38c86c8d379886293cdf8ba66": "Tarefa cancelada!", + "975687e8a64e2c2842a34ca6d6bf8e85": "Limpar lixo do sistema", + "84bc199f1a5ce205b0f5fc3e64ef3e95": "Por favor, insira o número do comando:", + "954be127268a1704a7af22b23bb440e8": "Cancelado!", + "51c6348531daaf0fb1e84fafa12b5f15": "Por favor, insira a nova senha: ", + "34c4edd98a45ea8a13556965a6c4f2b0": "Por favor, insira o novo nome de usuário (>5 caracteres): ", + "219863186dddc079747a525bb7877a88": "Por favor, insira a nova senha root do MySQL:", + "c172da334fdcac77f704fa4408dd2f16": "|-ERRO, senha não pode estar vazia", + "a79cf67c04d379c4916dc584c9d8333f": "|-ERRO, senha não pode ter menos de 8 caracteres", + "06f5000079703a33b91564159f07770a": "|-ERRO, senha não pode conter caracteres especiais", + "913153f9957100bcf3029e8f3d5bc5e9": "Por favor, insira a nova porta do painel: ", + "39ea14ec0df812219c450ba15230ad2d": "|-ERRO, nenhuma porta válida inserida", + "bab5cb07adebbfbd938180d6862a7ce7": "|-ERRO, por favor NÃO use portas comuns como porta do painel", + "00213d6b5423971311e5a47f83081a24": "|-ERRO, a nova porta é a mesma da atual, não há necessidade de mudar", + "e1e57838b2c7e1567fb96e20bfd474e0": "|-ERRO, a porta especificada já está em uso", + "5093d954f09d473d091355fe292920a8": "|-Limite de entrada cancelado", + "e0b1cb1725c8fb29d42fa69d679a73ea": "|-Limite de domínio cancelado", + "968c7b9246b5ab3d3e7659cea211a20b": "|-Limite de acesso IP cancelado", "169137d790f7352d616082ad8498e7dc": "Configurado com sucesso!", - "7901466782835534ad8736db6ef1f5f1": "Chave de login inválida1", - "f155037a804d9eb3e28318ac56b4cce7": "A chave especificada não existe ou expirou1", - "6eef9dff3428b19422dbbfe061fc8266": "Chave de login inválida2", - "ea4dede6817ca735a9df32b4e63fd1ac": "Chave de login inválida3", - "4682250bcbe96f4c0c59712ef1ff1560": "Chave de login inválida4", - "8b4bcc31cc9ad0a259e17a1ebfcfb859": "A chave especificada não existe ou expirou5", - "c132c7b820d6b4d23038989f10dc7d90": "Tempo de validade do código QR expirou6", - "ab72200c3852bb7165e1e0d9456c5679": "Código escaneado com sucesso, entrando!", - "d003e41a7688df391d78442602802077": "Chave de login inválida", - "8b7e4d42188dd3064e99d4cc76f2f94d": "O código QR atual expirou, atualize a página e escaneie novamente!", - "238baadc7351e6af7625f2b3c888adfd": "Este servidor está vinculado a um máximo de {} dispositivos, o limite foi atingido!", - "e615667ab7e4ce542cc2de0e95b5983c": "Falha na verificação!", - "9d45236535b39cb2afdc976ef584dc89": "Um servidor permite até {} vínculos de dispositivos!", - "883102f20053b7b88799f5712192fcec": "Vinculado com sucesso!", - "eb21cf2eed85a178a9cb642a0175f402": "Excluído com sucesso!", - "c332d7ea3375e567e1b586dfb79c2156": "Não é possível configurar a API através da interface da API", - "166be1ba5c792888e84a51c48f5a5eed": "Chaves temporárias só podem ser obtidas através da interface da API", - "dd923e13e2389e764f7d833482dc58d3": "Email ou senha do usuário não podem estar vazios!", - "a72005cea9c8d0e8925115a09f62e834": "Por favor, insira um email válido", - "583e0c5cfd4be57cb9bef0a1745f81c8": "informação de erro : {}", - "086a727d5b55e2ccedc7cd0c194936f0": "informação de erro2 : {}", - "2b770a5bd35c0e286c6296f942990bf7": "Registrado com sucesso", - "a3dcb5c816b8d611f73cddb3c53578d4": "informação de erro6 : {}", - "8089be0bb8586c6081d4cd8dd9223d76": "O email não foi validado", - "2bdacd9b8281d94958a8da4d29420926": "Vinculado com sucesso", - "7826987ad3c4b2226b8f7a601657d23b": "Usuário, email ou senha inválidos! Verifique e tente novamente!", - "a7ea66c7a7ca61c727cf1ebe830ffed2": "Falha ao conectar ao servidor!", "3f96c422b7a59fe6e8bf7531c647a64c": "A conta especificada não existe", "cb5e7fdc51569eedfbf3a9a0d3c819cc": "O pedido especificado não existe!", "8bd32b310825307a909c682871008642": "Pedido excluído com sucesso!", @@ -72,45 +135,43 @@ "023d5992564106099e169c79963e8ed8": "Nenhum certificado encontrado para o pedido especificado!", "572097b2302e2c7fe0a3375db4e3ad9b": "Falha na leitura do certificado!", "a28e320cb6513b4ad7e9b07318173cb5": "Certificado revogado!", - "d0b3af29d4790521c7850f4955d66745": "Necessário pelo menos um nome de domínio!", + "d0b3af29d4790521c7850f4955d66745": "Precisa de pelo menos um nome de domínio!", "48203f43edd25a6df396ff263a02ea45": "Falha ao gravar arquivo de verificação: {}", "ebe9660f1426b037f25101329deed827": "Nenhuma informação válida de chave DNSAPI encontrada", - "a618b4f6cda69737d20199139556d955": "Informações de verificação do pedido ausentes, tente solicitar novamente!", - "9ab9f8e94ee4cde7ab0c2f516cb12367": "Falha na verificação do nome de domínio. Por favor, tente solicitar novamente!", + "a618b4f6cda69737d20199139556d955": "Informações de verificação do pedido ausentes, tente reaplicar!", + "9ab9f8e94ee4cde7ab0c2f516cb12367": "Falha na verificação de domínio. Por favor, tente aplicar novamente!", "585f0e7802a68df8899b96bc67ae11bc": "O pedido não existe!", - "a10a65f23fcb6e0ac204f2de7b5fe9f3": "Tempo limite de conexão com o servidor CA, tente novamente mais tarde.", - "188c4e0ff2d4cb58ecfcd2608cfeea2c": "Falha na conexão com servidor DNS, verifique se a chave está correta.", + "a10a65f23fcb6e0ac204f2de7b5fe9f3": "Conexão com servidor CA expirou, tente novamente mais tarde.", + "188c4e0ff2d4cb58ecfcd2608cfeea2c": "Conexão com servidor DNS falhou, verifique se a chave está correta.", "d568b4df4d83c54698fe15ad656181ed": "Falha na emissão, o domínio {} excedeu o limite de reemissões semanais!", - "5ac0673b95a9e6af88bb008e24c09bf4": "Falha na conexão com o servidor CA, tente novamente mais tarde.", - "2948ef630d1bdb0b2e7209d83f13af67": "Nome de domínio não suportado {}, verifique se o nome está correto!", - "27bad102d3dd6f86d5f6c680c8353089": "Falha na criação do pedido, tente novamente mais tarde!", - "1a728d28f052c9956f9d014d60c61bff": "Acesso negado pelo servidor CA, tente novamente mais tarde!", - "35390f482d893d9c9c0c0bb055e70572": "Muitas solicitações para este domínio. Tente novamente em 3 horas", - "cae6404c4aecf46684930fe2a86676a6": "Deixar", + "5ac0673b95a9e6af88bb008e24c09bf4": "Falha na conexão com servidor CA, tente novamente mais tarde.", + "2948ef630d1bdb0b2e7209d83f13af67": "Domínio não suportado {}, verifique se o domínio está correto!", + "35390f482d893d9c9c0c0bb055e70572": "Muitas requisições para este domínio. Tente novamente em 3 horas", + "cae6404c4aecf46684930fe2a86676a6": "Let's Encrypt", "ab511534580180bb5c56aab7331d0c36": "A CA não consegue encontrar ou obter o registro DNSKEY usado para verificar a assinatura DNSSEC", "d957a97cf30dda2b8d8969c068a32eaf": "Falha ao baixar certificado: {}", "7c1bcdcad166aaaec98c557f8c12d2cf": "O arquivo de certificado especificado não existe!", - "22d9a8450558b9bf05b71c456bf07e4c": "Falha na aquisição das informações do certificado!", - "bab62ab47e998a0ca716266835bf8a31": "|-Criando pedido..", - "6517db66d510fdaea47a55ff778a0c94": "|-Obtendo informações de verificação..", - "655a6038ba5837b278b39e18d93adea0": "|-Verificando nome de domínio..", - "2d51882843ffc29148c2ced7741663dc": "|-Enviando CSR..", - "dfa86860b18fd5248e3e72415c19233c": "|-Baixando certificado..", - "7e0173b4f1e9e78c08a70a0350422af2": "Solicitação bem-sucedida!", - "02900bf9834436584397d0e1ed6d6385": "|-Solicitação bem-sucedida, implantando no site..", + "22d9a8450558b9bf05b71c456bf07e4c": "Falha na aquisição de informações do certificado!", + "bab62ab47e998a0ca716266835bf8a31": "|-Criando pedido...", + "6517db66d510fdaea47a55ff778a0c94": "|-Obtendo informações de verificação...", + "655a6038ba5837b278b39e18d93adea0": "|-Verificando domínio...", + "2d51882843ffc29148c2ced7741663dc": "|-Enviando CSR...", + "dfa86860b18fd5248e3e72415c19233c": "|-Baixando certificado...", + "7e0173b4f1e9e78c08a70a0350422af2": "Aplicação bem-sucedida!", + "02900bf9834436584397d0e1ed6d6385": "|-Aplicação bem-sucedida, implantando no site...", "cc7bd98381615b01789afbd472cb8ed3": "ID do site não pode estar vazio!", - "decd4452e2e4872aa81049fea69a0c24": "Site perdido, não é possível continuar solicitando certificado", + "decd4452e2e4872aa81049fea69a0c24": "Site perdido, impossível continuar aplicando para certificado", "7c3971b737ee58a9dec0e00a1df8f943": "O arquivo de configuração do serviço ({}) do projeto atual foi modificado e ", - "4dd7615dbb05a4e001b3b5fa6d71bc16": "O site está faltando e ele", - "5963b5b95c2063d2668607bac1fde358": "SITE_SSL_ERRO_301", - "6c24a729c1cf9fc0159e92cb2f35f055": "Sites com proxy reverso ativado não podem solicitar SSL!", - "48a7613459bf65ba48bf9994a3104f2f": "O site já ativou o redirecionamento.", + "4dd7615dbb05a4e001b3b5fa6d71bc16": "O site está faltando e", + "5963b5b95c2063d2668607bac1fde358": "SITE_SSL_ERR_301", + "6c24a729c1cf9fc0159e92cb2f35f055": "Sites com proxy reverso habilitado não podem aplicar para SSL!", + "48a7613459bf65ba48bf9994a3104f2f": "O site já habilitou redirecionamento.", "28c497ddb0cfa97dd612d83c5efdc225": "Após configurar HTTPS obrigatório ", "50e7b6d6602a2f42e45ee7c147824b04": "Falha no download. O pedido não foi encontrado.", - "d4d3f12047351f973751b65b50bf54ea": "|-Solicitação bem-sucedida!", - "cf6c5b924aa4aede56b3e0e0373ec1f8": "Por favor, especifique o domínio para solicitar o certificado", + "d4d3f12047351f973751b65b50bf54ea": "|-Aplicação bem-sucedida!", + "cf6c5b924aa4aede56b3e0e0373ec1f8": "Por favor, especifique o domínio para aplicar o certificado", "e08c1382c834439d0fdccbc24d36ec86": "Por favor, especifique o tipo de verificação", - "ed5c4feb5edcfbb95544d094d451921e": "Por favor, especifique o diretório raiz do site", + "ed5c4feb5edcfbb95544d094d451921e": "Por favor, especifique a raiz do documento do site", "fb3d957c8fad98876c10db10e32c0126": "Por favor, especifique DNSAPI", "e3b11e6d575174fdb838e311bb404fd5": "Por favor, especifique a chave DNSAPI", "dcbd3fcb143a3101480566f5c1f07ad3": "Por favor, especifique o segredo DNSAPI", @@ -119,28 +180,61 @@ "976ac0dffedabc5b60bf5a009a5a4e05": "renovar certificado v2", "0810d42ec985c7c4beb6416c649c82a8": "renovar certificado v3", "6953519c64b998226d0294b961deca62": "Revogar certificado", - "1bbd31373b98ad5a6320af00b2a15ee0": "Renovar quando o tempo de expiração for menor ou igual a certo tempo", + "1bbd31373b98ad5a6320af00b2a15ee0": "Renovar quando o tempo de expiração for menor que certo tempo", "8fcc1d6fd24fad55d9e8fea6631886db": "Por favor, insira o índice do pedido a ser revogado no parâmetro --index", - "b0698ab9adefa7515299f311c725ba4d": "Ordenação limpa com sucesso", - "8611f56e253646a455ceeb020052fa97": "Falha ao modificar", - "ebdcf538e79de6922f498cc8c735eab5": "O firewall do sistema não está aberto", - "a296add6341b715925c0be2b83514ee3": "O endereço IP inserido é ilegal!", - "3433b9709eed7423f1900061ef743af6": "Desativar este IP fará com que seu servidor falhe", - "57e7b2320dd3984312335605d57ee0f8": "O IP existe na lista de bloqueio, não é necessário repetir o processo!", - "4bb8df740a7119979ff7854d034200a8": "Endereço IP ilegal!", - "998ad6f12ce5285a1b72d4265d9b36cc": "Excluído com sucesso", - "ff9c66f005c08efd15752fb261057b46": "O intervalo de portas deve estar entre 22 e 65535!", - "b26b09909c3b090f31dba4a0986e1b84": "A porta existe, não é necessário repetir a liberação!", - "408f58c25fc55295236fbb64a2d884ff": "Falha, não é possível excluir a porta atual do painel", - "e274abcaad0a7fff74d9adb67e578d5f": "Falha ao excluir", - "ad6fc2abb89b42d391b4bf84e8e6cd2d": "Serviço SSH desligado", - "0692d6f0819524aaa05e73f03022ec5b": "Serviço SSH ligado", - "d0749aaba8b833466dfcbb0428e4f89c": "SUCESSO", - "ffdc24f916f3071233ca7710aff032c8": "
{}", - "6e264f3408e9b769d3fb7e2c807f301f": "A operação falhou. Verifique se a chave está correta", - "d4ac5985eccd334896e3cf23706e43b0": "Adicionado com sucesso", - "92188d43af4373bacbf00951da16532a": "Falha ao obter o caminho do site. Verifique se o site existe", - "ceaefd9a46d78491b9fdb912b5c71eeb": "Falha ao criar o arquivo de validação. Verifique se a gravação foi bloqueada", - "1bb3608b1bc684c3dc85090db249346b": "Nenhuma informação de certificado foi obtida", - "b0a783e3ada9e792e3ff3ca4eb477c80": "Certificado não existe!", - "fca4e47d90253577901e874737b87dc0": "Erro de leitura do certificado!", - "813595d6c41e417bea96adb1ad89043f": "Erro de formato do certificado", - "16e6977cb4d0694335f3492ad8767370": "Certificado não encontrado", - "b267d8a6cbf23d69056263e194742c06": "Certificado inválido", - "f8ad04059d0821e2ece2ed287bb3cd13": "Erro no formato das informações do certificado", - "a441b2686419ee07dac67ba6bbf3ddf5": "erro de gravação no banco de dados", - "34c7694451633cb615e98b06d040c5c7": "erro de consulta no banco de dados:", - "ba709b27ba6099126b4162a916a20174": "não logado, então ele", - "ae01e57647be41f3c1e2a0e49dae3de8": "falha ao obter dados da nuvem!", - "8d1747726b316e3a1063e5db9fe65864": "falha ao obter nuvem!", - "ff34f52bf8f702f83843e0d8f3e6bfac": "parâmetros errados", - "41309f5b21613cfea3728a55036f9970": "não logado, portanto, não é possível fazer upload para a nuvem!", - "6e4a26963219701ba8e062a1255fe089": "Nenhum certificado especificado.", - "2c7d38ab0f7a91f5474efc897eaf4b2a": "Sucesso na exclusão do arquivo local. Mas falha na exclusão do arquivo na nuvem.", - "501ffa672acb20c4764563d6e839879b": "Falha ao conectar à nuvem. Não foi possível excluir dados na nuvem.", - "a810cdf921c5b92a3f6d29667ec78ffc": "exclusão bem-sucedida", - "df569fbc92d17644e83b44541596633f": "Falha ao conectar à nuvem.", - "140bda69874872f8402052c613c0b3b9": "Email de Teste de Alerta do aaPanel", - "76a1ec4a3fcdc304394ff14dc90f8072": "O número de threads do painel deve estar entre 1-1024", - "dd7e82b5fb3c67e3e41d96f22ba838fd": "Nova porta do painel", - "248336101b461380a4b2391a7625493d": "Salvo", - "40624aabb99173387dd6d575759b12db": "O parâmetro certPem está faltando!", - "37db9679113eef382992a1478f1b79ff": "O parâmetro privateKey está faltando!", - "7063e5fbf2ea8d0809fe307b6df00467": "Certificado salvo!", - "d2174fc17fcd785706114088b84dbbce": "URL de login temporário foi gerado", - "b5101eb6e685091719013d1a75756a53": "\\1", - "0bfe47819da04212a33dac83b71430e8": "\\2", - "bef28b813bf12be3924925bbb62883dd": "Executado com sucesso!", - "fda63bff3e0143980e5761376859b00b": "Falha na execução, verifique se o Apache está instalado", - "22012355700877ab73f89de8014ab20b": "Erro de configuração de regra do Apache:
falha ao ativar:

", - "9848c96a046adb1759233241661ff694": "O serviço {} falhou ao iniciar", - "6ed577cdce37bbd9c66871ac1677dc53": "Falha ao parar o serviço!", - "572e5703371c43aae299181c0e3567d4": "Por favor, execute o programa quando todas as tarefas de instalação terminarem!", - "c7138b4b5f7ded833942aef4e230771d": "Comando enviado com sucesso!", - "d56f0ed99825b4d62ab84753a65f7f1e": "Painel reiniciado", - "3d8c9e517719022b27ad5f27c578fa31": "Obter RAM Falso", - "d47ab7b9ce539ba13f4e045561bb8ed7": "Obter Uptime Falso", - "8e39175bab478762d3d029bee327c704": "Obter Tempo de Reinício Falso", - "e16cf27704f83c8b0a0efc16886ea75d": "Obter data Falso", - "c158c8096b76b85803e71232b2dd5e74": "Obter detalhes de tempo Falso", - "a6ec06b5eb6a42e13e072d2e992e31a0": "Obter reqpersec Falso", - "cdd32490a46567fd0c1ee9d4b170b762": "Obter TotalAccesses Falso", - "62b939086708b37d68c00cb713994b52": "Obter TotalKBytes Falso", - "13b06d17b35dfeeafa50e12ad9ec1735": "Obter BusyWorkers Falso", - "724fc9214ccce3e6a5787648240a4533": "Obter IdleWorkers Falso", - "7a7f329389283fdd3290c735f90946e9": "configuração mpm_event_module não encontrada ou /www/server/apache/conf/extra/httpd-mpm.conf está vazio", - "c22cf8376b1893dcfcef0649fe1a7d87": "Segundo", - "db669c6377ab90eef78800a48fd4a453": "Tempo limite da solicitação (Request timeout)", - "af52f5340c065f4d38182f7a27d59f75": "Manter vivo (Keep alive)", - "70b46e57f3c33abdb9558bc5c3a234d9": "Máximo de solicitações keep-alive por conexão", - "6868568c3abc547e622a303891a906b0": "Processos padrão", - "224114c62dceb7ebee2db43c6c79a961": "Número máximo de threads ociosos", - "3c60809d9a5a0900dfbc28bb017e410b": "Número mínimo de threads ociosos disponíveis para lidar com picos de solicitação", - "3783030daf8154be6e11fc4160c229c3": "Número de threads criados por cada processo filho", - "2f25e4b1a2cb84576740da749a2daef2": "Número máximo de conexões que serão processadas simultaneamente", - "72e3edfd72758944413b1e4e9c432f1e": "Limite no número de conexões que um servidor filho individual manipulará durante sua vida", - "26c74a59d7d10bd927dce45e449943f1": "ERRO de configuração", - "b2d87dda66a4643c6cf673f787c5f226": "Arquivo de configuração não existe", - "bff9ef87fdda677f86ae6dddec54a104": "Nenhuma versão compatível do PHP encontrada, instale primeiro", - "4bbfcde12aa36ec375a332f51bf905d6": "Por Dia", - "60956b50bb8e8c711d3adb889a70137f": "Por Dia, executar às {} Hora(s) {} Min", + "fa57fd4dd2f47d6e5e076c347fbee513": "SITE_ADD_ERR_DOMAIN_TOW", + "4eb35aa4b95736df133dd3ad772f1ec9": "Diretório crítico do sistema não pode ser usado como diretório do site", + "4bbfcde12aa36ec375a332f51bf905d6": "Diariamente", + "60956b50bb8e8c711d3adb889a70137f": "Diariamente, executar às {} Horas {} Min", "78748f15bb65939b6d130c3a5cf8b7dc": "A cada {} Dias", - "cf9af10dcebe2f12092ff6028a535f08": "A cada {} Dias, executar às {} Hora(s) {} Min", + "cf9af10dcebe2f12092ff6028a535f08": "A cada {} Dias, executar às {} Horas {} Min", "e114abed903b9d26c476d4f6cd59c04b": "Por Hora", "0aef48ea8132b0551fa25a10fd0a6585": "Por Hora, executar aos {} Min", "50419faf9662e0c3f283d496bcb8eb72": "A cada {} Horas", @@ -292,9 +283,9 @@ "84d94bf0382f611906b7edd65d6af169": "A cada {} Minutos", "14d27796d1c96457c7c019661a2f32d4": "Executar a cada {} Minutos", "6c25e6a6da95b3d583c6ec4c3f82ed4d": "Semanalmente", - "e1df614d393ab86fd63c5062f7e77936": "Todo(a) {}, executar às {} Hora(s) {} Min", + "e1df614d393ab86fd63c5062f7e77936": "Todo(a) {}, executar às {} Horas {} Min", "9030e39f00132d583da4122532e509e9": "Mensalmente", - "69c5e99b9ad8d2b8f11be9a60cbf71da": "Mensalmente, executar no dia {} às {} Hora(s) {}Min", + "69c5e99b9ad8d2b8f11be9a60cbf71da": "Mensalmente, executar no dia {}, às {} Horas {} Min", "9d1a0949c39e66a0cd65240bc0ac9177": "Domingo", "6f8522e0610541f1ef215a22ffa66ff6": "Segunda-feira", "5792315f09a5d54fb7e3d066672b507f": "Terça-feira", @@ -302,362 +293,265 @@ "78ae6f0cd191d25147e252dc54768238": "Quinta-feira", "c33b138a163847cdb6caeeb7c9a126b4": "Sexta-feira", "8b7051187b9191cdcdae6ed5a10e5adc": "Sábado", - "e00d5128f631253b7b6ed8d5454c0c81": "Não foi possível gravar no arquivo, verifique se o [Fortalecimento do Sistema] está ativado!", + "e00d5128f631253b7b6ed8d5454c0c81": "Não foi possível gravar no arquivo, verifique se [Fortalecimento do Sistema] está ativado!", "685689743579a8f09fcec5d7df04e39e": "O nome da tarefa não pode estar vazio!", "a5c04aced897c770105858268324b53f": "A tarefa atual está com status Desativado, abra a tarefa antes de modificar!", "85305ee6be0f078791c7437ec54dda12": "Falha ao adicionar", - "08a1ce771119bb393fa49478216ae809": "o log está vazio", + "08a1ce771119bb393fa49478216ae809": "log está vazio", "b8fd4dbe5c3650beaec0a3d44d7f0245": "Logs esvaziados", - "ff47c70e853d0b3635935be883b018e9": "Falha ao esvaziar os logs da tarefa!", + "ff47c70e853d0b3635935be883b018e9": "Falha ao esvaziar logs de tarefa!", "e0c4da1afd18acbb66bc5fac261a42ef": "A tarefa especificada não existe!", + "998ad6f12ce5285a1b72d4265d9b36cc": "Excluído com sucesso", + "e274abcaad0a7fff74d9adb67e578d5f": "Falha ao excluir", "38fa2d4f8f9a13062c0c9007d97f6a84": "Falha ao ler arquivo!", - "f57d5686d9dd67f0e81924de8d13af95": "Tarefa executada!", - "da07d14105efb3ba634c1d35618447ab": "O parâmetro está incorreto!", + "f57d5686d9dd67f0e81924de8d13af95": "Tarefa foi executada!", + "7b84e677e97bd4943a6639a22c1a1704": "Parâmetro de senha não pode estar vazio", + "5f3160e82bc0c5278923b609841e588b": "Habilitado com sucesso", + "f288f8c23f8d03a699a49bf1fb8e7f53": "Falha na opção ssh", + "d3118650da719b6b0cc83230204491de": "Erro no método de criptografia", + "24513dc8c02bb021a1c944009c19215b": "Falha ao habilitar", + "8a3140f96ba5c5df5560d0bd27aa4cd8": "Desabilitado com sucesso", + "bff9ef87fdda677f86ae6dddec54a104": "Nenhuma versão PHP compatível encontrada, instale primeiro", + "3c8ad9e6e9c39de49294aa2db8630f25": "Nginx não está instalado", + "8bdafc47214a88c8cc4bc6326771040a": "Falha na aquisição de dados!", + "d84c752e17017ec4b4987497ce15dfd0": "Falha na aquisição de status de carga do PHP!", + "ee83f5efe8a95f2e8529da7d4bb01d2b": "Desinstalação bem-sucedida", + "cf6e5eb2bfedf2e0529a552c1017c21e": "falha ao gravar arquivo!", + "842bbd281516b01e70be499dbe67d3aa": "Configurado com sucesso", + "ff7ca5d4ef00526f701d3ae0b3833940": "Falha ao obter a lista, verifique se a configuração [AK/SK/Armazenamento] está correta!", + "517fa3f50147b216828f9aca9fd08927": "Servidor de demonstração, operação proibida!", + "e39bf0b6a74eb0459abefe075607833f": "Erro, impossível encerrar processos da tarefa!", + "c40f1a202bfa106ac04f83a4740b3bd1": "Falha ao conectar ao servidor!", + "ca3eb6afad663b2881fababde6d59d63": "Por favor, vincule sua conta primeiro!", + "572e5703371c43aae299181c0e3567d4": "Por favor, execute o programa quando todas as tarefas de instalação terminarem!", + "df1f69a87b498b8b12c90be5a3b885db": "Falha no download do arquivo, tente novamente ou atualize manualmente!", + "e448bd5c1c654d1ef33cf40620808693": "A versão PHP solicitada NÃO existe!", + "7c769ceaad458456d4c3bc8276015a8d": "Permissão negada!", + "178d2e6a3f4abd4552188dcf36df7687": "Logs do Painel esvaziados!", + "99a0d283490c238c6faf2d0387dbcda7": "O servidor web atual é openlitespeed. Esta função ainda não é suportada.", + "20b4593b7de7ef359c1a0269f83e896b": "Intervalo de porta incorreto!", + "0e656ce1afc98099f2e01e8f71362f92": "Por favor, insira o número correto da porta", + "88897967b12e6907309204ad6d0647af": "Por favor, NÃO use a porta usual como porta do phpMyAdmin!", + "e4859a777f8d4f300baf8fff0284fe81": "Não encontrou o arquivo de configuração apache phpmyadmin ssl, tente fechar as configurações de porta ssl antes de abrir", + "6bd4e79acd767010d96091baf9daba77": "Não detectou a porta que o nginx phpmyadmin escuta, confirme se o arquivo foi modificado manualmente.", + "7478cfa7a09bbe61467b07dea2e9721d": "Não detectou a porta que o apache phpmyadmin escuta, confirme se o arquivo foi modificado manualmente.", + "a7dad48fefe8778dd10744a8a4dbae8e": "Nova Porta SSL phpMyAdmin", + "a168cddbe84613b0a468887d44e7eaf5": "O certificado do painel não existe. Por favor, solicite o certificado do painel e tente novamente.", + "c0c23cdf9e9329e576cfbddcc85666a3": "Aberto com sucesso, por favor libere manualmente a porta ssl phpmyadmin", + "b7f3560235e37cebdbde7db33c3df64c": "Operação falhou", + "7f91451dfcb0045a4684fa68b35d0365": "Nova Porta phpMyAdmin", + "bb1ca97ec761fc37101737ba0aa2e7c5": "ERRO", + "14c525aba20f0a52255a799f51ced885": "Lista de avisos NÃO existe!", + "586a19c1eeaf6fe9d57f1d894fc487fc": "Arquivo de log NÃO existe!", + "190045c03f9a72a1900c60d63e1e2b8b": "A vinculação da conta expirou, vincule novamente na página [Configurações]!", + "907fddd6007347a0daffc4a64156f0de": "Ignorado com sucesso, esta versão não será mais lembrada para atualização.", + "e06d1ba70f1331e9f9a113cc2f887d3f": "Não autorizado", + "6c89f438bb1463ecd92f1832d0aaa277": "Código QR expirado", + "a11371c8ae1f6978f0dd88d0bddaa1be": "Escaneamento QRCORE bem-sucedido", + "ab9f853a311a37b0fdc50cdfb4e7ac05": "Falha no login 2", + "735ff2bcf3bc80998a077ba01d50ab8c": "Falha no login 1", + "3dfca5981995cf406aed48842d0e44ba": "Não vinculado!", + "5b0308d8fa9b2acb17601e300f789005": "API não está ativada", + "55c294cfb3e6b69997d8b5cf04369914": "Telefone não vinculado", + "13b08ce52b782ebdc94a64637cd3c992": "Aguardando login por escaneamento de código APP 1", + "21d947c00f0d5b4ca710f7db100b8af3": "Aguardando login por escaneamento de código APP 2", + "9d7820cd626f61af19de756761a2280f": "Aguardando login por escaneamento de código APP", + "ed8abe55f77bc3512706869b791aa8f0": "Código QR atual inválido 222", + "727f11bf8b090ccbf27efcfb530e262f": "login bem-sucedido!", + "b0a783e3ada9e792e3ff3ca4eb477c80": "O certificado não existe!", + "fca4e47d90253577901e874737b87dc0": "Erro de leitura de certificado!", + "813595d6c41e417bea96adb1ad89043f": "Erro de formato de certificado", + "16e6977cb4d0694335f3492ad8767370": "Certificado não encontrado", + "b267d8a6cbf23d69056263e194742c06": "Certificado inválido", + "f8ad04059d0821e2ece2ed287bb3cd13": "Erro de formato de informações do certificado", + "a441b2686419ee07dac67ba6bbf3ddf5": "erro de gravação db", + "34c7694451633cb615e98b06d040c5c7": "erro de consulta db:", + "ba709b27ba6099126b4162a916a20174": "não logado, então", + "ae01e57647be41f3c1e2a0e49dae3de8": "falha ao obter dados da nuvem!", + "8d1747726b316e3a1063e5db9fe65864": "falha ao obter nuvem!", + "ff34f52bf8f702f83843e0d8f3e6bfac": "parâmetros errados", + "41309f5b21613cfea3728a55036f9970": "não logado, portanto incapaz de fazer upload para a nuvem!", + "6e4a26963219701ba8e062a1255fe089": "Nenhum certificado especificado.", + "2c7d38ab0f7a91f5474efc897eaf4b2a": "Sucesso na exclusão de arquivo local. Mas falha na exclusão de arquivo na nuvem.", + "501ffa672acb20c4764563d6e839879b": "Falha ao conectar à nuvem. Impossível excluir dados na nuvem.", + "a810cdf921c5b92a3f6d29667ec78ffc": "exclusão bem-sucedida", + "df569fbc92d17644e83b44541596633f": "Falha ao conectar à nuvem.", + "14230d11143a03f4330c6433d5032a9d": "Ant", + "10ac3d04253ef7e1ddc73e6091c0cd55": "Prox", + "a6122a65eaa676f700ae68d393054a37": "Início", + "d55b30607c2a9a2616347d6edb789f6b": "Último", + "5da618e8e4b89c66fe86e32cdafde142": "De", + "9952a15e524c95759c3580205db6fac1": "Depende do seguinte software, instale [{1}] primeiro", + "da07d14105efb3ba634c1d35618447ab": "O parâmetro está incorreto!", "ea2b2676c28c0db26d39331a336c6b92": "iniciar", "ef399b2d446bb37b7c32ad2cc1b6045b": "parar", "0b12c9f33fde8b15970c7390c54d7ca5": "falha ao fechar o log", - "b55eed05ce4922d8a6c881f0f2b05bbf": "definido com sucesso", + "b55eed05ce4922d8a6c881f0f2b05bbf": "configurado com sucesso", "5afb8de2bbb11b44592503000290c173": "O plugin especificado não existe!", "8b266978ab5161642a2d95d3f03f3945": "Por favor, desinstale [{}] primeiro", "ad626ac6de7ea412c9156f73b7666cd4": "Depende do seguinte software, instale [{}] primeiro", "acf7b210e1f5fbdb2e24af573f0e1831": "Pelo menos [{0}] núcleos de CPU são necessários para instalar", "d0c8fa89a1eccf8a377d11eea540fd0c": "Pelo menos [{0} MB] de memória são necessários para instalar", - "52e44340370925b110c7fba475b805e3": "Suporta apenas o sistema [{}]", + "52e44340370925b110c7fba475b805e3": "Apenas suporta sistema [{}]", "e3b16d9e5a24c8d27578d7670e840200": "Depende do seguinte software, instale primeiro [{}]", "a0405fa5f045a30ba3aeff1c65ad8c38": "Processo de instalação cancelado!", "a13ed989898e4c7529942fa656ff6733": "Diretório crítico do sistema não é gravável!", - "7a71d673b95a1bd0d10705c865f5a626": "1. Se o [Fortalecimento do Sistema] estiver instalado, desligue-o", - "c5041819fd15366b66dd9539116ea6ad": "2. Se o Yunsuo estiver instalado, desligue o recurso [System Hardening]", - "101935ed7ea8a021a536a614363350eb": "3. Se o Safedog estiver instalado, desligue o recurso [System Protection]", + "7a71d673b95a1bd0d10705c865f5a626": "1. Se [Fortalecimento do Sistema] estiver instalado, desative-o", + "c5041819fd15366b66dd9539116ea6ad": "2. Se Yunsuo estiver instalado, desative o recurso [Fortalecimento do Sistema]", + "101935ed7ea8a021a536a614363350eb": "3. Se Safedog estiver instalado, desative o recurso [Proteção do Sistema]", "8c4aa1aa63c24703138358074a515b99": "4. Se outro software de segurança for usado, desinstale-o", "2eaba30c177044d12634b22016f5dd99": "Por favor, especifique o nome do software!", "0d3811da2c2a4315b921093d36e6759d": "Desculpe, atualmente o OLS oficial não suporta php8.1", "0d06a64610d5755d0d395305f9b3a664": "Por favor, faça login como conta aaPanel primeiro", - "2c9056dcb1285057d5248e7ed16d2b4d": "Falha na verificação de hash do arquivo, instalação parada!", + "2c9056dcb1285057d5248e7ed16d2b4d": "Falha na verificação de hash do arquivo, instalação interrompida!", "fb95b07b4c663c0a52cda545eef1d869": "Instalação bem-sucedida!", - "fac5f4d9d430e77699ec114d346c9bb2": "Falha na instalação", + "fac5f4d9d430e77699ec114d346c9bb2": "Instalação falhou", "349838fb1d851d3e2014b9fe39203275": "Instalar", "a9ba3c226edabcfe1978d6f4c5daf404": "Nginx 1.8.1 é muito antigo, não está mais disponível, escolha outra versão!", "75d7d596e2cc30d482111fae7b4f6d88": "Tarefa de instalação adicionada à fila", - "ee83f5efe8a95f2e8529da7d4bb01d2b": "Desinstalação bem-sucedida", - "4432eb207b29c9ead490158b76397532": "A lista de banco de dados não está vazia. Para a segurança dos seus dados, faça backup e exclua o banco de dados existente.
Comando de desinstalação forçada: rm -rf /www/server/mysql", + "4432eb207b29c9ead490158b76397532": "A lista de banco de dados não está vazia. Para segurança dos seus dados, faça backup e exclua o banco de dados existente.
Comando de desinstalação forçada: rm -rf /www/server/mysql", "ba922eb50c83147a9bc0e9f40877d986": "Desinstalação bem-sucedida", "b860df98df6ab84521a4cef036973028": "Faixa de pontuação [1-5]", - "eb536feb2c569974c2b5cf85cae91041": "Falha na conexão!", + "eb536feb2c569974c2b5cf85cae91041": "Falha de conexão!", "a70188f907ee9df93a4b749109a23460": "Falha ao obter lista de software ({})", "16ad37f5aafc6478f2f6d63d70554530": "Por favor, NÃO repita a adição", - "18ea7bdb25b2a66507ffb1bb8b42fefa": "O Painel exibe apenas até 12 softwares!", - "2aa461271893ae0493789e9e8f248fdc": "A Barra de Atalhos exibe apenas até 5 softwares!", - "98cb93d354af289a900cd9e03cee2df2": "Falha na instalação!", + "18ea7bdb25b2a66507ffb1bb8b42fefa": "Painel exibe apenas até 12 softwares!", + "2aa461271893ae0493789e9e8f248fdc": "Barra de atalhos exibe apenas até 5 softwares!", + "98cb93d354af289a900cd9e03cee2df2": "Instalação falhou!", "17e4e003ade65cd7a54131d3404d2f98": "NÃO aberto", "bda730e0e5c7444ef6f4f49957ab4f39": "A pagar", "24fe48030f7d3097d5882535b04c3fa8": "Expirado", "cbfcfe47e7420af71ce1666844c565a3": "Ordenação salva", "6a20d0daaec1ce3950a321704041dc90": "Este plugin NÃO tem modelo!", - "6f5cb320fb3a7e303403054320ad943c": "Lista de softwares atualizada!", + "6f5cb320fb3a7e303403054320ad943c": "Lista de software atualizada!", "b269cd272a31017961c245e2c84a1a2f": "Falha no download do arquivo!", "88183b946cc5f0e8c96b2e66e1c74a7e": "Desconhecido", - "84f7539fe8674bb0689347dc7acd7b43": "Nenhuma informação do plugin encontrada no arquivo, verifique o pacote do plugin!", - "affc007de5f6791707f3de155a3a642a": "O arquivo temporário NÃO existe, faça o upload novamente!", - "117f1bb083c7d556079a3c77093be5e2": "Falha na exportação, verifique as permissões!", - "a8f375e795e0a130837f2a468518a413": "Nomes não compatíveis podem ser apenas números, letras, sublinhados", + "84f7539fe8674bb0689347dc7acd7b43": "Nenhuma informação de plugin encontrada no arquivo, verifique o pacote do plugin!", + "affc007de5f6791707f3de155a3a642a": "Arquivo temporário NÃO existe, reenvie!", + "117f1bb083c7d556079a3c77093be5e2": "Exportação falhou, verifique permissões!", + "a8f375e795e0a130837f2a468518a413": "Nomes não conformes podem ser apenas números, letras, sublinhados", "a06490b9729d0868e31d834c9bffa0bd": "Os parâmetros de compilação personalizados especificados não existem!", "5e71fccee12caedf853a7313ea204721": "Erro: Nome ou serviço desconhecido", "b6e3d7366f73e2c5e32717d679db6474": "Erro: Falha ao estabelecer uma nova conexão", - "cdffdb1c794cf0dd777b3941a31459e4": "Erro: Tempo limite de leitura esgotado", + "cdffdb1c794cf0dd777b3941a31459e4": "Erro: Tempo limite de leitura", "4573823cc04a9cbf8a7bb254b762db91": "Erro: Conexão recusada", - "e3c2e426ad1b23571c48ec572ca675bf": "Erro: O terminal remoto fechou a conexão sem resposta", + "e3c2e426ad1b23571c48ec572ca675bf": "Erro: Extremidade remota fechou conexão sem resposta", "db3a5c61130d7ca2046f5f9d0cd08073": "Erro: {}", "fe723570085e5cc1ecc3dfc88a46aa2d": "Tempo limite de download: {}", - "0eeb116408665d50a2f2092a6c277ee6": "Sem espaço disponível em disco.", - "57a43d6e8c479df3a51421eba70d5621": "Falha ao verificar soma de verificação do pacote.", + "0eeb116408665d50a2f2092a6c277ee6": "Sem espaço em disco disponível.", + "57a43d6e8c479df3a51421eba70d5621": "Falha na verificação de checksum do pacote.", "c12c62dd767caf90d62356b47349d871": "Não é possível obter barra de progresso para este plugin.", - "8fde9a929c417549ed2f9144fa68c0d2": "O nome da regra pode ser composto apenas por letras, números e sublinhados!", + "8fde9a929c417549ed2f9144fa68c0d2": "O nome da regra só pode ser composto por letras, números e sublinhados!", "868a6f377594831b39e91745c7807e28": "O nome da regra especificado não existe! [ {} ]", "5d9cf1940fae6317dd43a7f1b5ca8f36": "O nome da regra especificado já existe! [ {} ]", - "473bc9055d76e148db4d28e7bec67295": "O nome da regra precisa ser maior que 3 bytes", + "473bc9055d76e148db4d28e7bec67295": "Nome da regra precisa ser maior que 3 bytes", "5b097df78b1d8c65d8b524354029f114": "O sufixo do arquivo não pode estar vazio", "496e2dfba11ca4381ef6277e6e9a62dc": "O diretório não pode estar vazio", - "84278582ca50b97777b2c8ce780f9715": "Para Suporte|Sugestões, visite o Fórum aaPanel", - "aa00d1012298d40c84daf11e09956c65": "Baixando:", - "3c8ad9e6e9c39de49294aa2db8630f25": "Nginx não está instalado", - "8bdafc47214a88c8cc4bc6326771040a": "Falha na aquisição de dados!", - "d84c752e17017ec4b4987497ce15dfd0": "Falha na aquisição do status de carga do PHP!", - "cf6e5eb2bfedf2e0529a552c1017c21e": "falha ao gravar arquivo!", - "842bbd281516b01e70be499dbe67d3aa": "Definido com sucesso", - "ff7ca5d4ef00526f701d3ae0b3833940": "Falha ao obter a lista, verifique se a configuração [AK/SK/Armazenamento] está correta!", - "517fa3f50147b216828f9aca9fd08927": "Servidor de demonstração, esta operação é proibida!", - "e39bf0b6a74eb0459abefe075607833f": "Erro, não é possível encerrar os processos da tarefa!", - "c40f1a202bfa106ac04f83a4740b3bd1": "Falha ao conectar ao servidor!", - "ca3eb6afad663b2881fababde6d59d63": "Por favor, vincule sua conta primeiro!", - "df1f69a87b498b8b12c90be5a3b885db": "Falha no download do arquivo, tente novamente ou atualize manualmente!", - "e448bd5c1c654d1ef33cf40620808693": "A versão do PHP solicitada NÃO existe!", - "7c769ceaad458456d4c3bc8276015a8d": "Permissão negada!", - "178d2e6a3f4abd4552188dcf36df7687": "Logs do painel esvaziados!", - "99a0d283490c238c6faf2d0387dbcda7": "O servidor web atual é openlitespeed. Esta função ainda não é suportada.", - "20b4593b7de7ef359c1a0269f83e896b": "O intervalo de portas está incorreto!", - "0e656ce1afc98099f2e01e8f71362f92": "Por favor, insira o número da porta correto", - "88897967b12e6907309204ad6d0647af": "Por favor, NÃO use a porta usual como porta do phpMyAdmin!", - "e4859a777f8d4f300baf8fff0284fe81": "Não encontrou o arquivo de configuração SSL do Apache phpMyAdmin, tente fechar as configurações da porta SSL antes de abrir", - "6bd4e79acd767010d96091baf9daba77": "Não detectou a porta que o Nginx phpMyAdmin escuta, confirme se o arquivo foi modificado manualmente.", - "7478cfa7a09bbe61467b07dea2e9721d": "Não detectou a porta que o Apache phpMyAdmin escuta, confirme se o arquivo foi modificado manualmente.", - "a7dad48fefe8778dd10744a8a4dbae8e": "Nova Porta SSL do phpMyAdmin", - "a168cddbe84613b0a468887d44e7eaf5": "O certificado do painel não existe. Solicite o certificado do painel e tente novamente.", - "c0c23cdf9e9329e576cfbddcc85666a3": "Aberto com sucesso, libere manualmente a porta SSL do phpMyAdmin", - "b7f3560235e37cebdbde7db33c3df64c": "Operação falhou", - "7f91451dfcb0045a4684fa68b35d0365": "Nova Porta do phpMyAdmin", - "bb1ca97ec761fc37101737ba0aa2e7c5": "ERRO", - "14c525aba20f0a52255a799f51ced885": "Lista de avisos NÃO existe!", - "586a19c1eeaf6fe9d57f1d894fc487fc": "O arquivo de log NÃO existe!", - "190045c03f9a72a1900c60d63e1e2b8b": "O vínculo da conta expirou, vincule novamente na página [Configurações]!", - "907fddd6007347a0daffc4a64156f0de": "Ignorar sucesso, esta versão não será mais lembrada para atualizar.", - "131c05252110792212e3e3666a351154": "Configuração relacionada ao SSL, NÃO exclua ou modifique a próxima linha de regras 404 comentadas", - "4ba7e24ac1607ab761c124ca7352ad08": "Configuração da página de erro, permitido comentar, excluir ou modificar", - "31bb30ca4135945adbe0c2daa9545b39": "Configuração de referência PHP, permitido comentar, excluir ou modificar", - "f9da3e5ae75ce0ae39884ae2ea295a66": "Referência de regra de reescrita de URL, qualquer modificação invalidará as regras de reescrita definidas pelo painel", - "73e1f7d487ad73d55414fe26ea11cbf0": "Parâmetro não especificado [sitePath]", - "6aabca3a3e1c79bd5837a1ddae95fe70": "Houve um erro ao criar, tente novamente.", - "256c9a85375f57f2dc9f6f318c6578f1": "Site [ {} ] criado com sucesso", - "481df7dbcd4c0317088bde8c913d5893": "Por favor, preencha o caminho do site", - "b1b2484c013c646d7f41d6b2f495b6ef": "O caminho do site não pode ser o diretório raiz [/]", - "1c3bff99564f1370a5b1bf6c0773f8c4": "Verifique se o formato do [Email] está correto", - "af9091566e669f016edf16ba97464cbe": "Senha muito fraca, se tiver certeza de usá-la, marque [ Permitir senhas fracas ]", - "b0dbad478d4f07c38aec8f440ed98b66": "Por favor, instale MySQL e PHP primeiro!", - "46491fef7553177ef58a55b2db917072": "Por favor, não defina o diretório raiz do site para o diretório principal do sistema:
{}", - "59d5fef323e89ded50ed6036848a97f3": "O formato do parâmetro webname está incorreto, deve ser uma string JSON analisável", - "078a3d3e263be2851ddfd9fa059d098f": "O intervalo de portas está incorreto! deve ser entre 100-65535", - "50370024fdd22dc69099a46d011b20e2": "A versão do PHP não pode estar vazia", - "44bd68c6703adf65ff21c63e9a876aa1": "O formato do domínio primário está incorreto", - "23eded6de9c06451f67ecb7ed3a8c95b": "O domínio primário não pode ser um registro DNS curinga (wildcard)", - "f54249d2613e48be05837ec9cd615a5f": "O site que você tentou adicionar já existe!", - "b537e2d1946d559d3de4fb3c045d290f": "O domínio que você tentou adicionar já existe!", - "f91c641aef33cf8ef4a29bc5d3a7193a": "Falha ao adicionar, ERRO de gravação de configuração!", - "c3c7869d22051eaa78a831834a398351": "Houve um erro ao excluir, tente novamente.", - "e2d272e229674e4c6765fab24a323604": "Site [{}] excluído com sucesso", - "aa5f20e061736fe68a915163e7e6d122": "O site especificado NÃO existe", - "f11e72daff0ce484f4c401bd0bd28ae5": "Site excluído com sucesso!", - "c57d58c6bbd34144325871d75b42a577": "Por favor, insira o nome de domínio do host", - "5c7b7c2f6ed78eefdd77aaa3dddde61a": "O domínio não pode estar vazio!", - "ef446d50df1605a582f9b44b57327536": "O formato do nome de domínio está incorreto!", - "68ae44808f90043dee02358ee768bf6e": "O formato do domínio é inválido!", - "1628c2a26ab6d1211b435f85782f8acc": "O nome de domínio especificado foi vinculado pelo site [{}]", - "925dc658ddf0f69509632848bcd39577": "O nome de domínio especificado foi vinculado por um subdiretório do site [{}]!", - "7b02cf82181f516626a36b86c6a686f5": "Site adicionado com sucesso!", - "9b3c4205f2f408790c9c1c5da53c3bfb": "Falha ao obter a versão do PHP!", - "abc3db87d5608cc9559556468a696a35": "Por favor, escolha um nome de domínio", - "7807e17f2bf49fb802bba1a04822ea16": "Por favor, escolha uma porta", - "e5925c3a126a66c0565df6d8ef49550e": "O último domínio não pode ser excluído!", - "17088ffed1e537b917a6ecc9dc957159": "ERRO de Chave Privada, por favor verifique!", - "26924bd958e212f07c31b6ffca9cbf8c": "ERRO de Certificado, por favor verifique!", - "44e2c1c3cfd8d248d7c9190a8f07c0ee": "Erro ao obter certificado", - "fc0d039d9dcf3905ae8032c9cb33f475": "ERRO:
{}", - "ddc2be35a5ed0bf09a88139c4ad10b4a": "Igual ao caminho original, não é necessário alterar!", - "84a8921b25f505d0d2077aeb5db4bc16": "Estático", - "ad74aa2854e988c3157f92e0120bb19e": "Apache2.2 NÃO suporta MultiPHP!,{}", - "4018ce634a10d352867f04962f107c14": "Houve um erro ao definir, tente novamente.", - "f1bef4fd5183ae83a5896c32a3d5e81d": "Configuração PHP personalizada suporta apenas Nginx", - "879e0d022ff268704f93a7e2b504c224": "A configuração de conexão PHP não pode estar vazia ao personalizar a versão!", - "73d6e709b568b43405052cec999798c5": "O formato da configuração de conexão PHP está incorreto, consulte o exemplo!", - "90a0cb1e2a8bee7ba3bcc51d8b80ee2e": "O socket unix especificado [{}] não existe!", - "751ac8fd72a0acd79772370efcae9c89": "Não foi possível conectar a [{}], verifique se a máquina pode conectar ao servidor de destino", - "3cb7d414f8ae92b2b29057f91346f7dc": "Falha na configuração, nenhum item de configuração relacionado a enable-php-xx foi encontrado no arquivo de configuração do site!", - "c7a6a892c6cdfc9b0fedefb0a1d2083a": "O diretório solicitado não existe", - "4622561ceaaecb6ef7dd51e65c9f4ec5": "Diretório base desligado!", - "e4ec1f40794bdf92e7261e6e0c51895a": "Diretório base ligado!", - "eeddf79f68ffe029ed83fddcba46b35f": "Proxy antigo", - "1592678472ea1b601fd74abff47c56b1": "NÃO é possível obter a URL de destino", - "18edd294853d381dbe0d612ab58bc123": "Um erro foi detectado no arquivo de configuração. Por favor, resolva antes de prosseguir", - "8b5899be4df3aedb03c6fbad9055ed1c": "O nome do banco de dados não pode ter mais de 40 caracteres!", - "111376d92c49c1a6c1522a2ef1dac23c": "O nome do proxy reverso especificado ou pasta de proxy já existe", - "09a988aa2e3185fce9fa8f4e8710b862": "Não é possível definir proxies de diretório e globais simultaneamente", - "012a8e497feddccb8e4a47aa5e2dc156": "Por favor, insira um número", - "90da7d2de9aa12ec32ee04172ca0d2d3": "Erro de formato de domínio enviado :", - "440544138d3ed8a2229792c88bad3bd8": "A URL de destino não pode ser acessada", - "faf2457853593b3296699c4adacc7825": "Por favor, insira o conteúdo a ser substituído", - "748e5ad33460a17cf26c8024bb0a1620": "O conteúdo de substituição não pode ser o mesmo que o conteúdo a ser substituído", - "195d5db9e1559f06348715bc3a822036": "Um proxy reverso global já existe na configuração principal de reescrita/nginx/arquivo vhost", - "cc38d47ec9ac62ffc67a5db9c08d5d52": "A URL de destino não pode estar vazia", - "fb79afbbe0688565b7894b644dfd798d": "A URL de destino não pode ser [http:// ou https://], preencha a URL completa, como: https://aapanel.com", - "29c9da826ae868c8c6444328f48bcf40": "Proxies reversos não estão disponíveis atualmente para sites Wordpress que usam implantação em um clique", - "a59dfc3ae22fd96d46011503a4f40744": "Proxy suspenso", - "078bb5f960587121c7cd606ddba5ad58": "Por favor, ative o proxy reverso antes de editar!", - "fe7185cec796e18d58f8e84dc4da946f": "Atualmente suporta apenas Nginx", - "222a267cc5778206b253be35ee3ddab5": "Atual", - "38441d4a89765279852ca2830aa89c83": "Nova regra de reescrita de URL foi salva!", - "b9c1dcb37c44dca19765636de065b1c1": "Backup bem-sucedido!", - "c27a45bf16475a157ca1014cf886bb56": "Por favor, insira uma nota", - "9a962a24e9b7b07800d6b7c7efd86f30": "Usuário ou senha não podem ter menos de 3 dígitos!", - "7eb904262649f9b2e4ba52e2bba9db71": "O formato da senha está errado, não use símbolos especiais nos dois primeiros dígitos!", - "492c7f01035f1cf9b88756f897f02b87": "ERRO, o domínio primário não pode ser um endereço IP!", - "0a2b8c4a98495f6af19be9c1c342844e": "Sucesso, por favor teste o programa JSP!", - "49281f9c7680652b1d110625da5c8cca": "Mapeamento Tomcat fechado!", - "ec3b07b78fd4f3307c84858957ddbd0f": "Obter caminho de execução do site Falso", - "02e602e968050352febfc4ddcae332f0": "OpenLiteSpeed não suporta definir o site padrão", - "362538d60f495840284c667e67831b16": "Verificar diretório", - "4f137439eb93e6c752873c8af2d3d1cb": "Tarefa de verificação está na fila!", - "613a6375944c3035efe735e87766fbbd": "Atualização bem-sucedida!", - "6177805463a6a4f28e61bb3435bee13b": "Definido com sucesso, o site irá parar automaticamente quando expirar!", - "1a69486f70b6baf749e6e1c4d5fcf689": "O sufixo da URL não pode estar vazio!", - "2f858201b6da6a5419c5af8fd26f815c": "O domínio da corrente anti-roubo (hotlink) não pode estar vazio!", - "f36c15e89d61e07fb44095ae920b8fbc": "Por favor, ative o hotlink primeiro!", - "70dc560b6f4af6d210c9eeb8434c571c": "Recursos de resposta devem usar caminho URI ou código de status HTTP, como: /test.png ou 404", - "aa8722f512ecebf5dae454e526402508": "Por favor, ative o anti-roubo primeiro!", - "bd0d7585c64988d80747a32fb0e3e15e": "O log está vazio", - "a17f5bc22553d897f6363867c0165256": "Categoria padrão", - "0d0d87a34e787b2f4a59d912d4d441e4": "O nome da categoria não pode estar vazio", - "6818a5095a78431eb3c99fe022b687b0": "O nome da categoria não pode exceder 16 letras", - "c4f16bb3d87b92062f73954c86485f64": "Adicione até 10 categorias!", - "5fd53f59be2a3dee94df28886840b9a3": "O nome da categoria especificada já existe!", - "1c44b4096bb88e459ddadef895bea1c2": "A categoria especificada NÃO existe!", - "8f52253b1f007fd14ed0f60b89593d2d": "Categoria excluída!", - "b51515085fc6ea6a07192c61e068c124": "Modificado com sucesso", - "8d5a0b5b1a1c8691e1c0918e5a4da1a7": "Esta função suporta apenas Nginx/Apache", - "6678fd91bc04eb1e34e3474809387e7a": "Falha na consulta, endereço não existe", - "7ac0a27b48f2931c7f294b996fe6b273": "Erro ao analisar arquivo de configuração", - "ee3a15a26aee235ac255e37342b444bb": "Configurado com sucesso", - "79799f8c2f024685df774550ea5b427d": "O site [proxy, redirecionamento, http para https] não está configurado para reiniciar automaticamente", - "29faf053a22c387532298233399e66f9": "Erro de análise do arquivo de configuração", - "6c881e76c76b1f102bcb97a8b4f682f6": "Este site ativou o reinício automático de [proxy, redirecionamento, http para https]", - "13fc1b8a101214be1a472db8de1bd8fd": "O site desativou o reinício automático", - "1fb58c8e2967a648359d13aa22d9e493": "O site não existe!", - "b0cd0c2bc5c6ce9f71127d60872209ce": "Site [{}] renomeado: [{}]", + "140bda69874872f8402052c613c0b3b9": "Email de Teste de Alerta aaPanel", + "76a1ec4a3fcdc304394ff14dc90f8072": "O número de threads do painel deve estar entre 1-1024", + "dd7e82b5fb3c67e3e41d96f22ba838fd": "Nova porta do painel", + "248336101b461380a4b2391a7625493d": "Salvo", + "40624aabb99173387dd6d575759b12db": "O parâmetro certPem está faltando!", + "37db9679113eef382992a1478f1b79ff": "O parâmetro privateKey está faltando!", + "7063e5fbf2ea8d0809fe307b6df00467": "Certificado salvo!", + "d2174fc17fcd785706114088b84dbbce": "URL de login temporário foi gerada", + "b5101eb6e685091719013d1a75756a53": "\\1", + "0bfe47819da04212a33dac83b71430e8": "\\2", + "b0698ab9adefa7515299f311c725ba4d": "Limpar ordenação com sucesso", + "8611f56e253646a455ceeb020052fa97": "Falha ao modificar", + "bef28b813bf12be3924925bbb62883dd": "Executado com sucesso!", + "fda63bff3e0143980e5761376859b00b": "Falha na execução, verifique se o Apache está instalado", + "22012355700877ab73f89de8014ab20b": "Erro de configuração de regra Apache:
falha ao ativar:

", + "9848c96a046adb1759233241661ff694": "O serviço {} falhou ao iniciar", + "6ed577cdce37bbd9c66871ac1677dc53": "Falha na parada do serviço!", + "c7138b4b5f7ded833942aef4e230771d": "Comando enviado com sucesso!", + "d56f0ed99825b4d62ab84753a65f7f1e": "Painel reiniciado", + "ebdcf538e79de6922f498cc8c735eab5": "O firewall do sistema não está aberto", + "a296add6341b715925c0be2b83514ee3": "O endereço IP que você inseriu é ilegal!", + "3433b9709eed7423f1900061ef743af6": "Desativar este IP fará com que seu servidor falhe", + "57e7b2320dd3984312335605d57ee0f8": "O IP existe na lista de bloqueio, não é necessário repetir o processamento!", + "4bb8df740a7119979ff7854d034200a8": "O endereço IP é ilegal!", + "ff9c66f005c08efd15752fb261057b46": "O intervalo de portas deve estar entre 22 e 65535!", + "b26b09909c3b090f31dba4a0986e1b84": "A porta existe, não é necessário repetir a liberação!", + "408f58c25fc55295236fbb64a2d884ff": "Falha, impossível excluir a porta atual do painel", + "ad6fc2abb89b42d391b4bf84e8e6cd2d": "Serviço SSH desligado", + "0692d6f0819524aaa05e73f03022ec5b": "Serviço SSH ligado", + "d0749aaba8b833466dfcbb0428e4f89c": "SUCESSO", + "ffdc24f916f3071233ca7710aff032c8": " Acesso por senha", - "1cc6b0e84b90d0ca0b863fccc0f33b36": "Diretório foi protegido", - "b7526fc6f8b21e71ea1e290a982df4c9": "Criado com sucesso", - "7c0f11514254eedfffc86cf0bd09b98f": "Apache2.2 NÃO suporta MultiPHP!", - "69be778c38b9edc0ab3040c478c39370": "ERRO: %s
1. Verifique se o nome de domínio está vinculado ao site correspondente.

2. Verifique se o nome de domínio está resolvido corretamente para o servidor ou se a resolução não é totalmente efetiva.

3. Se o seu site tiver um proxy reverso configurado ou se você estiver usando uma CDN, desligue-o primeiro.

4. Se o seu site tiver um redirecionamento 301, desligue-o primeiro

5. Se as verificações acima confirmarem que não há problema, tente alterar o provedor de serviço DNS.

", - "4d6822ed3bd01f379f2ab4b1e68068d7": "|-Não há certificados para renovar no momento.", - "b74c00ca5fee122c49cd66ce3d91b2cf": "|-Falha na renovação:", - "0b1c93d38c86c8d379886293cdf8ba66": "Tarefa cancelada!", + "0161305479129bbe47bb020605a15d40": "Configuração bem-sucedida!", + "5c9b599b99f7a169b9cd25f7045eaac5": "Sincronização bem-sucedida!", + "b6601359f1ae1067d4c4d271b7407639": "Sincronização bem-sucedida 1!", + "10a1984f6c5b935c5d8c7d4b4345e1e5": "Sincronização bem-sucedida!", + "86da84e8e3aacf73ee745caee5904268": "Sincronização falhou!", + "8ed30fe61ac59c9e1cb4a75d9a48d477": "Criado com sucesso!", + "330e51da1228a070540f82eb8e78155c": "Configurado com sucesso!", + "7ac73ef676faaa8a5f8e3924b4d151e3": "Nome de usuário ou senha não podem ter menos de 3 caracteres", + "88d8a4565feba5ad270c00e85564b96d": "OpenLiteSpeed não é suportado atualmente", + "c1f8cf125da0d6db1c4e0d09033c9ddd": "Por favor, insira uma conta ou senha", + "bd7fb7b4280616cbe5de49eb1ee8cc3a": "Por favor, insira o diretório a ser protegido", + "8c48114518721e3966cd4553a0cee705": "Por favor, insira o Nome", + "dd65d82f6868cfa127f86e5658674829": "Proteção de senha do site foi configurada, cancele e configure novamente. Diretório do site --> Acesso com senha", + "1cc6b0e84b90d0ca0b863fccc0f33b36": "Diretório foi protegido", + "b7526fc6f8b21e71ea1e290a982df4c9": "Criado com sucesso", + "7c0f11514254eedfffc86cf0bd09b98f": "Apache2.2 NÃO suporta MultiPHP!", + "69be778c38b9edc0ab3040c478c39370": "ERRO: %s
{}", + "6e264f3408e9b769d3fb7e2c807f301f": "A operação falhou. Verifique se a chave está correta", + "d4ac5985eccd334896e3cf23706e43b0": "Adicionado com sucesso", + "92188d43af4373bacbf00951da16532a": "Falha ao obter o caminho do site. Verifique se o site existe", + "ceaefd9a46d78491b9fdb912b5c71eeb": "Falha ao criar o arquivo de validação. Verifique se a gravação foi bloqueada", + "1bb3608b1bc684c3dc85090db249346b": "Nenhuma informação de certificado foi obtida", "d5ef96e383d376beeec28da7acfea516": "Baixar arquivo", "f24f6c5f5841340f898a6baaa6478bcd": "Baixar arquivo {}", - "9fdd777388a418cef77bce46c1b2511a": "O formato de compactação especificado não é suportado!", - "4fa407ee74026903dc3013d0b2471eac": "Compactação bem-sucedida!", - "ece43dcaac9352f58c422e500266a927": "Descompactação bem-sucedida!", + "9fdd777388a418cef77bce46c1b2511a": "O formato de compressão especificado não é suportado!", + "95b045c4bc0ef440acd6156fb42b50c6": "Compressão falhou: O arquivo de destino {} não foi gerado", + "4fa407ee74026903dc3013d0b2471eac": "Compressão bem-sucedida!", + "ece43dcaac9352f58c422e500266a927": "Descompressão bem-sucedida!", + "b9c1dcb37c44dca19765636de065b1c1": "Backup Bem-sucedido!", "ac4eb62573e34c36ff426c8a6360c781": "Erro de backup!", "438ca4ffcf6fbd44ec129e73a24f0deb": "Selecione arquivo sql/gz/zip!", "0edfb4a54d6cf45209a6c7929b8b9919": "Banco de dados importado com sucesso!", - "f6039d44b29456b20f8f373155ae4973": "Nome de usuário", - "3544848f820b9d94a3f3871a382cf138": "Nova senha", - "6b1bc4e672d58d46d23502dcd78129be": "Limpando informações de log", - "0e900c57ee4635719ba671229ead12ff": "Limpando histórico de tarefas", - "1dfefaa079cbde4da09e89af6b49ff33": "Limpando registros de monitoramento de rede", - "f59489317e210ec566cf6b6c9e3b20b9": "Limpando registros de monitoramento de CPU", - "e0976b426e3109ee01a1182b7c04b987": "Limpando registros de monitoramento de disco", - "2c1eb277ff700f04b65306399784f875": "Limpando informações de IP", - "4abfe31831aa15dc27ff44067b2bf0d1": "Limpando histórico do sistema", - "0c06c1eb5ef47b883f7cbcab9be84e97": "O painel foi empacotado com sucesso. Por favor, NÃO faça login no painel para fazer outras operações!", - "b60091f633dedd493b16f5548e32233d": "Endereço de inicialização do painel", - "b097eb5212f13c74d1c96b59f65c4dd6": "Limpou com sucesso {} tarefas!", - "e82eb2921856b4230611dc1406f60a6f": "Lixo do sistema limpo, totalmente excluídos [{}] arquivos, espaço em disco liberado [{}]", - "0d793de4ae05511630a2eeea9b5528d9": "|-Limpou [{}], excluídos [{}] arquivos, espaço em disco liberado [{}]", - "db62071d34202efa3a0aa1a743394938": "|-Spool limpo, excluídos [{}] arquivos, espaço em disco liberado [{}]", - "a1d3c6c221b8ceaaef8881e09d0a2945": "|-Limpando Sessão PHP ...", - "c16f6a333c0ba871467568be496cbea0": "|-Sessão PHP limpa, excluídos [{}] arquivos, espaço em disco liberado [{}]", - "5d88b58a1c0ba0dee9eeb89a8bcdda36": "|-Limpando arquivos temporários e logs do site...", - "e038ca57ad9c03f40bec42908af2ccff": "|-Arquivos temporários e logs do site limpos, excluídos [{}] arquivos, espaço em disco liberado [{}]", - "fa3d217e80478d3c03c437b7fc11432f": "|-ERRO, o nome de usuário não pode ter menos de 5 caracteres", - "4cffae9f32bf898c859a5937268b9727": "|-ERRO, não é possível usar um nome de usuário muito simples", - "fbcb6a4b1126170666b4c4102afbb43d": "|-Novo nome de usuário: {}", - "cbe2d798534f872748b7cba6615596d8": "Edição personalizada com aaPanel", - "ec1d9ff2578e1f231696217b2c2d15ab": "Falha,não é possível excluir a porta atual do painel!", - "51708089c15820800d3dd7bd8d8cdfba": "aaPanel", - "fee066b1b93fecf9545758cf9a87c3de": "Atualizando plugin...", - "c6462fea6d27e4ecfc68ae1944051f77": "Login bem-sucedido, carregando...", - "c11f9218de293117d2cd58a009534167": "Todos os plugins atualizados com sucesso para compatibilidade com 6.0!", - "cc478711642936a519c27b7c388fbb50": "CLI do aaPanel", - "cfef992430ab5a7b2373138d4b86425c": "Reiniciar painel", - "95b8b68d1c80ca75e1ab15bf5b9a8394": "Alterar porta do painel", - "f3013e54b467cdb2fac9a424bae963e4": "Parar painel", - "15ea17031cb6a968e3b9ea2b28546c53": "Limpar cache do painel", - "20cdfcd210da305d900d25ec4c084184": "Limpar limite de login", - "ab41db99c7941ef74c37bd97733f7707": "Recarregar painel", - "315f4fdd99e49c6a2e80a95ce82ba534": "Cancelar limite de entrada", - "07ed88796641228c3602122cf5075fc2": "Alterar senha do painel", - "63d8f2a0e51e9243f91b0285e4e44667": "Cancelar limite de vínculo de domínio", - "3913f08c2fa53f4c413cc0772f9401d1": "Alterar nome de usuário do painel", - "b773a80578cdc8f50d57393d6b0a3d67": "Cancelar limite de acesso IP", - "a6a23a4004f99fef13372de56433edbc": "Alterar forçosamente a senha root do MySQL", - "bc449263dd0183a82a3d0a03cd8f26dc": "Ver informações padrão do painel", - "975687e8a64e2c2842a34ca6d6bf8e85": "Limpar lixo do sistema", - "84bc199f1a5ce205b0f5fc3e64ef3e95": "Por favor, insira o número do comando:", - "954be127268a1704a7af22b23bb440e8": "Cancelado!", - "51c6348531daaf0fb1e84fafa12b5f15": "Por favor, insira a nova senha: ", - "34c4edd98a45ea8a13556965a6c4f2b0": "Por favor, insira o novo nome de usuário (>5 caracteres): ", - "219863186dddc079747a525bb7877a88": "Por favor, insira a nova senha root do MySQL:", - "c172da334fdcac77f704fa4408dd2f16": "|-ERRO, a senha não pode estar vazia", - "a79cf67c04d379c4916dc584c9d8333f": "|-ERRO, a senha não pode ter menos de 8 caracteres", - "06f5000079703a33b91564159f07770a": "|-ERRO, a senha não pode conter caracteres especiais", - "913153f9957100bcf3029e8f3d5bc5e9": "Por favor, insira a nova porta do painel: ", - "39ea14ec0df812219c450ba15230ad2d": "|-ERRO, nenhuma porta válida inserida", - "bab5cb07adebbfbd938180d6862a7ce7": "|-ERRO, por favor NÃO use a porta comum como porta do painel", - "00213d6b5423971311e5a47f83081a24": "|-ERRO, a nova porta é a mesma que a porta atual do painel, não é necessário alterar", - "e1e57838b2c7e1567fb96e20bfd474e0": "|-ERRO, a porta especificada já está em uso", - "5093d954f09d473d091355fe292920a8": "|-Limite de entrada cancelado", - "e0b1cb1725c8fb29d42fa69d679a73ea": "|-Limite de domínio cancelado", - "968c7b9246b5ab3d3e7659cea211a20b": "|-Limite de acesso IP cancelado", - "e06d1ba70f1331e9f9a113cc2f887d3f": "Não autorizado", - "6c89f438bb1463ecd92f1832d0aaa277": "Código QR expirado", - "a11371c8ae1f6978f0dd88d0bddaa1be": "Escaneamento de QRCODE bem-sucedido", - "ab9f853a311a37b0fdc50cdfb4e7ac05": "Falha no login 2", - "735ff2bcf3bc80998a077ba01d50ab8c": "Falha no login 1", - "5b0308d8fa9b2acb17601e300f789005": "API não está ligada", - "55c294cfb3e6b69997d8b5cf04369914": "Telefone não vinculado", - "13b08ce52b782ebdc94a64637cd3c992": "Aguardando login por código de escaneamento do APP 1", - "21d947c00f0d5b4ca710f7db100b8af3": "Aguardando login por código de escaneamento do APP 2", - "9d7820cd626f61af19de756761a2280f": "Aguardando login por código de escaneamento do APP", - "ed8abe55f77bc3512706869b791aa8f0": "Código QR atual inválido222", - "727f11bf8b090ccbf27efcfb530e262f": "login bem-sucedido!", - "8d4d13a3836227d377455b5dc0256d5a": "Desculpe, OLS atualmente não suporta este recurso", - "6ca3d3b27428d22e047e13a552f1600e": "Adicionado com Sucesso", - "868903fa7bc939d9ff39df264589c0fd": "Excluído com Sucesso", - "4f7e04eb8dba15474e74e11df0c02a13": "definido com sucesso!", - "aa8e78fa88d0bfaaf68110219583ba96": "Foi testado novamente.", - "e1bb08ea6a5543e3d7076c8dd55496c8": "Falha na detecção", - "621a965bba1442f39a3491d7442e968b": "O sistema atual não suporta temporariamente", - "5ec14542d76e320be548502216749b04": "Escaneamento falhou", - "1df790ce75c2644b8d1a0708874340b6": "Escaneamento concluído", - "949aea6b29e43fcceab11ac1b13d07f9": "{} falha na configuração!", + "131c05252110792212e3e3666a351154": "Configuração relacionada ao SSL, NÃO exclua ou modifique a próxima linha de regras 404 comentadas", + "4ba7e24ac1607ab761c124ca7352ad08": "Configuração de página de erro, permitido comentar, excluir ou modificar", + "31bb30ca4135945adbe0c2daa9545b39": "Configuração de referência PHP, permitido comentar, excluir ou modificar", + "f9da3e5ae75ce0ae39884ae2ea295a66": "Referência de regra de reescrita de URL, qualquer modificação invalidará as regras de reescrita definidas pelo painel", + "73e1f7d487ad73d55414fe26ea11cbf0": "Parâmetro não especificado [sitePath]", + "6aabca3a3e1c79bd5837a1ddae95fe70": "Ocorreu um erro ao criar, tente novamente.", + "256c9a85375f57f2dc9f6f318c6578f1": "Criação do site [ {} ] bem-sucedida", + "481df7dbcd4c0317088bde8c913d5893": "Por favor, preencha o caminho do site", + "b1b2484c013c646d7f41d6b2f495b6ef": "O caminho do site não pode ser o diretório raiz [/]", + "1c3bff99564f1370a5b1bf6c0773f8c4": "Por favor, verifique se o formato do [E-mail] está correto", + "af9091566e669f016edf16ba97464cbe": "Senha muito fraca, se tiver certeza de usá-la, marque [ Permitir senhas fracas ]", + "b0dbad478d4f07c38aec8f440ed98b66": "Por favor, instale Mysql e PHP primeiro!", + "46491fef7553177ef58a55b2db917072": "Por favor, não defina o diretório raiz do site como o diretório principal do sistema:
{}", + "59d5fef323e89ded50ed6036848a97f3": "O formato do parâmetro webname está incorreto, deve ser uma string JSON analisável", + "078a3d3e263be2851ddfd9fa059d098f": "Intervalo de porta incorreto! deve ser entre 100-65535", + "50370024fdd22dc69099a46d011b20e2": "A versão PHP não pode estar vazia", + "44bd68c6703adf65ff21c63e9a876aa1": "O formato do domínio principal está incorreto", + "23eded6de9c06451f67ecb7ed3a8c95b": "O domínio principal não pode ser um registro DNS curinga", + "f54249d2613e48be05837ec9cd615a5f": "O site que você tentou adicionar já existe!", + "b537e2d1946d559d3de4fb3c045d290f": "O domínio que você tentou adicionar já existe!", + "f91c641aef33cf8ef4a29bc5d3a7193a": "Falha ao adicionar, ERRO de gravação de configuração!", + "c3c7869d22051eaa78a831834a398351": "Houve um erro ao excluir, tente novamente.", + "e2d272e229674e4c6765fab24a323604": "Exclusão do site [{}] bem-sucedida", + "aa5f20e061736fe68a915163e7e6d122": "O site especificado NÃO existe", + "f11e72daff0ce484f4c401bd0bd28ae5": "Site excluído com sucesso!", + "c57d58c6bbd34144325871d75b42a577": "Por favor, insira o nome de domínio do host", + "5c7b7c2f6ed78eefdd77aaa3dddde61a": "O domínio não pode estar vazio!", + "ef446d50df1605a582f9b44b57327536": "O formato do nome de domínio está incorreto!", + "68ae44808f90043dee02358ee768bf6e": "O formato do domínio é inválido!", + "1628c2a26ab6d1211b435f85782f8acc": "O nome de domínio especificado foi vinculado pelo site [{}]", + "925dc658ddf0f69509632848bcd39577": "O nome de domínio especificado foi vinculado por um subdiretório do site [{}]!", + "7b02cf82181f516626a36b86c6a686f5": "Site adicionado com sucesso!", + "9b3c4205f2f408790c9c1c5da53c3bfb": "Falha ao obter a versão PHP!", + "abc3db87d5608cc9559556468a696a35": "Por favor, escolha um nome de domínio", + "7807e17f2bf49fb802bba1a04822ea16": "Por favor, escolha uma porta", + "ecdc6ad598bdc08ff236f448e1d03e13": "Registro de domínio não encontrado", + "e5925c3a126a66c0565df6d8ef49550e": "O último domínio não pode ser excluído!", + "17088ffed1e537b917a6ecc9dc957159": "ERRO de Chave Privada, por favor verifique!", + "26924bd958e212f07c31b6ffca9cbf8c": "ERRO de Certificado, por favor verifique!", + "44e2c1c3cfd8d248d7c9190a8f07c0ee": "Erro ao obter certificado", + "fc0d039d9dcf3905ae8032c9cb33f475": "ERRO:
{}", + "ddc2be35a5ed0bf09a88139c4ad10b4a": "Igual ao caminho original, sem necessidade de alteração!", + "84a8921b25f505d0d2077aeb5db4bc16": "Estático", + "ad74aa2854e988c3157f92e0120bb19e": "Apache2.2 NÃO suporta MultiPHP!,{}", + "4018ce634a10d352867f04962f107c14": "Houve um erro na configuração, tente novamente.", + "f1bef4fd5183ae83a5896c32a3d5e81d": "A configuração personalizada do PHP suporta apenas Nginx", + "879e0d022ff268704f93a7e2b504c224": "A configuração de conexão PHP não pode estar vazia ao personalizar a versão!", + "73d6e709b568b43405052cec999798c5": "O formato da configuração de conexão PHP está incorreto, consulte o exemplo!", + "90a0cb1e2a8bee7ba3bcc51d8b80ee2e": "O socket unix especificado [{}] não existe!", + "751ac8fd72a0acd79772370efcae9c89": "Incapaz de conectar a [{}], verifique se a máquina pode conectar ao servidor de destino", + "3cb7d414f8ae92b2b29057f91346f7dc": "Falha na configuração, nenhum item de configuração relacionado a enable-php-xx foi encontrado no arquivo de configuração do site!", + "4622561ceaaecb6ef7dd51e65c9f4ec5": "Diretório base desativado!", + "e4ec1f40794bdf92e7261e6e0c51895a": "Diretório base ativado!", + "eeddf79f68ffe029ed83fddcba46b35f": "Proxy antigo", + "1592678472ea1b601fd74abff47c56b1": "NÃO foi possível obter URL de destino", + "18edd294853d381dbe0d612ab58bc123": "Um erro foi detectado no arquivo de configuração. Por favor, resolva antes de prosseguir", + "8b5899be4df3aedb03c6fbad9055ed1c": "O nome do banco de dados não pode ter mais de 40 caracteres!", + "111376d92c49c1a6c1522a2ef1dac23c": "Nome do proxy reverso ou pasta de proxy especificado já existe", + "09a988aa2e3185fce9fa8f4e8710b862": "Não é possível definir proxies de diretório e globais simultaneamente", + "012a8e497feddccb8e4a47aa5e2dc156": "Por favor, insira um número", + "90da7d2de9aa12ec32ee04172ca0d2d3": "Erro de formato de domínio enviado :", + "440544138d3ed8a2229792c88bad3bd8": "A URL de destino não pode ser acessada", + "faf2457853593b3296699c4adacc7825": "Por favor, insira o conteúdo a ser substituído", + "748e5ad33460a17cf26c8024bb0a1620": "O conteúdo de substituição não pode ser o mesmo que o conteúdo a ser substituído", + "195d5db9e1559f06348715bc3a822036": "Um proxy reverso global já existe no arquivo de configuração mestre rewrite/nginx/vhost", + "cc38d47ec9ac62ffc67a5db9c08d5d52": "A URL de destino não pode estar vazia", + "fb79afbbe0688565b7894b644dfd798d": "A URL de destino não pode ser [http:// ou https://], preencha a URL completa, como: https://aapanel.com", + "29c9da826ae868c8c6444328f48bcf40": "Proxies reversos não estão disponíveis atualmente para sites Wordpress que usam implantação com um clique", + "a59dfc3ae22fd96d46011503a4f40744": "Proxy suspenso", + "078bb5f960587121c7cd606ddba5ad58": "Por favor, ative o proxy reverso antes de editar!", + "fe7185cec796e18d58f8e84dc4da946f": "Atualmente suporta apenas Nginx", + "222a267cc5778206b253be35ee3ddab5": "Atual", + "38441d4a89765279852ca2830aa89c83": "Nova regra de reescrita de URL foi salva!", + "c27a45bf16475a157ca1014cf886bb56": "Por favor, insira uma nota", + "9a962a24e9b7b07800d6b7c7efd86f30": "Nome de usuário ou senha não podem ter menos de 3 dígitos!", + "7eb904262649f9b2e4ba52e2bba9db71": "O formato da senha está errado, por favor, não use símbolos especiais para os dois primeiros dígitos!", + "492c7f01035f1cf9b88756f897f02b87": "ERRO, o domínio principal não pode ser endereço IP!", + "0a2b8c4a98495f6af19be9c1c342844e": "Bem-sucedido, teste o programa JSP!", + "49281f9c7680652b1d110625da5c8cca": "Mapeamento Tomcat fechado!", + "ec3b07b78fd4f3307c84858957ddbd0f": "Obter caminho de execução do Site Falso", + "02e602e968050352febfc4ddcae332f0": "OpenLiteSpeed não suporta a configuração do site padrão", + "362538d60f495840284c667e67831b16": "Diretório de verificação", + "4f137439eb93ec752873c8af2d3d1cb": "Tarefa de verificação na fila!", + "613a6375944c3035efe735e87766fbbd": "Atualização Bem-sucedida!", + "6177805463a6a4f28e61bb3435bee13b": "Configurado com sucesso, o site parará automaticamente quando expirar!", + "1a69486f70b6baf749e6e1c4d5fcf689": "O sufixo da URL não pode estar vazio!", + "2f858201b6da6a5419c5af8fd26f815c": "O domínio anti-hotlink não pode estar vazio!", + "f36c15e89d61e07fb44095ae920b8fbc": "Por favor, ligue o hotlink primeiro!", + "70dc560b6f4af6d210c9eeb8434c571c": "Recursos de resposta devem usar caminho URI ou código de status HTTP, como: /test.png ou 404", + "aa8722f512ecebf5dae454e526402508": "Por favor, ligue o anti-roubo primeiro!", + "bd0d7585c64988d80747a32fb0e3e15e": "Log está vazio", + "a17f5bc22553d897f6363867c0165256": "Categoria padrão", + "0d0d87a34e787b2f4a59d912d4d441e4": "O nome da categoria não pode estar vazio", + "6818a5095a78431eb3c99fe022b687b0": "O nome da categoria não pode exceder 16 letras", + "c4f16bb3d87b92062f73954c86485f64": "Adicione até 10 categorias!", + "5fd53f59be2a3dee94df28886840b9a3": "O nome da categoria especificado já existe!", + "1c44b4096bb88e459ddadef895bea1c2": "A categoria especificada NÃO existe!", + "8f52253b1f007fd14ed0f60b89593d2d": "Categoria excluída!", + "8d5a0b5b1a1c8691e1c0918e5a4da1a7": "Esta função suporta apenas Nginx/Apache", + "6678fd91bc04eb1e34e3474809387e7a": "Consulta falhou , endereço não existe", + "7ac0a27b48f2931c7f294b996fe6b273": "Erro ao analisar arquivo de configuração", + "ee3a15a26aee235ac255e37342b444bb": "Configuração bem-sucedida", + "79799f8c2f024685df774550ea5b427d": "Site [proxy,redirect,http to https] não estão definidos para reiniciar automaticamente", + "29faf053a22c387532298233399e66f9": "Erro de análise de arquivo de configuração", + "6c881e76c76b1f102bcb97a8b4f682f6": "Este site ativou a reinicialização automática de [proxy,redirect,http to https]", + "13fc1b8a101214be1a472db8de1bd8fd": "Site desativou a reinicialização automática", + "1fb58c8e2967a648359d13aa22d9e493": "O site não existe!", + "b0cd0c2bc5c6ce9f71127d60872209ce": "Site [{}] renomeado: [{}]", + "3d8c9e517719022b27ad5f27c578fa31": "Obter RAM Falso", + "d47ab7b9ce539ba13f4e045561bb8ed7": "Obter Tempo de Atividade Falso", + "8e39175bab478762d3d029bee327c704": "Obter Tempo de Reinicialização Falso", + "e16cf27704f83c8b0a0efc16886ea75d": "Obter data Falso", + "c158c8096b76b85803e71232b2dd5e74": "Obter detalhes de tempo Falso", + "a6ec06b5eb6a42e13e072d2e992e31a0": "Obter reqpersec Falso", + "cdd32490a46567fd0c1ee9d4b170b762": "Obter TotalAccesses Falso", + "62b939086708b37d68c00cb713994b52": "Obter TotalKBytes Falso", + "13b06d17b35dfeeafa50e12ad9ec1735": "Obter BusyWorkers Falso", + "724fc9214ccce3e6a5787648240a4533": "Obter IdleWorkers Falso", + "7a7f329389283fdd3290c735f90946e9": "conf mpm_event_module não encontrado ou /www/server/apache/conf/extra/httpd-mpm.conf está vazio", + "c22cf8376b1893dcfcef0649fe1a7d87": "Segundo", + "db669c6377ab90eef78800a48fd4a453": "Tempo limite de solicitação", + "af52f5340c065f4d38182f7a27d59f75": "Manter vivo", + "70b46e57f3c33abdb9558bc5c3a234d9": "Máximo de solicitações keep-alive por conexão", + "6868568c3abc547e622a303891a906b0": "Processos padrão", + "224114c62dceb7ebee2db43c6c79a961": "Número máximo de threads ociosos", + "3c60809d9a5a0900dfbc28bb017e410b": "Número mínimo de threads ociosos disponíveis para lidar com picos de solicitação", + "3783030daf8154be6e11fc4160c229c3": "Número de threads criados por cada processo filho", + "2f25e4b1a2cb84576740da749a2daef2": "Número máximo de conexões que serão processadas simultaneamente", + "72e3edfd72758944413b1e4e9c432f1e": "Limite no número de conexões que um servidor filho individual manipulará durante sua vida", + "8d4d13a3836227d377455b5dc0256d5a": "Desculpe, OLS não suporta este recurso atualmente", + "6ca3d3b27428d22e047e13a552f1600e": "Adicionar com Sucesso", + "868903fa7bc939d9ff39df264589c0fd": "Excluir com Sucesso", + "4f7e04eb8dba15474e74e11df0c02a13": "configurado com sucesso!", + "aa8e78fa88d0bfaaf68110219583ba96": "Foi retestado.", + "e1bb08ea6a5543e3d7076c8dd55496c8": "Detecção falhou", + "621a965bba1442f39a3491d7442e968b": "Sistema atual não suportado", + "5ec14542d76e320be548502216749b04": "Varredura falhou", + "1df790ce75c2644b8d1a0708874340b6": "Varredura concluída", + "949aea6b29e43fcceab11ac1b13d07f9": "{}configuração falhou!", "ccf864247f7985a86e14f7fe4b9ce5a7": "Configurado com sucesso!", - "83fca103ffe22d911a49196e3065ff25": "Testado novamente", + "83fca103ffe22d911a49196e3065ff25": "Retestado", "aab2b67d697c82001fc3764f03df953e": "Terminal aaPanel", "9eee7650a676d53dc51e3361f2b2b99f": "Endereço de conexão errado", "f2dbc6dd77ebd7ee6e635d2e88a29388": "Tentativas de reconexão:{}", - "7b4a3e2ccafd5410416625d455f7db44": "Falha na tentativa de conexão, {}", + "7b4a3e2ccafd5410416625d455f7db44": "Falha na tentativa de reconexão, {}", "770d0e3e69e2bdb0f4688d602253fa28": "Autenticando chave privada", - "f86ecbf6201e5cd8df8b72fa2063029c": "Senha da chave privada incorreta:{}", + "f86ecbf6201e5cd8df8b72fa2063029c": "Senha de chave privada incorreta:{}", "71c1d999795c8090f7935a505db13faf": "Erro de chave privada: {}", "35c953aecb570759e062d478bc5947c0": "Erro de chave privada!", "38b5977db90e0d87467a6dead02cc9d4": "conexão bem-sucedida", - "3dbc3d6f340c62446d5e19a7a338474c": "Falha na autenticação {}", + "3dbc3d6f340c62446d5e19a7a338474c": "Autenticação falhou {}", "e0825948c99299a2d2f7171634bd5fe8": "O servidor de destino recusou ativamente a conexão", - "a51fb75bde49493b290d1d654cbd018f": "O cabeçalho do protocolo expirou e a qualidade da rede com o servidor de destino estava muito ruim: {}", - "59cd37aca5d30b4bd0c1b746c8dc4cc0": "Chaves privadas podem exigir acesso por senha: {}", + "a51fb75bde49493b290d1d654cbd018f": "A resposta do cabeçalho do protocolo expirou e a qualidade da rede com o servidor de destino estava muito ruim: {}", + "59cd37aca5d30b4bd0c1b746c8dc4cc0": "Chaves privadas podem exigir senha de acesso: {}", "aae28d19de861fdbd60625f5924b0ffe": "O handshake do protocolo SSH expirou e a qualidade da rede com o servidor de destino é muito ruim", "41f6f8e498eb036ae69adbe2f80c3dd6": "erro desconhecido: {}", "0122cb69d6c480c4e5a18fcb0acdfd49": "A autenticação foi bem-sucedida e o canal de sessão está sendo construído", "fa2f0078903e1fbd1f06fb383cded8e6": "Sucesso no login\\n", "1a0fc31214912c08b49032069b6c0ab4": "Sucesso no login", "0b2b278588fab56ed760e52a21ed5a15": "Canal desconectado", - "20536b8e623d518be1f31d393839ef70": "A conexão foi desconectada, pressione enter para tentar reconectar!", + "20536b8e623d518be1f31d393839ef70": "A conexão foi desconectada, pressione Enter para tentar reconectar!", "94c94a73ad6c35edec9bcd4bfb100c88": "Erro ao ler dados do buffer tty, {}", "9d46aa2efa419ff4a75df14577f1e629": "O cliente desconectou ativamente", "d566f8db7ec2abe7de92e59c901c4077": "Ocorreu um erro ao ler dados do websocket. Tentando novamente", - "0a6dc00cd150c5a1a776182bb2ea7406": "INFO_LOGIN_SSH", - "01993e4270c796db59ba22b3c2f53241": "As informações SSH especificadas não existem!", + "0a6dc00cd150c5a1a776182bb2ea7406": "SSH_LOGIN_INFO", + "01993e4270c796db59ba22b3c2f53241": "A informação SSH especificada não existe!", "ebd1aed8f2ab2f1ad08660f609f60206": "O endereço de host especificado foi adicionado a outras informações SSH!", - "649ba4179316d90343c8169038958400": "Especifique que as informações SSH foram adicionadas!", + "649ba4179316d90343c8169038958400": "Especifique que a informação SSH foi adicionada!", "9d048cf9fd858ea33d6607855e4c8219": "Por favor, passe o campo [sort_list]", - "e13d2375856de89c040c6eadfe65d699": "O nome do comando especificado já existe", + "e13d2375856de89c040c6eadfe65d699": "O nome de comando especificado já existe", "f64f7d7e07ab5fd2c7a8eed2274793c3": "O comando especificado não existe", "0b69cd55a690bee672a1fb91091222f1": "Iniciar backup", "a2eabcbade98a44462292c4666e62044": "Backup concluído", "7b73b93bef61012a61ae023017d02721": "O diretório especificado {} não existe!", "360cd057ad479f8662f7d1ba66f5cc8e": "Enviando para {}, aguarde ...", "95130692a2979832dc4d2143403f3a11": "Enviado com sucesso para {}", - "46d0294b3bb11e927f96319ee81395cf": "Falha no envio do arquivo, pular este backup!", - "d5d68ebd5292fcb5196ec251ba873f6c": "As configurações do usuário não mantêm backups locais, excluído {}", + "46d0294b3bb11e927f96319ee81395cf": "Falha no envio do arquivo, pule este backup!", + "d5d68ebd5292fcb5196ec251ba873f6c": "Configurações do usuário não retêm backups locais, excluído {}", "d2f7749d7de8ce82ae866155351919b3": "Backup local foi mantido", "778f2718d7245db0fad84757bad751d6": "Falha ao limpar backup expirado, erro: {}", "dd78b9ebd58a8dea880563698d4c4330": "Manter o número mais recente de backups: {} cópias", "5e2616a34c7b01f741cd85ad10bb9cbc": "Arquivos de backup expirados foram limpos do disco: {}", "a0adb8f2e5f0d4397d48466bafd6f230": "Arquivos de backup expirados foram limpos de {}: {}", - "380e4afa19e793ff5f8c1ecd6e2a228a": "Site de backup: {}", + "380e4afa19e793ff5f8c1ecd6e2a228a": "Backup do site: {}", "9572c95333f896e891521e61d7c5a297": "Raiz do documento do site: {}", "7a9a182fc01b961feb593d180d13aeb8": "Diretório de backup: {}", "8f116bc202c47d146df58722a3ac30c6": "Tamanho do diretório: {}", "1f9491d864cba19c180abe8941a92023": "Configuração de exclusão: {}", - "0a474e5e60d667669b163e7a561d1868": "O espaço em disco disponível da partição {} é: {}, Inode disponível é: {}", - "0064cb4c6495eb71bc7dc65c5d87d19b": "O espaço em disco disponível da partição de destino é inferior a {}, e o backup não pode ser concluído. Aumente a capacidade do disco ou altere o diretório de backup padrão na página de configurações!", - "48f2f0381d27c0907c8f4be1bbe3db3b": "O Inode disponível da partição de destino é inferior a {}, e o backup não pode ser concluído. Aumente a capacidade do disco ou altere o diretório de backup padrão na página de configurações!", - "1d5217f82b4cef426f8ee3fdde465424": "Iniciar compactação de arquivos: {}", - "5d38cd7c4d8e2b0c4fa5591f8eab0c37": "Falha na compactação!", + "0a474e5e60d667669b163e7a561d1868": "Espaço em disco disponível na partição {} é: {}, Inode disponível é: {}", + "0064cb4c6495eb71bc7dc65c5d87d19b": "O espaço em disco disponível da partição de destino é menor que {}, e o backup não pode ser concluído. Aumente a capacidade do disco ou altere o diretório de backup padrão na página de configurações!", + "48f2f0381d27c0907c8f4be1bbe3db3b": "O Inode disponível da partição de destino é menor que {}, e o backup não pode ser concluído. Aumente a capacidade do disco ou altere o diretório de backup padrão na página de configurações!", + "1d5217f82b4cef426f8ee3fdde465424": "Iniciando compactação de arquivos: {}", + "5d38cd7c4d8e2b0c4fa5591f8eab0c37": "Compactação falhou!", "78aeba095e656fa57452b915487c1b99": "Compactação concluída, levou {} segundos, tamanho do pacote compactado: {}", - "5789a3a4123ffb9fd9073fbda416e9c6": "Site com backup em: {}", - "6cb4511c7761c4cdaab742496c122023": "Diretório com backup em: {}", - "003ee27348243be75678b9cff2903eb3": "Backup do WordPress [{}] com sucesso", + "5789a3a4123ffb9fd9073fbda416e9c6": "Site backupeado para: {}", + "6cb4511c7761c4cdaab742496c122023": "Diretório foi backupeado para: {}", + "003ee27348243be75678b9cff2903eb3": "Backup do wordpress [{}] com sucesso", "a58667d22a7d741f6c90bc6082acf1c4": "Falha na exportação do banco de dados!", - "640a52c8f34bbd9ed9f214353440a490": "Notificação enviada", + "640a52c8f34bbd9ed9f214353440a490": "Notificação foi enviada", "3875029ec22001de5ece63df8ea8286d": "Backup para {}, um total de {} {}, e falhas {}.", - "af3eb0c9d6b3f6e7e32d6b81df04a186": "Falha no backup de {}/total de {} sites", + "af3eb0c9d6b3f6e7e32d6b81df04a186": "Falha no backup {}/total {} sites", "0dbafec38271230939c0fc9d41e9667c": "Falha ao enviar notificação", "2e828c10c1802fcfb4b8cabf63941c95": "Já existe", "d24776f54a44056b81759c279541eaa1": "IP não existe", "c377bd51882c2de13c05f3fd77364d1e": "Aberto com sucesso", "35011518f3d61995df94ae0f52ce71f2": "Falha ao abrir", "4bd6cd0bd1b02515d1f2a1ef87840fb6": "Fechado com sucesso", - "0eda49d395586a0e870e7da49c5bc640": "ERRO: arquivo de configuração sshd config não existe, não é possível continuar!", - "10ebe4455acdf740afe863011118db72": "falha na opção ssh", + "0eda49d395586a0e870e7da49c5bc640": "ERRO: arquivo de configuração sshd config não existe, não pode continuar!", + "10ebe4455acdf740afe863011118db72": "opção ssh falhou", "021210c97d1980259846f925154cd17f": "Método de criptografia errado", "d9a55194048476c17552e9355a257855": "Alarme de login cancelado com sucesso!", "cdc36eac77de70b19abc76387b634df4": "Este tipo de envio não é suportado", "57b2840409403678623872ce30eb14b6": "O canal de mensagem não está instalado.", - "a58320e783e827f26bcf2a246b8983b1": "Erro: o arquivo de configuração sshd_config não existe, não é possível continuar!", - "ba3811adeb131e9c127f72a3e07000a7": "Desativado com sucesso", - "109ff77e4cc09bb260a8603d0f56321b": "Erro de passagem de parâmetro!", + "a58320e783e827f26bcf2a246b8983b1": "Erro: arquivo de configuração sshd_config não existe, impossível continuar!", + "ba3811adeb131e9c127f72a3e07000a7": "Desativar com sucesso", + "109ff77e4cc09bb260a8603d0f56321b": "Erro na passagem de parâmetros!", "d2e5be778eb1cc374dbc6241f9a74aac": "Arquivo de chave não encontrado!", "4f20922485d59ff65db53473b17c0df9": "Conteúdo da pesquisa não pode estar vazio", - "7a428a0050c9d556e632a5f7175b24ed": "O sufixo não pode estar vazio; insira [ *.* ] para pesquisar todos os arquivos", + "7a428a0050c9d556e632a5f7175b24ed": "O sufixo não pode estar vazio; por favor insira [ *.* ] para pesquisar todos os arquivos", "cdd28535892f88791917e7ed77a8245c": "O diretório não pode estar vazio ou /", "e7582a886ed8861ac63d9b2a7d94b973": "O conteúdo a ser substituído não pode estar vazio", - "90d0982f5d024da53b21f69d3f0c8cbb": "O banco de dados NÃO existe!", - "b376175f0c97d2ab7c37e44ec3b3a1b9": "Mysql5.1 não suportado!", - "4ff3b49771b3e27d533b9f4757e8e405": "Sem logs", + "e3fa50f6413dbb7bfe7cb26e1acd3d98": "Por favor, faça login com a conta primeiro", + "121303c67f81a8ebda41de51c8afaf27": "Por favor, faça login na sua conta aaPanel no painel primeiro!", + "d5670370d84473122d8e4d5a3b27b4bf": "erro de parâmetro: num", + "6b1c16b7a785029c0a11de3ab31cb125": "Status de limpeza com sucesso", + "e06c1ddc33f674068e3ca201094145d1": "Ativar com sucesso", + "819b23804f66eddddfba39e7bdc53e68": "Falha na ativação", + "4f57c5dce8b638737a368af15409439f": "Falha na Ativação", + "fe94df1697f309269e00428cae6bd141": "Falha na Renovação", + "b2ac1158b825f44cb363648fa3ad60cb": "Renovação com sucesso", + "78d29c0fadebf704e471a63afd430250": "Falha na Aplicação", + "3649e869737aa87f263194ce7f88f19e": "Aplicação com sucesso", + "34c4dc380e690d2ff6ebb6aaed103401": "ERRO de Parâmetro product_id!", + "28731318aa493586f88894355a79cb48": "Falha ao conectar ao servidor!", + "4ff3b49771b3e27d533b9f4757e8e405": "Sem Logs", "e50f043316845a08a945f69e097f1a54": "Aberto com sucesso", "9bac3879208bc174db83cbf159528cc6": "Sem autenticação de senha", - "47615fee65c01faa2563c55350de8a80": "Autenticação de senha ativada com sucesso", + "47615fee65c01faa2563c55350de8a80": "Ligar autenticação de senha com sucesso", "679732c39dc813cb331ab3840f2409dd": "O sistema não é suportado", "6d981b7b2e975f5b7717b27abe1f8ad3": "Falha ao abrir", "03f4a47830f97377a35321051685071e": "Fechado", "3cab03c00dbd11bc3569afa0748013f0": "Inativo", "cb456215c3333db0551bd0788bc258c7": "Ativado", - "d07fa2f572b6d22996d25439da3f5d88": "Arquivo baixado com sucesso", - "db1cbd9059a4f043534a00142cdfffde": "falha no download", - "c614196ffa00bf43880f547acfab993b": "Painel não encontra o arquivo de backup: {}", - "8080ccf57df49ce6d4792cc5041be1b8": "Atualmente suporta apenas a restauração de backups locais, Google Storage e AWS S3", - "6f3446d8579a066540c5d7e68ff05f0b": "Restauração Bem-sucedida", + "d07fa2f572b6d22996d25439da3f5d88": "Baixar o arquivo com sucesso", + "db1cbd9059a4f043534a00142cdfffde": "download falhou", + "c614196ffa00bf43880f547acfab993b": "Painel não encontrou o arquivo de backup: {}", + "8080ccf57df49ce6d4792cc5041be1b8": "Atualmente suporta apenas restauração de backups locais, Google storage e AWS S3", + "6f3446d8579a066540c5d7e68ff05f0b": "Restauração Bem-Sucedida", "260ca9dd8a4577fc00b7bd5810298076": "sucesso", "1cbb155db1ca49d77f886c41b7850b48": "Erro de download!", - "5bf31cdecebf4cba00879d9088cc0a2d": "Por favor, instale primeiro o serviço Pure-FTPd na loja de software.", + "5bf31cdecebf4cba00879d9088cc0a2d": "Por favor, instale o serviço Pure-FTPd na loja de software primeiro.", "6fa956d3a9e880b4190bfc1de47faa90": "Nome de usuário é ilegal, caracteres especiais NÃO são permitidos!", "d684964cf02bdb37eb086fb2470c0135": "Nome de usuário é ilegal, não pode ter menos de 3 caracteres!", "a6825ba054814d831e71f83ac090740e": "Diretório crítico do sistema não pode ser usado como diretório FTP!", @@ -987,38 +990,38 @@ "d154a5ff03bd9ccd568018f5e51d00cb": "Ligar", "977bb0ee804c260d3a00b2b36e161c34": "Por favor, insira um número inteiro para a porta", "bdd5c4786695af78089e85f507e5643c": "Porta FTP", - "a3ccdafa1b1c0701991598cb4b2d9036": "Conta FTP não foi configurada", - "4a743f34ec3bb93a8ad7cb4d36a17308": "Conta FTP não foi configurada1", - "195822d3b030f5055e98e823153daa76": "Correspondência de várias configurações, esta operação foi interrompida!", + "a3ccdafa1b1c0701991598cb4b2d9036": "A conta FTP não foi configurada", + "4a743f34ec3bb93a8ad7cb4d36a17308": "A conta FTP não foi configurada1", + "195822d3b030f5055e98e823153daa76": "Correspondendo a múltiplas configurações, esta operação foi interrompida!", "e649cd842085301ff7921625076905fb": "O nome do banco de dados não pode ter mais de 16 caracteres!", - "a0813a2a76fdb183b1b15f92221b404a": "O nome de redirecionamento especificado já existe", + "a0813a2a76fdb183b1b15f92221b404a": "Nome de redirecionamento especificado já existe", "5b35ea4807e1b63678ff55b391d9b39d": "Por favor, selecione o domínio redirecionado", "a971e4ab85bfbda4fb6b1d57c1c8ed7d": "Por favor, insira o caminho redirecionado", - "5f74874b100d16e90aa999e06b3e222f": "O formato do caminho está incorreto, o formato é /xxx", - "d5ba0768cd61aa8e0cc9b9b2addc2d43": "O diretório de proxy não pode ter os seguintes símbolos especiais ?,=,[,],),(,*,&,^,%,$,#,@,!,~,`,{,},>,<,\\\\,", + "5f74874b100d16e90aa999e06b3e222f": "Formato de caminho incorreto, o formato é /xxx", + "d5ba0768cd61aa8e0cc9b9b2addc2d43": "O diretório do proxy não pode ter os seguintes símbolos especiais ?,=,[,],),(,*,&,^,%,$,#,@,!,~,`,{,},>,<,\\\\,", "f0f290884251850f0d9fa6afc91d39c1": "O nome de domínio {} é o mesmo que o nome de domínio de destino, desmarque-o", "ff1251600d8019bbf4280cafc534a39c": "{}, a URL de destino é a mesma que o caminho redirecionado", "664d009c794ec236879112599b14a697": "Por favor, selecione para onde você precisa redirecionar", "e63cd7427eff8a5cb737dfd1118f11ff": "O site não pode ser acessado, verifique se o site está funcionando corretamente", "2f0e4710a58107860d6332f0d0192ba9": "servidor web não instalado ou servidor web desconhecido", - "79ec80b46087125542314cc116850dd4": "Redirecionamento 404 definido com sucesso", + "79ec80b46087125542314cc116850dd4": "Redirecionamento 404 configurado com sucesso", "f1af189cd525a4d5180b8ccdc305a926": "%s
Por favor, entre no SSH e execute o comando: pip install mysql-python", - "ea8dca4dbb80a367725ec532356d4ad1": "ERRO ao conectar ao banco de dados, verifique o status do banco de dados!", - "da422f411f10ca19fbfc0c49d7b27279": "A senha de root ou do usuário Mysql está incorreta, tente redefinir!", - "99e3ce74a83862e58ec4ef7c7e141aae": "O usuário do banco de dados NÃO existe!", - "a6c2bafea90fd4f58496b7de0c879daa": "Falha na exclusão do banco de dados escravo, o diretório de dados não existe!", - "c5352c3364b49f09f07e517d6f5e2a93": "Falha na execução, tentou reparo automático, tente novamente mais tarde!", + "ea8dca4dbb80a367725ec532356d4ad1": "ERRO ao conectar banco de dados, verifique o status do banco de dados!", + "da422f411f10ca19fbfc0c49d7b27279": "Senha root ou usuário Mysql incorreta, tente redefinir!", + "99e3ce74a83862e58ec4ef7c7e141aae": "Usuário do banco de dados NÃO existe!", + "a6c2bafea90fd4f58496b7de0c879daa": "Falha na exclusão do banco de dados escravo, diretório de dados não existe!", + "c5352c3364b49f09f07e517d6f5e2a93": "Execução falhou, tentativa de reparo automático, tente novamente mais tarde!", "ced1ff377b05e3ba5ae9837ac8c05b80": "Banco de dados [{}] não existe!", - "c38111d1a26efef2f1d89b0dfbef1ee7": "Falha na conexão com o banco de dados [{}]", - "24a92be5bb3acba016a9274b9fb19c02": "Falha ao excluir, falha ao conectar ao banco de dados!", + "c38111d1a26efef2f1d89b0dfbef1ee7": "Falha na conexão do banco de dados [{}]", + "24a92be5bb3acba016a9274b9fb19c02": "Exclusão falhou, falha ao conectar ao banco de dados!", "d10533dec09d380264317010ec3e5af8": "Os dados do banco de dados não existem!", "db548c645b7e4e30814165cd703be4cc": "Falha ao mover dados do banco de dados para a lixeira!", "06e6d1c8954814a2b29d4b4372b81b59": "Banco de dados movido para a lixeira!", - "c54a0be87c240156a0403ba306527fa7": "A Lixeira não existe para este banco de dados!", + "c54a0be87c240156a0403ba306527fa7": "A lixeira não existe para este banco de dados!", "3709ae738cf2d6d0c179d816c02c66ae": "Existe um banco de dados com o mesmo nome no banco de dados atual. Para garantir a segurança dos dados, pare a recuperação!", "2fe4287f5ec52dd09118ba4d6a42747b": "Banco de dados recuperado!", "1381dce91057a208e5a3e202526fbf6e": "Falha na recuperação de dados!", - "0f6b8bb328918f160baf00077eb21846": "A senha de root não pode estar vazia", + "0f6b8bb328918f160baf00077eb21846": "A senha root não pode estar vazia", "e6271141086fae7863bfe1d5b6ac3e24": "A senha do banco de dados não pode conter caracteres especiais!", - "5ed48eedb205aa687178500c75228409": "Senha de root modificada com sucesso!", - "0c18dde1f9edfcff23eb2c2ec06673a2": "Não é possível alterar a senha de root do banco de dados remoto", + "5ed48eedb205aa687178500c75228409": "Senha root modificada com sucesso!", + "0c18dde1f9edfcff23eb2c2ec06673a2": "Não é possível alterar a senha root do banco de dados remoto", "5acf42ae8ac3a8558964691403e32ead": "Falha ao modificar, o usuário do banco de dados não existe!", - "10b75740108b26c220eb7e9bdfe18182": "Falha ao verificar o arquivo de configuração do banco de dados, verifique se o arquivo de configuração do MySQL existe [/etc/my.cnf]", + "10b75740108b26c220eb7e9bdfe18182": "Falha na verificação do arquivo de configuração do banco de dados, verifique se o arquivo de configuração MySQL existe [/etc/my.cnf]", "98925ed54b314b48c7584b73affb9556": "A senha do banco de dados não pode estar vazia", "4d15b1b40d88837aa34b5fd3c5cf1cce": "Tipo de banco de dados não suportado", - "39120f2e6a6a039741500e300f1dfe5f": "Falha no backup!", - "d30de818714c05511e9bcf3333bcc664": "ERRO_ENTRADA_BANCO_DE_DADOS", + "39120f2e6a6a039741500e300f1dfe5f": "Backup falhou!", + "d30de818714c05511e9bcf3333bcc664": "DATABASE_INPUT_ERR", "12c37754d1604dc1b9154eee1f460efe": "Sincronização bem-sucedida", - "85b08b086888f8ee2680ddd3398f3574": "Falha na sincronização", + "85b08b086888f8ee2680ddd3398f3574": "Sincronização falhou", "e9ca862378b02ba5fea97e3a6f9fdd5e": "Testar Banco de Dados", "5c846631ce72048c89ced433e4906107": "O endereço IP não pode estar vazio!", "712d5c60bf965a53ad98f51a18328fb3": "O comprimento do diretório de dados não pode exceder 32 bits", @@ -1070,12 +1073,12 @@ "cfcd208495d565ef66e7dff9f98764da": "0", "a030c44033df4fd3ed1e860220df8d65": "Por favor, desinstale o plugin de replicação mestre-escravo Mysql antes de fechar o log binário! !", "22875aa10a21e1f51ae93cd2ee20fa07": "innodb_log_buffer_size não pode ser inferior a 8MB", - "c7846dcb854a38c1e2e62793d648c0a7": "ERRO de senha do MySQL!", - "8435eeb739684eaee648c5ddb368543a": "Binlog não está ativado ou o arquivo binlog não existe!", - "b1dd73e742e604bdbb83829a41c6846a": "Status do Mysql está anormal!", - "c5c74be29ca306d24bddd4f6031d0220": "Parâmetros ausentes! dias", + "c7846dcb854a38c1e2e62793d648c0a7": "Senha MySQL ERRO!", + "8435eeb739684eaee648c5ddb368543a": "Binlog não está habilitado ou arquivo binlog não existe!", + "b1dd73e742e604bdbb83829a41c6846a": "Status do Mysql é anormal!", + "c5c74be29ca306d24bddd4f6031d0220": "Parâmetros estão faltando! dias", "8bfe471aeee92b5cfc257706f3667e80": "Para garantir a segurança dos dados, binlogs recentes não podem ser excluídos!", - "2e3b42799f015adb46c85d60b8b1d7bb": "Limpeza concluída!", + "2e3b42799f015adb46c85d60b8b1d7bb": "Limpeza completa!", "048b0b74236019df8c9f2c0e9470765f": "Falha ao obter bancos de dados", "34e30525f59e7e2202d51d1314c119aa": "Reparado com sucesso!", "9133beb60bf19699376626515071105e": "Falha ao reparar!", @@ -1084,84 +1087,83 @@ "b263d2d0b9a2fe2cb5ea3c37240e7fe7": "Alterado com sucesso", "d72873c28781d7d42a8a50e344a38c65": "Falha ao alterar", "5a513bca80ba9e849cd64e6df029b53a": "Não há token", - "beb887915b2334d0bcb0f23910ee03fa": "O cancelamento da inscrição do email {} foi bem-sucedido", - "ced5be071465948d917518318181e530": "Falha na operação, o token expira", - "ed0b8b7de7d6124343c2c12f29c84a2d": "Falha na operação, tokens inválidos", - "2759543b1abc5021bf03258b0032b6fb": "Não há email", + "beb887915b2334d0bcb0f23910ee03fa": "O cancelamento da inscrição do e-mail {} foi bem-sucedido", + "ced5be071465948d917518318181e530": "Operação falhou, O token expira", + "ed0b8b7de7d6124343c2c12f29c84a2d": "Operação falhou, Tokens inválidos", + "2759543b1abc5021bf03258b0032b6fb": "Não há e-mail", "238865a1f3c33fae77a59ce42a641346": "Por favor, preencha as informações completas", "9bd45853e9c7cca825b227f1472901c8": "O nome da nota não pode exceder 7 caracteres", "bdd1b7bb74543fb0fae1e75f372551d8": "Falha ao adicionar, verifique se a URL está correta", - "1cb8f68ece43505dde623d0e297426ac": "Notificação definida com sucesso", + "1cb8f68ece43505dde623d0e297426ac": "Notificação configurada com sucesso", "557738e2e8b82bbb847ab9ecc6d83c8a": "As informações do DingTalk estão configuradas incorretamente.", "3781473f4af411ebb3610977e7275a3d": "Erro de configuração do DingTalk, reconfigure o robô DingTalk.", "94418c3f275f6e8bca8e35751495f370": "As informações do Feishu não estão configuradas corretamente.", - "16ff838f760194a432da12e9bb4895d9": "Falha no envio, verifique se a configuração do remetente ou as informações do destinatário estão corretas.", - "203b93a974c7142ca4b203443af817d9": "As informações de email não estão configuradas corretamente.", - "8b42e24f005c452259add632215a77a8": "A complexidade da entrada de segurança não é suficiente
1, o comprimento não deve ser inferior a 9
2, combinação de inglês + números.", - "9ad1940cfc7c1786a62bb3d784420413": "operação bem-sucedida!", - "14e1e77b50aaf60272775c43894560ad": "As informações do telegram estão configuradas incorretamente.", + "16ff838f760194a432da12e9bb4895d9": "Envio falhou, verifique se a configuração do remetente ou as informações do receptor estão corretas.", + "203b93a974c7142ca4b203443af817d9": "As informações de e-mail não estão configuradas corretamente.", + "8b42e24f005c452259add632215a77a8": "A complexidade da entrada de segurança não é suficiente
1, o comprimento não deve ser inferior a 9
2, combinação de inglês + digital.", + "9ad1940cfc7c1786a62bb3d784420413": "operar com sucesso!", + "14e1e77b50aaf60272775c43894560ad": "As informações do telegrama estão configuradas incorretamente.", "39ddfbf65700efc9a7d16b22ebb867f3": "Erro de configuração do Telegram, reconfigure o robô.", "691e87b47c012051a2e82b3c87a829be": "envio completo, resultado do envio: Verdadeiro.", "c13967b1cbadeb9e2138223c0ed9fa0d": "envio completo, resultado do envio: Falso.", "ed702c2212ce3c1acf4b5435100b44c2": "As informações não estão configuradas corretamente.", "b1ffdb005a4c842221dd8267c47de40a": "As notificações foram desativadas, ative-as e tente novamente.", - "75983b18d2ecbb82d71afea42138a28b": "As informações de vínculo do usuário não foram obtidas", + "75983b18d2ecbb82d71afea42138a28b": "As informações de vinculação do usuário não foram obtidas", "f9d875367d71359c197b5fe0894cdfa8": "O link para a nuvem falhou, verifique a rede", "4ad85d46374d522bcd3bf2eff2cf2600": "Nenhuma informação de usuário foi obtida", "2f9fc94872130dd0fb976fc6b0b96514": "Falha na entrega da mensagem WeChat. --> {}", "0b27e119bbc4a725cbf863dfd52dc473": "fun_name indefinido", - "a969a46fc07219c039a985f8f7b61cf6": "parâmetros errados, nome de função indefinido", + "a969a46fc07219c039a985f8f7b61cf6": "parâmetros errados,nome func indefinido", "cbf8d9b9372ca5f52268a5dbbb6af5e9": "dns_id desconhecido", - "36150f18886cfdedefd8e0ce031ebaa6": "Falha na execução:{}", - "315e5172120e0508a5da1da63fe80903": "Falha na configuração!", + "36150f18886cfdedefd8e0ce031ebaa6": "Execução falhou:{}", + "315e5172120e0508a5da1da63fe80903": "Configuração falhou!", "d78db61be0fee99b043b646bcb10a1cd": "configuração bem-sucedida!", "22af6aacc48ecde709e357b7f689fa4a": "Por favor, selecione o nome de domínio que você deseja configurar!", "703f48fb3880275147fb6341a601d75a": "O DNS especificado não existe!", - "6afe3a685b340d46d1eb5e96f46d8b53": "falha na configuração!", + "6afe3a685b340d46d1eb5e96f46d8b53": "configuração falhou!", "25d70741ea5481da5457bc36f316f2cd": "A configuração foi bem-sucedida e {} registros foram atualizados!", "a0db66604e4493a5782f45097fcad859": "Este tipo já existe.", "ffbeb35495d2bfaaf4957cc8db9cd8e6": "adicionado com sucesso!", "e7d698b3874686530ce8eade7d46cd89": "exclusão bem-sucedida", - "5ccf1f7d5db89204eee4cfdcdb0944d4": "falha na exclusão", + "5ccf1f7d5db89204eee4cfdcdb0944d4": "exclusão falhou", "7c7d6bc523a6ba94346ef9419f4b93a6": "excluído com sucesso", "838d94727e13707491b9d9c9510ba453": "Sincronização bem-sucedida.", "33c678a30e066da93ac44a17629f3900": "dns_type indefinido", "ac612c51ba24c8559bd045e2c3706011": "O arquivo de módulo {} não existe.", "4c9eea0839e8a2516ca1d34407cf0305": "Falha ao definir o registro DNS:{}", - "7bc387e9ae161a403dac4ccfebbf012e": "Nenhuma informação de chave API DNS válida foi encontrada para o nome de domínio {}.", + "7bc387e9ae161a403dac4ccfebbf012e": "Nenhuma informação válida de chave de API DNS foi encontrada para o nome de domínio {}.", "e5a1f5bb9e10d065f27eac8d4e8c2e8d": "Falha ao excluir o registro DNS:{}", "7c89ed1def10408d3584152d2ad2eb33": "O nome de domínio já existe.", - "55ab92952e1b4dca79cda76843eebe99": "sucesso ao adicionar", - "584a4244515646b153102a8d302e8546": "O painel não está logado, portanto, o upload para a nuvem não é possível!", + "55ab92952e1b4dca79cda76843eebe99": "adição bem-sucedida", + "584a4244515646b153102a8d302e8546": "O painel não está logado, então o upload para a nuvem não é possível!", "347dae5469b16521e17a37cc2e3168ad": "Não há certificado especificado.", - "cf25e0eebbaec98c374104d843fb31fe": "A exclusão local foi bem-sucedida, ", - "6e1fa7be6a999db147fe218c1e5a85ca": "Falha ao conectar à nuvem. Não foi possível excluir dados da nuvem.", + "cf25e0eebbaec98c374104d843fb31fe": "Exclusão local foi bem-sucedida, ", + "6e1fa7be6a999db147fe218c1e5a85ca": "Falha ao conectar à nuvem. Impossível excluir dados da nuvem.", "efbfd7f8e586c8efafccb9260aec988e": "parâmetros errados", "1c9a090e06b2f4d3858bd2141b97133f": "Erro de operação:", "69d0b962baab44b9e0df62a51012996b": "O painel não está logado e o upload para a nuvem não é possível!", "3e5b88adc8b76d44032b4f54f2a4dc29": "Não há informações de certificado especificadas.", - "4fa5aad0ed4116fef4e615297106ca98": "Erro de leitura do arquivo de certificado", + "4fa5aad0ed4116fef4e615297106ca98": "Erro de leitura de arquivo de certificado", "e61a80b8cfc84266cc6da96a589f389e": "Falha ao conectar à nuvem", "3098a079086bc6216453ef84da5b9504": "sem parâmetros", "670a25b9478103f18df9dae288ea9680": "O certificado não existe!", - "ef703ece601c1e3204353eaba0cd7062": "tipo de parâmetro errado", + "ef703ece601c1e3204353eaba0cd7062": "tipo de parâmetros errados", "cad878a2802e3f05a8f0b94822b123ef": "Não há informações de certificado.", "c3c25b414fbc136ec923a6d770fceedf": "O certificado já existe.", "a93ac12141fcab1f5ddb502e738a4494": "Salvo com sucesso", - "9fe357faf3332a5040d055fc390945ad": "Informações do certificado não encontradas", + "9fe357faf3332a5040d055fc390945ad": "Informações de certificado não encontradas", "3ff7e4a7ba896ece34407eed8e2c6489": "O certificado não é emitido por Let", "44eb815db7510a33f531b5b062964bb6": "Criado com sucesso!", - "2e69adb0366a9a6daea00860367ac03c": "Falha na criação!", + "2e69adb0366a9a6daea00860367ac03c": "Criação falhou!", "378dfed31bb76afb115821875780c68f": "O painel não está logado, ", "c68d5b6b7aa83937b4d12f88fbd1b130": "Falha ao obter dados da nuvem", - "49b5863032401b0857eaeaa17c0cddad": "Informações do certificado não foram encontradas", + "49b5863032401b0857eaeaa17c0cddad": "Informações de certificado não foram encontradas", "2de69e10f0a8a2c7e640011e06eaf229": "Parâmetros obrigatórios estão faltando.", "6e28b57028810b7101ed93200348e6fd": "Nenhuma informação de certificado foi encontrada.", - "5ff082a692a93d7aff84fffe2515e9d9": "Sem log de erro", + "5ff082a692a93d7aff84fffe2515e9d9": "Nenhum log de erro", "5efde395239afdd2df0b9a32c159768f": "MySQL não está instalado!", - "dacf49abac88060f508283464e6488b3": "O arquivo de log não existe!", + "dacf49abac88060f508283464e6488b3": "Arquivo de log não existe!", "cc04dd5405df97665d385bf9f945a1a5": "[{}] Falha ao obter o caminho do site, verifique se o IIS existe neste site, se não existir, exclua este site no painel após a criação.", - "5043b4dd5ee84b81c695150ce7b71a1d": "Por favor, não use portas padrão para programas comuns!", "6bfd22d9b1190dd6f3252ffc5f07843c": "Instalação bem-sucedida", "9ce49cccc03f08a6f144e6b2951065ca": "instalação falhou", "6ec9c7ee4154392f5dcc682fc786e84b": "comando de controle desconhecido!", @@ -1171,41 +1173,42 @@ "d27cddcec5e0f66a566fbcdceb5dfef6": "Excluído com sucesso!", "271bac9db0d6fb9f971271a8f37ca6c5": "Por favor, instale o módulo dnspython primeiro: btpip install dnspython", "4fe093af429d1f1fc2198447a1025931": "Erro de parâmetro", - "03460a8fbae274ee5f04e0ba1fa34812": "Os recursos atuais são exclusivos da versão profissional", + "03460a8fbae274ee5f04e0ba1fa34812": "Recursos atuais são exclusivos da versão profissional", "7f17f95382055aefa5d3e915c72a98d4": "Por favor, insira o nome de domínio", "35c9657c6576e84644303a7ad43318f5": "O nome de domínio é resolvido para um endereço IPv6 e regras de porta não são suportadas.", - "49f648bea338734c76f49de41c91aebe": "Resolução do nome de domínio {} adicionada com sucesso", - "2edad93b0f08e091c3cc25470e8ddf6f": "A resolução do nome de domínio não foi resolvida ou a resolução não entrou em vigor. Se tiver sido resolvida, tente novamente após 10 minutos.", - "7a3359de6c4391fe9a15eb0425846fd8": "O nome de domínio {} já existe", + "49f648bea338734c76f49de41c91aebe": "Resolução de nome de domínio {} adicionada com sucesso", + "2edad93b0f08e091c3cc25470e8ddf6f": "A resolução de nome de domínio não foi resolvida ou a resolução não entrou em vigor. Se foi resolvida, tente novamente após 10 minutos.", + "7a3359de6c4391fe9a15eb0425846fd8": "Nome de domínio {} já existe", "4fb42cb76f14ea60b67f9bceb6c4a49e": "Todas as regras de IP foram removidas.", "0b3157eba7dd3451bc0de1c6ca480ec2": "Operação bem-sucedida", - "932c825a6aee54ff754f33c628cd90bc": "Esta porta já existe, por favor não adicione novamente!", + "932c825a6aee54ff754f33c628cd90bc": "Esta porta já existe, por favor, não adicione novamente!", "c49175dd1fdb203713f6c1476a7f91b3": "Comando de controle desconhecido!", - "2faec1f9f8cc7f8f40d521c4dd574f49": "Habilitar", - "8d66632de28752245beaa40b1ccc1cbf": "Desativar encaminhamento de porta", + "2faec1f9f8cc7f8f40d521c4dd574f49": "Ativar", + "8d66632de28752245beaa40b1ccc1cbf": "Desligar encaminhamento de porta", "2d5f7bdbdb53fff3cd55702cbdbfa8bd": "Por favor, insira o nome do país!", "f8bacfec9ade03b0f3584356b898fca8": "Falha ao adicionar", - "eac00ab48eb660db9a0929e6f036ecf2": "Esta área já foi adicionada, por favor não adicione novamente!", + "eac00ab48eb660db9a0929e6f036ecf2": "Esta área já foi adicionada, por favor, não adicione novamente!", "805139d226669cfd0320c760cb10e87c": "Por favor, insira o nome da área correto!", - "969a6c87a281f49bd8fc2c1e43f66ec4": "falha na operação", - "0683e26aace0f0c175199272031ce3e6": "A porta não pode estar vazia!", - "8e7387f80c2d22c7515b38afef01b9c2": "Erro de passagem de parâmetro, por favor passe o campo de porta", - "926dba790adb1d53c53941a06ccb2da7": "A porta não pode estar vazia", - "705c5fd65ddbcaea039c3aa2f5e135ee": "Intervalo de portas não suportado", - "84cd1055b1130ac448baec04de07d986": "A porta deve ser numérica", + "969a6c87a281f49bd8fc2c1e43f66ec4": "operação falhou", + "0683e26aace0f0c175199272031ce3e6": "Porta não pode estar vazia!", + "8e7387f80c2d22c7515b38afef01b9c2": "Erro de passagem de parâmetro, por favor passe o campo porta", + "926dba790adb1d53c53941a06ccb2da7": "Porta não pode estar vazia", + "705c5fd65ddbcaea039c3aa2f5e135ee": "Portas de intervalo não suportadas", + "84cd1055b1130ac448baec04de07d986": "Porta deve ser numérica", "7d134add7af4d8e6fdf31cde8332da30": "O intervalo de portas é 1-65535", - "f11c2e32a42274ed9160658e259b2e58": "Falha ao ignorar regra,{}!", - "8c7cabcdcfe7a6ed8b0e27b04ad408e6": "Regras ignoradas com sucesso!", - "f5800cf5bc9b3d8aee2ea9222951ac93": "Ignorar regra cancelado com sucesso!", - "85056ee18e1ac6fefa9f955da5a155e0": "O plugin fail2ban não está instalado", + "f11c2e32a42274ed9160658e259b2e58": "Ignorar regra falhou,{}!", + "8c7cabcdcfe7a6ed8b0e27b04ad408e6": "Ignorar regras com sucesso!", + "f5800cf5bc9b3d8aee2ea9222951ac93": "Regra de ignorar cancelada com sucesso!", + "85056ee18e1ac6fefa9f955da5a155e0": "Plugin fail2ban não está instalado", "dfda9d0c9d44e155e4125ebccfcbea99": "Desbloqueado com sucesso", - "6ed05063a343a4a8c2fb6bb191f57644": "Status normal, pular.", - "29833bee6957ec87ae7e9f81346a0929": "Serviço não instalado, pular.", - "f99d5d784d98d4e59b100ffb596fbc9a": "Enviado uma vez ao dia, pular.", - "2e11d603b68f16cce28a92f1fee630d4": "Versão profissional permanente, pular.", - "887755b06aa757db733fcdb5c4b90d8e": "Limite não atingido, pular.", - "944ec5555dd02ca9855e2aad5f31ecc3": "Certificado expirado não encontrado, pular.", - "d7316ce06449be2b2961a61bc8b90044": "O intervalo não foi atingido, pular.", + "5043b4dd5ee84b81c695150ce7b71a1d": "Por favor, não use portas padrão para programas comuns!", + "6ed05063a343a4a8c2fb6bb191f57644": "Status normal, pulando.", + "29833bee6957ec87ae7e9f81346a0929": "Serviço não instalado, pulando.", + "f99d5d784d98d4e59b100ffb596fbc9a": "Enviar uma vez por dia, pulando.", + "2e11d603b68f16cce28a92f1fee630d4": "Pro Vitalício, pulando.", + "887755b06aa757db733fcdb5c4b90d8e": "Limite não atingido, pulando.", + "944ec5555dd02ca9855e2aad5f31ecc3": "Certificado expirado não encontrado, pulando.", + "d7316ce06449be2b2961a61bc8b90044": "O intervalo não foi atingido, pulando.", "b388dbfa7884f3af33ba7551726ec631": "O alarme de login do painel suporta apenas um modo de alarme.", "bc5339f81ff38e283bb920dfb33ca914": "Não suporta suspender o alarme de login do painel, se precisar suspender, exclua-o diretamente.", "b5db9d7f14a728ef1b07894e6c776f4b": "O alarme de login SSH suporta apenas um modo de alarme.", @@ -1223,159 +1226,224 @@ "8f17aebb2889752cf3c60ac571167c8b": "Nenhum diretório de proteção especificado", "100f712f58657782dda9a5bc070e0248": "O parâmetro está incorreto", "b0186e5e273a163a78c04376a5756b1e": "O diretório especificado não existe", - "2226683c8d89df274e2ded7e04fc4a82": "Você não pode usar o diretório crítico do sistema como o diretório de backup padrão", + "2226683c8d89df274e2ded7e04fc4a82": "Você não pode usar o diretório crítico do sistema como diretório de backup padrão", "e69cc1102c087a819764e93d50ab3ef0": "O site especificado não pôde ser encontrado.", "a584585f2e3445e4d2d93865bb0c7952": "O banco de dados especificado não pôde ser encontrado.", - "fdf95ff2f0a3298c8a83aad5255780e5": "Banco de dados [", - "35936286a74058c49c309b2a7b6bcc27": "O nome de usuário do banco de dados é inválido!", - "e2d70330883c9001c29e0225b6c99e9c": "O nome do banco de dados é inválido!", - "68519350e49a18c7380764a80dd6daa9": "Erro de passagem de parâmetro, parâmetro ausente {}!", - "152b651d5c0151cc3864d20d187d77fe": "Passou!", - "bea367683a2238e537e3833d0b15622e": "O servidor especificado já existe: [{}:{}]", - "0b5f04d53d3af37f88b9b46b568d1dee": "Falha ao adicionar: {}", - "0667c3c8ef82f94545b286b69ef83030": "Erro de parâmetro passado, tente novamente!", - "4621e9c9b573b1bc868d310934d04cac": "O servidor remoto especificado não existe!", - "81eef63c48701d6d256ad3e7789bd8f6": "Excluído com sucesso: {}", - "c1f0a2e54f38603c731c9625f35aaa11": "Modificado com sucesso!", - "072b1fb2c5c32e99fea89190987f1511": "Falha ao editar: {}", - "0267067a2f76a814e9f2c9c111fa6a2e": "Componente MySQLdb está faltando!", - "b1b74781e4481f083f18ad6719a6b583": "ERRO ao conectar banco de dados", - "94bce4b2a745d07c681c29af6824d435": "Tempo limite de conexão com o banco de dados esgotado, verifique se a configuração está correta.", - "34fbe37d35b2a1bc1a58bdcc559be395": "Erro de senha do MySQL.", - "3d28138b07e32fc589d1a654980b1c28": "Excedeu o número máximo de conexões, tente novamente mais tarde.", - "f5f1c56c404d98779a4fbe5630f7d778": "Falha na conexão com o banco de dados, verifique se o usuário root está autorizado a acessar 127.0.0.1.", - "a9905dc3078535a661eb1aeb06f5a6da": "A senha do banco de dados está incorreta!", - "b99ad6bb4ca9c32cc31655c1f26ad347": "A conexão expira, ative manualmente a função TCP/IP (Menu Iniciar->SQL 2005->Ferramentas de Configuração->Configuração de Rede 2005->TCP/IP->Ativar)", - "734539622328115b6a79770792621598": "O banco de dados especificado já existe, por favor, não adicione repetidamente.", - "d0f9cbbc082071764bd58cb868dc86d8": "A operação falhou, o banco de dados remoto não suporta a operação.", - "2ff54c9774281fd464a75fac44b2bbee": "Permissões insuficientes, por favor use o usuário root.", - "d4e4cbdf86adbbf8338c46fa850b0d97": "Falha na criação, o SQL Server requer suporte a GUI", - "0e50ad3c23c4eb42db81e7ea3da4848e": "Erro de passagem de parâmetro.", - "9c367cb765f842bfe6a0465674b8d311": "A operação foi bem-sucedida.", - "7a48d7e0ce17e4a5ad1dadbfa199e464": "Restauração Bem-sucedida.", - "e9bc861d80a7d42ec15bcdb7e5529cda": "Falha na restauração.", "011f5bc126ef873c518707207467b8bf": "O serviço Mongodb ainda não foi iniciado!", "22ccd99629b3c3d5a8533884821f4189": "A senha do banco de dados não pode estar vazia ou ter caracteres especiais!", - "c976dec7ee3b051c53f9761bd9aa73c2": "A senha do banco de dados não pode conter caracteres chineses, por favor altere o nome!", + "c976dec7ee3b051c53f9761bd9aa73c2": "A senha do banco de dados não pode ser chinesa, por favor mude o nome!", "282a7d2dabc5b37dfe75dc697dbbacae": "O tipo de banco de dados sid precisa ser do tipo int!", "e1fa0193b4a126d332026f2c608681c9": "O nome do banco de dados não pode estar vazio!", "5c58f12f149b01b546d97b25b95c0df3": "O banco de dados especificado não existe.", "89f2b141f7790003d85cee94389a5899": "O caminho de importação não", "579cd57c80fb53784de0bd606c14891e": "Apenas arquivos compactados podem ser importados!", - "c3522356d75eaa63da51f2c2f6c9bd84": "Falta de ferramentas de backup, instale o MongoDB através da [Loja de Aplicativos] primeiro!", + "c3522356d75eaa63da51f2c2f6c9bd84": "Falta de ferramentas de backup, instale o MongoDB através da [Loja de APP] primeiro!", "4143861cb7ed8d905267a8ea56ad5935": "O formato do arquivo está incorreto!", - "2e36f9ef630e2714cd71fe91d4e8bf15": "A autenticação de senha foi ativada. A senha não pode estar vazia quando o banco de dados é copiado. Por favor, defina uma senha e tente novamente!", - "d28fa16e1236163fbc5787469193f18f": "Falha no backup do banco de dados, o arquivo não existe", + "2e36f9ef630e2714cd71fe91d4e8bf15": "A autenticação de senha foi ativada. A senha não pode estar vazia quando o banco de dados é copiado. Defina uma senha e tente novamente!", + "d28fa16e1236163fbc5787469193f18f": "Falha no backup do banco de dados, arquivo não existe", "04aa3a99d1550de2a89aa408790e0234": "Falha no backup,{}.", "2a389cf13e591eb8202af139c82a762c": "O backup foi executado com sucesso, o arquivo de backup é menor que 1b, verifique a integridade do backup.", "37ef1150b54080db22f4de766c00a902": "O tipo de banco de dados sid precisa ser do tipo int!!", "bb372e9b5c377f89809981e38570e41b": "O serviço Mongodb ainda não foi iniciado!!", "1a80d7a1efd89c63a3f8f33bd9b07397": "O tipo de banco de dados SID requer um INT!", - "e36f515323b0caa721c681b2d378a695": "O serviço Mongodb não está ativado!", - "c254f52cdaeb7f1a88c6bdd3e3e3c3f8": "Falha ao modificar,O banco de dados[", + "e36f515323b0caa721c681b2d378a695": "O serviço Mongodb não está habilitado!", + "c254f52cdaeb7f1a88c6bdd3e3e3c3f8": "Falha na modificação,O banco de dados[", "d9533af3481500e4eab2d71bc0d80f50": "A senha do banco de dados não pode estar vazia ou conter caracteres especiais", "5e2ab00d16dbc00c7fc25cbade8fab26": "A modificação falhou porque o banco de dados especificado não existe.", - "e3d61b8e9ff54176be78612b4de00321": "O acesso por senha não está ativado para o banco de dados.", + "e3d61b8e9ff54176be78612b4de00321": "O acesso por senha não está habilitado para o banco de dados.", "b949f2f31ecdc2714448b254511fb797": "O nome do banco de dados não pode conter caracteres especiais", "42ea48e57900c1ca39c38b7740b156e5": "O banco de dados não existe!", "ff14e82e3d1041c3fe4986830981065d": "A senha do banco de dados está vazia. Defina a senha primeiro.", - "2de872b07fddc8df9c2085fa214e780b": "Falta de ferramentas de backup, por favor instale primeiro o gerenciador PGSQL através da loja de software!", + "2de872b07fddc8df9c2085fa214e780b": "Falta de ferramentas de backup, instale o gerenciador PGSQL através da loja de software primeiro!", "200e48e96725c9ce425d7dbf388cbb8e": "O tamanho do arquivo de backup é menor que 2Kb. Verifique a integridade do backup.", - "894f4e4dbeef39cd673987e501f8c2ab": "Selecione o arquivo sql、gz、zip!", - "f5905bb1f1098b37b11d1e1787296924": "Falta de ferramenta de recuperação, use o gerenciamento de software para instalar PGSQL!", + "894f4e4dbeef39cd673987e501f8c2ab": "Selecione arquivo sql、gz、zip!", + "f5905bb1f1098b37b11d1e1787296924": "Falta de ferramenta de recuperação, use o gerenciamento de software para instalar o PGSQL!", "ba32600a98bc2e63a7609dfd18f7a764": "A senha do banco de dados não pode estar vazia.", - "e7381be5e7f44708306bc9816f83481c": "Falha ao modificar,O banco de dados especificado não existe.", - "7d354324037030e692b06b94f9d024c7": "Se o PgSQL não estiver instalado ou iniciado, instale ou inicie-o primeiro", + "e7381be5e7f44708306bc9816f83481c": "Falha na modificação,O banco de dados especificado não existe.", + "7d354324037030e692b06b94f9d024c7": "Se o PgSQL não estiver instalado ou iniciado, instale ou inicie primeiro", "a877289c330ccbad75d3674c560e89d3": "A senha não deve ter menos de 8 dígitos.", - "da3304c09f836a15a0c1ef43d28ce833": "O arquivo {} não existe, verifique se a instalação está completa!", + "da3304c09f836a15a0c1ef43d28ce833": "{}Arquivo não existe, verifique se a instalação está completa!", "e6d4787574cefef9b9dd6b3ab549bf68": "A senha do administrador foi alterada com sucesso. Procedimento.", - "b67d85c71006c071b58767216be65eb2": "A conexão com o PGSQL remoto falhou. Execute as seguintes operações para corrigir a falha:
1、A porta do banco de dados está correta e o firewall permite o acesso
2、Verifique se a senha da conta do banco de dados está correta
3、pg_hba.conf: Se foi adicionado um registro de liberação de cliente
4、postgresql.conf: Adicione listen_addresses ao endereço IP do servidor correto.", + "b67d85c71006c071b58767216be65eb2": "A conexão ao PGSQL remoto falhou. Realize as seguintes operações para corrigir a falha:
1、A porta do banco de dados está correta e o firewall permite acesso
2、Verifique se a senha da conta do banco de dados está correta
3、pg_hba.confSe deve adicionar um registro de liberação de cliente
4、postgresql.conf Adicione listen_addresses ao endereço IP correto do servidor.", "0fbbe53688d144223b78036507d85b47": "Bancos de dados SQLServer não podem começar com números!", - "27cfc7c44317601d8cbdc241c928d17c": "A política de complexidade de senha do SQLServer não corresponde, deve ter 8-128 caracteres e conter quaisquer 3 deles: maiúsculas, minúsculas, dígitos, símbolos especiais!", + "27cfc7c44317601d8cbdc241c928d17c": "A política de complexidade de senha do SQLServer não corresponde, deve ter de 8 a 128 caracteres e conter 3 deles em maiúsculas, minúsculas, dígitos, símbolos especiais!", "f06bab2dcffc83aa9e8e3be555a9e56f": "Operação falhou. O banco de dados remoto não pode ser copiado.", "20fe68f46608aefa2c884b9390aa4cd2": "A importação falhou porque o arquivo não é um arquivo ZIP válido.", "a52ecc2f72eafcf3453f9a50ffb7d0aa": "A senha do banco de dados [", - "df4ac7366fa4fda98e94ea68f0e40d3c": "O SQL Server não está instalado ou iniciado. Instale ou inicie-o primeiro", - "935e0f201a754f406575ec14bde54a21": "A senha do sa não pode estar vazia ou ter símbolos especiais", - "896543f6d67a62d4c594b28eeee3c923": "A senha do sa foi alterada com sucesso.", + "df4ac7366fa4fda98e94ea68f0e40d3c": "O SQL Server não está instalado ou iniciado. Instale ou inicie primeiro", + "935e0f201a754f406575ec14bde54a21": "saA senha não pode estar vazia ou ter símbolos especiais", + "896543f6d67a62d4c594b28eeee3c923": "A senha de sa foi alterada com sucesso.", + "fdf95ff2f0a3298c8a83aad5255780e5": "Banco de dados [", + "35936286a74058c49c309b2a7b6bcc27": "O nome de usuário do banco de dados é inválido!", + "e2d70330883c9001c29e0225b6c99e9c": "O nome do banco de dados é inválido!", + "68519350e49a18c7380764a80dd6daa9": "Erro na passagem de parâmetros, faltando parâmetro {}!", + "152b651d5c0151cc3864d20d187d77fe": "Passou!", + "bea367683a2238e537e3833d0b15622e": "O servidor especificado já existe: [{}:{}]", + "0b5f04d53d3af37f88b9b46b568d1dee": "Falha ao adicionar: {}", + "0667c3c8ef82f94545b286b69ef83030": "Erro na passagem de parâmetros, tente novamente!", + "4621e9c9b573b1bc868d310934d04cac": "O servidor remoto especificado não existe!", + "81eef63c48701d6d256ad3e7789bd8f6": "Excluído com sucesso: {}", + "c1f0a2e54f38603c731c9625f35aaa11": "Modificado com sucesso!", + "072b1fb2c5c32e99fea89190987f1511": "Falha ao editar: {}", + "0267067a2f76a814e9f2c9c111fa6a2e": "Componente MySQLdb ausente!", + "b1b74781e4481f083f18ad6719a6b583": "ERRO ao conectar banco de dados", + "94bce4b2a745d07c681c29af6824d435": "Tempo limite de conexão ao banco de dados, verifique se a configuração está correta.", + "34fbe37d35b2a1bc1a58bdcc559be395": "Erro de senha do MySQL.", + "3d28138b07e32fc589d1a654980b1c28": "Número máximo de conexões excedido, tente novamente mais tarde.", + "f5f1c56c404d98779a4fbe5630f7d778": "Falha na conexão ao banco de dados, verifique se o usuário root está autorizado a acessar 127.0.0.1.", + "a9905dc3078535a661eb1aeb06f5a6da": "A senha do banco de dados está incorreta!", + "b99ad6bb4ca9c32cc31655c1f26ad347": "A conexão expirou, ative manualmente a função TCP/IP (Menu Iniciar->SQL 2005->Ferramentas de Configuração->Configuração de Rede 2005->TCP/IP->Ativar)", + "734539622328115b6a79770792621598": "O banco de dados especificado já existe, não adicione repetidamente.", + "d0f9cbbc082071764bd58cb868dc86d8": "A operação falhou, o banco de dados remoto não suporta a operação.", + "2ff54c9774281fd464a75fac44b2bbee": "Permissões insuficientes, use o usuário root.", + "d4e4cbdf86adbbf8338c46fa850b0d97": "Falha ao criar, SQL Server requer suporte GUI", + "0e50ad3c23c4eb42db81e7ea3da4848e": "Erro na passagem de parâmetros.", + "9c367cb765f842bfe6a0465674b8d311": "A operação foi bem-sucedida.", + "7a48d7e0ce17e4a5ad1dadbfa199e464": "Restauração Bem-sucedida.", + "e9bc861d80a7d42ec15bcdb7e5529cda": "Falha na restauração.", "bb0b766f654bd8338d9dabb8c57378ff": "Falha na criação do banco de dados. Verifique o status de execução do mysql e tente novamente.", - "439d4d68575132c1a273fc36bbf6f72c": "Não foram encontradas informações do site com id {}", - "bff0e83714a9073c270776c37cc64791": "Erro de parâmetro", + "439d4d68575132c1a273fc36bbf6f72c": "Nenhuma informação do site encontrada com id {}", + "bff0e83714a9073c270776c37cc64791": "erro de parâmetro", "5766c6d37d04fdab31ce8622fcf6fab6": "Por favor, inicie o firewall antes de importar regras!", "277467377ce35c4535ce0c9e36f4978f": "Nenhuma regra pode ser exportada", "686160d344e24c2dbcac934048f03baf": "O arquivo não pode estar vazio", - "d9523e347c0a2971241d3ac4120a2854": "Arquivo não existe", - "cf36e08b3ff2cfd7bb952c062cc79f49": "Conteúdo do arquivo anormal ou formato incorreto", + "d9523e347c0a2971241d3ac4120a2854": "arquivo não existe", + "cf36e08b3ff2cfd7bb952c062cc79f49": "Conteúdo do arquivo anormal ou erro de formato", "b6d16a8173dd0d43f580bc6882dc5e9a": "Importação bem-sucedida", - "67abf11af36ac64a147218d125e8418f": "Formato de endereço de destino incorreto", + "67abf11af36ac64a147218d125e8418f": "Erro no formato do endereço de destino", "d11dfae04c7fd00b48b744926f7e733b": "A configuração foi bem-sucedida, a seguinte regra falhou :{}", "434f027ff1a807413707c94a43c9a578": "Por favor, inicie o firewall antes de definir regras!", "7b6454aa962895f5d5147d035f91a0e2": "A porta de destino não pode estar vazia", - "9c6da8c31a9a2d7a04756b09f01696e7": "A porta {} já existe, por favor não adicione novamente", - "229ce80f45424e882fdc5274cf37f295": "Formato de endereço IP especificado incorreto", + "9c6da8c31a9a2d7a04756b09f01696e7": "A porta {} já existe, não adicione repetidamente", + "229ce80f45424e882fdc5274cf37f295": "Erro no formato do endereço IP especificado", "444bcb3a3fcf8389296c49467f27e1d6": "ok", "6e68a14dc03d5bc90eea5ca623dd61c8": "Por favor, passe old_data", "fd643caf7884ce64697fb2a670cc3304": "Por favor, passe new_data", - "4f87808ff2ae8fa99b12357b7837bc78": "O formato do endereço IP especificado modificado está incorreto", - "69be671786f62ce872f87de1ab761746": "Modificado com sucesso", + "4f87808ff2ae8fa99b12357b7837bc78": "Erro no formato do endereço IP especificado após modificação", + "69be671786f62ce872f87de1ab761746": "Modificação bem-sucedida", "99404700c0746498a22a6ac82f3a78ba": "Nome de domínio: 【{}】 falha na resolução", - "91166df490bd1ced7a0aac6daebc96ca": "O nome de domínio de destino não pode estar vazio", - "af9a54527ffd3f962a61e34911f918dc": "Formato do nome de domínio de destino incorreto", - "7f9c4436cdf25844dcd0cd46b62c2916": "Por favor, passe id", - "905d5834754a81bea63ea590793346bc": "O endereço de destino {} já existe, por favor não adicione novamente", - "315208d3066fd1615ba13b698c0af371": "O IP de destino não pode estar vazio", - "5bd31a01422acec34ec752e0a46f9415": "Não é possível adicionar seu próprio IP", + "91166df490bd1ced7a0aac6daebc96ca": "O domínio de destino não pode estar vazio", + "af9a54527ffd3f962a61e34911f918dc": "Erro no formato do domínio de destino", + "7f9c4436cdf25844dcd0cd46b62c2916": "Por favor, passe o id", + "905d5834754a81bea63ea590793346bc": "O endereço de destino {} já existe, não adicione repetidamente", + "315208d3066fd1615ba13b698c0af371": "O ip de destino não pode estar vazio", + "5bd31a01422acec34ec752e0a46f9415": "Não pode adicionar seu próprio ip", "ba797e05926242a5135289c98dcd9d36": "A porta de origem não pode estar vazia", "3ec1da1913c04a2c53dd6d6379f99d4c": "O endereço de destino não pode estar vazio", - "efef8b005464719937a7daa96ed5b3d8": "A regra de encaminhamento de porta já existe, por favor não adicione novamente", - "4943a6954b9887aa5989713fcbb2a0d1": "ERRO: Não foi possível conectar ao servidor {}, verifique se a configuração [AK/SK/Storage] está correta!", - "da10c98ffbf34b30edec9cf47d998a68": "Solicitação bem-sucedida!", - "24380483226504475d196fdcff7a6c77": "Falha ao conectar ao servidor! -1", - "353d91a7655b3ef5e024d07eef1888ab": "Falha ao conectar ao servidor! -2", - "75809e3b321efe1afbdf9773494d5dd9": "Não encontrou o arquivo de configuração {}, tente fechar as configurações da porta SSL antes de abrir", - "7d7014331b485392e1d6055aad5c26cd": "Não encontrou o arquivo de configuração SSL do nginx phpmyadmin, tente fechar as configurações da porta SSL antes de abrir", - "35e15c0be5bb51b628d96c9a520c9b01": "A porta [{}] está em uso!", - "f471efd0f135fbddafdce4ad1febf5bb": "O servidor web atual é openlitespeed. ", - "4a32aac45fa22d0c693a646d5e265bf1": "O certificado do painel não existe. ", - "c6b59c5c3d29862a6dc85e9375094c83": "O servidor web atual é local e de acesso privado.", - "056197513cf8b469874e09b037fa5aaf": "O servidor web atual não é suportado.", - "7ec0387d04c7d7c8259b497464fa3282": "phpMyAdmin já {}!", - "4790f238a5706fa03ed78c98efabd5f2": "Vínculo é válido!", - "c6fdc537935f8c3e97a442e8be9adf20": "Existe um arquivo com o mesmo nome que a pasta enviada. Verifique e tente novamente", - "055df73dfeac55aa4ddb8b31e98d3fea": "O usuário atual não tem permissões suficientes para acessar ou modificar {}", - "3ff13f637b9e318936f8d30f77c57c64": "O diretório atual é somente leitura", - "8c7dd0d2966be0d1427bb839c94a993a": "Falha no upload:{}", - "fc937a95d443a5accb3dc43dabf8a4c0": "Espaço em disco insuficiente", - "dc494cbbc1dad9fe8a2d219d561840d5": "Ocorreu um erro ao enviar o arquivo, exclua o arquivo temporário 【{}】 e tente novamente", - "45cd3dad5e3ac153966eff8aaf30c33d": "Existe uma pasta com o mesmo nome do arquivo enviado, verifique e tente novamente", - "eaf87474bf8e355eb84fadd0caf91f14": "O usuário atual não tem permissões suficientes para acessar ou modificar", - "fe56b3a6f3a8b6a24f60a62408351b0e": "Este é o diretório da Lixeira, pressione o botão [Lixeira] no canto superior direito para abrir", - "8ec1fba8a89cb67bc958d7b2424156e9": "Arquivo movido para a lixeira", - "99a091a444e6e207f60506fb4f0bdcce": "Arquivo excluído com sucesso", - "5873103908815f34241636e336e1f463": "A tarefa de compactação foi adicionada à fila de mensagens!", - "e57b7bae408dd226fabe86773cd6b3c3": "Operação em lote bem-sucedida [{}], falha [{}]", - "c28802f8d7f5a40cb9f17cace202e59f": "Erro de consulta, {}", - "11c99562b6212de14ddf1dcb06ea1696": "Nenhuma tarefa na FILA {}", - "94f33212bde1cd76797fe4fe78b2167f": "Atualizar composer de {} para {}", + "efef8b005464719937a7daa96ed5b3d8": "A regra de encaminhamento de porta já existe, não adicione repetidamente", + "62dc2bbb0528fe87522c74b113883a48": "O site especificado não existe!", + "89ae4391631ed393c6c0ac36a2a0810a": "Existem arquivos restritos no diretório Cache. Tente limpá-los do LiteSpeed Cache", + "825d333e554f58230379a1cbc8372480": "Falha na limpeza de cache. Verifique se o plugin Nginx Helper está funcionando corretamente.", + "4675bfcf662ee236a05dcb763cf9d520": "A configuração de cache Apache falhou. Verifique se o site está funcionando corretamente!", + "0b9aca52d360d6f7a8f2c5c897c93005": "As configurações de cache Apache foram bem-sucedidas!", + "a2cd28fcd32e92be995b2335768fdea3": "Cache Apache é suportado atualmente apenas em Hospedagem Multi-Servidor Web", + "b288b8637582cc38c1d4c902ed03cbec": "A instalação do plugin de cache falhou", + "aebabb72ad41fbe46f73abcc9dc00b9f": "O plugin de cache falhou ao ativar. Tente ativá-lo manualmente e então habilite o cache", + "3981bd44ca3f1d5abafc6b15ba8c7435": "As configurações de cache OLS foram bem-sucedidas!", + "3777f748e5535e7e38261b2e0afc8274": "Configuração de cache OLS falhou: {}", + "93916600bce5b19586cbf51d558b5d78": "Por favor, verifique se o formato [{}] está correto Exemplo: {}", + "8e342838d5cf3a93e34956c9550db4d0": "Falha na implantação: {}", + "e783e39c78ccc8fa455396f454b86c79": "Falha ao obter as informações de configuração do WP Toolkit", + "ef63d93aec22bed16012080faa44b635": "Falha ao salvar configuração: {}", + "9bb70ddd7b082fbaafb0b47a989b5cf5": "Falha ao obter fuso horário!", + "38f40438a6c7e12eca9b4ea2ad297b3e": "Definido no topo com sucesso!", + "257ee5f5c18f04e3a83fd18b33babf08": "Por favor, insira o ID para desafixar!", + "c6afe11bc7f565bb0a423883101ce67f": "Consulta falhou: ", + "45b3768a0b9da76f12937e20e17ff8c9": "{} Executar uma vez", + "403470819fb903a95a8fd9a22b01a3ee": "CRONTAB_MENSAL", + "7207ebce07676b20d98ec74a0ff65c77": "Executar uma vez por dia às {}:{}", + "4f4ae97ac3a0f45ef67bda70d5e4fe0b": "Executar uma vez a cada {} dias às {}:{}", + "82dccd8eb88a5611e453cbf6f25fa90f": "Executar uma vez a cada {} minutos da hora", + "a84b2e49920d839395e3f93812f9ac03": "Começando às 0:00 todos os dias, executar a cada {} minutos de {} horas", + "41924db412ce09aa5ef5c9f1f9c88ee8": "Começando do minuto 0 de cada hora, executar a cada {} minutos", + "45abd276fba3519ea010cb5b3c44a484": "Executar uma vez a cada {} em {}:{}", + "06ce21d9c603152315f749e19fab3148": "Executar uma vez em {}:{} do dia {} de cada mês", + "f2fc5ae4c94a95a754c58b15197bc135": "Executar a cada {} segundos", + "eb8cb9c97e5888beefc46d6c0645ff4f": "Inicializar e executar uma vez", + "7b9732c358c4e407030aca56ccb7a72b": "Nenhum dado encontrado para a tarefa agendada correspondente. Atualize a página para verificar se a tarefa agendada existe!", + "b55a6e4ebb6e988c6d46840ca6cc3315": "Incapaz de gravar no arquivo, verifique se o fortalecimento do sistema está ativado!", + "fff2eb19d097654514fc97c4a6e6d233": "tarefas crontab", + "64e1288887b58a1c65d05676f7197477": "Modificar o status da tarefa agendada [", + "ef1a7595dfa94a12b47bb18d3ac94313": "A tarefa agendada com este ID não existe", + "1844e0f52715901c376dca67e5742aa9": "Falha ao gravar tarefa agendada, verifique se o disco é gravável ou se o fortalecimento do sistema está ativado!", + "5a7b17945b660284bb813be218c04c71": "{} Falha na configuração", + "5e7205744bd38904dcbc7c0b77456fc7": "Excluir {}", + "140fb31d1756ae3c75b297f0c17f8b24": "O nome da categoria não pode conter declarações HTML", + "e5e2e32bece629fcba864f7f5e8df60f": "CRONTAB_NOMETAREFA_VAZIO", + "7a13562d776fdfdc9213a82f7f01d501": "O arquivo do temporizador não existe. Tente excluir esta tarefa e recriá-la!", + "f3b898619b284003475f2039ce53968c": "Tarefa planejada modificada com sucesso [", + "72a21489a541757ee98b54790e5f431f": "Modificado com sucesso", + "92f1227778f186dd8c5f6cae42f5285a": "Tarefa agendada adicionada com sucesso [", + "e55c44fbd41784b7731f71e2789cad65": "ADICAO_SUCESSO", + "b4d708d96e24278a93a6609b9e8002a8": "Parâmetro obrigatório ausente: execute_time (formato: AAAA-MM-DD HH:MM:SS)", + "c506f17bfd828a4aeaf5a7978103f6b9": "CRONTAB_CORPOTAREFA_VAZIO", + "1311d0f2576e30afceaa616f06a0fa53": "Falha ao adicionar tarefa única", + "5a3c3438dbcadf4a0d59858f17a8522f": "Logs de tarefa estão vazios!", + "e8ab4d6107eaf37c98f250be20f146e1": "Logs de tarefa esvaziados!", + "a0d347c48839cab209fa3827c667a5c8": "Excluir tarefas agendadas", + "46039515107ea576bdaf75935b8b5f0d": "Excluir tarefas agendadas: {}", + "a3c72de16808f111cbe7e4c6dacc401b": "DEL_SUCESSO", + "49b236322476b6e7baf65369b4b61565": "DEL_ERRO", + "d5925f01eeb5596fed21f5dae6ffed30": "CRONTAB_EXEC_TAREFA", + "72bf657fef1eeafa1c8ecde5e4c06405": "Execução da tarefa falhou! Nenhum registro de tarefa correspondente encontrado.", + "8804f9a6882b09397bbc0599ba59b7ca": "Execução da tarefa falhou! O ", + "e9ca7bae70907408382135107fb85a13": "Download falhou!", + "272892ac18608e0a1ad6bf080afd2e51": "Limpar com sucesso!", + "06511118622e143af60d10d0877c9a3d": "Limpeza falhou!", + "424a90061acbe105658b97a0d86a4de2": "Por favor, insira o nome do arquivo!", + "14854122a7fb5958664a8d840dc0bead": "Por favor, instale o armazenamento webdav primeiro!", + "a027ff0717f56bf016b2f023d92e0c32": "Nenhum arquivo correspondente encontrado, baixe manualmente do armazenamento em nuvem", + "f7314eff61e017245b088eecfee0c418": "Objeto de armazenamento em nuvem não inicializado corretamente!", + "a09c248c44ca9548bce41bc3e79b400d": "O arquivo não foi encontrado no armazenamento em nuvem!", + "9b23d05e4cb1d3ee22dd3dd7212817ab": "Nome da classificação não pode estar vazio", + "fade4a03622ee745aaf87044d697203f": "O comprimento do nome da categoria não pode exceder 16 dígitos", + "c875cf8f63d81c7fb198018d5c4bfa79": "O nome da categoria especificada já existe", + "f66442d89b8c613c082425a93b417695": "A categoria especificada não existe", + "caf573e6b4299b7f60e24635b0295e9d": "Categoria excluída", + "9133e7faf0b9fc202294e495163b1ced": "O nome não pode ser alterado para o nome de classificação de tarefa padrão do sistema", + "a3ee2a93b0a298de033ca1b784f62f04": "Não pode ser definido como classificação do sistema ou classificação padrão!", + "f300a6ee81c71057acc7beecdaf472c7": "Configuração bem-sucedida!", + "290435bc045f16e4d099d721b7f706c3": "Configuração falhou", + "8d49c76279564d3127e45cae01976d37": "/tmp/cron_task_data.json", + "d7ee2f4d054a35aab002985b80644f24": "Exportação falhou:", + "1cd20eabfaa5ad5793b4075f976bf475": "Incapaz de analisar arquivo JSON!", + "205904d76b14dbdb456fc2a2997ba5b1": "O formato do conteúdo do arquivo JSON está incorreto!", + "f63f66d08d61a3b16c11e0dfce9510e1": "Importado com sucesso {} tarefas agendadas", + "414522bb8a68d31211190865a1cefdd0": "Por favor, escolha importar o arquivo!", + "8342696568c9b58f16cf29e2492cddea": "Importação falhou! {0}", + "51b34794854788b7e5eb8c3a8fab0242": "Por favor, passe o parâmetro de tempo!", + "860f363ecfcf11c8740b9068152b910c": "Desligamento temporário e reforço do sistema bem-sucedidos!", + "acbe969acf9b4925e963f102f3430f84": "Desligamento temporário do reforço do sistema falhou!", + "14a7c9c4ed221e7b3234de80bb8b9ef9": "Corte de log ativado com sucesso", + "15af2c7a6a5766d84ad8c57c5d2fb0dc": "Corte de log desativado com sucesso", + "636cccf0b373acec35770f9f26710396": "Falha ao ativar corte de log", + "bd6df8255e394034ebcf93fcebfe06d3": "Aquisição falhou:", + "90a80c8e64ee80e8577c44699b6faa7b": "Falha ao criar tarefa agendada {}, verifique se o fortalecimento do sistema está ativado ou a condição do disco", + "796b4f2a019427bc554ef1166faad8aa": "Fechar com sucesso", + "f222f6f9531a00476e39863b53bcde07": "Abertura falhou", + "52d812a7c0b57b35fac4e668122191a3": "Execução de script falhou", + "f804ceef9dd122e198f13357be514e41": "Backup Automático Banco de Dados[TODOS]--mysql", + "26e64121956b9e7e55244a508f146864": "Backup Automático Site[TODOS]", + "dd1ddef2d75c7c80540db8c12270af8a": "O parâmetro passado não é um objeto interno universal", "f5484a1a111b9d70ecaafb36a7df48f6": "E-mail não existe", "59d26291d38cd716232dd08e1c6c5304": "Por favor, insira seu e-mail", "d76fd2d8c3dffcbab0885c9bdf78fe16": "E-mail já existe", "fec0532445dc524beeac7255c4d34ef8": "Por favor, complete as informações", - "ffa0dfd81ff9459785617a7a73a7d9f4": "Falha no envio do e-mail, verifique se a senha SMTP está correta ou se os hosts estão corretos", + "ffa0dfd81ff9459785617a7a73a7d9f4": "Envio de e-mail falhou, verifique se a senha STMP está correta ou se os hosts estão corretos", "ae73c4d1db318d09f4792e23f1b80584": "Sem Dados", - "7ee533d91b6b3524d4fcfcde77dc4987": "Esvaziado com sucesso", + "7ee533d91b6b3524d4fcfcde77dc4987": "Esvaziar com sucesso", "11f60f1528977a463a3ef16a8876e4f6": "A caixa de correio não existe, adicione-a à lista de caixas de correio", "009654d37f429367967bd49ee47c26f2": "Por favor, preencha o título do e-mail", "2ab41d39d3f12250b5dc3ae0d610caa4": "Por favor, insira o conteúdo do e-mail", - "0c1828ed3fbaf5eec3fb8ad0a7aa957a": "Informações SMTP não encontradas, adicione novamente as informações SMTP de e-mail personalizado nas configurações", + "0c1828ed3fbaf5eec3fb8ad0a7aa957a": "Informação STMP não encontrada, readicione informações STMP de correio personalizadas nas configurações", "03212d3e6324204bce266e74779ab3c9": "Enviado com sucesso", "494247bcb984f09ad09176c8256e64ac": "Falha ao enviar", "6f81b0f19f4ef82bf31eeb9c20979f90": "Falha ao adicionar, verifique se a URL está correta", - "3d17d5b07e5aaa72a35e60707027d352": "As informações de configuração do DingTalk que você configurou não foram encontradas, adicione nas configurações", + "3d17d5b07e5aaa72a35e60707027d352": "As informações de configuração dos pregos que você configurou não foram encontradas, adicione nas configurações", "a75863f88c3c7b7cb43989b7b406a82a": "Por favor, insira os dados que você precisa enviar", - "5de6533189f891dc2a44ac945f53efce": "A verificação de complexidade de senha está desativada", - "06fae24317d8f2b5ef156f11a0fba311": "A verificação de complexidade de senha foi ativada", - "946cc3a7fae7508e3d34b4ed139ee2d8": "A autenticação de expiração de senha está desativada", + "5de6533189f891dc2a44ac945f53efce": "Verificação de complexidade de senha desativada", + "06fae24317d8f2b5ef156f11a0fba311": "Verificação de complexidade de senha foi ativada", + "946cc3a7fae7508e3d34b4ed139ee2d8": "Autenticação de expiração de senha desativada", "f00369482ba4cd8b50446356d3fad724": "O período de expiração da senha não pode ser inferior a {} dias", "501b1c01d3b31cb34cbcad5a19ae851e": "O período de expiração da senha não pode ser superior a {} dias", "db6890122bbd9e97fb8e1b117b367358": "O tempo de expiração da senha está definido para [{}] dias", @@ -1384,6 +1452,7 @@ "6c6b6e84490b34b36f33dcc8ae85fdc2": "As senhas inseridas duas vezes são inconsistentes, tente novamente!", "55f5bbcf01ad984ea402d50061609240": "A senha não pode ter menos de 5 caracteres!", "59b39458556877d386a837773736eb2d": "A senha deve ter pelo menos oito caracteres de comprimento e conter pelo menos três combinações de dígitos, letras maiúsculas, letras minúsculas e caracteres especiais", + "08423404caee54eae13add8fe145d84f": "Verificação de senha falhou!", "704372ffb884853d30e3b247765bb73a": "Os nomes de usuário inseridos duas vezes são inconsistentes, tente novamente!", "1bea42b66bb313cab948558e2d27b4e5": "O nome de usuário deve ter pelo menos 2 caracteres", "4772625698c6c1ed00afd0848fd2b57b": "A senha deve ter pelo menos 8 caracteres", @@ -1391,52 +1460,60 @@ "330080a87414678839a05adf12a4bb1d": "Falha ao criar novo usuário!", "c94d622c80e3f5af884fcccef35808b6": "Não é possível excluir o usuário padrão inicial!", "e19e85e7bd5fde471d513ef747e88021": "O nome de usuário especificado não existe!", - "7d435c8b5780fd83a10ee8f69abf04c4": "Falha na exclusão do usuário!", + "7d435c8b5780fd83a10ee8f69abf04c4": "Exclusão de usuário falhou!", "65e81e9b6c91bdde17fca09089852265": "Nenhuma alteração enviada", "c8e9c31bced80905134de34df6f67d66": "backup_number deve ser um número inteiro!", "526d961c343986a803395eb22a3accab": "backup_number deve ser maior que 0!", - "d944a195e19ea2a91eb143a4600a5fe6": "Falha ao desativar o backup automático de dados do painel!", - "cb476d0f3d678a0f1746d6d91f8c24c2": "Falha ao ativar o backup automático de dados do painel!", + "d944a195e19ea2a91eb143a4600a5fe6": "Falha ao desativar o backup automático dos dados do painel!", + "cb476d0f3d678a0f1746d6d91f8c24c2": "Falha ao ativar o backup automático dos dados do painel!", "77c1047380de3f54df74a3e84ed5ec15": "O formato de IP autorizado está incorreto, e a escrita de segmento de sub-rede não é suportada", - "52d7cd44ec88df37e528f140e2affcf4": "O tempo limite deve ser um número inteiro!", - "5ad475cca538c88655b2299588b9a091": "O tempo limite precisa estar entre 300s e 30 dias", + "52d7cd44ec88df37e528f140e2affcf4": "Tempo limite deve ser um número inteiro!", + "5ad475cca538c88655b2299588b9a091": "O tempo limite deve estar entre 300s-30dias", "7b66709539a01edb71eacc470ce7f4bc": "O domínio não pode vincular endereço ip", - "f522b971d05877c869be6f81b9eb7fe8": "Por favor, defina o IP do Servidor correto", - "716e57b0f48924438fc1209c06353fc7": "Não é possível usar o diretório crítico do sistema como diretório de backup padrão", - "17ceb8d2128aa1ce5f2f51ef5b19a809": "Não é possível usar o diretório crítico do sistema como diretório padrão do site", + "f522b971d05877c869be6f81b9eb7fe8": "Por favor, defina o IP do servidor correto", + "35e15c0be5bb51b628d96c9a520c9b01": "Porta [{}] está em uso!", + "716e57b0f48924438fc1209c06353fc7": "Não é possível usar diretório crítico do sistema como diretório de backup padrão", + "17ceb8d2128aa1ce5f2f51ef5b19a809": "Não é possível usar diretório crítico do sistema como diretório de site padrão", "e60263ac381ae4a9ad460a5c706b9b5a": "Configuração salva", + "494345d63759dcd623286d448def8778": "Ocorreu uma exceção durante a execução {}", "b1f79322ef609c5ad200c552dfbeba85": "O período de tempo limite não pode ser inferior a 300 segundos", "59bfee3685345c8facd75248b7f17a8c": "O período de tempo limite não pode ser superior a 30 dias", - "b1770445e55578871051298a4bca2ba8": "Você não pode usar o diretório de chaves como o diretório padrão para construção de sites", + "b1770445e55578871051298a4bca2ba8": "Você não pode usar o diretório de chave como o diretório padrão para construção de site", "395fa878a1482de198dd9765e03cb0df": "Entrada de Segurança não pode ter menos de 6 caracteres!", - "7030414be42829df4fa2102738ad98f8": "Esta entrada foi usada pelo painel, por favor defina outras entradas!", - "3aadff910a401b163029bd5915aea8ee": "Formato de endereço de entrada incorreto, ex: /meu_painel", + "7030414be42829df4fa2102738ad98f8": "Esta entrada foi usada pelo painel, defina outras entradas!", + "3aadff910a401b163029bd5915aea8ee": "Formato de endereço de entrada incorreto, ex. /meu_painel", "ac67b91773937f05690f0eed86ddc37c": "Limite de tamanho de upload não pode ser inferior a 2 MB", "f2c35784d83c39c7804be9817c498d97": "Por favor, preencha o valor entre 30 e 86400!", - "10951b15ad70ad91dd672b3942e85954": "Modo de operação incorreto", - "c277ef8831d8bcad68fafb826e050fe1": "Falha ao conectar ao servidor de horário!", + "fac487bbd20975aaf778e95a2ea78a85": "O arquivo de configuração PHP-FPM não existe. {}", + "7dd858aa480b572b903caa7b71000954": "O arquivo de configuração Nginx {} não existe!", + "69c86a0788cb7553486d3fe54bdc5232": "Falha ao ler o arquivo de configuração Nginx {}", + "192ae9cd563752bdd188b54231f828b6": "O arquivo de configuração Nginx {} está faltando configurações de tempo limite FastCGI, verifique!", + "10951b15ad70ad91dd672b3942e85954": "Modo de operação errado", + "c277ef8831d8bcad68fafb826e050fe1": "Falha ao conectar ao servidor de tempo!", "7d8946452a1ad712185ad106a09d83cb": "Número de dias de salvamento é ilegal!", - "4218a6e9c12f1fa453fa8e5c1b00bd44": "O formato de e-mail é ilegal", - "df6565d8975cca7ba4276300b9c38bdf": "SSL desligado,Por favor use o protocolo http para acessar o painel!", - "e99cd51a6216bc73a3e8ea8de05a54d8": "Atualize a página e tente novamente!", - "74f3d2f09425457bc7a3fd34017631c9": "Erro, não foi possível instalar automaticamente o pyOpenSSL!

Por favor, tente instalar manualmente: pip install pyOpenSSL

", - "8e4aa3a825e526915c867d103bc88064": "SSL está ativado, por favor use o protocolo https para acessar o painel!", + "4218a6e9c12f1fa453fa8e5c1b00bd44": "O formato do E-Mail é ilegal", + "df6565d8975cca7ba4276300b9c38bdf": "SSL desligado,Por favor use protocolo http para acessar o painel!", + "e99cd51a6216bc73a3e8ea8de05a54d8": "Por favor atualize a página e tente novamente!", + "74f3d2f09425457bc7a3fd34017631c9": "Erro, incapaz de instalar automaticamente pyOpenSSL!

Por favor tente instalar manualmente: pip install pyOpenSSL

", + "8e4aa3a825e526915c867d103bc88064": "SSL está ligado, por favor use protocolo https para acessar o painel!", "e47079f267dd01176afaa962dcd62358": "Notas ou endereço do painel duplicados!", - "8c7a5b3c69236d00b3577be9c91a71cc": "Informações do painel solicitadas NÃO existem!", + "8c7a5b3c69236d00b3577be9c91a71cc": "Info do painel solicitada NÃO existe!", "5b8ce0c16a86626165e93796b14d4bf6": "Erro ao ler arquivo de configuração PHP, tente reinstalar este PHP!", + "3d023dffe875ddfbc013d6052c83bf56": "Falha ao ler arquivo de configuração PHP, pode não existir: {}", "0631278069374277ff3b2cc2949940fd": "Por favor, insira o [domínio ou IP] correto!", "ac40ea6dbb38e754acea879d58701424": "{} Dia(s)", "7a3fd8f7ddf80ae2db423aa55177d22a": "{} Dia(s) {} Hora(s)", "377e7b3a05033be3164d7900c2feb2a6": "{} Hora(s)", "b2a09ec7e869bb555211fe7b26b5cf3e": "{} Hora(s) {} Minuto(s)", "9c9a5e9d306cf687381d8f1924b43b9c": "{} Minuto(s)", + "e599e181a3cc24b59e781c5a52c9da0b": "Nenhuma versão PHP instalada, não pode configurar automaticamente", "0656e1b2562955020afc339b3c9a1838": "PHP não está instalado", - "375a8ffa8b733dd5f6b069de80c57d48": "Falha ao obter versão do php!", + "375a8ffa8b733dd5f6b069de80c57d48": "Falha ao obter versão php!", "2b5266cb205519f70b1bcf7e2654982a": "Versão PHP especificada não instalada", "f54dcdd36a3b22d81acbd5358cb2a0b7": "Nome de usuário e senha de autenticação BasicAuth não podem estar vazios!", "5dc91c307ada29366c842b16a5de6913": "Limpo!", - "22ad45d745e31a8dbdb6a64f94289bbb": "A chave não existe. Por favor, ligue e tente novamente.", - "53ca2a75c705f11ff1096ffef2762084": "O nome de usuário não existe. Por favor, ligue e tente novamente.", + "22ad45d745e31a8dbdb6a64f94289bbb": "A chave não existe. Por favor ligue e tente novamente.", + "53ca2a75c705f11ff1096ffef2762084": "O nome de usuário não existe. Por favor ligue e tente novamente.", "2323ea8555972da4c7321e11488c97fe": "Por favor, insira o modo de operação", "5995c475ba8ebf9ca5a5a48623ce3df3": "Sem dados de código QR, reabra", "40e23dd18b1ba7d11eae146c3a6f0c3b": "Falha ao gerar URL de login temporário", @@ -1447,41 +1524,67 @@ "e6be2adc545cca56a638fc1b7793ebed": "O certificado de autenticação bidirecional do painel foi salvo!", "e7cf53b84401535396c856570a5bc40f": "Autenticação bidirecional do painel {} bem-sucedida!", "3400b1e0bf5f54e0230a7e272698e73b": "O arquivo de modelo não existe.", - "c9541884ca9b19170e4d300b16e9c10b": "Falha na configuração, [{}] não está instalado", + "c9541884ca9b19170e4d300b16e9c10b": "Configuração falhou, [{}] não está instalado", "ed39c2105eef1ae435e6a332bd0b716f": "[{}] foi definido como a notificação padrão.", "0b3d1848b5648a7ac08ec7425043059b": "[{}] foi removido como notificação padrão do painel.", - "67c052db394411fdf2755100c5028f94": "Falha na configuração", - "c2806eed218fbfc91e0b4f37b08ce547": "Falha ao instalar o módulo [{}]. Verifique a rede.", + "67c052db394411fdf2755100c5028f94": "Configuração falhou", + "c2806eed218fbfc91e0b4f37b08ce547": "Falha ao instalar módulo [{}]. Verifique a rede.", "4ccd9bbf79fcc60bef3a1aca5d577e85": "Módulo [{}] instalado com sucesso.", "643fb3483415124df30e40a2559a02c3": "Falha na instalação do módulo [{}].", "92013d9cfaae3995581927729dc898b8": "Desinstalação do módulo [{}] bem-sucedida", - "2eccda3dec7fa3a985668d79c718be23": "Questionário foi enviado", - "692323a652529dc1bb482078ebd98fd0": "Nenhum questionário foi enviado", + "2eccda3dec7fa3a985668d79c718be23": "Questionário enviado", + "692323a652529dc1bb482078ebd98fd0": "Nenhum questionário enviado", "7a18188353d1d06b3ab9af842dd6f0f2": "Falha ao obter questionário", - "eb010361bab3ef9e74a27fdc883b1bd5": "Erro de parâmetro questions", - "25baa40bd86bb31a5095cf5457e87f74": "O texto enviado é muito longo, ajuste e envie novamente (MÁX: 512)", + "eb010361bab3ef9e74a27fdc883b1bd5": "Erro de Parâmetro questions", + "25baa40bd86bb31a5095cf5457e87f74": "O texto enviado é muito longo, ajuste e reenvie (MÁX: 512)", "1cc5a8ad869ce7dd47987b6eb278260a": "Enviado com sucesso", - "7e4182fc0365b28328ac2ec8896f73b1": "Falha na configuração! {}", - "94e431cde2ffda2ef08526fa2af1b0b5": "Ativo definido com sucesso!", - "fe1887f5db433aa5f5b4b35e78aa2a93": "Falha ao definir ativo {}", - "bedfc521aa92e68b04430d33289c6b3c": "Na Hospedagem Multi-WebServer, apenas versões nginx 1.24 e superiores são suportadas!", - "e6c81af465e7bdf8761e0072eb217ca6": "Não é suportado pelo sistema atual", - "44164f2aee5b6836802ff8142f495629": "A verificação falhou", + "7e4182fc0365b28328ac2ec8896f73b1": "Configuração falhou! {}", + "94e431cde2ffda2ef08526fa2af1b0b5": "Ativo Definido com Sucesso!", + "fe1887f5db433aa5f5b4b35e78aa2a93": "Definição de Ativo Falhou {}", + "dd2b16eb608e5838d556598d479e9264": "Aguarde o início da restauração", + "749707db319ac2fa02785c1bdb58083b": "ERRO: arquivo de configuração sshd config não existe", + "80b695b495da54ed6a76eac8a965bc7b": "Alarme de login cancelado com sucesso", + "40d3b22b13a0b11ed727aa257e2228c0": "O canal de mensagem não está instalado", + "87597848076b873c1a9bb9ffea64950b": "Erro: arquivo de configuração sshd config não existe", + "bdb119e343438b628e7ba8b20e4632ed": "Erro: sshd config não existe", + "45de64a88b25b6527ccd3efbce76ed3b": "Erro na passagem de parâmetros", + "387e90104fbc0261c1ae5db9443f0b22": "Definir o método de login root como: {}", + "0fd775e0a957d247e199d2cd911078e8": "A senha não pode estar vazia", + "2279ae228c06ace23e59cc218f2536f8": "A senha não pode ter menos de 8 bits de comprimento", + "207d2e497f2ca0d97f1453671d4d824a": "O nome de usuário já existe", + "e1c5fbbb3782936fa209244fcc62ea7e": "A senha deve conter letras e números ou símbolos", + "4c94c49ecaebd37c52172946778fc296": "Falha na configuração", + "c601909c952f2064e91d6f3c1d1a7128": "★iniciar backup[{}]", + "890b5b1ca2b1aa96f0781c9fdc77ab88": "☆backup concluído[{}]", + "5316694cae24d434370be2d76146a500": "|-Erro:{}", + "b763e7e9f6b23d4b5066458506d26d55": "Execução da tarefa de backup falhou.", + "713660262f5ab9c3af9aa17c8d8a412c": "Backup para ", + "de5ac4bddf9b72b649c0cbd4243f76c6": "tente novamente após alguns segundos...aguarde...", + "6905a88552caae6df77f56bd19f6d76a": "Configurações de tarefa cron mantêm local. Backup local retido.", + "63701b3fa795bcd399aab5d489f8eae9": "Configurações de tarefa cron não mantêm local. Backup local não retido.", + "837cc24a222df21e74245f4cfac6ad09": "Configuração do usuário para não", + "57d4380c974a85fe8db5914c934addf4": "A tarefa agendada não existe! {}", + "038ae15d38f9f027abda2aabf18324ab": "Manter o número mais recente de backups: {} cópias para {}", + "58c65e272cfde6fc8cf73d0ffcde4bbd": "Enviando para {}, aguarde...", + "243c0f3ec002883d6fa7770957ecf9bd": "A tarefa agendada não existe!", + "78df833c741b9814545d76a83f2db9b5": "{} Banco de dados de backup {} não existe", + "472f0ed974a6a2aec9b70fe7d39b27ee": "MongoDB ativou autenticação de segurança. ", "ee6cb8cccfef01a6931ac569767b7303": "banco de dados local foi instalado", "65d7c486a72e5ad1b6bd2efb8956f3f6": "Falha ao editar: {}", "f62e45c2a8ed2cfcfd94370111f2a7b3": "Um banco de dados com o mesmo nome já existe: [{}]", - "c0845b39485db26e69520bd402a139b7": "Banco de dados [{}] já está na lixeira, recupere da lixeira!", + "c0845b39485db26e69520bd402a139b7": "Banco de dados [{}] já na lixeira, recupere da lixeira!", "4660d7ac939f0ce64023bd24bc25b663": "O nome do banco de dados não pode ter mais de 16 caracteres", "299cf735a7b842c5bc2eaedf2e266387": "O nome do banco de dados não pode conter caracteres especiais", "d1e3ea8b4d692d87d876428f0cf476c4": "O nome do banco de dados é ilegal", - "32e1edf20dad771b315ddb3da35bacd3": "O banco de dados especificado já existe no MySQL, por favor mude o nome!", - "54fac16736efc268ae61cc17bf80dcef": "Falha na conexão com o banco de dados remoto [{}]", + "32e1edf20dad771b315ddb3da35bacd3": "O banco de dados especificado já existe no MySQL, mude o nome!", + "54fac16736efc268ae61cc17bf80dcef": "Falha na conexão com Banco de Dados Remoto [{}]", "ad62ead53c1f43865593805aab80df4b": "Falha ao modificar : {}", - "d3a51b64fa563dfcd901485db4cf5777": "A senha do banco de dados [{}] não pode estar vazia", + "d3a51b64fa563dfcd901485db4cf5777": "Senha do Banco de Dados [{}] não pode estar vazia", "157aebc66e02126c7568365a18392758": "A senha do banco de dados não pode conter caracteres chineses {}", "480b606c09fb9d52b9e47995e04641de": "banco de dados não encontrado!", "f730258407ac8fda3c780e7c59a09f16": "Senha modificada com sucesso para o banco de dados [{}]!", - "36856cc0aff5e4d792ab1919ec9e24f9": "Backup do banco de dados [{}] bem-sucedido!", + "36856cc0aff5e4d792ab1919ec9e24f9": "Backup do banco de dados [{}] com sucesso!", + "d0a3141dec105a6fd820524ae77b928c": "Não há tarefas de backup por enquanto !", "cd338377817d5286c26f62c0562ebe72": "Banco de dados [{}] importado com sucesso", "4461199265eb82e1de46055d7f4568b6": "Backup Bem-sucedido", "ecc5e49aaee7ba7dc9a1b1b89e008c13": "Selecione arquivo sql/gz/zip", @@ -1489,35 +1592,162 @@ "c811067e114e07cbb188afd110ddc579": "Sincronizar {} banco(s) de dados do servidor!", "a47891f08609cb38f4de9fd50def4650": "Obter {} banco(s) de dados do servidor!", "8aec4a4bd998059f3dbb932da4714b00": "IP não encontrado!", - "a62053a8ff838da8ba33aae82d8fda5b": "Erro de conexão com o banco de dados!", - "65a61bd2b3c632fd1d27b19db5abf197": "A senha do banco de dados MySQL expira", + "a62053a8ff838da8ba3aae82d8fda5b": "Erro de conexão com banco de dados!", + "65a61bd2b3c632fd1d27b19db5abf197": "Senha do banco de dados MySQL expirada", "dfcaac01b569325ec535229328d52f6d": "Erro de consulta ao banco de dados!", - "efc33dbd7910fde6ce3fe364a7d43bfc": "O arquivo de configuração rsyslog não existe!\\nVerifique se o rsyslog está instalado ou se /etc/rsyslog.cn existe!\\nSe o sistema debian não estiver instalado, execute:apt-get install rsyslog\\nPara sistema Centos execute:yum install rsyslog", + "66924214c228f7eb631ac940281c7190": "Configuração bem-sucedida", + "d55e6e0c13df775ea0eabea4f36ff8da": "Por favor, habilite pelo menos um comando e firewall", + "322d678e45d68284d90503f36da32648": "A operação foi executada", + "26eaf477d247c668a143b415491995dd": "Seu endereço IP atual [{}] não está na lista branca.", + "c26b7075352954fb3e96fbe983dbd083": "Seu endereço IP atual [{}] está na lista branca.", + "f9cfac18ac1fe92adcc47b139d0617a8": "Adição falhou", + "bf31291dfc89be9a8af12c3fa15e7e4d": "Operação executada", + "71a1c5f19c8e300d350f5f68c71e4559": "Exclusão falhou", + "01f144a7cfd324d0dab94f8aa6e29374": "Excluído com sucesso", + "e6c81af465e7bdf8761e0072eb217ca6": "Não é suportado pelo sistema atual", + "44164f2aee5b6836802ff8142f495629": "A varredura falhou", + "a499f309ac7a223d611d7a0a85900342": "Nenhum registro de reinicialização encontrado.", + "d23fb11ea541cd5f1c0b05851d54fd58": "Marcado como lido.", + "e9a08443260e6f3b795eb57419a6ad77": "Falha ao vincular ao armazenamento em nuvem!", + "efc33dbd7910fde6ce3fe364a7d43bfc": "O arquivo de configuração rsyslog não existe!\\nVerifique se o rsyslog está instalado ou se /ect/rsyslog.cn existe!\\nSe o sistema debian não estiver instalado, execute:apt-get install rsyslog\\nPor favor execute o sistema Centos:yum install rsyslog", "a6fba111c7d0f418059856c4160b4d0d": "O parâmetro está incorreto!", - "3f8ee4f649b32e181c15c39682629844": "Usuário [{}] existe!", - "b23886f3380c4a9500a7614474ff6bf8": "A senha deve ter pelo menos [{}] caracteres", - "f20eaf62a87c2072f7c09ec70a6b90c9": "Erro de exclusão", - "49b236322476b6e7baf65369b4b61565": "ERRO_DE_EXCLUSÃO", - "9607dbc43fb07121ebd102497290c15b": "{} usuário FTP falhou!", - "8b73e5696a44d470ee99c274152c1b54": "A porta[{}] está em uso!", - "384169bf557e2785a74c6ab4c8ca0d9c": "Erro de edição", - "e420cebff3e23fb8eedd388024ce1839": "Formato de URL de destino incorreto {}", - "62dc2bbb0528fe87522c74b113883a48": "O site especificado não existe!", - "4675bfcf662ee236a05dcb763cf9d520": "A configuração de cache do Apache falhou. Por favor, verifique se o site está funcionando corretamente!", - "0b9aca52d360d6f7a8f2c5c897c93005": "As configurações de cache do Apache foram bem-sucedidas!", - "a2cd28fcd32e92be995b2335768fdea3": "O cache do Apache é atualmente suportado apenas em Hospedagem Multi-WebServer", - "b288b8637582cc38c1d4c902ed03cbec": "A instalação do plugin de cache falhou", - "aebabb72ad41fbe46f73abcc9dc00b9f": "Falha ao ativar o plugin de cache. Tente ativá-lo manualmente e, em seguida, habilitar o cache", - "3981bd44ca3f1d5abafc6b15ba8c7435": "As configurações de cache OLS foram bem-sucedidas!", - "3777f748e5535e7e38261b2e0afc8274": "Falha na configuração de cache OLS: {}", - "93916600bce5b19586cbf51d558b5d78": "Verifique se o formato [{}] está correto Por exemplo: {}", - "8e342838d5cf3a93e34956c9550db4d0": "Falha na implantação: {}", - "0dbd3323f74314d1cf85c7db5ac2fd1d": "A versão atual do navegador IE é muito antiga para exibir alguns recursos, use outro navegador. Ou, se você usar um navegador desenvolvido por uma empresa chinesa, mude para o Modo Extremo!", - "47b1cbb355da8faa6415f12c96469ba1": "20 falhas consecutivas de verificação, proibido por 1 hora", - "dd1ddef2d75c7c80540db8c12270af8a": "O parâmetro passado não é um objeto interno universal", + "c77d5ef44d6a21abe99c3e370a0f5364": "erro de parâmetro: coupon_id", + "1cb4143e9dbb7515e606ab6854578a00": "erro de parâmetro: cycle_unit", + "2121d979fb82aae9f0a62572bf36217f": "Solicitação de interface falhou ({})!", + "287e14ef978fb00ce99942e799c36649": "Parâmetro limit_time ausente ou parâmetro não pode estar vazio!", + "8feb15ff2883086bba98d9d791d10bf7": "O tempo não pode ser menor que o tempo atual!", + "e420cebff3e23fb8eedd388024ce1839": "Formato de URL de destino errado {}", + "4943a6954b9887aa5989713fcbb2a0d1": "ERRO: Incapaz de conectar ao servidor {}, verifique se a configuração [AK/SK/Armazenamento] está correta!", + "da10c98ffbf34b30edec9cf47d998a68": "Aplicação bem-sucedida!", + "24380483226504475d196fdcff7a6c77": "Falha ao conectar servidor! -1", + "353d91a7655b3ef5e024d07eef1888ab": "Falha ao conectar servidor! -2", + "340c4a30e533798f76f8deba605ff6c4": "Erro de parâmetro!", + "f98c446d194c4fbb566c3becc91255e1": "Versão deve ser numérica!", + "75809e3b321efe1afbdf9773494d5dd9": "Não encontrou o arquivo de configuração {}, tente fechar as configurações de porta ssl antes de abrir", + "7d7014331b485392e1d6055aad5c26cd": "Não encontrou o arquivo de configuração nginx phpmyadmin ssl, tente fechar as configurações de porta ssl antes de abrir", + "f471efd0f135fbddafdce4ad1febf5bb": "O servidor web atual é openlitespeed. ", + "4a32aac45fa22d0c693a646d5e265bf1": "O certificado do painel não existe. ", + "c6b59c5c3d29862a6dc85e9375094c83": "O servidor web atual é local e de acesso privado.", + "056197513cf8b469874e09b037fa5aaf": "O servidor web atual não é suportado.", + "e15ac24f41e856e08e494f9d2ab51af0": "Há um erro na configuração do phpMyAdmin.", + "7ec0387d04c7d7c8259b497464fa3282": "phpMyAdmin já {}!", + "4790f238a5706fa03ed78c98efabd5f2": "Vinculação é válida!", + "0dbd3323f74314d1cf85c7db5ac2fd1d": "A versão atual do navegador IE é muito baixa para exibir alguns recursos, use outro navegador. Ou se você usa um navegador desenvolvido por uma empresa chinesa, mude para o Modo Extremo!", + "47b1cbb355da8faa6415f12c96469ba1": "20 falhas de verificação consecutivas, proibido por 1 hora", + "492478fa7955b2282528aefe56d42ec4": "Perfil não existe!", + "71804f43c7fe50a625e9fd1f930365ce": "Falha ao obter da nuvem!", + "46fb7ccd0be31ec840d524d8f99f1368": "Atualização concluída!", + "d631f73db41ac42021c522b61fba3274": "Não é necessário atualizar!", + "11ce17a8cf1f195a0687c00fc4201d2f": "Importação Sucesso!", + "d49c4e6f0a63eb94dfb921be5d804e8b": "Site não existe!", + "0b5efcfb8a290faab14ebce65ece59e7": "Diretório raiz do site perigoso!", + "d747c3e10f8c5fd5c0aec8b422883292": "O pacote especificado não existe.!", + "22e806afb25ddcb6cf205be320eb2350": "Não foi possível encontrar [Arquivo de Configuração de Implantação Automática aaPanel] no pacote de instalação", + "7658d0092e96ef38859c12f2a91f641f": "Não há tarefas de implantação no momento!", + "b404834ec20850fd1de15f52dc43cb06": "Falha ao conectar ao repositório remoto. Certifique-se de que a chave esteja configurada corretamente!", + "152b976545ff1ee50e0de21da7af1266": "Verificação em andamento.....", + "e6a6fa2d0bcc8bfc2af5bcd4640ade03": "Verificação de parâmetro", + "80f9a0a476836be5fdec10fe414e88a9": "{} O site está sendo criado....", + "064aa7114f7c7430dcf2b0cdc05ad20c": "Criar site", + "38cb441d840ed6579ca6f1f876de2b61": "Adicionar configurações opcionais: Banco de dados, FTP", + "b7575e63439333749c6e7d6a27b8a0e4": "Adicionar configurações opcionais", + "d0977de06e41fbd31702d7ddba64c3da": "O site wordpress está sendo implantado....", + "a2bc816cd7abf7b134e56b39edae6fda": "Implantar wordpress", + "2a5e8b7e4116ee81db89ba173f60bf90": "Verificação de parâmetro falhou", + "2f35a151cc0256f0d9ad5410eccbe5d0": "Verificação de parâmetro falhou: {}", + "af2a8e2174ea327f9fbf77d84029d58b": "Verificação de parâmetro bem-sucedida", + "181fc26e7b655ba36b3b075ca1ebc350": "Falha ao criar o site", + "7118aff13541bf3d74a9c47fb458e102": "Falha ao criar o site: {}", + "be33773093fc2e135ba4bc26f4bb5509": "O site foi criado com sucesso", + "7e8ca7bb5dd0e69e0cd0d0e66832e2cd": "Criação de banco de dados falhou. Verifique o status de execução do mysql e tente novamente. {}", + "8d823a9933eefd02bf1003481f816f64": "Falhou: {}", + "505a83f220c02df2f85c3810cd9ceb38": "Sucesso", + "b0b4a6c23347406736732380f3798be4": "inicialização do wordpress falhou", + "e7b3deb11aabca0f7ae217ccccd10772": "Inicialização bem-sucedida!", + "31b88b436695f7e0bc5dad1cb8999737": "Não use as portas do serviço do painel!", + "d0d4ff47e6dc25f0069a1d74d2f995b4": "A porta está ocupada ou o intervalo de portas está incorreto! Deve estar entre 100 e 65535", + "7dde7f2ae7cb4ed56b1b683b479ad303": "Aviso: versão {} ainda não foi instalada, ", + "839067817c5a1e7fcce2f905284d630e": "Diretório de origem de reescrita e diretório de destino de reescrita devem ser preenchidos ao mesmo tempo", + "4b6ad864ce62dac8466dde7ec62e7ea9": "Diretório de origem de reescrita e diretório de destino de reescrita não podem ser os mesmos", + "ed6fe3e47d3686c7af83b67535b426b5": "Diretório de origem de reescrita deve começar com /", + "8230eb6af0c1c2863c0c2f6bfaa9b37e": "Diretório de destino de reescrita deve começar com /", + "e718ce7b8a5d4b41b3c129b477323bb2": "Falha ao ler arquivo de configuração Nginx", + "fa5e4af74d3d68ba371e6dcf84595c3d": "O site não existe", + "45f9a99535dea651b8f160f6cf23f826": "Leitura do arquivo de configuração falhou!", + "cfecbb41158d2f815c4a0b820108aeaf": "A análise do arquivo de configuração falhou. Verifique se a configuração está correta.", + "5e3b84200bea6d70f6fed1d5802a7fa0": "Consulta falhou, endereço não existe", + "5fa721871e93bc4121df74ce51454519": "Ativação do plugin falhou, tente novamente mais tarde.", + "9f139adb77c26c263ff2a956d66f80fe": "Desativação do plugin falhou, tente novamente mais tarde.", + "5abebd9b1d5ca579c051e1094ab375cf": "O pacote de tema já existe!", + "e35ca748f8c5a0e78731bae94fb7d68a": "Falha ao remover Conjuntos", + "468baaa7179c8b181d1de35fa00267e9": "Tipo inválido de itens de Conjunto", + "a01e808b2be07634b0e3714bff919ae1": "Falha ao remover itens do Conjunto", + "35c9b2817b191a3f60553d46b748068b": "Falha ao mudar estado dos itens do Conjunto", + "87a9a388a3ef42018ceb866756c4ee39": "Conexão com banco de dados falhou, verifique o status do banco de dados!", + "73b1d7767613c6300db27ade773369fa": "Falha ao remover site wordpress remoto", + "a75c113f53d4342010d140325fa29eec": "O multi-serviço do site foi ativado. ", + "b0a517b4d596e5fc1351f8dc12e73a74": "Por favor, selecione o serviço retido", + "7e953c855b391ac0716a4eeb47c5c5c3": "Por favor, habilite múltiplos serviços primeiro", + "55d523aa501b0e7e93e172a9e6829a8a": "Erro ao obter informações da versão nginx", + "08f18bb6c6293307f68d5f822ed7dbe1": "Atualmente, openresty não é suportado", + "45020a62e40bbb43f6e05c62ad50288e": "Já existe uma tarefa de instalação. Aguarde a conclusão primeiro!", + "4052df86d5a8dd12943cc8b1d53162e4": "Instalação do serviço falhou. Tente novamente!", + "8033c09e6fedf841205b29b57c0ae0d1": "Inicialização do serviço falhou: {}", + "442d02a722dc331f8b85d328fb99a174": "O modo multi-serviço foi ativado com sucesso", + "a0b289e4caa220dcd62692401d5083f5": "Falha ao desinstalar serviço {}. Tente novamente!", + "0045406cf97cbdca708c795aa9554145": "O serviço {} falhou ao reiniciar. Tente reiniciar manualmente ou verifique o arquivo de configuração.", + "52cd203105425f66daf42d81f05c540f": "O modo multi-serviço foi desativado com sucesso", + "9c116a9cbc0701ec9e9d6b6ab2755fc8": "O serviço falhou ao reiniciar. Verifique o arquivo de configuração do apache!", + "a949ed64edc73a99f9f9c801a84b6390": "O tipo de serviço especificado não existe", + "408f206d494c5f26144f7492315dfa21": "Ocorreu um erro ao alternar serviços em lote!", + "e9fd26be1a67520e66f2e99d61977c32": "ID do site não existe", + "d80972d5dfb46c1f11b8dba2b7aa04d3": "O serviço de site atual já é {}", + "99914b932bd37a50b983c5e7c90ae93b": "{}", + "2422c065bd4ef8d950bbf17c43f907dc": "A modificação da configuração falhou.", + "98e762d03fc5ffcb381010aff10c7bde": "Alternado com sucesso para {}", + "293f667205bd8aa91c72f966c03c3de5": "O tipo de serviço de site obtido está incorreto", + "8562d96fc303411ee017a30b83d75712": "Reparado com sucesso", + "d9d76120c8c13b40d2e8e49b0d6117da": "Ocorreu um erro no multi-serviço e o reparo falhou. Tente fechar o multi-serviço e reabri-lo!:{}", + "c8622023712105e9e7328396976a2667": "O arquivo de configuração de backup não existe: {}", + "d81f83ae44da0682974272b976e8e550": "Recuperação bem-sucedida", + "12572c9827392d4bd4c028881ed06242": "Existem conflitos de proxy global ou reescrita de url no site. Exclua e tente novamente!", + "92bce01ab77d0d50efec1d424cab583b": "Este site tem um proxy reverso. Exclua e tente novamente!", + "30c74a0981da2edec86936cd288479f7": "O site configurou um proxy reverso global. Cancele primeiro!", + "c3fe8f7adf26d613d9593acede34303b": "O site está configurado com vinculação de nome de domínio de subdiretório. Cancele primeiro!", + "26b15536eb5ad2d4c9c8d2b964ba175b": "Ocorreu um erro ao analisar o arquivo de configuração {}. Verifique se o formato está normal.", + "69d02d928b14a9c948c2b11955071b64": "Configurações CDN suportam apenas modo nginx!", + "da643dc091537f1db50480faba8f32ec": "O sucesso geral do site", + "e162577ca7feeab927137eaff9a9895c": "Cabeçalho CDN não pode estar vazio!", + "ef99e1222fa88fac33b622a1083b0dc4": "O cabeçalho da solicitação não pode conter espaços", + "1caa7a57a628cfd5aace9db67697efa0": "O arquivo de configuração nginx não existe", + "3a0c73aeadcfa1a6a548fb68fe4cd83d": "Há um erro no arquivo de configuração. Verifique!", + "bedfc521aa92e68b04430d33289c6b3c": "Em Hospedagem Multi-Servidor Web, apenas versões nginx 1.24 e superiores são suportadas!", + "75242ba6bf8096739ee8274c30658e46": "O nome do arquivo contém caracteres ilegais", + "25a4bafb86b96174698461c8ea8f1a6d": "Nome do arquivo não pode estar vazio", + "f2ae8a2dbe55304c1cd4ce000143d868": "Caminho do arquivo não pode estar vazio", + "9277b5ccc09173ca1596107809de89fc": "Se o caminho de destino já tiver um diretório com o mesmo nome, altere o nome do arquivo", + "fe56b3a6f3a8b6a24f60a62408351b0e": "Este é o diretório da lixeira, pressione o botão [Reciclar] no canto superior direito para abrir", + "8ec1fba8a89cb67bc958d7b2424156e9": "Arquivo movido para a lixeira", + "99a091a444e6e207f60506fb4f0bdcce": "Arquivo excluído com sucesso", + "06769a815392464e2095dd3aee30ab60": "Se a pasta falhar ao ser copiada, verifique se o diretório está bloqueado ou se a proteção contra adulteração está ativada", + "dc1aa8bc00246f2357576c2c04e74728": "O diretório atual é somente leitura", + "d10fab43227e65d40f86bbdc947c8092": "Cópia da pasta falhou:{}", + "5992e9701e2496a26893b7f11d350418": "Parâmetros estão faltando! caminho", + "f94b62cff0c45cb08b61da3ca2615d72": "O arquivo não existe", + "f44751d36b8c0672bc68bb2fa57c1069": "O parâmetro filename está faltando", + "2bfac17a1e400b07b888e0435034d6a5": "Parâmetro history faltando", + "70cfa9e1ffa7477cf00bd39d0dd4facd": "O arquivo não existe!", + "b441db7060ad3a732e49045679b2b1ae": "O arquivo especificado não existe!", + "3900f94dba983d245fd2e264d4398914": "Não tem permissões suficientes para manipular arquivos ou diretórios!", + "8a8b016e2f55506d3d7f8a86c4e2a118": "Falha ao restaurar cópia histórica!", + "5873103908815f34241636e336e1f463": "A tarefa de compactação foi adicionada à fila de mensagens!", + "e57b7bae408dd226fabe86773cd6b3c3": "Operação em lote bem-sucedida [{}], falhou [{}]", + "c28802f8d7f5a40cb9f17cace202e59f": "Erro de consulta, {}", + "11c99562b6212de14ddf1dcb06ea1696": "Sem tarefas na FILA {}", + "94f33212bde1cd76797fe4fe78b2167f": "Atualizar composer de {} para {}", "e7e807310035d5b348cbf55c28df2968": "Obter RAM do worker Falso", - "dc2e22fb7940c00998017d342198a9e2": "Obter Uptime do worker Falso", - "f5332a2b815ca2e09f3e658e8c81a282": "Obter Tempo de Reinício do worker Falso", + "dc2e22fb7940c00998017d342198a9e2": "Obter Tempo de Atividade do worker Falso", + "f5332a2b815ca2e09f3e658e8c81a282": "Obter Tempo de Reinicialização do worker Falso", "2d052af48937c6a8916f84a9a5d2a5e1": "Obter data do worker Falso", "6880f4164c935867cecf3a89e8ac01ce": "Obter detalhes de tempo do worker Falso", "a3589163c43210f6d8f52f6a2d46823f": "Obter reqpersec do worker Falso", @@ -1525,230 +1755,44 @@ "d1448a41deace3e0a5cb3555cee67b97": "Obter TotalKBytes do worker Falso", "1bdd788c6927c1fd0420ca6e2316642e": "Obter BusyWorkers do worker Falso", "f656a1e1c80cdf1eb1c63d3a0b121a65": "Obter IdleWorkers do worker Falso", - "dd2b16eb608e5838d556598d479e9264": "Aguarde o início da restauração", - "9bb70ddd7b082fbaafb0b47a989b5cf5": "Falha ao obter fuso horário!", - "38f40438a6c7e12eca9b4ea2ad297b3e": "Definido para o topo com sucesso!", - "257ee5f5c18f04e3a83fd18b33babf08": "Por favor, insira o ID desafixado!", - "c6afe11bc7f565bb0a423883101ce67f": "Consulta falhou: ", - "403470819fb903a95a8fd9a22b01a3ee": "CRONTAB_MES", - "7207ebce07676b20d98ec74a0ff65c77": "Executar uma vez por dia às {}:{}", - "4f4ae97ac3a0f45ef67bda70d5e4fe0b": "Executar uma vez a cada {} dias às {}:{}", - "82dccd8eb88a5611e453cbf6f25fa90f": "Executar uma vez a cada {} minuto da hora", - "a84b2e49920d839395e3f93812f9ac03": "Começando às 0:00 todos os dias, executar a cada {} minuto de {} horas", - "41924db412ce09aa5ef5c9f1f9c88ee8": "Começando do minuto 0 de cada hora, executar a cada {} minutos", - "45abd276fba3519ea010cb5b3c44a484": "Executar uma vez a cada {} em {}:{}", - "06ce21d9c603152315f749e19fab3148": "Executar uma vez às {}:{} do dia {} de cada mês", - "f2fc5ae4c94a95a754c58b15197bc135": "Executar a cada {} segundos", - "eb8cb9c97e5888beefc46d6c0645ff4f": "Inicializar e executar uma vez", - "7b9732c358c4e407030aca56ccb7a72b": "Nenhum dado foi encontrado para a tarefa agendada correspondente. Atualize a página para verificar se a tarefa agendada existe!", - "b55a6e4ebb6e988c6d46840ca6cc3315": "Não foi possível gravar no arquivo, verifique se o fortalecimento do sistema está ativado!", - "fff2eb19d097654514fc97c4a6e6d233": "tarefas crontab", - "64e1288887b58a1c65d05676f7197477": "Modificar o status da tarefa agendada [", - "ef1a7595dfa94a12b47bb18d3ac94313": "A tarefa agendada com este ID não existe", - "1844e0f52715901c376dca67e5742aa9": "Falha ao gravar tarefa agendada, verifique se o disco é gravável ou se o fortalecimento do sistema está ativado!", - "5a7b17945b660284bb813be218c04c71": "{} Falha na configuração", - "5e7205744bd38904dcbc7c0b77456fc7": "Excluir {}", - "140fb31d1756ae3c75b297f0c17f8b24": "O nome da categoria não pode conter instruções HTML", - "e5e2e32bece629fcba864f7f5e8df60f": "CRONTAB_NOMETAREFA_VAZIO", - "f3b898619b284003475f2039ce53968c": "Tarefa planejada modificada com sucesso [", - "72a21489a541757ee98b54790e5f431f": "Modificado com sucesso", - "92f1227778f186dd8c5f6cae42f5285a": "Tarefa agendada adicionada com sucesso [", - "e55c44fbd41784b7731f71e2789cad65": "ADICIONADO_SUCESSO", - "5a3c3438dbcadf4a0d59858f17a8522f": "Logs de tarefa estão vazios!", - "e8ab4d6107eaf37c98f250be20f146e1": "Logs de tarefa esvaziados!", - "a0d347c48839cab209fa3827c667a5c8": "Excluir tarefas agendadas", - "46039515107ea576bdaf75935b8b5f0d": "Excluir tarefas agendadas: {}", - "a3c72de16808f111cbe7e4c6dacc401b": "EXCLUIDO_SUCESSO", - "d5925f01eeb5596fed21f5dae6ffed30": "CRONTAB_TAREFA_EXEC", - "72bf657fef1eeafa1c8ecde5e4c06405": "Falha na execução da tarefa! Nenhum registro de tarefa correspondente encontrado.", - "8804f9a6882b09397bbc0599ba59b7ca": "Falha na execução da tarefa! O ", - "e9ca7bae70907408382135107fb85a13": "Download falhou!", - "272892ac18608e0a1ad6bf080afd2e51": "Limpo com sucesso!", - "06511118622e143af60d10d0877c9a3d": "Falha na limpeza!", - "424a90061acbe105658b97a0d86a4de2": "Por favor, insira o nome do arquivo!", - "14854122a7fb5958664a8d840dc0bead": "Por favor, instale o armazenamento webdav primeiro!", - "a027ff0717f56bf016b2f023d92e0c32": "Nenhum arquivo correspondente encontrado, faça o download manualmente do armazenamento em nuvem", - "f7314eff61e017245b088eecfee0c418": "Objeto de armazenamento em nuvem não inicializado corretamente!", - "a09c248c44ca9548bce41bc3e79b400d": "O arquivo não foi encontrado no armazenamento em nuvem!", - "9b23d05e4cb1d3ee22dd3dd7212817ab": "O nome da classificação não pode estar vazio", - "fade4a03622ee745aaf87044d697203f": "O comprimento do nome da categoria não pode exceder 16 dígitos", - "c875cf8f63d81c7fb198018d5c4bfa79": "O nome da categoria especificada já existe", - "f66442d89b8c613c082425a93b417695": "A categoria especificada não existe", - "caf573e6b4299b7f60e24635b0295e9d": "Categoria excluída", - "9133e7faf0b9fc202294e495163b1ced": "O nome não pode ser alterado para o nome de classificação de tarefa padrão do sistema", - "a3ee2a93b0a298de033ca1b784f62f04": "Não pode ser definido como classificação do sistema ou classificação padrão!", - "f300a6ee81c71057acc7beecdaf472c7": "Configuração bem-sucedida!", - "290435bc045f16e4d099d721b7f706c3": "Falha na configuração", - "8d49c76279564d3127e45cae01976d37": "/tmp/cron_task_data.json", - "d7ee2f4d054a35aab002985b80644f24": "Falha na exportação:", - "1cd20eabfaa5ad5793b4075f976bf475": "Não foi possível analisar o arquivo JSON!", - "205904d76b14dbdb456fc2a2997ba5b1": "O formato do conteúdo do arquivo JSON está incorreto!", - "f63f66d08d61a3b16c11e0dfce9510e1": "Importado com sucesso {} tarefas agendadas", - "414522bb8a68d31211190865a1cefdd0": "Por favor, escolha importar o arquivo!", - "8342696568c9b58f16cf29e2492cddea": "Falha na importação! {0}", - "51b34794854788b7e5eb8c3a8fab0242": "Por favor, passe o parâmetro de tempo!", - "860f363ecfcf11c8740b9068152b910c": "Desligamento temporário e fortalecimento do sistema bem-sucedidos!", - "acbe969acf9b4925e963f102f3430f84": "Falha no desligamento temporário do fortalecimento do sistema!", - "14a7c9c4ed221e7b3234de80bb8b9ef9": "Corte de log ativado com sucesso", - "15af2c7a6a5766d84ad8c57c5d2fb0dc": "Corte de log fechado com sucesso", - "636cccf0b373acec35770f9f26710396": "Falha ao ativar corte de log", - "bd6df8255e394034ebcf93fcebfe06d3": "Aquisição falhou:", - "90a80c8e64ee80e8577c44699b6faa7b": "Falha ao criar tarefa agendada {}, verifique se o fortalecimento do sistema está ativado ou a condição do disco", - "796b4f2a019427bc554ef1166faad8aa": "Fechar com sucesso", - "f222f6f9531a00476e39863b53bcde07": "Falha ao abrir", - "52d812a7c0b57b35fac4e668122191a3": "Falha na execução do script", - "f804ceef9dd122e198f13357be514e41": "Backup Automático de Banco de Dados [TODOS]--mysql", - "26e64121956b9e7e55244a508f146864": "Backup Automático de Site [TODOS]", - "a499f309ac7a223d611d7a0a85900342": "Nenhum registro de reinicialização encontrado.", - "d23fb11ea541cd5f1c0b05851d54fd58": "Marcado como lido.", - "c77d5ef44d6a21abe99c3e370a0f5364": "erro de parâmetro: coupon_id", - "1cb4143e9dbb7515e606ab6854578a00": "erro de parâmetro: cycle_unit", - "2121d979fb82aae9f0a62572bf36217f": "Falha na solicitação de interface ({})!", - "287e14ef978fb00ce99942e799c36649": "Parâmetro limit_time ausente ou parâmetro não pode estar vazio!", - "8feb15ff2883086bba98d9d791d10bf7": "O tempo não pode ser menor que o tempo atual!", + "f5fa57ce44938aa510e6cb68bd52c24b": "Sem arquivo de log", + "1bb87a5feb9e217c858933afdce8f4e7": "O arquivo de log é muito grande!", + "21290da79237752afe963ecef5d89b5a": "Início da varredura bem-sucedido", + "8e0e316031928c8c96c94ad6d57bd03e": "O diretório não foi varrido", + "9208374e1391bb886971bad99b2380f1": "Tipo incompatível", + "580d97d0b321127650cf1901cc3524b2": "Registro não existe", "b4e82db400aed46c6a1d61b93ff20f0f": "Falha na conexão: {}", "aa40ceff8d69dc0bf2a3887e2d5c778c": "Falha na conexão: {} {}", "69ee350f3262c97f7e3f35cc66443942": "O módulo paramiko não existe e a instalação falhou!", "d580ca3289757bd32c3e11df44ccea78": "Senha ou chave privada não podem estar ambas vazias: {}:{}", - "dfdc7c6d010fa7d486ab5c61159450f": "Tempo limite de autenticação esgotado, pressione enter para tentar novamente!{}", + "df9dc7c6d010fa7d486ab5c61159450f": "Tempo limite de autenticação, pressione enter para tentar novamente!{}", "05d673d467b6e721ff5ee92b285e5072": "A verificação da chave privada falhou, a chave privada pode estar incorreta ou o tipo de autenticação de chave privada ssh-dss pode não estar ativado no arquivo de configuração /etc/ssh/sshd_config", - "cae18886e1496f99e56fe64dae2a0947": "Falha na autenticação, verifique se a chave privada está correta: {}", - "7e850998d3cb8c4dc8b204766721e846": "Conta ou Senha incorreta: {}", - "dfd29171bd018b7352abb2cf085404fd": "Nome de usuário ou Senha incorretos: {}", + "cae18886e1496f99e56fe64dae2a0947": "Autenticação falhou, verifique se a chave privada está correta: {}", + "dfd29171bd018b7352abb2cf085404fd": "Nome de usuário ou senha incorretos: {}", "8a857e7b7b8835de19ffb7404445b30f": "Tipo de autenticação não suportado: {}", + "1fe35be7f4e10cbb7f972445cc8209fa": "Conexão bem-sucedida! {}", "8f4a5b1853e2c68682303a3ac016e97b": "A importação foi bem-sucedida", "bb07cf4e0082f6181204bf785e625924": "A importação falhou", "4e19c797e19c111b1fad1470cc2c18e3": "Não há comandos exportáveis", "bd35e8b82c9450d88a62a318773a2244": "A exportação falhou", - "e9a08443260e6f3b795eb57419a6ad77": "Falha ao vincular ao armazenamento em nuvem!", - "66924214c228f7eb631ac940281c7190": "Configuração bem-sucedida", - "d55e6e0c13df775ea0eabea4f36ff8da": "Por favor, ative pelo menos um comando e firewall", - "322d678e45d68284d90503f36da32648": "A operação foi executada", - "26eaf477d247c668a143b415491995dd": "Seu endereço IP atual [{}] não está na lista branca.", - "c26b7075352954fb3e96fbe983dbd083": "Seu endereço IP atual [{}] está na lista branca.", - "f9cfac18ac1fe92adcc47b139d0617a8": "Falha ao adicionar", - "bf31291dfc89be9a8af12c3fa15e7e4d": "Operação executada", - "71a1c5f19c8e300d350f5f68c71e4559": "Falha na exclusão", - "01f144a7cfd324d0dab94f8aa6e29374": "Excluído com sucesso", - "749707db319ac2fa02785c1bdb58083b": "ERRO: arquivo de configuração sshd config não existe", - "80b695b495da54ed6a76eac8a965bc7b": "Alarme de login cancelado com sucesso", - "40d3b22b13a0b11ed727aa257e2228c0": "O canal de mensagem não está instalado", - "87597848076b873c1a9bb9ffea64950b": "Erro: arquivo de configuração sshd config não existe", - "bdb119e343438b628e7ba8b20e4632ed": "Erro: sshd config não existe", - "45de64a88b25b6527ccd3efbce76ed3b": "Erro de passagem de parâmetro", - "387e90104fbc0261c1ae5db9443f0b22": "Definir o método de login root como: {}", - "0fd775e0a957d247e199d2cd911078e8": "A senha não pode estar vazia", - "2279ae228c06ace23e59cc218f2536f8": "A senha não pode ter menos de 8 bits", - "207d2e497f2ca0d97f1453671d4d824a": "O nome de usuário já existe", - "e1c5fbbb3782936fa209244fcc62ea7e": "A senha deve conter letras e números ou símbolos", - "4c94c49ecaebd37c52172946778fc296": "Falha na configuração", - "492478fa7955b2282528aefe56d42ec4": "Perfil não existe!", - "71804f43c7fe50a625e9fd1f930365ce": "Falha ao obter da nuvem!", - "46fb7ccd0be31ec840d524d8f99f1368": "Atualização concluída!", - "d631f73db41ac42021c522b61fba3274": "Não há necessidade de atualizar!", - "11ce17a8cf1f195a0687c00fc4201d2f": "Importação bem-sucedida!", - "d49c4e6f0a63eb94dfb921be5d804e8b": "Site não existe!", - "0b5efcfb8a290faab14ebce65ece59e7": "Diretório raiz do site perigoso!", - "d747c3e10f8c5fd5c0aec8b422883292": "O pacote especificado não existe.!", - "22e806afb25ddcb6cf205be320eb2350": "Não é possível encontrar [Arquivo de Configuração de Implantação Automática aaPanel] no pacote de instalação", - "7658d0092e96ef38859c12f2a91f641f": "Não há tarefas de implantação no momento!", - "f5fa57ce44938aa510e6cb68bd52c24b": "Sem arquivo de log", - "1bb87a5feb9e217c858933afdce8f4e7": "O arquivo de log é muito grande!", - "21290da79237752afe963ecef5d89b5a": "Varredura iniciada com sucesso", - "8e0e316031928c8c96c94ad6d57bd03e": "O diretório não foi varrido", - "9208374e1391bb886971bad99b2380f1": "Tipo incompatível", - "580d97d0b321127650cf1901cc3524b2": "O registro não existe", - "152b976545ff1ee50e0de21da7af1266": "A verificação está em andamento.....", - "e6a6fa2d0bcc8bfc2af5bcd4640ade03": "Verificação de parâmetro", - "80f9a0a476836be5fdec10fe414e88a9": "{} O site está sendo criado....", - "064aa7114f7c7430dcf2b0cdc05ad20c": "Criar site", - "8a9535f05c52e58f46e3237b9da019cc": "Adicionar configurações opcionais: banco de dados, FTP", - "b7575e63439333749c6e7d6a27b8a0e4": "Adicionar configurações opcionais", - "2a5e8b7e4116ee81db89ba173f60bf90": "Falha na verificação de parâmetro", - "2f35a151cc0256f0d9ad5410eccbe5d0": "Falha na verificação de parâmetro: {}", - "af2a8e2174ea327f9fbf77d84029d58b": "Verificação de parâmetro bem-sucedida", - "181fc26e7b655ba36b3b075ca1ebc350": "Falha ao criar o site", - "7118aff13541bf3d74a9c47fb458e102": "Falha ao criar o site: {}", - "be33773093fc2e135ba4bc26f4bb5509": "O site foi criado com sucesso", - "505a83f220c02df2f85c3810cd9ceb38": "Sucesso", - "8d823a9933eefd02bf1003481f816f64": "Falha: {}", - "e7b3deb11aabca0f7ae217ccccd10772": "Inicialização bem-sucedida!", - "31b88b436695f7e0bc5dad1cb8999737": "Não use as portas do serviço do painel!", - "d0d4ff47e6dc25f0069a1d74d2f995b4": "A porta está ocupada ou o intervalo de portas está incorreto! Deve estar entre 100 e 65535", - "7dde7f2ae7cb4ed56b1b683b479ad303": "Aviso: a versão {} ainda não foi instalada, ", - "839067817c5a1e7fcce2f905284d630e": "O diretório de origem de reescrita e o diretório de destino de reescrita devem ser preenchidos ao mesmo tempo", - "4b6ad864ce62dac8466dde7ec62e7ea9": "O diretório de origem de reescrita e o diretório de destino de reescrita não podem ser os mesmos", - "ed6fe3e47d3686c7af83b67535b426b5": "O diretório de origem de reescrita deve começar com /", - "8230eb6af0c1c2863c0c2f6bfaa9b37e": "O diretório de destino de reescrita deve começar com /", - "fa5e4af74d3d68ba371e6dcf84595c3d": "O site não existe", - "45f9a99535dea651b8f160f6cf23f826": "Falha na leitura do arquivo de configuração!", - "5e3b84200bea6d70f6fed1d5802a7fa0": "Consulta falhou, endereço não existe", - "5fa721871e93bc4121df74ce51454519": "Falha ao ativar o plugin, tente novamente mais tarde.", - "9f139adb77c26c263ff2a956d66f80fe": "Falha ao desativar o plugin, tente novamente mais tarde.", - "f8e169b0ef8d58f84c71e375141852ed": "Falha ao criar Conjunto", - "e35ca748f8c5a0e78731bae94fb7d68a": "Falha ao remover Conjuntos", - "468baaa7179c8b181d1de35fa00267e9": "Tipo inválido de itens de Conjunto", - "a01e808b2be07634b0e3714bff919ae1": "Falha ao remover itens do Conjunto", - "35c9b2817b191a3f60553d46b748068b": "Falha ao alterar o estado dos itens do Conjunto", - "87a9a388a3ef42018ceb866756c4ee39": "Falha na conexão com o banco de dados, verifique o status do banco de dados!", - "73b1d7767613c6300db27ade773369fa": "Falha ao remover site remoto wordpress", - "a75c113f53d4342010d140325fa29eec": "O multiserviço do site foi ativado. ", - "b0a517b4d596e5fc1351f8dc12e73a74": "Selecione o serviço retido", - "7e953c855b391ac0716a4eeb47c5c5c3": "Por favor, ative vários serviços primeiro", - "55d523aa501b0e7e93e172a9e6829a8a": "Erro ao obter informações da versão nginx", - "08f18bb6c6293307f68d5f822ed7dbe1": "Atualmente, openresty não é suportado", - "45020a62e40bbb43f6e05c62ad50288e": "Já existe uma tarefa de instalação. Aguarde a conclusão primeiro!", - "4052df86d5a8dd12943cc8b1d53162e4": "Falha na instalação do serviço. Por favor, tente novamente!", - "8033c09e6fedf841205b29b57c0ae0d1": "Falha na inicialização do serviço: {}", - "442d02a722dc331f8b85d328fb99a174": "O modo multiserviço foi ativado com sucesso", - "a0b289e4caa220dcd62692401d5083f5": "Falha ao desinstalar o serviço {}. Por favor, tente novamente!", - "0045406cf97cbdca708c795aa9554145": "O serviço {} falhou ao reiniciar. Tente reiniciar manualmente ou verifique o arquivo de configuração.", - "52cd203105425f66daf42d81f05c540f": "O modo multiserviço foi desativado com sucesso", - "9c116a9cbc0701ec9e9d6b6ab2755fc8": "A reinicialização do serviço falhou. Verifique o arquivo de configuração do apache!", - "a949ed64edc73a99f9f9c801a84b6390": "O tipo de serviço especificado não existe", - "408f206d494c5f26144f7492315dfa21": "Ocorreu um erro ao alternar serviços em lotes!", - "e9fd26be1a67520e66f2e99d61977c32": "O ID do site não existe", - "d80972d5dfb46c1f11b8dba2b7aa04d3": "O serviço atual do site já é {}", - "99914b932bd37a50b983c5e7c90ae93b": "{}", - "2422c065bd4ef8d950bbf17c43f907dc": "A modificação da configuração falhou.", - "98e762d03fc5ffcb381010aff10c7bde": "Alternado com sucesso para {}", - "293f667205bd8aa91c72f966c03c3de5": "O tipo de serviço de site obtido está incorreto", - "8562d96fc303411ee017a30b83d75712": "Reparado com sucesso", - "d9d76120c8c13b40d2e8e49b0d6117da": "Ocorreu um erro no multiserviço e o reparo falhou. Tente fechar o multiserviço e reabri-lo!:{}", - "e1b5191ef3dd64eaba9ab3c787d1fa67": "O arquivo de configuração não existe", - "c8622023712105e9e7328396976a2667": "O arquivo de configuração de backup não existe: {}", - "d81f83ae44da0682974272b976e8e550": "Recuperação bem-sucedida", - "12572c9827392d4bd4c028881ed06242": "Existem conflitos de proxy global ou reescrita de url no site. Por favor, exclua-o e tente novamente!", - "92bce01ab77d0d50efec1d424cab583b": "Este site tem um proxy reverso. Por favor, exclua-o e tente novamente!", - "30c74a0981da2edec86936cd288479f7": "O site configurou um proxy reverso global. Por favor, cancele-o primeiro!", - "c3fe8f7adf26d613d9593acede34303b": "O site está configurado com vinculação de nome de domínio de subdiretório. Por favor, cancele-o primeiro!", - "c601909c952f2064e91d6f3c1d1a7128": "★iniciar backup[{}]", - "890b5b1ca2b1aa96f0781c9fdc77ab88": "☆o backup está completo[{}]", - "5316694cae24d434370be2d76146a500": "|-Erro:{}", - "b763e7e9f6b23d4b5066458506d26d55": "Falha na execução da tarefa de backup.", - "713660262f5ab9c3af9aa17c8d8a412c": "Backup para ", - "de5ac4bddf9b72b649c0cbd4243f76c6": "tente novamente após alguns segundos... aguarde...", - "6905a88552caae6df77f56bd19f6d76a": "Configurações de tarefa Cron mantêm local. Backup local é mantido.", - "63701b3fa795bcd399aab5d489f8eae9": "Configurações de tarefa Cron não mantêm local. Backup local não é mantido.", - "837cc24a222df21e74245f4cfac6ad09": "Configuração do usuário para não", - "57d4380c974a85fe8db5914c934addf4": "A tarefa agendada não existe! {}", - "038ae15d38f9f027abda2aabf18324ab": "Manter o número mais recente de backups: {} cópias para {}", - "58c65e272cfde6fc8cf73d0ffcde4bbd": "Enviando para {}, aguarde...", - "243c0f3ec002883d6fa7770957ecf9bd": "A tarefa agendada não existe!", - "78df833c741b9814545d76a83f2db9b5": "{} Banco de dados de backup {} não existe", - "472f0ed974a6a2aec9b70fe7d39b27ee": "O MongoDB ativou a autenticação de segurança. ", + "3f8ee4f649b32e181c15c39682629844": "Usuário [{}] existe!", + "b23886f3380c4a9500a7614474ff6bf8": "A senha deve ter pelo menos [{}] caracteres", + "f20eaf62a87c2072f7c09ec70a6b90c9": "Erro de exclusão", + "9607dbc43fb07121ebd102497290c15b": "{} Usuário FTP falhou!", + "8b73e5696a44d470ee99c274152c1b54": "Porta[{}] está sendo usada!", + "384169bf557e2785a74c6ab4c8ca0d9c": "Erro de edição", "8a09aa6b7131f71b3ba97f13d5b7823f": "O número do pedido especificado não existe e não pode ser renovado!", "72905fe72d071dffbc0c1a20eb8def87": "Nenhuma informação sobre este pedido foi encontrada.", - "0b033e06e17e9fb14f93e6f11eed6599": "O pedido expirou. Por favor, solicite novamente!", + "0b033e06e17e9fb14f93e6f11eed6599": "O pedido expirou. Por favor, aplique novamente!", "3497d17853f8a84d0b552dcea4fabad2": "As informações deste pedido não foram encontradas.", - "972f14a9afdebc7e5b366f465171776a": "O pedido expirou. Por favor, solicite novamente.", + "972f14a9afdebc7e5b366f465171776a": "O pedido expirou. Por favor, aplique novamente.", "1008d1a5b18463e45c0bdb930bc0087c": "Este certificado não foi encontrado.", - "2e95d6e834bed89e1e199808d0cfd8aa": "Especifique o diretório raiz do documento do site no parâmetro --path!", - "4a8d983505848031c77a15c408cd1f3e": "|-Tentar novamente o comando", + "2e95d6e834bed89e1e199808d0cfd8aa": "Por favor, especifique a raiz do documento do site no parâmetro --path!", + "4a8d983505848031c77a15c408cd1f3e": "|-Tentar comando novamente", "ed069811f3c302d22a0f4aafc6903826": "|-O usuário abandona a aplicação e sai do programa!", "daa9a175b001e007de4d7ca89ec19aec": "Tipo de nó inválido: {}", "abb41b16dcebff17c55d75000fe3cabf": "Automação inválida", - "e9d2603582f4a20d640b8e7d3b3e08b7": "Não é possível editar a automação no estado de execução.", + "e9d2603582f4a20d640b8e7d3b3e08b7": "Não é possível editar automação em estado de execução.", "d2fcac4ec8e0f366bff10d45d37bb3d3": "automation_id inválido: {}", "d171abccfa056d262e7e081b84510c4f": "Automação inválida: falha ao carregar gatilhos", "ae3ff0ee4b1a6c1dfe230d9b15a4d4a0": "Automação inválida: gatilhos incompletos", @@ -1756,111 +1800,109 @@ "0fdf6b21eacd19ce746639f1c4613607": "end_time deve ser maior que start_time", "18fc7ff48f030eda26c7446cdccd441d": "dados inválidos", "dcb3fc2a35a17abb01744383ebf3cdc4": "dados inválidos -2", - "7122d35c3532d63c8d9fc5c5bd320558": "Falha ao obter lista de pedidos, tente novamente mais tarde!", "079217f7bb63fed72af9bb79048e3967": "'*", - "b3248ad84a12659b1599607f969741a0": "A permissão CloudFlareDns deve ser ", - "0ad00e6c415af62cdaa8537c32574052": "O alias já existe!", - "9c82954b2bf15dc7a9462145d9782aac": "Por favor, atualize para a Versão PRO!", + "b3248ad84a12659b1599607f969741a0": "Permissão CloudFlareDns deve ser ", + "0ad00e6c415af62cdaa8537c32574052": "Alias já existe!", + "9c82954b2bf15dc7a9462145d9782aac": "Por favor, atualize para a versão PRO!", "3a306f42856e51481470e9702cc22169": "Salvo com Sucesso!", "9758ed50c1e1816e1eecb98e0c3ed1ec": "Excluído com Sucesso!", "4b9f49d0625305474bd478ed077bba0b": "id é obrigatório", "615df74f7d5141a1084369b9da4ccb4a": "Provedor não encontrado!", "4a9382b97abdf8cb5b237bf7d64873e2": "search_and e search não podem ser usados ao mesmo tempo", - "7d7d9ba1a8780278b2a05b91eacfb2e7": "Registro DNS não encontrado!", - "8d49c4cd608eaa6d8d9a1e0ab6658fb4": "Provedor de DNS não encontrado!", - "79922b861a42a4e2350f69501eb25ca0": "Registro DNS não encontrado!", + "7d7d9ba1a8780278b2a05b91eacfb2e7": "Registro DNS Não Encontrado!", + "8d49c4cd608eaa6d8d9a1e0ab6658fb4": "Provedor DNS Não Encontrado!", + "79922b861a42a4e2350f69501eb25ca0": "Registro DNS Não Encontrado!", "39b361ca64471b92b1b1e84dee7d5226": "Atualizado com Sucesso!", - "84e9feba40d0aed963505e503cf821e3": "Falha na Atualização...", - "8ef6a7854d197b829e350936856847fc": "Certificado SSL não encontrado!", - "02d59ec01b27b9b07cc92b56b4590690": "O certificado SSL tem menos de 30 dias, não é necessário renovar!", - "c85411871b8773e799e64d0c23ef79d3": "Pedido não encontrado!", - "9dd5fcad400ad7db65baa55be5535d94": "Solicitação bem-sucedida!", + "8ef6a7854d197b829e350936856847fc": "Certificado SSL Não Encontrado!", + "02d59ec01b27b9b07cc92b56b4590690": "Certificado SSL tem menos de 30 dias, não precisa renovar!", + "c85411871b8773e799e64d0c23ef79d3": "Pedido Não Encontrado!", + "9dd5fcad400ad7db65baa55be5535d94": "Aplicado com Sucesso!", "3f5a9a220cd8c53770c59c4931beb2be": "auth_type deve ser ", "4fadb14ca725c013569fc00385d750fd": "domínios está vazio", - "2a6bb1bdd798217656edecf672b6df3c": "Erro de verificação Http01, mas o site não foi encontrado.", - "962682f10423a33a75f4b1277b3690c9": "Erro de verificação Http01, mas o site não está em execução", - "fdbdc3e70ef01cae6ba7f67b34622aa1": "Tipo de autenticação desconhecido", + "2a6bb1bdd798217656edecf672b6df3c": "Erro de Verificação Http01, mas Site Não Encontrado.", + "962682f10423a33a75f4b1277b3690c9": "Erro de Verificação Http01, mas Site Não Está Rodando", + "fdbdc3e70ef01cae6ba7f67b34622aa1": "Tipo de Autenticação Desconhecido", "52357aa86932ebcc9ff6e741ef6244b5": "falha na atualização do certificado", - "2e54bae7cebff2ed29eee92ee852cf0f": "Certificado SSL não encontrado!", + "2e54bae7cebff2ed29eee92ee852cf0f": "Certificado SSL Não Encontrado!", "022c6efa50cd0022ffa66b42f08caadc": "Removido com Sucesso!", - "9ecbde266be14f2c038c06f339f7ee46": "SSL não encontrado!", - "9bb50ed8d9b14f51d1a44a423db43e6e": "Configuração bem-sucedida!", - "049734a8ec5a38304b7e0dff089b05fe": "Implantar Correio", + "9ecbde266be14f2c038c06f339f7ee46": "SSL Não Encontrado!", + "9bb50ed8d9b14f51d1a44a423db43e6e": "Configurado com Sucesso!", + "049734a8ec5a38304b7e0dff089b05fe": "Implantar Email", "6df4bb58ee6967a48b38e093858091de": "Implantar Conta", "ec220f32ceb0ad39d785439e3d442464": "Implantar Painel", - "7f689dbbf6341be1e07e8e96d16b95db": "Domínio curinga (wildcard) não é suportado!", - "2ac3f96d3c4f34f9ab7627bf5f1fb444": "Domínio inválido!", + "7f689dbbf6341be1e07e8e96d16b95db": "Domínio curinga não é suportado!", + "2ac3f96d3c4f34f9ab7627bf5f1fb444": "Domínio Inválido!", "8346bf5e43bfb945866b734da5e365fb": "domínio está vazio", + "7122d35c3532d63c8d9fc5c5bd320558": "Falha ao obter lista de pedidos, tente novamente mais tarde!", "f53f8d0c6e47f742892e21dc6d0ffcba": "Firewall não inicializado.", "7aa738bc7717148a9518c0d37e0bdcc2": "instalado.", - "10cf4b73623a047cd8c039899a68678f": "Firewall não ligado.", + "10cf4b73623a047cd8c039899a68678f": "Firewall não ativado.", "f2ec5e710cf0c84fd474abdc993360e8": "Tarefa de inicialização do firewall criada.", "98dd43dfae05b11befe1f140e0ec787a": "Instalado", - "032c6f0f72bf846bf80205f83cfbbfdf": "O nome de domínio de destino não pode estar vazio", - "d3e42cf08c9dd4657e1ec738bcd7fa4f": "A porta de destino não pode estar vazia", - "2e983c6be925499dd08a349a82f9e215": "O nome de domínio de destino está no formato incorreto", - "2101cff923c114c46970531cebe61e9c": "Nome de domínio: 【{}】Falha na resolução", - "484a79b99ea7c89818e54bc86611e0ab": "Por favor, passe o id", - "8bc83520b9c5e0cb6a83e1cf6961cfdf": "A configuração foi bem-sucedida, mas as seguintes configurações de regra falharam::{}", - "373ee51dfa98aab065593b352f395b59": "O endereço de destino está no formato incorreto", - "26fe283bcf5841270188165305b2f876": "O endereço de destino {} já existe, por favor não adicione repetidamente", - "4b8abdf7e8565603bc0b09534e1c53aa": "Por favor, ative o firewall antes de configurar as regras!", - "50c7672327d3879977f1672bac1ee999": "O IP de destino não pode estar vazio", "b9c6715ad1caf1dd7f933c42ab63707a": "Por favor, passe old_data", "842a116f755d53aacda61c8d5b90125e": "Por favor, passe new_data", "edbe2ffb112ecc945237a594ab786679": "A modificação foi bem-sucedida", - "f94b62cff0c45cb08b61da3ca2615d72": "O arquivo não existe", + "032c6f0f72bf846bf80205f83cfbbfdf": "O nome de domínio de destino não pode estar vazio", + "d3e42cf08c9dd4657e1ec738bcd7fa4f": "A porta de destino não pode estar vazia", + "2e983c6be925499dd08a349a82f9e215": "O nome de domínio de destino está no formato errado", + "2101cff923c114c46970531cebe61e9c": "Nome de domínio: 【{}】Falha na resolução", + "484a79b99ea7c89818e54bc86611e0ab": "Por favor, passe id", + "8bc83520b9c5e0cb6a83e1cf6961cfdf": "A configuração foi bem-sucedida, mas as seguintes configurações de regra falharam::{}", + "373ee51dfa98aab065593b352f395b59": "O endereço de destino está no formato errado", + "26fe283bcf5841270188165305b2f876": "O endereço de destino {} já existe, por favor não adicione repetidamente", + "4b8abdf7e8565603bc0b09534e1c53aa": "Por favor, ative o firewall antes de configurar as regras!", + "50c7672327d3879977f1672bac1ee999": "O IP de destino não pode estar vazio", "0976b2102c7a8af33f04ab2059e997ca": "O conteúdo do arquivo é anormal ou malformado", "774b94869c0844749626b1bf637fafbb": "A porta de origem não pode estar vazia", "e9b371dd7b29cd7373c524d880b031fe": "Se a regra já existe, não adicione repetidamente", - "13bd44b7e23ee792948ec122677bf1b3": "Falha ao configurar regra: O endereço IP não pode estar vazio", - "7f6cd3026825eae0d35775a932e0fb46": "Falha ao configurar regra: Endereços IPV6 não suportados", + "13bd44b7e23ee792948ec122677bf1b3": "Falha ao configurar regra: endereço IP não pode estar vazio", + "7f6cd3026825eae0d35775a932e0fb46": "Falha ao configurar regra: endereços IPV6 não suportados", "bbc83d63860d8fddbe9b5f0769f8d108": "Falha ao configurar regra", - "52de0a29b9e9289bd6598a5d4610774f": "A configuração da regra foi bem-sucedida", - "40e79165af94fb353f73532550d50dbc": "O firewall atual do sistema é iptables e não suporta configuração de status.", - "7f643aa5c0ac22eb56b8e0283a245537": "O firewall atual do sistema é iptables e não suporta parada.", - "759cbd156929358f44fea3d7a2303d12": "O firewall atual do sistema é iptables e não suporta reinicialização.", - "9eeb5949442ea424abb29b42f4f3763d": "O firewall atual do sistema é iptables, que não suporta recarga.", - "6fe3c8f7481574a858f4c4e3dcb190b8": "Falha ao definir uma regra de porta:{}", + "52de0a29b9e9289bd6598a5d4610774f": "Configuração da regra foi bem-sucedida", + "40e79165af94fb353f73532550d50dbc": "O firewall do sistema atual é iptables e não suporta configuração de status.", + "7f643aa5c0ac22eb56b8e0283a245537": "O firewall do sistema atual é iptables e não suporta parar.", + "759cbd156929358f44fea3d7a2303d12": "O firewall do sistema atual é iptables e não suporta reiniciar.", + "9eeb5949442ea424abb29b42f4f3763d": "O firewall do sistema atual é iptables, que não suporta recarregar. ", + "6fe3c8f7481574a858f4c4e3dcb190b8": "Falha ao configurar uma regra de porta:{}", "cc84ff9fa77f59978d67ebe5c21c4cc6": "A regra de porta foi configurada com sucesso", - "5fb5bec15f0680c0f8281e2a77f01564": "Falha ao definir a regra:{}", - "202ed89223bc105db8c706695994099e": "A regra foi definida com sucesso", - "31bdde170e92eb68e5cf19070a0257b2": "Falha ao definir uma regra de encaminhamento de porta:{}", + "5fb5bec15f0680c0f8281e2a77f01564": "Falha ao configurar a regra:{}", + "202ed89223bc105db8c706695994099e": "A regra foi configurada com sucesso", + "31bdde170e92eb68e5cf19070a0257b2": "Falha ao configurar uma regra de encaminhamento de porta:{}", "14af00e29f1c7f276529a7f13d37bcf3": "Nomes de tabela não suportados: {}", "37859bf15c1d49002153157ecdd4ad45": "A configuração da regra falhou:{}", "9fcd0fb925f2f1f9fc5157a937c1527a": "A configuração da regra falhou: {}", - "9ef9f6bcb8cd56f9b4d8be162918810e": "Falha ao iniciar o firewall:{}", + "9ef9f6bcb8cd56f9b4d8be162918810e": "Falha ao iniciar firewall:{}", "afa08ad3f9767240b0219e668944beee": "O firewall foi iniciado com sucesso", "bc1ad4532116f7e179339e07a39be1a3": "Falha ao parar o firewall:{}", "50ac40822152a67e4195c04488aa7129": "O firewall foi parado", "c8b9e1198399365ab380361c761ab78d": "Falha ao reiniciar o firewall:{}", - "04105f039f2850a3472f9b79c7ae5111": "Recarga do firewall falhou:{}", - "2be1a57d150c047f0c5d936a904d884a": "Falha ao definir a regra de porta de saída:{}", - "af95b488978d644c7ef7b4b856def666": "A regra de porta de saída foi definida com sucesso", + "04105f039f2850a3472f9b79c7ae5111": "Firewall sobrecarregado falhou:{}", + "2be1a57d150c047f0c5d936a904d884a": "Falha ao configurar a regra de porta de saída:{}", + "af95b488978d644c7ef7b4b856def666": "A regra de porta de saída configurada com sucesso", "194fbdb576220abe3bc3ae3746af89a7": "Parâmetros de política desconhecidos:{}", "f006b06691ecd76b8a34e2825c17b6aa": "Estratégia desconhecida: {}", - "55bbeb07229c08c530c5119918035594": "A regra de saída foi definida com sucesso", - "8be2d40f6fa3e12c46ba68bfb23951d1": "Falha na configuração da regra de saída:{}", + "55bbeb07229c08c530c5119918035594": "A regra de saída configurada com sucesso", + "8be2d40f6fa3e12c46ba68bfb23951d1": "saídaA configuração da regra falhou:{}", "5d6e1e45c8d58b5f2800aabe961be7e6": "Serviço de conta não iniciado, inicie o serviço primeiro", - "9f570fb82d621c780cae5d4a3b7b21fa": "Iniciado com Sucesso", - "d6fd80e8f386ec01318ebbd911b3cb8c": "Falha ao iniciar", - "54b737c15ee80b356bed65d1e4bbdf11": "Falha ao parar", - "ca5ae41ecee3659791384fbb49c573f2": "Parado com Sucesso", - "f9458b55789fb6b79f107c061d9050e0": "Reiniciado com Sucesso", - "ce070d796c159496ab8253cc60891b9e": "Falha ao reiniciar", - "ca0431c082d8980ad8a7fbfff9a3cc4e": "Recarregado com Sucesso", - "f61bf123501eb5094cd6782409088c6f": "No momento, apenas o nginx é suportado como servidor web. Ajuste o servidor web para nginx primeiro e faça backup dos dados do site ao ajustar o servidor web", - "01b4fc496d491eed58270beca1664e66": "Falha no download do script de instalação", + "9f570fb82d621c780cae5d4a3b7b21fa": "início com Sucesso", + "d6fd80e8f386ec01318ebbd911b3cb8c": "início Falhou", + "54b737c15ee80b356bed65d1e4bbdf11": "parada Falhou", + "ca5ae41ecee3659791384fbb49c573f2": "parada com Sucesso", + "f9458b55789fb6b79f107c061d9050e0": "reinício com Sucesso", + "ce070d796c159496ab8253cc60891b9e": "reinício Falhou", + "ca0431c082d8980ad8a7fbfff9a3cc4e": "recarregamento com Sucesso", + "f61bf123501eb5094cd6782409088c6f": "No momento, apenas nginx é suportado como servidor web. Por favor, ajuste o servidor web para nginx primeiro e faça backup dos dados do site ao ajustar o servidor web", + "01b4fc496d491eed58270beca1664e66": "Download do script de instalação falhou", "b6bbb24d50175d3a920095caccfc8cc7": "A tarefa já existe", "22e6df6f7a837552a50ec27a63418a99": "A tarefa de instalação foi adicionada à fila de tarefas", "01545ec6a6d49b956f303f9ac0f7aeed": "A atualização foi bem-sucedida", - "f43df7708267595d8c8ee27cca2e25c7": "O conteúdo do certificado não pode estar vazio", - "749c4e1e3720c1aa28459dd4953cf782": "Verifique se o formato e o conteúdo do certificado estão corretos", + "f43df7708267595d8c8ee27cca2e25c7": "Conteúdo do certificado não pode estar vazio", + "749c4e1e3720c1aa28459dd4953cf782": "Verifique se o formato e conteúdo do certificado estão corretos", "5e6ddd918845e96916d903a667e65da6": "definido com Sucesso", "9aad9a87ef3911e202093b08b2f570ed": "fechado com Sucesso", "b4987b794be5974dd020719b9c1d0a41": "Endereço IPv6 não é suportado", "793f2b3ffa18b3513258114b0216cb7b": "Verifique se o endereço do host está correto, por exemplo: 192.168.1.20", - "af8d2d8e000adaed48feb1c1502cea6d": "Desculpe, falha ao abrir, vá para a Loja de Aplicativos --Anti-adulteração para Empresas para ver detalhes", + "af8d2d8e000adaed48feb1c1502cea6d": "Desculpe, falha ao abrir, vá para a App Store --Tamper-proof for Enterprise para ver detalhes", "e9f9d8e8358b9291af5e41417184ddd2": "Proteção de arquivo adicionada com sucesso", "c4faf633a3fd32e8b5d8138dbddc1693": "Falha ao abrir firewall", "5ebd3aeb7b2c96cf6c64f82bfa333f02": "Firewall aberto com sucesso", @@ -1870,404 +1912,438 @@ "55df5f27012531e176be79f81b90d779": "Excluído com sucesso", "785a530106a46c897769c1cf2df6c2f3": "Iniciado com sucesso", "274fbf19776d1b6efee0e71f075739cd": "Parado com sucesso", + "b9940e6be68b04502240b4d9dcadf31f": "Instalando...", + "402e7a087747cb56c718bde84651f96a": "Sucesso!", + "24742fdc8b10e0c22da043b82ec2d034": "Zona adicionada com sucesso.", + "7f3784e809f273b0b5c184bc54b9faa9": "Zona excluída com sucesso.", + "e844d65ff09d2632eac952b3aead39b4": "Servidor de nomes definido com sucesso.", + "6974e9e250b2c667198d058eea716a82": "Registro SOA definido com sucesso.", + "527c6f13367a6c6fe6eccafdcee477a1": "Logs limpos com sucesso.", + "1772fbb5207afbb9dbdc5ebbac4a1207": "Falha ao limpar logs.", + "3e529bb4952f89cfbcae3a72a246e629": "Registro DMARC adicionado com sucesso.", + "cb99ed01c97dce56abf2ec0b44861a63": "Registros DKIM/SPF adicionados com sucesso.", + "c29aa49e3d3d91c08b207563bad272f5": "Verificador DNS está Rodando. Por favor Aguarde.", + "324b9550f30c392158d06e38781f1d17": "Verificador DNS está Suspenso.", + "03b9251db02492d622c55683ef2ae6d1": "Verificador DNS já está Rodando. Por favor Aguarde.", + "70d8963372aa6cd19254cfdfce2150eb": "Verificador DNS Executado com Sucesso.", + "fdeec8a42f9bca6eb42c417d9da14d80": "Ação inválida.", + "cb9004d0406249266c644782d5446c31": "Todas as zonas corrigidas com sucesso.", + "af88c4ef2e220eba86b35140aba3b680": "Tipo de registro é obrigatório.", + "282e6a8a0bba12c773eeee76d800d34c": "TTL definido com sucesso para todos os domínios.", "81c5f87b76468dbe7a152121fee71663": "Não há logs redundantes para limpar", "12af24fd6d32854160728cffa4ea2150": "Nenhuma limpeza foi bem-sucedida", - "90b0ccf9b077f2cadeef3daaf17d86b8": "firewall tem {}", - "3d2fb8221a478c63e13b494d7279e2ac": "Adicionado com sucesso, {} A mesma regra existe para a porta e foi ignorada", - "fc66f87cb8d92e3caf13485d65ecc309": "operação bem-sucedida", - "9a321cf078154e6594a8a29fb7847738": "Por favor, instale o módulo dnspython primeiro", + "90b0ccf9b077f2cadeef3daaf17d86b8": "fire/wall tem {}", + "3d2fb8221a478c63e13b494d7279e2ac": "Adicionado com sucesso, {} A mesma regra existe para a porta e foi pulada", + "fc66f87cb8d92e3caf13485d65ecc309": "operar com sucesso", + "9a321cf078154e6594a8a29fb7847738": "Por favor instale o módulo dnspython primeiro", "2463904b74dc3ffd3fb849f87a0e3a3a": "O conteúdo do arquivo está incorreto!!", "7a3f417adbeb8a69180134c6f2373c36": "O arquivo está vazio!", "29b89ed8f1aa15665f877c12e0d14bac": "A importação falhou. O formato das regras está errado. Tente novamente de acordo com o formato das regras de exportação!", - "002827869c69ad72bc41ca442547bbac": "Cancelar ignorar regra com sucesso", + "002827869c69ad72bc41ca442547bbac": "Regra de ignorar cancelada com sucesso", "63ecd16effc3eab31bf1eec574ece639": "Desbloqueio bem-sucedido!", "eacd845def6fe750cfc0986f24565045": "Senha de login local está vazia", "fea087517c26fadd409bd4b9dc642555": "normal", "e1a4b8afc2cb3f56f0c98876c06d6d58": "Falha ao conectar ao banco de dados!", - "a18fb7f91f74b73e7326700913e7e35c": "O servidor especificado já existe: [{}:{}]", + "a18fb7f91f74b73e7326700913e7e35c": "Especifica que o servidor já existe: [{}:{}]", "079d7d1539d30a76e53b6fb54d370d32": "Adicionado com sucesso!", - "72bfbe1d7dd57250382b570043041e82": "Falha ao Adicionar: {}", + "72bfbe1d7dd57250382b570043041e82": "Falha na Adição: {}", "270b19b2e9da5da821c7b54a1a8d7fd6": "Erro de passagem de parâmetro, tente novamente!", "ffcba623cf91331a0ba5b3ab969db1f9": "Excluído com sucesso!", "43bf15425909c99f2cc1553eaffaf476": "Falha ao excluir: {}", "0947887a435eff51a71f1e54615af33c": "Falha ao conectar ao banco de dados [{}:{}].", - "844eea2c94a872941b4e4fe66c92c659": "Falha na conexão com o banco de dados [localhost:27017]!{}", - "90b65217be3c698d9b1fbff0dccdc71b": "O serviço Mongodb ainda não está ativado!", + "844eea2c94a872941b4e4fe66c92c659": "Conectando ao banco de dados [localhost:27017] falhou!{}", + "90b65217be3c698d9b1fbff0dccdc71b": "Serviço Mongodb ainda não está ativado!", "7d1a075632098426af1e2197d274bdb6": "O nome do banco de dados não pode conter os seguintes caracteres. /\\\\. \\", "48b2c30b0f984cdcc6cd7ed4ee376fdc": "O nome do banco de dados contém espaços e não pode ser adicionado corretamente!", - "93efcc7fc4e9d402978828bacd4a5bc2": "O usuário do banco de dados já existe, use outro nome de banco de dados!", - "393223cf51f8e25df5d53ae425de74a9": "o banco de dados não existe.", - "2162130c1a1937f839cc660f5e70ebdb": "O serviço Mongodb ainda não está ativado!", - "45da541afaa00457a2f4617a1dd4855f": "A exclusão do banco de dados com nome admin é proibida devido a restrições do Mongodb!", + "93efcc7fc4e9d402978828bacd4a5bc2": "Usuário do banco de dados já existe, use outro nome de banco de dados!", + "393223cf51f8e25df5d53ae425de74a9": "banco de dados não existe.", + "2162130c1a1937f839cc660f5e70ebdb": "Serviço Mongodb ainda não está ativado!", + "45da541afaa00457a2f4617a1dd4855f": "Exclusão do banco de dados de nome admin é proibida devido a restrições do Mongodb!", "2465ac13d0470c6414b77dc59fbcdbbc": "Falta de ferramentas de backup, instale o MongoDB via Gerenciador de Software primeiro!", - "d2af5fe1710856e97dbfdf1adc6d5e98": "Parâmetro ausente! id", + "d2af5fe1710856e97dbfdf1adc6d5e98": "Parâmetro faltando! id", "9c17c1312620910f7c3d27a20f01e968": "O banco de dados não existe! {db_id}", "57bb958a6998e558b00b5d89d240b240": "O formato bson json csv é suportado atualmente!", "3b4ee1461f518d1bd1ed20615d670df1": "Você precisa especificar os campos de exportação ao exportar para o formato csv!", - "d2c7790b1f776ce6ad06426b03fa71b1": "A senha de login local está vazia, defina a senha do banco de dados primeiro!", + "d2c7790b1f776ce6ad06426b03fa71b1": "Senha de login local está vazia, defina a senha do banco de dados primeiro!", "699c43a1633256e97b95615a562eef88": "A senha do banco de dados está vazia! Por favor, defina a senha do banco de dados primeiro!", - "1acdae1719cee0ce5c586cd6995b70a9": "O MongoDB ativou a autenticação de segurança, ", + "1acdae1719cee0ce5c586cd6995b70a9": "MongoDB ativou autenticação de segurança, ", "67e943332602d7a5b9765306caa8604d": "Tipo de banco de dados desconhecido", - "04c651a70b89bd4fd8fc8702c0bf61e9": "Falha no backup do banco de dados, arquivo de exportação não existe!", - "e880101cd795726a7c8e2c2f4033f9dc": "Falha no backup!", + "04c651a70b89bd4fd8fc8702c0bf61e9": "Backup do banco de dados falhou, arquivo de exportação não existe!", + "e880101cd795726a7c8e2c2f4033f9dc": "Backup falhou!", "ae1110dd560e4e7968b297620be7ea36": "BACKUP_SUCESSO", - "bff09c8822165bf816a5b5a4d1fe9140": "O caminho de importação não existe!", - "3d003d1417aec658cd020f9faf66a5c1": "A importação de arquivos zip é a única suportada!", - "3397a2bc97209578e6c113606a4c7b7b": "ENTRADA_BANCODEDADOS_SUCESSO", + "bff09c8822165bf816a5b5a4d1fe9140": "Caminho de importação não existe!", + "3d003d1417aec658cd020f9faf66a5c1": "Importar arquivos zip é suportado apenas!", + "3397a2bc97209578e6c113606a4c7b7b": "BANCODEDADOS_INPUT_SUCESSO", "94b43778dbd724133db47ee2126da3a9": "Nenhum banco de dados sincronizado", - "aae27fc3d2273773edab02e15288cb14": "Sucesso na sincronização do banco de dados {}", + "aae27fc3d2273773edab02e15288cb14": "Sincronização de banco de dados com sucesso {}", "164c5fa905dbffad015f4593d1b85fb9": "O tipo de banco de dados sid requer o tipo int!", - "3a621b20dadc66881772503620282533": "OBTER_BANCODEDADOS_SUCESSO", - "505a6be34cf7e61f93f2665896cfafaa": "Falha na modificação, banco de dados [", + "3a621b20dadc66881772503620282533": "BANCODEDADOS_GET_SUCESSO", + "505a6be34cf7e61f93f2665896cfafaa": "Modificação falhou, banco de dados [", "13966ea12f4ed389be50c95e65d8a2dd": "A senha do banco de dados não pode estar vazia ou ter caracteres especiais.", - "361cbf31511a2bf38fc664157d183328": "A senha do banco de dados não pode ser chinesa, mude o nome!", + "361cbf31511a2bf38fc664157d183328": "Senha do banco de dados não pode ser chinesa, mude o nome!", "252d8cfbb164b773c5f84ce9d814ae3c": "A modificação falhou, o banco de dados especificado não existe.", - "aea43e9b982f6105e584e46b778d9f9e": "A modificação falhou, a autenticação de segurança não está ativada no banco de dados.", + "aea43e9b982f6105e584e46b778d9f9e": "Modificação falhou, o banco de dados não está ativado para autenticação de segurança.", "0b46bb64ce97c64f6dddc87bccf949e8": "Informações do banco de dados remoto não existem!", - "9e1a9b35939cc4887854eb2ed84f401f": "O nome do banco de dados não pode conter caracteres especiais, redefina-o.", + "9e1a9b35939cc4887854eb2ed84f401f": "O nome do banco de dados não pode conter caracteres especiais, por favor redefina.", "90299d1fb53fdf7a570db71a1b61c127": "Por favor, defina a senha Root do PgSQL primeiro!", "01d3922e30b7aff9c7265e91c57cc829": "O formato ip está incorreto!", - "b2349e65b04baa3a0d50ad030535b73e": "que você digitou não é legal, a modificação falhou", + "b2349e65b04baa3a0d50ad030535b73e": "o que você digitou não é legal, a modificação falhou", "932c4edd1a70a505be1099f4e7874692": "Modificar direitos de acesso do usuário pgsql com sucesso", - "f562938bcf2a52b32261e4f4a99c3e00": "Falha na exclusão! O banco de dados atual está sendo conectado!", + "f562938bcf2a52b32261e4f4a99c3e00": "Exclusão falhou! O banco de dados atual está sendo conectado!", "573ba454733eee7cd866addcd11ea21c": "Falha ao excluir o banco de dados!", "fec7dbd4f36266728d6eda5e168d1cc0": "O banco de dados não existe!", - "69579eb94ffe47354dac42abc8cac9d1": "A senha do banco de dados está vazia, configure-a primeiro.", + "69579eb94ffe47354dac42abc8cac9d1": "A senha do banco de dados está vazia, por favor defina primeiro.", "fb642275547236f1fb2ea7717ace26d8": "Por favor, defina a senha de administrador primeiro!", - "95abdbd5890c3ceec62026c6246d8030": "A execução do backup foi bem-sucedida, ", + "95abdbd5890c3ceec62026c6246d8030": "Execução do backup foi bem-sucedida, ", "7307a92023c68b6842a8dafb1b500f16": "Falta de ferramentas de recuperação, ", - "eef4302ce8a129e5d70767668a9e9110": "Por favor, escolha o formato de arquivo sql, tar.gz, gz, zip!", - "c5aafcc6af38d67c22ccc8d19f60ed0b": "Sucesso do banco de dados {}", + "eef4302ce8a129e5d70767668a9e9110": "Por favor, escolha formato de arquivo sql, tar.gz, gz, zip!", + "c5aafcc6af38d67c22ccc8d19f60ed0b": "Banco de dados sucesso {}", "a8de1650a48acf0e91c7ba840bd48295": "A senha do banco de dados não pode estar vazia", - "9a53422dee5315eb489d4e448f4ea976": "Falha ao modificar,O banco de dados especificado não existe", - "3ca4ea8082e41867cee227d4686a4c17": "Sucesso da senha do banco de dados {}", + "9a53422dee5315eb489d4e448f4ea976": "Falha na modificação,O banco de dados especificado não existe", + "3ca4ea8082e41867cee227d4686a4c17": "Senha do banco de dados sucesso {}", "0033a9566af4f930bebbd45802be5427": "falha na conexão", - "ae576ea2a8c76765fa69287fb1347d1a": "Falha na conexão com o banco de dados remoto!", - "d1b44799de985cad123821498285dfbd": "ERRO_FORMATO_ENTRADA_BANCODEDADOS", - "df5647a7421161dcbda85323db41cc99": "Sucesso na sincronização do banco de dados", - "2a52f6106614dfbd519714df03ebb16a": "Sucesso do banco de dados", - "1182c39d730924cb4f4d8d229fadb0f3": "Sucesso da senha do banco de dados", - "15a8af9e80d0a0c2d87314c154fff181": "cluster redis não suportado!", + "ae576ea2a8c76765fa69287fb1347d1a": "Conexão com banco de dados remoto falhou!", + "d1b44799de985cad123821498285dfbd": "BANCODEDADOS_INPUT_ERRO_FORMATO", + "df5647a7421161dcbda85323db41cc99": "Sincronização de banco de dados com sucesso", + "2a52f6106614dfbd519714df03ebb16a": "Banco de dados sucesso", + "1182c39d730924cb4f4d8d229fadb0f3": "Senha do banco de dados sucesso", + "15a8af9e80d0a0c2d87314c154fff181": "não suporta cluster redis!", "c2dafded2689dc11914376d72a70dfc2": "falha na conexão redis!", - "b283988bc23c61b2e6393195064ccc5f": "A operação foi bem-sucedida", - "a9ed7f25ce1ffcf98cf5ec7db86abdf4": "O backup de bancos de dados remotos não é suportado no momento!", - "9d1ee7d092060a4d3418a979fba5e46b": "ERRO_BACKUP", + "b283988bc23c61b2e6393195064ccc5f": "Operação é bem-sucedida", + "a9ed7f25ce1ffcf98cf5ec7db86abdf4": "Fazer backup de bancos de dados remotos não é suportado no momento!", + "9d1ee7d092060a4d3418a979fba5e46b": "BACKUP_ERRO", "1fcdee5d4329f1f638bc2d818f3e510a": "arquivo não encontrado", "517b554160a14e74d52943ea29ab5a66": "falha na conexão redis", - "ec010eeffc0a20399b186f334b3b6769": "falha na conexão com o banco de dados remoto {}", + "ec010eeffc0a20399b186f334b3b6769": "falha na conexão banco de dados remoto {}", "2322848a32fd761a98a0bd76e633bc97": "Informações do banco de dados remoto não existem!", + "0511237752a4bf05b3470f55a920a13c": "{} site tem divulgação da versão Nginx", + "c1634d768da5b138e9d7f30da5776f72": "A divulgação da versão Nginx pode expor informações sensíveis do servidor e apresentar riscos de segurança", + "3377a5b197173de4cffe41bdc42e0c06": "Abra o arquivo nginx.conf para o site {} e adicione ", + "45a1cb21f9639223152e01c1d6213cc9": "{} site tem divulgação da versão PHP", + "70ddb8e4ac75601221d15393379aec22": "A divulgação da versão PHP pode expor informações sensíveis do servidor e apresentar riscos de segurança", + "d8b10647324c74f52a3b24aee5b34316": "Abra o arquivo php.ini para o site {} e defina ", + "44971bb65cdcdb059767f15e4ff265e6": "Firewall não instalado para o site {}", + "7e26e59bba292ecc0bda0c7f69e091a1": "Não ter um firewall instalado pode expor informações sensíveis do servidor e apresentar riscos de segurança", + "633b7a612198f42925356962c605daf0": "Instale ou ative o firewall Nginx", + "114b3dda67fc0b22bce73684f5872804": "Proteção contra ataques cross-site não ativada para o site {}", + "5c040e1ad447e5408b0e3eecdd455c1d": "Sem proteção contra ataques cross-site, dados sensíveis do servidor podem ser expostos via travessia de diretório", + "0fc62e3733f8eebdc41ac57a3497f653": "Ative a proteção open_basedir no diretório do site para impedir que atacantes leiam arquivos sensíveis entre diretórios", + "d76b44c3726a549e02705d04d20572bb": "{} site tem SSL desativado", + "24e1cf7550e6cff5c9a86b136f4738af": "SSL não implantado pode expor informações sensíveis do servidor e apresentar riscos de segurança", + "598483f5877ad9bfe0a2c30a24d846d9": "Implante SSL em Site → SSL", + "0741d3f8bd49c7058a9a7e0a1e615bf1": "Arquivo sensível detectado no site {}", + "f98a053d674dbfc507c028cb69799413": "Arquivo sensível 【{}】exposto — pode vazar informações sensíveis do servidor e apresentar riscos de segurança", + "9a3a5f290b230622980f79252dc0bb19": "Exclua ou mova o arquivo sensível para fora do diretório raiz do site", + "781718c074dfa4fba0c1ab86af7322c3": "Arquivo de banco de dados SQL detectado no site {}", + "5fc606066b231ce034d1f894a2f56a87": "Arquivo de banco de dados SQL 【{}】exposto — pode vazar informações sensíveis do servidor e apresentar riscos de segurança", + "7fb29e80e1607255b4889149d814d6cc": "Exclua ou mova o arquivo SQL para fora do diretório raiz do site", + "7d793f5d45f692f8234cb14d77d43526": "Arquivo Trojan detectado no diretório raiz do site {}", + "2126356e872681f2c18ab8999d55977a": "Arquivo Trojan 【{}】detectado — pode expor informações sensíveis do servidor e apresentar riscos de segurança", + "34cbe317411bc8ece32e89b2ccb3ea8c": "Exclua o arquivo trojan ou realize uma auditoria de segurança", + "2ad6c8ba78234ac5d731bb9311eb92e5": "Arquivo de backup detectado no site {}", + "d5d425447ff390eaf69be751e20bf6b6": "Arquivo de backup 【{}】exposto — pode vazar informações sensíveis do servidor e apresentar riscos de segurança", + "c09aa2e529fe7c6658b8b534110d7e46": "Exclua o arquivo de backup ou mova-o para um local seguro", + "a4ec7bd83939b217a71b216c895e16ff": "{} banco de dados do site usa uma senha fraca", + "083b68b9c95c87161f91b810150a1cb3": "Banco de dados do site %s 【{}】usa uma senha fraca: {}", + "f522c28207b8c85833e454afdfb59ac3": "Recomenda-se alterar a senha do usuário do banco de dados no painel para evitar ataques de força bruta e roubo de dados", + "32ed3512099db2d97450af9c6ee23099": "{} conta FTP do site usa uma senha fraca", + "8a071d6ddba4edecc3e44089e1b24fb7": "Conta FTP do site {} 【{}】usa uma senha fraca: {}", + "bc9fb759c38c587070326ba0aaae12f4": "Altere a senha fraca imediatamente para evitar que atacantes forcem credenciais FTP e adulterem arquivos do site", + "6a0cf1bea780ff39333eb522d8f181aa": "Ataque XSS (Cross-Site Scripting)", + "b021dbe80c4037e66959a930b37e6f8b": "Para proteger seu site, recomenda-se habilitar o [Nginx WAF] para bloquear efetivamente ataques XSS neste site.", + "6e60d80e8f41ac0b2d0579bdf22f130d": "Ataque de Injeção SQL", + "82a2980b928e2ee7590dad990c70aca4": "Para proteger seu site, recomenda-se habilitar o [Nginx WAF] para bloquear efetivamente ataques de injeção SQL neste site.", + "34c46b685b63d1d8ce17528acc9a3f18": "Travessia de Diretório / Ataque de Inclusão de Arquivo", + "6af6785994f3ea3ea2c67bf07f947721": "Para proteger seu site, recomenda-se habilitar o [Nginx WAF] para bloquear efetivamente ataques de travessia de diretório e inclusão de arquivo neste site.", + "8ce854a4c99ec334244274a7eec82d02": "Ataque de Execução de Código PHP", + "946e8c378800662bf5c10a2cb7eff9fb": "Para proteger seu site, recomenda-se habilitar o [Nginx WAF] para bloquear efetivamente ataques de execução de código PHP neste site.", + "60d2c5ef1c4bb2dfb7e99eb659812f6a": "Tentativa de Acesso a Arquivos Sensíveis", + "b4e160dd6370e872200b9a7d12b980aa": "Para proteger seu site, recomenda-se habilitar o [Nginx WAF] para bloquear efetivamente tentativas de acesso a arquivos sensíveis neste site.", + "98c0b1eca58e1f2580ad3e8f5b542e54": "Ocorreu um erro durante a análise de log", + "b7040f1f73ad7726d2141879aaa0f3bb": "Verifique as permissões e o formato do arquivo de log. Erro: {}", "61dccc90b62286cfe99a0836cd7016f4": "O diretório do projeto não existe!", "393f59f008214da917a3644f9bddd08c": "O item especificado não existe!", "76f7795cbd69658732375d59e3ac4443": "O arquivo de configuração package.json não foi encontrado no diretório do projeto!", - "da87ee74f07713dc1fb6d97d770c6b9a": "A versão do nodejs especificada não existe!", + "da87ee74f07713dc1fb6d97d770c6b9a": "A versão nodejs especificada não existe!", "53dc11c67093dc8650a2a0bcc739af9e": "Por favor, instale o pacote de dependência primeiro!", "9e37cac0b6ac4947a8eaab9c4741d096": "O módulo especificado foi instalado!", "a23324d67a76505b9485e1925b49ce69": "Falha ao instalar o módulo especificado!", "e175807189b9fed334d7fa1d9517e302": "O módulo especificado não está instalado!", "7d837b25ee483c045c3d27e461661024": "Este módulo depende de outros módulos instalados e não pode ser desinstalado!", - "a06864f6c23b22710bc49fa3794247aa": "Não foi possível desinstalar este módulo!", + "a06864f6c23b22710bc49fa3794247aa": "Incapaz de desinstalar este módulo!", "3378916dcc3a51351a823bf417959965": "O tipo de parâmetro está errado, precisa de objeto dict obj", - "2ab730bc17ad482c454d62e5d6dda728": "Por favor, instale o gerenciador de versão do nodejs primeiro", + "2ab730bc17ad482c454d62e5d6dda728": "Por favor, instale o gerenciador de versão nodejs primeiro", "683eecd5ab2302a02009bb53528a8206": "O formato do nome do projeto está incorreto e suporta letras, números, sublinhados e expressões: ^[0-9A-Za-z_]$", "9360c6893e4ca4d7030d99d9ae4b34c7": "Por favor, instale Nginx ou Apache primeiro", "999e1ffe680ef91f5cf9795c34aa7acc": "O tipo de parâmetro está errado, precisa de dict obj", - "9f474c0c49ec1c30e3c19f13e9d2a52e": "Por favor, instale o gerenciador de versão do nodejs antes de instalar pelo menos um nodejs", - "9791ddabd2954257bfed271e0e7254dd": "O comando de início não pode estar vazio", + "9f474c0c49ec1c30e3c19f13e9d2a52e": "Por favor, instale o gerenciador de versão nodejs antes de instalar pelo menos um nodejs", + "9791ddabd2954257bfed271e0e7254dd": "Comando de início não pode estar vazio", "f8498a22f4e43acaae880208f0980675": "O item especificado não existe", "26aa1657ebfac1237da6a1f8ccae86b4": "O nome de domínio não pode estar vazio", "8f5e21613d5cfe258f7965986f95b750": "Pelo menos um nome de domínio é necessário para o projeto mapeado", "bd397222b97310807e5ecfdcec2c30ff": "O nome de domínio especificado não existe", "8f04dfa02fe0ef0106680e1a3e9f1759": "Item não existe", "64bc3d77e07e9e2757509ce626273a99": "Por favor, adicione pelo menos um nome de domínio na opção [Gerenciamento de Domínio]", - "7514fe0af7b6f84f1c3c0a01613010fe": "Por favor, vá para o [Módulo] e clique em [Instalação com um clique] para instalar as dependências do módulo!", + "7514fe0af7b6f84f1c3c0a01613010fe": "Vá para o [Módulo] e clique em [Instalação com um clique] para instalar as dependências do módulo!", "11382e970be52495256dd21192a671a7": "Nenhum script de inicialização configurado", "ef6b21f990d5f7f0a881e354a365063d": "O comando de inicialização foi interceptado por software de segurança desconhecido, verifique o log do software de instalação", "bbffcc99d1822ea57ca5e7dc614157ec": "Projeto não existe", - "53797f7f191af4c7851d0419ca27b334": "O projeto não iniciou", - "f45bc552cdf8369ab9fe2213eec7b802": "O arquivo de log não existe", - "f9be861aad3eda81843c7797487da8e9": "O status de segurança atual do sistema é bom e não há vulnerabilidades ou riscos óbvios", + "53797f7f191af4c7851d0419ca27b334": "Projeto não iniciou", + "f45bc552cdf8369ab9fe2213eec7b802": "Arquivo de log não existe", + "f9be861aad3eda81843c7797487da8e9": "O status de segurança do sistema atual é bom, e não há vulnerabilidades ou riscos óbvios", "890e24b14414e3da9bc2ad63d6d0befb": "Existem certos riscos de segurança no sistema, e algumas configurações ou políticas precisam ser melhoradas", - "951c23a91dfe39b5ea5d00405b4dc2c5": "O sistema tem vulnerabilidades de segurança óbvias, repare-as a tempo", + "951c23a91dfe39b5ea5d00405b4dc2c5": "O sistema tem vulnerabilidades de segurança óbvias, por favor corrija a tempo", "de36cae19b2a65a45cb4dfccb435530b": "O sistema está em um estado de alto risco, repare os itens de risco relevantes o mais rápido possível", - "ea848f5d6978f5916cd3df4191195e2a": "O host já existe!", - "7aa425b3819e79208faaed38fe137f34": "Falha ao conectar ao servidor, verifique se o docker foi iniciado!", - "c90ca78b1fc8554e867a696d30255cba": "Host docker adicionado com sucesso!", - "8ee5196fbd93bf345bf018132e808a0a": "Host excluído com sucesso!", - "c0ef08aa7bd6276137ccd491a8041223": "Não há volume para fazer backup", - "584e35dd4a55da88bd232ac7a19b9b95": "A tarefa de backup foi criada com sucesso.", - "0b08674e1c87f3f8508a4ae9b0c160f8": "Falha ao criar uma tarefa de backup {}", - "2a0f93407bb61e2403ccd032cbc64e3e": "excluído com sucesso", - "13d829d3f2b78c971207d944f2a96c55": "Falha ao excluir o arquivo, motivo: {}", - "0af5787b053c4bf5dbe610731f7d4199": "O caminho do arquivo não pode conter caracteres chineses!", - "719ee030d81490fc055af0c4426aacb9": "Falha na detecção: {}", - "ee3936ffdc910e2cb8578ad1fae322f0": "Detecção aprovada!", - "2e5c9168b81de403131125abe3537861": "Nomes de modelos não podem conter caracteres especiais; apenas letras, números, sublinhados, pontos e traços são suportados", - "1ef49203b5ddab4a6b30eddab93c6d73": "Este nome de modelo já existe!", - "356dbf2911e78ebedbd99f13df311ce1": "Modelo adicionado com sucesso!", - "4f6a25bc1019404777b1a95b85c375f3": "Não alterou o modelo!", - "029a1a33fb7a828191eac587a4d98db4": "Erro no formato do conteúdo do modelo, insira um modelo docker-compose válido!", - "052009ea42871f16153ca6fb451be303": "Modelo modificado com sucesso!", - "550993f7a7c3863e988dc02458bb413b": "Este modelo não foi encontrado!", - "86eb5f101087c690c1229fffceb97cba": "excluído com sucesso!", - "c541f51f11868ef56cf50524eeddd226": "O item não foi encontrado!", - "c3f9a083e42b21151560ba7e23667129": "O modelo não foi encontrado!", - "d5d3eedff8acf67756e21b4612aaa380": "O nome do contêiner já existe!:
[{}]", - "05073a33c4bfcb8113af6b3222a0cccd": "Esta porta [{}] já está sendo usada por outros modelos", - "69a22232c25cb907570f837e4032ed7e": "Erro de parâmetro, por favor passe template_id!", - "35698a69135017d7f8345e32cb5a87fe": "Este modelo não foi encontrado ou o arquivo está corrompido!", - "49d5a6420e1b84d63826fa1d79e5236d": "O arquivo de modelo não existe", - "e199ad07ae94664293828e753ec2a9a8": "O modelo [{}] foi implantado pelo projeto: [{}], altere um modelo e tente novamente!", - "a3017095090064d0ec98861e35d3849c": "O nome do projeto já existe!", - "a9a92ec33cfb8eb3288cfc84edcd48ad": "Implantação bem-sucedida!", - "a180787fbf3d2e3fac72a13cb98ce513": "A versão do docker-compose é muito antiga, atualize para a versão mais recente!", - "d8b370ee0351106fe38046541c421361": "O nome do projeto não foi encontrado!", - "30159c83433a6845a080ad879c0fb61d": "A limpeza foi bem-sucedida!", - "6483a5effa8c7ebce28c3838ee6f6e6e": "Limpo com sucesso!", - "5ded1fa085b4c46667f9c8871d00a46c": "{}O projeto falhou: {}", - "0e0ae38580f51369586ba6933a7c3105": "Parâmetro project_id ausente!", - "78f91123fc323aab6eb38f2bfb8e26d7": "Configuração do projeto não encontrada!", - "c3905cecf4f4eb28fcee1f4a4ad21bb0": "O parâmetro status está ausente!", - "f3655b96aad3f0771354a12af79571dd": "Parâmetro template_id ausente!", - "79f89afa2eaf7c8da6f0ac44295dba90": "Não", - "5b0854983625160cfbf1295ceb6ec327": "Pull (extração) realizado com sucesso!", - "ce932f534479bae87f0615fa7214e5a1": "Não foi possível verificar o diretório raiz", - "bf3d793f9f908f7d2d26a1be8dbb80fe": "O caminho não existe!", - "d2fe452a7fa69442d5296b8e4832ede3": "Modelo adicionado com sucesso: [{}]", - "8d92d05b95b166c5683fdb88f7de8bed": "Falha ao adicionar modelo: o nome do modelo já existe ou está formatado incorretamente [{}], use docker-compose -f [especificar arquivo compose.yml] config para verificar", - "428ed92bf9d3198f4c9885c11fdb2be3": "Estes modelos tiveram sucesso: [{}]
Estes modelos falharam: o nome do modelo já existe ou está formatado incorretamente [{}]", - "70975749d256333f1b3b62c864ca265a": "Falha ao modificar!", - "2360e954ae9eecac28b2a3edad5e8ce0": "Modificado com sucesso!", - "7c6f761019365f8a5cfb2fb54d9e199d": "info.json foi baixado!", - "10066fce84fe34e9cc33e0338532988b": "Falha no download de info.json!", - "0672e579ab0e3454713eb683ddcc4859": "{} Falha no download, ressincronize!", - "8e790e81fffa7f51d099f710bd8f82cf": "{} teste de arquivo yml falhou,{}", - "371acfea202589c4efd6724888f66595": "{} Download concluído!", - "51cf61e34b3f71ce1e430cdfcf129b80": "{} Falha na descompactação", - "c59b65890496cdf2b14d127a1f76f73d": "{} extraído com sucesso", - "0117718c35c7a16a62de5c259e1d35ee": "Falha na criação do diretório pelos seguintes motivos: {}", - "374e3fe41b55a0b29420e455fb514dd6": "O volume de armazenamento foi criado", - "6d0d40f64f89227daf345eb2257638e8": "{} não pode conter Espaços", - "a00b49ace55de909015029a0d6d6096f": "{} não pode ser nulo!", - "54498312bb8f97ce07a9a0b0b47cfad1": "A porta do servidor [ {}] está ocupada, mude para outra porta!", - "47b74e08252747225c49ea0cb011c79e": "Falha na inicialização do projeto {}", - "838089af9a2941a49862f342c056a8ca": "Começar a criar o projeto", - "9b149598fb30f54fec9e82a3d121a464": "{} já existe, altere o nome do projeto", - "634370637f6a5b88940c75f826953d0c": "Falha ao criar diretório do projeto do usuário, detalhes: {}", - "f7b14d3f642d711a23d5a0cca725fd0d": "Falha ao copiar diretório do projeto. Detalhes: {}", - "7bdaccb3d20432c5e0150862ab1cc3f3": "Faltando parâmetro name", - "9b90b5b49486a61d9b0e6dbbbcb56cad": "Faltando parâmetro container_info", - "b23d7110e9bf6539b4964afe0d4934e2": "O agrupamento já existe", - "a90ca6939fe71693c145f50596c6e0e6": "O contêiner {} já foi adicionado pelo grupo {}!", - "e3cf7e2f2d14257e7ea33657b135d534": "Falha ao adicionar:{}", - "fcbeb38a63ced9d3de476fb08c31d71e": "Faltando parâmetro id", - "fe4e0032f69b4100ed143d475e8b5050": "Edição com Sucesso", - "6c4ed52bea35c4c43839b8f0b44489f9": "Falha na edição:{}", - "6c0129a45e9da4e1820335f3d06a869f": "Falha na exclusão:{}", - "2a743a86676fd52214d3c0af1b0238b5": "Erro no parâmetro status", - "f95136e5c1f3ccbb09ace8fc24f1e0ca": "Operação do contêiner [{}] falhou", - "2e01172e31495f41fcebcf3f831cc82c": "Operação bem-sucedida", - "244a98f8c45f938980f48b168aef02c9": "Falha na operação:{}", - "fc431240dfc80a731900d5f2ddb6dfc3": "Ordem de início do contêiner {}", - "5ea6c6eea14c24c92eeeccaeea5c46dc": "Estado inválido!", - "0f3f874698792dc81c7c00b9e74fea34": "{}\\r\\n", - "aad4acc1243565c5c2ca41e5733e5fe0": "bem-sucedido\\r\\n", - "d8f5a29760a4f000dd754819b1faadcc": "falhou\\r\\n", - "73977612ef83925db43df7745df9c5eb": "\\r\\nSem resposta por mais de 10 minutos!\\r\\n", - "6345c76d66a8a9e9cdd3f9d996ff062d": "Por favor, passe o cmd", - "bba401eadefa8222f3e60a312cc19f34": "Apenas comandos docker run ou docker pull podem ser executados", - "b5592904212696df3e5bcec990c8676a": "Existe comando perigoso: [ {}], execução não permitida!", - "cfff471dc04b6ba4aeb2cc2844b2c94b": "Existe símbolo perigoso: [ {}], execução não permitida!", - "f1d9b154a0c2625d828a504a8cb35682": "O comando foi executado!", - "45a0bbacbe8d5ea062167e88423e4573": "Servidor nginx ou apache não detectado, instale um primeiro!", - "bdaf560796795d6a303bc9a1d75a34c5": "Tipo de Projeto [{}] Domínio Existente: {}", - "4588a786e80c83c2cbde37b930c3d778": "A porta do servidor [ {}] não é usada, insira a porta em uso para reverter!", - "6888cf6586ce3c187150146a2d1db0ac": "Falha ao adicionar, banco de dados não pode ser gravado!", + "5395cc8155f62a666b8f0d0f9f207676": "Informações do repositório já existem!", "9f9663b59d32947ff1f2c5b364c571b8": "adicionado com sucesso!", - "e6bddfc6a0bbf72d592236c61b411f9a": "Falha ao adicionar com erro: {}", - "1bfa1b1738332c4835f5efe7c54ab9c2": "erro de parâmetro!", - "0d66954ff42aa042c219a356266f5bc0": "Nenhuma informação de proxy reverso detectada!", - "ae178e022cf2fe30f402145572528de8": "Nomes de volumes não podem ter menos de 2 caracteres!", - "365c770f123d22093084908ebcdc75fc": "Nome do volume já existe!", - "2dc51ae60242f0e5b56a9f0d176f91d4": "falha na adição {}", - "307feea9ab8928f39595316b11992cb1": "Tags de opção de driver devem ser pares dicionário/chave-valor!", - "f529949f8a98615c109ee8b8eb9f7656": "Falha ao adicionar! {}", - "a4ec5c1fa47f2ce0c875f91ea4e7dd08": "O volume de armazenamento está em uso e não pode ser excluído!", - "11ff7153b67d275618dd3a62d1e56373": "O volume de armazenamento não existe!", - "2aa70dad9bff94a855fdde3fc113e6c5": "Falha ao excluir! {}", - "55c31f03e88bd6ad4ce7f68d425648dd": "Nenhum volume de armazenamento inútil!", - "6169a7282b361deb5f6f5b6e18f9426e": "erro no parâmetro cmd", - "286933a4f24bee0eed1f9300f70a30c7": "Apenas o comando docker run pode ser executado", - "a46a6b274dcbfc5a629d234c2816a165": "Existem símbolos perigosos: [{}],Execução não permitida!", - "8135363a6a5e2c145c6cedab8ac1e510": "O formato da porta está errado, este método não é suportado!", - "3b825826968319b6256c4020cc49676f": "A porta do servidor [{}] já está ocupada, substitua-a por uma porta diferente!", - "70b35bb3bb2fe425a981e8cc68c06906": "Por favor, faça o pull da imagem que você precisa", - "e768fcd4ff22e2f3cc2535f1ea9c5682": "A imagem não existe!", - "7dc29c1ed7012513111b11f56c73a4f8": "A cota de memória excedeu o montante disponível!", - "73aff7a8ab244bc5d0d1448e9a0ae6f0": "A cota de memória não pode ser inferior a 6MB!", - "2c4eca852599890038970a7e0f384470": "A imagem [{}] não existe, você pode tentar [Forçar Pull]!", - "56a727f1edc5f008ee8f41a638662322": "A cota de cpu excedeu os núcleos disponíveis!", - "45c163fd880ce5a21373fbd53bbcd642": "A reserva de memória não pode ser inferior a 6MB!", - "bf6b8400e1726aadf1cee7d6c1c5d173": "O formato do nome da imagem está incorreto. ex: nginx:latest", - "f0beb6e739348ae10c9f15cb91638d2f": "Falha na criação do contêiner, detalhes: {}!", - "e5d4020fc5f8c26e22add8db8a62f06a": "A cota de memória não pode ser menor que a reserva de memória!", - "c68d012ef602a12e38636c306c10c894": "O nome do contêiner ou bridge de rede já existe. Altere o nome do contêiner e tente novamente!", - "c4272ed0aaf1e7e2bcc08f1003c2391d": "Não há comando de inicialização nesta imagem, especifique o comando de inicialização do contêiner!", - "a73eb9f1fb82232c9f70bb80024a9d9c": "Exceção de permissão! Detalhes:{}", - "196a4f415d73b007e0627563a530967e": "Falha na criação do contêiner! Reinicie o serviço docker no momento apropriado!", - "ea7b2beec49a425b5742339d00a5aeb8": "A imagem [{}] não existe!", - "c29c7e4f72858367cd21d10303411592": "O nome do contêiner já existe!", - "c4dc041770b8a0e34d1399141d0e4de8": "O nome do contêiner é inválido", - "97bcbd1e3b4df0f1c6ec642e7be17afe": "Porta do servidor {} em uso! Mude para outra porta", - "994e5a057aca3524ba773ec33228e184": "Falha na criação! {}", - "00ff90441ea0bdece5d9e5c72efa14a7": "A criação do contêiner falhou e a conexão com o docker expirou!", - "8879635d66ad75dcbfc8c31ba1351116": "Falha ao executar o contêiner! {}", - "71dc70f7ab3abc0c2a7141718d3a9b2": "Falha na criação!", - "1983b37067c7e94095a5113786fdef9c": "Falha na edição, conexão com docker expirou, reinicie o docker e tente novamente!", - "c558fedcb5850939202e684ff32c7c50": "Falha na atualização!{}", - "ed0029af5f77a5dfacbc2452e8c3ec92": "O ID do contêiner é anormal", - "c5b3db7efde90edcb803a4a79e559b21": "O novo nome da imagem não pode estar vazio!", - "b10305369ebb41ef24699b8137733465": "A imagem não existe!", - "9e90efb62702b147b71e8731290caf44": "A imagem [{}] não existe, tente verificar [Forçar pull da imagem] e tente novamente!", - "6cfa55c53df6db8efa59aa2ae6cef97a": "O novo contêiner não foi criado com sucesso, e o contêiner antigo foi restaurado. {}", - "1f004e412319b7ed472624e011b3d2ba": "Atualização bem-sucedida!", - "a2ea046c20d2da5cebf2dea01a62dabe": "Falha na atualização! O estado do contêiner foi restaurado", - "b84bf4d95051856f9965b55bb5402de3": "O contêiner não existe!", - "d567f353b12e618571935661f31c2a16": "A edição do contêiner falhou e a conexão com o docker expirou.", - "f2124ee490df203b3f86509401c76a09": "O contêiner foi editado com sucesso, e a sub-rede não é especificada quando a rede [{}] atualmente especificada é criada, e o IP não pode ser personalizado, e o IP foi atribuído automaticamente a você!", - "b95d75cd8e04e9cca297c3cd1091b2eb": "O contêiner foi editado com sucesso, a configuração da rede [{}] falhou e o endereço IP foi atribuído automaticamente a você, detalhes do erro:{}!", - "4363bb34365a67238ecc6a98ce46b361": "A imagem foi gerada, e {}", - "4bb30e8d57a6a7e548758daf4ac33983": "enviado com sucesso!", - "a32e1f09fc2739d94c51a7168675e0e9": "Falha no Envio!{}", - "172f51d3307b02aeb6dc703a442f4724": "Falha ao obter contêiner", - "684fc00ae67504a56c09ef71431b1261": "Exportado com sucesso para:{}", - "f9a48b804d917398e795016687f3b0f4": "Por favor, desative o [Anti-adulteração para Empresas] antes de tentar!", - "3ab9d9b76e8d22434930622b5f0acc6a": "O contêiner foi excluído!", - "d1fe1d6e5e8c17b60f749ad36ff3bcaa": "A porta do servidor ipv6 [ {}] está ocupada!", - "9f13645ac42f0c9908a35637a525d561": "A porta do servidor ipv4 [ {}] está ocupada!", - "8708a53096a7d7bce5d3042be8feb736": "Parada bem-sucedida!", - "5dc7c5bba9e3ff6d293a9cd6459bc1ae": "O contêiner pausou.", - "458c9e6b1324cc3843c313c99a9c8623": "Falha ao parar!{}", - "d40b23e847e0619c6e2133eebfd51807": "O ID do contêiner está vazio", - "239aa38adb7ae2339600a015d8695f3d": "O contêiner não", - "b10f78da3571670e8567e599aba8d475": "Falha ao obter informações do contêiner!{}", - "4e62f10d98b7560d22cf614879790624": "Sem registro de contêiner", - "4bfb779dfe8300c1f2da1f1dae06a4ce": "falha na conexão docker", - "e9b0defc5226436d7d2580972376cad0": "erro de parâmetro, Passe: type", - "d0e42e6dd40adc10d0027ab9993d8741": "O diretório de log do contêiner não existe, o corte de log não pode ser definido!", - "3af555ace78d310a5db6e9449ed6843b": "Aberto com sucesso!", - "641fe4d504d197e8570f3bc693f5c15b": "Fechado com sucesso!", - "e04e8dc32dc0f13aea94cb4996a0057c": "O arquivo de log não existe", - "3e0f56b62a18226db6b8c71e8c917be4": "A limpeza do log foi bem-sucedida!", - "81259d9e5861e65db29844c19d9feb80": "Nenhum contêiner inútil!", - "53a5658dfa0a2e85083fd63b961d35be": "excluído com sucesso!", - "dac7d97aeb94cf9d3b3b5d7d072c4cff": "Por favor, desative a proteção contra adulteração empresarial antes de tentar novamente!", - "32ca87e65c5fc75d3857767417b56439": "falha ao excluir! {}", - "b0ea22ff0b389c2a32b8f4367ab650db": "Erro de parâmetro, por favor passe a política de reinicialização restart_policy!", - "179a2001e96bb8d0475488f80c7216a8": "Atualizado com sucesso!", - "3b2f70397fa8a27c7146cbd900f7222": "Falha na atualização! {}", - "c147897a9d1746a58de531e9c0158c23": "O contêiner não foi iniciado e não pode ser renomeado!", - "a89c2e8f7eb81399f984330e55014c6f": "Renomeado com sucesso!", - "8a615b544c027899738b19f2cc40fd93": "Falha ao renomear! {}", - "3506ae5524d7b5dbd75ed328349e065e": "Definido no topo com sucesso!", - "363b76cd4207ec1adb31b9f7ee3930c8": "Desafixado com sucesso!", - "0fffc4397713115e14ef45273241dfbb": "Erro de parâmetro, por favor passe: remark!", - "dce2cbc7791016e4876ab144e53b4f82": "Erro de parâmetro, por favor passe: id!", - "ca1bc3e1d32b99b90395da47b88576a9": "Erro de parâmetro, por favor passe: ws_callback!", - "b4770fb21a608a5ba1ecacae409093d0": "Erro de parâmetro, por favor passe: _ws!", - "11cde3a2ca81c845978b98e4a6ec471e": "O tempo de salvamento do monitoramento deve ser um número inteiro positivo!", - "b314fb25bf654a2256bf53b0f6986c93": "Os dados de monitoramento não podem ser mantidos por mais de 999 dias!", - "60e46aeaed758964902dd7ae99858f03": "Lá", - "c28bc5c07ec6f2b56777ac7c852dd64b": "Configuração Bem-sucedida!", - "422f78617d6852c41e370982d73235ed": "Falha na configuração! Motivo da falha:{}", - "dca5bd22c99a74f74074a3a53d78a58b": "{} sucesso", - "ec1ec17a5862a949e277432e1d09484d": "Falha na configuração! Motivo da falha :{}", - "f4dc83b81fe6993f99c2b54494eeeec1": "Monitoramento iniciado com sucesso!", - "af79fd88d4b6f7e8a1ac05e199747fdb": "Falha ao iniciar monitoramento!", - "6f4d03d4d1ee0bd282ea744730b7ceda": "Monitoramento do Docker parado com sucesso!", - "4cc06d8560bb116a38a5aae1458cbe4a": "O caminho do arquivo docker-compose não pode estar vazio!", - "8d885b86e8562c2128689c4a2601c054": "O arquivo docker-compose não existe!", - "a87b64b2d19f29438274f80ce36a3579": "A tarefa de instalação foi adicionada à fila!", - "d388487780fba74e4ff3f3b9ffbce58b": "Pode ser desinstalado!", - "c4ba6d01fd53333a6e7e85707758c550": "Desinstalação bem-sucedida!", - "b7affa7cc663144bc99b9edb3f1a027f": "A tarefa de reparo foi adicionada à fila!", - "cb49a4daafc9d27bd460967891968225": "Salvo com sucesso!", - "58fcf0699f38a60c8025330585ac205a": "Falha ao salvar, motivo: {}", - "6c3e5d603d8845422e861fb0b4eed350": "Um item de configuração que não", - "f324009782d2d9e73d1087884ebc2c4c": "A raiz do Docker não pode estar vazia!", - "538960e1336f919e37a0d2c024c56830": "O diretório raiz atual do Docker é o diretório de destino e não precisa ser alterado!", - "f2bd8f0373084151bbc07e8c1409e37c": "Falha na configuração!{}", - "a848bbd79221dfdce1c9dca536dbfada": "O formato JSON das configurações de proxy está errado!", - "edf6eb680187066c4dea216b3b20d6d2": "Configuração de proxy bem-sucedida!", - "720d2290c3082615c0f79894bfdcabd7": "Por favor, insira o endereço IPv6 correto!", - "b01f9411136207ad7df28b9bf2387e2a": "Falha na atualização! Motivos da falha:{}", - "da896b628e3ded58445e4b015320f327": "Sobrecarga falha devido a:{}", - "efb869976990f78b3d6fcbaf270e3323": "Recarga bem-sucedida!", - "1b3b50aa7886ea66845ced2c18cbf6b1": "Falha na sobrecarga do perfil global:{}", - "75bbb7a00c3b5b510913952fe089f52a": "Parâmetro errado, parâmetro de caminho!", - "273609d18876f5f9e3f021032e5b57a3": "Falha na configuração!", + "9b10e472adfe6372c9175b9002f098fd": "[Repositório Docker Oficial] Não editável!", + "5858be44c285048a8f51c126b2fd23e9": "Edição falhou! Razão: Descriptografia da senha da conta falhou! Exclua o repositório e adicione novamente", + "7e51d0e26e1b467aff3c89d3e0751ec0": "Edição falhou! Razão:{}", + "6478f13dd58e5a4329e19be9020243ff": "Este repositório não pôde ser encontrado", + "d5309f3186607eb36bee41e8a28cea3a": "Edição com sucesso!", + "9e20bffc0d4093d18fcbc5c98fa0fd87": "[Repositório Docker Oficial] não pode ser removido!", + "a62336a87697ab6911ba550015a798ef": "Exclusão falhou, o id do repositório pode não existir!", + "c28bc5c07ec6f2b56777ac7c852dd64b": "Configuração Bem-Sucedida!", + "f2bd8f0373084151bbc07e8c1409e37c": "Configuração falhou!{}", + "657a0b7e82731fb4ae516d14081f17d0": "Teste de login falhou! Razão: {}", + "54197759827cfaf0cdb1e213fa49771e": "Teste de login falhou! Razão: Pode ser erro de senha da conta, por favor verifique!", "5e022f79dcc774c79bc55ee28774e2e7": "O nome da imagem não pode conter /", "c00be60f9f3f7d747aadfdb124e855ef": "Salvo com sucesso em:{}", - "cb1f8d99b492340cf701101c87884a8c": "Não é possível exportar a imagem!", - "afaa91d141ded3e37b8b9ebf8bc31c51": "A exportação da imagem falhou e a conexão com o docker expirou. Tente reiniciar o docker e tente novamente!", + "cb1f8d99b492340cf701101c87884a8c": "Não é possível exportar imagem!", + "afaa91d141ded3e37b8b9ebf8bc31c51": "Exportação da imagem falhou e a conexão com o docker expirou. Tente reiniciar o docker e tente novamente!", "5b980f2e1c82c04c91376d55d4306a91": "Falha ao exportar imagem!
{}", "e5e8c7cac8b71e94280fa08301d21e78": "Por favor, insira o caminho da imagem!", "5441400ea3bd16cffdf70c46c34f61d4": "Falha ao importar a imagem. A extensão do arquivo deve ser .tar!", "0720c6c4f478b3a374b4a438f7cf80ad": "Falha ao importar a imagem, a conexão com o docker expirou, tente reiniciar o docker e tente novamente!", - "22cc0388137842df9649b3bbcff345e8": "Se a importação da imagem falhar e o diretório temporário do contêiner não for criado, verifique se o software de proteção possui um registro de interceptação.", - "67b97e4746a2faf5d59206a80bb28649": "A importação da imagem foi bem-sucedida!{}", - "deceb44868a29ae5d579114348736cbb": "A importação da imagem falhou e o diretório temporário do contêiner não pôde ser criado. Verifique se o software de proteção possui um registro de interceptação!", + "22cc0388137842df9649b3bbcff345e8": "Se a importação da imagem falhar e o diretório temporário do contêiner não for criado, verifique se o software de proteção tem um registro de interceptação.", + "67b97e4746a2faf5d59206a80bb28649": "Importação de imagem bem-sucedida!{}", + "deceb44868a29ae5d579114348736cbb": "A importação da imagem falhou e a criação do diretório temporário do contêiner falhou. Verifique se o software de proteção tem um registro de interceptação!", "8eb05618b0f04e727b0685427fd49c8e": "Falha ao importar imagem!
{}", "721aa02577670c1049ea9d12caa8938c": "Por favor, insira o caminho correto do DockerFile!", - "736df9a7c491f3299efdeb9f7d7e9e0f": "Imagem construída com sucesso!", - "6e85568dae869303ca7a4486f55458a3": "Falha na construção, tempo limite de conexão esgotado", - "5bb301b85cc1f42e56174d3d9a4c0286": "Falha na construção! {}", - "f51455b323ec2db8004c812001043330": "Falha na construção! O Dockerfile especificado não foi encontrado", - "8e1b9c9b75950d0feba6813d32766e61": "Falha na construção!{}", - "eba0ec758a6464a20c14c0f23ceee62e": "Imagem excluída com sucesso!", + "736df9a7c491f3299efdeb9f7d7e9e0f": "Construir imagem com sucesso!", + "6e85568dae869303ca7a4486f55458a3": "Construção falhou, tempo limite de conexão", + "5bb301b85cc1f42e56174d3d9a4c0286": "Construção falhou! {}", + "f51455b323ec2db8004c812001043330": "Construção falhou! O Dockerfile especificado não foi encontrado", + "8e1b9c9b75950d0feba6813d32766e61": "Construção falhou!{}", + "eba0ec758a6464a20c14c0f23ceee62e": "Espelho excluído com sucesso!", "8dd326278d09a3ac4bc56cf725c8f262": "A exclusão falhou e a imagem pode não existir!", "11ead921bc0e3d94f1f9e0db4bf8ed8d": "O ID da imagem é usado em mais de uma imagem, force a exclusão da imagem!", "43993616c7433350755d30a3b4d065dd": "A imagem está em uso. Por favor, exclua o contêiner antes de excluir a imagem!", "d6992c3fcf2269c249cd5f18f1ac2c11": "Falha ao excluir imagem!
{}", - "0c6c071174fde5b47c9eef8088c17a89": "Falha ao excluir imagem, a conexão com o docker expirou, reinicie e tente novamente!", - "a3ba80a8e1e0d9af94c809e909431b3c": "falhou, login no repositório [{}] falhou, tente fazer login neste repositório novamente!\\r\\n", - "cc40077b6ee61fbfa35713a21e8eb866": "bt_failed, login no repositório [{}] falhou, tente fazer login neste repositório novamente! {}", + "0c6c071174fde5b47c9eef8088c17a89": "Falha ao excluir imagem, A conexão com o docker expirou, reinicie e tente novamente!", + "0f3f874698792dc81c7c00b9e74fea34": "{}\\r\\n", + "a3ba80a8e1e0d9af94c809e909431b3c": "falhou, Login no repositório [{}] falhou, tente fazer login neste repositório novamente!\\r\\n", + "cc40077b6ee61fbfa35713a21e8eb866": "bt_failed, Login no repositório [{}] falhou, tente fazer login neste repositório novamente! {}", "60b488c60b6747bf34a86a69740b636d": "A imagem enviada não pode conter [/], use o seguinte formato: imagem:v1 (nome da imagem: versão)", - "44dbec830b87eb037e8fcbb0e1b56160": "Não foi possível enviar para o repositório público Docker!", + "44dbec830b87eb037e8fcbb0e1b56160": "Incapaz de enviar para o repositório público Docker!", "b4c46001066c912344e3bdb0df86e848": "Login no repositório [{}] falhou!", - "0ebfb094c6482acb049e0dd0d3107307": "Falha no envio (push), erro de etiqueta da imagem, insira como: v1.0.1", - "d26bdd6e86002ed92089dc71347822ce": "Falha no envio (push), não tem permissão para enviar para este repositório!", - "82058092ad7d2c7aa5e2f012b6544e59": "Falha no envio (push)!{}", - "2b228d4775d23d2725ec227ba648bd43": "Envio (push) bem-sucedido, imagem:{}", - "9e396f640866ded9c3a47268f96a36e3": "Baixando (pulling) a imagem, aguarde...\\r\\n", - "7e5f4d488d318dc7c235095c8456f5e4": "Baixar (pull) ou pesquisar imagens...\\r\\n", - "97a6dfe3a273202edffe31af7a43e220": "Falha ao usar a estação de espelhamento padrão para baixar a imagem! Tentando usar outra estação de espelhamento para baixar para você, aguarde...\\r\\n", + "0ebfb094c6482acb049e0dd0d3107307": "Envio falhou, erro de etiqueta de imagem, insira como: v1.0.1", + "d26bdd6e86002ed92089dc71347822ce": "Envio falhou, não tem permissão para enviar para este repositório!", + "82058092ad7d2c7aa5e2f012b6544e59": "Falha no envio!{}", + "2b228d4775d23d2725ec227ba648bd43": "Envio com sucesso, espelho:{}", + "9e396f640866ded9c3a47268f96a36e3": "Baixando a imagem, por favor aguarde...\\r\\n", + "7e5f4d488d318dc7c235095c8456f5e4": "Baixar ou procurar por imagens...\\r\\n", + "97a6dfe3a273202edffe31af7a43e220": "Falha ao usar a estação de espelho padrão para baixar a imagem! Tentando usar outra estação de espelho para baixar para você, por favor aguarde...\\r\\n", "484616540fc726ef4f52e97a1c2f0fef": "Falha ao baixar imagem!\\r\\n", "1cd77329b2bddfb200e656214b1fdf32": "Falha ao baixar a imagem!", - "63c709b9759af42fef890d539d822575": "Falha no download (pull)!{}\\r\\n", - "b4aba972332d1f3728171905a033fb99": "Download da imagem [{}] bem-sucedido\\r\\n", + "63c709b9759af42fef890d539d822575": "Baixar falhou!{}\\r\\n", + "b4aba972332d1f3728171905a033fb99": "Download de imagem [{}] bem-sucedido\\r\\n", "2fae21ffd185d9e9730b39bc7de23852": "Imagem baixada com sucesso!", "8a635442294fd90195a43d9a1672fc3f": "Falha ao baixar imagem!", - "711de72d616e7abb29dfa919244d382d": "Falha no download, a imagem não existe ou pode ser uma imagem privada. Você precisa inserir a senha da sua conta dockerhub!\\r\\n", - "e9511e26273da5b4537b4683668b548e": "falha no download (pull)!{}\\r\\n", - "05d13bf5dcc37754db74b2356e6e117c": "falha no download, não existe tal imagem no repositório!\\r\\n", - "714841af7f3de6c8d99ba03f4cee0ee5": "falha no download, O formato da imagem está errado, como: nginx:v 1!\\r\\n", + "711de72d616e7abb29dfa919244d382d": "Baixar falhou, A imagem não existe, ou a imagem pode ser privada. Você precisa inserir a senha da sua conta dockerhub!\\r\\n", + "e9511e26273da5b4537b4683668b548e": "baixar falhou!{}\\r\\n", + "05d13bf5dcc37754db74b2356e6e117c": "baixar falhou, Não existe tal imagem no repositório!\\r\\n", + "714841af7f3de6c8d99ba03f4cee0ee5": "baixar falhou, O formato da imagem está errado, como: nginx:v 1!\\r\\n", "2d941c4fa4da32ccafa8670a07f23c1d": "A imagem foi baixada com sucesso.", - "5282194697748d9fcd1ccd8a90428424": "Pode não haver esta imagem espelhada.", - "d6facab17334983e7c6f8c561c239820": "Falha ao baixar a imagem, esta é uma imagem privada, por favor, insira a senha da conta!", - "b507deb7848d566982b339265c8f5482": "Falha ao baixar imagem

Motivo: {}", - "e90811ef0a60b6d299b4e1064d7788d0": "Nenhuma imagem inútil!", + "5282194697748d9fcd1ccd8a90428424": "Pode não haver esta imagem espelho.", + "d6facab17334983e7c6f8c561c239820": "Falha ao baixar a imagem, esta é uma imagem privada, por favor insira a senha da conta!", + "b507deb7848d566982b339265c8f5482": "Falha no download da imagem

Razão: {}", + "e90811ef0a60b6d299b4e1064d7788d0": "Sem imagens inúteis!", + "86eb5f101087c690c1229fffceb97cba": "excluído com sucesso!", "f343313c101aeaff0516990ebea3dcef": "falha ao excluir!{}", "90ecd58b3feb0b2be11f0af685ad39fe": "A exclusão de imagens inúteis falhou e a conexão com o docker expirou. Tente reiniciar o serviço docker e tente novamente!", "0568e5e8aa7c811dd420c818189a0d46": "segundos atrás", "53c53a79f864561f8b6886b3dde7cd51": "minutos atrás", "f329a0dab82282e50e3aea9260e95d53": "horas atrás", "7a1af30a5ce889031cbc2472766159e3": "dias atrás", - "558a41d55884223583b3542e802d2b64": "O nome da imagem não pode estar vazio!", - "4097585e32152eb74bbee5ab8c463718": "O serviço docker está sendo executado de forma anormal, reinicie e tente novamente!", - "26a0931677e111565f3ff7d059b94d8b": "A configuração do gateway está errada, insira um gateway que corresponda à sub-rede: {}", - "def2ba1ce0e4d77692c14e5b984636fa": "Erro de formato de endereço de sub-rede, insira por exemplo: 172.16.0.0/16", - "716eeeb727fd667635ccf1d18891d46e": "Erro de formato de intervalo de IP, insira o intervalo de IP apropriado para esta sub-rede:", - "e310a873e7812c7f994d482604061fee": "O intervalo de IP [ {}] já existe!", + "558a41d55884223583b3542e802d2b64": "O nome do espelho não pode estar vazio!", + "aad4acc1243565c5c2ca41e5733e5fe0": "bem-sucedido\\r\\n", + "d8f5a29760a4f000dd754819b1faadcc": "falhou\\r\\n", + "73977612ef83925db43df7745df9c5eb": "\\r\\nSem resposta por mais de 10 minutos!\\r\\n", + "6345c76d66a8a9e9cdd3f9d996ff062d": "Por favor, passe cmd", + "bba401eadefa8222f3e60a312cc19f34": "Apenas comandos docker run ou docker pull podem ser executados", + "b5592904212696df3e5bcec990c8676a": "Comando perigoso existe: [ {}], execução não permitida!", + "cfff471dc04b6ba4aeb2cc2844b2c94b": "Símbolo perigoso existe: [ {}], execução não permitida!", + "f1d9b154a0c2625d828a504a8cb35682": "O comando foi executado!", + "ae178e022cf2fe30f402145572528de8": "Nomes de volume não podem ter menos de 2 caracteres!", + "365c770f123d22093084908ebcdc75fc": "Nome do volume já existe!", + "2dc51ae60242f0e5b56a9f0d176f91d4": "adição falhou {}", + "307feea9ab8928f39595316b11992cb1": "Tags de opção de driver devem ser pares dicionário/chave-valor!", + "f529949f8a98615c109ee8b8eb9f7656": "Adição falhou! {}", + "2a0f93407bb61e2403ccd032cbc64e3e": "excluído com sucesso", + "a4ec5c1fa47f2ce0c875f91ea4e7dd08": "O volume de armazenamento está em uso e não pode ser excluído!", + "11ff7153b67d275618dd3a62d1e56373": "O volume de armazenamento não existe!", + "2aa70dad9bff94a855fdde3fc113e6c5": "Exclusão falhou! {}", + "55c31f03e88bd6ad4ce7f68d425648dd": "Sem volumes de armazenamento inúteis!", + "0af5787b053c4bf5dbe610731f7d4199": "O caminho do arquivo não pode conter caracteres chineses!", + "719ee030d81490fc055af0c4426aacb9": "Detecção falhou: {}", + "ee3936ffdc910e2cb8578ad1fae322f0": "Detecção passou!", + "2e5c9168b81de403131125abe3537861": "Nomes de modelos não podem conter caracteres especiais; apenas letras, números, sublinhados, pontos e sublinhados são suportados", + "1ef49203b5ddab4a6b30eddab93c6d73": "Este nome de modelo já existe!", + "356dbf2911e78ebedbd99f13df311ce1": "Modelo adicionado com sucesso!", + "4f6a25bc1019404777b1a95b85c375f3": "Não alterou o modelo!", + "029a1a33fb7a828191eac587a4d98db4": "Erro de formato de conteúdo do modelo, insira um modelo docker-compose válido!", + "052009ea42871f16153ca6fb451be303": "Modelo modificado com sucesso!", + "550993f7a7c3863e988dc02458bb413b": "Este modelo não foi encontrado!", + "c541f51f11868ef56cf50524eeddd226": "O item não foi encontrado!", + "c3f9a083e42b21151560ba7e23667129": "O modelo não foi encontrado!", + "d5d3eedff8acf67756e21b4612aaa380": "O nome do contêiner já existe!:
[{}]", + "05073a33c4bfcb8113af6b3222a0cccd": "Esta porta [{}] já é usada por outros modelos", + "69a22232c25cb907570f837e4032ed7e": "Erro de parâmetro, por favor passe template_id!", + "35698a69135017d7f8345e32cb5a87fe": "Este modelo não foi encontrado ou o arquivo está corrompido!", + "49d5a6420e1b84d63826fa1d79e5236d": "Arquivo de modelo não existe", + "e199ad07ae94664293828e753ec2a9a8": "Modelo [{}] foi implantado pelo projeto: [{}], mude um modelo e tente novamente!", + "a3017095090064d0ec98861e35d3849c": "O nome do projeto já existe!", + "a9a92ec33cfb8eb3288cfc84edcd48ad": "Implantação bem-sucedida!", + "a180787fbf3d2e3fac72a13cb98ce513": "docker-compose muito baixo, atualize para a versão mais recente!", + "d8b370ee0351106fe38046541c421361": "O nome do projeto não foi encontrado!", + "30159c83433a6845a080ad879c0fb61d": "A limpeza foi bem-sucedida!", + "6483a5effa8c7ebce28c3838ee6f6e6e": "Limpo com sucesso!", + "5ded1fa085b4c46667f9c8871d00a46c": "{}O projeto falhou: {}", + "0e0ae38580f51369586ba6933a7c3105": "Parâmetro project_id faltando!", + "78f91123fc323aab6eb38f2bfb8e26d7": "Configuração do projeto não encontrada!", + "c3905cecf4f4eb28fcee1f4a4ad21bb0": "O parâmetro de status está faltando!", + "f3655b96aad3f0771354a12af79571dd": "Parâmetro template_id faltando!", + "79f89afa2eaf7c8da6f0ac44295dba90": "Não fez", + "5b0854983625160cfbf1295ceb6ec327": "Baixado com sucesso!", + "ce932f534479bae87f0615fa7214e5a1": "Incapaz de varrer o diretório raiz", + "bf3d793f9f908f7d2d26a1be8dbb80fe": "O caminho não existe!", + "d2fe452a7fa69442d5296b8e4832ede3": "Modelo adicionado com sucesso: [{}]", + "8d92d05b95b166c5683fdb88f7de8bed": "Falha ao adicionar modelo: nome do modelo já existe ou está formatado incorretamente [{}],Use docker-compose -f [especificar arquivo compose.yml] config para verificar", + "428ed92bf9d3198f4c9885c11fdb2be3": "Estes modelos tiveram sucesso: [{}]
Estes modelos falharam: o nome do modelo já existe ou está formatado incorretamente [{}]", + "70975749d256333f1b3b62c864ca265a": "Falha ao modificar!", + "2360e954ae9eecac28b2a3edad5e8ce0": "Modificado com sucesso!", + "11cde3a2ca81c845978b98e4a6ec471e": "O tempo de salvamento do monitoramento precisa ser um número inteiro positivo!", + "b314fb25bf654a2256bf53b0f6986c93": "Dados de monitoramento não podem ser retidos por mais de 999 dias!", + "60e46aeaed758964902dd7ae99858f03": "Lá", + "422f78617d6852c41e370982d73235ed": "Configuração falhou! Razão da falha:{}", + "dca5bd22c99a74f74074a3a53d78a58b": "{} sucesso", + "ec1ec17a5862a949e277432e1d09484d": "Configuração falhou! Razão da falha :{}", + "179a2001e96bb8d0475488f80c7216a8": "Atualizado com sucesso!", + "f4dc83b81fe6993f99c2b54494eeeec1": "Monitoramento iniciado com sucesso!", + "af79fd88d4b6f7e8a1ac05e199747fdb": "Falha ao iniciar monitoramento!", + "6f4d03d4d1ee0bd282ea744730b7ceda": "Monitoramento Docker parado com sucesso!", + "4cc06d8560bb116a38a5aae1458cbe4a": "Caminho do arquivo docker-compose não pode estar vazio!", + "8d885b86e8562c2128689c4a2601c054": "Arquivo docker-compose não existe!", + "a87b64b2d19f29438274f80ce36a3579": "A tarefa de instalação foi adicionada à fila!", + "d388487780fba74e4ff3f3b9ffbce58b": "Pode ser desinstalado!", + "c4ba6d01fd53333a6e7e85707758c550": "Desinstalação bem-sucedida!", + "b7affa7cc663144bc99b9edb3f1a027f": "A tarefa de reparo foi adicionada à fila!", + "cb49a4daafc9d27bd460967891968225": "Salvo com sucesso!", + "58fcf0699f38a60c8025330585ac205a": "Falha ao salvar, razão: {}", + "6c3e5d603d8845422e861fb0b4eed350": "Um item de configuração que não", + "f324009782d2d9e73d1087884ebc2c4c": "O root do Docker não pode estar vazio!", + "538960e1336f919e37a0d2c024c56830": "O diretório raiz atual do Docker é o diretório de destino e não precisa ser alterado!", + "a848bbd79221dfdce1c9dca536dbfada": "O formato JSON das configurações de proxy está errado!", + "edf6eb680187066c4dea216b3b20d6d2": "Configuração de proxy bem-sucedida!", + "720d2290c3082615c0f79894bfdcabd7": "Por favor, insira o endereço I Pv 6 correto!", + "b01f9411136207ad7df28b9bf2387e2a": "Atualização falhou! Razões para falha:{}", + "da896b628e3ded58445e4b015320f327": "Sobrecarga falha devido a:{}", + "efb869976990f78b3d6fcbaf270e3323": "Recarregamento bem-sucedido!", + "1b3b50aa7886ea66845ced2c18cbf6b1": "Falha na sobrecarga do perfil global:{}", + "75bbb7a00c3b5b510913952fe089f52a": "Parâmetro errado, parâmetro path!", + "273609d18876f5f9e3f021032e5b57a3": "Configuração falhou!", + "459ed27083c25b82135efedccaa60ada": "Escaneando comando de histórico de exceção {}", + "37c614d5d300e6c391808efd5363ec82": "Escaneando informações sensíveis {}", + "5ddc98a53573410c7cb65727946c5d3f": "Escaneando backdoor {}", + "6bb6be880d819a93af392183d16fccdf": "Escaneando fugas de contêiner {}", + "cd7fb7cf576b22469514b5b30f365158": "{}Escaneamento concluído", + "7d643f192968be3f8a54be28592e9176": "Falha ao escanear a imagem:{}", + "acc2731ee0f5b78d4e801d2daf814c32": "Comando de histórico anormal suspeito encontrado", + "3069c277261d044bb309e4b09ae798fa": "Foi descoberto que a imagem tem um comando histórico anormal [{}], que pode implantar malware ou código no sistema host quando o contêiner estiver em execução, causando riscos de segurança.", + "6d64734fff5534f48029ffba4aa3678d": "1.Recomenda-se verificar se o comando é necessário para negócios normais
2.Recomenda-se escolher infraestrutura oficial e confiável para evitar perdas desnecessárias.", + "6684913201a60be0b5e89c4dfb210719": "Backdoor bashrc encontrado{}", + "9a9f27d5f9f8c056fff7986c87a94c30": "Foi descoberto que a imagem tem backdoor bashrc: [{}], conteúdo de código malicioso:
{}", + "d8a828116070b9d92315ca309cca1991": "1. Entre no contêiner implantado usando a imagem e exclua o código malicioso sob o arquivo
2. Verifique se o contêiner foi invadido e atualize o token de acesso ou senha da conta do negócio no contêiner
3. Recomenda-se substituir a imagem oficial ou outros contêineres de implantação de imagem confiáveis", + "e1439f3f7d25d378078d513a82a3fa87": "Arquivo de backdoor encontrado{}", + "9ede9d4bd542eedf78e39b0acf0206e3": "Foi descoberto que o arquivo de backdoor bashrc [{}] existe na imagem, e o conteúdo do código malicioso é:
{}", + "686765b4612ecd8f774648db29a1541d": "backdoor cron descoberto{}", + "390bdc0b3c37a56ede9467b0c220a3b6": "Foi descoberto que o backdoor cron [{}] existe na imagem, e o conteúdo do código malicioso é:
{}", + "caea084281a3cb2515e5618cd3856163": "Backdoor do sistema encontrado:{}", + "d04061273caa56d5a0c3d74f3e9fd482": "Foi descoberto que o arquivo de backdoor systemd [{}] existe na imagem, e o conteúdo do código malicioso é:
{}", + "fc76e0fe415c49cc1c09bf76035fc4e9": "Backdoor sshd encontrado{}", + "00b2409f52ef5bc56afe29ccbe5cfa2c": "Encontrado o backdoor de link suave sshd: {}, o arquivo atinge o recurso malicioso [exe={};link_file={}]", + "e747da31a54cd71fb1a2860cae0f9f77": "Backdoor tcpwrapper encontrado{}", + "a2b09164c8d23894736bcc6a646861e0": "Foi descoberto que o arquivo de backdoor tcpwrapper [{}] existe na imagem, e o conteúdo do código malicioso é:
{}", + "a7fd9f6b190b8531039376fbbda5f482": "Usuários encontrados em risco de fuga{}", + "5d46ed5f4af3f30cfcc8bd66942f93b4": "O nome de usuário {} pode completar a fuga do contêiner através do comando [{}], permitindo que o atacante obtenha direitos de acesso ao host ou outros contêineres. Conteúdo malicioso:
{}", + "4ca0a18aa36a60613104cacdae514dec": "1. Recomenda-se excluir a imagem ou não usá-la mais
2. Se já houver um negócio usando a imagem, entre no ambiente do contêiner e exclua o conteúdo do usuário {} no arquivo /etc/sudoers.", + "611afea08ae3b216a34dfde4c143f46c": "Versão do sistema não suportada", + "221d1ea3c23f430e03a4486dca865014": "O contêiner não existe, atualize o navegador e tente novamente!", + "7e88e25ea6c628c2d03c526c04af3eed": "Falha ao obter status do contêiner: ", + "c0ef08aa7bd6276137ccd491a8041223": "Não há volume para fazer backup", + "584e35dd4a55da88bd232ac7a19b9b95": "A tarefa de backup foi criada com sucesso.", + "0b08674e1c87f3f8508a4ae9b0c160f8": "Falha ao criar uma tarefa de backup {}", + "13d829d3f2b78c971207d944f2a96c55": "Falha ao excluir o arquivo, razão: {}", + "ea848f5d6978f5916cd3df4191195e2a": "O host já existe!", + "7aa425b3819e79208faaed38fe137f34": "Falha ao conectar ao servidor, verifique se o docker foi iniciado!", + "c90ca78b1fc8554e867a696d30255cba": "Adicionar host docker com sucesso!", + "8ee5196fbd93bf345bf018132e808a0a": "Excluir host com sucesso!", + "7c6f761019365f8a5cfb2fb54d9e199d": "info.json foi baixado!", + "10066fce84fe34e9cc33e0338532988b": "O download de info.json falhou!", + "0672e579ab0e3454713eb683ddcc4859": "{} Download falhou, por favor ressincronize!", + "8e790e81fffa7f51d099f710bd8f82cf": "{}Teste de arquivo yml falhou,{}", + "371acfea202589c4efd6724888f66595": "{} Download concluído!", + "51cf61e34b3f71ce1e430cdfcf129b80": "{} Descompressão falhou", + "c59b65890496cdf2b14d127a1f76f73d": "{} extraído com sucesso", + "0117718c35c7a16a62de5c259e1d35ee": "Criação de diretório falhou pelas seguintes razões: {}", + "374e3fe41b55a0b29420e455fb514dd6": "O volume de armazenamento foi criado", + "6d0d40f64f89227daf345eb2257638e8": "{} não pode conter Espaços", + "a00b49ace55de909015029a0d6d6096f": "{} não pode ser nulo!", + "54498312bb8f97ce07a9a0b0b47cfad1": "Porta do servidor [ {}] está ocupada, mude para outra porta!", + "47b74e08252747225c49ea0cb011c79e": "Inicialização do projeto falhou {}", + "838089af9a2941a49862f342c056a8ca": "Iniciar criação do projeto", + "9b149598fb30f54fec9e82a3d121a464": "{} já existe, por favor mude o nome do projeto", + "634370637f6a5b88940c75f826953d0c": "Falha na criação do diretório do projeto do usuário, detalhes: {}", + "f7b14d3f642d711a23d5a0cca725fd0d": "Falha ao copiar diretório do projeto. Detalhes: {}", + "7bdaccb3d20432c5e0150862ab1cc3f3": "Faltando parâmetros name", + "9b90b5b49486a61d9b0e6dbbbcb56cad": "Faltando parâmetros container_info", + "b23d7110e9bf6539b4964afe0d4934e2": "O agrupamento já existe", + "a90ca6939fe71693c145f50596c6e0e6": "Contêiner {} foi adicionado pelo grupo {}!", + "e3cf7e2f2d14257e7ea33657b135d534": "Adição falhou:{}", + "fcbeb38a63ced9d3de476fb08c31d71e": "Faltando parâmetros id", + "fe4e0032f69b4100ed143d475e8b5050": "Edição com Sucesso", + "6c4ed52bea35c4c43839b8f0b44489f9": "Edição falhou:{}", + "6c0129a45e9da4e1820335f3d06a869f": "Exclusão falhou:{}", + "2a743a86676fd52214d3c0af1b0238b5": "Erro de Parâmetro status", + "f95136e5c1f3ccbb09ace8fc24f1e0ca": "Operação do contêiner [{}] falhou", + "2e01172e31495f41fcebcf3f831cc82c": "Operação bem-sucedida", + "244a98f8c45f938980f48b168aef02c9": "Operação falhou:{}", + "fc431240dfc80a731900d5f2ddb6dfc3": "Ordem de início do contêiner {}", + "5ea6c6eea14c24c92eeeccaeea5c46dc": "Estado inválido!", + "cb337dbfbc18aafa482051b6fc349dea": "Falha ao obter o arquivo de configuração", + "84d3fc0c1c70fcd6fdd7ca7c3be11225": "O projeto já existe!", + "a280b122a0b3249c26b1f94ad4573f50": "Gravação falhou!", + "72b8d771409a71a6650a65e1174cec30": "O projeto foi adicionado com sucesso!", + "0fa934d82d7863e34606d19520d12e48": "Ordem de contêiner inválida!", + "eedeb135fe678559787fe2cb304f24cc": "A ordem do contêiner foi modificada com sucesso!", + "0c1dcdb6582992fa9ec4169c7c958e47": "O projeto não existe.", + "4ec9c8311b7814ee0f17b634cb7a6ae0": "O intervalo do projeto foi modificado com sucesso!", + "cda91d4feb0c7cceb0fa1aeabcf536b4": "Iniciando contêineres sequencialmente!", + "97f2a2dcbe0d211b8972c6151950b213": "O seguinte contêiner está em execução: {}. É permitido forçar parada e depois iniciar? Você também pode optar por parar manualmente um contêiner em execução!", + "9d160eff84c44041cf4eb5c624874c4e": "Iniciar lançamento de contêineres sequencialmente!", + "33b5d440d17f3837309707b5b049e899": "Parando contêineres sequencialmente!", + "b687943a0a61ed9f039213d7c5e0fcca": "Contêineres começam a parar em ordem", + "ec7b13b39406a81e90df7b7d06a4b134": "Estado inválido!", + "0df1e0596d9e1835d62be1b5ba537fac": "Contêiner {} já foi adicionado pelo grupo de projeto {}!", + "d6d90f977089e176ec7443db17c41279": "Contêiner adicionado com sucesso!", + "04cd9210bf9290bda98bc76ca4bc59fd": "Contêiner excluído com sucesso!", + "d867a5e10a7a9485129c679b85453e3f": "Projeto excluído com sucesso!", + "4097585e32152eb74bbee5ab8c463718": "O serviço docker está rodando anormalmente, por favor reinicie e tente novamente!", + "26a0931677e111565f3ff7d059b94d8b": "A configuração do gateway está errada, Por favor insira um gateway que corresponda à sub-rede: {}", + "def2ba1ce0e4d77692c14e5b984636fa": "Erro de formato de endereço de sub-rede, por favor insira por exemplo: 172.16.0.0/16", + "716eeeb727fd667635ccf1d18891d46e": "Erro de formato de intervalo IP, por favor insira o intervalo IP apropriado para esta sub-rede:", + "e310a873e7812c7f994d482604061fee": "Intervalo IP [ {}] já existe!", "db88b911ea66744c24b22efcafef2101": "A versão do kernel do sistema é muito baixa, atualize o kernel ou escolha outro modo de rede", "9cebb294a44695984eaaf2134df63a51": "O nó atual não é um Swarm e precisa ser configurado antes de poder ser usado", "85ac438bd64f13e2ad61cf60e5ade3d3": "Falha ao adicionar rede! {}", @@ -2275,158 +2351,187 @@ "87574a543563d2e037b87a6cf705e3ff": "A rede padrão do sistema não pode ser excluída!", "23b6d9d6c36088deb928efad7fb9b63b": "A rede não pode ser excluída enquanto estiver em uso!", "8f512551c7ddf61331c3d068e80c642c": "Não há redes inúteis!", - "08efe6a4e12437b79225c8b59fd710eb": "O ID da rede não pode estar vazio", - "a636381ee5e6d6d021fff745ca132905": "O ID do contêiner não pode estar vazio", - "31a75a8d220d37dc4a7ea28d0f24cc19": "Desconexão de rede bem-sucedida!", - "a2b9895fca7698902da9319b52392366": "ID do contêiner: {}, não existe!", - "c81f03a558307d5aaf3b339af28e04ff": "ID da rede: {}, não existe!", - "12a90fe85b8863e1dea43284988d7750": "A desconexão da rede falhou! {}", + "08efe6a4e12437b79225c8b59fd710eb": "ID de Rede não pode estar vazio", + "a636381ee5e6d6d021fff745ca132905": "ID de Contêiner não pode estar vazio", + "31a75a8d220d37dc4a7ea28d0f24cc19": "Desconexão de rede foi bem-sucedida!", + "a2b9895fca7698902da9319b52392366": "ID de Contêiner: {}, não existe!", + "c81f03a558307d5aaf3b339af28e04ff": "ID de Rede: {}, não existe!", + "12a90fe85b8863e1dea43284988d7750": "Desconexão de rede falhou! {}", "6226d2fef3bf047236f0f3a57dcd71fb": "Conexão de rede bem-sucedida!", "d882b8375782b1bc56ccaf84ed27d20b": "Falha ao conectar à rede! {}", "0e8623af4dd4d3b732904872d22fbf83": "O nome da rede não pode estar vazio!", "5aa2044b58e63d58ddecc69421802404": "Gateways podem", - "ceaa20eefd6749452a947c7f5dfa4eb0": "Os intervalos de IP não podem estar vazios!", - "c3e2cce9a4a1b26f46f462f34ae391b9": "Falha ao criar uma rede!", - "ea5ceb520cc09fe27e09528b98bd2d": "Nome da rede: [{}] já existe!", + "ceaa20eefd6749452a947c7f5dfa4eb0": "Intervalos de IP não podem estar vazios!", + "c3e2cce9a4a1b26f46f462f34ae391b9": "Criação de rede falhou!", + "ea5ceb520cc9b09fe27e09528b98bd2d": "Nome da rede: [{}] já existe!", "9cdc09516d85ae057d1d9bedc988849e": "Rede criada com sucesso!", - "5395cc8155f62a666b8f0d0f9f207676": "As informações do repositório já existem!", - "9b10e472adfe6372c9175b9002f098fd": "[Repositório oficial Docker] Não editável!", - "5858be44c285048a8f51c126b2fd23e9": "Falha na edição! Motivo: Falha na descriptografia da senha da conta! Exclua o repositório e adicione-o novamente", - "7e51d0e26e1b467aff3c89d3e0751ec0": "Falha na edição! Motivo:{}", - "6478f13dd58e5a4329e19be9020243ff": "Este repositório não pôde ser encontrado", - "d5309f3186607eb36bee41e8a28cea3a": "Edição bem-sucedida!", - "9e20bffc0d4093d18fcbc5c98fa0fd87": "[Repositório oficial Docker] não pode ser removido!", - "a62336a87697ab6911ba550015a798ef": "Falha na exclusão, o id do repositório pode não existir!", - "54197759827cfaf0cdb1e213fa49771e": "Teste de login falhou! Motivo: Pode ser erro de senha da conta, verifique!", - "657a0b7e82731fb4ae516d14081f17d0": "Teste de login falhou! Motivo: {}", - "221d1ea3c23f430e03a4486dca865014": "O contêiner não existe, atualize o navegador e tente novamente!", - "7e88e25ea6c628c2d03c526c04af3eed": "Falha ao obter status do contêiner: ", - "cb337dbfbc18aafa482051b6fc349dea": "Falha ao obter o arquivo de configuração", - "84d3fc0c1c70fcd6fdd7ca7c3be11225": "O projeto já existe!", - "a280b122a0b3249c26b1f94ad4573f50": "Falha na gravação!", - "72b8d771409a71a6650a65e1174cec30": "O projeto foi adicionado com sucesso!", - "0fa934d82d7863e34606d19520d12e48": "Ordem de contêiner inválida!", - "eedeb135fe678559787fe2cb304f24cc": "A ordem do contêiner foi modificada com sucesso!", - "0c1dcdb6582992fa9ec4169c7c958e47": "O projeto não existe.", - "4ec9c8311b7814ee0f17b634cb7a6ae0": "O intervalo do projeto foi modificado com sucesso!", - "cda91d4feb0c7cceb0fa1aeabcf536b4": "Lançando contêineres em sequência!", - "97f2a2dcbe0d211b8972c6151950b213": "O seguinte contêiner está em execução: {}. É permitido forçar a parada e depois iniciar? Você também pode optar por parar manualmente um contêiner em execução!", - "9d160eff84c44041cf4eb5c624874c4e": "Começar a lançar contêineres em sequência!", - "33b5d440d17f3837309707b5b049e899": "Parando contêineres em sequência!", - "b687943a0a61ed9f039213d7c5e0fcca": "Contêineres começam a parar em ordem", - "ec7b13b39406a81e90df7b7d06a4b134": "Status inválido!", - "0df1e0596d9e1835d62be1b5ba537fac": "O contêiner {} já foi adicionado pelo grupo de projeto {}!", - "d6d90f977089e176ec7443db17c41279": "Contêiner adicionado com sucesso!", - "04cd9210bf9290bda98bc76ca4bc59fd": "Contêiner excluído com sucesso!", - "d867a5e10a7a9485129c679b85453e3f": "Projeto excluído com sucesso!", - "459ed27083c25b82135efedccaa60ada": "Verificando {} histórico de comandos de exceção", - "37c614d5d300e6c391808efd5363ec82": "Verificando {} informações sensíveis", - "5ddc98a53573410c7cb65727946c5d3f": "Verificando {} backdoor", - "6bb6be880d819a93af392183d16fccdf": "Verificando {} escapes de contêiner", - "cd7fb7cf576b22469514b5b30f365158": "{}Verificação concluída", - "7d643f192968be3f8a54be28592e9176": "Falha ao verificar a imagem:{}", - "acc2731ee0f5b78d4e801d2daf814c32": "Comando de histórico anormal suspeito encontrado", - "3069c277261d044bb309e4b09ae798fa": "Foi descoberto que a imagem tem um comando histórico anormal [{}], que pode implantar malware ou código no sistema host quando o contêiner estiver em execução, causando riscos de segurança.", - "6d64734fff5534f48029ffba4aa3678d": "1. É recomendado verificar se o comando é necessário para o negócio normal
2. É recomendado escolher infraestrutura oficial e confiável para evitar perdas desnecessárias.", - "6684913201a60be0b5e89c4dfb210719": "Backdoor bashrc encontrado{}", - "9a9f27d5f9f8c056fff7986c87a94c30": "Foi descoberto que a imagem tem backdoor bashrc: [{}], conteúdo do código malicioso:
{}", - "d8a828116070b9d92315ca309cca1991": "1. Entre no contêiner implantado usando a imagem e exclua o código malicioso no arquivo
2. Verifique se o contêiner foi invadido e atualize o token de acesso ou senha da conta do negócio no contêiner
3. É recomendado substituir a imagem oficial ou outros contêineres de implantação de imagem confiáveis", - "e1439f3f7d25d378078d513a82a3fa87": "Arquivo de backdoor encontrado{}", - "9ede9d4bd542eedf78e39b0acf0206e3": "Foi descoberto que o arquivo de backdoor bashrc [{}] existe na imagem, e o conteúdo do código malicioso é:
{}", - "686765b4612ecd8f774648db29a1541d": "Backdoor cron descoberto{}", - "390bdc0b3c37a56ede9467b0c220a3b6": "Foi descoberto que o backdoor cron [{}] existe na imagem, e o conteúdo do código malicioso é:
{}", - "caea084281a3cb2515e5618cd3856163": "Backdoor de sistema encontrado:{}", - "d04061273caa56d5a0c3d74f3e9fd482": "Foi descoberto que o arquivo de backdoor systemd [{}] existe na imagem, e o conteúdo do código malicioso é:
{}", - "fc76e0fe415c49cc1c09bf76035fc4e9": "Backdoor sshd encontrado{}", - "00b2409f52ef5bc56afe29ccbe5cfa2c": "Encontrado o backdoor de link simbólico sshd: {}, o arquivo atinge o recurso malicioso [exe={};link_file={}]", - "e747da31a54cd71fb1a2860cae0f9f77": "Backdoor tcpwrapper encontrado{}", - "a2b09164c8d23894736bcc6a646861e0": "Foi descoberto que o arquivo de backdoor tcpwrapper [{}] existe na imagem, e o conteúdo do código malicioso é:
{}", - "a7fd9f6b190b8531039376fbbda5f482": "Usuários encontrados em risco de fuga{}", - "5d46ed5f4af3f30cfcc8bd66942f93b4": "O nome de usuário {} pode completar a fuga do contêiner através do comando [{}], permitindo que o invasor obtenha direitos de acesso ao host ou outros contêineres. Conteúdo malicioso:
{}", - "4ca0a18aa36a60613104cacdae514dec": "1. É recomendado excluir a imagem ou não usá-la mais
2. Se já houver um negócio usando a imagem, entre no ambiente do contêiner e exclua o conteúdo do usuário {} no arquivo /etc/sudoers.", - "611afea08ae3b216a34dfde4c143f46c": "Versão do sistema não suportada", - "68ae8c43a52aac63c5c62e1974afdda6": "O ID do script não pode estar vazio", + "45a0bbacbe8d5ea062167e88423e4573": "servidor nginx ou apache não detectado, instale um primeiro!", + "bdaf560796795d6a303bc9a1d75a34c5": "Tipo de Projeto [{}] Domínio Existente: {}", + "4588a786e80c83c2cbde37b930c3d778": "Porta do servidor [ {}] não está em uso, insira a porta em uso para reverter!", + "6888cf6586ce3c187150146a2d1db0ac": "Falha ao adicionar, banco de dados não pode ser gravado!", + "e6bddfc6a0bbf72d592236c61b411f9a": "Adição falhou com erro: {}", + "1bfa1b1738332c4835f5efe7c54ab9c2": "erro de parâmetro!", + "0d66954ff42aa042c219a356266f5bc0": "Nenhuma informação de proxy reverso detectada!", + "6169a7282b361deb5f6f5b6e18f9426e": "erro de parâmetro cmd", + "286933a4f24bee0eed1f9300f70a30c7": "Apenas o comando docker run pode ser executado", + "a46a6b274dcbfc5a629d234c2816a165": "Existem símbolos de perigo: [{}], Execução não permitida!", + "8135363a6a5e2c145c6cedab8ac1e510": "O formato da porta está errado, este método não é suportado!", + "3b825826968319b6256c4020cc49676f": "A porta do servidor [{}] já está ocupada, substitua por uma porta diferente!", + "70b35bb3bb2fe425a981e8cc68c06906": "Por favor, baixe a imagem que você precisa", + "e768fcd4ff22e2f3cc2535f1ea9c5682": "A imagem não existe!", + "7dc29c1ed7012513111b11f56c73a4f8": "A cota de memória excedeu a quantidade disponível!", + "73aff7a8ab244bc5d0d1448e9a0ae6f0": "A cota de memória não pode ser inferior a 6MB!", + "2c4eca852599890038970a7e0f384470": "Imagem [{}] não existe, Você pode tentar [Forçar Download]!", + "56a727f1edc5f008ee8f41a638662322": "cota de cpu excedeu núcleos disponíveis!", + "45c163fd880ce5a21373fbd53bbcd642": "Reserva de memória não pode ser inferior a 6MB!", + "bf6b8400e1726aadf1cee7d6c1c5d173": "O formato do nome da imagem está incorreto.tal como:nginx:latest", + "f0beb6e739348ae10c9f15cb91638d2f": "Falha na criação do contêiner, detalhes: {}!", + "e5d4020fc5f8c26e22add8db8a62f06a": "A cota de memória não pode ser menor que a reserva de memória!", + "c68d012ef602a12e38636c306c10c894": "O nome do contêiner ou ponte de rede já existe. Por favor, mude o nome do contêiner e tente novamente!", + "c4272ed0aaf1e7e2bcc08f1003c2391d": "Não há comando de inicialização nesta imagem, especifique o comando de inicialização do contêiner!", + "a73eb9f1fb82232c9f70bb80024a9d9c": "Exceção de permissão! Detalhes:{}", + "196a4f415d73b007e0627563a530967e": "Falha na criação do contêiner! Reinicie o serviço docker no momento apropriado!", + "ea7b2beec49a425b5742339d00a5aeb8": "Imagem [{}] não existe!", + "c29c7e4f72858367cd21d10303411592": "Nome do contêiner já existe!", + "c4dc041770b8a0e34d1399141d0e4de8": "O nome do contêiner é inválido", + "97bcbd1e3b4df0f1c6ec642e7be17afe": "Porta do servidor {}em uso! Mude a outra porta", + "994e5a057aca3524ba773ec33228e184": "Falha na criação! {}", + "00ff90441ea0bdece5d9e5c72efa14a7": "A criação do contêiner falhou e a conexão com o docker expirou!", + "8879635d66ad75dcbfc8c31ba1351116": "Contêiner falhou ao rodar! {}", + "71dc70f7ab3a4bc0c2a7141718d3a9b2": "Falha na criação!", + "1983b37067c7e94095a5113786fdef9c": "Edição falhou, tempo limite de conexão com docker, reinicie o docker e tente novamente!", + "c558fedcb5850939202e684ff32c7c50": "Atualização falhou!{}", + "ed0029af5f77a5dfacbc2452e8c3ec92": "ID do contêiner anormal", + "c5b3db7efde90edcb803a4a79e559b21": "O nome da nova imagem não pode estar vazio!", + "b10305369ebb41ef24699b8137733465": "O espelho não existe!", + "9e90efb62702b147b71e8731290caf44": "A imagem [{}] não existe, tente verificar [Forçar download de imagem] e tente novamente!", + "6cfa55c53df6db8efa59aa2ae6cef97a": "O novo contêiner não foi criado com sucesso, e o contêiner antigo foi restaurado. {}", + "1f004e412319b7ed472624e011b3d2ba": "Atualização bem-sucedida!", + "a2ea046c20d2da5cebf2dea01a62dabe": "Atualização falhou! O estado do contêiner foi restaurado", + "b84bf4d95051856f9965b55bb5402de3": "Contêiner não existe!", + "d567f353b12e618571935661f31c2a16": "Edição do contêiner falhou e a conexão com o docker expirou.", + "f2124ee490df203b3f86509401c76a09": "O contêiner foi editado com sucesso, e a sub-rede não foi especificada quando a rede [{}] especificada atualmente foi criada, e o IP não pode ser personalizado, e o IP foi atribuído automaticamente a você!", + "b95d75cd8e04e9cca297c3cd1091b2eb": "O contêiner foi editado com sucesso, a configuração da rede [{}] falhou, e o endereço IP foi atribuído automaticamente a você, detalhes do erro:{}!", + "4363bb34365a67238ecc6a98ce46b361": "A imagem foi gerada, e{}", + "4bb30e8d57a6a7e548758daf4ac33983": "enviado com sucesso!", + "a32e1f09fc2739d94c51a7168675e0e9": "Falha no envio!{}", + "172f51d3307b02aeb6dc703a442f4724": "Falha ao obter contêiner", + "684fc00ae67504a56c09ef71431b1261": "Exportado com sucesso para:{}", + "f9a48b804d917398e795016687f3b0f4": "Por favor, desative a [Proteção contra violação para Empresas] antes de tentar!", + "3ab9d9b76e8d22434930622b5f0acc6a": "O contêiner foi excluído!", + "d1fe1d6e5e8c17b60f749ad36ff3bcaa": "porta do servidor ipv6 [ {}] está ocupada!", + "9f13645ac42f0c9908a35637a525d561": "porta do servidor ipv4 [ {}] está ocupada!", + "8708a53096a7d7bce5d3042be8feb736": "Parada bem-sucedida!", + "5dc7c5bba9e3ff6d293a9cd6459bc1ae": "O contêiner pausou.", + "458c9e6b1324cc3843c313c99a9c8623": "Parada falhou!{}", + "d40b23e847e0619c6e2133eebfd51807": "O ID do contêiner está vazio", + "239aa38adb7ae2339600a015d8695f3d": "O contêiner não", + "b10f78da3571670e8567e599aba8d475": "Falha ao obter informações do contêiner!{}", + "4e62f10d98b7560d22cf614879790624": "Sem registro de contêiner", + "4bfb779dfe8300c1f2da1f1dae06a4ce": "conexão docker falhou", + "e9b0defc5226436d7d2580972376cad0": "erro de parâmetro,Passe: type", + "d0e42e6dd40adc10d0027ab9993d8741": "Diretório de log do contêiner não existe, corte de log não pode ser definido!", + "3af555ace78d310a5db6e9449ed6843b": "Aberto com sucesso!", + "641fe4d504d197e8570f3bc693f5c15b": "Fechado com sucesso!", + "e04e8dc32dc0f13aea94cb4996a0057c": "O arquivo de log não existe", + "3e0f56b62a18226db6b8c71e8c917be4": "Limpeza de log bem-sucedida!", + "81259d9e5861e65db29844c19d9feb80": "Sem contêineres inúteis!", + "53a5658dfa0a2e85083fd63b961d35be": "excluído com sucesso!", + "dac7d97aeb94cf9d3b3b5d7d072c4cff": "Por favor, desative a proteção contra violação empresarial antes de tentar novamente!", + "32ca87e65c5fc75d3857767417b56439": "falha ao excluir! {}", + "b0ea22ff0b389c2a32b8f4367ab650db": "Erro de parâmetro, por favor passe política de reinício restart_policy!", + "3b2f70397fa8a827c7146cbd900f7222": "Atualização falhou! {}", + "c147897a9d1746a58de531e9c0158c23": "O contêiner não está iniciado e não pode ser renomeado!", + "a89c2e8f7eb81399f984330e55014c6f": "Renomear com sucesso!", + "8a615b544c027899738b19f2cc40fd93": "Falha ao renomear! {}", + "3506ae5524d7b5dbd75ed328349e065e": "Definir topo com sucesso!", + "363b76cd4207ec1adb31b9f7ee3930c8": "Desafixado com sucesso!", + "0fffc4397713115e14ef45273241dfbb": "Erro de parâmetro, Por favor passe: remark!", + "dce2cbc7791016e4876ab144e53b4f82": "Erro de parâmetro, Por favor passe: id!", + "ca1bc3e1d32b99b90395da47b88576a9": "Erro de parâmetro, Por favor passe: ws_callback!", + "b4770fb21a608a5ba1ecacae409093d0": "Erro de parâmetro, Por favor passe: _ws!", + "68ae8c43a52aac63c5c62e1974afdda6": "ID do Script não pode estar vazio", "eee298ea1d9259c2f0e2061ecd89c21c": "O script especificado não existe", "b68a8dd0c887719b7cc3e10dc11843ce": "O script integrado do aapanel não pode ser excluído", - "aefb82d7caf36c7f34a4cf60168a1297": "Este script está sendo usado atualmente pela tarefa [{}], exclua a tarefa primeiro!", - "4223589c4945a6757845760cf467a183": "Este script está sendo usado atualmente pelo evento da tarefa [{}], exclua o evento da tarefa primeiro!", + "aefb82d7caf36c7f34a4cf60168a1297": "Este script está sendo usado atualmente pela tarefa [{}], por favor exclua a tarefa primeiro!", + "4223589c4945a6757845760cf467a183": "Este script está sendo usado atualmente pelo evento da tarefa [{}], por favor exclua o evento da tarefa primeiro!", "2e32a56c4ec44d75ff6cf5c6ac366db8": "Script excluído com sucesso [", - "16687cbe6e87af3bc2762f0410453ec5": "O nome ou conteúdo do script não pode estar vazio", + "16687cbe6e87af3bc2762f0410453ec5": "Nome ou conteúdo do script não pode estar vazio", "1e156c08409accc1dc3da5c395c3ea22": "Erro de tipo de retorno", "4371a6ff5a908b5ed6f43d52b49f7d30": "Erro de tipo de script", - "91896a15daf4558843249e11b7aa1fc5": "Falha na modificação", + "91896a15daf4558843249e11b7aa1fc5": "Modificação falhou", "919c17a8f22c59f9af57399aa649003e": "Script modificado com sucesso [", "71c95be7ca536d92d8f175fa245ddeb0": "Este script requer parâmetros", - "7ef6898209b89f4ace813b19f5eac840": "Erro na execução do script, verifique se o código do script está correto:\\n{}", - "2086e84cd166412cf7236bdfb66e6d6f": "Falha na execução, mensagem de erro:\\n{}", + "7ef6898209b89f4ace813b19f5eac840": "Erro de execução de script, verifique se o código do script está correto:\\n{}", + "2086e84cd166412cf7236bdfb66e6d6f": "Execução falhou, mensagem de erro:\\n{}", "7a38e49c19eace49f0e9a0d03efadd1b": "Execução bem-sucedida: \\n{}", "5e1459e1ff5449309bd13d173dca1197": "O nome da tarefa não pode estar vazio", - "028f9aecc8c5edf83c2480f3ad9a62b0": "O conteúdo do script e o ID do script não podem estar vazios ao mesmo tempo", - "540b2cc165934ef688f12e044c500f69": "O tipo de tarefa não pode estar vazio", - "14ccb76798e0752c668bf447e7c536dd": "A expressão Crontab não pode estar vazia", + "028f9aecc8c5edf83c2480f3ad9a62b0": "Conteúdo do script e ID do script não podem estar vazios ao mesmo tempo", + "540b2cc165934ef688f12e044c500f69": "Tipo de tarefa não pode estar vazio", + "14ccb76798e0752c668bf447e7c536dd": "Expressão Crontab não pode estar vazia", "db17fc000dce92ec98ef53267f816b9c": "Expressão crontab inválida", "cb541ef3c967a13cb4b1185a661214cf": "Script não existe", "ed1bb81caf44e6b159848fcd0b28b0a4": "Este script requer parâmetros de script", - "14753fa53d0a8928c69d56611bdb43d7": "A tarefa já existe", - "aa76a4150f28fd8de372eb5fa2646a2f": "O horário de início definido não pode ser anterior ao horário atual", + "14753fa53d0a8928c69d56611bdb43d7": "Tarefa já existe", + "aa76a4150f28fd8de372eb5fa2646a2f": "O tempo de início definido não pode ser anterior ao tempo atual", "89c375395150b0550b20cdf31faf4ef5": "Tarefa não existe", - "1df9f0729d55ed5e561bdf73b6b14976": "O ID da tarefa não pode estar vazio", + "1df9f0729d55ed5e561bdf73b6b14976": "ID da Tarefa não pode estar vazio", "497b38d4da5f19ed3f041f4ae6af6059": "Run_stcript_id e run_stcript requerem pelo menos um valor válido", "cf76609030a04a8e357171a25d76f2e8": "Por favor, use um dos seguintes operadores:{}", "bb4d743f102448bf1ad62e1f1bd25e21": "A tarefa especificada não existe", - "56fcd6720b5bd174b1d614b7c7761fd5": "O script requer parâmetros, preencha os parâmetros", + "56fcd6720b5bd174b1d614b7c7761fd5": "O script requer parâmetros, por favor preencha os parâmetros", "809888a81d143c1118d056643719a133": "Falha ao adicionar evento de gatilho", - "dd66e7c4d78fab1dfd30524d47af971e": "O ID do evento não pode estar vazio", + "dd66e7c4d78fab1dfd30524d47af971e": "ID de Evento não pode estar vazio", "8abc3d5d0d73a76ae66603858617ad1b": "O evento especificado não existe", - "858080b55748bca57bca9006f2c36e10": "Modificação do evento bem-sucedida", - "f9fe8aba24799e53034cfd45a3c96824": "Falha na exclusão do evento", - "101da618f72223d3eac9e66fe510b04f": "O ID do evento da tarefa não pode estar vazio", - "bee903cc3d03ab2c237eefb1d601fbcb": "Falha na execução do script com mensagem de erro:\\n{}", + "858080b55748bca57bca9006f2c36e10": "Modificação de evento bem-sucedida", + "f9fe8aba24799e53034cfd45a3c96824": "Exclusão de evento falhou", + "101da618f72223d3eac9e66fe510b04f": "ID de evento de tarefa não pode estar vazio", + "bee903cc3d03ab2c237eefb1d601fbcb": "Execução de script falhou com mensagem de erro:\\n{}", "1d78758685e5e2f4efeeb490f8521abd": "\\n", "ca6977d373320a7fdb51047199d4cc59": "Adminer não está instalado!", - "38641e6ce3a6369e108eb595672c8edc": "Desinstalação bem-sucedida!", - "9cae26284a7ad2f46132c1e8e196d089": "Instalação bem-sucedida!", - "a9a92e55770213c8aa1fb2871dc43563": "Porta do Adminer definida com sucesso!", + "38641e6ce3a6369e108eb595672c8edc": "Desinstalar com Sucesso!", + "9cae26284a7ad2f46132c1e8e196d089": "Instalar com Sucesso!", + "a9a92e55770213c8aa1fb2871dc43563": "Definir porta Adminer com sucesso!", "b611124a9bad44e328d7ce809912802d": "Definido com sucesso!", - "2321763bf0b4cbf345b1e19dc9faec47": "Versão php do Adminer definida com sucesso!", + "2321763bf0b4cbf345b1e19dc9faec47": "Definir versão php Adminer com sucesso!", "40a1f70c155550ad2dafa5e556e10c3c": "Versão PHP não instala!", "e75e68c65607a7cfcc570d51345d7e33": "Monitor de arquivo", - "983e2622c48ae7231c5d29b135133b0e": "Adicionar diretório de monitoramento: {}", - "15c7df4ddd1d366c2cdfa2689c15369d": "Falha na compilação do programa de filtro de IP", - "423c2da1e20a5f2138cc810423475eef": "O endereço IP não pode estar vazio!", - "1e116dc22492b28a7a38a6029416d0e1": "O endereço IP está no formato incorreto!", + "983e2622c48ae7231c5d29b135133b0e": "Adicionar diretório monitor: {}", + "15c7df4ddd1d366c2cdfa2689c15369d": "Compilação do programa de filtro IP falhou", + "423c2da1e20a5f2138cc810423475eef": "Endereço IP não pode estar vazio!", + "1e116dc22492b28a7a38a6029416d0e1": "O endereço IP está no formato errado!", "8c8f15a1c1cce8bbdc465e865c804b40": "O período máximo de bloqueio não pode exceder 24 dias!", "fb86e24ffe47ba150610ba1efd96929a": "Bloqueio temporário de blocos CIDR de endereço IP não é suportado", "bdb199a03e52488d499ea6bb0cb0d1ed": "WAF é necessário para bloquear segmentos de endereço IP", "1ac8e9ffcea7cf6e9fa183c1b9038599": "Os dados de IP não existem!", - "04d46623edcb5663566cf43f575de9b2": "O nome do site não pode estar vazio!", + "04d46623edcb5663566cf43f575de9b2": "Nome do site não pode estar vazio!", "4dcde63f7fd4415f3b5eb6cb889d135c": "A adição foi bem-sucedida", "d303480175994c6ad240cf24a4a99640": "Configuração do site não existe!", - "87d1f7257214d09ba39656b72c864bac": "Configuração da conta bem-sucedida!", + "87d1f7257214d09ba39656b72c864bac": "Configuração de Conta bem-sucedida!", "aa5bb2d58da86c4b9160e94d0c4538f1": "URI não pode estar vazio!", - "ade0ab88aa0ee9c18f0979d5b62b517d": "O URI já existe, por favor não adicione novamente!", + "ade0ab88aa0ee9c18f0979d5b62b517d": "A URI já existe, por favor não adicione novamente!", "506d9cb0cb2468fd09048bcbe8b37497": "URI não existe", "cf180f27e678d4e297f690e581961417": "O formato do endereço de escuta está errado!", - "1ed0fa9bb8768d56bf2d3232d7067023": "Intervalo de porta de escuta incorreto!, requisito: 1024-65535", + "1ed0fa9bb8768d56bf2d3232d7067023": "Intervalo de porta de escuta errado!, requisito: 1024-65535", "e6aa58b2f41bc53f6b84657d47eb35c1": "O caminho de salvamento de dados não existe!", - "c87be59ecbed944c2b45fea87d62f473": "Erro de modo de estatística de IP, requisito: 0 ou 1", - "fbc4861b0190c90a5388e44d2bbac678": "A versão atual não está disponível, atualize o painel e tente novamente", - "8b1d5629a1346da21fcaeb9f8f0db6d2": "Erro de formato de hora de início!", - "7a238977c4b13d23ac3e6b151a914cab": "Erro de formato de hora de término!", + "c87be59ecbed944c2b45fea87d62f473": "Erro no modo de estatísticas de IP, requisito: 0 ou 1", + "fbc4861b0190c90a5388e44d2bbac678": "A versão atual não está disponível, por favor atualize o painel e tente novamente", + "8b1d5629a1346da21fcaeb9f8f0db6d2": "Erro no formato da hora de início!", + "7a238977c4b13d23ac3e6b151a914cab": "Erro no formato da hora de término!", "a87a482f3bced3ce16bc9a351e8b5ce8": "A hora de início não pode ser maior que a hora de término!", - "a0ef69b1680461368a9130e770256ca6": "Erro de formato de data!", + "a0ef69b1680461368a9130e770256ca6": "Erro no formato da data!", "2493958c6f4051bb8d254d77d77b622b": "Erro de granularidade de tempo, suporte: minuto, hora, data", "4c4258ffd9a69c8e332346241a3cbdae": "Os dados da condição de negação estão no formato errado!", - "b47f4e8b7540cae56e085231c3c984c1": "ID de acesso não pode estar vazio!", + "b47f4e8b7540cae56e085231c3c984c1": "ID de Acesso não pode estar vazio!", "fea04488a926034079dc00c5a60a9135": "O formato do ID de acesso está incorreto!", - "da206b8971dcba715ed8cdd1a82736e1": "ID de acesso não existe!", + "da206b8971dcba715ed8cdd1a82736e1": "ID de Acesso não existe!", "fd65e390dd8aa35ea3622658247776d0": "O formato da data está incorreto", "9a4f1ea39f3a554d4e5431f86eb0450b": "O nome do site não pode estar vazio!", "b59417ef234946819788acfde92a00a7": "A purga foi bem-sucedida", - "aaa3736c0541d4a4d82193c2204ec317": "A hora de início está no formato incorreto!", - "e579606ed1219291caeb3bfad786dd3f": "A hora de término está no formato incorreto!", + "aaa3736c0541d4a4d82193c2204ec317": "A hora de início está no formato errado!", + "e579606ed1219291caeb3bfad786dd3f": "A hora de término está no formato errado!", "7cf2a69e43dcdfc86ab3b2b4c378a7e8": "O formato da data está incorreto!", - "53c85b9d96ea14f3f8224a5d2e659894": "O parâmetro não pode estar vazio!", + "53c85b9d96ea14f3f8224a5d2e659894": "Parâmetro não pode estar vazio!", "9dc21ed8c6025cab9873847e6e1ca506": "O tipo de consulta está incorreto!", "236c6e2f9a266b929b283eda30c2b3b6": "Nenhum dado relevante está disponível!", "50fc65b5f19812ccf756b7ad7de7f4cb": "session_id não pode estar vazio!", @@ -2435,28 +2540,28 @@ "f3df0751d9522bf2e68034bab4cd49a5": "Limpeza de configuração concluída", "191fae10bdd9d3eb6cb110b524fe40b7": "O envio foi bem-sucedido", "f53208c04e48d7ee19222b6adf343810": "O nome de usuário não pode ter menos de 3 caracteres de comprimento!", - "251e2cae1dbed2b37f7d16961a606970": "A seleção do nível de permissão está incorreta!", + "251e2cae1dbed2b37f7d16961a606970": "Seleção de nível de permissão está incorreta!", "a835325a5600b6571a24111e4d318e2c": "Por favor, selecione um site!", - "a669655fa991afcfa0cfa3f62286d944": "O comprimento da senha não pode ser inferior a 5 caracteres!", + "a669655fa991afcfa0cfa3f62286d944": "O comprimento da senha não pode ser menor que 5 caracteres!", "4d8d30e66ad9aaccc738ad99d5083955": "O nome de usuário já existe!", "12152390a5bf2ebce0f00b0fb5c650a2": "A adição foi bem-sucedida!", "4d1b7f489e07d6ca02ca1910a3884c48": "O usuário não existe!", - "3e83aa40dd320efb027151c02aab2871": "O comprimento da senha não pode ser inferior a 8 caracteres!", + "3e83aa40dd320efb027151c02aab2871": "O comprimento da senha não pode ser menor que 8 caracteres!", "d3748b3102cc8ba898f0f0bec842ce9e": "A modificação foi bem-sucedida!", "ac75e534c7334e1fd02c68a3993f1568": "A exclusão foi bem-sucedida!", "ca281da1f13858d0b599d19e18a510bf": "O status da web foi selecionado incorretamente!", - "c88239bc4a113ab0f02acb9bc31b3437": "A porta web está incorreta!", + "c88239bc4a113ab0f02acb9bc31b3437": "A porta da web está incorreta!", "f06e6a5985a91ac55c651e0b573378f0": "O diretório de segurança da web não pode estar vazio!", - "41a871d7ec26993be1367226321e06fa": "O comprimento do endereço de entrada de segurança não pode ser inferior a 6 dígitos!", + "41a871d7ec26993be1367226321e06fa": "O comprimento do endereço da entrada de segurança não pode ser menor que 6 dígitos!", "16f83d0969b9f7fe56ac3b55f9dedb26": "Esta entrada já está ocupada pelo painel, por favor use uma entrada diferente!", - "066df5a1cf19314e0265a1eb396848ac": "O endereço de entrada está formatado incorretamente, por exemplo: /my_monitor", + "066df5a1cf19314e0265a1eb396848ac": "Endereço de ingresso está formatado incorretamente, por exemplo: /meu_monitor", "794ee58637251012717d7e565aafc2a1": "A configuração foi bem-sucedida!", "2531ce72ea98e5aa8f4953eee783b540": "Nenhum log de erro encontrado!", - "0fc543dae93d3f76f5f7ff8048f5c398": "Nenhum IP mascarado encontrado para exportação!", - "5552ac99360952da2cf289f556ad19a6": "Nenhum IP mascarado encontrado para sincronizar!", + "0fc543dae93d3f76f5f7ff8048f5c398": "Nenhum IP mascarado foi encontrado para exportação!", + "5552ac99360952da2cf289f556ad19a6": "Nenhum IP mascarado foi encontrado para sincronizar!", "3332452d6ecd015473b133de021a9e06": "SINCRONIZAÇÃO BEM-SUCEDIDA!", "e6afdb1b63ca733f5d1741c7eff7a64e": "Está sendo processado, não repita!", - "696212205a77e698860ff5195992642b": "A operação de reparo está concluída", + "696212205a77e698860ff5195992642b": "A operação de reparo está completa", "97cb85456b49af4258f4c8da38bb576a": "A tarefa agendada foi adicionada com sucesso!", "2739213f569742c0782252f41279c060": "Falha ao adicionar uma tarefa agendada", "1cc4efde4fab0b4bbc2812a8b58f59b0": "Por favor, especifique um nome de site", @@ -2465,15 +2570,15 @@ "96ed379ec1882dcf52f0ff65057efb92": "Por favor, especifique os campos que você deseja exportar", "4e698e0709485a0e93a706964b748c5b": "Tipo de exportação desconhecido", "2a2dbc12afac446fe408eb78453bc6c2": "A tarefa de exportação não existe", - "9ff8782f584db728284fadd719967806": "Ocorreu um erro com a tarefa de exportação", + "9ff8782f584db728284fadd719967806": "Houve um erro com a tarefa de exportação", "b4421542e9cff8ce336075b668b8f87e": "O registro de exportação não existe", "41564d1cd7f8ecb23bcc590cb2217518": "Por favor, insira um novo diretório de dados", "699856a3cc697d8afcfd04dcd2f0729a": "O diretório especificado é o mesmo que o diretório atual", - "103422cd692bcaf56a7367075caf2274": "O diretório especificado está particionado no mesmo disco que o diretório atual, portanto, nenhuma migração de dados é necessária", + "103422cd692bcaf56a7367075caf2274": "O diretório especificado é particionado no mesmo disco que o diretório atual, então nenhuma migração de dados é necessária", "bcbd9605d3b8753bb8afbc765b293e01": "As tarefas de modificação e migração de dados foram iniciadas", - "967a57ad58881afe2c5da6cf0d7fce8c": "Por favor, insira o endereço IP e o nome do rastreador", + "967a57ad58881afe2c5da6cf0d7fce8c": "Por favor, insira o endereço IP e nome do crawler", "62b73e6c2a169296e73edf8a4d1e02f0": "Por favor, insira um endereço IP correto", - "0e1a26f6137c04f0f80956210069e46d": "Por favor, insira o nome correto do rastreador", + "0e1a26f6137c04f0f80956210069e46d": "Por favor, insira o nome correto do crawler", "fe8d50ca26f2e864d2bf4a932801bb85": "Erro inesperado, tente corrigir o plugin", "21aa998a1dee8774bc88ce2a070bf4de": "Por favor, insira um endereço IP", "2e0c672edc06ef05e44de98ac1b7a47d": "A exclusão foi bem-sucedida", @@ -2484,32 +2589,32 @@ "86e9360dac1c5eece29f32c9aba8011d": "O salvamento foi bem-sucedido", "e5320166e7623b6a39f9a7af7c20c787": "Erro ao especificar um parâmetro de site diferente", "c21fbb62edf94306d2e73365e6e7d637": "O parâmetro especificando outro site não pode estar vazio", - "c7fae0c9886cac3924fe5e459e171ab1": "Falha na exclusão", + "c7fae0c9886cac3924fe5e459e171ab1": "Exclusão falhou", "9a84d2910d3d36b78d7060f1c77e27f6": "O nome do site não foi especificado", "0987458a95b8bb7d6cdf9fa0630b6407": "O servidor atual não é nginx e não suporta coleta personalizada", "b925dfe3295278bd81a85bded66da01d": "O código de status está no formato errado", "2a8793bbb8bc38a7df9d8c796648526a": "Nenhum nome de site selecionado", - "6878600890a41b84c145423618ea2431": "Nenhuma informação do site encontrada", + "6878600890a41b84c145423618ea2431": "Nenhuma informação de site encontrada", "eff712873c55654bf48eaf421a184e73": "Nenhum nome de coleta personalizada foi inserido", "116208583eac10a8769774a6eaaff926": "O tipo de aquisição está incorreto", "fff3d7679cb121a30e68a104b58c934e": "O conteúdo da coleta não foi inserido", "75db42595fc9aee34df76df808712f92": "Nomes de coleta personalizada não podem conter caracteres especiais({})", "9667904e74175dfde9824cb8cd099ce7": "O conteúdo do cabeçalho deve começar com $http_", - "4c61d0ee460aa25eb6b5c413c46c9236": "O conteúdo de coleta do tipo body deve conter [$ + nginx log variable]", - "c03680a7ae35b7ce5b62f67b854d3b06": "O conteúdo de coleta deve conter [$ + nginx log variable]", - "d621342512cf7910a6dc4e7d736bcc63": "O conteúdo de coleta não pode conter caracteres especiais【", + "4c61d0ee460aa25eb6b5c413c46c9236": " O conteúdo da coleta do tipo body deve conter [$ + variável de log nginx]", + "c03680a7ae35b7ce5b62f67b854d3b06": "O conteúdo da coleta deve conter [$ + variável de log nginx]", + "d621342512cf7910a6dc4e7d736bcc63": "O conteúdo da coleta não pode conter caracteres especiais【", "b4704dc559a05c5721c095b97c4dbbc0": "O nome da coleta personalizada está duplicado", - "6594b670e8bd06e352f112c1bf194fc1": "O conteúdo da coleta personalizada está duplicado", + "6594b670e8bd06e352f112c1bf194fc1": "Conteúdo da coleta personalizada está duplicado", "a531c58ef7fefbbbd79becda53ede191": "Um nome de coleta personalizada não foi especificado", - "88c0c3ae4ef97b6069a35672b2caa05c": "O conteúdo da coleta do tipo body deve conter [$ + variável de log do nginx]", - "41353000c0d351db90c9eec095bae879": "Já existem coletas duplicadas, chamadas:{}", + "88c0c3ae4ef97b6069a35672b2caa05c": "O conteúdo da coleta do tipo body deve conter [$ + variável de log nginx]", + "41353000c0d351db90c9eec095bae879": "Já existem coletas duplicadas, nomeadas:{}", "ce78b7a225f05ece35ed7adc68b08a88": "A configuração de aquisição para modificar não foi encontrada", "521df7df29b44fcee614de96cecca61c": "A exclusão foi bem-sucedida ", "3b0ccb5c759b0941d50e331b22013560": "Extensões não suportadas: {}", - "7ea48870539b84996d1b1691c22823a7": "O formato dos dados modificados está incorreto", + "7ea48870539b84996d1b1691c22823a7": "O formato de dados modificado está incorreto", "bc64045195c8ed198a69772b3a204ef2": "Os dados a serem modificados não foram especificados", "bb02871a5e118841b95b69c5bff55baf": "A lista negra está no formato errado", - "1aac00a8c681100fd27b287c0b0516f1": "O formato da configuração de compilação está sendo analisado incorretamente", + "1aac00a8c681100fd27b287c0b0516f1": "O formato da configuração de build está sendo analisado incorretamente", "f6df35a69157ae1fca6415b043485334": "O ID da tarefa não foi especificado", "524a477cee9485a5a80a860e2bc5b5d5": "O ID da tarefa está incorreto", "4b5d95ed20303e337aec42486a0fb3fd": "O site atual não foi consultado", @@ -2521,258 +2626,36 @@ "4fa3e528186292138b224a0a1d46ec59": "O nome do site está incorreto", "3769ee974734f97166d6bce6b96e9b4e": "Erros de dados", "daddfa03b4ea762e009a36ce970b2b59": "Não há conta Baidu configurada", - "0379d9c081b6fd9ec2fd86e8672a4e72": "Se você não conseguir obter os dados, pode ser que as informações de login tenham expirado, tente fazer login novamente", + "0379d9c081b6fd9ec2fd86e8672a4e72": "Se você não conseguir obter os dados, pode ser que as informações de login tenham expirado, e você pode tentar fazer login novamente", "8057e57596c33acf04619825d625a483": "A atualização foi bem-sucedida", "3149165696693c4f6fef18928261a50f": "Não há conta 360 configurada", - "add390e6467c956fbb7f6da0f51d23d6": "A tarefa de envio foi executada", - "e8edb193e1cb171a17efe2765d72af71": "Arquivo não existe", - "63d325d5c4dfd07afdf888fdf727542e": "Importação bem-sucedida, ignorados {} usuários descadastrados , endereços de e-mail duplicados:{}", - "6b803f13e4c829ed6a65c0d5976af511": "Conteúdo do arquivo anormal ou malformado: {}", - "d6cd6db68490fced73e7bcf3e269fc3d": "A lista de contatos selecionada está vazia", - "721537a954932be33814ab079df57c78": "Não há cota de envio, por favor compre o pacote de recarga ou aguarde a atualização no próximo mês", - "debbea6b34bd0edb5bed5be7d68044c1": "O valor restante {} o valor ocupado pela tarefa inacabada {} o valor necessário para a tarefa a ser enviada {}, por favor compre o pacote suplementar", - "cb8c344616c2690af7d75e87f9c80aea": "Escolha um número muito grande", - "4b0dae036acd930ca1c942474b04738f": "O remetente não existe", - "cd0c2875bbba989082b0bea54837c422": "Tarefa adicionada com sucesso", - "48a84605a7e7d8938acea34996b55bb9": "Falha ao adicionar tarefa: [{0}]", - "97b655f6f5593c96a89bfca9237ce36a": "O modelo não existe", - "2efc2204459539d0ed963d7df3a0b797": "arquivo {} não existe", - "2e8a8d9cfa45e93c3c8a673bee0833df": "Envio finalizado", - "2c09afb2ce9a25b5e33e0b5eb7e10cb9": "Falha ao enviar e-mail, motivo do erro [{0}]", - "2af4936790c12bc9522e844a3187f142": "Erro de parâmetro: mail_type", - "cf6a1096f4f9f5c3632f03ddd00f8436": "Este tipo já existe", - "c92cf27565701074c9297c9f6e001056": "Adicionado com sucesso {}, falhas {}, caixas de correio duplicadas {}", - "119acd39beb57884b7fce4275c0324d9": "Adicionado com sucesso {}, caixas de correio duplicadas {}", - "0b898fa833d00b281702ae7791a5624d": "Apenas tarefas em execução podem ser pausadas", - "4cd93d208ac9f476b452f930ced5e3e0": "{} com sucesso", - "e38bacaba20440245e0aae88f984f78d": "Faltando parâmetros necessários", - "ca561681c6ba497c7de8fdecd5c05eba": "Grupo de destino não existe", - "9f965fcbc009b2b75dcef2e32a211054": "Mesclados com sucesso {} contatos", - "aac60240e4a7b953b64974b957b43376": "Falha na mesclagem: {}", - "aeaae7277bd406b03c27e12734a0073b": "Erro de parâmetro: id", - "3642b2d34114d470809e030fce8de34c": "Erro de parâmetro: temp_id", - "60287ee434fca4db4b62ab7fdff8486a": "Erro de parâmetro: addresser", - "c11022f75c572cd1b4641941845bf87c": "Erro de parâmetro: task_name", - "2816e3fdfcafd8e052bd036c330ebda2": "Falha ao adicionar tarefa: [{}]", - "db5b08f3936abce2e99f9aa1466e7258": "Erro de parâmetro: temp_name", - "6f095d43a6d1080f4694b669909d030a": "Erro de parâmetro: type", - "f7ba379966ef8be4f17f1ac316a49daf": "Edição bem-sucedida", - "08aca4a0ec8954c5a6a29a983ecbc55c": "Este recurso é exclusivo da versão Pro", - "0f506b3e8117fe5c52c90146b2ee9e67": "Erro de parâmetro: a_record", - "33a5c77b138502b17baaa51f9bd88b2c": "Erro: Nenhum registro DNS encontrado para {} ", - "4c8c4f693124ee1b937567d3ced11636": "O teste levará dois minutos, por favor, seja paciente ", - "219f93d55b24b6791d3a5c63b808a191": "Erro de parâmetro: ids", - "8c2fb0d74bf0b951dd8ada148c16ecb8": "O arquivo {} não existe", - "168861bb3452cc8ed67893c706ed69e5": "Importado com sucesso!", - "08c91ce439acde3feb04454e8b2a4f59": "A operação foi bem-sucedida", - "1d099d9c8e30376440abb2b5c7d09826": "Não há destinatários no grupo", - "0c8a0434183377840948927ddf49c467": "Nenhum dado encontrado para qualquer grupo", - "da500c6dc5f1ca7ce4e470705b7182a5": "Erro de parâmetro: group_name", - "81fa0fe3c0d0b866d13f32f822668ce2": "Erro de parâmetro: is_new", - "5abc9343e29dd1d774a1ded26c0fbb56": "O nome do grupo não pode estar vazio", - "08e36a7534385774e7972fc88ea1ca5d": "Adição bem-sucedida", - "1457aacc3deb7a7f5efc28ff7bb84786": "Falha na adição {}", - "2ac1d92fabeb3bb03f8cdc961c26f46b": "O arquivo de importação não existe", - "7dde3a45eff5e71e3098852362fd1395": "O arquivo de importação está vazio", - "f4b7c8d194eba0221d53d49a71a9bed1": "O grupo não existe", - "7f9f8d114a082f1432fd4d508b39201e": "Falha na operação do grupo: {}", - "5ca563a6955a312b2962d754d2bca84d": "Importados com sucesso {} contatos", - "611be97ff2f405d97472f1e98352f5f0": "Falha na importação: {}", - "93eb05555388b86db78c49f986669329": "Edição bem-sucedida!", - "183da276619df3a31c7153852caa43b4": "Faltando parâmetros operacionais", - "6eeff7c159aeb90605c9eeaa1d900054": "Tarefa de verificação iniciada", - "616e6da41bf332fd4a725eced516860f": "Falha ao iniciar tarefa de verificação: {}", - "694ae897645ed4f6c18dd496f0916e2d": "E-mail enviado com sucesso", - "3c4eeb0e0301063ab4f7b6e12b3ccc65": "Falha ao enviar e-mail, motivo do erro[{0}]", - "47cb4d76e39373c5fbb474f01a7f9cdb": "Erro no parâmetro rc_user", - "ada2e3b01cdd14582e9bde6794e56de3": "Erro no parâmetro rc_pass", - "ee668afb3022f7a04020a4355995df08": "Usuário não existe", - "fe3adb79b459800ef1bb0f8042e7fe4a": "Por favor, instale o roundcube primeiro", - "ebdab9ee4ea6ea28adfd7da342b8af7a": "Faltando documentos necessários", - "d77f421bec3e1db5836f52aa5b53e61b": "Execute [{}] para instalar o pflogsumm primeiro", - "4980e2fc0b7bce4c83da3fe631a97bce": "Nenhum arquivo de configuração do postfix encontrado", - "2867124182a8a707a7e8aeb1faa60d4e": "O arquivo de configuração do postfix não encontrou o parâmetro mydestination", - "9a8b3de2d2fc5f9114798532eae929b5": "Falha ao configurar dovecot", - "a4cab041ab51d1c2f65f67d7d82ec8a5": "SERVIDOR DE EMAIL EXISTE", - "7fcbf57e8fe359587beb56c6d6a35059": "NÃO INSTALAR SERVIDOR DE EMAIL", - "1d25cf1f445bdffccf0c7c04f98e90d8": "Instalação bem-sucedida", - "b4575dff8587db1b71ea56ef26fa160e": "Nome do serviço não existe", - "c138b2ea9b2ce96219987b1dc34a1751": "Reparo Concluído", - "fab07dcaf5fa1e2468aed520eb12f60e": "Verifique se o serviço rspamd está em execução", - "4b1b92ddcc4d8d18e1fc6d6a2c23b290": "Limpeza bem-sucedida", - "ff6975219190cff0cd77a5d45a4e587a": "NOME DE DOMÍNIO", - "02909d9d9c7b1c15aca48a0f3b632849": "Registro em cache ({}) atualizado com sucesso", - "8d42017ed8d72f616fcbfae1705753bd": "O registro A [{}] não pertence ao nome de domínio", - "b13de3ba9a0a8e3aa8cfc4c7b124ffaa": "Falha na análise do registro A
Domínio: {}
IP: {}", - "cb98099b2d50b0ef968b5e35a208055e": "O nome de domínio já existe", - "05c53d8c333382f2a88a51e182be4f83": "Domínio [{}] adicionado com sucesso! ip err:{}", - "8b460c0a4ee7b9f9abf8b7d9cead2cba": "Domínio [{}] adicionado com sucesso!", - "17d9629d2f06c1ee2212061b91161d4e": "Por favor, passe o nome de domínio", - "232b6fcdd02dbb56d0b4680d54e2f357": "O nome de domínio não existe", - "2f1897169b16b705ba6a5b29a05a983d": "Registro A do nome de domínio [{0}] modificado com sucesso!", - "5e22d528a4b6e80126d13acec3f03e11": "NOME_DE_DOMINIO", - "2ca49954e8a7fb75ed4cd9e1bca24e00": "Excluindo o domínio com sucesso! ({})", - "20aa86e3c9f40c2469f13b3c03dd280e": "O parâmetro está vazio, força da senha insuficiente (precisa incluir letras maiúsculas e minúsculas e números e não menos que 8 em comprimento)", - "35dc5b31856636d5281ebc710edeaf24": "DIGITE O NOME DA CONTA", - "1f26a48fd4db1e46c21cdab41fdfd7bd": "Força da senha insuficiente (precisa incluir letras maiúsculas e minúsculas e números e não menos que 8 em comprimento)", - "69e1e781dd3949f8b6a6fff74bbc79b0": "Formato de endereço de e-mail incorreto", - "e387e797495f8e6068a2378ea2a9d46b": "O endereço de e-mail não pode ter letras maiúsculas!", - "406cd9bfbe188d7be6ed43ee087853e3": "A conta de e-mail já existe", - "e89b7947650b902c10dc72cd06c7ad62": "O número de caixas de correio para {} atingiu o limite de {}", - "a94bf19eb03a81e4860453ad9d4872b2": "O nome de domínio não está no MailServer1 {}", - "9a498355742b1efcc8e97085c9f68783": "Usuário de caixa de correio adicionado com sucesso {}", - "a2dde299178d98f8b9cf937549c885ef": "Força de senha insuficiente", - "5e2421be63aa860192d725b7b57d19f7": "O nome de domínio não está no MailServer {}", - "40a84c055443ba1f6fb569b8c9861595": "O número de caixas de correio para {} atingiu o {} , no máximo {} ", - "6f6551f3050a37bff1c0db57f9c819b7": "{} caixas de correio foram criadas com sucesso", - "8e3e96d2a9f285ae645e587477b14555": "Usuário da caixa de correio modificado com sucesso {}", - "3d0fd00e4f68fb6a1ebb5de73954f5ca": "Falha na Exclusão!", - "daa8873086f44ca2724f03513c8ca775": "Usuário da caixa de correio excluído com sucesso {}", - "f5a9438fc0a655d491b336ef4122d03d": "Não foi possível enviar e-mail, erro Causa: Alguns serviços não foram iniciados, verifique o status do serviço", - "9fab0f5f8d9a53a59587cc911de514f7": "Alguns fornecedores de nuvem (como Google, Amazon) fecham a porta 25 por padrão, e você precisa entrar em contato com o fornecedor para abrir a porta 25 antes de poder usar o serviço de correio normalmente", - "b11852c790672b942ed2c547c08d0767": "Falha ao enviar e-mail, motivo do erro: O formato do endereço de entrada está incorreto", - "1a4fd4fdd2dcf2d2f06f30522c1d4914": "A interface não suporta acesso público!", - "55252847683f299cdbdb6c8a6f2aaf69": "Não foi possível enviar e-mail, Motivo: Alguns serviços não foram iniciados, verifique o status do serviço", - "56865f3d8aa564a93ed26724862960d1": "Falha ao enviar e-mail, motivo do erro [{}]", - "e79b5fbde5e49479aaafd5a1fe379e61": "ERRO NOME DA CONTA", - "333b7343c6bf424033940a8a97b12bb7": "Falha ao obter e-mail, motivo do erro[{0}]", - "1fd6e81e08c403b6c111f4ca1a673d63": "Caminho do e-mail não existe", - "5778692e244a35e113e61ed5a4a36063": "E-mail excluído com sucesso", - "653869d8a742ca8c58e33b6c1530b403": "Formato JSON inválido para caminhos", - "beb65edc70a951b625901e5b198ed89e": "Nenhum caminho fornecido", - "894b5d9ee6b19333f6871fe484756116": "Alguns arquivos não foram excluídos:\\n", - "4bbfd3ed699b4545134a61ab737e05b1": "Todos os e-mails excluídos com sucesso", - "b400dc9934847d9fe1d234befb30054d": "O nome do serviço está incorreto", - "fcc0d9c357a8bfa2d83e3e250264d4c7": "Operação incorreta", - "29c102771255855883869f4bb3b4c2e4": "{} Execução bem-sucedida da operação {}", - "a35dd0bfd9996e07728358593562dccc": "Por favor, passe o nome da conta", - "f935fa53dce46fbb36cefa0a0b08ec65": "O nome da conta é inválido.", - "dd130650a1e48b849b7c61ec23d72cea": "Falha ao obter e-mail enviado, motivo do erro [{0}]", - "4168802788e2d2bcdf3238824b47b58e": "Não foi possível encontrar o arquivo de configuração do postfix {}", - "973ce6f8cad81b79484dfa9dd8d3e01c": "ERRO de certificado, por favor cole o certificado correto no formato pem!", - "12eb041051df6300c99c90844910086c": "Configuração bem-sucedida", - "ac293db78f750888fad60af17a550b4e": "O usuário de encaminhamento já existe", - "2ce7dae0c16a247318839d2c9dd05fa1": "O nome de domínio não existe no servidor de e-mail", - "7b7203def07b8609282c02213359f019": "Usuário encaminhado não existe", - "ecc64e7aae7d595dcfcc8e7f0f484e47": "Encaminhamento de e-mail adicionado com sucesso", - "78505c78baa039a350190dfaf296952b": "O usuário de encaminhamento não existe", - "2e9f5dd27bf2f972f374084fd8bc56be": "Encaminhamento de e-mail modificado com sucesso", - "666b75a042d5cd8cba3a6d1c2f270704": "Encaminhamento de e-mail excluído com sucesso", - "03c6490678727779b9a553b0e03c1d43": "Nome de encaminhamento já existe", - "b08e9212679fd4cf82dd5ea8beda84f4": "Configurado com sucesso", - "631cca78135ab71a389991d7155bea59": "O relay smtp já existe", - "0b5eff39ea7076bcc36235e042de422d": "Nenhuma informação de configuração encontrada", - "318cc2da7d028b5497ec2e2b7bcb577e": "O relay smtp não existe", - "b5a0fb08f3a04afbfbcd4ee57299dbdf": "Atualmente não suporta varredura remota, a função está sendo testada", - "293a6b04618c2ba7921e039c75f9c80d": "Por favor, vá para a loja de aplicativos para instalar o anti-spam", - "ccff040d3fd05435e247a3b204e55ef6": "A tarefa de backup não existe!", - "e3eec59bbd1bcf4ebc36213e6df758f1": "Fechamento bem-sucedido!", - "798ddcc716b5c9993e0d1f914e3f1bf3": "Recuperação completa", - "2ca583c8306948114efb114f6bb00c3d": "Este não é um arquivo de backup válido! O nome do arquivo deve começar com ", - "97f87b75c36da3aec2a952fa834627ac": "Configuração bem-sucedida", - "db8452315d0eb9f8aa56f5ba4e010254": "Não foi possível encontrar o arquivo de configuração do dovecot {}", - "54d5be9023bb0918159a58ef65e7cf46": "O nome de domínio definido não existe", - "bdc245ab2373b030a79738e5806967b4": "Falha na configuração, restaure o arquivo de configuração agora", - "af7746eac1b9f41d829e2f150be96440": "Configuração Bem-sucedida", - "45448be795807701f1d6d79c73a5e453": "Configuração Bem-sucedida", - "6b73df7e52420a0609340be53b559a27": "Por favor, insira o nome da conta", - "f3482253072b82f9099ba7b79bd694ce": "Nome de conta inválido, por exemplo: xx@example.com", - "75e698a13245f4ea49f033e336f9a7ae": "Falha na obtenção, motivo: [{0}]", - "4b590c993349c4a9332fe7c30cc3623b": "Marcar com sucesso", - "fd1c6c13e2281da435056d1cd3de0d19": "Movido com sucesso", - "d6b9ff1c86c87a4d3d169d19b8b803da": "Por favor, insira o FQDN (Nome de Domínio Totalmente Qualificado ex: mail.aapanel.com)", - "f003e31bb108bfc6e2dca6b6a493e2c4": "Por favor, insira o FQDN (Nome de Domínio Totalmente Qualificado ex: smtp.gmail.com),", - "b20c85e36016672347fc67d33c95b9e9": "A porta 25 está aberta", - "1af60deed5a95f10c9ee73efeff48999": "Não é possível conectar à porta 25 de outros serviços, entre em contato com seu provedor de hospedagem", - "540d99b4d5cfe696f6e46cde48eda194": "Erro ao obter arquivo de origem!", - "bef8386758cab502fd7b6edd15619c85": "Não existe tal arquivo!", - "22d422258dca7c9b0975f91f927678f0": "Download refeita com sucesso", - "56ecaac7a13c0ef171f753e6b1d835b3": "tarefa não existe!", - "48aff051338f9c2251ebdeb3fd211114": "Nenhum usuário pode exportar", - "28154bafa8a9826866b6e002c71d4fff": "Conteúdo do arquivo anormal ou malformado", - "3f7e44a7c5b57a82e56793cdbeb858d7": "{} importações foram bem-sucedidas", - "bed14b598283efb210f08792c0fd1ba4": "Nenhum novo endereço de e-mail", - "f98c2754442b046838d86a7f55ffc206": "EMAIL EXISTE", - "c656050d918fe06bf87fbe9819642be1": "Parâmetros necessários estão faltando", - "3878813a0744ed93ed2da272e42ab410": "Não há certificado", - "6d02e9d5b213cf3d523190f8f90fd3e5": "A implantação foi bem-sucedida", - "fc93888f42e90fe0bbfddfe2e3b8bde7": "O registro DNS está sendo criado e entrará em vigor, por favor, seja paciente", - "7bc1a5dc172f07bc2480c7b2067e08cd": "Domínio ausente", - "abe0a1bf4c110c5e912db5968951edb3": "Domínio modificado [{}] com sucesso!", - "de5085e3caa72f9417811a3a16fbdc5f": "roundcube já existe", - "bd85bad7c1cedffc46ae70e0db8034f6": "Nenhum serviço MySQL detectado, instale-o primeiro!", - "c6a51d5b1a7bd956ca4c4f338c086f83": "Nenhum serviço nginx detectado, instale-o primeiro!", - "04558b9e13998b32d658e8cd8b0d1ad0": "Erro no parâmetro site_name", - "90baf7cab644bc240457a2c47e6ebf00": "Erro no parâmetro php_version", - "cf84746ee6e7a5bb44a33492dcf06859": "Erro no parâmetro id", - "fcabc387917b8ffea3954ce306154a14": "Erro no parâmetro path", - "bdf7ec8b7b06dbcc5cdd37b7fcf0be78": "roundcube não está implantado neste site", - "162ee492c21d8ca85c113a5ed39cb19a": "Adicionado com sucesso", - "18aa77314905ba8cc4ebbbef5e5bfc61": "Erro no parâmetro emails_to_add", - "16bc256c4be0dc8ac8c57a502d76ed7d": "Lista negra adicionada com sucesso", - "8392e379584c66a9f7a4913c7d31fac5": "Erro no parâmetro emails_to_remove", - "b28deaa432321b73e5b6708c3cdb29a2": "A lista negra foi excluída", - "aea0ac1bc82821423517f7d240f4fc20": "Não há arquivos de lista negra", - "2eee30c225f61143cba34ce255c00b39": "Não há lista negra que possa ser exportada", - "04cc998ff38dc7b2a1850bab4def5ff9": "A lista negra foi importada com sucesso", - "1b11ccbdd39c606a4b00d06e306ce7da": "erro: {}", - "37e5741448f3fff98b04f3b24663ed5a": "Esvaziado {} com sucesso", - "040af72cf6c4a1e2b1c442829628d063": "Parâmetro ausente: active", - "456da492cfd986feef0e8b6172ee52b9": "O tipo foi alterado com sucesso", - "ee94cfd2755c5d0bc7c532a5550b0632": "Parâmetro ausente: recipient", - "2ab854061aad0aede6cc7164670391df": "Adicionar {} listas de cancelamento de inscrição", - "a721d48e1f148b2cbab44c96c5d5a27c": "falha ao adicionar {}", - "612ba9a3aadccbd5aee092178e59a95a": "Removido com sucesso", - "0f72c62155338caff34448acccab2065": "Os tipos padrão podem ser alterados", - "f354e294ef8e10dfa5d5330710ac2244": "O parâmetro id deve ser passado!", - "59ba6a6955b093d3d8ab3c8ad9e07907": "Desculpe. Este recurso é apenas para membros profissionais.", - "981b4b10fbb172510dd8bc6c78442abc": "A URL atual não pode ser acessada, configure o proxy reverso corretamente!", - "b016f3fad3a16d8ab6f834d028138bb2": "parâmetro ausente! path", - "4e1b0afecf8cca9bc1c7baefbbaa5020": "parâmetro ausente! quota_type", - "f17f1430a59b12a71518577a2ac98394": "parâmetro ausente! quota_storage", - "b147c4722e48cf85b07f12e8e4dc36b9": "erro de parâmetro! quota_storage", - "6b26e574db24819d9553ff97329f72c8": "este não é um diretório válido!", - "d265f15afa05b01c067e8a37d4db5f96": "O diretório especificado é um link simbólico!", - "31883af5f94e56074d46535fb885be81": "A operação foi bem-sucedida", - "cd605148babc76c2acdd97401fde84e4": "O parâmetro id obrigatório está faltando", - "24e2e9a2bb00384d2d5199605e8429c6": "Criado com sucesso", - "f18f18a50495f5b2cc683fa8b388d7a6": "Edição bem-sucedida", - "362dff77f7403550e886db901404856c": "Exclusão bem-sucedida", - "5219b0eed304e85ff3b5d223ad1a19ea": "Por favor, especifique o domínio principal", - "99e790a4dcecd5a50224da0a6bbfe290": "Disponível após atualizar o painel", - "21217aade801d79f727da6da4bbc9028": "Por favor, especifique o nome de usuário", - "c66b529d95d463970172da0cdb289df4": "O status da cota foi atualizado com sucesso", - "10d7350372e998438adf642e58055fe2": "Falha na atualização do status da cota", - "634709ee9a1f6829d28bf76ddf278711": "Por favor, especifique o domínio e ip", - "decc12f91f9703a201987fdeabe572a4": "O site com o mesmo nome [{}] já existe, modifique-o antes de criá-lo", - "de67e3b2c564a899fe3195606036a7f1": "Instalação bem-sucedida", - "8d5496d961b4d4e08474b20c1450737a": "Falha ao criar um site", "74a7684631b29d814a52e3401576411a": "O formato da hora está incorreto", "f146f571f352f376dda16114593afd32": "Não é arquivo php nesta pasta", "a5ef7f95136c8e93b70c99cdc25d3b1b": "A regra está vazia ou o arquivo de regra está errado", "8756f93b16b703129c155cf4bf950e64": "Esta regra já existe", "2163538a10246cd5973057248443e827": "Erro de análise da base de regras", - "876088098a14f073e5da6fb4bf9a435a": "Arquivo da base de regras não existe", + "876088098a14f073e5da6fb4bf9a435a": "Arquivo de base de regras não existe", "6342b28c7c40e67016eb255e0f6fd382": "Esta regra não existe na base de regras", + "e8edb193e1cb171a17efe2765d72af71": "Arquivo não existe", "1bbd886460827015e5d605ed44252251": "11111111", - "e1fa6849f823a00ea3ce2b63a584c918": "Nenhum risco encontrado, aguarde um período para verificar", + "e1fa6849f823a00ea3ce2b63a584c918": "Nenhum risco encontrado, aguarde um período de tempo para verificar", "4919ae009da24772f54033981c72e7e0": "Este arquivo é webshell", "c3ff5d517aa0206b89c0107494480efb": "O arquivo atual é webshell", "841be447d44ca7e7424592573211f34f": "Arquivos suspeitos, inspeção manual é recomendada", "512e1fecde26404204e6072b3a12dcda": "Sem risco", - "3dfa767ed09b94292e6ed5bd39fce5d0": "Sem risco", + "3dfa767ed09b94292e6ed5bd39fce5d0": "Livre de risco", "6f72fe3fe88bd53bf8f690d2b0c5f842": "Por favor, selecione o arquivo que você precisa enviar", "d27bc4b1f587e887d48e7fe92d7a5b23": "arquivo não existe", - "8d5b6682ddc9e4453c4d971d3044dc7b": "O arquivo foi detectado como webshell pelo sistema!", - "c21a06cf7008cdaa11bcc918d6ea1c0d": "O arquivo não foi encontrado, por favor, envie o teste", + "8d5b6682ddc9e4453c4d971d3044dc7b": "O arquivo é detectado como um webshell pelo sistema!", + "c21a06cf7008cdaa11bcc918d6ea1c0d": "O arquivo não foi encontrado, por favor carregue o teste", "786c8548bf1e0cfec63644e085f73ece": "erro do sistema", "449061dfe5a4b59740b41d2705ad0bcc": "Por favor, preencha o caminho que você precisa excluir", - "704ec17e6ea425b9acd1265f1dcd0072": "Não pode estar vazio", + "704ec17e6ea425b9acd1265f1dcd0072": "Não pode ser vazio", "43043017cb4d53a3d984d879a42e2ebb": "Importado com sucesso", "3874a2dc1de33534dd53275bf1e54004": "Não existe", "2608ba6b8d1d54f9ffbfc630123ec583": "Erro de tipo", "2684d8fd0fc1dfb52e16b70b47334f53": "Desligamento bem-sucedido", - "ef00da3502e70bd84fff4b5036ff8288": "Necessário definir números!", + "ef00da3502e70bd84fff4b5036ff8288": "Precisa definir números!", "1720bc60b372b85a213d6492cdb677e5": "já existe!", "2bc3cbf8db79ff0fac4659dc5c9b2dac": "Não existe!", "07dc67d62b952497160f106a5c499b9e": "Erro de análise de arquivo restaurar configurações de fábrica!", @@ -2782,12 +2665,12 @@ "6512bd43d9caa6e02c990b0a82652dca": "11", "698d51a19d8a121ce581499d7b701668": "111", "dab4bbd12ffc7517800304f0bdc4fc86": "Os dados a serem substituídos não podem estar vazios", - "436b3a5c35b1b4c27cd55cd2fd9e6f95": "Adicionado com sucesso reinicie o Nginx para entrar em vigor", + "436b3a5c35b1b4c27cd55cd2fd9e6f95": "Adicionar com sucesso reinicie Nginx para fazer efeito", "102779676feeffd385f7038542c05441": "já existe", "965983d46c2695569cdb4e9e12fd6571": "Os dados que precisam ser interceptados não podem estar vazios", "9416a531e05cf18f1c26b97263e3c96b": "não existe", - "52932c15b4fa68c60b470a4dbcdd9852": "O arquivo de substituição está vazio, adicione dados", - "8fcc9a1b8fb706211e066cd5f7df0a65": "Excluído com sucesso, reinicie o nginx para entrar em vigor", + "52932c15b4fa68c60b470a4dbcdd9852": "O arquivo de substituição está vazio, por favor adicione dados", + "8fcc9a1b8fb706211e066cd5f7df0a65": "Excluído com sucesso, reinicie o nginx para fazer efeito", "00203649d952e20d9611cfcd21b53034": "Falha ao excluir/não existe", "3365f0d08012012075d406cf271d77f6": "O conteúdo bloqueado que você precisa não pode estar vazio", "2c555efbcf00eec34e159cbb930a49fd": "O conteúdo bloqueado já existe", @@ -2796,39 +2679,39 @@ "95d19257def109989336b6347a8f0fc3": "Por favor, insira o endereço IPV6 correto", "c0481d94eb7e8c7f46f76fec921373e2": "Endereço não existe!", "f6c7ec89d03c9c2ac46e336abc81b7a3": "A lista está vazia!", - "5be36040b9fa33036a454c12f27b7375": "Não suporta Ubuntu!", + "5be36040b9fa33036a454c12f27b7375": "Não suporta Ubantu!", "11158f5edfbaa7a72e2e1e701b426a73": "Apenas Centos7 é suportado temporariamente", "0959d7ee773960b7193779c9fdadcb0c": "Não suporta a mudança de Ubuntu!", "9033e0e305f247c0c3c80d0c7848c8b3": "!", - "25e5fccc23b6134c8a7c5afa6befd508": "Atualização do spider bem-sucedida!", - "76e2205e6fc3d06106b783a710b1fe10": "Erro de conexão com a nuvem!", - "17cae6641b0b761574f69f864134bf7e": "Erro de conexão com a nuvem!", + "25e5fccc23b6134c8a7c5afa6befd508": "Atualizar spider com sucesso!", + "76e2205e6fc3d06106b783a710b1fe10": "Erro de conexão na nuvem!", + "17cae6641b0b761574f69f864134bf7e": "Erro de conexão na nuvem!", "ce5275d6e4a918c8236e31e85270d290": "Aberto!", - "a5b0cc35b2e38546efb8ae6118230925": "Fechado!", + "a5b0cc35b2e38546efb8ae6118230925": "Desligar!", "fee1c1b6bffab76b18b09b002c405753": "O número de vezes não pode ser inferior a 20", "b14aa6510f1cff54c60f576ef0731959": "O período não pode ser inferior a 20 segundos", "d8f4a1993546cc4b850cde3599e27aec": "não encontrado", "fd16ce6210fa8913fa6230549b264979": "Parâmetro errado!", - "b4bc1177cfc8a0d0758e49b6a16f96d5": "Arquivo de configuração corrompido, conserte o firewall!", + "b4bc1177cfc8a0d0758e49b6a16f96d5": "Arquivo de configuração corrompido, corrija o firewall!", "ef78de4bb739700e26b532d670638846": "Perfil não encontrado!", - "c02aa591c33647ad91bb649c1663bcd1": "Por favor, desinstale o plugin aaPanel WebSite Speed antes de usar este recurso!", + "c02aa591c33647ad91bb649c1663bcd1": "Por favor, desinstale o plugin aaPanel WebSite Speed antes de poder usar este recurso!", "07a7794bae1a87cab16d773ce4c9597d": "Proibir acesso estrangeiro não está ativado nas configurações globais!", "bbaae08a3d7f937d5524fdfd83b37894": "A configuração foi bem-sucedida! Para entrar em vigor imediatamente, você precisa reiniciar o Nginx", "3549141361cdf1fcb62983aa5965e7be": "O parâmetro cc_increase_type é obrigatório", - "f73016df38477cfb3c3cac7c339bfd44": "Erro no parâmetro cc_increase_type ", - "6da0a606488196a3f41f0654dff52782": "O parâmetro cc_ip_max está ausente 1", - "e37eabb7b29fc24037e7fd2b0c617ead": "Erro no parâmetro cc_ip_max 0", - "aa03bfe7b5a6290d1152302818b3cdc4": "Erro no parâmetro cc_ip_max 1", - "53d80dd2af2a957ff00a7869e82eb011": "Erro no parâmetro cc_ip_max 2", - "0f75238fa757d189104cbc3b745cc7e5": "Erro no parâmetro cc_ip_max 3", - "81079713d38580dfe7714d164626b505": "Erro no parâmetro cc_ip_max 4", + "f73016df38477cfb3c3cac7c339bfd44": "Erro de Parâmetro cc_increase_type ", + "6da0a606488196a3f41f0654dff52782": "O parâmetro cc_ip_max está faltando 1", + "e37eabb7b29fc24037e7fd2b0c617ead": "Erro de Parâmetro cc_ip_max 0", + "aa03bfe7b5a6290d1152302818b3cdc4": "Erro de Parâmetro cc_ip_max 1", + "53d80dd2af2a957ff00a7869e82eb011": "Erro de Parâmetro cc_ip_max 2", + "0f75238fa757d189104cbc3b745cc7e5": "Erro de Parâmetro cc_ip_max 3", + "81079713d38580dfe7714d164626b505": "Erro de Parâmetro cc_ip_max 4", "59c4751ec8fb1f80078f21a5d3d23483": "O número mínimo de vezes que um único endereço IP pode ser defendido é 2000", "7a39ee1d46dbe23c10a5a102e002ffe1": "O número mínimo de vezes que um único endereço IP pode ser defendido é 5000 (incluindo estático quando ativado)", "21d5a4dda3dccf2cde4a2453923ba0c1": "O tempo de bloqueio não pode exceder 86400 segundos", - "8998ac964e10fa904c6f44b9a1d45839": "Necessário parâmetro cc_increase_type", - "a199962dff306e167cd1e96ccd864892": "Necessário parâmetro cc_ip_max", + "8998ac964e10fa904c6f44b9a1d45839": "Precisa do parâmetro cc_increase_type", + "a199962dff306e167cd1e96ccd864892": "Precisa do parâmetro cc_ip_max", "123f5dc9d4ce755a22034ce48a34f0ac": "Você precisa definir os números!", - "2c6392950dd8b9feeaa322428f883d6f": "O formato do segmento IP está incorreto", + "2c6392950dd8b9feeaa322428f883d6f": "Formato do segmento IP está incorreto", "d7bdef3923c512c13a60dc05970ca1cf": "O IP inicial não pode ser maior que o IP final", "b1f0a374986c41eaeafaa08485b42b59": "O segmento IP especificado já existe!", "aef0de8ec2a48f9f94f54d41a008f8f9": "O IP já existe em:", @@ -2836,21 +2719,23 @@ "4e140d99b9d960dc0faf5d43d200eab0": "Formato de dados incorreto", "4295a035192a0fcd88c89d16f69972ef": "Importado com sucesso!", "acb8450d83f87a19ac444ce07dbeae96": "O formato de dados está incorreto", - "0b8faaf8776c5eb0c07dcebc13dc55bb": "Não é possível adicionar caminho raiz do site [", + "168861bb3452cc8ed67893c706ed69e5": "Importar com sucesso!", + "0b8faaf8776c5eb0c07dcebc13dc55bb": "Não pode adicionar caminho raiz do site [", "2128a6acdfae9f60c3a292ae9afa33d2": "A URL que você adicionou já existe", - "4229662446c462c1d5212338127e8036": "Por favor, insira a url!", + "4229662446c462c1d5212338127e8036": "Por favor, insira url!", "3862c72b9bbd0accd915f171d10b5df0": "Por favor, insira parâmetros!", "e4fd18cafa65c2071efa92e329fb1aed": "já existe!", + "08e36a7534385774e7972fc88ea1ca5d": "Adicionar com sucesso", "96dd1aef326fe2e13e360245d729f9a5": "inexistência!", - "f10ae1b19b9c946f277946863a7ef9de": "Por favor, insira o site que você deseja definir!", + "f10ae1b19b9c946f277946863a7ef9de": "Por favor, insira o site que você deseja configurar!", "340c2b3dcf52aad038d610aea126fdf8": "Por favor, insira um tipo!", "d7fda198ce652fc42e3b62bc39a87dcb": "Por favor, insira a região!", "fc28444072899e60e6b2cb526651db31": "O tipo de entrada está incorreto!", - "53267148f9e661f7ab274b68ffe21bd9": "Erro tipo de solicitação inserido!", + "53267148f9e661f7ab274b68ffe21bd9": "Tipo de erro de solicitação inserido!", "0956e47e87d4d56af7f3a5bc36ec80de": "O site inserido está incorreto!", "3964f2ebc20aec0215b29f34e4e9cc8e": "Por favor, insira: ID!", - "f30e2178ef2d7f61c9b4dbf1c73f6876": "Por favor, insira: open!", - "cfec0e080bc7d4ebaae29eaec8dcba24": "Por favor, insira: status!", + "f30e2178ef2d7f61c9b4dbf1c73f6876": "Por favor, insira:open!", + "cfec0e080bc7d4ebaae29eaec8dcba24": "Por favor, insira:status!", "0e69f6afc958a9a1e75f1eb93908e9a9": "O código de status inserido está incorreto!", "0fa9cb1eb677f9243d0737a37a69f89f": "Modificação bem-sucedida!", "40ae230e6831501721508b806e3e8f16": "Por favor, insira o ID do site!", @@ -2864,87 +2749,87 @@ "86484538f21c95f5d8b2e1df43135470": "Por favor, insira open!", "230f490b7f059873ba86a8ad13a8b007": "Por favor, insira status!", "ee89c7f6d23c70ad8f7f0072e3e0cb9e": "Nenhum parâmetro foi encontrado para esta URL!", - "d1a198fffa0319462af0ceca6bc39dca": "Adicionar uma URL com uma URL [/] não é permitido na lista branca", - "0711b255059aaab715cfb46f6c503af7": "A URL [ / ] não é permitida ser adicionada à lista branca", + "d1a198fffa0319462af0ceca6bc39dca": "Adicionar uma URL com uma URL [/] não é permitido para lista branca", + "0711b255059aaab715cfb46f6c503af7": "URL [ / ] não são permitidas para serem adicionadas à lista branca", "e233e412faa6c35ecb389c502a7b6537": "Configurado com sucesso", "e78511f517dc9b86fd743725e8eae766": "O tempo de bloqueio não pode exceder 86400!", "14fc8ce684c7f8c9cbd9357d46db244c": "O cabeçalho de solicitação que você adicionou já existe!", "0d2d762c7ed9b83476612b6c08dcb18e": "O cabeçalho de solicitação especificado não existe!", "9c3c6a1bed873cbb175e46b5cefc99e8": "A regra especificada não existe!", - "0d1596574ac7aa5d5ecb88d72c42f986": "O URI especificado já existe!", + "0d1596574ac7aa5d5ecb88d72c42f986": "A URI especificada já existe!", "e66a7a8d9d1f830988f1f4a5f37ece0f": "A regra especificada já existe!", "8528abe0d097e78242d535d5fe8d0753": "Por favor, insira o endereço IP", "2aae8271977f5ad9ae44838f2b68bf91": "Tipo de spider errado!", - "d9a32e26c6c673f85332bff9907e73bc": "falha ao adicionar!", + "d9a32e26c6c673f85332bff9907e73bc": "adição falhou!", "50ff5b4f63ca1d6f72ac0884ce10a274": "O IP atual não existe!", "0e565a84b75a86b5804641eeec450828": "Ocorreu um erro durante a importação!", - "de12faa543f0eb0c72ebc64849053f14": "A regra especificada já existe, por favor, não adicione repetidamente", + "de12faa543f0eb0c72ebc64849053f14": "A regra especificada já existe, por favor não adicione repetidamente", "5d1dc231a71676f0d96c0ea4308153b6": "Falha ao obter dados", "64b31dda1dfab5250169f4cca5684824": "Apenas servidores nginx são suportados", "8147e6e4e48008b09597cc2f7b70cd8d": "Sincronização bem-sucedida!", "432deaf800ca653afe458c204cbfbcad": "Falha ao conectar à nuvem", "7f3e6e3b62e446f04ab407e6aba2bb22": "atualização concluída!", - "1f5d3751c5fd0f0d7d110164be8a597a": "Falha ao editar", - "c2aaeb20ceb12d108a77c9383498a988": "Falha na importação", + "1f5d3751c5fd0f0d7d110164be8a597a": "Falha na edição", + "c2aaeb20ceb12d108a77c9383498a988": "Importação falhou", "62fa7116894b93d89d11ba4eb1e41268": "Exportação bem-sucedida", - "139fd85baeada3d9d7cd8c65cf418df1": "Falha na exportação, arquivo de log não existe", - "efb7b1e669a74d47a4baecbe1a2adc6e": "Falha na exportação", + "139fd85baeada3d9d7cd8c65cf418df1": "Exportação falhou, arquivo de log não existe", + "efb7b1e669a74d47a4baecbe1a2adc6e": "Exportação falhou", "852e9973e436256e109f3a02ec9c140c": "Falha ao esvaziar, opção errada", "bb145fd3bdcecf6ec853d1a887a58d6f": "Sem parâmetro safe_logs", "c8eaeeb8efa13219ac368b6e39204592": "Sem parâmetro site_logs", "883efdac3eb44df42fc05b2e8e3061f9": "Sem parâmetro site_all", - "af2d7b1ee22be2dc3928b7c57580aa23": "Por favor, insira a lista de sites correta", + "af2d7b1ee22be2dc3928b7c57580aa23": "Por favor, insira a lista correta de sites", "9f351e9815c428a76aecab3c2c4a4b75": "Limpar", "50e457f6032e9d93fe4b58aec073da31": "Valor de status incorreto", "631e7fc49fb8bdf2a3f13bdaf354915e": "A operação não é suportada", "42e2a4ce9fbfd7ecf5a60a66cab89887": "Analisar a lista de sites ruins", "8ce75a209ed6cd3ed34d38aa7ea167c3": "Acesso falhou!", "a127bc2882f46ea763349be63b7a43ec": "Por favor, insira os dados de backup corretos", - "d6b3a322a8c5e66d8e4e05b81456adff": "Não é permitido definir interceptação de código de status 200!", + "d6b3a322a8c5e66d8e4e05b81456adff": "Não é permitido definir a interceptação do código de status 200!", "a8be909d5c4c96eda1b9b53089187b9e": "Código de status não permitido!", "f471d5490f674bf6c0999d9291a911a5": "Código de status de retorno não permitido!", - "8b8e26f29b987d60a8decbd2e73be7a7": "Não é permitido definir interceptação de código de status de retorno 200!", + "8b8e26f29b987d60a8decbd2e73be7a7": "Não é permitido definir a interceptação do código de status de retorno 200!", "337f8ed984e970f2873fc42622d99521": "Código estático não existe", "6fc66d367ac0c5d115479b7f852e98f4": "Por favor, passe o nome do site", "c8f9ac5c9288a3f53cccd5555ad1ee07": "Erro de latitude e longitude", - "acc31522551404d50744536a2c1986a9": "Nenhum arquivo de banco de dados", + "acc31522551404d50744536a2c1986a9": "Sem arquivo de banco de dados", "eaafa722b4e623b2ac09f4ed2d9cee5a": "O parâmetro type deve ser passado", "2ac8aa908980e30a259bb8526527909b": "O parâmetro search deve ser passado1", "62de36f39113a05a97a245a6d3126ca5": "Por favor, selecione o nome do site a ser consultado", "7dbda89c64cdbf3c9afc9bceb5216308": "O parâmetro search deve ser passado2", "84611bf808a166c5c384e72c9290573e": "Este ID não existe", - "0960b1153519b9ab3f2e5fc5e39da8c0": "Parâmetro [uri] deve ser passado", - "acaf3f3e6dcd6d9151630196089ef423": "Parâmetro [param] deve ser passado", - "f2eda7fc24524105189f3ef3853071a0": "Parâmetro [type] deve ser passado", - "2f9d47a4a39f4ed99af1f20ddce75df6": "Parâmetro [stype] deve ser passado", - "eecc4f30c2c1ee3d9cf27edf9290c034": "O URI atual já existe", - "e200e571a58c37376c8498c2dc506c95": "O tipo de [param] está errado, precisa ser formato json", - "96ed9027cae5703401727a3d07764133": "O URI atual não existe", + "0960b1153519b9ab3f2e5fc5e39da8c0": "O parâmetro [uri] deve ser passado", + "acaf3f3e6dcd6d9151630196089ef423": "O parâmetro [param] deve ser passado", + "f2eda7fc24524105189f3ef3853071a0": "O parâmetro [type] deve ser passado", + "2f9d47a4a39f4ed99af1f20ddce75df6": "O parâmetro [stype] deve ser passado", + "eecc4f30c2c1ee3d9cf27edf9290c034": "A URI atual já existe", + "e200e571a58c37376c8498c2dc506c95": "O tipo de [param] está errado, ele precisa do formato json", + "96ed9027cae5703401727a3d07764133": "A URI atual não existe", "466767592170f74d16bcac3034109b33": "O argumento path deve ser passado", "c2d2481eafb29f7e1525c6c63441359e": "Por favor, passe o nome do site", "4950f82b4231ebbfa780bcf4eec4c545": "Por favor, insira o endereço IP correto!", "abd5af540ed5a858d02b03846d94c1f4": "inexistência!", "5c1392db72dc56bdf4ecfe41eb39622c": "Esvaziamento concluído!", "5f401d1d15e2b6346405fcd81caee5ed": "Por favor, selecione um site", - "df0af44dbb9037dfb3e4a23e2d22d184": "O tempo não foi atingido", + "df0af44dbb9037dfb3e4a23e2d22d184": "O tempo não foi alcançado", "74dc340e56666816aba1f2de4d8bda47": "A atualização falhou", - "6e57d6c47d23024e41f4a1aac73a3ea9": "Isto", - "b8c769fb426082acc16345608995c52f": "Atualização Bem-sucedida", + "6e57d6c47d23024e41f4a1aac73a3ea9": "Isso", + "b8c769fb426082acc16345608995c52f": "Atualização Bem-sucedida", "eda0e602069bd48f46f456d8c2eadd3f": "Limpo com sucesso", - "f1cee94f9171dfe24f63e3e4c701e6d1": "Atualização Bem-sucedida, Um total de {} itens foram atualizados", + "f1cee94f9171dfe24f63e3e4c701e6d1": "Atualização Bem-sucedida,Um total de {} itens foram atualizados", "34ad6868d5517e16532a27e67dd7b659": "O endereço IP do cliente não pode estar vazio", - "f9982dd2a6456912c0da42091c9843a6": "Erro de formato de IP do cliente {}", + "f9982dd2a6456912c0da42091c9843a6": "Erro de formato do IP do cliente {}", "d1adb09331d9afa950900abca1056553": "O intervalo de IP não pode estar vazio", - "dc5b7cdade7167836e1a128d7e4342c": "O segmento IP {} está no formato errado e deve ser uma expressão CIDR", + "dc5b7cdade7167836e1a128d7e4342c": "O segmento de IP {} está no formato errado e deve ser uma expressão CIDR", "193cb0af0143dc48f159b0fe55d2fc75": "A URL de origem não pode estar vazia", - "0708cc379456476aaba988b381c61782": "Por favor, passe o conteúdo de correspondência", + "0708cc379456476aaba988b381c61782": "Por favor, passe o conteúdo correspondente", "973aeb9471388c7321b04f3d921b98da": "Por favor, passe o conteúdo da URL que você precisa definir", "864ffd29519010eafc7c5a5b958fb6a9": "Por favor, insira o User-Agent que você deseja definir", - "9c5f65f543fc633b9f8d20fed389a3ee": "Digite o nome do cabeçalho de solicitação que você deseja definir", - "1822f04ebba43b9d3576660d94e4818d": "A verificação passa", + "9c5f65f543fc633b9f8d20fed389a3ee": "Insira o nome do cabeçalho de solicitação que você deseja definir", + "1822f04ebba43b9d3576660d94e4818d": "A verificação passou", "64f3408287530191cb9198dd02030e49": "O site associado não pode estar vazio", "a29f521a7a2794dded1316a1b00a8767": "A prioridade não pode estar vazia", - "d7687135850c7d6afb5041e912b33824": "O estado ativado não pode estar vazio", + "d7687135850c7d6afb5041e912b33824": "O estado habilitado não pode estar vazio", "6c671ab904133b581c1104942fe2c85e": "Se usado para uma regra global não pode ser nulo", "6f2a7d11851641b23d3f632552afa1bc": "A ação não pode estar vazia após uma correspondência bem-sucedida", "7636b5101fba6a060fb30e30278eaa73": "O portal de correspondência não pode estar vazio", @@ -2953,59 +2838,60 @@ "261d3dfaaca74f7fd29a4d304b036712": "A regra não pode estar vazia3", "06ce124a509953bf7031fcd480c960fd": "O ID da regra já existe", "6094a892b83d8bb51cf8197d39a7a25e": "Nome da regra já existe", + "362dff77f7403550e886db901404856c": "Exclusão bem-sucedida", "5538ee312635d0c82567238d58c23429": "As regras não", "c085d954281443e56fde4f00fc27a3c4": "A regra is_global não pode estar vazia", "151648106e4bf98297882ea2ea1c4b0e": "Atualização bem-sucedida", "e04a27d5fc3ba14c49f5e5383a21eaa5": "O estado precisa ser passado", "03ce2004f163fa785d50ee2fd790ab38": "Parâmetros estão faltando: type", - "afad5921afb5338dae127d8451819581": "Erro no parâmetro type", + "afad5921afb5338dae127d8451819581": "typeErro de parâmetro", "31edbe069268a91831424986f5b5f36b": "Parâmetros estão faltando", "b7c7b9e550d049c96732daefaed87f30": "A exclusão falhou e os dados não existem", "8a053f40d81ebe24c54b365c60ce453a": "Parâmetros estão faltando: ua", - "06febc0dd7b24b4ede244d87c6da9899": "Parâmetros estão faltando: type", + "06febc0dd7b24b4ede244d87c6da9899": "Parâmetros estão faltando:type", "5a111a2b93b4c9ace88c30243f3befd6": "A modificação falhou e os dados não existiam", - "beb17a764dd515a66b16905b019a4252": "Parâmetros estão faltando: :pdata", + "beb17a764dd515a66b16905b019a4252": "Parâmetros estão faltando::pdata", "e00dc8fc227ea447cb2698f5db98da48": "Os dados não estão no formato correto", "897756b1d00a36b9afeb5ef76ff845e8": "O IP foi importado com sucesso!", "79f9ab06ea335dd09d909872a7398e1e": "A URL foi importada com sucesso!", "e82e753924daf07d001e460901b6fd96": "O UA foi importado com sucesso!", "112dd48824aab35f4b9dc986b6313885": "Limpo com sucesso!", "4743684898b36b9ed3ac8e1ac5ca7024": "Exportação bem-sucedida!", - "baa8f76f78ba1a954406d06dacf64c10": "Ativado com sucesso!", + "baa8f76f78ba1a954406d06dacf64c10": "Habilitado com sucesso!", "79b200ebd87ad6863d1413cfa7f1d7a4": "O conteúdo do arquivo está vazio", "c1474294f9b2d0569833252c2dac48ec": "O conteúdo do arquivo não está no formato JSON", - "435e03d88220f757a95c64ad48a5727a": "O parâmetro está incorreto, parâmetro ausente: html", - "3d89842e7bfbe8e4647f2b75c86f2111": "O parâmetro está incorreto, parâmetro ausente: site", - "b0224414a41d57fd48147d635b0a9f49": "O parâmetro está incorreto, parâmetro ausente: html_fast", - "2413405e65a706d48f6a7085961802c3": "O parâmetro está incorreto, parâmetro ausente: js", - "7b7ad90f48da5f137d45d79f06317f47": "O parâmetro está incorreto, parâmetro ausente: picture", - "a2e1cf38d9a88555c830f5b0f1a59554": "O parâmetro está incorreto, parâmetro ausente: picturenew", - "ab003a3bb7b2000f3f7dd4cc1ed2e5d6": "O parâmetro está incorreto, parâmetro ausente: htmlnew", - "659e67f77b70550f43b989a82f431ad8": "O parâmetro está incorreto, o parâmetro picturenew não está no formato json", - "785400f0c6201ecea4df35207667eb60": "O parâmetro está incorreto, o parâmetro htmlnew não está no formato json", - "0ea0d28a307b650faafba51aeda35b6e": "O parâmetro está incorreto, o parâmetro type está faltando no parâmetro htmlnew", - "e3d8ffe389c1772f7eaec98fe78334e1": "O parâmetro está incorreto, o parâmetro text está faltando no parâmetro htmlnew", - "4b097fd2beaa3b114a72820f7b595269": "O parâmetro está incorreto, há um erro no parâmetro type em htmlnew", - "fffd4429bcf4305049e63d02b689d2cb": "O parâmetro está incorreto, o parâmetro text no parâmetro htmlnew não pode exceder 100", + "435e03d88220f757a95c64ad48a5727a": "O parâmetro está incorreto,parâmetro faltando: html", + "3d89842e7bfbe8e4647f2b75c86f2111": "O parâmetro está incorreto,parâmetro faltando: site", + "b0224414a41d57fd48147d635b0a9f49": "O parâmetro está incorreto,parâmetro faltando: html_fast", + "2413405e65a706d48f6a7085961802c3": "O parâmetro está incorreto,parâmetro faltando: js", + "7b7ad90f48da5f137d45d79f06317f47": "O parâmetro está incorreto,parâmetro faltando: picture", + "a2e1cf38d9a88555c830f5b0f1a59554": "O parâmetro está incorreto,parâmetro faltando: picturenew", + "ab003a3bb7b2000f3f7dd4cc1ed2e5d6": "O parâmetro está incorreto,parâmetro faltando: htmlnew", + "659e67f77b70550f43b989a82f431ad8": "O parâmetro está incorreto,O parâmetro picturenew não está no formato json", + "785400f0c6201ecea4df35207667eb60": "O parâmetro está incorreto,O parâmetro htmlnew não está no formato json", + "0ea0d28a307b650faafba51aeda35b6e": "O parâmetro está incorreto,O parâmetro type está faltando no parâmetro htmlnew", + "e3d8ffe389c1772f7eaec98fe78334e1": "O parâmetro está incorreto,O parâmetro text está faltando no parâmetro htmlnew", + "4b097fd2beaa3b114a72820f7b595269": "O parâmetro está incorreto,Há um erro no parâmetro type em htmlnew", + "fffd4429bcf4305049e63d02b689d2cb": "O parâmetro está incorreto,O parâmetro text no parâmetro htmlnew não pode exceder 100", "15f6f7030e3501001f4aed8e49f440ee": "Personalizações de página podem", - "f34203a4a9e3837f9c81fabffed77e40": "O parâmetro está incorreto, o parâmetro type está faltando no parâmetro picturenew", - "b5c610002dcc8b5ae0068141a7029ae2": "O parâmetro está incorreto, o parâmetro text está faltando no parâmetro picturenew", - "a2d9e4ce746f18cef7a917ffea7dd75b": "O parâmetro está incorreto, no parâmetro picturenew, apenas text e default são permitidos para o parâmetro type", - "36cf3d060b27c024b0fd85b85c533148": "O parâmetro está incorreto, o comprimento do parâmetro text no parâmetro picturenew não pode exceder 100", - "799b18f9ca831f3048d74df2feb31206": "O caractere de marca d'água não pode conter caracteres especiais < > \\", - "6e0dbbe7466271740e6609ed570d355b": "O caractere de marca d'água não pode conter chinês atualmente", + "f34203a4a9e3837f9c81fabffed77e40": "O parâmetro está incorreto,O parâmetro type está faltando no parâmetro picturenew", + "b5c610002dcc8b5ae0068141a7029ae2": "O parâmetro está incorreto,O parâmetro text está faltando no parâmetro picturenew", + "a2d9e4ce746f18cef7a917ffea7dd75b": "O parâmetro está incorreto,No parâmetro picturenew, apenas text e default são permitidos para o parâmetro type", + "36cf3d060b27c024b0fd85b85c533148": "O parâmetro está incorreto,O comprimento do parâmetro text no parâmetro picturenew não pode exceder 100", + "799b18f9ca831f3048d74df2feb31206": "O caractere da marca d'água não pode conter caracteres especiais < > \\", + "6e0dbbe7466271740e6609ed570d355b": "O caractere da marca d'água não pode conter chinês no momento", "198024662dba359f2392e60e88c40aa2": "Desinstale o plug-in Website Speed antes de poder usar este recurso!", "855804452a86a87b7698c481b8fa262b": "O pseudo-estático contém a diretiva [!-e $request_filename], que precisa ser removida antes que este recurso possa ser usado!", "788b7bc259014fc9c1991f11c3ac0917": "O endereço IP não é válido", "b53e7fec7f9097f923ac52bcb0b4c724": "O tempo não pode ser menor que 1", - "cc1dd0ad7dd389cad500d9c4d196a508": "O parâmetro está incorreto, o parâmetro open está faltando", - "d47aeb6c6f69e860d9c088ea55fba3ef": "O parâmetro está incorreto, o parâmetro qps está faltando", - "eb907b13315836fa781674c6e8f01c38": "O parâmetro está incorreto, o parâmetro time está faltando", - "c10df4de998fb928b030c2d590edd72d": "O parâmetro está incorreto, o parâmetro user está faltando", - "ab46bbdd4119a38d6ff4bdbd7c9065fc": "O parâmetro está incorreto, o parâmetro identity está faltando", - "25cf1a0c49aeb9d32801a5ab30507e7f": "O parâmetro está incorreto, o parâmetro type está faltando", - "00204d3b9a172174c943f8660ec75291": "O parâmetro está incorreto, o parâmetro text está faltando", - "30454e0ce7a66a8fddddadcf19fce8f0": "O parâmetro está incorreto, o parâmetro type permite apenas default e text", + "cc1dd0ad7dd389cad500d9c4d196a508": "O parâmetro está incorreto,O parâmetro open está faltando", + "d47aeb6c6f69e860d9c088ea55fba3ef": "O parâmetro está incorreto,O parâmetro qps está faltando", + "eb907b13315836fa781674c6e8f01c38": "O parâmetro está incorreto,O parâmetro time está faltando", + "c10df4de998fb928b030c2d590edd72d": "O parâmetro está incorreto,O parâmetro user está faltando", + "ab46bbdd4119a38d6ff4bdbd7c9065fc": "O parâmetro está incorreto,O parâmetro identity está faltando", + "25cf1a0c49aeb9d32801a5ab30507e7f": "O parâmetro está incorreto,O parâmetro type está faltando", + "00204d3b9a172174c943f8660ec75291": "O parâmetro está incorreto,O parâmetro text está faltando", + "30454e0ce7a66a8fddddadcf19fce8f0": "O parâmetro está incorreto,o parâmetro type permite apenas default e text", "5c1dcb6e10270159f05daa76de3b5437": "O QPS não pode ser menor que 0", "4443c53175005bd3105c50baddd81660": "O QPS não pode ser maior que 10.000", "262feefe0c785688578a5f642d683225": "O tempo não pode ser maior que 60", @@ -3013,41 +2899,43 @@ "215a4c6687559aa75d554670e06f3694": "O usuário não pode ser maior que 10.000", "902ee0e2b591f9872a41c319c402e0b9": "O comprimento do texto não pode ser maior que 200", "2307dba1bc155ca6f1a5bbf21dc4a258": "O pseudo-estático contém a diretiva [!-e $request_filename], que precisa ser removida antes que esta função possa ser usada!", - "db8b3ac7a5408e3bc0d103bb9b071c7b": "O parâmetro está incorreto, o parâmetro data está faltando", - "a0318cc60ff3297d4bef0399dc89fa8d": "O parâmetro está incorreto, o parâmetro data não está no formato json", - "8b682d8c8139c2ea686c7a87a03ba292": "O parâmetro está incorreto, o parâmetro name está faltando", - "58d1469872dea12b4db1dfc13af12e69": "O parâmetro está incorreto, o parâmetro site está faltando", - "2dc0483ba76fdacae8eb46978a77c449": "O parâmetro está incorreto, o parâmetro types está faltando", - "ae6b5c82d2858b70d9d5cfa2bf0a5b6e": "O parâmetro está incorreto, o parâmetro url está faltando", - "98f08e877f98b1cc132cf6af612f2c82": "O parâmetro está incorreto, o parâmetro region está faltando", - "6eb9eecd7f53241dba52168f6eed8ecb": "O parâmetro está incorreto, o parâmetro condition está faltando", - "dc781e44c06aee2588ef017aadb91f54": "O parâmetro está incorreto, o parâmetro action está faltando", - "2d613a4d2d768453594737ae21612354": "O parâmetro está incorreto, o parâmetro return está faltando", - "7c70d1e818ffa1c301fa76bdfa92d75d": "O parâmetro está incorreto, a condição de gatilho não pode estar vazia e pelo menos uma condição de gatilho deve ser selecionada", + "db8b3ac7a5408e3bc0d103bb9b071c7b": "O parâmetro está incorreto,O parâmetro data está faltando", + "a0318cc60ff3297d4bef0399dc89fa8d": "O parâmetro está incorreto,O parâmetro data não está no formato json", + "8b682d8c8139c2ea686c7a87a03ba292": "O parâmetro está incorreto,O parâmetro name está faltando", + "58d1469872dea12b4db1dfc13af12e69": "O parâmetro está incorreto,O parâmetro site está faltando", + "2dc0483ba76fdacae8eb46978a77c449": "O parâmetro está incorreto,O parâmetro types está faltando", + "ae6b5c82d2858b70d9d5cfa2bf0a5b6e": "O parâmetro está incorreto,O parâmetro url está faltando", + "98f08e877f98b1cc132cf6af612f2c82": "O parâmetro está incorreto,O parâmetro region está faltando", + "6eb9eecd7f53241dba52168f6eed8ecb": "O parâmetro está incorreto,O parâmetro condition está faltando", + "dc781e44c06aee2588ef017aadb91f54": "O parâmetro está incorreto,O parâmetro action está faltando", + "2d613a4d2d768453594737ae21612354": "O parâmetro está incorreto,O parâmetro return está faltando", + "7c70d1e818ffa1c301fa76bdfa92d75d": "O parâmetro está incorreto,A condição de gatilho não pode estar vazia, e pelo menos uma condição de gatilho deve ser selecionada", "7d44386dff18244f3dd75ad76546806e": "O nome não pode conter caracteres especiais < > \\", - "62200033fe539db0bbfaa9e811acd7ea": "O parâmetro está incorreto, o parâmetro types é anormal", - "2290ac303cc87f9fa23aa247ade17c33": "O parâmetro está incorreto, a URL não pode estar vazia", + "62200033fe539db0bbfaa9e811acd7ea": "O parâmetro está incorreto,O parâmetro types é anormal", + "2290ac303cc87f9fa23aa247ade17c33": "O parâmetro está incorreto,a URL não pode estar vazia", "d5c270bb074c184c3708fc628b969561": "A URL especificada não pode ser / ou todo o site será limitado", - "e30358a99b6522a7113a2a4ac661aa27": "O parâmetro está incorreto, a URL deve começar com /", - "8a3315f7e229831b5b472ad35db2eb32": "O limite de acesso por segundo não pode ser inferior a 1", - "1f361568ba48e247da6293cd08f2a36c": "O número de restrições de acesso por tempo não pode ser inferior a 20", - "6abf870d74b818886516c39b78ada43d": "Restrição de acesso por tempo - o tempo não pode ser inferior a 30 segundos", - "acdd003181b2fcf35ea8412f5ef17b24": "O parâmetro está incorreto, o parâmetro condition está incorreto", - "4d09f912a4e1e3f59e571464488c9b0b": "O parâmetro está incorreto, o parâmetro action está incorreto", - "554b32d33b741d86c3fdcd82a9974f9f": "O parâmetro está incorreto, o parâmetro return está incorreto", + "e30358a99b6522a7113a2a4ac661aa27": "O parâmetro está incorreto,A URL deve começar com /", + "8a3315f7e229831b5b472ad35db2eb32": "O limite de acesso por segundo não pode ser menor que 1", + "1f361568ba48e247da6293cd08f2a36c": "O número de restrições de acesso por tempo não pode ser menor que 20", + "6abf870d74b818886516c39b78ada43d": "Restrição de acesso por tempo - o tempo não pode ser menor que 30 segundos", + "acdd003181b2fcf35ea8412f5ef17b24": "O parâmetro está incorreto,parâmetro condition incorreto", + "4d09f912a4e1e3f59e571464488c9b0b": "O parâmetro está incorreto,parâmetro action incorreto", + "554b32d33b741d86c3fdcd82a9974f9f": "O parâmetro está incorreto,parâmetro return incorreto", "a6ff8cce246c28eae5895c4bc14fcf77": "O nome já existe", "d3054b81f5e76b0e297d0befe0c1a796": "A URL já existe", - "a53a9497f06d0158be0c57dae2447056": "O parâmetro está incorreto, o parâmetro id está faltando", + "a53a9497f06d0158be0c57dae2447056": "O parâmetro está incorreto,O parâmetro id está faltando", "2671382a359fe628f261c16c61618b41": "O ID não existe", - "e75627abf7a3fa307ab09e63cf246627": "O parâmetro está incorreto, o parâmetro types permite apenas all e urls", - "12ac2e613f94beddddfdbbd8cd90ebd3": "O parâmetro está incorreto, a URL não pode estar vazia", - "62b55b3dc9bd026c840e7e89d39eecd3": "O parâmetro está incorreto, o parâmetro attack está faltando", - "19fd6f5b0c2034b36bfe924611057664": "O parâmetro está incorreto, o parâmetro cc está faltando", - "0f5b3e572f9dd832eebf01fdc0d7ce8c": "O parâmetro está incorreto, por favor envie um método de alerta", + "e75627abf7a3fa307ab09e63cf246627": "O parâmetro está incorreto,O parâmetro types permite apenas all e urls", + "12ac2e613f94beddddfdbbd8cd90ebd3": "O parâmetro está incorreto,A URL não pode estar vazia", + "62b55b3dc9bd026c840e7e89d39eecd3": "O parâmetro está incorreto,O parâmetro attack está faltando", + "19fd6f5b0c2034b36bfe924611057664": "O parâmetro está incorreto,O parâmetro cc está faltando", + "0f5b3e572f9dd832eebf01fdc0d7ce8c": "O parâmetro está incorreto,Por favor envie um método de alerta", "3979187f0bae65dc1fca4f1967742397": "Falha ao ler o arquivo de configuração", "c9bbcef0c80ca1a2859dd61d0210a117": "O parâmetro [send_type] está incorreto", - "a79ff4350874c27408a1858a88058344": "Se a instanciação do canal de mensagem falhar, verifique se o canal de mensagem está configurado corretamente", + "a79ff4350874c27408a1858a88058344": "Se a instanciação do canal de mensagem falhar, verifique se o canal de mensagem está definido corretamente", "50f223163c6f8e9f6b46d66165252cab": "Desligamento bem-sucedido!", + "886051a73fe04f873d814dc9823b4064": "Informações do DingTalk não estão configuradas corretamente", + "2d1b0e55888d196484a0bfd0f85ff71c": "A configuração do DingTalk está incorreta, por favor reconfigure o robô DingTalk", "02eef33534a6f8b3c95fc65e4f98bea9": "Informações incompletas", "2f45c6e0ccf998c7d31b3764e7da3751": "Nomes de notas não podem ter mais de 15 caracteres", "6e3ce0906145a9641111ebbf7735f145": "Telegram Falha ao enviar {}", @@ -3056,31 +2944,29 @@ "4ccc991965b1b5bbe3efd6b65a1cd6fb": "O tipo de corpo deve ser json, form data ou null", "b0b017688b107601f2b3439381c4c61b": "O método de envio está incorreto", "4f4979589df1b84ac44fc64a92e2b3f3": "Verifique se a opção SSL está errada", - "85284ecbde15ff997e89e6e8f07e399b": "As informações do WeChat não estão configuradas corretamente", - "3fb32283f52bea8068006817c5b9b95b": "O desvinculamento foi bem-sucedido", + "3fb32283f52bea8068006817c5b9b95b": "A desvinculação foi bem-sucedida", "8acd58125d3f7cc181a71926ef5c8a4b": "Falha ao vincular à nuvem", - "886051a73fe04f873d814dc9823b4064": "As informações do DingTalk não estão configuradas corretamente", - "2d1b0e55888d196484a0bfd0f85ff71c": "A configuração do DingTalk está incorreta, reconfigure o robô DingTalk", - "eee590fc0d0f3382fe436b60b02e37f0": "As informações da caixa de correio não estão configuradas corretamente", + "eee590fc0d0f3382fe436b60b02e37f0": "Informações da caixa de correio não estão configuradas corretamente", "e4e7eb56340203583dd940475fc6e924": "A caixa de correio de recebimento não está configurada", - "c6beb4efa41b5adbf89191be9d139c70": "Falha ao enviar mensagem, Destinatário da falha ao enviar:{}", + "1b95893c201cd2100d5eac3a5af8c937": "Falha ao enviar mensagem, Destinatário da falha no envio:{}, Erro: {}", "e401ec76f9a9d1dfe7d484e6c4b49656": "Falha ao enviar e-mail para alguns destinatários, incluindo:{}", + "85284ecbde15ff997e89e6e8f07e399b": "Informações do WeChat não estão configuradas corretamente", "703480d2938f7c89b563e1d731e94118": "Teste de envio falhou", "fdc137942b6f2d81fa922d7ace16a94c": "Um tipo que não é suportado pela interface atual", "37f17a256a93646ef0ac721096ec0ce8": "A mesma configuração de envio já existe e não pode ser adicionada repetidamente", "2783bb2e5b99dce08138bf58d0880603": "Remetente correspondente não encontrado", "b5a30e6f46753c06ada44d6bbd757599": "Excluído com sucesso", "81550843cd0a2d7e046cb23a868f8e8e": "O envio foi bem-sucedido", - "bb8f2701fa6b013fe8aa74659ceda547": "Não foi possível ler os dados da tarefa.", + "bb8f2701fa6b013fe8aa74659ceda547": "Impossível ler dados da tarefa.", "b12cc83d0b14fe739a930fd84d10ae8d": "A tarefa não foi encontrada.", "88b5bf7d36b1f1a8f4c4c010b22e849a": "Apenas tipos container e app são suportados", - "e8335bb4286f52074f6a6b7a0c3c7bf8": "Versão {} para aplicação {} não existe", + "e8335bb4286f52074f6a6b7a0c3c7bf8": "Versão {} para aplicar {} não existe", "a5c1e82e4d1142b8c7e0bc1499446181": "ENDEREÇO GIT NÃO ESTÁ DEFINIDO", "4e24bbe093c9dfb90092a0f4e71733dc": "O nome da ramificação não está definido", "b3c02fc58b92f549f529992c8a696a66": "O caminho do arquivo zip não está definido", "eecf07d92b354565df633b06401206a1": "Por favor, selecione o caminho do arquivo", "eb9eb53b7ac221c64f6f32c547317d22": "O parâmetro path não pode estar vazio", - "0444d0f0434a4d910eb7a06039e39066": "[{}] arquivo não existe", + "0444d0f0434a4d910eb7a06039e39066": "Arquivo [{}] não existe", "f4c3904df3aa98458b5f99bd5519e409": " {} concluído, se o log não tiver exceção feche esta janela!\\r\\n", "a6d56fd22b5a2243f3d9584478b90e0e": "Avançar", "42aea4a90d1ba39b31851f63479d20c7": "Falha ao obter", @@ -3088,18 +2974,18 @@ "952345fe8555c6ba578f251a317f85bc": "O parâmetro config não pode estar vazio", "08dd0ea6d64131b95ad64ca11233bd0a": "O parâmetro env não pode estar vazio", "8dea3a35e564837dd758e1f814e24f92": "Falha ao salvar, verifique se o formato do arquivo compose.yaml está correto: 【{}】", - "2a3a9ebecbcd261e0550cb4469910ed1": "O salvamento falhou. A versão do docker-compose é muito antiga. Por favor, atualize para a versão mais recente!", - "e32a4e5887229cc3ce7412591de16cff": "Falha ao salvar", + "2a3a9ebecbcd261e0550cb4469910ed1": "A salvamento falhou. A versão do docker-compose é muito baixa. Por favor, atualize para a versão mais recente!", + "e32a4e5887229cc3ce7412591de16cff": "Salvar falhou", "4e06eef94d131a0203e8f1f87db4fee5": "O parâmetro project_name não pode estar vazio", "c80ca81b19893dafd2629ce74407d5cf": "Criação falhou, verifique se o formato do arquivo compose.yaml está correto: \\r\\n{}", - "66855212f1fe552bf49c4388155b3082": "Criação falhou, a versão do docker-compose é muito antiga, atualize para a versão mais recente!", + "66855212f1fe552bf49c4388155b3082": "Criação falhou, a versão do docker-compose é muito baixa, por favor atualize para a versão mais recente!", "5a135e409fdee335e0f4397a4293835a": "parâmetro template_name não pode estar vazio", - "1cc869c0afb0c2f94e0937d9eb364e34": "O nome do modelo já existe, exclua o modelo e adicione-o novamente!", + "1cc869c0afb0c2f94e0937d9eb364e34": "O nome do modelo já existe, exclua o modelo e adicione novamente!", "cd21239456a2d52fb2317cc699bbd93c": "O nome do projeto já existe, exclua-o antes de adicioná-lo!", "5076d42e5242f2b79244d73f13da367e": "Excluir orquestração de contêiner", "02867c418e07f941a1c5d3f6bc926f86": "O parâmetro project_list não pode estar vazio", "a88321660a22f931bc1f0861baa5dc1e": "erro de formato do parâmetro project_list: {}", - "468c559ee2d3d5e39aeef93e62b006d1": "Exclusão falhou, a versão do docker-compose é muito antiga, atualize para a versão mais recente!", + "468c559ee2d3d5e39aeef93e62b006d1": "Exclusão falhou, a versão do docker-compose é muito baixa, por favor atualize para a versão mais recente!", "3590612b29e5aa49645f02d01c9e520e": "O parâmetro container_id não pode estar vazio", "d7fc188f711a4c3eb5b85949dfd9a696": "O contêiner não existe", "77ae5114c51a32c268b0bf7a03c0c528": "Por favor, passe o parâmetro name!", @@ -3108,32 +2994,32 @@ "c7f98cd83b58fad3ab719bfa337bdb6b": "Erro de parâmetro, por favor passe o parâmetro app_name", "043e4ffcd792692d7b7acb5a2504c329": "O serviço docker não foi iniciado, por favor inicie o serviço docker primeiro!", "9f1dcd0020905875a6a48744ffe17766": "O serviço docker não foi instalado com sucesso, por favor instale o serviço docker primeiro!", - "bfec153394be0516b0d79d4653c9e19d": "O aplicativo frps já existe, por favor não instale novamente!", - "fce729be4320e9afbdad888641d08f8d": "O aplicativo frpc já existe, por favor não instale novamente!", - "f6f8ff9f4c8990d7e24ac682a50c40a4": "O mesmo nome de serviço já existe: {}, por favor mude para outro nome", + "bfec153394be0516b0d79d4653c9e19d": "A aplicação frps já existe, por favor não instale novamente!", + "fce729be4320e9afbdad888641d08f8d": "A aplicação frpc já existe, por favor não instale novamente!", + "f6f8ff9f4c8990d7e24ac682a50c40a4": "O mesmo nome de serviço já existe: {}, por favor mude outro nome", "66fd0bc16d0f3c5c9e61779749a93c56": "O formato do nome de domínio [{}] está incorreto", - "c68494100dc74cced33c845f35e5aaac": "Inicialização {} falhou. Foi detectado que o arquivo docker-compose.yml não existe. Por favor, desinstale e reinstale e tente novamente.", - "76a5e52d7834e4cdf7984adc785f720e": "O aplicativo foi criado com sucesso, mas a criação do proxy reverso falhou. Detalhes do erro: {}", - "e59b647380ea44f97645f979773c683a": "O aplicativo foi criado com sucesso, aguardando a inicialização do aplicativo, o que pode levar de 1 a 5 minutos...", + "c68494100dc74cced33c845f35e5aaac": "Inicialização de {} falhou. Detectado que o arquivo docker-compose.yml não existe. Por favor, desinstale, reinstale e tente novamente.", + "76a5e52d7834e4cdf7984adc785f720e": "A aplicação foi criada com sucesso, mas a criação do proxy reverso falhou. Detalhes do erro: {}", + "e59b647380ea44f97645f979773c683a": "A aplicação foi criada com sucesso, aguardando a inicialização da aplicação, o que pode levar de 1 a 5 minutos...", "c71b369171a386e4df59acf49f5203b0": "Erro de parâmetro, por favor passe: {} ", "5e60e6550487262a79210c48736c2cba": "A porta [{}] já está sendo usada por [{}], por favor mude para outra porta.", "dc60f8a111d142dbdc1605dc047e23e6": "Por favor, selecione o banco de dados ao qual você precisa se conectar!", "667d37fe4593e52760bc51ada7287988": "Por favor, selecione o cache ao qual você deseja se conectar!", "1b6d9f6dc5480584f937681a5d9f0a80": "Informações de cache não encontradas", "f013f8c1d30136733e3d476dbe3a238e": "A configuração atualizada foi bem-sucedida", - "3d928c01114361a57fb24c42d9a1ee2d": "Falha ao atualizar configuração: {}", + "3d928c01114361a57fb24c42d9a1ee2d": "Falha ao atualizar a configuração: {}", "795d1693702d930f7fc18edfb0f1c0d3": "Configuração incorreta do servidor MCP", "a16d1dbe265c57e0417ae396c3c30043": "Nenhum serviço encontrado [{}] ", "8987b626b78029fdd11fe51351195830": "[{}] Imagem não encontrada", "092ca03f32caffd34d3f0532836283b7": "O arquivo de script para deepseek_r1 não foi encontrado", - "17ee8c2efafe32a5d204e039e971aee4": "Menos de 1550 MB de memória impedem que deepseek r 1 seja implantado", + "17ee8c2efafe32a5d204e039e971aee4": "Menos de 1550 MB de memória impedem a implantação do deepseek r 1", "d3eb7a147ac81b2f691a6e7ad42cc83c": "Nenhum processamento necessário", "ade726fc2adbfc1c18a6a601a6670b2f": "deepseek_r1 foi configurado com sucesso", "2ab241c8ca04b4760bc844e3133821d1": "Aplicações Desconhecidas: {}", - "fc0d20951439bcc2d1101019e09556ff": "{} perfil não detectado: {}", - "3bceda9d61ef4cfc8559796178503164": "A configuração {} foi atualizada com sucesso", + "fc0d20951439bcc2d1101019e09556ff": "Perfil {} não detectado: {}", + "3bceda9d61ef4cfc8559796178503164": "A configuração de {} foi atualizada com sucesso", "b1d0019ab8cbb83b1b99016c4927c1fd": "A configuração do Alist foi atualizada", - "7194829138a21af26d26fb0d57426fc8": "Por favor, selecione o banco de dados ao qual você deseja se conectar!", + "7194829138a21af26d26fb0d57426fc8": "Por favor, selecione o banco de dados ao qual deseja se conectar!", "0a17156f2603044863d54b67ac1f7a07": "Tipo de banco de dados desconhecido: {}", "62a2454d1d40411885721e465168a016": "A configuração do Nocodb foi atualizada", "1c757f474b2cf26c14c591709c6963a6": "Configuração do Homeassistant atualizada com sucesso", @@ -3142,50 +3028,50 @@ "05ea75c6d686df18830714369dc078ed": "Por favor, passe o parâmetro app_name", "975ecde111f2dfe514b71b4d4941ba1c": "Reconstruído com sucesso!", "9b70785b1f6c44d42a1fa85dbb7000b2": "Por favor, passe o parâmetro id", - "2321c03a1d4fc4cb5b9b87275a0d4712": "O aplicativo especificado não foi encontrado!", - "63428213090160e31085eadae3508244": "Nenhum aplicativo instalado ainda!", + "2321c03a1d4fc4cb5b9b87275a0d4712": "O app especificado não foi encontrado!", + "63428213090160e31085eadae3508244": "Nenhum app instalado ainda!", "43dc377c8c1929c0c2bc959d94337657": "Por favor, passe o parâmetro id!", - "d4188b564c1af018074056fffde42fba": "por favor passe o parâmetro m_version!", - "2a65ff2dedaa3b18bf4d4678b99ff77b": "por favor passe o parâmetro s_version!", - "e7df495f8488ec05ebf913bceccbc8d4": "Você só pode escolher o mesmo número de versão que a versão principal para atualização!", - "fc15d16befa9eb8ccfb25da964a284de": "O aplicativo atual já é a versão mais recente e não precisa ser atualizado!", - "cd260af0ae4915ee07569fc877f77495": "Você só pode escolher um número de versão maior que a versão original para atualizar!", + "d4188b564c1af018074056fffde42fba": "por favor, passe o parâmetro m_version!", + "2a65ff2dedaa3b18bf4d4678b99ff77b": "por favor, passe o parâmetro s_version!", + "e7df495f8488ec05ebf913bceccbc8d4": "Você só pode escolher o mesmo número de versão da versão principal para atualização!", + "fc15d16befa9eb8ccfb25da964a284de": "A aplicação atual já é a versão mais recente e não precisa ser atualizada!", + "cd260af0ae4915ee07569fc877f77495": "Você só pode escolher um número de versão superior à versão original para atualizar!", "7ac82bcde612b1a109d988d4b3dbf626": "A atualização foi bem-sucedida!", - "01b722bbe474a50d8291bbe2e71804c6": "O aplicativo especificado não foi encontrado!!", - "2140e826934629d9a43ba2bf4f2b1774": "por favor passe o parâmetro depend_app!", - "2ab5fb77429e37f42b87e205d6e51728": "por favor passe o parâmetro service_name!", - "9d6521661f6a152c21bf6d4305d5c9b3": "por favor passe o parâmetro app_name!", + "01b722bbe474a50d8291bbe2e71804c6": "O app especificado não foi encontrado!!", + "2140e826934629d9a43ba2bf4f2b1774": "por favor, passe o parâmetro depend_app!", + "2ab5fb77429e37f42b87e205d6e51728": "por favor, passe o parâmetro service_name!", + "9d6521661f6a152c21bf6d4305d5c9b3": "por favor, passe o parâmetro app_name!", "e020f13e1a68b8030d7038cea78b3aaa": "Backup bem-sucedido!", "c4dcfb467d82071a7a4cbbe0b5036f9e": "Ainda não há dados de backup!", - "76b5c77ee72a9ffa0f4b3a8e0101ad41": "por favor passe o parâmetro file_name!", + "76b5c77ee72a9ffa0f4b3a8e0101ad41": "por favor, passe o parâmetro file_name!", "1281e3ed765ec369a06400340f4beb78": "O backup especificado não foi encontrado!", "012967525dac4f0c5395c210223ca2ef": "Por favor, passe o parâmetro file_name!", "8cc2feae92bd228672051763130e6d49": "O arquivo de backup não existe!", "3c06b7d1ee52e760b361d12cd00f55b5": "O arquivo de backup está anormal!", "010c30483dbe836d24382a368f482770": "Recuperação bem-sucedida!", - "543fa46832267ce6cb3b47594d8d8f82": "Aplicativo não existe!", + "543fa46832267ce6cb3b47594d8d8f82": "App não existe!", "c52891f1485d1070a2e063358ae71fa9": "Por favor, passe o parâmetro f_path!", "df107ded5612d825c3db3bd46a9845f0": "Por favor, passe o parâmetro f_name!", "ef41e47b4ea1bd4143562bd0989b9b20": "Por favor, passe o parâmetro f_size!", "b9290da45e148202dccf0058dfc3b27a": "Por favor, passe o parâmetro blob!", - "a27dfcdb7619659552bfdfc79930b7d9": "Existe um arquivo de backup com o mesmo nome, se precisar carregá-lo novamente, exclua o arquivo com o mesmo nome!", - "37a9a30931e079caf79fb61eed10547f": "O arquivo de backup foi carregado com sucesso!", + "a27dfcdb7619659552bfdfc79930b7d9": "Existe um arquivo de backup com o mesmo nome, se precisar reenviar, exclua o arquivo com o mesmo nome!", + "37a9a30931e079caf79fb61eed10547f": "O arquivo de backup foi enviado com sucesso!", "490068785260b543087967659d79b496": "Por favor, passe o parâmetro status!", "1204853b15f4234a8cb88df5a46b5a42": "Por favor, passe o parâmetro start/stop/restart/rebuild!", "062f4a8230dd8af4311344fcdbf6f1ea": "A desinstalação foi bem-sucedida!", "7b016fb85c09d39e89eb1875e590a6ac": "Falha ao obter a categoria do aplicativo, clique em [Atualizar Lista de Aplicativos] no canto superior direito", - "20552a0ed8eef740c631cc049fd940b9": "Erro de tipo de aplicativo, por favor passe:{}!", + "20552a0ed8eef740c631cc049fd940b9": "Erro no tipo de aplicativo, por favor passe:{}!", "c0963001ffeaec423d1be82d464d6a1a": "Por favor, passe o parâmetro id/service_name!", "4de8e45b499205551f4a09fd074e5246": "Parâmetros ausentes! id", "02e85c0a0fa01fabdb5426af13e87853": "Parâmetros ausentes! appname", - "d910ee67a0875a17b6e663f9e19369a4": "Este link de aplicativo não é suportado!", + "d910ee67a0875a17b6e663f9e19369a4": "Este link de app não é suportado!", "32d030406e8d755a59468a50bd385b22": "Falha ao obter o contêiner", "c8e0f1ed3c37b015ee446297591d172f": "Parâmetros ausentes! app_name", - "dad9445733497150b5f2cd29a5aed506": "O nome do aplicativo não é legal, por favor não inclua caracteres ilegais!", - "a04daa98db618d6c2a19aeed5af39448": "Nenhum arquivo docker-compose.yml encontrado para o aplicativo especificado!", + "dad9445733497150b5f2cd29a5aed506": "O nome do app não é legal, por favor não inclua caracteres ilegais!", + "a04daa98db618d6c2a19aeed5af39448": "Nenhum arquivo docker-compose.yml encontrado para o app especificado!", "75d0c803cc4694e08d99d958ef762fcc": "O nome de domínio não pode estar vazio!", "676c8a7788ad0ddcb68d53fc7d960679": "Falha ao criar uma rede baota net. err: {}", - "23d07f1e537a8809b268a60a6881f44c": "Erro de intervalo de porta, insira uma porta entre 0-65535!", + "23d07f1e537a8809b268a60a6881f44c": "Erro de intervalo de porta, por favor insira uma porta entre 0-65535!", "f26d903f2f99c2bb4a214a2dd863e8f9": "A porta {} foi ocupada por [{}], por favor mude a porta!", "86c1887e12c52e7da3d3c413fe6e20d1": "O acesso ao nome de domínio falhou ao ser adicionado pelos seguintes motivos:{}", "b4bf995bdf5a4506e8286bbd9b24fc2b": "Por favor, passe o parâmetro domain!", @@ -3206,7 +3092,7 @@ "f70386f0f4846336b6eee06d16a55a33": "Por favor, passe os parâmetros app db!", "2fe5b2b5ae4c0c601076922f34391c6b": "Por favor, passe o parâmetro username!", "b046515d91d43d56962b42eb216b11c9": "Por favor, passe o parâmetro password!", - "e997ba4648bad603fc310169de46e0ea": "O aplicativo de banco de dados especificado não foi encontrado!", + "e997ba4648bad603fc310169de46e0ea": "A aplicação de banco de dados especificada não foi encontrada!", "2025d918448073508d336b72a7a28093": "O banco de dados já existe!", "4a8f0a2ac362e62ba4e76f52b5791f0e": "A criação foi bem-sucedida!", "76f3f12040afb77724966e2af67ab403": "Por favor, passe o parâmetro database!", @@ -3215,9 +3101,9 @@ "2a88d88050ddcc0e28f0da4576be2232": "O parâmetro service_name não pode ser nulo", "fd0f83d70400b1dd9f6ae9c093638411": "Falha ao obter informações do contêiner, execução do docker-compose é excepcional!", "2aec223006d3894d3c1a48bca642c141": "O modelo está sendo baixado, verifique os logs mais tarde", - "d4503f6b7fe9af6267e7ff25b7b8d3fe": "Falha ao excluir modelo, exceção de execução do docker-compose!", + "d4503f6b7fe9af6267e7ff25b7b8d3fe": "Falha ao excluir modelo, exceção na execução do docker-compose!", "d75a01e0d2c0cb8dad89216653024903": "Exclusão bem-sucedida do modelo!", - "bf483666a33d372f729985363d512d74": "O nome de domínio primário não pode ser um DNS genérico", + "bf483666a33d372f729985363d512d74": "O nome de domínio principal não pode ser um DNS genérico", "3c4b1f6d2d9ef27ace95adceea599588": "A adição falhou e os dados não puderam ser inseridos no banco de dados do site", "20825a634340a0b49b1a5e7f2fe47ea3": "A adição falhou e os dados não puderam ser inseridos no banco de dados do site docker", "653f81d3e5516550e6d5e35abcdbe97c": "[{}] é a geração reversa do painel, e a autenticação http de [/] não pode ser excluída!", @@ -3226,27 +3112,27 @@ "608113c9694987fa65b22ecb164aee59": "O ambiente foi instalado com sucesso", "3f68fc9dcbe1e4581f2e5aae5adec9f8": "O diretório apphub não existe", "7ec67f9826a24ca4a930a6e168ee9611": "A resolução foi bem-sucedida", - "af2c4fa868813e47b80859a0b36e00f4": "INFORMAÇÕES DO GIT CONFIGURADAS COM SUCESSO", + "af2c4fa868813e47b80859a0b36e00f4": "AS INFORMAÇÕES DO GIT FORAM CONFIGURADAS COM SUCESSO", "2b038e106d4ca5c11b787e16c73253ef": "Se você não", - "12d1b3062be6f8bb374511323c349ed7": "Por favor, defina as informações do git primeiro", + "12d1b3062be6f8bb374511323c349ed7": "Por favor, configure as informações do git primeiro", "798cd5a257af539ecfe6bb44f45ee788": "Falha na importação do git", "8170f5d37a617dcbf16fe8dd414073dc": "Importação do git bem-sucedida", - "6e40e5a8ad741ca4bd714fa52ef32333": "O formato do arquivo está incorreto, selecione o arquivo zip ou gz", + "6e40e5a8ad741ca4bd714fa52ef32333": "O formato do arquivo está incorreto, por favor selecione o arquivo zip ou gz", "c4996991c50032c9b296c11da356acb2": "Falha na importação:{}", "8ad9bdaced3b1cd99f1fa9d32c9a7eca": "Importação bem-sucedida", - "e48121dc556643fd31b26c190eedbad3": "Apenas Nginx é suportado, instale o Nginx antes de usar!", - "135f7ef9aeb50bf7b988416b0a679dff": "O nome de domínio não pode estar vazio, insira pelo menos um nome de domínio!", - "c82b42d921224a0699f854c28c2450d2": "O destino do proxy não pode estar vazio!", + "e48121dc556643fd31b26c190eedbad3": "Apenas Nginx é suportado, por favor instale o Nginx antes de usar!", + "135f7ef9aeb50bf7b988416b0a679dff": "O nome de domínio não pode estar vazio, por favor insira pelo menos um nome de domínio!", + "c82b42d921224a0699f854c28c2450d2": "O alvo do proxy não pode estar vazio!", "fe092e7668cf0e9e6dafef6a1fa084a4": "O caminho do arquivo Unix deve começar com /, como /tmp/flash.app.sock!", "f68c204aa9e12e0513aa7a4569449cfe": "Arquivos Unix devem terminar com .lock, como /tmp/flash.app.lock!", - "5c23a6c025d7071599c70575dc858f26": "O destino do proxy não existe!", - "2fba0b6c1602ec254b1bc06bacba575d": "O destino do proxy deve começar com http:// ou https://!", - "98abf95a1fa63ca8f31cc49eee5f3958": "Proxy_path é o diretório raiz, não é possível fechar Exibir Caminho do Proxy!", - "772c6f93b20b52d5c998f4b58dbcf8f7": "Porta [{}] é ilegal!", + "5c23a6c025d7071599c70575dc858f26": "O alvo do proxy não existe!", + "2fba0b6c1602ec254b1bc06bacba575d": "O alvo do proxy deve começar com http:// ou https://!", + "98abf95a1fa63ca8f31cc49eee5f3958": "Proxy_path é o diretório raiz, não pode fechar Mostrar Caminho do Proxy!", + "772c6f93b20b52d5c998f4b58dbcf8f7": "A porta [{}] é ilegal!", "f76df64b8f66e4f6050adf633c91c7fb": "O site [{}] já existe, por favor não adicione novamente!", "6599f1c3d3d3760768d9023827e8edf0": "Projeto de proxy reverso adicionado com sucesso!", - "85e34f49357adccd76d557a540a2e5d8": "Sitename não pode estar vazio!", - "1daab0a25efad301906af4874ee4c8ac": "O tipo de log está incorreto. Por favor, passe default/file/rsyslog/off!", + "85e34f49357adccd76d557a540a2e5d8": "Nome do site não pode estar vazio!", + "1daab0a25efad301906af4874ee4c8ac": "O tipo de log está incorreto. Por favor passe default/file/rsyslog/off!", "ff9e0ecf6c4926c0a309e67f9baedf39": "Falha ao ler o arquivo de configuração, exclua o site e adicione-o novamente!", "2a6176cc22256a713204964a34fd1384": "O caminho do log não pode estar vazio!", "18292d8929b9f9b6639dcc6e49d4f4a7": "O caminho do log deve começar com /", @@ -3254,12 +3140,12 @@ "b9f153e64173504e3700aa30b08fa0aa": "Auth_path não pode estar vazio!", "c9ab8ba4f7de925b29414bbb86bd3d1f": "Auth_path deve começar com /!", "cd44f9dcf9679c8151ce2b721f2fc6eb": "O nome de usuário e a senha não podem estar vazios!", - "6750646f694a0c3dd46f9617ff055e61": "[{}] não existe na autenticação HTTP, adicione-o primeiro!", + "6750646f694a0c3dd46f9617ff055e61": "[{}] não existe na autenticação HTTP, adicione primeiro!", "714145aeae9a04f8ecf9e1f54072202a": "O nome de usuário não pode estar vazio!", "36eb0a1bb3c002f5ed0fbf8f010881e3": "A senha não pode estar vazia!", "f20db7351e9cf57ecb9f79ad3e032081": "[{}] já existe na autenticação HTTP e não pode ser adicionado novamente!", - "218fd0a172e37293fc001328b3daca79": "[{}] é uma representação reversa do painel, e a autenticação HTTP de [/] não pode ser excluída!", - "8b6cabd487e5ab76183addd53bea2d87": "Excluído com sucesso!", + "218fd0a172e37293fc001328b3daca79": "[{}] é uma representação inversa do painel, e a autenticação HTTP de [/] não pode ser excluída!", + "8b6cabd487e5ab76183addd53bea2d87": "Exclusão bem-sucedida!", "3034cdc7475c3fa220d4092128ff9c48": "Gzip_status não pode estar vazio, passe o número 1 ou 0!", "76661faaa298338bf731c737a62b7d6c": "O parâmetro gzip_min_length é inválido. Digite um número maior que 0!", "f11df0d336c64058321a01bcbdc4667c": "O parâmetro gzip_comp_level é inválido. Digite um número maior que 0!", @@ -3270,25 +3156,25 @@ "aed0d6fc7665b30b1db8cd429e48c90d": "id não pode estar vazio!", "81ec4e731430cca9b3d8bff6372bfafc": "Proxy_path não pode estar vazio!", "9aecc647ffb6f126e5aa1f6c16af43b0": "Proxy_pass não pode estar vazio!", - "d591e0043cbf6d14950a46178a537626": "O destino do proxy deve começar com http:// ou https://", + "d591e0043cbf6d14950a46178a537626": "O alvo do proxy deve começar com http:// ou https://", "247d1a7dc144bd12d4c9f8797387babe": "【 {} 】 já existe no proxy reverso e não pode ser adicionado novamente!", - "36a7891857288c55bc5d87c470212812": "O ID não pode estar vazio!", + "36a7891857288c55bc5d87c470212812": "ID não pode estar vazio!", "c8a68e4ff275e827bbbe348eddecbf2b": "Projeto de proxy reverso excluído com sucesso!", "88f9a8852b822982a9a3e839813d91bb": "Domínios não podem estar vazios!", "85fb0c03511da1e4d308fd135dec4486": "O nome de domínio não pode conter vírgulas!", "a1e7a2f08295c8f8161a8feb9e2110b0": "O número da porta do nome de domínio [{}] é ilegal!", "5f77e0a83a9aa0e7e534e5136c99ab31": "Mantenha pelo menos um nome de domínio!", - "b9902ea698ded06e8ef4f31ba1057795": "domains não pode estar vazio!", + "b9902ea698ded06e8ef4f31ba1057795": "domínios não podem estar vazios!", "5f04c54facbae56e5cdebc22b5ecbf73": "Conf_type não pode estar vazio!", "bec317d58a8302e2aaf523e28f100710": "Salvo com sucesso!", "ba4088d3a70108e609823381c7f81f96": "oid não pode estar vazio!", - "ebfb6fcc2f55debe2703d50d58255f8f": "key não pode estar vazia!", + "ebfb6fcc2f55debe2703d50d58255f8f": "chave não pode estar vazia!", "fc83b0fa2366a3136f1fd8874d0bee65": "csr não pode estar vazio!", "60f1b04984ea15b008a9ae1b2bd9e07f": "partnerOrderId não pode estar vazio!", "a8fde220ad2740e38585d34948899556": "auth_type não pode estar vazio!", "b3ad191bcb992b29302385e446e78f8a": "auth_to não pode estar vazio!", "95725cbba013b9a62d4895a2f3e5a2a9": "auto_wildcard não pode estar vazio!", - "08fd165421792573ef13d1a83e487088": "index não pode estar vazio!", + "08fd165421792573ef13d1a83e487088": "índice não pode estar vazio!", "08cbd4b3fa3941156162657f2b69e8b8": "BatchInfo não pode estar vazio!", "49d1b2d015f9e81d31ca60b63c2ef378": "force_https não pode estar vazio!", "21e0b44e0a302af58d59ca9d8948f4e1": "Domainorpath não pode estar vazio!", @@ -3297,21 +3183,21 @@ "352289584d886d4f04591b6f9b7785b8": "Tour não pode estar vazio!", "ddcb1cafcc4b5e308f6057e07af2d10a": "Redirectdomain não pode estar vazio!", "58bad30cc21797d832b361fcedff61b9": "Redirectname não pode estar vazio!", - "320968539b06847a07f9c48f39a73120": "Path não pode estar vazio!", - "51d2fd3c34890a88eafbb2801fe0827f": "O redirecionamento parou ou o diretório do arquivo de configuração não existe!", - "38e380b5535be56ebae6addcf29390ba": "Fix não pode estar vazio!", + "320968539b06847a07f9c48f39a73120": "Caminho não pode estar vazio!", + "51d2fd3c34890a88eafbb2801fe0827f": "Redirecionamento parou ou o diretório do arquivo de configuração não existe!", + "38e380b5535be56ebae6addcf29390ba": "Correção não pode estar vazia!", "ad89a60d7720b8bb5095f2752e5006ae": "Return_rule não pode estar vazio!", - "b74b269372107d024f6c9e13cf911a4e": "Https status não pode estar vazio!", + "b74b269372107d024f6c9e13cf911a4e": "Status Https não pode estar vazio!", "cefc1b6af0b80a883304b58651283f02": "Status não pode estar vazio!", - "f8a019279d00484c29abaf1cb4b9260c": "O parâmetro ip_type está incorreto, black ou white deve ser passado!", + "f8a019279d00484c29abaf1cb4b9260c": "O parâmetro ip_type está incorreto, preto ou branco deve ser passado!", "f8e8cf373fa65891fe5a6e65505d30d0": "IPS não pode estar vazio, por favor insira IP, um por linha!", - "0677c4ecb9efdab30c5077e69b1745ba": "IP não pode estar vazio, por favor insira o IP!", + "0677c4ecb9efdab30c5077e69b1745ba": "IP não pode estar vazio, por favor insira IP!", "b8c0bc6452f788c758a4f7bedd761757": "Sem informações de proxy!", "70a9558c31a978ce2b1297a2a21c1317": "Nenhuma informação de proxy encontrada para esta URL [{}]!", "82ca4452a42da1388fd435ca8a2801e7": "Proxy_host não pode estar vazio!", "6dac7e9b2cbc32789bde984cddb699f4": "Proxy_type não pode estar vazio!", - "0dc7d98b8a487dfa0794f7c792240e4c": "O caminho do arquivo Unix deve começar com / ou http://unix:, como /tmp/flash.app.lock!", - "5c6869f159feda62d0e6441f3eb1f97c": "O websocket global está em um estado aberto, e não é permitido desativar individualmente o suporte a websocket para esta URL!", + "0dc7d98b8a487dfa0794f7c792240e4c": "Caminho do arquivo Unix deve começar com / ou http://unix:, como /tmp/flash.app.lock!", + "5c6869f159feda62d0e6441f3eb1f97c": "O websocket global está em um estado aberto, e não é permitido desabilitar individualmente o suporte websocket para esta URL!", "ff6c12be57557ce452395adac7e02b30": "Oldstr e Newstr não podem estar vazios ao mesmo tempo!", "8c9bac9aea3d7a22d3789f837dd40d3c": "Get.sub_type só pode conter combinações de letras de ", "2ac2f7203f5049438855d537f52cfee4": "O conteúdo que você digitou contém chinês. Detectamos que a versão atual do nginx não suporta isso. Tente reinstalar uma versão do nginx 1.20 ou superior e tente novamente!", @@ -3319,31 +3205,31 @@ "0d57a0216b328aeba6ef5fc3cbf3b7e9": "Nenhuma informação de configuração encontrada para o conteúdo antes da substituição: [{}]!", "e00f42f6421b797439a64e3ef24c132a": "site_name não pode estar vazio!", "a6fd23485ca8abe4ab7d0580d28c4bf9": "Limpeza bem-sucedida!", - "61e795d02f4452904f2574d936c571e6": "Falha na limpeza, o diretório de cache não existe!", + "61e795d02f4452904f2574d936c571e6": "Limpeza falhou, diretório de cache não existe!", "3c99c479e3c65eac24272afc13cec604": "porta https [{}] é ilegal!", - "b9629c2dea839825c2f1916b44a154a1": "Erro no arquivo de configuração do Nginx, inventário!:{}", + "b9629c2dea839825c2f1916b44a154a1": "Erro no arquivo de configuração Nginx, inventário!:{}", "32b169f72b293ef80d35435e9894f8e2": "Inicializando", "58ba018dcbe1c47ea0a293fdcee21e63": "Instalação do Painel", "67355337eaf300b91de09a8083c93ebf": "Backup Local", "99e8ebaa5ad2fafe4e141574f6b4a73f": "Upload de Arquivo", "bd6d996cdca2252e9b99253b2a587287": "Restauração de Dados", "03a2bd12e8b51af547a08985d4882d6d": "Migração Concluída", - "0fd957e5b2d9c535c344e9a8f86a225c": "Falha ao ler o status da tarefa: {}", - "181f2da22cdbf536f67e46452108d95d": "Falha ao salvar o status da tarefa: {}", - "4439b17c5e0977e0c73c643cea950424": "Falha ao salvar o registro de tarefa global: {}", - "74c6e9c56a9d836f2dac86fe8e0770e3": "Não foi possível ler o ID da tarefa em execução atual", + "0fd957e5b2d9c535c344e9a8f86a225c": "Falha ao ler status da tarefa: {}", + "181f2da22cdbf536f67e46452108d95d": "Falha ao salvar status da tarefa: {}", + "4439b17c5e0977e0c73c643cea950424": "Falha ao salvar registro de tarefa global: {}", + "74c6e9c56a9d836f2dac86fe8e0770e3": "Incapaz de ler o ID da tarefa em execução atual", "62688aeae1c92fc7d92caaa83f22a411": "Status da tarefa recuperado com sucesso", "087b165a5f0bd5a04f2ce4be7dca14dd": "Nenhuma tarefa em execução", - "37a5c6e23237ddff7185d375c34eed60": "A tarefa {} não existe", + "37a5c6e23237ddff7185d375c34eed60": "Tarefa {} não existe", "f613fc3fb0aee3affafcae3477d42bf8": "Uma tarefa já está em execução, ID da tarefa: {}", - "367b4a21be07204266d306508cc92dc7": "Tarefa de migração inicializando", + "367b4a21be07204266d306508cc92dc7": "Inicializando tarefa de migração", "793c8358adb487f79f85acfdc44d54bb": "Criando tarefa de migração: {} -> {}", "e597529fcdfa1dab69eadaf1c44088ba": "Tarefa de migração criada com sucesso", "c304dcebe892b468725402a369b3dd46": "Conectando ao servidor {}:{}", "d2f3c14129fe059cf6d99f1583abc23e": "[+] Conectado com sucesso ao servidor {}", "ae3c4e96fa1411ea25c05ce9a18ae2ae": "Conectado com sucesso ao servidor {}", "c7203791b356c5f3faf5d8c43d54a575": "Falha na autenticação: nome de usuário ou senha incorretos", - "10adeeeb866978b5ae637ae2bc13fb96": "Exceção de conexão SSH: {}", + "10adeeeb866978b5ae637ae2bc13fb96": "Exceção na conexão SSH: {}", "1e36faff765dbbbe631f424983a21783": "Erro de conexão de rede: {}", "f9d5c96265bf9a99b163f5adf699cde9": "Falha ao conectar ao servidor: {}", "cd4dc264f41eda817374af0bddcea259": "Conectando usando chave RSA", @@ -3354,7 +3240,7 @@ "f618338d0d56f440d7fb1b59d8add72c": "Falha ao carregar chave ECDSA: {}", "f579ce14b1e98ae9ad4d392279730d9a": "Conectando usando chave {}", "696797724fc3db3f012761759f720c23": "Falha ao carregar chave {}: {}", - "fa4e18c6d3b0c0fa6a5ac1303dda02a7": "Não foi possível reconhecer ou carregar a chave, verifique se o formato do arquivo de chave está correto", + "fa4e18c6d3b0c0fa6a5ac1303dda02a7": "Incapaz de reconhecer ou carregar a chave, verifique se o formato do arquivo de chave está correto", "369709628dacb54949b2c711acd93968": "[*] Tentando reconectar ao servidor (tentativa {}/{})...", "88aefbc5392deac3ab63223d6d82b66b": "[!] Falha ao reconectar ao servidor, número máximo de tentativas atingido ({})", "908300abff5dfdf254726c2193f3e550": "Falha ao reconectar ao servidor, número máximo de tentativas atingido ({})", @@ -3363,23 +3249,23 @@ "43234c4b446ff41810dcf807d317cba7": "[*] Executando comando: {}", "db4d271e5cb8fe3192ed73bd624a86fe": "[+] Saída:", "c519185a1f47d37b21866e5f05928dc8": "[!] Erro:", - "6a2909a7dbeca5d8c85843ecd4cd3fae": "[!] Conexão SSH desconectada ao executar o comando: {}", - "88783238ef5d081aade9e63160d329fb": "[*] Reconectado com sucesso, tentando o comando novamente...", + "6a2909a7dbeca5d8c85843ecd4cd3fae": "[!] Conexão SSH desconectada ao executar comando: {}", + "88783238ef5d081aade9e63160d329fb": "[*] Reconectado com sucesso, tentando comando novamente...", "8692bb08477b83615b1ae995552e2c92": "[*] Detectando tipo de SO do servidor...", "95adf53ab7c91ed98c77d3c0e38a2a1a": "[+] Tipo de SO: {}", - "2ab043e41d8fd10931cfa912b4b11bf8": "[!] Não foi possível determinar o tipo de SO", - "2d23313d6e3e201771154cf99d5dab34": "Falha na instalação do curl ou wget, instale-o manualmente", + "2ab043e41d8fd10931cfa912b4b11bf8": "[!] Incapaz de determinar o tipo de SO", + "2d23313d6e3e201771154cf99d5dab34": "Instalação de curl ou wget falhou, instale manualmente", "b44992b4430f7759108e5242176b7871": "[+] curl ou wget está instalado", "4ba07005cef8f98a0625a7d1eb0a142e": "curl ou wget está instalado", "e3a56811a35322959c535d38d2e91f7e": "[!] curl ou wget não está instalado, tentando instalar...", - "613a8be93fcd44002e549e0767c85a86": "Não foi possível detectar o tipo de SO, instale curl ou wget manualmente", - "8a4d20948ccc8034e3118af3bb683da3": "Iniciar a instalação do aapanel", - "df97b5d4f31c5cd4a3611774abb6de52": "[*] Começando a instalar o aapanel...", - "d91a58f92edb4b30de7e5399908922da": "[*] Instalando aapanel com o comando: {}", + "613a8be93fcd44002e549e0767c85a86": "Incapaz de detectar o tipo de SO, instale curl ou wget manualmente", + "8a4d20948ccc8034e3118af3bb683da3": "Iniciar instalação do aapanel", + "df97b5d4f31c5cd4a3611774abb6de52": "[*] Iniciando a instalação do aapanel...", + "d91a58f92edb4b30de7e5399908922da": "[*] Instalando aapanel com comando: {}", "f20af8613aed0194f191d660977de57c": "Instalação concluída", "4357633f73240ceb1b14d13877a90ac2": "aapanel instalado com sucesso, iniciando tarefa de backup...", "f109f7ce6f98f5a3cbf2d273c5749911": "[+] endereço: http://{}:{}{}", - "79fca63f99a824fc4015d93604433ea1": "Falha na instalação do aapanel", + "79fca63f99a824fc4015d93604433ea1": "instalação do aapanel falhou", "b1508aec34af599979d919e20b64e385": "Progresso da instalação: {}", "7b6725a19c46bc6d47e5a49c5764991f": "[+] nome de usuário: {}", "cd3d4cf5a75fd5f9467f6d0f196dbec8": "[+] senha: {}", @@ -3387,12 +3273,12 @@ "c550206bc8daea4b287573ee31f839de": "[+] Diretório de backup {} criado", "9e3f708636e9ea820d608629fdf47c65": "[!] Falha ao criar diretório de backup {}", "9f22d9cb59270cf0f6382a66a63ed8cd": "Falha ao obter tamanho do arquivo remoto: {}", - "ff490ab3be22afd2f2a06842935eedd3": "O arquivo de backup {} não existe", - "e69d7c21f42d046b365c56045ffca873": "Iniciar upload do arquivo de backup {} para o servidor", - "df6ecb94c7a5f06b78d0bde168e769e9": "[*] Começando a fazer upload do arquivo de backup {} para o servidor...", + "ff490ab3be22afd2f2a06842935eedd3": "Arquivo de backup {} não existe", + "e69d7c21f42d046b365c56045ffca873": "Iniciar envio do arquivo de backup {} para o servidor", + "df6ecb94c7a5f06b78d0bde168e769e9": "[*] Iniciando envio do arquivo de backup {} para o servidor...", "217c9c3fec268ff4d6c35bd4d5d564ea": "Falha ao criar diretório de backup", "2942f90ee3b191c0b98add719760e356": "[*] Tamanho do arquivo: {:.2f} MB", - "08b57d594c99a8339461fe78ebf95f1a": "Preparando para fazer upload do arquivo, tamanho: {:.2f} MB", + "08b57d594c99a8339461fe78ebf95f1a": "Preparando para enviar arquivo, tamanho: {:.2f} MB", "2f24607a7361d721459e3a12584fd340": "Arquivo já totalmente enviado, pulando etapa de upload", "4d57fe7dc3462ad55cc9bb1623a3eb5e": "[*] Arquivo de upload incompleto detectado, tentando retomar...", "9c30f21dd1175d2e9b7503e873a52b2f": "[*] Enviado: {:.2f}% ({:.2f}MB / {:.2f}MB)", @@ -3400,19 +3286,19 @@ "426e1c0eadfad630c5433af2757cee8f": "[*] Iniciando novo upload...", "61eb03fffeb48e199890a5a8a24a5dc9": "Iniciando novo upload", "148b2912de8b29f47dc234983554ea2b": "\\r[*] Progresso do upload: {:.2f}% - {:.2f} KB/s - Tempo restante: {}", - "470e645fe1f07b6d4e77fc7b16b2a9a0": "Verificação do tamanho do arquivo aprovada: {:.2f}MB", + "470e645fe1f07b6d4e77fc7b16b2a9a0": "Verificação de tamanho de arquivo passou: {:.2f}MB", "40070e1f0867f97db0fa33039fae2063": "Arquivo enviado com sucesso", - "95dd52c0ce48e72f2021dee1a7a86433": "Incompatibilidade de tamanho de arquivo: local {:.2f}MB, remoto {:.2f}MB", + "95dd52c0ce48e72f2021dee1a7a86433": "Tamanho de arquivo incompatível: local {:.2f}MB, remoto {:.2f}MB", "f7dac1a705d6bd05b3a42086923cf932": "Upload interrompido: {}", "554472ae3f1db37c67fe53e4a2fb53cd": "[*] Tentará retomar do ponto de interrupção {:.2f}MB (tentativa {}/{})...", - "1e6aeb0dc8e2567bdec31246c27233a2": "Falha no upload do arquivo, número máximo de tentativas atingido", - "31c53955195484e892d36d1815e2e5cd": "[*] Começando a extrair arquivo de backup {}...", - "21ec696ab5bc206eac1cf62268824cf0": "[!] O arquivo de backup {} não existe", - "e344a18f13f2b196f3b56938c824dd5f": "[!] Não foi possível extrair carimbo de data/hora do nome do arquivo de backup", - "d4a81ed03254ca37166d84ccb7de0bd6": "[!] Falha na extração do arquivo de backup", + "1e6aeb0dc8e2567bdec31246c27233a2": "Falha no envio do arquivo, número máximo de tentativas atingido", + "31c53955195484e892d36d1815e2e5cd": "[*] Iniciando extração do arquivo de backup {}...", + "21ec696ab5bc206eac1cf62268824cf0": "[!] Arquivo de backup {} não existe", + "e344a18f13f2b196f3b56938c824dd5f": "[!] Incapaz de extrair timestamp do nome do arquivo de backup", + "d4a81ed03254ca37166d84ccb7de0bd6": "[!] Extração do arquivo de backup falhou", "0838e64585e87c91bdfa34890445346e": "[+] Arquivo de backup extraído com sucesso, diretório: {}", - "0fddb4bae41a7fc9e2de8896d8cb819f": "Iniciar restauração do backup (carimbo de data/hora: {})", - "5a275e6386d2d3c647f6ccecb422debc": "[*] Começando a restaurar backup (carimbo de data/hora: {})...", + "0fddb4bae41a7fc9e2de8896d8cb819f": "Iniciar restauração de backup (timestamp: {})", + "5a275e6386d2d3c647f6ccecb422debc": "[*] Iniciando restauração de backup (timestamp: {})...", "e9b7b10566a85a5356096a630d64d2d7": "[*] Aguardando o serviço aapanel iniciar...", "8d7b4f7247dec431d103af1ce34d0233": "Módulo de restauração não existe: {}", "304e687ee7c78fdae6e70226f61d9708": "Executando adicionar tarefa de restauração...", @@ -3421,18 +3307,18 @@ "846cdc02545d18e4b5308d076aa93e95": "Backup restaurado com sucesso", "062ca961d059ebd358098ffdb12f42bb": "Falha na restauração do backup, verifique o log", "f857f6dc6a146a3b125ea3253052ca43": "Iniciar tarefa de migração", - "53779b59d2ae1ff96f4afdfa6bbc6c7f": "Verifique se curl ou wget está instalado", - "39679b63dca413a83cf5b664d46c929b": "Verificação de curl ou wget aprovada", + "53779b59d2ae1ff96f4afdfa6bbc6c7f": "Verificar se curl ou wget está instalado", + "39679b63dca413a83cf5b664d46c929b": "Verificação curl ou wget passou", "0de6a624fa64af38f9a880430e72607e": "Preparando para instalar aapanel", "28dbda7cf25735198d7695702b18aad5": "Instalando aapanel... estimado 5 minutos....", "7a58e7034a9db769af197c85beccafd5": "Instalação do aapanel concluída, iniciando tarefa de backup...", - "a850af0d3bf3586319178228af5698bf": "Começar a executar tarefa de backup nesta máquina", + "a850af0d3bf3586319178228af5698bf": "Iniciar execução da tarefa de backup nesta máquina", "28ec7aad1cd6afdbbc35a6aeaa95761a": "Aguardando conclusão do backup local", "82550a0ece235f0d0b363135e8d94d28": "Tarefa de backup cancelada ou falhou", - "c8f2865e1e43bb2fd88a0e16f3cd4c17": "A tarefa de backup expirou e não foi concluída dentro do tempo especificado", - "4bb768be41853a0aed9f56d5907be1bd": "Carimbo de data/hora do backup obtido: {}", - "c129e18a625645767772504cf77e279a": "Falha ao ler carimbo de data/hora do backup", - "39869251ca57148d747cfd6ee60bf604": "Arquivo de carimbo de data/hora do backup não existe", + "c8f2865e1e43bb2fd88a0e16f3cd4c17": "Tarefa de backup expirou e não completou dentro do tempo especificado", + "4bb768be41853a0aed9f56d5907be1bd": "Timestamp de backup obtido: {}", + "c129e18a625645767772504cf77e279a": "Falha ao ler timestamp de backup", + "39869251ca57148d747cfd6ee60bf604": "Arquivo de timestamp de backup não existe", "60f1d8c19f5fbb046deac4aab745f63c": "Arquivo de backup não existe: {}", "d67c60b6be8ebfd9f73816a7e8e4abfe": "Falha ao ler caminho do arquivo de backup", "9e6caab47781582f556a81245571d8a7": "Backup local concluído: {}", @@ -3446,8 +3332,8 @@ "fdf17802146b46b291164d7c933950c1": "Arquivo de backup enviado com sucesso", "97dc827b342454de3a5f9416ee1e513b": "Preparando para extrair arquivo de backup {}", "67c40d3544174eb6d6fa63dccaa6bf6e": "Preparando para adicionar tarefa de restauração de backup", - "7ec7fd83e38b6d53374f37bd32a3da09": "Preparando para restaurar backup (carimbo de data/hora: {})", - "7fd19264d09d2ff33f1f8b5867354fdb": "Ocorreu uma exceção durante o backup e restauração", + "7ec7fd83e38b6d53374f37bd32a3da09": "Preparando para restaurar backup (timestamp: {})", + "7fd19264d09d2ff33f1f8b5867354fdb": "Ocorreu uma exceção durante backup e restauração", "ef05e1295515a64356e53d3c11498f25": "Tarefa de restauração de backup adicionada com sucesso", "f90b7afaee99210e74fa3bc47d4f4918": "Todas as operações de migração foram concluídas", "9e5e797901f9870ebf7a96266bc1e972": "Tarefa de migração concluída", @@ -3461,70 +3347,72 @@ "c0b860cd7155af1e642fd0c41ee29262": "Caminho do arquivo de backup não especificado", "fa1ab4e94bafd1f5b6ea55e3e9dc33a4": "Falha na extração do arquivo de backup", "d36c2f46c959ee1fb416a947f8e75a47": "Falha na restauração do backup", - "de6b9cefab1a252ada4463ee8f015f07": "[+] Todas as operações foram concluídas", - "496249e9e1cd99dd54146ed6565fe3f8": "Todas as operações foram concluídas", - "20c605607dbf9d6d1d7bb62ddc792ee0": "[!] Ocorreu um erro durante a execução: {}", - "4020efc99e8c60a0e7d27a5598d501e4": "Ocorreu um erro durante a execução: {}", + "de6b9cefab1a252ada4463ee8f015f07": "[+] Todas as operações concluídas", + "496249e9e1cd99dd54146ed6565fe3f8": "Todas as operações concluídas", + "20c605607dbf9d6d1d7bb62ddc792ee0": "[!] Erro ocorrido durante execução: {}", + "4020efc99e8c60a0e7d27a5598d501e4": "Erro ocorrido durante execução: {}", "55be882ba3aef502f3a93ad90bb9d613": "[*] Executando comando de backup...", "1a6da8233a4a66ccc90d767967f22d35": "[+] Tarefa de backup adicionada com sucesso", "af3c2b419ba0779d81ac91cd3ca246b6": "[*] Aguardando conclusão da tarefa de backup...", "c8eb8110632bb540ca112819e96dc770": "[+] Tarefa de backup concluída: {}", "0d1135061a5b00b63bdb12c2f3c9461f": "Tarefa de backup falhou, arquivo de backup não gerado", "f6c3d2e26255f8c185cbcd95ccf2ccfa": "[+] Tarefa de backup concluída (arquivo detectado após tempo limite): {}", - "637452f337bdc2991f23593124d62440": "[!] A tarefa de backup expirou e não foi concluída dentro do tempo especificado", - "ec3a935e2442ef55924ad758e17b92cb": "Empacotamento concluído", + "637452f337bdc2991f23593124d62440": "[!] Tarefa de backup expirou e não completou dentro do tempo especificado", + "b02ab16f5a7d45a871789d3944a41c69": "Backup concluído mas incapaz de obter timestamp", "ffad0690fefe9ebaaf4d847a42b19f90": "Arquivo de configuração de backup não existe", + "46f183fbf6bd1e64702d6930667cf117": "Erro ao obter informações de conclusão de backup: {}", + "b16acd08872bef5685bddff85a29f625": "Empacotamento de Dados", + "df4bb29cbb7fe7e3dbc82e961d5b5b53": "Preparando dados", + "2b2a2a0b0596507029dd0feb9485a216": "Nenhuma tarefa em andamento encontrada. Por favor verifique", + "ec3a935e2442ef55924ad758e17b92cb": "Empacotamento concluído", "40379fed8ad84c0869a1b3e94f8a56fb": "Um processo de backup já está em execução!", - "20bf8648c4a3ea91ad3057f9aeca5f88": "Iniciar compactação e empacotamento de todos os dados", - "dc72aa669e82dd5ec7cff2ed35f2762d": "Compactação e empacotamento de todos os dados concluídos. Tamanho dos dados: {}", + "20bf8648c4a3ea91ad3057f9aeca5f88": "Iniciar compressão e empacotamento de todos os dados", + "dc72aa669e82dd5ec7cff2ed35f2762d": "Compressão e empacotamento de todos os dados concluídos. Tamanho dos dados: {}", "bacf615d02bfa3c58728f62490489e9a": "Backup concluído. Arquivo de backup: {}", "ad69c11076734ffc4c0532b54e6f5be3": "Enviando arquivo de backup para armazenamento em nuvem...", - "c3a6378e06ff3e479a85b0f15c41cb1e": "{} Enviando em partes...", + "c3a6378e06ff3e479a85b0f15c41cb1e": "{} Enviando em pedaços...", "c722636ded0be8237386a427242ff3b2": "{} Enviando...", - "bb914d2441ee988dcd4d616350272f10": "Ocorreu um erro ao enviar para {}: {}", - "8085ded0444fcde19b9ea4d365502f67": "Informações de backup não encontradas", - "b02ab16f5a7d45a871789d3944a41c69": "Backup concluído, mas incapaz de recuperar carimbo de data/hora", - "46f183fbf6bd1e64702d6930667cf117": "Erro ao recuperar informações de conclusão de backup: {}", - "2cb88461938b0c418391af13f65a727d": "Processo de backup está em execução, mas incapaz de recuperar carimbo de data/hora", + "bb914d2441ee988dcd4d616350272f10": "Erro ocorrido ao enviar para {}: {}", + "8085ded0444fcde19b9ea4d365502f67": "Info de backup não encontrada", + "2cb88461938b0c418391af13f65a727d": "Processo de backup está em execução, mas incapaz de obter timestamp", "269159feb2faab7515c90b9f5de791a5": "Arquivo de configuração de backup não existe: {}", - "daa55a73708f906c8cee0bb87284740c": "Erro ao recuperar informações de progresso do backup: {}", + "daa55a73708f906c8cee0bb87284740c": "Erro ao obter informações de progresso de backup: {}", "01ecbbb2b353cf4d915bbe1c1cd5505c": "Configuração do Servidor", "ca3c22c9c94069053b85db0f50373639": "Fazendo backup da configuração do servidor", - "b16acd08872bef5685bddff85a29f625": "Empacotamento de Dados", "d41c74fcc2dd04880a0285c147188bf7": "Preparando dados de backup", "806cb06592627effa1a4073fa2f66ce2": "Um processo de restauração já está em execução!", - "37dfdfda0ab7a98140943484fe70a76c": "Iniciar descompactação do pacote de dados", + "37dfdfda0ab7a98140943484fe70a76c": "Iniciar descompressão do pacote de dados", "c415a70c8540eb59121587b3ab5d5cfa": "Iniciar restauração de dados", "c76bac64baa6fbf5c51ec144c70d91d3": "Restauração de dados concluída", - "da7f5eb715a1a1a2378ee56a5ee24bbd": "Falha na restauração de dados: {}", - "ca0af2ce76c89e3bfa4bad3105c21203": "Restauração concluída, mas incapaz de obter carimbo de data/hora de restauração", + "da7f5eb715a1a1a2378ee56a5ee24bbd": "Restauração de dados falhou: {}", + "ca0af2ce76c89e3bfa4bad3105c21203": "Restauração concluída mas incapaz de obter timestamp de restauração", "0f4f13d63e87130a24667c6bd4cb5e2e": "Arquivo de configuração de restauração não existe", - "0c5d25bf5706190b8ad0d8289a93aeba": "Erro ao obter informações de conclusão da restauração: {}", + "0c5d25bf5706190b8ad0d8289a93aeba": "Erro ao obter informações de conclusão de restauração: {}", "667a68bf7113541f218081fac58f6815": "Arquivo de configuração de restauração não existe: {}", - "e7a91a4400b67b84e7cca61642b93f4d": "Erro ao obter informações de progresso da restauração: {}", + "e7a91a4400b67b84e7cca61642b93f4d": "Erro ao obter informações de progresso de restauração: {}", "1b4c2c21e77ac36e4097a92dabd55bc0": "Desconhecido {}", "c1173fa3bd3d44530eead89e7edeefe1": "Descompressão de Dados", "a76a19147d36f4f2d6801cf602de2718": "Tarefa Desconhecida", "5ba4673aac259be67bac9db8cfc9c5b2": "Preparando para restaurar dados", - "5b43e0e228169e5df9cec81876cd3710": "Erro: o parâmetro force deve ser 0 ou 1", + "5b43e0e228169e5df9cec81876cd3710": "Erro: parâmetro force deve ser 0 ou 1", "4c3880bb027f159e801041b1021e88e8": "Método", - "7d3c180ded4dcc8eade80cd031ab1b5d": "Por favor, não opere com frequência, aguarde um momento", + "7d3c180ded4dcc8eade80cd031ab1b5d": "Por favor, não opere frequentemente, aguarde um momento", "37b15a5d1e4fa625ea8996de5e378a84": "Recuperado com sucesso", "616e012bcc90980f6ddfd2b3c17345f8": "Falha ao obter progresso", "9e0a136b55af822e72c8d6716d2d4bf3": "Tipo Desconhecido", "6ac0b58e56cefd76e61bc840dfad94fa": "Tarefa parada com sucesso", "b808472e703dfd53fdcb59fbe89e3436": "Executado com sucesso", "12b65fbe011be723b4ae981c0d42c44d": "Tarefa de restauração adicionada com sucesso", - "741e160bb129a548e26fbad37c8f674d": "Teste de conexão SSH falhou, verifique se o IP e a porta estão corretos", + "741e160bb129a548e26fbad37c8f674d": "Teste de conexão SSH falhou, verifique se o IP e porta estão corretos", "e0867cf8c8a1935e8bd681f0ff28a612": "Conexão SSH verificada com sucesso", "f94e94b4ec479336f36fdf9fe1004b83": "Minha Tarefa de Migração", "b100f6e1c91f013adf0ca5ce6606a89d": "Tarefa de migração adicionada com sucesso", "fd0099266c1971c5c40036e615d67fd4": "Migrado com sucesso", - "87aa2e739755a6fea3a63876b5a1d48e": "Com Sucesso", - "d7db03701029007097b8e0cd61a983f6": "Nenhuma tarefa de migração no momento", - "808781229f7b019ba6a44ea3871e3b6d": "falha na leitura da tarefa de migração, tente novamente mais tarde!", + "87aa2e739755a6fea3a63876b5a1d48e": "Com sucesso", + "d7db03701029007097b8e0cd61a983f6": "Nenhuma tarefa de migração atualmente", + "808781229f7b019ba6a44ea3871e3b6d": "leitura de tarefa de migração falhou, tente novamente mais tarde!", "e728b6a004aa5e61efd25bf815a6e290": "Iniciando tarefa de backup...", - "c9d48d6a4ebe28917b5439c91faaff68": "Instalação do aapanel concluída!", + "c9d48d6a4ebe28917b5439c91faaff68": "instalação do aapanel concluída!", "f5e7895e7c31fedd32b520012910f960": "Tarefa de Migração", "3a94451860f0c20374128e61e8783d26": "Instalação do aapanel", "f02f38d885226197e729453ea104feac": "Tarefa de Restauração", @@ -3534,176 +3422,174 @@ "3a02e4b05ad1b321e855aa6116699b6e": "Lembrete de migração excluído com sucesso", "334afd10871f8c52a884e307d2e17ccf": "Histórico de migração excluído com sucesso", "2f393a2518f5668880822f47fcdb5cc0": "Histórico de migração não existe", - "df4bb29cbb7fe7e3dbc82e961d5b5b53": "Preparando dados", - "2b2a2a0b0596507029dd0feb9485a216": "Nenhuma tarefa em andamento encontrada. Por favor, verifique", "d4e8a75d522d3e77ae80eadd49b0865e": "A lista de bancos de dados remotos está vazia", "5d806f11bb91996cafe7836b27a4e770": "Exceção de conexão Redis!", - "1d69261c05f6ce03d2cab5528d443fa7": "Iniciando um backup dos dados do banco de dados", - "0cf1803cfdfda6f67d12fa7e1c4a25a7": "Backup {}banco de dados {}remoto", - "32d68be800692faddb12c5252fded05e": "{}Informações do banco de dados {}remoto ✓", + "1d69261c05f6ce03d2cab5528d443fa7": "Iniciando backup dos dados do banco de dados", + "0cf1803cfdfda6f67d12fa7e1c4a25a7": "Backup {}banco de dados remoto {}", + "32d68be800692faddb12c5252fded05e": "{}Informação de banco de dados remoto {} ✓", "0c64283397c43effb13a2cbe818ce929": "Backup dos dados do banco de dados concluído", - "2f7d7cfc04be64fa087e964d41cb26b4": "Iniciar restauração da lista de bancos de dados SQLite", - "a1248c409fec22277ab13a6bb433188e": "O arquivo de backup da lista de bancos de dados SQLite não existe, ignorando restauração", - "d03ebecb5f420070192de8712926151a": "Restauração da lista de bancos de dados SQLite concluída", - "ad6937d61b4d6e93a13f03308c66f2eb": "O serviço Mongodb não está em execução!", - "f60644c6526c4d9afe5b20db75fc2e5b": "Falha no backup do banco de dados, o diretório de exportação não existe!", - "161bb420493657920405937a2cf42c96": "Falha na compactação do backup!", + "2f7d7cfc04be64fa087e964d41cb26b4": "Iniciar restauração da lista de banco de dados SQLite", + "a1248c409fec22277ab13a6bb433188e": "Arquivo de backup da lista de banco de dados SQLite não existe, pulando restauração", + "d03ebecb5f420070192de8712926151a": "Restauração da lista de banco de dados SQLite concluída", + "ad6937d61b4d6e93a13f03308c66f2eb": "Serviço Mongodb não está rodando!", + "f60644c6526c4d9afe5b20db75fc2e5b": "Falha no backup do banco de dados, diretório de exportação não existe!", + "161bb420493657920405937a2cf42c96": "Falha na compressão do backup!", "20a42330f9241c13c91e3e203449a8a6": "Falta de ferramenta de backup, instale o gerenciador pgsql via loja de software primeiro!", "7eff7c4aeb6bfe736f8a78c0096f92c7": "Por favor, defina a senha do administrador primeiro!", - "6e907b499869ab16105a7aba198e13a7": "A senha do banco de dados está vazia! Por favor, defina a senha do banco de dados primeiro!", + "6e907b499869ab16105a7aba198e13a7": "A senha do banco de dados está vazia! Por favor defina a senha do banco de dados primeiro!", "d8a3336243e1c08e8a29c75af1eb528c": "Inicialização do MySQL bem-sucedida!", - "ee9017df13cf59a9b0d6588c5e8d9e5a": "MySQL será reiniciado, por favor aguarde...", + "ee9017df13cf59a9b0d6588c5e8d9e5a": "MySQL irá reiniciar, por favor aguarde...", "73af95fd2322196e0d9792df4ca1f566": "Inicialização do MongoDB bem-sucedida!", - "8c9718f3235e7c36c9f400bc68db1ef5": "Falha na autenticação do MongoDB! erro: {}", + "8c9718f3235e7c36c9f400bc68db1ef5": "Falha ao definir auth do MongoDB! erro: {}", "79d1fd8783e1723ef3617be74f8f5fdd": "Inicialização do PostgreSQL bem-sucedida!", "c46866b7bc29cf9d478835bda10e43ce": "Inicialização do Redis bem-sucedida!", "4e889bbbfc5e25ebf611e5764b8a358c": "Iniciar restauração do banco de dados", - "c9206e74b8d32e1e0a5710c0fe322cee": "Restaurando banco de dados {} {}", - "ecea29915732c5d0001ece74601f3d20": "Banco de dados {} {} ✓", - "b61a878149263a02fa99cc635409ee25": "Banco de dados {} {} ✗ ({})", - "3fa7c5a9beafa67bb44999cab5cff52c": "Falha ao restaurar banco de dados {} {} Motivo: {}", + "c9206e74b8d32e1e0a5710c0fe322cee": "Restaurando {} banco de dados {}", + "ecea29915732c5d0001ece74601f3d20": "{} banco de dados {} ✓", + "b61a878149263a02fa99cc635409ee25": "{} banco de dados {} ✗ ({})", + "3fa7c5a9beafa67bb44999cab5cff52c": "Falha ao restaurar {} banco de dados {} Razão: {}", "e89775cca910deb5e484f631606cceb1": "Restauração dos dados do banco de dados concluída", "9750547146e22f364299bc5f561a3fb6": "Iniciar restauração do banco de dados remoto", "23f2db47eb6ff16785e5a222c8657f93": "Restauração do banco de dados remoto concluída", - "b17f6f187c4ecfd392c6367ec2ba6498": "id de backup {} não existe, importação terminada", - "3e686ed1f6a0bc9ccba7a3cc119b5008": "id do banco de dados {} não existe, recuperação de dados terminada", + "b17f6f187c4ecfd392c6367ec2ba6498": "{} id de backup não existe, importação terminada", + "3e686ed1f6a0bc9ccba7a3cc119b5008": "{} id de banco de dados não existe, recuperação de dados terminada", "611881e9f5d01b22a447c282aa8aca23": "Banco de dados MySQL {} já existe", - "ea31cbc6134300ca816c913d227b605f": "Falha ao criar banco de dados {}. Motivo: {}", - "3fdbf50d7a2f33c3d48d4cfe69a3ba77": "Banco de dados já existe, ignorando restauração SQL", + "ea31cbc6134300ca816c913d227b605f": "Falha ao criar {} banco de dados. Razão: {}", + "3fdbf50d7a2f33c3d48d4cfe69a3ba77": "Banco de dados já existe, pulando restauração SQL", "556843e4a406b780b0cf83c43366a8dd": "Importação bem-sucedida", "af71c2c0e3813c9a77fe48507ea8e4d1": "Banco de dados MongoDB {} já existe", "84b4d8c8cdd02488c0f868e97b22a3c2": "Criação bem-sucedida", - "10aec3a9e9564a9851c117b259245136": "Banco de dados já existe, ignorando restauração de dados", + "10aec3a9e9564a9851c117b259245136": "Banco de dados já existe, pulando restauração de dados", "b819d4259ca3ab0042562acea69e83e1": "Banco de dados PostgreSQL {} já existe", "31b21eca2e62de420cf05e8135089114": "Arquivo de backup não existe!", "3eed4851380704f25eec3921befde38f": "Restauração bem-sucedida", - "cbea0a592d6a3c48f2418d687cf54200": "Iniciar backup dos dados do terminal", - "e7e06b2dd59401dcf79acf2e3124d2fb": "Backup dos dados do terminal concluído. Tamanho dos dados: {}", - "a273d4d4d0cf13abc1d7a4f96b8c851e": "Iniciar restauração dos dados do terminal", + "5e211e4fb46748c1d243b59a15645df7": "Iniciando uma Tarefa Agendada de Backup", + "a9d58d413bd48f1bd7e8041b6d8ceab0": "Tarefa Crontab {} ✓", + "ff0550fa0270ac20419790a51900d815": "Backup de Tarefa Crontab concluído", + "a7609aefd5330a1384704e73dc0b4dc0": "Iniciar restauração de Tarefa Crontab", + "48ed083561c2f201d9fe52f6a35ee982": "Tarefa Crontab realizada", + "cbea0a592d6a3c48f2418d687cf54200": "Iniciar backup de dados do terminal", + "e7e06b2dd59401dcf79acf2e3124d2fb": "Backup de dados do terminal concluído. Tamanho dos dados: {}", + "a273d4d4d0cf13abc1d7a4f96b8c851e": "Iniciar restauração de dados do terminal", "1a15a2b43f1dd92e836a592fb180843d": "Restauração falhou, arquivo não existe", - "95d831166994e434da49f3ed70b73e8e": "Restauração dos dados do terminal concluída", - "e3a04ee4c0a034510866948e571c7966": "Iniciando backup dos dados do firewall", - "9a176a20c15e3dc096ed8bc5a05182ba": "Regras de porta do firewall ✓", - "ce693968cbf6e5f66af91e3dd2317d78": "Regras de IP do firewall ✓", - "7ebd5e6b35357be0d5079f674f68ed8f": "Regras de encaminhamento do firewall ✓", - "8dfa78d85bb1d152b0cafe398b27e1ae": "Regras de região do firewall ✓", - "927bb2298acc2c29d1beaff4d1656371": "Backup dos dados do firewall concluído", - "d076d2dde53272dc55d47f34a465ebef": "Inicializando dados do firewall", - "3e0b3a3e90cc4a1f5abbf3fd1a38c2b7": "Instalado.", - "d1b0c3d7a1b5f80626ec1a2395b4f990": "Iniciando restauração dos dados do firewall", - "1f35b1eac1045718a64b4133a8e8829b": "Iniciando restauração das regras de porta do firewall", - "a168f915263109733b87807a0db41e01": "Regras de porta do firewall restauradas com sucesso ✓", - "ce04afdfe07dead0b0fb34e6bc00b6e5": "Falha ao restaurar regras de porta do firewall", - "c32b29f59e8b553998c75c5d7bc44dc6": "Iniciando restauração das regras de IP do firewall", - "b68673b625a1d48b3953e37bb39fcbab": "Regras de IP do firewall restauradas com sucesso ✓", - "ee0294aac018e0ab5f4e5e020f8d867c": "Falha ao restaurar regras de IP do firewall", - "326c03834ea4914dbb02cf04e0c0164f": "Iniciando restauração das regras de encaminhamento do firewall", - "b077ba90ec76f05d0e541733e8291e3f": "Regras de encaminhamento do firewall restauradas com sucesso ✓", - "5ed68fe9a3e0530485018c0704d91035": "Falha ao restaurar regras de encaminhamento do firewall", - "03f3f31fd240913a083a78fc2d60f6f8": "Iniciando restauração das regras de região do firewall", - "6f9922502feac3b7e6ede129664e3e18": "Regras de região do firewall restauradas com sucesso ✓", - "771b376bf4473fc2f1cea6958de2afeb": "Falha ao restaurar regras de região do firewall", - "6331b46ffa70ff97b558022d5ae8098a": "Iniciando reinicialização do firewall", - "1bb2a65f17d7e3c685f36f7ff1794338": "Reinicialização do firewall concluída", - "246f6edb1d9df9b3abe78fc810876c28": "Falha ao restaurar dados do firewall: {}", - "2c3f740bd2d0ca6e5f9cb79ededf0a5d": "Iniciar backup dos dados do site", + "95d831166994e434da49f3ed70b73e8e": "Restauração de dados do terminal concluída", + "2c3f740bd2d0ca6e5f9cb79ededf0a5d": "Iniciar backup de dados do site", "c886466d255b20be0dbde7f1b44b7f20": "Fazendo backup do projeto {}: {}", "7ecf25c18499d663d2e636d0a99f73a3": "Projeto {} {} ✓ ({})", - "0fc5eeb9bebed19653578a5df99d3e6e": "Backup dos dados do site concluído", - "9a2e8778b2a816fedb9f83afadcc2341": "Iniciando restauração das dependências Python do site...", - "fd16d36423b43735556724e0395e8f91": "Restauração das dependências Python do site concluída", + "0fc5eeb9bebed19653578a5df99d3e6e": "Backup de dados do site concluído", + "9a2e8778b2a816fedb9f83afadcc2341": "Iniciando restauração de dependências Python do site...", + "fd16d36423b43735556724e0395e8f91": "Restauração de dependências Python do site concluída", "bbf57ca8231bce958a3e528a08491874": "Falha na inserção no banco de dados do site: {}", - "389f018ba17dc25cb23a5300d8f630db": "O diretório de backup do site não existe: {}", - "21654e03b247d5e25abaa0ad542883c0": "Iniciar restauração dos dados do site", + "389f018ba17dc25cb23a5300d8f630db": "Diretório de backup do site não existe: {}", + "21654e03b247d5e25abaa0ad542883c0": "Iniciar restauração de dados do site", "c8cecd19f4f4a680a5879f828d1c5578": "Restaurando projeto {}: {}", - "35850d3654332477522ee06c756a3c85": "Falha ao excluir diretório de origem do site: {}", + "35850d3654332477522ee06c756a3c85": "Falha ao excluir diretório fonte do site: {}", "c88b730f7a6a312159272ce532947de2": "Projeto {}: {} ✓", - "24ee51964e4ece856493ca28fdb075ed": "Restauração dos dados do site concluída", - "483829cb5ae13bb190eb59acdf4f3231": "Iniciar backup dos dados do servidor de e-mail", - "8c7a0774ab14bae83a69b8562102fb0a": "Backup dos dados do servidor de e-mail concluído. Tamanho dos dados: {}", - "e8480272035737a247832288f618c270": "Iniciar restauração dos dados do servidor de e-mail", + "24ee51964e4ece856493ca28fdb075ed": "Restauração de dados do site concluída", + "483829cb5ae13bb190eb59acdf4f3231": "Iniciar backup de dados do servidor de correio", + "8c7a0774ab14bae83a69b8562102fb0a": "Backup de dados do servidor de correio concluído. Tamanho dos dados: {}", + "e8480272035737a247832288f618c270": "Iniciar restauração de dados do servidor de correio", "e058c7e1fd9cd1a4fd7ac7240a7765d2": "Restauração falhou, arquivo não existe", - "6e6e9dcfdf7bd846ab85a4ff0e0e2f95": "Restauração dos dados do servidor de e-mail concluída", - "1502c42b339a3dfe20e4c95186b38dc3": "Iniciar backup das informações da conta FTP", + "6e6e9dcfdf7bd846ab85a4ff0e0e2f95": "Restauração de dados do servidor de correio concluída", + "1502c42b339a3dfe20e4c95186b38dc3": "Iniciar backup de informações de conta FTP", "b5cf2f2c48fb5978825d3341759dd6d6": "Usuário {} ✓", - "120446d8a303de2396a1bb62ba8e8755": "Falha ao fazer backup das informações da conta FTP: {}", - "b18010e000c073a3587a89b2931c2770": "Backup das informações da conta FTP concluído", + "120446d8a303de2396a1bb62ba8e8755": "Falha ao fazer backup de informações de conta FTP: {}", + "b18010e000c073a3587a89b2931c2770": "Backup de informações de conta FTP concluído", "c9073077bfd7adb73cbe253177b08833": "Restaurando conta {}", - "c5df3d6bec6157b48fb24bf8fe2a2add": "Falha na criação do FTP: {}", + "c5df3d6bec6157b48fb24bf8fe2a2add": "Falha na criação de FTP: {}", "f3f8d4ba630fa6a7de1e9f4e34bad5dc": "Conta {} ✓", - "af4ff8fd3803d5496f74604eb1665e81": "Iniciar restauração da configuração da conta FTP", + "af4ff8fd3803d5496f74604eb1665e81": "Iniciar restauração de configuração de conta FTP", "2bf94c9147c8220fc83f955175216c40": "ftp: conta [{}] restaurada com sucesso ✓", - "9417f3027d6326176c986ffeee1f4491": "Falha ao restaurar configuração da conta FTP: {}", - "8ed95b2c3c38acf7e9532a582f08bb86": "Restauração da configuração da conta FTP concluída", - "49237b104331e8724e521b2fe6fdf6d8": "Iniciar backup dos dados do plugin", + "9417f3027d6326176c986ffeee1f4491": "Falha ao restaurar configuração de conta FTP: {}", + "8ed95b2c3c38acf7e9532a582f08bb86": "Restauração de configuração de conta FTP concluída", + "69d45b5b241dac0fa1efaf7b6966520b": "Iniciar backup de informações de certificado SSL", + "835601ead78ba62b89c4b27956645362": "{} {} Arquivo de certificado não existe ✗", + "025de5f8c791241d326ec4e086e9898e": "{} [{}] Certificado expirou ✗", + "ecd204c03ea44719e6fa4ea25569266a": "{} {} ✓", + "aa6b67db23e9cb0b943aa6c0def92cb4": "{} {} Falha no backup: {} ✗", + "ec56d7aedc9c5242d094ebbaeda5047e": "Backup de informações do provedor de API DNS concluído", + "b561b1ca5fd89d639144a099f5fe096d": "Backup de informações de certificado SSL concluído", + "7aa422d849ba11b569187382a3a509d1": "Restaurando sites de implantação para certificado {}...", + "4573d024bbb8e1f8c8efb2582a6a01c0": "Sites de implantação restaurados para certificado {}: {}", + "baa339aa8e95d46851fd48574cb1d902": "Restaurando caixas de correio de implantação para certificado {}...", + "9307ae55fb4a7b878e377790e040eec4": "Caixas de correio de implantação restauradas para certificado {}: {}", + "b057e2d52c20f76bf3c788eb9b4873fa": "Restaurando painel de implantação para certificado {}...", + "41596c0d36a66c44434d5882c3cfa793": "Painel de implantação restaurado para certificado {}: {}", + "6ffcb0a3e8cdf728b3e7bc45ae221e5a": "Falha na inserção do certificado, verifique o log", + "c8a71420e709d8a4d02914a78d9a0e06": "Iniciar restauração de configuração de certificado SSL de domínio", + "0672a3dc402dc9657fd0a0f1580d1c12": "Nenhum dado de restauração encontrado", + "52f23f668fced51c3e25c781299fbff8": "Diretório de backup {} não existe, impossível restaurar informações de certificado SSL", + "ad93ef11d3e4238618571f517e11e80d": "Restaurando {} Assunto: {}", + "c49480308ee71202cc5fff5ea96eaaed": "Arquivo de certificado não existe", + "42db220bc931b97aecdef6b6f0362bc4": "Certificado ou arquivo de chave privada faltando", + "9f88b7ffec183a54f2e7e6136b4f5ac7": "Restauração de informações de certificado SSL concluída", + "e9ed6b2a27deb5699565f0441dc713e9": "Iniciar backup de informações de software", + "e690c7866c5dbacbbc7860af5e6a3af1": "Backup de informações de software concluído", + "cabf299a6cfa5874e23582c535f301c6": "Iniciar instalação nginx-{}", + "33ec71107108ed89c0b526d5473526c8": "Iniciar instalação serviço apache", + "b815f2a7e299ea99d41d665c728756d9": "Instalação do servidor web concluída", + "70510d59e30015790f07ca53c80c5bec": "Iniciar instalação php-{}", + "2de6c0aa3c26285104f898b368bcf287": "Iniciar instalação node-{}", + "7d5cf115afd8be7c2a36d03b31d1ce44": "Iniciar instalação mariadb-{}", + "92e77c2b107f440d6d54062228112f73": "Iniciar instalação mysql-{}", + "4b09abb2edd44a4510395a297a2ff155": "Iniciar instalação mongodb-{}", + "69fa45968c5cc7a9115bff54e70c95c1": "Iniciar instalação memcached-{}", + "fbabb869ff01746bd144289622b277fc": "Iniciar instalação redis-{}", + "da7d69765f1876fba52c21a17e8c74c6": "Iniciar instalação pgsql-{}", + "99782b6a478e499d45a91f9d78e1c73a": "Iniciar instalação phpmyadmin-{}", + "640c4e334dc9587e212d36e685059478": "Iniciar instalação ftp-{}", + "aecfeaaa9e3bcff1f6169598772e90c0": "Iniciar restauração do ambiente de execução do painel", + "3b83e3fdb17c70ca190e263e0bd7173e": "Pulará instalação se o mesmo ambiente existir", + "e3a04ee4c0a034510866948e571c7966": "Iniciando backup de dados do firewall", + "9a176a20c15e3dc096ed8bc5a05182ba": "Regras de porta do Firewall ✓", + "ce693968cbf6e5f66af91e3dd2317d78": "Regras de IP do Firewall ✓", + "7ebd5e6b35357be0d5079f674f68ed8f": "Regras de encaminhamento do Firewall ✓", + "8dfa78d85bb1d152b0cafe398b27e1ae": "Regras de região do Firewall ✓", + "927bb2298acc2c29d1beaff4d1656371": "Backup de dados do firewall concluído", + "d076d2dde53272dc55d47f34a465ebef": "Inicializando dados do firewall", + "3e0b3a3e90cc4a1f5abbf3fd1a38c2b7": "Instalado.", + "d1b0c3d7a1b5f80626ec1a2395b4f990": "Iniciando restauração de dados do firewall", + "1f35b1eac1045718a64b4133a8e8829b": "Iniciando restauração de regras de porta do firewall", + "a168f915263109733b87807a0db41e01": "Regras de porta do firewall restauradas com sucesso ✓", + "ce04afdfe07dead0b0fb34e6bc00b6e5": "Falha ao restaurar regras de porta do firewall", + "c32b29f59e8b553998c75c5d7bc44dc6": "Iniciando restauração de regras de IP do firewall", + "b68673b625a1d48b3953e37bb39fcbab": "Regras de IP do firewall restauradas com sucesso ✓", + "ee0294aac018e0ab5f4e5e020f8d867c": "Falha ao restaurar regras de IP do firewall", + "326c03834ea4914dbb02cf04e0c0164f": "Iniciando restauração de regras de encaminhamento do firewall", + "b077ba90ec76f05d0e541733e8291e3f": "Regras de encaminhamento do firewall restauradas com sucesso ✓", + "5ed68fe9a3e0530485018c0704d91035": "Falha ao restaurar regras de encaminhamento do firewall", + "03f3f31fd240913a083a78fc2d60f6f8": "Iniciando restauração de regras de região do firewall", + "6f9922502feac3b7e6ede129664e3e18": "Regras de região do firewall restauradas com sucesso ✓", + "771b376bf4473fc2f1cea6958de2afeb": "Falha ao restaurar regras de região do firewall", + "6331b46ffa70ff97b558022d5ae8098a": "Iniciando reinício do firewall", + "1bb2a65f17d7e3c685f36f7ff1794338": "Reinício do firewall concluído", + "246f6edb1d9df9b3abe78fc810876c28": "Falha ao restaurar dados do firewall: {}", + "49237b104331e8724e521b2fe6fdf6d8": "Iniciar backup de dados do plugin", "26d785a1a32377e0e0e9498f4a7da12e": "Firewall Nginx ✓ ({})", "7f578816e3867140ee56ccbbc1d69f55": "Relatório de monitoramento do site ✓ ({})", "ff083aca075c6543c2999781b6677c19": "Proteção contra adulteração empresarial ✓ ({})", "2f29dad748ac1d8d50481ecbd7e05091": "Fortalecimento do sistema ✓ ({})", - "79bb9b38c599612b8b8f38ddc50f5c25": "Iniciar restauração dos dados do plugin", - "ee84e47223f5ce39b8bb239376db4af3": "Se a máquina migrada não estiver vinculada a um usuário aapanel e atualizada para a versão Profissional, podem ocorrer falhas na restauração do plugin", + "79bb9b38c599612b8b8f38ddc50f5c25": "Iniciar restauração de dados do plugin", + "ee84e47223f5ce39b8bb239376db4af3": "Se a máquina migrada não estiver vinculada a um usuário aapanel e atualizada para a versão Profissional, falhas na restauração do plugin podem ocorrer", "30560687e27ef30b6f1cde26359eea6c": "Iniciar instalação do firewall Nginx", "a776b4ccf7343a25223817c8597ca7cf": "Firewall Nginx ✓", - "d0c97e94eb5061783de7bbad8e7bd295": "Iniciar restauração dos dados do firewall Nginx", + "d0c97e94eb5061783de7bbad8e7bd295": "Iniciar restauração de dados do firewall Nginx", "0010c09bd9f322c3b88a89dd0b52c831": "Dados do firewall Nginx ✓", "427ad80bf462a92719fcff5c1a1be755": "Firewall Nginx ✗", "29ad27f749c3f913779d432115de597f": "Iniciar instalação do relatório de monitoramento do site", "66f3f8adc854963e94a643b706157309": "Relatório de monitoramento do site ✓", - "a0dded50b067929299258b3c8fc1b0e6": "Iniciar restauração dos dados do relatório de monitoramento do site", + "a0dded50b067929299258b3c8fc1b0e6": "Iniciar restauração de dados do relatório de monitoramento do site", "bd43add14ebbd0f448c207c48e1d5ac8": "Dados do relatório de monitoramento do site ✓", "a7b8bc831a9b36cc5127b5f8ecbec22a": "Relatório de monitoramento do site ✗", "c922c95c5f7973050d08412a26aab462": "Iniciar instalação da proteção contra adulteração empresarial", "31d844f4dd95b8a71e8ddbd1b9912ae5": "Proteção contra adulteração empresarial ✓", - "8fcd5da199e1e04830a686a576a2e914": "Iniciar restauração dos dados da proteção contra adulteração empresarial", + "8fcd5da199e1e04830a686a576a2e914": "Iniciar restauração de dados da proteção contra adulteração empresarial", "941b78173e944c6737a858bada098311": "Dados da proteção contra adulteração empresarial ✓", "50bcd3813a4b18663b0bdc29f73b8c90": "Proteção contra adulteração empresarial ✗", "cdcfb9e176572fe14bdc4c88474d8baf": "Iniciar instalação do fortalecimento do sistema", "4d86b9c9f554fa3d477a86d2f62aaa1b": "Fortalecimento do sistema ✓", - "5633c4d754985da6c7fab116964ac501": "Iniciar restauração dos dados do fortalecimento do sistema", + "5633c4d754985da6c7fab116964ac501": "Iniciar restauração de dados do fortalecimento do sistema", "bda583fc184a8e079a37e169a9614e10": "Dados do fortalecimento do sistema ✓", "479557cf249b3145d91a94ed130c5ecb": "Fortalecimento do sistema ✗", - "746e85b89c25244ae397c06029badc9c": "Restauração dos dados do plugin concluída", - "69d45b5b241dac0fa1efaf7b6966520b": "Iniciar backup das informações do certificado SSL", - "835601ead78ba62b89c4b27956645362": "{} {} Arquivo de certificado não existe ✗", - "025de5f8c791241d326ec4e086e9898e": "{} [{}] O certificado expirou ✗", - "ecd204c03ea44719e6fa4ea25569266a": "{} {} ✓", - "aa6b67db23e9cb0b943aa6c0def92cb4": "{} {} Falha no backup: {} ✗", - "ec56d7aedc9c5242d094ebbaeda5047e": "Backup das informações do provedor de API DNS concluído", - "b561b1ca5fd89d639144a099f5fe096d": "Backup das informações do certificado SSL concluído", - "7aa422d849ba11b569187382a3a509d1": "Restaurando sites de implantação para o certificado {}...", - "4573d024bbb8e1f8c8efb2582a6a01c0": "Sites de implantação restaurados para o certificado {}: {}", - "baa339aa8e95d46851fd48574cb1d902": "Restaurando caixas de correio de implantação para o certificado {}...", - "9307ae55fb4a7b878e377790e040eec4": "Caixas de correio de implantação restauradas para o certificado {}: {}", - "b057e2d52c20f76bf3c788eb9b4873fa": "Restaurando painel de implantação para o certificado {}...", - "41596c0d36a66c44434d5882c3cfa793": "Painel de implantação restaurado para o certificado {}: {}", - "6ffcb0a3e8cdf728b3e7bc45ae221e5a": "Falha na inserção do certificado, verifique o log", - "c8a71420e709d8a4d02914a78d9a0e06": "Iniciar restauração da configuração do certificado SSL do domínio", - "0672a3dc402dc9657fd0a0f1580d1c12": "Nenhum dado de restauração encontrado", - "52f23f668fced51c3e25c781299fbff8": "O diretório de backup {} não existe, impossível restaurar informações do certificado SSL", - "ad93ef11d3e4238618571f517e11e80d": "Restaurando {} Assunto: {}", - "c49480308ee71202cc5fff5ea96eaaed": "Arquivo de certificado não existe", - "42db220bc931b97aecdef6b6f0362bc4": "Faltando certificado ou arquivo de chave privada", - "9f88b7ffec183a54f2e7e6136b4f5ac7": "Restauração das informações do certificado SSL concluída", - "5e211e4fb46748c1d243b59a15645df7": "Iniciando Backup da Tarefa Agendada", - "a9d58d413bd48f1bd7e8041b6d8ceab0": "Tarefa Crontab {} ✓", - "ff0550fa0270ac20419790a51900d815": "Conclusão do Backup da Tarefa Crontab", - "a7609aefd5330a1384704e73dc0b4dc0": "Iniciar restauração da Tarefa Crontab", - "48ed083561c2f201d9fe52f6a35ee982": "Tarefa Crontab concluída", - "e9ed6b2a27deb5699565f0441dc713e9": "Iniciar backup das informações de software", - "e690c7866c5dbacbbc7860af5e6a3af1": "Backup das informações de software concluído", - "cabf299a6cfa5874e23582c535f301c6": "Iniciar instalação do nginx-{}", - "33ec71107108ed89c0b526d5473526c8": "Iniciar instalação do serviço apache", - "b815f2a7e299ea99d41d665c728756d9": "Instalação do servidor web concluída", - "70510d59e30015790f07ca53c80c5bec": "Iniciar instalação do php-{}", - "2de6c0aa3c26285104f898b368bcf287": "Iniciar instalação do node-{}", - "7d5cf115afd8be7c2a36d03b31d1ce44": "Iniciar instalação do mariadb-{}", - "92e77c2b107f440d6d54062228112f73": "Iniciar instalação do mysql-{}", - "4b09abb2edd44a4510395a297a2ff155": "Iniciar instalação do mongodb-{}", - "69fa45968c5cc7a9115bff54e70c95c1": "Iniciar instalação do memcached-{}", - "fbabb869ff01746bd144289622b277fc": "Iniciar instalação do redis-{}", - "da7d69765f1876fba52c21a17e8c74c6": "Iniciar instalação do pgsql-{}", - "99782b6a478e499d45a91f9d78e1c73a": "Iniciar instalação do phpmyadmin-{}", - "640c4e334dc9587e212d36e685059478": "Iniciar instalação do ftp-{}", - "aecfeaaa9e3bcff1f6169598772e90c0": "Iniciar restauração do ambiente de execução do painel", - "3b83e3fdb17c70ca190e263e0bd7173e": "A instalação será ignorada se o mesmo ambiente existir" + "746e85b89c25244ae397c06029badc9c": "Restauração de dados do plugin concluída" } diff --git a/BTPanel/static/img/soft_ico/ico-site_total.png b/BTPanel/static/img/soft_ico/ico-site_total.png new file mode 100644 index 00000000..2c828bd7 Binary files /dev/null and b/BTPanel/static/img/soft_ico/ico-site_total.png differ diff --git a/BTPanel/static/vite/css/CalcSize.css b/BTPanel/static/vite/css/CalcSize.css new file mode 100644 index 00000000..2994cd5b --- /dev/null +++ b/BTPanel/static/vite/css/CalcSize.css @@ -0,0 +1 @@ +.files-icon[data-v-0a2d98fb]{display:inline-block;width:25px;height:25px;background-image:url(/static/vite/images/file_icon.png);background-repeat:no-repeat;background-size:25px;background-position:0px -375px}.files-icon.medium-icon.swf-icon[data-v-0a2d98fb]{background-position:0px 0px}.files-icon.medium-icon.webm-icon[data-v-0a2d98fb]{background-position:0px -25px}.files-icon.medium-icon.webp-icon[data-v-0a2d98fb]{background-position:0px -50px}.files-icon.medium-icon.wma-icon[data-v-0a2d98fb]{background-position:0px -75px}.files-icon.medium-icon.wmv-icon[data-v-0a2d98fb]{background-position:0px -100px}.files-icon.medium-icon.xls-icon[data-v-0a2d98fb]{background-position:0px -125px}.files-icon.medium-icon.xml-icon[data-v-0a2d98fb]{background-position:0px -150px}.files-icon.medium-icon.access-icon[data-v-0a2d98fb]{background-position:0px -175px}.files-icon.medium-icon.apk-icon[data-v-0a2d98fb]{background-position:0px -200px}.files-icon.medium-icon.avi-icon[data-v-0a2d98fb],.files-icon.medium-icon.bmp-icon[data-v-0a2d98fb]{background-position:0px -250px}.files-icon.medium-icon.cdr-icon[data-v-0a2d98fb]{background-position:0px -275px}.files-icon.medium-icon.compress-icon[data-v-0a2d98fb]{background-position:0px -300px}.files-icon.medium-icon.css-icon[data-v-0a2d98fb]{background-position:0px -325px}.files-icon.medium-icon.doc-icon[data-v-0a2d98fb]{background-position:0px -350px}.files-icon.medium-icon.file-icon[data-v-0a2d98fb]{background-position:0px -375px}.files-icon.medium-icon.folder-icon[data-v-0a2d98fb]{background-position:0px -400px}.files-icon.medium-icon.gif-icon[data-v-0a2d98fb]{background-position:0px -425px}.files-icon.medium-icon.html-icon[data-v-0a2d98fb]{background-position:0px -450px}.files-icon.medium-icon.ico-icon[data-v-0a2d98fb]{background-position:0px -475px}.files-icon.medium-icon.java-icon[data-v-0a2d98fb]{background-position:0px -500px}.files-icon.medium-icon.js-icon[data-v-0a2d98fb]{background-position:0px -525px}.files-icon.medium-icon.bt_split_json-icon[data-v-0a2d98fb]{background-position:0px -550px}.files-icon.medium-icon.jpeg-icon[data-v-0a2d98fb]{background-position:0px -575px}.files-icon.medium-icon.jpg-icon[data-v-0a2d98fb]{background-position:0px -600px}.files-icon.medium-icon.json-icon[data-v-0a2d98fb]{background-position:0px -625px}.files-icon.medium-icon.log-icon[data-v-0a2d98fb]{background-position:0px -650px}.files-icon.medium-icon.lua-icon[data-v-0a2d98fb]{background-position:0px -675px}.files-icon.medium-icon.mkv-icon[data-v-0a2d98fb]{background-position:0px -700px}.files-icon.medium-icon.mov-icon[data-v-0a2d98fb]{background-position:0px -725px}.files-icon.medium-icon.mp4-icon[data-v-0a2d98fb]{background-position:0px -750px}.files-icon.medium-icon.mpg-icon[data-v-0a2d98fb]{background-position:0px -775px}.files-icon.medium-icon.mpeg-icon[data-v-0a2d98fb]{background-position:0px -800px}.files-icon.medium-icon.pdf-icon[data-v-0a2d98fb]{background-position:0px -825px}.files-icon.medium-icon.php-icon[data-v-0a2d98fb]{background-position:0px -850px}.files-icon.medium-icon.png-icon[data-v-0a2d98fb]{background-position:0px -875px}.files-icon.medium-icon.ppt-icon[data-v-0a2d98fb]{background-position:0px -900px}.files-icon.medium-icon.py-icon[data-v-0a2d98fb]{background-position:0px -925px}.files-icon.medium-icon.rm-icon[data-v-0a2d98fb]{background-position:0px -950px}.files-icon.medium-icon.rmvb-icon[data-v-0a2d98fb]{background-position:0px -975px}.files-icon.medium-icon.sh-icon[data-v-0a2d98fb]{background-position:0px -1000px}.files-icon.medium-icon.bt_split-icon[data-v-0a2d98fb]{background-position:0px -1025px}.files-icon.medium-icon.sql-icon[data-v-0a2d98fb]{background-position:0px -1050px}.files-icon.large-icon[data-v-0a2d98fb]{width:50px;height:50px;background-size:50px;background-position:0px -750px}.files-icon.large-icon.swf-icon[data-v-0a2d98fb]{background-position:0px 0px}.files-icon.large-icon.webm-icon[data-v-0a2d98fb]{background-position:0px -50px}.files-icon.large-icon.webp-icon[data-v-0a2d98fb]{background-position:0px -100px}.files-icon.large-icon.wma-icon[data-v-0a2d98fb]{background-position:0px -150px}.files-icon.large-icon.wmv-icon[data-v-0a2d98fb]{background-position:0px -200px}.files-icon.large-icon.xls-icon[data-v-0a2d98fb]{background-position:0px -250px}.files-icon.large-icon.xml-icon[data-v-0a2d98fb]{background-position:0px -300px}.files-icon.large-icon.access-icon[data-v-0a2d98fb]{background-position:0px -350px}.files-icon.large-icon.apk-icon[data-v-0a2d98fb]{background-position:0px -400px}.files-icon.large-icon.avi-icon[data-v-0a2d98fb]{background-position:0px -450px}.files-icon.large-icon.bmp-icon[data-v-0a2d98fb]{background-position:0px -500px}.files-icon.large-icon.cdr-icon[data-v-0a2d98fb]{background-position:0px -550px}.files-icon.large-icon.compress-icon[data-v-0a2d98fb]{background-position:0px -600px}.files-icon.large-icon.css-icon[data-v-0a2d98fb]{background-position:0px -650px}.files-icon.large-icon.doc-icon[data-v-0a2d98fb]{background-position:0px -700px}.files-icon.large-icon.file-icon[data-v-0a2d98fb]{background-position:0px -750px}.files-icon.large-icon.folder-icon[data-v-0a2d98fb]{background-position:0px -800px}.files-icon.large-icon.gif-icon[data-v-0a2d98fb]{background-position:0px -850px}.files-icon.large-icon.html-icon[data-v-0a2d98fb]{background-position:0px -900px}.files-icon.large-icon.ico-icon[data-v-0a2d98fb]{background-position:0px -950px}.files-icon.large-icon.java-icon[data-v-0a2d98fb]{background-position:0px -1000px}.files-icon.large-icon.js-icon[data-v-0a2d98fb]{background-position:0px -1050px}.files-icon.large-icon.bt_split_json-icon[data-v-0a2d98fb]{background-position:0px -1100px}.files-icon.large-icon.jpeg-icon[data-v-0a2d98fb]{background-position:0px -1150px}.files-icon.large-icon.jpg-icon[data-v-0a2d98fb]{background-position:0px -1200px}.files-icon.large-icon.json-icon[data-v-0a2d98fb]{background-position:0px -1250px}.files-icon.large-icon.log-icon[data-v-0a2d98fb]{background-position:0px -1300px}.files-icon.large-icon.lua-icon[data-v-0a2d98fb]{background-position:0px -1350px}.files-icon.large-icon.mkv-icon[data-v-0a2d98fb]{background-position:0px -1400px}.files-icon.large-icon.mov-icon[data-v-0a2d98fb]{background-position:0px -1450px}.files-icon.large-icon.mp4-icon[data-v-0a2d98fb]{background-position:0px -1500px}.files-icon.large-icon.mpg-icon[data-v-0a2d98fb]{background-position:0px -1550px}.files-icon.large-icon.mpeg-icon[data-v-0a2d98fb]{background-position:0px -1600px}.files-icon.large-icon.pdf-icon[data-v-0a2d98fb]{background-position:0px -1650px}.files-icon.large-icon.php-icon[data-v-0a2d98fb]{background-position:0px -1700px}.files-icon.large-icon.png-icon[data-v-0a2d98fb]{background-position:0px -1750px}.files-icon.large-icon.ppt-icon[data-v-0a2d98fb]{background-position:0px -1800px}.files-icon.large-icon.py-icon[data-v-0a2d98fb]{background-position:0px -1850px}.files-icon.large-icon.rm-icon[data-v-0a2d98fb]{background-position:0px -1900px}.files-icon.large-icon.rmvb-icon[data-v-0a2d98fb]{background-position:0px -1950px}.files-icon.large-icon.sh-icon[data-v-0a2d98fb]{background-position:0px -2000px}.files-icon.large-icon.bt_split-icon[data-v-0a2d98fb]{background-position:0px -2050px}.files-icon.large-icon.sql-icon[data-v-0a2d98fb]{background-position:0px -2100px} diff --git a/BTPanel/static/vite/css/config.css b/BTPanel/static/vite/css/config.css index e8f76204..5b714d64 100644 --- a/BTPanel/static/vite/css/config.css +++ b/BTPanel/static/vite/css/config.css @@ -1 +1 @@ -.n-transfer[data-v-22ecfe71] .n-transfer-list--target{display:none} +.bt-tips-ul[data-v-6dc5521d]{margin-top:24px;padding:24px 0;border-top:1px solid #ececec;font-size:14px} diff --git a/BTPanel/static/vite/css/config2.css b/BTPanel/static/vite/css/config2.css index a44df511..e8f76204 100644 --- a/BTPanel/static/vite/css/config2.css +++ b/BTPanel/static/vite/css/config2.css @@ -1 +1 @@ -.param-list[data-v-d6f769f3]{display:flex;flex-wrap:wrap;gap:10px;border:1px solid #ccc;padding:16px;border-radius:4px}.param-list .param-item[data-v-d6f769f3]{display:flex;align-items:center;justify-content:center;width:90px;height:30px;border-radius:4px;border:1px solid #ddd;cursor:pointer}.param-list .param-item.active[data-v-d6f769f3]{border:1px solid #20a53a;background:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAB4AAAAeCAYAAAA7MK6iAAAACXBIWXMAAAsTAAALEwEAmpwYAAAFFmlUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4gPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iQWRvYmUgWE1QIENvcmUgNS42LWMxNDAgNzkuMTYwNDUxLCAyMDE3LzA1LzA2LTAxOjA4OjIxICAgICAgICAiPiA8cmRmOlJERiB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiPiA8cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91dD0iIiB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iIHhtbG5zOmRjPSJodHRwOi8vcHVybC5vcmcvZGMvZWxlbWVudHMvMS4xLyIgeG1sbnM6cGhvdG9zaG9wPSJodHRwOi8vbnMuYWRvYmUuY29tL3Bob3Rvc2hvcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RFdnQ9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZUV2ZW50IyIgeG1wOkNyZWF0b3JUb29sPSJBZG9iZSBQaG90b3Nob3AgQ0MgKE1hY2ludG9zaCkiIHhtcDpDcmVhdGVEYXRlPSIyMDE5LTA5LTI5VDEyOjIzOjI5KzA4OjAwIiB4bXA6TW9kaWZ5RGF0ZT0iMjAxOS0wOS0yOVQxMjoyNTo1MSswODowMCIgeG1wOk1ldGFkYXRhRGF0ZT0iMjAxOS0wOS0yOVQxMjoyNTo1MSswODowMCIgZGM6Zm9ybWF0PSJpbWFnZS9wbmciIHBob3Rvc2hvcDpDb2xvck1vZGU9IjMiIHBob3Rvc2hvcDpJQ0NQcm9maWxlPSJzUkdCIElFQzYxOTY2LTIuMSIgeG1wTU06SW5zdGFuY2VJRD0ieG1wLmlpZDowMDkwMWRiNS04NTMxLTRkYmUtOGVlNy0wZDU2ODhjNzI1YjEiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6MDA5MDFkYjUtODUzMS00ZGJlLThlZTctMGQ1Njg4YzcyNWIxIiB4bXBNTTpPcmlnaW5hbERvY3VtZW50SUQ9InhtcC5kaWQ6MDA5MDFkYjUtODUzMS00ZGJlLThlZTctMGQ1Njg4YzcyNWIxIj4gPHhtcE1NOkhpc3Rvcnk+IDxyZGY6U2VxPiA8cmRmOmxpIHN0RXZ0OmFjdGlvbj0iY3JlYXRlZCIgc3RFdnQ6aW5zdGFuY2VJRD0ieG1wLmlpZDowMDkwMWRiNS04NTMxLTRkYmUtOGVlNy0wZDU2ODhjNzI1YjEiIHN0RXZ0OndoZW49IjIwMTktMDktMjlUMTI6MjM6MjkrMDg6MDAiIHN0RXZ0OnNvZnR3YXJlQWdlbnQ9IkFkb2JlIFBob3Rvc2hvcCBDQyAoTWFjaW50b3NoKSIvPiA8L3JkZjpTZXE+IDwveG1wTU06SGlzdG9yeT4gPC9yZGY6RGVzY3JpcHRpb24+IDwvcmRmOlJERj4gPC94OnhtcG1ldGE+IDw/eHBhY2tldCBlbmQ9InIiPz7zCy1OAAAB+0lEQVRIib3UPWgUQRjG8f/uHkkUm5yViYiEubM8VLSwCjtiJ4JYCEpEsD7P+JlCSRMvxnyYOq2FYmUlSMzggYWF2p4uiCgBwSKiJkrO7Fhsgrlk73Zvbm+fbmbf9/3NDuxCyhHKHdVaY6eLylmwikB6cIDq4sY6FVgo+WAzmgq8jl7eut9ROK/kTBjaUTiv5IyPLjV63hFYKDndDO0ILJScBn0lqi5ROC6aKCyUOxUXTQwOUIZb6WkbFkpOtoq2DQeovmrSawwLJe+bosbwOnrNFDWChXIn4qKH/W68gRKH/K724ADlepzarNXNo0IZ9p3k8f4L5rBQ8l5c1MHhtRiG3QX4XuXYl4dmcIDqG1uH3151ttVaWFT3DkH/cVj5SvFNiW/6d+twGApQ7TvLkPsUb623bv9DrwRxHmq/eFk5xzOnFjq3KSyUHA9DbWzQa5DZAe4TvF1HAfC6DkBhBPy/sHCGSz2NZ1sR6M1mB/N2HoQjE2DZsPgc9kiwHahcJOd/bkQueYPz2dA3zitZjkIBcivv4MVpqC1D/4kAfXunCfo/2+C8kmUffSuycwPP/KSycAqWF+H9HLkfr2L11V21UPIu6JG46OYM0MMnVvHxo8glb3A+m0kCBfjIn5bq7QB1x9pBTZIRyh0l+COFf3DJpwZgaa1T8urzD5CgrJIeM8AQAAAAAElFTkSuQmCC);background-size:15px;background-repeat:no-repeat;background-position:right -1px bottom -1px} +.n-transfer[data-v-22ecfe71] .n-transfer-list--target{display:none} diff --git a/BTPanel/static/vite/css/config3.css b/BTPanel/static/vite/css/config3.css new file mode 100644 index 00000000..a44df511 --- /dev/null +++ b/BTPanel/static/vite/css/config3.css @@ -0,0 +1 @@ +.param-list[data-v-d6f769f3]{display:flex;flex-wrap:wrap;gap:10px;border:1px solid #ccc;padding:16px;border-radius:4px}.param-list .param-item[data-v-d6f769f3]{display:flex;align-items:center;justify-content:center;width:90px;height:30px;border-radius:4px;border:1px solid #ddd;cursor:pointer}.param-list .param-item.active[data-v-d6f769f3]{border:1px solid #20a53a;background:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAB4AAAAeCAYAAAA7MK6iAAAACXBIWXMAAAsTAAALEwEAmpwYAAAFFmlUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4gPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iQWRvYmUgWE1QIENvcmUgNS42LWMxNDAgNzkuMTYwNDUxLCAyMDE3LzA1LzA2LTAxOjA4OjIxICAgICAgICAiPiA8cmRmOlJERiB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiPiA8cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91dD0iIiB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iIHhtbG5zOmRjPSJodHRwOi8vcHVybC5vcmcvZGMvZWxlbWVudHMvMS4xLyIgeG1sbnM6cGhvdG9zaG9wPSJodHRwOi8vbnMuYWRvYmUuY29tL3Bob3Rvc2hvcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RFdnQ9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZUV2ZW50IyIgeG1wOkNyZWF0b3JUb29sPSJBZG9iZSBQaG90b3Nob3AgQ0MgKE1hY2ludG9zaCkiIHhtcDpDcmVhdGVEYXRlPSIyMDE5LTA5LTI5VDEyOjIzOjI5KzA4OjAwIiB4bXA6TW9kaWZ5RGF0ZT0iMjAxOS0wOS0yOVQxMjoyNTo1MSswODowMCIgeG1wOk1ldGFkYXRhRGF0ZT0iMjAxOS0wOS0yOVQxMjoyNTo1MSswODowMCIgZGM6Zm9ybWF0PSJpbWFnZS9wbmciIHBob3Rvc2hvcDpDb2xvck1vZGU9IjMiIHBob3Rvc2hvcDpJQ0NQcm9maWxlPSJzUkdCIElFQzYxOTY2LTIuMSIgeG1wTU06SW5zdGFuY2VJRD0ieG1wLmlpZDowMDkwMWRiNS04NTMxLTRkYmUtOGVlNy0wZDU2ODhjNzI1YjEiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6MDA5MDFkYjUtODUzMS00ZGJlLThlZTctMGQ1Njg4YzcyNWIxIiB4bXBNTTpPcmlnaW5hbERvY3VtZW50SUQ9InhtcC5kaWQ6MDA5MDFkYjUtODUzMS00ZGJlLThlZTctMGQ1Njg4YzcyNWIxIj4gPHhtcE1NOkhpc3Rvcnk+IDxyZGY6U2VxPiA8cmRmOmxpIHN0RXZ0OmFjdGlvbj0iY3JlYXRlZCIgc3RFdnQ6aW5zdGFuY2VJRD0ieG1wLmlpZDowMDkwMWRiNS04NTMxLTRkYmUtOGVlNy0wZDU2ODhjNzI1YjEiIHN0RXZ0OndoZW49IjIwMTktMDktMjlUMTI6MjM6MjkrMDg6MDAiIHN0RXZ0OnNvZnR3YXJlQWdlbnQ9IkFkb2JlIFBob3Rvc2hvcCBDQyAoTWFjaW50b3NoKSIvPiA8L3JkZjpTZXE+IDwveG1wTU06SGlzdG9yeT4gPC9yZGY6RGVzY3JpcHRpb24+IDwvcmRmOlJERj4gPC94OnhtcG1ldGE+IDw/eHBhY2tldCBlbmQ9InIiPz7zCy1OAAAB+0lEQVRIib3UPWgUQRjG8f/uHkkUm5yViYiEubM8VLSwCjtiJ4JYCEpEsD7P+JlCSRMvxnyYOq2FYmUlSMzggYWF2p4uiCgBwSKiJkrO7Fhsgrlk73Zvbm+fbmbf9/3NDuxCyhHKHdVaY6eLylmwikB6cIDq4sY6FVgo+WAzmgq8jl7eut9ROK/kTBjaUTiv5IyPLjV63hFYKDndDO0ILJScBn0lqi5ROC6aKCyUOxUXTQwOUIZb6WkbFkpOtoq2DQeovmrSawwLJe+bosbwOnrNFDWChXIn4qKH/W68gRKH/K724ADlepzarNXNo0IZ9p3k8f4L5rBQ8l5c1MHhtRiG3QX4XuXYl4dmcIDqG1uH3151ttVaWFT3DkH/cVj5SvFNiW/6d+twGApQ7TvLkPsUb623bv9DrwRxHmq/eFk5xzOnFjq3KSyUHA9DbWzQa5DZAe4TvF1HAfC6DkBhBPy/sHCGSz2NZ1sR6M1mB/N2HoQjE2DZsPgc9kiwHahcJOd/bkQueYPz2dA3zitZjkIBcivv4MVpqC1D/4kAfXunCfo/2+C8kmUffSuycwPP/KSycAqWF+H9HLkfr2L11V21UPIu6JG46OYM0MMnVvHxo8glb3A+m0kCBfjIn5bq7QB1x9pBTZIRyh0l+COFf3DJpwZgaa1T8urzD5CgrJIeM8AQAAAAAElFTkSuQmCC);background-size:15px;background-repeat:no-repeat;background-position:right -1px bottom -1px} diff --git a/BTPanel/static/vite/css/file-upload.css b/BTPanel/static/vite/css/file-upload.css new file mode 100644 index 00000000..afed2d93 --- /dev/null +++ b/BTPanel/static/vite/css/file-upload.css @@ -0,0 +1 @@ +.n-upload-dragger[data-v-1b421c9e]{height:360px;padding:10px}.n-upload-dragger[data-v-1b421c9e]:hover{--n-dragger-border-hover: 1px dashed #20a53a}.drag-text[data-v-1b421c9e]{margin-top:20px;font-size:16px}.drag-suffix[data-v-1b421c9e]{margin-top:12px;color:#777;font-size:14px}.n-data-table[data-v-1b421c9e]{--n-th-color-modal: transparent;--n-td-color-modal: transparent;--n-th-color-hover-modal: transparent;--n-td-color-hover-modal: transparent;--n-border-color-modal: transparent} diff --git a/BTPanel/static/vite/css/index100.css b/BTPanel/static/vite/css/index100.css index ab9e391f..9f406487 100644 --- a/BTPanel/static/vite/css/index100.css +++ b/BTPanel/static/vite/css/index100.css @@ -1 +1 @@ -.mail-head[data-v-3782ca70]{width:100%;background:#ecf5ff;border-bottom:1px solid #ececec;padding:16px 40px}.mail-title[data-v-3782ca70]{padding-bottom:8px;border-bottom:1px solid #999;color:#333;font-size:16px;font-weight:600}.mail-desc[data-v-3782ca70]{line-height:20px;margin-top:4px;color:#888}.mail-body[data-v-3782ca70]{padding:32px 40px;line-height:24px;font-size:13px} +.n-alert[data-v-ec749ad6]{--n-color: #dff0d8;--n-border: 1px solid #d6e9c6;--n-font-size: 12px}.cert-info[data-v-ec749ad6]{color:#3c763d}.cert-info+.cert-info[data-v-ec749ad6]{margin-top:2px}.cert-info .cert-label[data-v-ec749ad6]{font-weight:700}.cert-info .cert-value[data-v-ec749ad6]{flex:1;width:0} diff --git a/BTPanel/static/vite/css/index101.css b/BTPanel/static/vite/css/index101.css index e8a5f224..8cab4ef2 100644 --- a/BTPanel/static/vite/css/index101.css +++ b/BTPanel/static/vite/css/index101.css @@ -1 +1 @@ -.hiden[data-v-09b21549]{transform:rotate(180deg)} +.record-title[data-v-c4a364ba]{font-size:16px;color:var(--n-color-text-1);font-weight:600;margin-bottom:10px}.record-desc[data-v-c4a364ba]{font-size:14px;color:var(--n-color-text-2);margin-bottom:10px}.bt-link[data-v-c4a364ba]{border:none;outline:none;background:none;padding:0} diff --git a/BTPanel/static/vite/css/index102.css b/BTPanel/static/vite/css/index102.css index 2113c3ee..d64e5c8f 100644 --- a/BTPanel/static/vite/css/index102.css +++ b/BTPanel/static/vite/css/index102.css @@ -1 +1 @@ -[data-v-1cd65fd9] .n-tabs-tab__label{height:24px}[data-v-1cd65fd9] .n-tabs-tab--active{color:#20a53a!important}.icon-box[data-v-5d5ba104]{rotate:-90deg;transform-origin:center;display:flex;justify-content:center;align-items:center;color:#666;background-color:#def7e8;border-radius:50%;width:50px;height:50px;margin:10px auto}:deep(.n-tabs-tab__label){height:24px}:deep(.n-tabs-tab--active){color:#20a53a!important} +.title-top[data-v-de5ccbe2]{background:var(--mailserver-domain-check-tips-bg);border-radius:.25rem;padding:10px;text-align:center;border:1px solid #dddddd}.box[data-v-de5ccbe2]{background:var(--mailserver-domain-check-box-bg);align-items:center;border-radius:.25rem;padding:10px;border:1px solid var(--border-hover-focus-color)} diff --git a/BTPanel/static/vite/css/index103.css b/BTPanel/static/vite/css/index103.css index b7908ea8..ab9e391f 100644 --- a/BTPanel/static/vite/css/index103.css +++ b/BTPanel/static/vite/css/index103.css @@ -1 +1 @@ -.n-alert[data-v-74e286a3]{margin-bottom:16px;--n-content-text-color: #20a53a;--n-color: var(--domains-lets-ssl-upload-text)}.drag-box[data-v-74e286a3]{width:100%;padding:5px;border:2px dashed var(--domains-lets-ssl-upload-border);border-radius:6px}.hover[data-v-74e286a3]{border-color:#20a53a} +.mail-head[data-v-3782ca70]{width:100%;background:#ecf5ff;border-bottom:1px solid #ececec;padding:16px 40px}.mail-title[data-v-3782ca70]{padding-bottom:8px;border-bottom:1px solid #999;color:#333;font-size:16px;font-weight:600}.mail-desc[data-v-3782ca70]{line-height:20px;margin-top:4px;color:#888}.mail-body[data-v-3782ca70]{padding:32px 40px;line-height:24px;font-size:13px} diff --git a/BTPanel/static/vite/css/index104.css b/BTPanel/static/vite/css/index104.css index 3e2deb56..e8a5f224 100644 --- a/BTPanel/static/vite/css/index104.css +++ b/BTPanel/static/vite/css/index104.css @@ -1 +1 @@ -.area-item[data-v-f119016e]{display:flex;align-items:center;width:100%;height:32px;padding:0 8px;border:1px solid transparent;border-radius:2px;transition:all .3s;cursor:pointer}.area-item.active[data-v-f119016e],.area-item[data-v-f119016e]:hover{border-color:rgba(32,165,58,.3);background-color:#f1f9f3;color:#20a53a}.area-item .area-name[data-v-f119016e]{text-overflow:ellipsis;overflow:hidden;white-space:nowrap}.area-tabs[data-v-219b3335]{--n-tab-padding: 8px 16px 6px;--n-pane-padding-top: 16px;--n-pane-padding-left: 16px;--n-pane-padding-right: 16px;--n-pane-padding-bottom: 16px}.area-tabs .n-tab-pane[data-v-219b3335]{border:1px solid var(--n-tab-border-color);border-top:none;border-bottom-left-radius:var(--n-tab-border-radius);border-bottom-right-radius:var(--n-tab-border-radius)}.area-input[data-v-219b3335]{--n-height: 26px}.area-tit[data-v-219b3335]{margin-bottom:10px;font-weight:700} +.hiden[data-v-09b21549]{transform:rotate(180deg)} diff --git a/BTPanel/static/vite/css/index105.css b/BTPanel/static/vite/css/index105.css index c6f4a0a0..2113c3ee 100644 --- a/BTPanel/static/vite/css/index105.css +++ b/BTPanel/static/vite/css/index105.css @@ -1 +1 @@ -.seg[data-v-7ea28fa1]{width:1px;height:8px;margin:0 auto;border-left:1px solid #ccc}.tips[data-v-c8f1f83a]{position:absolute;top:32px;left:0;width:100%;padding-top:2px;padding-left:2px;color:#999}.rows[data-v-31e9f077]{display:flex}.rows .field[data-v-31e9f077]{width:140px;margin-right:8px}.rows .condition[data-v-31e9f077]{width:160px;margin-right:8px}.rows .content[data-v-31e9f077]{display:flex;flex:1;width:0;flex-shrink:0}.rows .rows-btn[data-v-31e9f077]{display:flex;align-items:center;margin-left:8px}.rows .rows-btn .close[data-v-31e9f077]{display:flex;align-items:center;justify-content:center;width:24px;height:32px;margin-left:8px;color:#666;cursor:pointer;transition:opacity .3s}.rows .rows-btn .close[data-v-31e9f077]:hover{opacity:.8}.rows.rows-tit>div[data-v-31e9f077]{padding-bottom:8px}.form-title[data-v-2a17c742]{margin-bottom:20px;font-size:16px} +[data-v-1cd65fd9] .n-tabs-tab__label{height:24px}[data-v-1cd65fd9] .n-tabs-tab--active{color:#20a53a!important}.icon-box[data-v-5d5ba104]{rotate:-90deg;transform-origin:center;display:flex;justify-content:center;align-items:center;color:#666;background-color:#def7e8;border-radius:50%;width:50px;height:50px;margin:10px auto}:deep(.n-tabs-tab__label){height:24px}:deep(.n-tabs-tab--active){color:#20a53a!important} diff --git a/BTPanel/static/vite/css/index106.css b/BTPanel/static/vite/css/index106.css index 2c17e76a..b7908ea8 100644 --- a/BTPanel/static/vite/css/index106.css +++ b/BTPanel/static/vite/css/index106.css @@ -1 +1 @@ -.bt-tabs[data-v-828de32f]>.n-tabs-nav{padding:0 20px}.bt-tabs[data-v-828de32f]>.n-tab-pane{padding:16px 10px 0} +.n-alert[data-v-74e286a3]{margin-bottom:16px;--n-content-text-color: #20a53a;--n-color: var(--domains-lets-ssl-upload-text)}.drag-box[data-v-74e286a3]{width:100%;padding:5px;border:2px dashed var(--domains-lets-ssl-upload-border);border-radius:6px}.hover[data-v-74e286a3]{border-color:#20a53a} diff --git a/BTPanel/static/vite/css/index107.css b/BTPanel/static/vite/css/index107.css index f93821f3..3e2deb56 100644 --- a/BTPanel/static/vite/css/index107.css +++ b/BTPanel/static/vite/css/index107.css @@ -1 +1 @@ -.warning[data-v-d159b1c0]{padding:8px;border-radius:4px;background-color:#fdf6ec;color:#e6a23c}.n-alert[data-v-1cb405f3]{--n-font-size: 12px}.cert-info[data-v-1cb405f3]{display:flex;align-items:center;height:24px}.cert-info .cert-label[data-v-1cb405f3]{color:var(--site-config-ssl-label);font-weight:700}.cert-info .cert-value[data-v-1cb405f3]{flex:1;width:0;margin-left:4px}.business-top-tips[data-v-77483f61]{background:var(--site-config-business-tips)}.n-alert[data-v-ec2f03c1]{--n-font-size: 12px}.cert-info[data-v-ec2f03c1]{display:flex;align-items:center;height:24px}.cert-info .cert-label[data-v-ec2f03c1]{color:var(--site-config-ssl-label);font-weight:700}.cert-info .cert-value[data-v-ec2f03c1]{flex:1;width:0;margin-left:4px}.tips[data-v-ce54d9d9]{margin-left:10px;--un-text-opacity:1;color:rgb(102 102 102 / var(--un-text-opacity))}[data-v-e468c3da] .n-alert .n-alert-body{--n-padding: 5px 8px} +.area-item[data-v-f119016e]{display:flex;align-items:center;width:100%;height:32px;padding:0 8px;border:1px solid transparent;border-radius:2px;transition:all .3s;cursor:pointer}.area-item.active[data-v-f119016e],.area-item[data-v-f119016e]:hover{border-color:rgba(32,165,58,.3);background-color:#f1f9f3;color:#20a53a}.area-item .area-name[data-v-f119016e]{text-overflow:ellipsis;overflow:hidden;white-space:nowrap}.area-tabs[data-v-219b3335]{--n-tab-padding: 8px 16px 6px;--n-pane-padding-top: 16px;--n-pane-padding-left: 16px;--n-pane-padding-right: 16px;--n-pane-padding-bottom: 16px}.area-tabs .n-tab-pane[data-v-219b3335]{border:1px solid var(--n-tab-border-color);border-top:none;border-bottom-left-radius:var(--n-tab-border-radius);border-bottom-right-radius:var(--n-tab-border-radius)}.area-input[data-v-219b3335]{--n-height: 26px}.area-tit[data-v-219b3335]{margin-bottom:10px;font-weight:700} diff --git a/BTPanel/static/vite/css/index108.css b/BTPanel/static/vite/css/index108.css index 9928c35e..c6f4a0a0 100644 --- a/BTPanel/static/vite/css/index108.css +++ b/BTPanel/static/vite/css/index108.css @@ -1 +1 @@ -.site-content[data-v-e67980d1]{height:300px;border:1px solid #ececec;overflow-y:auto}.site-content .content-item[data-v-e67980d1]{padding:12px;max-height:80px;border-bottom:1px solid #ececec;font-size:13px;transition:background-color .3s}.site-content .content-item[data-v-e67980d1]:hover{background-color:var(--site-detele-content-item-hover-bg)}.site-content .content-item .site-size[data-v-e67980d1],.site-content .content-item .site-db[data-v-e67980d1]{display:flex;align-items:center;min-height:24px}.site-content .content-item .site-title[data-v-e67980d1]{width:170px}.site-content .content-item .site-path[data-v-e67980d1]{display:flex;align-items:center;flex:1;width:0;margin:0 10px}.site-content .content-item .site-path .value[data-v-e67980d1]{max-width:162px;margin:0 4px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.site-content .content-item .db-name[data-v-e67980d1]{flex:1;width:0}.site-content .content-item .db-size[data-v-e67980d1]{width:180px}.site-content .content-item .db-time[data-v-e67980d1],.site-content .content-item .site-time[data-v-e67980d1]{width:130px} +.seg[data-v-7ea28fa1]{width:1px;height:8px;margin:0 auto;border-left:1px solid #ccc}.tips[data-v-c8f1f83a]{position:absolute;top:32px;left:0;width:100%;padding-top:2px;padding-left:2px;color:#999}.rows[data-v-31e9f077]{display:flex}.rows .field[data-v-31e9f077]{width:140px;margin-right:8px}.rows .condition[data-v-31e9f077]{width:160px;margin-right:8px}.rows .content[data-v-31e9f077]{display:flex;flex:1;width:0;flex-shrink:0}.rows .rows-btn[data-v-31e9f077]{display:flex;align-items:center;margin-left:8px}.rows .rows-btn .close[data-v-31e9f077]{display:flex;align-items:center;justify-content:center;width:24px;height:32px;margin-left:8px;color:#666;cursor:pointer;transition:opacity .3s}.rows .rows-btn .close[data-v-31e9f077]:hover{opacity:.8}.rows.rows-tit>div[data-v-31e9f077]{padding-bottom:8px}.form-title[data-v-2a17c742]{margin-bottom:20px;font-size:16px} diff --git a/BTPanel/static/vite/css/index109.css b/BTPanel/static/vite/css/index109.css index 01e0cbbd..2c17e76a 100644 --- a/BTPanel/static/vite/css/index109.css +++ b/BTPanel/static/vite/css/index109.css @@ -1 +1 @@ -.circle[data-v-dba23c8a]{margin-right:5px;display:inline-block;width:10px;height:10px;border-radius:9999px;--un-bg-opacity:1;background-color:rgb(32 165 58 / var(--un-bg-opacity))} +.bt-tabs[data-v-828de32f]>.n-tabs-nav{padding:0 20px}.bt-tabs[data-v-828de32f]>.n-tab-pane{padding:16px 10px 0} diff --git a/BTPanel/static/vite/css/index110.css b/BTPanel/static/vite/css/index110.css index 2016aa44..1eabd23c 100644 --- a/BTPanel/static/vite/css/index110.css +++ b/BTPanel/static/vite/css/index110.css @@ -1 +1 @@ -.install-box[data-v-3fa52c5e]{position:absolute;top:0;left:0;z-index:100;width:100%;height:100%;display:flex;align-items:center;justify-content:center;--un-bg-opacity:1;background-color:rgb(127 127 127 / var(--un-bg-opacity))}.install-box .install-desc[data-v-3fa52c5e]{max-width:350px;display:flex;align-items:center;justify-content:center;--un-bg-opacity:1;background-color:rgb(255 255 255 / var(--un-bg-opacity));padding:16px;text-align:center;font-size:13px;--un-text-opacity:1;color:rgb(85 85 85 / var(--un-text-opacity))}[data-v-9c2e6736] .n-descriptions-table-header{--n-th-padding: 8px !important}[data-v-9c2e6736] .n-descriptions-table-content{padding:8px!important} +.warning[data-v-d159b1c0]{padding:8px;border-radius:4px;background-color:#fdf6ec;color:#e6a23c}.n-alert[data-v-1cb405f3]{--n-font-size: 12px}.cert-info[data-v-1cb405f3]{display:flex;align-items:center;height:24px}.cert-info .cert-label[data-v-1cb405f3]{color:var(--site-config-ssl-label);font-weight:700}.cert-info .cert-value[data-v-1cb405f3]{flex:1;width:0;margin-left:4px}.business-top-tips[data-v-77483f61]{background:var(--site-config-business-tips)}.n-alert[data-v-ec2f03c1]{--n-font-size: 12px}.cert-info[data-v-ec2f03c1]{display:flex;align-items:center;height:24px}.cert-info .cert-label[data-v-ec2f03c1]{color:var(--site-config-ssl-label);font-weight:700}.cert-info .cert-value[data-v-ec2f03c1]{flex:1;width:0;margin-left:4px}.tips[data-v-ce54d9d9]{margin-left:10px;--un-text-opacity:1;color:rgb(102 102 102 / var(--un-text-opacity))}[data-v-d416524a] .n-alert .n-alert-body{--n-padding: 5px 8px} diff --git a/BTPanel/static/vite/css/index111.css b/BTPanel/static/vite/css/index111.css index fbc02897..9928c35e 100644 --- a/BTPanel/static/vite/css/index111.css +++ b/BTPanel/static/vite/css/index111.css @@ -1 +1 @@ -.n-alert[data-v-d003ad66]{--n-font-size: 12px}.cert-info[data-v-d003ad66]{display:flex;align-items:center;height:24px}.cert-info .cert-label[data-v-d003ad66]{color:var(--site-config-ssl-label);font-weight:700}.cert-info .cert-value[data-v-d003ad66]{flex:1;width:0;margin-left:4px}.business-top-tips[data-v-da25cdef]{background:var(--site-config-business-tips)}.n-alert[data-v-bc2b39ec]{--n-font-size: 12px}.cert-info[data-v-bc2b39ec]{display:flex;align-items:center;height:24px}.cert-info .cert-label[data-v-bc2b39ec]{color:var(--site-config-ssl-label);font-weight:700}.cert-info .cert-value[data-v-bc2b39ec]{flex:1;width:0;margin-left:4px} +.site-content[data-v-e67980d1]{height:300px;border:1px solid #ececec;overflow-y:auto}.site-content .content-item[data-v-e67980d1]{padding:12px;max-height:80px;border-bottom:1px solid #ececec;font-size:13px;transition:background-color .3s}.site-content .content-item[data-v-e67980d1]:hover{background-color:var(--site-detele-content-item-hover-bg)}.site-content .content-item .site-size[data-v-e67980d1],.site-content .content-item .site-db[data-v-e67980d1]{display:flex;align-items:center;min-height:24px}.site-content .content-item .site-title[data-v-e67980d1]{width:170px}.site-content .content-item .site-path[data-v-e67980d1]{display:flex;align-items:center;flex:1;width:0;margin:0 10px}.site-content .content-item .site-path .value[data-v-e67980d1]{max-width:162px;margin:0 4px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.site-content .content-item .db-name[data-v-e67980d1]{flex:1;width:0}.site-content .content-item .db-size[data-v-e67980d1]{width:180px}.site-content .content-item .db-time[data-v-e67980d1],.site-content .content-item .site-time[data-v-e67980d1]{width:130px} diff --git a/BTPanel/static/vite/css/index112.css b/BTPanel/static/vite/css/index112.css index 8a18a3c0..01e0cbbd 100644 --- a/BTPanel/static/vite/css/index112.css +++ b/BTPanel/static/vite/css/index112.css @@ -1 +1 @@ -.n-tag[data-v-c6193199]{--n-height: 16px;--n-padding: 0 5px;--n-font-size: 90%;--n-text-color: #2196f3;font-family:Menlo,Monaco,Consolas,Courier New,monospace}.tools-card[data-v-c7bf07c5]{display:flex;align-items:center;padding:12px 24px;border-radius:4px;background-color:var(--color-bg-2)}.tools-card+.tools-card[data-v-c7bf07c5]{margin-top:16px}.tools-card .tools-img[data-v-c7bf07c5]{display:flex;justify-content:center;width:26px}.tools-card .tools-name[data-v-c7bf07c5]{min-width:150px;padding:0 12px;font-size:13px}.tools-card .n-button[data-v-c7bf07c5]{margin-left:12px;width:32px;padding:0}.tools-card .tools-desc[data-v-c7bf07c5]{margin-left:16px} +.circle[data-v-dba23c8a]{margin-right:5px;display:inline-block;width:10px;height:10px;border-radius:9999px;--un-bg-opacity:1;background-color:rgb(32 165 58 / var(--un-bg-opacity))} diff --git a/BTPanel/static/vite/css/index113.css b/BTPanel/static/vite/css/index113.css index a0c98ad8..2016aa44 100644 --- a/BTPanel/static/vite/css/index113.css +++ b/BTPanel/static/vite/css/index113.css @@ -1 +1 @@ -[data-v-a0020a5f] .custom-table thead th{background-color:#fff} +.install-box[data-v-3fa52c5e]{position:absolute;top:0;left:0;z-index:100;width:100%;height:100%;display:flex;align-items:center;justify-content:center;--un-bg-opacity:1;background-color:rgb(127 127 127 / var(--un-bg-opacity))}.install-box .install-desc[data-v-3fa52c5e]{max-width:350px;display:flex;align-items:center;justify-content:center;--un-bg-opacity:1;background-color:rgb(255 255 255 / var(--un-bg-opacity));padding:16px;text-align:center;font-size:13px;--un-text-opacity:1;color:rgb(85 85 85 / var(--un-text-opacity))}[data-v-9c2e6736] .n-descriptions-table-header{--n-th-padding: 8px !important}[data-v-9c2e6736] .n-descriptions-table-content{padding:8px!important} diff --git a/BTPanel/static/vite/css/index114.css b/BTPanel/static/vite/css/index114.css index e2344cfc..fbc02897 100644 --- a/BTPanel/static/vite/css/index114.css +++ b/BTPanel/static/vite/css/index114.css @@ -1 +1 @@ -.data-box[data-v-8eccfa2c]{max-height:200px;width:100%;display:flex;flex-direction:column;gap:10px;overflow-y:auto;border-radius:10px;padding:10px;border:1px solid #c7c7c7} +.n-alert[data-v-d003ad66]{--n-font-size: 12px}.cert-info[data-v-d003ad66]{display:flex;align-items:center;height:24px}.cert-info .cert-label[data-v-d003ad66]{color:var(--site-config-ssl-label);font-weight:700}.cert-info .cert-value[data-v-d003ad66]{flex:1;width:0;margin-left:4px}.business-top-tips[data-v-da25cdef]{background:var(--site-config-business-tips)}.n-alert[data-v-bc2b39ec]{--n-font-size: 12px}.cert-info[data-v-bc2b39ec]{display:flex;align-items:center;height:24px}.cert-info .cert-label[data-v-bc2b39ec]{color:var(--site-config-ssl-label);font-weight:700}.cert-info .cert-value[data-v-bc2b39ec]{flex:1;width:0;margin-left:4px} diff --git a/BTPanel/static/vite/css/index115.css b/BTPanel/static/vite/css/index115.css index 444c5433..8a18a3c0 100644 --- a/BTPanel/static/vite/css/index115.css +++ b/BTPanel/static/vite/css/index115.css @@ -1 +1 @@ -.circle[data-v-5da8f277]{margin-right:5px;display:inline-block;width:10px;height:10px;border-radius:9999px;--un-bg-opacity:1;background-color:rgb(32 165 58 / var(--un-bg-opacity))} +.n-tag[data-v-c6193199]{--n-height: 16px;--n-padding: 0 5px;--n-font-size: 90%;--n-text-color: #2196f3;font-family:Menlo,Monaco,Consolas,Courier New,monospace}.tools-card[data-v-c7bf07c5]{display:flex;align-items:center;padding:12px 24px;border-radius:4px;background-color:var(--color-bg-2)}.tools-card+.tools-card[data-v-c7bf07c5]{margin-top:16px}.tools-card .tools-img[data-v-c7bf07c5]{display:flex;justify-content:center;width:26px}.tools-card .tools-name[data-v-c7bf07c5]{min-width:150px;padding:0 12px;font-size:13px}.tools-card .n-button[data-v-c7bf07c5]{margin-left:12px;width:32px;padding:0}.tools-card .tools-desc[data-v-c7bf07c5]{margin-left:16px} diff --git a/BTPanel/static/vite/css/index116.css b/BTPanel/static/vite/css/index116.css index e41b4234..a0c98ad8 100644 --- a/BTPanel/static/vite/css/index116.css +++ b/BTPanel/static/vite/css/index116.css @@ -1 +1 @@ -.site-content[data-v-2a911db4]{height:300px;border:1px solid #ececec;overflow-y:auto}.site-content .content-item[data-v-2a911db4]{padding:12px;max-height:80px;border-bottom:1px solid #ececec;font-size:13px;transition:background-color .3s}.site-content .content-item[data-v-2a911db4]:hover{background-color:var(--site-detele-content-item-hover-bg)}.site-content .content-item .site-size[data-v-2a911db4],.site-content .content-item .site-db[data-v-2a911db4]{display:flex;align-items:center;min-height:24px}.site-content .content-item .site-title[data-v-2a911db4]{width:170px}.site-content .content-item .site-path[data-v-2a911db4]{display:flex;align-items:center;flex:1;width:0;margin:0 10px}.site-content .content-item .site-path .value[data-v-2a911db4]{max-width:162px;margin:0 4px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.site-content .content-item .db-name[data-v-2a911db4]{flex:1;width:0}.site-content .content-item .db-size[data-v-2a911db4]{width:180px}.site-content .content-item .db-time[data-v-2a911db4],.site-content .content-item .site-time[data-v-2a911db4]{width:130px} +[data-v-a0020a5f] .custom-table thead th{background-color:#fff} diff --git a/BTPanel/static/vite/css/index117.css b/BTPanel/static/vite/css/index117.css index a18cd676..e2344cfc 100644 --- a/BTPanel/static/vite/css/index117.css +++ b/BTPanel/static/vite/css/index117.css @@ -1 +1 @@ -.login-tips-box[data-v-01864afc]{margin-bottom:16px;display:flex;align-items:center;justify-content:center;gap:10px;border-radius:10px;padding:16px;background-color:var(--color-bg-2)} +.data-box[data-v-8eccfa2c]{max-height:200px;width:100%;display:flex;flex-direction:column;gap:10px;overflow-y:auto;border-radius:10px;padding:10px;border:1px solid #c7c7c7} diff --git a/BTPanel/static/vite/css/index118.css b/BTPanel/static/vite/css/index118.css index 68a2e4e8..444c5433 100644 --- a/BTPanel/static/vite/css/index118.css +++ b/BTPanel/static/vite/css/index118.css @@ -1 +1 @@ -.login-tips-box[data-v-dc67c593]{margin-bottom:16px;display:flex;align-items:center;justify-content:center;gap:10px;border-radius:10px;padding:16px;background-color:var(--color-bg-2)} +.circle[data-v-5da8f277]{margin-right:5px;display:inline-block;width:10px;height:10px;border-radius:9999px;--un-bg-opacity:1;background-color:rgb(32 165 58 / var(--un-bg-opacity))} diff --git a/BTPanel/static/vite/css/index119.css b/BTPanel/static/vite/css/index119.css index e431c153..e41b4234 100644 --- a/BTPanel/static/vite/css/index119.css +++ b/BTPanel/static/vite/css/index119.css @@ -1 +1 @@ -.n-alert[data-v-4bc7ae38]{--n-font-size: 12px}.cert-info[data-v-4bc7ae38]{display:flex;align-items:center;height:24px}.cert-info .cert-label[data-v-4bc7ae38]{color:var(--site-config-ssl-label);font-weight:700}.cert-info .cert-value[data-v-4bc7ae38]{flex:1;width:0;margin-left:4px}.business-top-tips[data-v-12873ea8]{background:var(--site-config-business-tips)}.n-alert[data-v-50ee5bfe]{--n-font-size: 12px}.cert-info[data-v-50ee5bfe]{display:flex;align-items:center;height:24px}.cert-info .cert-label[data-v-50ee5bfe]{color:var(--site-config-ssl-label);font-weight:700}.cert-info .cert-value[data-v-50ee5bfe]{flex:1;width:0;margin-left:4px} +.site-content[data-v-2a911db4]{height:300px;border:1px solid #ececec;overflow-y:auto}.site-content .content-item[data-v-2a911db4]{padding:12px;max-height:80px;border-bottom:1px solid #ececec;font-size:13px;transition:background-color .3s}.site-content .content-item[data-v-2a911db4]:hover{background-color:var(--site-detele-content-item-hover-bg)}.site-content .content-item .site-size[data-v-2a911db4],.site-content .content-item .site-db[data-v-2a911db4]{display:flex;align-items:center;min-height:24px}.site-content .content-item .site-title[data-v-2a911db4]{width:170px}.site-content .content-item .site-path[data-v-2a911db4]{display:flex;align-items:center;flex:1;width:0;margin:0 10px}.site-content .content-item .site-path .value[data-v-2a911db4]{max-width:162px;margin:0 4px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.site-content .content-item .db-name[data-v-2a911db4]{flex:1;width:0}.site-content .content-item .db-size[data-v-2a911db4]{width:180px}.site-content .content-item .db-time[data-v-2a911db4],.site-content .content-item .site-time[data-v-2a911db4]{width:130px} diff --git a/BTPanel/static/vite/css/index120.css b/BTPanel/static/vite/css/index120.css index 08c8386f..a18cd676 100644 --- a/BTPanel/static/vite/css/index120.css +++ b/BTPanel/static/vite/css/index120.css @@ -1 +1 @@ -@charset "UTF-8";#nprogress{pointer-events:none}#nprogress .bar{background:#29d;position:fixed;z-index:1031;top:0;left:0;width:100%;height:2px}#nprogress .peg{display:block;position:absolute;right:0;width:100px;height:100%;box-shadow:0 0 10px #29d,0 0 5px #29d;opacity:1;-webkit-transform:rotate(3deg) translate(0px,-4px);-ms-transform:rotate(3deg) translate(0px,-4px);transform:rotate(3deg) translateY(-4px)}#nprogress .spinner{display:block;position:fixed;z-index:1031;top:15px;right:15px}#nprogress .spinner-icon{width:18px;height:18px;box-sizing:border-box;border:solid 2px transparent;border-top-color:#29d;border-left-color:#29d;border-radius:50%;-webkit-animation:nprogress-spinner .4s linear infinite;animation:nprogress-spinner .4s linear infinite}.nprogress-custom-parent{overflow:hidden;position:relative}.nprogress-custom-parent #nprogress .spinner,.nprogress-custom-parent #nprogress .bar{position:absolute}@-webkit-keyframes nprogress-spinner{0%{-webkit-transform:rotate(0deg)}to{-webkit-transform:rotate(360deg)}}@keyframes nprogress-spinner{0%{transform:rotate(0)}to{transform:rotate(360deg)}}pre code.hljs{display:block;overflow-x:auto;padding:1em}code.hljs{padding:3px 5px}.hljs{color:#abb2bf;background:#282c34}.hljs-comment,.hljs-quote{color:#5c6370;font-style:italic}.hljs-doctag,.hljs-keyword,.hljs-formula{color:#c678dd}.hljs-section,.hljs-name,.hljs-selector-tag,.hljs-deletion,.hljs-subst{color:#e06c75}.hljs-literal{color:#56b6c2}.hljs-string,.hljs-regexp,.hljs-addition,.hljs-attribute,.hljs-meta .hljs-string{color:#98c379}.hljs-attr,.hljs-variable,.hljs-template-variable,.hljs-type,.hljs-selector-class,.hljs-selector-attr,.hljs-selector-pseudo,.hljs-number{color:#d19a66}.hljs-symbol,.hljs-bullet,.hljs-link,.hljs-meta,.hljs-selector-id,.hljs-title{color:#61aeee}.hljs-built_in,.hljs-title.class_,.hljs-class .hljs-title{color:#e6c07b}.hljs-emphasis{font-style:italic}.hljs-strong{font-weight:700}.hljs-link{text-decoration:underline}.i-ant-design\:clear-outlined{--un-icon:url("data:image/svg+xml;utf8,%3Csvg viewBox='0 0 1024 1024' display='inline-flex' width='1em' height='1em' xmlns='http://www.w3.org/2000/svg' %3E%3Cpath fill='currentColor' d='m899.1 869.6l-53-305.6H864c14.4 0 26-11.6 26-26V346c0-14.4-11.6-26-26-26H618V138c0-14.4-11.6-26-26-26H432c-14.4 0-26 11.6-26 26v182H160c-14.4 0-26 11.6-26 26v192c0 14.4 11.6 26 26 26h17.9l-53 305.6c-.3 1.5-.4 3-.4 4.4c0 14.4 11.6 26 26 26h723c1.5 0 3-.1 4.4-.4c14.2-2.4 23.7-15.9 21.2-30M204 390h272V182h72v208h272v104H204zm468 440V674c0-4.4-3.6-8-8-8h-48c-4.4 0-8 3.6-8 8v156H416V674c0-4.4-3.6-8-8-8h-48c-4.4 0-8 3.6-8 8v156H202.8l45.1-260H776l45.1 260z'/%3E%3C/svg%3E");-webkit-mask:var(--un-icon) no-repeat;mask:var(--un-icon) no-repeat;-webkit-mask-size:100% 100%;mask-size:100% 100%;background-color:currentColor;color:inherit;display:inline-flex;width:1em;height:1em}.i-ant-design\:security-scan-outlined{--un-icon:url("data:image/svg+xml;utf8,%3Csvg viewBox='0 0 1024 1024' display='inline-flex' width='1em' height='1em' xmlns='http://www.w3.org/2000/svg' %3E%3Cpath fill='currentColor' d='M866.9 169.9L527.1 54.1C523 52.7 517.5 52 512 52s-11 .7-15.1 2.1L157.1 169.9c-8.3 2.8-15.1 12.4-15.1 21.2v482.4c0 8.8 5.7 20.4 12.6 25.9L499.3 968c3.5 2.7 8 4.1 12.6 4.1s9.2-1.4 12.6-4.1l344.7-268.6c6.9-5.4 12.6-17 12.6-25.9V191.1c.2-8.8-6.6-18.3-14.9-21.2M810 654.3L512 886.5L214 654.3V226.7l298-101.6l298 101.6zM402.9 528.8l-77.5 77.5a8.03 8.03 0 0 0 0 11.3l34 34c3.1 3.1 8.2 3.1 11.3 0l77.5-77.5c55.7 35.1 130.1 28.4 178.6-20.1c56.3-56.3 56.3-147.5 0-203.8s-147.5-56.3-203.8 0c-48.5 48.5-55.2 123-20.1 178.6m65.4-133.3c31.3-31.3 82-31.3 113.2 0c31.3 31.3 31.3 82 0 113.2c-31.3 31.3-82 31.3-113.2 0s-31.3-81.9 0-113.2'/%3E%3C/svg%3E");-webkit-mask:var(--un-icon) no-repeat;mask:var(--un-icon) no-repeat;-webkit-mask-size:100% 100%;mask-size:100% 100%;background-color:currentColor;color:inherit;display:inline-flex;width:1em;height:1em}.i-ant-design\:skin-outlined{--un-icon:url("data:image/svg+xml;utf8,%3Csvg viewBox='0 0 1024 1024' display='inline-flex' width='1em' height='1em' xmlns='http://www.w3.org/2000/svg' %3E%3Cpath fill='currentColor' d='M870 126H663.8c-17.4 0-32.9 11.9-37 29.3C614.3 208.1 567 246 512 246s-102.3-37.9-114.8-90.7a37.93 37.93 0 0 0-37-29.3H154a44 44 0 0 0-44 44v252a44 44 0 0 0 44 44h75v388a44 44 0 0 0 44 44h478a44 44 0 0 0 44-44V466h75a44 44 0 0 0 44-44V170a44 44 0 0 0-44-44m-28 268H723v432H301V394H182V198h153.3c28.2 71.2 97.5 120 176.7 120s148.5-48.8 176.7-120H842z'/%3E%3C/svg%3E");-webkit-mask:var(--un-icon) no-repeat;mask:var(--un-icon) no-repeat;-webkit-mask-size:100% 100%;mask-size:100% 100%;background-color:currentColor;color:inherit;display:inline-flex;width:1em;height:1em}.i-carbon\:certificate{--un-icon:url("data:image/svg+xml;utf8,%3Csvg viewBox='0 0 32 32' display='inline-flex' width='1em' height='1em' xmlns='http://www.w3.org/2000/svg' %3E%3Cpath fill='currentColor' d='m24 17l1.912 3.703l4.088.594L27 24l.771 4L24 25.75L20.229 28L21 24l-3-2.703l4.2-.594zM6 16h6v2H6zm0-4h10v2H6zm0-4h10v2H6z'/%3E%3Cpath fill='currentColor' d='M16 26H4V6h24v10h2V6a2 2 0 0 0-2-2H4a2 2 0 0 0-2 2v20a2 2 0 0 0 2 2h12Z'/%3E%3C/svg%3E");-webkit-mask:var(--un-icon) no-repeat;mask:var(--un-icon) no-repeat;-webkit-mask-size:100% 100%;mask-size:100% 100%;background-color:currentColor;color:inherit;display:inline-flex;width:1em;height:1em}.i-carbon\:data-base{--un-icon:url("data:image/svg+xml;utf8,%3Csvg viewBox='0 0 32 32' display='inline-flex' width='1em' height='1em' xmlns='http://www.w3.org/2000/svg' %3E%3Cpath fill='currentColor' d='M24 3H8a2 2 0 0 0-2 2v22a2 2 0 0 0 2 2h16a2 2 0 0 0 2-2V5a2 2 0 0 0-2-2m0 2v6H8V5ZM8 19v-6h16v6Zm0 8v-6h16v6Z'/%3E%3Ccircle cx='11' cy='8' r='1' fill='currentColor'/%3E%3Ccircle cx='11' cy='16' r='1' fill='currentColor'/%3E%3Ccircle cx='11' cy='24' r='1' fill='currentColor'/%3E%3C/svg%3E");-webkit-mask:var(--un-icon) no-repeat;mask:var(--un-icon) no-repeat;-webkit-mask-size:100% 100%;mask-size:100% 100%;background-color:currentColor;color:inherit;display:inline-flex;width:1em;height:1em}.i-carbon\:ibm-cloud-direct-link-1-dedicated{--un-icon:url("data:image/svg+xml;utf8,%3Csvg viewBox='0 0 32 32' display='inline-flex' width='1em' height='1em' xmlns='http://www.w3.org/2000/svg' %3E%3Cpath fill='currentColor' d='M27 29H13c-1.1 0-2-.9-2-2v-4h2v4h14V13h-4v-2h4c1.1 0 2 .9 2 2v14c0 1.1-.9 2-2 2'/%3E%3Cpath fill='currentColor' d='M19 21h-6c-1.1 0-2-.9-2-2v-6c0-1.1.9-2 2-2h6c1.1 0 2 .9 2 2v6c0 1.1-.9 2-2 2m-6-8v6h6v-6z'/%3E%3Cpath fill='currentColor' d='M5 3h14c1.1 0 2 .9 2 2v4h-2V5H5v14h4v2H5c-1.1 0-2-.9-2-2V5c0-1.1.9-2 2-2'/%3E%3C/svg%3E");-webkit-mask:var(--un-icon) no-repeat;mask:var(--un-icon) no-repeat;-webkit-mask-size:100% 100%;mask-size:100% 100%;background-color:currentColor;color:inherit;display:inline-flex;width:1em;height:1em}.i-carbon\:locked{--un-icon:url("data:image/svg+xml;utf8,%3Csvg viewBox='0 0 32 32' display='inline-flex' width='1em' height='1em' xmlns='http://www.w3.org/2000/svg' %3E%3Cpath fill='currentColor' d='M24 14h-2V8a6 6 0 0 0-12 0v6H8a2 2 0 0 0-2 2v12a2 2 0 0 0 2 2h16a2 2 0 0 0 2-2V16a2 2 0 0 0-2-2M12 8a4 4 0 0 1 8 0v6h-8Zm12 20H8V16h16Z'/%3E%3C/svg%3E");-webkit-mask:var(--un-icon) no-repeat;mask:var(--un-icon) no-repeat;-webkit-mask-size:100% 100%;mask-size:100% 100%;background-color:currentColor;color:inherit;display:inline-flex;width:1em;height:1em}.i-carbon\:meter{--un-icon:url("data:image/svg+xml;utf8,%3Csvg viewBox='0 0 32 32' display='inline-flex' width='1em' height='1em' xmlns='http://www.w3.org/2000/svg' %3E%3Cpath fill='currentColor' d='M26 16a9.9 9.9 0 0 0-1.14-4.618l-1.495 1.496A7.95 7.95 0 0 1 24 16zm-2.586-6L22 8.586L17.285 13.3A3 3 0 0 0 16 13a3 3 0 1 0 3 3a3 3 0 0 0-.3-1.285zM16 17a1 1 0 1 1 1-1a1 1 0 0 1-1 1m0-9a8 8 0 0 1 3.122.635l1.496-1.496A9.986 9.986 0 0 0 6 16h2a8.01 8.01 0 0 1 8-8'/%3E%3Cpath fill='currentColor' d='M16 30a14 14 0 1 1 14-14a14.016 14.016 0 0 1-14 14m0-26a12 12 0 1 0 12 12A12.014 12.014 0 0 0 16 4'/%3E%3C/svg%3E");-webkit-mask:var(--un-icon) no-repeat;mask:var(--un-icon) no-repeat;-webkit-mask-size:100% 100%;mask-size:100% 100%;background-color:currentColor;color:inherit;display:inline-flex;width:1em;height:1em}.i-carbon\:reminder{--un-icon:url("data:image/svg+xml;utf8,%3Csvg viewBox='0 0 32 32' display='inline-flex' width='1em' height='1em' xmlns='http://www.w3.org/2000/svg' %3E%3Cpath fill='currentColor' d='m30 23.382l-2-1V20a6.005 6.005 0 0 0-5-5.91V12h-2v2.09A6.005 6.005 0 0 0 16 20v2.382l-2 1V28h6v2h4v-2h6ZM28 26H16v-1.382l2-1V20a4 4 0 0 1 8 0v3.618l2 1Z'/%3E%3Cpath fill='currentColor' d='M28 6a2 2 0 0 0-2-2h-4V2h-2v2h-8V2h-2v2H6a2 2 0 0 0-2 2v20a2 2 0 0 0 2 2h4v-2H6V6h4v2h2V6h8v2h2V6h4v6h2Z'/%3E%3C/svg%3E");-webkit-mask:var(--un-icon) no-repeat;mask:var(--un-icon) no-repeat;-webkit-mask-size:100% 100%;mask-size:100% 100%;background-color:currentColor;color:inherit;display:inline-flex;width:1em;height:1em}.i-carbon\:security{--un-icon:url("data:image/svg+xml;utf8,%3Csvg viewBox='0 0 32 32' display='inline-flex' width='1em' height='1em' xmlns='http://www.w3.org/2000/svg' %3E%3Cpath fill='currentColor' d='M14 16.59L11.41 14L10 15.41l4 4l8-8L20.59 10z'/%3E%3Cpath fill='currentColor' d='m16 30l-6.176-3.293A10.98 10.98 0 0 1 4 17V4a2 2 0 0 1 2-2h20a2 2 0 0 1 2 2v13a10.98 10.98 0 0 1-5.824 9.707ZM6 4v13a8.99 8.99 0 0 0 4.766 7.942L16 27.733l5.234-2.79A8.99 8.99 0 0 0 26 17V4Z'/%3E%3C/svg%3E");-webkit-mask:var(--un-icon) no-repeat;mask:var(--un-icon) no-repeat;-webkit-mask-size:100% 100%;mask-size:100% 100%;background-color:currentColor;color:inherit;display:inline-flex;width:1em;height:1em}.i-carbon\:terminal{--un-icon:url("data:image/svg+xml;utf8,%3Csvg viewBox='0 0 32 32' display='inline-flex' width='1em' height='1em' xmlns='http://www.w3.org/2000/svg' %3E%3Cpath fill='currentColor' d='M26 4.01H6a2 2 0 0 0-2 2v20a2 2 0 0 0 2 2h20a2 2 0 0 0 2-2v-20a2 2 0 0 0-2-2m0 2v4H6v-4Zm-20 20v-14h20v14Z'/%3E%3Cpath fill='currentColor' d='m10.76 16.18l2.82 2.83l-2.82 2.83l1.41 1.41l4.24-4.24l-4.24-4.24z'/%3E%3C/svg%3E");-webkit-mask:var(--un-icon) no-repeat;mask:var(--un-icon) no-repeat;-webkit-mask-size:100% 100%;mask-size:100% 100%;background-color:currentColor;color:inherit;display:inline-flex;width:1em;height:1em}.i-carbon\:time{--un-icon:url("data:image/svg+xml;utf8,%3Csvg viewBox='0 0 32 32' display='inline-flex' width='1em' height='1em' xmlns='http://www.w3.org/2000/svg' %3E%3Cpath fill='currentColor' d='M16 30a14 14 0 1 1 14-14a14 14 0 0 1-14 14m0-26a12 12 0 1 0 12 12A12 12 0 0 0 16 4'/%3E%3Cpath fill='currentColor' d='M20.59 22L15 16.41V7h2v8.58l5 5.01z'/%3E%3C/svg%3E");-webkit-mask:var(--un-icon) no-repeat;mask:var(--un-icon) no-repeat;-webkit-mask-size:100% 100%;mask-size:100% 100%;background-color:currentColor;color:inherit;display:inline-flex;width:1em;height:1em}.i-carbon\:warning{--un-icon:url("data:image/svg+xml;utf8,%3Csvg viewBox='0 0 32 32' display='inline-flex' width='1em' height='1em' xmlns='http://www.w3.org/2000/svg' %3E%3Cpath fill='currentColor' d='M16 2a14 14 0 1 0 14 14A14 14 0 0 0 16 2m0 26a12 12 0 1 1 12-12a12 12 0 0 1-12 12'/%3E%3Cpath fill='currentColor' d='M15 8h2v11h-2zm1 14a1.5 1.5 0 1 0 1.5 1.5A1.5 1.5 0 0 0 16 22'/%3E%3C/svg%3E");-webkit-mask:var(--un-icon) no-repeat;mask:var(--un-icon) no-repeat;-webkit-mask-size:100% 100%;mask-size:100% 100%;background-color:currentColor;color:inherit;display:inline-flex;width:1em;height:1em}.i-common\:feedback{background:url("data:image/svg+xml;utf8,%3Csvg display='inline-flex' width='1em' height='1em' viewBox='0 0 20 20' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M16.6665 10V17.5H3.33313V2.5L10.8331 2.49996' stroke='%233A424D' stroke-width='1.5' stroke-linecap='square'/%3E%3Cpath d='M16.6669 3.33332L10.0002 9.99999' stroke='%233BAF52' stroke-width='1.5'/%3E%3Cpath d='M6.66687 13.3333L13.3335 13.3333' stroke='%233A424D' stroke-width='1.5'/%3E%3C/svg%3E") no-repeat;background-size:100% 100%;background-color:transparent;display:inline-flex;width:1em;height:1em}.i-common\:feedback-dark{background:url("data:image/svg+xml;utf8,%3Csvg display='inline-flex' width='1em' height='1em' viewBox='0 0 20 20' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M16.6665 10.0001V17.5H3.33313V2.50004L10.8331 2.5' stroke='%23C7C7C7' stroke-width='1.5' stroke-linecap='square'/%3E%3Cpath d='M16.6669 3.33337L10.0002 10' stroke='%2320a53a' stroke-width='1.5'/%3E%3Cpath d='M6.66687 13.3334L13.3335 13.3334' stroke='%23C7C7C7' stroke-width='1.5'/%3E%3C/svg%3E") no-repeat;background-size:100% 100%;background-color:transparent;display:inline-flex;width:1em;height:1em}.i-common\:fire{background:url("data:image/svg+xml;utf8,%3Csvg display='inline-flex' width='1em' height='1em' viewBox='0 0 18 18' xmlns='http://www.w3.org/2000/svg' xmlns:xlink='http://www.w3.org/1999/xlink' fill='none' customFrame='%23000000'%3E%3Crect id='控件/红点/火' x='0.000000' y='0.000000' fill='rgb(255,255,255)' fill-opacity='0'/%3E%3Cg id='Group 23'%3E%3Ccircle id='Oval 3' cx='9' cy='9' r='9' fill='rgb(255,143,0)'/%3E%3Ccircle id='Oval 3' cx='9' cy='9' r='9' stroke='rgb(151,151,151)' stroke-opacity='0' stroke-width='0'/%3E%3Cpath id='形状' d='M8.7772 2C8.7772 2 6.92746 6.03452 5.11464 8.08207C2.74809 10.7552 4.45539 14.0743 7.38007 14.8398C7.38007 14.8398 6.05756 13.5418 7.61239 11.2286C8.50315 9.90333 9.04363 9.22321 9.04363 9.22321C9.04122 9.22321 8.78924 10.9791 10.0199 12.0311C11.2388 13.0732 10.7489 14.8398 10.7489 14.8398C10.7489 14.8398 15.2513 13.3263 13.6592 9.09562C13.6592 9.09562 13.1865 7.71814 12.1055 6.73028C12.1055 6.73028 12.2424 8.37659 11.7805 8.41992C11.3183 8.46326 11.0081 8.17356 10.8043 6.05458C10.6394 4.33926 9.73096 3.34337 8.7772 2Z' fill='rgb(255,255,255)' fill-rule='evenodd'/%3E%3C/g%3E%3C/svg%3E") no-repeat;background-size:100% 100%;background-color:transparent;display:inline-flex;width:1em;height:1em}.i-common\:google{background:url("data:image/svg+xml;utf8,%3Csvg display='inline-flex' width='1em' height='1em' xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Cpath fill='%234285f4' d='M22.56 12.25c0-.78-.07-1.53-.2-2.25H12v4.26h5.92c-.26 1.37-1.04 2.53-2.21 3.31v2.77h3.57c2.08-1.92 3.28-4.74 3.28-8.09z'/%3E%3Cpath fill='%2334a853' d='M12 23c2.97 0 5.46-.98 7.28-2.66l-3.57-2.77c-.98.66-2.23 1.06-3.71 1.06-2.86 0-5.29-1.93-6.16-4.53H2.18v2.84C3.99 20.53 7.7 23 12 23z'/%3E%3Cpath fill='%23fbbc05' d='M5.84 14.09c-.22-.66-.35-1.36-.35-2.09s.13-1.43.35-2.09V7.07H2.18C1.43 8.55 1 10.22 1 12s.43 3.45 1.18 4.93l2.85-2.22.81-.62z'/%3E%3Cpath fill='%23ea4335' d='M12 5.38c1.62 0 3.06.56 4.21 1.64l3.15-3.15C17.45 2.09 14.97 1 12 1 7.7 1 3.99 3.47 2.18 7.07l3.66 2.84c.87-2.6 3.3-4.53 6.16-4.53z'/%3E%3C/svg%3E") no-repeat;background-size:100% 100%;background-color:transparent;display:inline-flex;width:1em;height:1em}.i-common\:lang{--un-icon:url("data:image/svg+xml;utf8,%3Csvg display='inline-flex' width='1em' height='1em' viewBox='0 0 20 20' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M4 15.1054H7L9.5 17.0001L11.5 15.1054H15C16.1046 15.1054 17 14.2099 17 13.1054V5.05273C17 3.94816 16.1046 3.05273 15 3.05273H4C2.89543 3.05273 2 3.94816 2 5.05273V13.1054C2 14.2099 2.89543 15.1054 4 15.1054Z' stroke='currentColor' stroke-width='1.5'/%3E%3Cpath d='M6 13L8.8 6H10.2L13 13' stroke='currentColor' stroke-width='1.5'/%3E%3Cpath d='M7 10H12' stroke='currentColor' stroke-width='1.5'/%3E%3C/svg%3E");-webkit-mask:var(--un-icon) no-repeat;mask:var(--un-icon) no-repeat;-webkit-mask-size:100% 100%;mask-size:100% 100%;background-color:currentColor;color:inherit;display:inline-flex;width:1em;height:1em}.i-common\:loading{background:url("data:image/svg+xml;utf8,%3Csvg display='inline-flex' width='1em' height='1em' xmlns='http://www.w3.org/2000/svg' viewBox='0 0 1024 1024' data-v-ea893728=''%3E%3Cpath d='M512 64a32 32 0 0 1 32 32v192a32 32 0 0 1-64 0V96a32 32 0 0 1 32-32m0 640a32 32 0 0 1 32 32v192a32 32 0 1 1-64 0V736a32 32 0 0 1 32-32m448-192a32 32 0 0 1-32 32H736a32 32 0 1 1 0-64h192a32 32 0 0 1 32 32m-640 0a32 32 0 0 1-32 32H96a32 32 0 0 1 0-64h192a32 32 0 0 1 32 32M195.2 195.2a32 32 0 0 1 45.248 0L376.32 331.008a32 32 0 0 1-45.248 45.248L195.2 240.448a32 32 0 0 1 0-45.248zm452.544 452.544a32 32 0 0 1 45.248 0L828.8 783.552a32 32 0 0 1-45.248 45.248L647.744 692.992a32 32 0 0 1 0-45.248zM828.8 195.264a32 32 0 0 1 0 45.184L692.992 376.32a32 32 0 0 1-45.248-45.248l135.808-135.808a32 32 0 0 1 45.248 0m-452.544 452.48a32 32 0 0 1 0 45.248L240.448 828.8a32 32 0 0 1-45.248-45.248l135.808-135.808a32 32 0 0 1 45.248 0z'%3E%3C/path%3E%3C/svg%3E") no-repeat;background-size:100% 100%;background-color:transparent;display:inline-flex;width:1em;height:1em}.i-common\:pro{--un-icon:url("data:image/svg+xml;utf8,%3Csvg display='inline-flex' width='1em' height='1em' viewBox='0 0 16 17' xmlns='http://www.w3.org/2000/svg'%3E%3Cg clip-path='url(%23clip0_1_3186)'%3E%3Cpath d='M12.8 0.5H3.2L0 6.3L8 16.7L16 6.3L12.8 0.5ZM8 12.276L3.592 6.1H5.552L8 9.524L10.448 6.1H12.416L8 12.276Z' fill='currentColor'/%3E%3C/g%3E%3Cdefs%3E%3CclipPath id='clip0_1_3186'%3E%3Crect width='16' height='16' fill='white' transform='translate(0 0.5)'/%3E%3C/clipPath%3E%3C/defs%3E%3C/svg%3E");-webkit-mask:var(--un-icon) no-repeat;mask:var(--un-icon) no-repeat;-webkit-mask-size:100% 100%;mask-size:100% 100%;background-color:currentColor;color:inherit;display:inline-flex;width:1em;height:1em}.i-common\:refresh,[i-common\:refresh=""]{--un-icon:url("data:image/svg+xml;utf8,%3Csvg display='inline-flex' width='1em' height='1em' viewBox='0 0 1024 1024' version='1.1' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M896.128 378.752a29.888 29.888 0 0 1-27.52-18.304 388.224 388.224 0 0 0-715.392 0 29.888 29.888 0 1 1-54.976-23.296 448 448 0 0 1 825.6 0 29.888 29.888 0 0 1-27.52 41.6z' fill='currentColor'/%3E%3Cpath d='M510.912 959.168a448.576 448.576 0 0 1-412.672-274.176 29.888 29.888 0 1 1 54.976-23.296 388.224 388.224 0 0 0 715.392 0 29.888 29.888 0 1 1 54.976 23.296 447.424 447.424 0 0 1-412.736 274.176z' fill='currentColor'/%3E%3Cpath d='M92.992 393.472a29.888 29.888 0 0 1-29.952-29.952V180.224a29.952 29.952 0 0 1 59.84 0V363.52a29.888 29.888 0 0 1-29.888 29.952z' fill='currentColor'/%3E%3Cpath d='M276.352 393.472H93.056a29.952 29.952 0 0 1 0-59.84h183.296a29.952 29.952 0 0 1 0 59.84z' fill='currentColor'/%3E%3Cpath d='M929.216 864.768a29.952 29.952 0 0 1-29.952-29.952V651.52a29.952 29.952 0 1 1 59.84 0v183.296a29.952 29.952 0 0 1-29.888 29.952z' fill='currentColor'/%3E%3Cpath d='M929.216 681.6h-183.296a29.952 29.952 0 1 1 0-59.84h183.296a29.952 29.952 0 0 1 0 59.84z' fill='currentColor'/%3E%3C/svg%3E");-webkit-mask:var(--un-icon) no-repeat;mask:var(--un-icon) no-repeat;-webkit-mask-size:100% 100%;mask-size:100% 100%;background-color:currentColor;color:inherit;display:inline-flex;width:1em;height:1em}.i-dashicons\:admin-site-alt3{--un-icon:url("data:image/svg+xml;utf8,%3Csvg viewBox='0 0 20 20' display='inline-flex' width='1em' height='1em' xmlns='http://www.w3.org/2000/svg' %3E%3Cpath fill='currentColor' d='M9 0a9 9 0 1 0 0 18A9 9 0 0 0 9 0M1.11 9.68h2.51c.04.91.167 1.814.38 2.7H1.84a7.9 7.9 0 0 1-.73-2.7m8.57-5.4V1.19a4.13 4.13 0 0 1 2.22 2q.308.521.54 1.08zm3.22 1.35c.232.883.37 1.788.41 2.7H9.68v-2.7zM8.32 1.19v3.09H5.56A8.5 8.5 0 0 1 6.1 3.2a4.13 4.13 0 0 1 2.22-2.01m0 4.44v2.7H4.7c.04-.912.178-1.817.41-2.7zm-4.7 2.69H1.11a7.9 7.9 0 0 1 .73-2.7H4a14 14 0 0 0-.38 2.7M4.7 9.68h3.62v2.7H5.11a13 13 0 0 1-.41-2.7m3.63 4v3.09a4.13 4.13 0 0 1-2.22-2a8.5 8.5 0 0 1-.54-1.08zm1.35 3.09v-3.04h2.76a8.5 8.5 0 0 1-.54 1.08a4.13 4.13 0 0 1-2.22 2zm0-4.44v-2.7h3.62a13 13 0 0 1-.41 2.7zm4.71-2.7h2.51a7.9 7.9 0 0 1-.73 2.7H14c.21-.87.337-1.757.38-2.65zm0-1.35A14 14 0 0 0 14 5.63h2.16c.403.85.65 1.764.73 2.7zm1-4H13.6a8.9 8.9 0 0 0-1.39-2.52a8 8 0 0 1 3.14 2.52zm-9.6-2.52A8.9 8.9 0 0 0 4.4 4.28H2.65a8 8 0 0 1 3.14-2.52m-3.15 12H4.4a8.9 8.9 0 0 0 1.39 2.52a8 8 0 0 1-3.14-2.55zm9.56 2.52a8.9 8.9 0 0 0 1.39-2.52h1.76a8 8 0 0 1-3.14 2.48z'/%3E%3C/svg%3E");-webkit-mask:var(--un-icon) no-repeat;mask:var(--un-icon) no-repeat;-webkit-mask-size:100% 100%;mask-size:100% 100%;background-color:currentColor;color:inherit;display:inline-flex;width:1em;height:1em}.i-domain\:setting{--un-icon:url("data:image/svg+xml;utf8,%3Csvg display='inline-flex' width='1em' height='1em' viewBox='0 0 18 18' xmlns='http://www.w3.org/2000/svg' xmlns:xlink='http://www.w3.org/1999/xlink' fill='currentColor'%3E%3Crect id='资源管理' x='0.000000' y='0.000000' fill='currentColor' fill-opacity='0'/%3E%3Cpath id='形状结合' d='M2.57806 1.40698L13.2342 1.40698C13.8256 1.40698 14.305 1.88637 14.305 2.47772L14.305 4.90995C14.305 5.25242 14.1442 5.55733 13.894 5.75333C13.4005 5.55625 12.8918 5.68477 12.5228 5.98068L10.9975 5.98068C10.6393 5.68927 10.1742 5.57036 9.67089 5.73813L9.36093 5.87039C9.2799 5.90655 9.20049 5.9433 9.12263 5.98068L2.57806 5.98068C1.98671 5.98068 1.50732 5.5013 1.50732 4.90995L1.50732 2.47772C1.50732 1.88637 1.98671 1.40698 2.57806 1.40698ZM8.10536 6.56504L2.57806 6.56504C1.98671 6.56504 1.50732 7.04442 1.50732 7.63577L1.50732 10.068C1.50732 10.6594 1.98671 11.1387 2.57806 11.1387L5.3785 11.1387C5.39874 10.9888 5.42464 10.8357 5.45625 10.6777L5.49351 10.5374C5.53804 10.4038 5.59925 10.279 5.67447 10.1653L2.57806 10.1653C2.5243 10.1653 2.48072 10.1218 2.48072 10.068L2.48072 7.63577C2.48072 7.58201 2.5243 7.53843 2.57806 7.53843L7.15438 7.53843C7.23545 7.32313 7.37166 7.12735 7.5631 6.97539L7.62866 6.92808L7.78482 6.80023C7.8886 6.71909 7.99532 6.64078 8.10536 6.56504ZM5.32766 11.7231L2.57806 11.7231C1.98671 11.7231 1.50732 12.2025 1.50732 12.7938L1.50732 15.2261C1.50732 15.8174 1.98671 16.2968 2.57806 16.2968L7.1537 16.2968C7.03764 15.9974 7.02133 15.657 7.15365 15.3234L2.57806 15.3234C2.5243 15.3234 2.48072 15.2798 2.48072 15.2261L2.48072 12.7938C2.48072 12.7401 2.5243 12.6965 2.57806 12.6965L5.37289 12.6965C5.35414 12.5489 5.34066 12.3997 5.33263 12.2516L5.32382 11.931C5.32382 11.8618 5.3251 11.7925 5.32766 11.7231ZM13.2342 2.38038L2.57806 2.38038C2.5243 2.38038 2.48072 2.42396 2.48072 2.47772L2.48072 4.90995C2.48072 4.96371 2.5243 5.00729 2.57806 5.00729L13.2342 5.00729C13.288 5.00729 13.3316 4.96371 13.3316 4.90995L13.3316 2.47772C13.3316 2.42396 13.288 2.38038 13.2342 2.38038Z' fill='rgb(251,252,251)' fill-rule='evenodd'/%3E%3Cpath id='路径' d='M10.2593 16.5606C9.67847 16.3556 9.13184 16.0481 8.65354 15.604C8.58521 15.5356 8.55104 15.4331 8.58521 15.3648C8.75603 14.8523 8.6877 14.3057 8.41438 13.8616C8.14107 13.3833 7.7311 13.0758 7.21863 12.9733C7.11613 12.9391 7.04781 12.8708 7.04781 12.7683C6.97948 12.4608 6.94531 12.1192 6.94531 11.8117C6.94531 11.5042 6.97948 11.1967 7.04781 10.8551C7.08197 10.7526 7.1503 10.6843 7.21863 10.6501C7.7311 10.5135 8.17523 10.206 8.41438 9.76184C8.6877 9.28353 8.72187 8.77106 8.58521 8.2586C8.55104 8.15611 8.58521 8.05361 8.65354 8.01945C9.13184 7.60947 9.67847 7.30199 10.2593 7.06284C10.3618 7.02868 10.4301 7.06284 10.4984 7.13117C10.8742 7.50698 11.3525 7.74613 11.865 7.74613C12.3775 7.74613 12.8899 7.54114 13.2316 7.13117C13.2999 7.06284 13.4024 7.02868 13.4707 7.06284C14.0515 7.26783 14.5982 7.57531 15.0765 8.01945C15.1448 8.08778 15.179 8.19027 15.1448 8.2586C14.974 8.77106 15.0423 9.3177 15.3156 9.76184C15.5889 10.2401 15.9989 10.5476 16.5114 10.6501C16.6139 10.6843 16.6822 10.7526 16.6822 10.8551C16.7505 11.1626 16.7847 11.5042 16.7847 11.8117C16.7847 12.1192 16.7505 12.4267 16.6822 12.7683C16.648 12.8708 16.5797 12.9391 16.5114 12.9733C15.9989 13.11 15.5548 13.4174 15.3156 13.8616C15.0423 14.3399 15.0081 14.8523 15.1448 15.3648C15.179 15.4673 15.1448 15.5698 15.0765 15.604C14.5982 16.0139 14.0515 16.3214 13.4707 16.5606C13.3682 16.5947 13.2999 16.5606 13.2316 16.4922C12.8558 16.1164 12.3775 15.8773 11.865 15.8773C11.3525 15.8773 10.8401 16.0823 10.4984 16.4922C10.4643 16.5264 10.3959 16.5606 10.3276 16.5606C10.2934 16.5606 10.2593 16.5606 10.2593 16.5606Z' fill='rgb(255,255,255)' fill-opacity='0' fill-rule='evenodd'/%3E%3Cpath id='路径' d='M8.65354 15.604C8.58521 15.5356 8.55104 15.4331 8.58521 15.3648C8.75603 14.8523 8.6877 14.3057 8.41438 13.8616C8.14107 13.3833 7.7311 13.0758 7.21863 12.9733C7.11613 12.9391 7.04781 12.8708 7.04781 12.7683C6.97948 12.4608 6.94531 12.1192 6.94531 11.8117C6.94531 11.5042 6.97948 11.1967 7.04781 10.8551C7.08197 10.7526 7.1503 10.6843 7.21863 10.6501C7.7311 10.5135 8.17523 10.206 8.41438 9.76184C8.6877 9.28353 8.72187 8.77106 8.58521 8.2586C8.55104 8.15611 8.58521 8.05361 8.65354 8.01945C9.13184 7.60947 9.67847 7.30199 10.2593 7.06284C10.3618 7.02868 10.4301 7.06284 10.4984 7.13117C10.8742 7.50698 11.3525 7.74613 11.865 7.74613C12.3775 7.74613 12.8899 7.54114 13.2316 7.13117C13.2999 7.06284 13.4024 7.02868 13.4707 7.06284C14.0515 7.26783 14.5982 7.57531 15.0765 8.01945C15.1448 8.08778 15.179 8.19027 15.1448 8.2586C14.974 8.77106 15.0423 9.3177 15.3156 9.76184C15.5889 10.2401 15.9989 10.5476 16.5114 10.6501C16.6139 10.6843 16.6822 10.7526 16.6822 10.8551C16.7505 11.1626 16.7847 11.5042 16.7847 11.8117C16.7847 12.1192 16.7505 12.4267 16.6822 12.7683C16.648 12.8708 16.5797 12.9391 16.5114 12.9733C15.9989 13.11 15.5548 13.4174 15.3156 13.8616C15.0423 14.3399 15.0081 14.8523 15.1448 15.3648C15.179 15.4673 15.1448 15.5698 15.0765 15.604C14.5982 16.0139 14.0515 16.3214 13.4707 16.5606C13.3682 16.5947 13.2999 16.5606 13.2316 16.4922C12.8558 16.1164 12.3775 15.8773 11.865 15.8773C11.3525 15.8773 10.8401 16.0823 10.4984 16.4922C10.4643 16.5264 10.3959 16.5606 10.3276 16.5606C10.2934 16.5606 10.2593 16.5606 10.2593 16.5606C9.67847 16.3556 9.13184 16.0481 8.65354 15.604Z' fill-rule='evenodd' fill='rgb(255,255,255)' fill-opacity='0' stroke='rgb(251,252,251)' stroke-width='1.10000002'/%3E%3Cpath id='路径' d='M11.865 13.451C12.7694 13.451 13.476 12.7161 13.476 11.8117C13.476 10.9072 12.7412 10.1724 11.865 10.1724C10.9605 10.1724 10.2539 10.9072 10.2539 11.8117C10.2539 12.7161 10.9888 13.451 11.865 13.451L11.865 13.451Z' fill='rgb(0,0,0)' fill-opacity='0' fill-rule='evenodd'/%3E%3Cpath id='路径' d='M13.476 11.8117C13.476 10.9072 12.7412 10.1724 11.865 10.1724C10.9605 10.1724 10.2539 10.9072 10.2539 11.8117C10.2539 12.7161 10.9888 13.451 11.865 13.451L11.865 13.451C12.7694 13.451 13.476 12.7161 13.476 11.8117Z' fill-rule='evenodd' stroke='rgb(251,252,251)' stroke-width='1.10000002'/%3E%3C/svg%3E");-webkit-mask:var(--un-icon) no-repeat;mask:var(--un-icon) no-repeat;-webkit-mask-size:100% 100%;mask-size:100% 100%;background-color:currentColor;color:inherit;display:inline-flex;width:1em;height:1em}.i-fa-solid\:external-link-alt{--un-icon:url("data:image/svg+xml;utf8,%3Csvg viewBox='0 0 512 512' display='inline-flex' width='1em' height='1em' xmlns='http://www.w3.org/2000/svg' %3E%3Cpath fill='currentColor' d='M432 320h-32a16 16 0 0 0-16 16v112H64V128h144a16 16 0 0 0 16-16V80a16 16 0 0 0-16-16H48a48 48 0 0 0-48 48v352a48 48 0 0 0 48 48h352a48 48 0 0 0 48-48V336a16 16 0 0 0-16-16M488 0H360c-21.37 0-32.05 25.91-17 41l35.73 35.73L135 320.37a24 24 0 0 0 0 34L157.67 377a24 24 0 0 0 34 0l243.61-243.68L471 169c15 15 41 4.5 41-17V24a24 24 0 0 0-24-24'/%3E%3C/svg%3E");-webkit-mask:var(--un-icon) no-repeat;mask:var(--un-icon) no-repeat;-webkit-mask-size:100% 100%;mask-size:100% 100%;background-color:currentColor;color:inherit;display:inline-flex;width:1em;height:1em}.i-fa\:angle-down{--un-icon:url("data:image/svg+xml;utf8,%3Csvg viewBox='0 0 1024 1280' display='inline-flex' width='0.8em' height='1em' xmlns='http://www.w3.org/2000/svg' %3E%3Cpath fill='currentColor' d='M1011 480q0 13-10 23L535 969q-10 10-23 10t-23-10L23 503q-10-10-10-23t10-23l50-50q10-10 23-10t23 10l393 393l393-393q10-10 23-10t23 10l50 50q10 10 10 23'/%3E%3C/svg%3E");-webkit-mask:var(--un-icon) no-repeat;mask:var(--un-icon) no-repeat;-webkit-mask-size:100% 100%;mask-size:100% 100%;background-color:currentColor;color:inherit;display:inline-flex;width:.8em;height:1em}.i-fa\:folder-open-o{--un-icon:url("data:image/svg+xml;utf8,%3Csvg viewBox='0 0 1920 1408' display='inline-flex' width='1.37em' height='1em' xmlns='http://www.w3.org/2000/svg' %3E%3Cpath fill='currentColor' d='M1781 803q0-35-53-35H640q-40 0-85.5 21.5T483 842l-294 363q-18 24-18 40q0 35 53 35h1088q40 0 86-22t71-53l294-363q18-22 18-39M640 640h768V480q0-40-28-68t-68-28H736q-40 0-68-28t-28-68v-64q0-40-28-68t-68-28H224q-40 0-68 28t-28 68v853l256-315q44-53 116-87.5T640 640m1269 163q0 62-46 120l-295 363q-43 53-116 87.5t-140 34.5H224q-92 0-158-66T0 1184V224q0-92 66-158T224 0h320q92 0 158 66t66 158v32h544q92 0 158 66t66 158v160h192q54 0 99 24.5t67 70.5q15 32 15 68'/%3E%3C/svg%3E");-webkit-mask:var(--un-icon) no-repeat;mask:var(--un-icon) no-repeat;-webkit-mask-size:100% 100%;mask-size:100% 100%;background-color:currentColor;color:inherit;display:inline-flex;width:1.37em;height:1em}.i-fa\:lightbulb-o{--un-icon:url("data:image/svg+xml;utf8,%3Csvg viewBox='0 0 1024 1536' display='inline-flex' width='0.67em' height='1em' xmlns='http://www.w3.org/2000/svg' %3E%3Cpath fill='currentColor' d='M736 448q0 13-9.5 22.5T704 480t-22.5-9.5T672 448q0-46-54-71t-106-25q-13 0-22.5-9.5T480 320t9.5-22.5T512 288q50 0 99.5 16t87 54t37.5 90m160 0q0-72-34.5-134t-90-101.5t-123-62T512 128t-136.5 22.5t-123 62t-90 101.5T128 448q0 101 68 180q10 11 30.5 33t30.5 33q128 153 141 298h228q13-145 141-298q10-11 30.5-33t30.5-33q68-79 68-180m128 0q0 155-103 268q-45 49-74.5 87T787 898.5T753 1006q47 28 47 82q0 37-25 64q25 27 25 64q0 52-45 81q13 23 13 47q0 46-31.5 71t-77.5 25q-20 44-60 70t-87 26t-87-26t-60-70q-46 0-77.5-25t-31.5-71q0-24 13-47q-45-29-45-81q0-37 25-64q-25-27-25-64q0-54 47-82q-4-50-34-107.5T177.5 803T103 716Q0 603 0 448q0-99 44.5-184.5t117-142t164-89T512 0t186.5 32.5t164 89t117 142T1024 448'/%3E%3C/svg%3E");-webkit-mask:var(--un-icon) no-repeat;mask:var(--un-icon) no-repeat;-webkit-mask-size:100% 100%;mask-size:100% 100%;background-color:currentColor;color:inherit;display:inline-flex;width:.67em;height:1em}.i-famicons\:ellipsis-vertical{--un-icon:url("data:image/svg+xml;utf8,%3Csvg viewBox='0 0 512 512' display='inline-flex' width='1em' height='1em' xmlns='http://www.w3.org/2000/svg' %3E%3Ccircle cx='256' cy='256' r='48' fill='currentColor'/%3E%3Ccircle cx='256' cy='416' r='48' fill='currentColor'/%3E%3Ccircle cx='256' cy='96' r='48' fill='currentColor'/%3E%3C/svg%3E");-webkit-mask:var(--un-icon) no-repeat;mask:var(--un-icon) no-repeat;-webkit-mask-size:100% 100%;mask-size:100% 100%;background-color:currentColor;color:inherit;display:inline-flex;width:1em;height:1em}.i-famicons\:pause-circle-outline{--un-icon:url("data:image/svg+xml;utf8,%3Csvg viewBox='0 0 512 512' display='inline-flex' width='1em' height='1em' xmlns='http://www.w3.org/2000/svg' %3E%3Cpath fill='none' stroke='currentColor' stroke-miterlimit='10' stroke-width='32' d='M448 256c0-106-86-192-192-192S64 150 64 256s86 192 192 192s192-86 192-192Z'/%3E%3Cpath fill='none' stroke='currentColor' stroke-linecap='round' stroke-miterlimit='10' stroke-width='32' d='M208 192v128m96-128v128'/%3E%3C/svg%3E");-webkit-mask:var(--un-icon) no-repeat;mask:var(--un-icon) no-repeat;-webkit-mask-size:100% 100%;mask-size:100% 100%;background-color:currentColor;color:inherit;display:inline-flex;width:1em;height:1em}.i-famicons\:play-circle-outline{--un-icon:url("data:image/svg+xml;utf8,%3Csvg viewBox='0 0 512 512' display='inline-flex' width='1em' height='1em' xmlns='http://www.w3.org/2000/svg' %3E%3Cpath fill='none' stroke='currentColor' stroke-miterlimit='10' stroke-width='32' d='M448 256c0-106-86-192-192-192S64 150 64 256s86 192 192 192s192-86 192-192Z'/%3E%3Cpath fill='currentColor' d='m216.32 334.44l114.45-69.14a10.89 10.89 0 0 0 0-18.6l-114.45-69.14a10.78 10.78 0 0 0-16.32 9.31v138.26a10.78 10.78 0 0 0 16.32 9.31'/%3E%3C/svg%3E");-webkit-mask:var(--un-icon) no-repeat;mask:var(--un-icon) no-repeat;-webkit-mask-size:100% 100%;mask-size:100% 100%;background-color:currentColor;color:inherit;display:inline-flex;width:1em;height:1em}.i-famicons\:settings-outline,[i-famicons\:settings-outline=""]{--un-icon:url("data:image/svg+xml;utf8,%3Csvg viewBox='0 0 512 512' display='inline-flex' width='1em' height='1em' xmlns='http://www.w3.org/2000/svg' %3E%3Cpath fill='none' stroke='currentColor' stroke-linecap='round' stroke-linejoin='round' stroke-width='32' d='M262.29 192.31a64 64 0 1 0 57.4 57.4a64.13 64.13 0 0 0-57.4-57.4M416.39 256a154 154 0 0 1-1.53 20.79l45.21 35.46a10.81 10.81 0 0 1 2.45 13.75l-42.77 74a10.81 10.81 0 0 1-13.14 4.59l-44.9-18.08a16.11 16.11 0 0 0-15.17 1.75A164.5 164.5 0 0 1 325 400.8a15.94 15.94 0 0 0-8.82 12.14l-6.73 47.89a11.08 11.08 0 0 1-10.68 9.17h-85.54a11.11 11.11 0 0 1-10.69-8.87l-6.72-47.82a16.07 16.07 0 0 0-9-12.22a155 155 0 0 1-21.46-12.57a16 16 0 0 0-15.11-1.71l-44.89 18.07a10.81 10.81 0 0 1-13.14-4.58l-42.77-74a10.8 10.8 0 0 1 2.45-13.75l38.21-30a16.05 16.05 0 0 0 6-14.08c-.36-4.17-.58-8.33-.58-12.5s.21-8.27.58-12.35a16 16 0 0 0-6.07-13.94l-38.19-30A10.81 10.81 0 0 1 49.48 186l42.77-74a10.81 10.81 0 0 1 13.14-4.59l44.9 18.08a16.11 16.11 0 0 0 15.17-1.75A164.5 164.5 0 0 1 187 111.2a15.94 15.94 0 0 0 8.82-12.14l6.73-47.89A11.08 11.08 0 0 1 213.23 42h85.54a11.11 11.11 0 0 1 10.69 8.87l6.72 47.82a16.07 16.07 0 0 0 9 12.22a155 155 0 0 1 21.46 12.57a16 16 0 0 0 15.11 1.71l44.89-18.07a10.81 10.81 0 0 1 13.14 4.58l42.77 74a10.8 10.8 0 0 1-2.45 13.75l-38.21 30a16.05 16.05 0 0 0-6.05 14.08c.33 4.14.55 8.3.55 12.47'/%3E%3C/svg%3E");-webkit-mask:var(--un-icon) no-repeat;mask:var(--un-icon) no-repeat;-webkit-mask-size:100% 100%;mask-size:100% 100%;background-color:currentColor;color:inherit;display:inline-flex;width:1em;height:1em}.i-fontisto\:close{--un-icon:url("data:image/svg+xml;utf8,%3Csvg viewBox='0 0 24 24' display='inline-flex' width='1em' height='1em' xmlns='http://www.w3.org/2000/svg' %3E%3Cpath fill='currentColor' d='M20.48 3.512a11.97 11.97 0 0 0-8.486-3.514C5.366-.002-.007 5.371-.007 11.999c0 3.314 1.344 6.315 3.516 8.487A11.97 11.97 0 0 0 11.995 24c6.628 0 12.001-5.373 12.001-12.001c0-3.314-1.344-6.315-3.516-8.487m-1.542 15.427a9.8 9.8 0 0 1-6.943 2.876c-5.423 0-9.819-4.396-9.819-9.819a9.8 9.8 0 0 1 2.876-6.943a9.8 9.8 0 0 1 6.942-2.876c5.422 0 9.818 4.396 9.818 9.818a9.8 9.8 0 0 1-2.876 6.942z'/%3E%3Cpath fill='currentColor' d='m13.537 12l3.855-3.855a1.091 1.091 0 0 0-1.542-1.541l.001-.001l-3.855 3.855l-3.855-3.855A1.091 1.091 0 0 0 6.6 8.145l-.001-.001l3.855 3.855l-3.855 3.855a1.091 1.091 0 1 0 1.541 1.542l.001-.001l3.855-3.855l3.855 3.855a1.091 1.091 0 1 0 1.542-1.541l-.001-.001z'/%3E%3C/svg%3E");-webkit-mask:var(--un-icon) no-repeat;mask:var(--un-icon) no-repeat;-webkit-mask-size:100% 100%;mask-size:100% 100%;background-color:currentColor;color:inherit;display:inline-flex;width:1em;height:1em}.i-healthicons\:health-vulnerability-through-social-determinants-outline-24px{--un-icon:url("data:image/svg+xml;utf8,%3Csvg viewBox='0 0 24 24' display='inline-flex' width='1em' height='1em' xmlns='http://www.w3.org/2000/svg' %3E%3Cg fill='currentColor'%3E%3Cpath d='M3.017 7.6A9.96 9.96 0 0 0 2 12c0 5.523 4.477 10 10 10q1.022-.002 1.985-.197a.3.3 0 0 1-.005-.053v-.99a.25.25 0 0 0-.074-.177l-.677-.677Q12.628 20 12 20A8 8 0 0 1 4.582 9H3.354a.25.25 0 0 1-.25-.25v-.958a.25.25 0 0 0-.073-.177zm5.988-3.02l-1.51-1.51A9.96 9.96 0 0 1 12 2c5.523 0 10 4.477 10 10a9.95 9.95 0 0 1-1.433 5.16L19.1 15.693A8 8 0 0 0 9.005 4.58M6 3l3 3l-.79.79l-.35-.35v1.443H6.745v-.93a.744.744 0 1 0-1.488 0v.93H4.139V6.44l-.35.35L3 6z'/%3E%3Cpath d='M11 16v-3H8v-2h3V8h2v3h3v2h-3v3zm6.4-.6l3.5 3.529l-.82.826l-.362-.366v1.51h-1.545v-.973a.776.776 0 0 0-.773-.779a.776.776 0 0 0-.773.78v.973h-1.545v-1.51l-.363.365l-.82-.826z'/%3E%3C/g%3E%3C/svg%3E");-webkit-mask:var(--un-icon) no-repeat;mask:var(--un-icon) no-repeat;-webkit-mask-size:100% 100%;mask-size:100% 100%;background-color:currentColor;color:inherit;display:inline-flex;width:1em;height:1em}.i-home\:check{--un-icon:url("data:image/svg+xml;utf8,%3Csvg display='inline-flex' width='1em' height='1em' viewBox='0 0 14 14' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M1 6.5L5.5 11L12.5 4' fill='none' stroke='currentColor' stroke-width='2'/%3E%3C/svg%3E");-webkit-mask:var(--un-icon) no-repeat;mask:var(--un-icon) no-repeat;-webkit-mask-size:100% 100%;mask-size:100% 100%;background-color:currentColor;color:inherit;display:inline-flex;width:1em;height:1em}.i-home\:fix{--un-icon:url("data:image/svg+xml;utf8,%3Csvg display='inline-flex' width='1em' height='1em' viewBox='0 0 20 20' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M18 7.48571C18 10.5154 15.544 12.9714 12.5143 12.9714C11.5878 12.9714 10.7149 12.7417 9.94953 12.3362L4.28571 18L2 15.7143L7.66382 10.0505C7.25829 9.28507 7.02857 8.41221 7.02857 7.48571C7.02857 4.45604 9.48462 2 12.5143 2C13.4408 2 14.3136 2.22969 15.079 2.63524L11.6 6.11429L13.8857 8.4L17.3648 4.92096C17.7703 5.68635 18 6.55922 18 7.48571Z' stroke='currentColor' stroke-width='1.5' stroke-linecap='square'/%3E%3C/svg%3E");-webkit-mask:var(--un-icon) no-repeat;mask:var(--un-icon) no-repeat;-webkit-mask-size:100% 100%;mask-size:100% 100%;background-color:currentColor;color:inherit;display:inline-flex;width:1em;height:1em}.i-home\:restart{--un-icon:url("data:image/svg+xml;utf8,%3Csvg display='inline-flex' width='1em' height='1em' viewBox='0 0 20 20' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M10 9V2' stroke='currentColor' stroke-width='1.5' stroke-linecap='square' stroke-linejoin='round'/%3E%3Cpath d='M5.61905 4C3.77138 5.35135 2.57129 7.53552 2.57129 9.99998C2.57129 14.1027 5.89717 17.4286 9.99986 17.4286C14.1025 17.4286 17.4284 14.1027 17.4284 9.99998C17.4284 7.32457 16.0141 4.97949 13.8923 3.67164' stroke='currentColor' stroke-width='1.5' stroke-linecap='square' stroke-linejoin='round'/%3E%3C/svg%3E");-webkit-mask:var(--un-icon) no-repeat;mask:var(--un-icon) no-repeat;-webkit-mask-size:100% 100%;mask-size:100% 100%;background-color:currentColor;color:inherit;display:inline-flex;width:1em;height:1em}.i-home\:update{--un-icon:url("data:image/svg+xml;utf8,%3Csvg display='inline-flex' width='1em' height='1em' viewBox='0 0 20 20' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cg clip-path='url(%23clip0_3_230)'%3E%3Cpath d='M4.13753 13.7501C4.87923 14.8601 5.93344 15.7253 7.16684 16.2362C8.40024 16.7471 9.75744 16.8808 11.0668 16.6203C12.3762 16.3599 13.5789 15.717 14.5229 14.773C15.4669 13.829 16.1098 12.6262 16.3703 11.3169C16.6307 10.0075 16.497 8.65029 15.9861 7.41689C15.4752 6.18349 14.6101 5.12928 13.5001 4.38758C12.39 3.64588 11.085 3.25 9.74995 3.25C7.86292 3.2571 6.05168 3.99342 4.69495 5.305L3.44995 6.4' stroke='currentColor' stroke-width='1.5' stroke-linecap='square'/%3E%3Cpath d='M3 3.25V7H6.75' stroke='currentColor' stroke-width='1.5' stroke-linecap='square'/%3E%3C/g%3E%3Cdefs%3E%3CclipPath id='clip0_3_230'%3E%3Crect width='20' height='20' fill='white'/%3E%3C/clipPath%3E%3C/defs%3E%3C/svg%3E");-webkit-mask:var(--un-icon) no-repeat;mask:var(--un-icon) no-repeat;-webkit-mask-size:100% 100%;mask-size:100% 100%;background-color:currentColor;color:inherit;display:inline-flex;width:1em;height:1em}.i-home\:user{background:url("data:image/svg+xml;utf8,%3Csvg display='inline-flex' width='1em' height='1em' id='_图层_1' data-name='图层_1' xmlns='http://www.w3.org/2000/svg' version='1.1' viewBox='0 0 1024 1024'%3E%3C!-- Generator: Adobe Illustrator 29.0.1, SVG Export Plug-In . SVG Version: 2.1.0 Build 192) --%3E%3Cdefs%3E%3Cstyle%3E.st0 {fill: %233f3f3f;}.st1 {fill: %23ecb485;}.st2 {opacity: .1;}.st2, .st3 {fill: %2322b573;}.st4 {fill: %23f6caa9;}%3C/style%3E%3C/defs%3E%3Cpath class='st2' d='M64,512c0,247.42,200.58,448,448,448s448-200.58,448-448S759.42,64,512,64,64,264.58,64,512Z'/%3E%3Cpath class='st4' d='M698.6,459.8c0,113.87-82.01,206.18-183.17,206.18s-183.17-92.31-183.17-206.17,82.01-206.18,183.17-206.18,183.17,92.31,183.17,206.18'/%3E%3Cpath class='st4' d='M444.27,633.56h140.49v116.19h-140.49v-116.19ZM355.41,471.89c0,17.02-12.6,30.83-28.14,30.83s-28.14-13.8-28.14-30.83,12.6-30.83,28.14-30.83,28.14,13.8,28.14,30.83M731.35,471.51c0,17.02-12.6,30.83-28.14,30.83s-28.14-13.8-28.14-30.83,12.6-30.83,28.14-30.83,28.14,13.8,28.14,30.83'/%3E%3Cpath class='st1' d='M444.64,650.21s26.6,13.69,65.19,13.69c45.33,1.85,74.93-13.32,74.93-13.32v13.69s-49.83,26.64-72.31,26.64-68.18-31.45-68.18-31.45l.37-9.25h0ZM491.79,202.69s-123.95,12.35-125.23,93.49,95.71,96.67,131.65,105.55c35.94,8.88,134.78,20.29,192.54-73.53,0,0-15.84-36.79-24.51-62.45-3.85-6.66,6.22,11.43-28.44-10.44-34.66-21.87-81.19-57.68-146.01-52.61'/%3E%3Cpath class='st0' d='M405.01,247.01s-90.37,15.05-95.5,95.91c-5.14,80.86,9.21,102.22,9.21,102.22,0,0,20.38-.06,25.51,30.41,0,0,9.43,5.59,10.27,0,1.39-9.29-8.27-53.43,10.99-94.45,19.13-40.76,37.56-46.58,37.56-46.58l1.96-87.5ZM642.57,335.37s24.17,31.15,28.35,62.29c3.54,26.41,8.47,76.09,8.47,76.09,0,0,6.74,4.76,11.55-6.66,4.81-11.41,3.57-22.81,8.05-25.77,23.65-15.66,17.48-81.5,16.21-88.45-5.37-29.4-29.76-76.64-29.76-76.64,0,0-42.87,59.14-42.87,59.14Z'/%3E%3Cpath class='st0' d='M488.66,175.41s-128.26,5.27-129.55,90.56,100.02,109.34,135.97,118.66c35.94,9.33,134.78,21.32,192.54-77.29,0,0,14.44-44.64,5.78-71.63-3.85-7-24.07,17.99-58.72-5-34.66-22.99-81.19-60.63-146.01-55.31'/%3E%3Cpath class='st3' d='M839.09,818.12c-22.8-17.9-65.73-44.28-108.29-64.98-69.09-33.59-145.99-48.64-145.99-48.64l-.06,2.28c-5.6,5.98-32.63,32.62-69.86,32.62s-64.07-25.01-70.4-31.31l-.33-3.24s-74.05,10.15-143.14,43.74c-47.28,22.99-95,52.99-115.09,70.59,81.7,86.69,197.57,140.81,326.08,140.81s245.34-54.56,327.09-141.88h0Z'/%3E%3C/svg%3E") no-repeat;background-size:100% 100%;background-color:transparent;display:inline-flex;width:1em;height:1em}.i-hugeicons\:firewall{--un-icon:url("data:image/svg+xml;utf8,%3Csvg viewBox='0 0 24 24' display='inline-flex' width='1em' height='1em' xmlns='http://www.w3.org/2000/svg' %3E%3Cpath fill='none' stroke='currentColor' stroke-linecap='round' stroke-linejoin='round' stroke-width='1.5' d='M19 14H5c-1.414 0-2.121 0-2.56.44C2 14.878 2 15.585 2 17v2c0 1.414 0 2.121.44 2.56C2.878 22 3.585 22 5 22h14c1.414 0 2.121 0 2.56-.44c.44-.439.44-1.146.44-2.56v-2c0-1.414 0-2.121-.44-2.56C21.122 14 20.415 14 19 14M2 18h20m-10 0v-4m-5 8v-4m10 4v-4m1.841-7c-.287-1.194-1.005-2.36-2.466-3.4C12.437 4.8 12 2 12 2s-4.062 3.6-1.75 8c-2.1.32-3.078-2-3.304-3.2c-.97 1.29-1.74 2.736-1.91 4.2'/%3E%3C/svg%3E");-webkit-mask:var(--un-icon) no-repeat;mask:var(--un-icon) no-repeat;-webkit-mask-size:100% 100%;mask-size:100% 100%;background-color:currentColor;color:inherit;display:inline-flex;width:1em;height:1em}.i-ic\:baseline-pause-circle-outline{--un-icon:url("data:image/svg+xml;utf8,%3Csvg viewBox='0 0 24 24' display='inline-flex' width='1em' height='1em' xmlns='http://www.w3.org/2000/svg' %3E%3Cpath fill='currentColor' d='M9 16h2V8H9zm3-14C6.48 2 2 6.48 2 12s4.48 10 10 10s10-4.48 10-10S17.52 2 12 2m0 18c-4.41 0-8-3.59-8-8s3.59-8 8-8s8 3.59 8 8s-3.59 8-8 8m1-4h2V8h-2z'/%3E%3C/svg%3E");-webkit-mask:var(--un-icon) no-repeat;mask:var(--un-icon) no-repeat;-webkit-mask-size:100% 100%;mask-size:100% 100%;background-color:currentColor;color:inherit;display:inline-flex;width:1em;height:1em}.i-ic\:baseline-zoom-in{--un-icon:url("data:image/svg+xml;utf8,%3Csvg viewBox='0 0 24 24' display='inline-flex' width='1em' height='1em' xmlns='http://www.w3.org/2000/svg' %3E%3Cpath fill='currentColor' d='M15.5 14h-.79l-.28-.27A6.47 6.47 0 0 0 16 9.5A6.5 6.5 0 1 0 9.5 16c1.61 0 3.09-.59 4.23-1.57l.27.28v.79l5 4.99L20.49 19zm-6 0C7.01 14 5 11.99 5 9.5S7.01 5 9.5 5S14 7.01 14 9.5S11.99 14 9.5 14'/%3E%3Cpath fill='currentColor' d='M12 10h-2v2H9v-2H7V9h2V7h1v2h2z'/%3E%3C/svg%3E");-webkit-mask:var(--un-icon) no-repeat;mask:var(--un-icon) no-repeat;-webkit-mask-size:100% 100%;mask-size:100% 100%;background-color:currentColor;color:inherit;display:inline-flex;width:1em;height:1em}.i-ic\:baseline-zoom-out{--un-icon:url("data:image/svg+xml;utf8,%3Csvg viewBox='0 0 24 24' display='inline-flex' width='1em' height='1em' xmlns='http://www.w3.org/2000/svg' %3E%3Cpath fill='currentColor' d='M15.5 14h-.79l-.28-.27A6.47 6.47 0 0 0 16 9.5A6.5 6.5 0 1 0 9.5 16c1.61 0 3.09-.59 4.23-1.57l.27.28v.79l5 4.99L20.49 19zm-6 0C7.01 14 5 11.99 5 9.5S7.01 5 9.5 5S14 7.01 14 9.5S11.99 14 9.5 14M7 9h5v1H7z'/%3E%3C/svg%3E");-webkit-mask:var(--un-icon) no-repeat;mask:var(--un-icon) no-repeat;-webkit-mask-size:100% 100%;mask-size:100% 100%;background-color:currentColor;color:inherit;display:inline-flex;width:1em;height:1em}.i-ic\:outline-arrow-circle-left{--un-icon:url("data:image/svg+xml;utf8,%3Csvg viewBox='0 0 24 24' display='inline-flex' width='1em' height='1em' xmlns='http://www.w3.org/2000/svg' %3E%3Cpath fill='currentColor' d='M2 12c0 5.52 4.48 10 10 10s10-4.48 10-10S17.52 2 12 2S2 6.48 2 12m18 0c0 4.42-3.58 8-8 8s-8-3.58-8-8s3.58-8 8-8s8 3.58 8 8M8 12l4-4l1.41 1.41L11.83 11H16v2h-4.17l1.59 1.59L12 16z'/%3E%3C/svg%3E");-webkit-mask:var(--un-icon) no-repeat;mask:var(--un-icon) no-repeat;-webkit-mask-size:100% 100%;mask-size:100% 100%;background-color:currentColor;color:inherit;display:inline-flex;width:1em;height:1em}.i-ic\:outline-arrow-circle-right{--un-icon:url("data:image/svg+xml;utf8,%3Csvg viewBox='0 0 24 24' display='inline-flex' width='1em' height='1em' xmlns='http://www.w3.org/2000/svg' %3E%3Cpath fill='currentColor' d='M22 12c0-5.52-4.48-10-10-10S2 6.48 2 12s4.48 10 10 10s10-4.48 10-10M4 12c0-4.42 3.58-8 8-8s8 3.58 8 8s-3.58 8-8 8s-8-3.58-8-8m12 0l-4 4l-1.41-1.41L12.17 13H8v-2h4.17l-1.59-1.59L12 8z'/%3E%3C/svg%3E");-webkit-mask:var(--un-icon) no-repeat;mask:var(--un-icon) no-repeat;-webkit-mask-size:100% 100%;mask-size:100% 100%;background-color:currentColor;color:inherit;display:inline-flex;width:1em;height:1em}.i-iconoir\:xmark-circle{--un-icon:url("data:image/svg+xml;utf8,%3Csvg viewBox='0 0 24 24' display='inline-flex' width='1em' height='1em' xmlns='http://www.w3.org/2000/svg' %3E%3Cpath fill='none' stroke='currentColor' stroke-linecap='round' stroke-linejoin='round' stroke-width='1.5' d='M9.172 14.828L12.001 12m2.828-2.828L12.001 12m0 0L9.172 9.172M12.001 12l2.828 2.828M12 22c5.523 0 10-4.477 10-10S17.523 2 12 2S2 6.477 2 12s4.477 10 10 10'/%3E%3C/svg%3E");-webkit-mask:var(--un-icon) no-repeat;mask:var(--un-icon) no-repeat;-webkit-mask-size:100% 100%;mask-size:100% 100%;background-color:currentColor;color:inherit;display:inline-flex;width:1em;height:1em}.i-lets-icons\:lightning-ring{--un-icon:url("data:image/svg+xml;utf8,%3Csvg viewBox='0 0 24 24' display='inline-flex' width='1em' height='1em' xmlns='http://www.w3.org/2000/svg' %3E%3Cg fill='none'%3E%3Cpath fill='currentColor' d='M11.5 13.8h-1.063c-1.53 0-2.294 0-2.583-.497s.088-1.162.844-2.491l2.367-4.167c.375-.66.563-.99.749-.94c.186.049.186.428.186 1.187V9.7c0 .236 0 .354.073.427s.191.073.427.073h1.063c1.53 0 2.294 0 2.583.497s-.088 1.162-.844 2.491l-2.367 4.167c-.375.66-.563.99-.749.94C12 18.247 12 17.868 12 17.109V14.3c0-.236 0-.354-.073-.427s-.191-.073-.427-.073'/%3E%3Ccircle cx='12' cy='12' r='9' stroke='currentColor' stroke-width='2'/%3E%3C/g%3E%3C/svg%3E");-webkit-mask:var(--un-icon) no-repeat;mask:var(--un-icon) no-repeat;-webkit-mask-size:100% 100%;mask-size:100% 100%;background-color:currentColor;color:inherit;display:inline-flex;width:1em;height:1em}.i-lineicons\:protection{--un-icon:url("data:image/svg+xml;utf8,%3Csvg viewBox='0 0 64 64' display='inline-flex' width='1em' height='1em' xmlns='http://www.w3.org/2000/svg' %3E%3Cpath fill='currentColor' d='M53.6 7.5L33.3 1.9c-.8-.2-1.7-.2-2.5 0L10.4 7.5c-2.1.6-3.6 2.5-3.6 4.7V27c0 15.5 9.2 29.2 23.4 34.9c.6.2 1.2.4 1.8.4s1.2-.1 1.8-.4c14.2-5.7 23.4-19.5 23.4-35V12.2c0-2.2-1.5-4.1-3.6-4.7m-.9 19.4c0 13.4-8.3 25.8-20.5 30.8h-.3c-12.5-5-20.6-17.1-20.6-30.7V12.2c0-.1.1-.3.2-.3l20.4-5.6h.2l20.4 5.6c.1 0 .2.2.2.3z'/%3E%3Cpath fill='currentColor' d='M43.3 22.6L29.5 34.2L23.3 29c-1-.8-2.4-.7-3.2.3s-.7 2.4.3 3.2l7.6 6.4c.4.4.9.5 1.4.5s1-.2 1.4-.5L46.2 26c1-.8 1.1-2.2.3-3.2c-.8-.9-2.3-1-3.2-.2'/%3E%3C/svg%3E");-webkit-mask:var(--un-icon) no-repeat;mask:var(--un-icon) no-repeat;-webkit-mask-size:100% 100%;mask-size:100% 100%;background-color:currentColor;color:inherit;display:inline-flex;width:1em;height:1em}.i-lsicon\:clothes-outline{--un-icon:url("data:image/svg+xml;utf8,%3Csvg viewBox='0 0 16 16' display='inline-flex' width='1em' height='1em' xmlns='http://www.w3.org/2000/svg' %3E%3Cpath fill='none' stroke='currentColor' d='M5 13.5h6v-6l2 1L14 5l-2-2.5h-1.5C10.5 3 9.2 4 8 4S5.5 3 5.5 2.5H4L2 5l1 3.5l2-1z'/%3E%3C/svg%3E");-webkit-mask:var(--un-icon) no-repeat;mask:var(--un-icon) no-repeat;-webkit-mask-size:100% 100%;mask-size:100% 100%;background-color:currentColor;color:inherit;display:inline-flex;width:1em;height:1em}.i-lucide\:user-round{--un-icon:url("data:image/svg+xml;utf8,%3Csvg viewBox='0 0 24 24' display='inline-flex' width='1em' height='1em' xmlns='http://www.w3.org/2000/svg' %3E%3Cg fill='none' stroke='currentColor' stroke-linecap='round' stroke-linejoin='round' stroke-width='2'%3E%3Ccircle cx='12' cy='8' r='5'/%3E%3Cpath d='M20 21a8 8 0 0 0-16 0'/%3E%3C/g%3E%3C/svg%3E");-webkit-mask:var(--un-icon) no-repeat;mask:var(--un-icon) no-repeat;-webkit-mask-size:100% 100%;mask-size:100% 100%;background-color:currentColor;color:inherit;display:inline-flex;width:1em;height:1em}.i-majesticons\:eye-line{--un-icon:url("data:image/svg+xml;utf8,%3Csvg viewBox='0 0 24 24' display='inline-flex' width='1em' height='1em' xmlns='http://www.w3.org/2000/svg' %3E%3Cg fill='none' stroke='currentColor' stroke-linecap='round' stroke-linejoin='round' stroke-width='2'%3E%3Cpath d='M12 5c-6.307 0-9.367 5.683-9.91 6.808a.44.44 0 0 0 0 .384C2.632 13.317 5.692 19 12 19s9.367-5.683 9.91-6.808a.44.44 0 0 0 0-.384C21.368 10.683 18.308 5 12 5'/%3E%3Ccircle cx='12' cy='12' r='3'/%3E%3C/g%3E%3C/svg%3E");-webkit-mask:var(--un-icon) no-repeat;mask:var(--un-icon) no-repeat;-webkit-mask-size:100% 100%;mask-size:100% 100%;background-color:currentColor;color:inherit;display:inline-flex;width:1em;height:1em}.i-majesticons\:eye-off-line{--un-icon:url("data:image/svg+xml;utf8,%3Csvg viewBox='0 0 24 24' display='inline-flex' width='1em' height='1em' xmlns='http://www.w3.org/2000/svg' %3E%3Cpath fill='none' stroke='currentColor' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='M7 6.362A9.7 9.7 0 0 1 12 5c6.307 0 9.367 5.683 9.91 6.808c.06.123.06.261 0 .385c-.352.728-1.756 3.362-4.41 5.131M14 18.8a10 10 0 0 1-2 .2c-6.307 0-9.367-5.683-9.91-6.808a.44.44 0 0 1 0-.386c.219-.452.84-1.632 1.91-2.885m6 .843A3 3 0 0 1 14.236 14M3 3l18 18'/%3E%3C/svg%3E");-webkit-mask:var(--un-icon) no-repeat;mask:var(--un-icon) no-repeat;-webkit-mask-size:100% 100%;mask-size:100% 100%;background-color:currentColor;color:inherit;display:inline-flex;width:1em;height:1em}.i-material-symbols-light\:check-small-rounded{--un-icon:url("data:image/svg+xml;utf8,%3Csvg viewBox='0 0 24 24' display='inline-flex' width='1em' height='1em' xmlns='http://www.w3.org/2000/svg' %3E%3Cpath fill='currentColor' d='m10 14.312l6.246-6.266q.139-.14.353-.14q.215 0 .355.139t.14.354t-.14.355l-6.389 6.369q-.242.243-.565.243t-.565-.243l-2.389-2.37q-.14-.138-.14-.352t.139-.355t.354-.14t.355.14z'/%3E%3C/svg%3E");-webkit-mask:var(--un-icon) no-repeat;mask:var(--un-icon) no-repeat;-webkit-mask-size:100% 100%;mask-size:100% 100%;background-color:currentColor;color:inherit;display:inline-flex;width:1em;height:1em}.i-material-symbols-light\:close-small-rounded{--un-icon:url("data:image/svg+xml;utf8,%3Csvg viewBox='0 0 24 24' display='inline-flex' width='1em' height='1em' xmlns='http://www.w3.org/2000/svg' %3E%3Cpath fill='currentColor' d='m12 12.727l-3.244 3.252q-.161.16-.358.15t-.358-.17t-.16-.363t.16-.363L11.274 12L8.04 8.782q-.16-.161-.16-.367t.16-.368t.364-.16q.204 0 .363.16L12 11.298l3.219-3.252q.161-.16.358-.16t.358.16q.165.166.165.367t-.165.36L12.702 12l3.252 3.244q.16.161.16.358t-.16.358q-.166.165-.367.165t-.36-.165z'/%3E%3C/svg%3E");-webkit-mask:var(--un-icon) no-repeat;mask:var(--un-icon) no-repeat;-webkit-mask-size:100% 100%;mask-size:100% 100%;background-color:currentColor;color:inherit;display:inline-flex;width:1em;height:1em}.i-material-symbols-light\:drag-pan{--un-icon:url("data:image/svg+xml;utf8,%3Csvg viewBox='0 0 24 24' display='inline-flex' width='1em' height='1em' xmlns='http://www.w3.org/2000/svg' %3E%3Cpath fill='currentColor' d='M12 21.308L8.442 17.75l.714-.713L11.5 19.38V12.5H4.625l2.344 2.339l-.719.719L2.692 12l3.552-3.552l.714.714L4.619 11.5H11.5V4.62L9.156 6.963l-.714-.714L12 2.692l3.558 3.558l-.714.714L12.5 4.618V11.5h6.875l-2.344-2.339l.719-.719L21.308 12l-3.558 3.558l-.713-.714L19.38 12.5H12.5v6.875l2.339-2.344l.719.719z'/%3E%3C/svg%3E");-webkit-mask:var(--un-icon) no-repeat;mask:var(--un-icon) no-repeat;-webkit-mask-size:100% 100%;mask-size:100% 100%;background-color:currentColor;color:inherit;display:inline-flex;width:1em;height:1em}.i-material-symbols\:code-rounded{--un-icon:url("data:image/svg+xml;utf8,%3Csvg viewBox='0 0 24 24' display='inline-flex' width='1em' height='1em' xmlns='http://www.w3.org/2000/svg' %3E%3Cpath fill='currentColor' d='M4.825 12.025L8.7 15.9q.275.275.275.7t-.275.7t-.7.275t-.7-.275l-4.6-4.6q-.15-.15-.213-.325T2.426 12t.063-.375t.212-.325l4.6-4.6q.3-.3.713-.3t.712.3t.3.713t-.3.712zm14.35-.05L15.3 8.1q-.275-.275-.275-.7t.275-.7t.7-.275t.7.275l4.6 4.6q.15.15.213.325t.062.375t-.062.375t-.213.325l-4.6 4.6q-.3.3-.7.288t-.7-.313t-.3-.712t.3-.713z'/%3E%3C/svg%3E");-webkit-mask:var(--un-icon) no-repeat;mask:var(--un-icon) no-repeat;-webkit-mask-size:100% 100%;mask-size:100% 100%;background-color:currentColor;color:inherit;display:inline-flex;width:1em;height:1em}.i-material-symbols\:library-add-check-outline{--un-icon:url("data:image/svg+xml;utf8,%3Csvg viewBox='0 0 24 24' display='inline-flex' width='1em' height='1em' xmlns='http://www.w3.org/2000/svg' %3E%3Cpath fill='currentColor' d='m12.7 14.05l5.65-5.65l-1.4-1.45l-4.25 4.25l-2.15-2.1l-1.4 1.4zM8 18q-.825 0-1.412-.587T6 16V4q0-.825.588-1.412T8 2h12q.825 0 1.413.588T22 4v12q0 .825-.587 1.413T20 18zm0-2h12V4H8zm-4 6q-.825 0-1.412-.587T2 20V6h2v14h14v2zM8 4v12z'/%3E%3C/svg%3E");-webkit-mask:var(--un-icon) no-repeat;mask:var(--un-icon) no-repeat;-webkit-mask-size:100% 100%;mask-size:100% 100%;background-color:currentColor;color:inherit;display:inline-flex;width:1em;height:1em}.i-material-symbols\:network-node{--un-icon:url("data:image/svg+xml;utf8,%3Csvg viewBox='0 0 24 24' display='inline-flex' width='1em' height='1em' xmlns='http://www.w3.org/2000/svg' %3E%3Cpath fill='currentColor' d='M5.5 22q-1.45 0-2.475-1.025T2 18.5t1.025-2.475T5.5 15q.45 0 .875.112t.8.313L11 11.6V8.85q-1.1-.325-1.8-1.237T8.5 5.5q0-1.45 1.025-2.475T12 2t2.475 1.025T15.5 5.5q0 1.2-.7 2.113T13 8.85v2.75l3.85 3.825q.375-.2.788-.312T18.5 15q1.45 0 2.475 1.025T22 18.5t-1.025 2.475T18.5 22t-2.475-1.025T15 18.5q0-.45.112-.875t.313-.8L12 13.4l-3.425 3.425q.2.375.313.8T9 18.5q0 1.45-1.025 2.475T5.5 22m13-2q.625 0 1.063-.437T20 18.5t-.437-1.062T18.5 17t-1.062.438T17 18.5t.438 1.063T18.5 20M12 7q.625 0 1.063-.437T13.5 5.5t-.437-1.062T12 4t-1.062.438T10.5 5.5t.438 1.063T12 7M5.5 20q.625 0 1.063-.437T7 18.5t-.437-1.062T5.5 17t-1.062.438T4 18.5t.438 1.063T5.5 20'/%3E%3C/svg%3E");-webkit-mask:var(--un-icon) no-repeat;mask:var(--un-icon) no-repeat;-webkit-mask-size:100% 100%;mask-size:100% 100%;background-color:currentColor;color:inherit;display:inline-flex;width:1em;height:1em}.i-mdi-github{--un-icon:url("data:image/svg+xml;utf8,%3Csvg viewBox='0 0 24 24' display='inline-flex' width='1em' height='1em' xmlns='http://www.w3.org/2000/svg' %3E%3Cpath fill='currentColor' d='M12 2A10 10 0 0 0 2 12c0 4.42 2.87 8.17 6.84 9.5c.5.08.66-.23.66-.5v-1.69c-2.77.6-3.36-1.34-3.36-1.34c-.46-1.16-1.11-1.47-1.11-1.47c-.91-.62.07-.6.07-.6c1 .07 1.53 1.03 1.53 1.03c.87 1.52 2.34 1.07 2.91.83c.09-.65.35-1.09.63-1.34c-2.22-.25-4.55-1.11-4.55-4.92c0-1.11.38-2 1.03-2.71c-.1-.25-.45-1.29.1-2.64c0 0 .84-.27 2.75 1.02c.79-.22 1.65-.33 2.5-.33s1.71.11 2.5.33c1.91-1.29 2.75-1.02 2.75-1.02c.55 1.35.2 2.39.1 2.64c.65.71 1.03 1.6 1.03 2.71c0 3.82-2.34 4.66-4.57 4.91c.36.31.69.92.69 1.85V21c0 .27.16.59.67.5C19.14 20.16 22 16.42 22 12A10 10 0 0 0 12 2'/%3E%3C/svg%3E");-webkit-mask:var(--un-icon) no-repeat;mask:var(--un-icon) no-repeat;-webkit-mask-size:100% 100%;mask-size:100% 100%;background-color:currentColor;color:inherit;display:inline-flex;width:1em;height:1em}.i-mdi\:earth{--un-icon:url("data:image/svg+xml;utf8,%3Csvg viewBox='0 0 24 24' display='inline-flex' width='1em' height='1em' xmlns='http://www.w3.org/2000/svg' %3E%3Cpath fill='currentColor' d='M17.9 17.39c-.26-.8-1.01-1.39-1.9-1.39h-1v-3a1 1 0 0 0-1-1H8v-2h2a1 1 0 0 0 1-1V7h2a2 2 0 0 0 2-2v-.41a7.984 7.984 0 0 1 2.9 12.8M11 19.93c-3.95-.49-7-3.85-7-7.93c0-.62.08-1.22.21-1.79L9 15v1a2 2 0 0 0 2 2m1-16A10 10 0 0 0 2 12a10 10 0 0 0 10 10a10 10 0 0 0 10-10A10 10 0 0 0 12 2'/%3E%3C/svg%3E");-webkit-mask:var(--un-icon) no-repeat;mask:var(--un-icon) no-repeat;-webkit-mask-size:100% 100%;mask-size:100% 100%;background-color:currentColor;color:inherit;display:inline-flex;width:1em;height:1em}.i-menu\:account{background:url("data:image/svg+xml;utf8,%3Csvg display='inline-flex' width='24' height='24' viewBox='0 0 24 24' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M5 19C5.73154 17.7785 6.75968 16.7689 7.98558 16.0684C9.21148 15.368 10.5939 15 12 15C13.4061 15 14.7885 15.368 16.0144 16.0684C17.2403 16.7689 18.2685 17.7785 19 19' stroke='%233A424D' stroke-width='1.5' stroke-linecap='square' stroke-linejoin='round'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M12 12C14.2091 12 16 10.2092 16 8.00002C16 5.79087 14.2091 4 12 4C9.79086 4 8 5.79087 8 8.00002C8 10.2092 9.79086 12 12 12Z' stroke='%233BAF52' stroke-width='1.5' stroke-linecap='round' stroke-linejoin='round'/%3E%3C/svg%3E") no-repeat;background-size:100% 100%;background-color:transparent;display:inline-flex;width:24;height:24}.i-menu\:account-active,.i-menu\:dark-account-active{background:url("data:image/svg+xml;utf8,%3Csvg display='inline-flex' width='24' height='24' viewBox='0 0 24 24' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M5 19C5.73154 17.7785 6.75968 16.7689 7.98558 16.0684C9.21148 15.368 10.5939 15 12 15C13.4061 15 14.7885 15.368 16.0144 16.0684C17.2403 16.7689 18.2685 17.7785 19 19' stroke='white' stroke-width='1.5' stroke-linecap='square' stroke-linejoin='round'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M12 12C14.2091 12 16 10.2092 16 8.00002C16 5.79087 14.2091 4 12 4C9.79086 4 8 5.79087 8 8.00002C8 10.2092 9.79086 12 12 12Z' fill='white' stroke='white' stroke-width='1.5' stroke-linecap='round' stroke-linejoin='round'/%3E%3C/svg%3E") no-repeat;background-size:100% 100%;background-color:transparent;display:inline-flex;width:24;height:24}.i-menu\:app{background:url("data:image/svg+xml;utf8,%3Csvg display='inline-flex' width='24' height='24' viewBox='0 0 24 24' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M5.5 4H18.5L20 20H4L5.5 4Z' stroke='%233A424D' stroke-width='1.5'/%3E%3Cpath d='M9 8C9.42857 8.66667 10.2857 10 12 10C13.7143 10 14.5714 8.5 15 8' stroke='%233BAF52' stroke-width='1.5'/%3E%3C/svg%3E") no-repeat;background-size:100% 100%;background-color:transparent;display:inline-flex;width:24;height:24}.i-menu\:app-active{background:url("data:image/svg+xml;utf8,%3Csvg display='inline-flex' width='24' height='24' viewBox='0 0 24 24' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M5.5 4H18.5L20 20H4L5.5 4Z' fill='white' stroke='white' stroke-width='1.5'/%3E%3Cpath d='M9 8C9.42857 8.66667 10.2857 10 12 10C13.7143 10 14.5714 8.5 15 8' stroke='%233BAF52' stroke-width='1.5'/%3E%3C/svg%3E") no-repeat;background-size:100% 100%;background-color:transparent;display:inline-flex;width:24;height:24}.i-menu\:cron{background:url("data:image/svg+xml;utf8,%3Csvg display='inline-flex' width='24' height='24' viewBox='0 0 24 24' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cg clip-path='url(%23clip0_1_170)'%3E%3Cpath d='M12.5 21C17.1944 21 21 17.1944 21 12.5C21 7.80558 17.1944 4 12.5 4C7.80558 4 4 7.80558 4 12.5C4 17.1944 7.80558 21 12.5 21Z' stroke='%233A424D' stroke-width='1.5' stroke-linecap='square' stroke-linejoin='round'/%3E%3Cpath d='M12 9V12.75L15 14.5' stroke='%233BAF52' stroke-width='1.5' stroke-linecap='square'/%3E%3C/g%3E%3Cdefs%3E%3CclipPath id='clip0_1_170'%3E%3Crect width='24' height='24' fill='white'/%3E%3C/clipPath%3E%3C/defs%3E%3C/svg%3E") no-repeat;background-size:100% 100%;background-color:transparent;display:inline-flex;width:24;height:24}.i-menu\:cron-active{background:url("data:image/svg+xml;utf8,%3Csvg display='inline-flex' width='24' height='24' viewBox='0 0 24 24' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cg clip-path='url(%23clip0_3_159)'%3E%3Cpath d='M12.5 21C17.1944 21 21 17.1944 21 12.5C21 7.80558 17.1944 4 12.5 4C7.80558 4 4 7.80558 4 12.5C4 17.1944 7.80558 21 12.5 21Z' fill='white' stroke='white' stroke-width='1.5' stroke-linecap='square' stroke-linejoin='round'/%3E%3Cpath d='M12 9V12.75L15 14.5' stroke='%233BAF52' stroke-width='1.5' stroke-linecap='square'/%3E%3C/g%3E%3Cdefs%3E%3CclipPath id='clip0_3_159'%3E%3Crect width='24' height='24' fill='white'/%3E%3C/clipPath%3E%3C/defs%3E%3C/svg%3E") no-repeat;background-size:100% 100%;background-color:transparent;display:inline-flex;width:24;height:24}.i-menu\:dark-account{background:url("data:image/svg+xml;utf8,%3Csvg display='inline-flex' width='24' height='24' viewBox='0 0 24 24' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M5 19C5.73154 17.7785 6.75968 16.7689 7.98558 16.0684C9.21148 15.368 10.5939 15 12 15C13.4061 15 14.7885 15.368 16.0144 16.0684C17.2403 16.7689 18.2685 17.7785 19 19' stroke='%23919191' stroke-width='1.5' stroke-linecap='square' stroke-linejoin='round'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M12 12C14.2091 12 16 10.2092 16 8.00002C16 5.79087 14.2091 4 12 4C9.79086 4 8 5.79087 8 8.00002C8 10.2092 9.79086 12 12 12Z' stroke='%23919191' stroke-width='1.5' stroke-linecap='round' stroke-linejoin='round'/%3E%3C/svg%3E") no-repeat;background-size:100% 100%;background-color:transparent;display:inline-flex;width:24;height:24}.i-menu\:dark-app{background:url("data:image/svg+xml;utf8,%3Csvg display='inline-flex' width='24' height='24' viewBox='0 0 24 24' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M5.5 4H18.5L20 20H4L5.5 4Z' stroke='%23919191' stroke-width='1.5'/%3E%3Cpath d='M9 8C9.42857 8.66667 10.2857 10 12 10C13.7143 10 14.5714 8.5 15 8' stroke='%23919191' stroke-width='1.5'/%3E%3C/svg%3E") no-repeat;background-size:100% 100%;background-color:transparent;display:inline-flex;width:24;height:24}.i-menu\:dark-app-active{background:url("data:image/svg+xml;utf8,%3Csvg display='inline-flex' width='24' height='24' viewBox='0 0 24 24' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M5.5 4H18.5L20 20H4L5.5 4Z' fill='white' stroke='white' stroke-width='1.5'/%3E%3Cpath d='M9 8C9.42857 8.66667 10.2857 10 12 10C13.7143 10 14.5714 8.5 15 8' stroke='%23202020' stroke-width='1.5'/%3E%3C/svg%3E") no-repeat;background-size:100% 100%;background-color:transparent;display:inline-flex;width:24;height:24}.i-menu\:dark-cron{background:url("data:image/svg+xml;utf8,%3Csvg display='inline-flex' width='24' height='24' viewBox='0 0 24 24' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cg clip-path='url(%23clip0_1_170)'%3E%3Cpath d='M12.5 21C17.1944 21 21 17.1944 21 12.5C21 7.80558 17.1944 4 12.5 4C7.80558 4 4 7.80558 4 12.5C4 17.1944 7.80558 21 12.5 21Z' stroke='%23919191' stroke-width='1.5' stroke-linecap='square' stroke-linejoin='round'/%3E%3Cpath d='M12 9V12.75L15 14.5' stroke='%23919191' stroke-width='1.5' stroke-linecap='square'/%3E%3C/g%3E%3Cdefs%3E%3CclipPath id='clip0_1_170'%3E%3Crect width='24' height='24' fill='white'/%3E%3C/clipPath%3E%3C/defs%3E%3C/svg%3E") no-repeat;background-size:100% 100%;background-color:transparent;display:inline-flex;width:24;height:24}.i-menu\:dark-cron-active{background:url("data:image/svg+xml;utf8,%3Csvg display='inline-flex' width='24' height='24' viewBox='0 0 24 24' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cg clip-path='url(%23clip0_3_159)'%3E%3Cpath d='M12.5 21C17.1944 21 21 17.1944 21 12.5C21 7.80558 17.1944 4 12.5 4C7.80558 4 4 7.80558 4 12.5C4 17.1944 7.80558 21 12.5 21Z' fill='white' stroke='white' stroke-width='1.5' stroke-linecap='square' stroke-linejoin='round'/%3E%3Cpath d='M12 9V12.75L15 14.5' stroke='%23202020' stroke-width='1.5' stroke-linecap='square'/%3E%3C/g%3E%3Cdefs%3E%3CclipPath id='clip0_3_159'%3E%3Crect width='24' height='24' fill='white'/%3E%3C/clipPath%3E%3C/defs%3E%3C/svg%3E") no-repeat;background-size:100% 100%;background-color:transparent;display:inline-flex;width:24;height:24}.i-menu\:dark-database{background:url("data:image/svg+xml;utf8,%3Csvg display='inline-flex' width='24' height='24' viewBox='0 0 24 24' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cg clip-path='url(%23clip0_1_62)'%3E%3Cpath d='M19 15.2216C18.5033 16.3991 17.7263 17.4367 16.7371 18.2437C15.7478 19.0507 14.5764 19.6025 13.3253 19.8509C12.0741 20.0992 10.7813 20.0366 9.55992 19.6685C8.33849 19.3004 7.22562 18.638 6.31861 17.7391C5.41159 16.8403 4.73805 15.7325 4.35687 14.5125C3.97568 13.2924 3.89846 11.9974 4.13196 10.7405C4.36546 9.48371 4.90256 8.30333 5.69631 7.30262C6.49006 6.30191 7.51629 5.51133 8.68528 5' stroke='%23919191' stroke-width='1.5' stroke-linecap='square' stroke-linejoin='round'/%3E%3Cpath d='M20 12C20 10.9488 19.7931 9.90792 19.391 8.93676C18.989 7.96559 18.3997 7.08316 17.6569 6.33986C16.914 5.59656 16.0321 5.00695 15.0615 4.60468C14.0909 4.2024 13.0506 4 12 4V12H20Z' stroke='%23919191' stroke-width='1.5' stroke-linecap='square' stroke-linejoin='round'/%3E%3C/g%3E%3Cdefs%3E%3CclipPath id='clip0_1_62'%3E%3Crect width='24' height='24' fill='white'/%3E%3C/clipPath%3E%3C/defs%3E%3C/svg%3E") no-repeat;background-size:100% 100%;background-color:transparent;display:inline-flex;width:24;height:24}.i-menu\:dark-database-active,.i-menu\:database-active{background:url("data:image/svg+xml;utf8,%3Csvg display='inline-flex' width='24' height='24' viewBox='0 0 24 24' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cg clip-path='url(%23clip0_3_51)'%3E%3Cpath d='M19 15.2216C18.5033 16.3991 17.7263 17.4367 16.7371 18.2437C15.7478 19.0507 14.5764 19.6025 13.3253 19.8509C12.0741 20.0992 10.7813 20.0366 9.55992 19.6685C8.33849 19.3004 7.22562 18.638 6.31861 17.7391C5.41159 16.8403 4.73805 15.7325 4.35687 14.5125C3.97568 13.2924 3.89846 11.9974 4.13196 10.7405C4.36546 9.48371 4.90256 8.30333 5.69631 7.30262C6.49006 6.30191 7.51629 5.51133 8.68528 5' stroke='white' stroke-width='1.5' stroke-linecap='square' stroke-linejoin='round'/%3E%3Cpath d='M20 12C20 10.9488 19.7931 9.90792 19.391 8.93676C18.989 7.96559 18.3997 7.08316 17.6569 6.33986C16.914 5.59656 16.0321 5.00695 15.0615 4.60468C14.0909 4.2024 13.0506 4 12 4V12H20Z' fill='white' stroke='white' stroke-width='1.5' stroke-linecap='square' stroke-linejoin='round'/%3E%3C/g%3E%3Cdefs%3E%3CclipPath id='clip0_3_51'%3E%3Crect width='24' height='24' fill='white'/%3E%3C/clipPath%3E%3C/defs%3E%3C/svg%3E") no-repeat;background-size:100% 100%;background-color:transparent;display:inline-flex;width:24;height:24}.i-menu\:dark-docker{background:url("data:image/svg+xml;utf8,%3Csvg display='inline-flex' width='24' height='24' viewBox='0 0 24 24' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cg clip-path='url(%23clip0_1_69)'%3E%3Cpath d='M4.5 18C6 17.8333 9.3 17 10.5 15' stroke='%23919191' stroke-width='1.5'/%3E%3Crect x='5' y='8' width='4' height='4' stroke='%23919191' stroke-width='1.5' stroke-linecap='square'/%3E%3Crect x='9' y='8' width='4' height='4' stroke='%23919191' stroke-width='1.5' stroke-linecap='square'/%3E%3Crect x='9' y='4' width='4' height='4' stroke='%23919191' stroke-width='1.5' stroke-linecap='square'/%3E%3Cpath d='M15.186 12H2C2.16279 14.4267 3.95349 20 9.81395 20C17.1395 20 19.093 13.76 19.5814 12.72C21.0465 12.72 23 11.16 23 10.64C22.1433 10.1839 20.5351 10.5279 19.8232 10.6193C19.7235 10.6321 19.6414 10.64 19.5814 10.64C20.0698 10.12 19.093 7.52 18.1163 7C17.3349 8.248 17.4651 10.64 17.6279 11.68C17.6471 11.8023 17.1395 12 15.186 12Z' stroke='%23919191' stroke-width='1.5' stroke-linecap='square'/%3E%3C/g%3E%3Cdefs%3E%3CclipPath id='clip0_1_69'%3E%3Crect width='24' height='24' fill='white'/%3E%3C/clipPath%3E%3C/defs%3E%3C/svg%3E") no-repeat;background-size:100% 100%;background-color:transparent;display:inline-flex;width:24;height:24}.i-menu\:dark-docker-active{background:url("data:image/svg+xml;utf8,%3Csvg display='inline-flex' width='24' height='24' viewBox='0 0 24 24' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cg clip-path='url(%23clip0_3_58)'%3E%3Crect x='5' y='8' width='4' height='4' stroke='white' stroke-width='1.5' stroke-linecap='square'/%3E%3Crect x='9' y='8' width='4' height='4' stroke='white' stroke-width='1.5' stroke-linecap='square'/%3E%3Crect x='9' y='4' width='4' height='4' stroke='white' stroke-width='1.5' stroke-linecap='square'/%3E%3Cpath d='M15.186 12H2C2.16279 14.4267 3.95349 20 9.81395 20C17.1395 20 19.093 13.76 19.5814 12.72C21.0465 12.72 23 11.16 23 10.64C22.1433 10.1839 20.5351 10.5279 19.8232 10.6193C19.7235 10.6321 19.6414 10.64 19.5814 10.64C20.0698 10.12 19.093 7.52 18.1163 7C17.3349 8.248 17.4651 10.64 17.6279 11.68C17.6471 11.8023 17.1395 12 15.186 12Z' fill='white' stroke='white' stroke-width='1.5' stroke-linecap='square'/%3E%3Cpath d='M4.5 18C6 17.8333 9.3 17 10.5 15' stroke='%23202020' stroke-width='1.5'/%3E%3C/g%3E%3Cdefs%3E%3CclipPath id='clip0_3_58'%3E%3Crect width='24' height='24' fill='white'/%3E%3C/clipPath%3E%3C/defs%3E%3C/svg%3E") no-repeat;background-size:100% 100%;background-color:transparent;display:inline-flex;width:24;height:24}.i-menu\:dark-domain{background:url("data:image/svg+xml;utf8,%3Csvg display='inline-flex' width='24' height='24' viewBox='0 0 24 24' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M11.5 10V15' stroke='%23919191' stroke-width='1.5'/%3E%3Cpath d='M7.5 11V14' stroke='%23919191' stroke-width='1.5'/%3E%3Cpath d='M15.5 11V14' stroke='%23919191' stroke-width='1.5'/%3E%3Cpath d='M9 4H4V9' stroke='%23919191' stroke-width='1.5' stroke-linecap='square'/%3E%3Cpath d='M15 4H20V9' stroke='%23919191' stroke-width='1.5' stroke-linecap='square'/%3E%3Cpath d='M9 21H4V16' stroke='%23919191' stroke-width='1.5' stroke-linecap='square'/%3E%3Cpath d='M15 21H20V16' stroke='%23919191' stroke-width='1.5' stroke-linecap='square'/%3E%3C/svg%3E") no-repeat;background-size:100% 100%;background-color:transparent;display:inline-flex;width:24;height:24}.i-menu\:dark-domain-active,.i-menu\:domain-active{background:url("data:image/svg+xml;utf8,%3Csvg display='inline-flex' width='24' height='24' viewBox='0 0 24 24' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M11.5 10V15' stroke='white' stroke-width='1.5'/%3E%3Cpath d='M7.5 11V14' stroke='white' stroke-width='1.5'/%3E%3Cpath d='M15.5 11V14' stroke='white' stroke-width='1.5'/%3E%3Cpath d='M9 4H4V9' stroke='white' stroke-width='1.5' stroke-linecap='square'/%3E%3Cpath d='M15 4H20V9' stroke='white' stroke-width='1.5' stroke-linecap='square'/%3E%3Cpath d='M9 21H4V16' stroke='white' stroke-width='1.5' stroke-linecap='square'/%3E%3Cpath d='M15 21H20V16' stroke='white' stroke-width='1.5' stroke-linecap='square'/%3E%3C/svg%3E") no-repeat;background-size:100% 100%;background-color:transparent;display:inline-flex;width:24;height:24}.i-menu\:dark-files{background:url("data:image/svg+xml;utf8,%3Csvg display='inline-flex' width='24' height='24' viewBox='0 0 24 24' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cg clip-path='url(%23clip0_1_118)'%3E%3Cpath d='M10.5 7H20V19.5H3V4H8.5L10.5 7Z' stroke='%23919191' stroke-width='1.5' stroke-linecap='round'/%3E%3Cpath d='M7 15L16 15' stroke='%23919191' stroke-width='1.5'/%3E%3C/g%3E%3Cdefs%3E%3CclipPath id='clip0_1_118'%3E%3Crect width='24' height='24' fill='white'/%3E%3C/clipPath%3E%3C/defs%3E%3C/svg%3E") no-repeat;background-size:100% 100%;background-color:transparent;display:inline-flex;width:24;height:24}.i-menu\:dark-files-active{background:url("data:image/svg+xml;utf8,%3Csvg display='inline-flex' width='24' height='24' viewBox='0 0 24 24' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cg clip-path='url(%23clip0_3_107)'%3E%3Cpath d='M10.5 7H20V19.5H3V4H8.5L10.5 7Z' fill='white' stroke='white' stroke-width='1.5' stroke-linecap='round'/%3E%3Cpath d='M7 15L16 15' stroke='%23202020' stroke-width='1.5'/%3E%3C/g%3E%3Cdefs%3E%3CclipPath id='clip0_3_107'%3E%3Crect width='24' height='24' fill='white'/%3E%3C/clipPath%3E%3C/defs%3E%3C/svg%3E") no-repeat;background-size:100% 100%;background-color:transparent;display:inline-flex;width:24;height:24}.i-menu\:dark-ftp{background:url("data:image/svg+xml;utf8,%3Csvg display='inline-flex' width='24' height='24' viewBox='0 0 24 24' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M19.5356 7.53514L15.7256 3.7254L14.9999 2.99974' stroke='%23919191' stroke-width='1.5'/%3E%3Cpath d='M19.9999 7.99963L6.65991 7.99963L4.49991 7.99963' stroke='%23919191' stroke-width='1.5'/%3E%3Cpath d='M4.96427 15.4646L7.93412 18.4344L9.49991 20' stroke='%23919191' stroke-width='1.5'/%3E%3Cpath d='M4.49991 15.0001L17.8399 15.0001L19.9999 15.0001' stroke='%23919191' stroke-width='1.5'/%3E%3C/svg%3E") no-repeat;background-size:100% 100%;background-color:transparent;display:inline-flex;width:24;height:24}.i-menu\:dark-ftp-active,.i-menu\:ftp-active{background:url("data:image/svg+xml;utf8,%3Csvg display='inline-flex' width='24' height='24' viewBox='0 0 24 24' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M19.5356 7.53514L15.7256 3.7254L14.9999 2.99974' stroke='white' stroke-width='1.5'/%3E%3Cpath d='M19.9999 7.99963L6.65991 7.99963L4.49991 7.99963' stroke='white' stroke-width='1.5'/%3E%3Cpath d='M4.96426 15.4646L7.93411 18.4344L9.49991 20' stroke='white' stroke-width='1.5'/%3E%3Cpath d='M4.49991 15.0001L17.8399 15.0001L19.9999 15.0001' stroke='white' stroke-width='1.5'/%3E%3C/svg%3E") no-repeat;background-size:100% 100%;background-color:transparent;display:inline-flex;width:24;height:24}.i-menu\:dark-home{background:url("data:image/svg+xml;utf8,%3Csvg display='inline-flex' width='24' height='24' viewBox='0 0 24 24' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M2 11.5L11.5 3L21 11.5' stroke='%23919191' stroke-width='1.5' stroke-linecap='square'/%3E%3Cpath d='M5 9L4.49129 8.4489C4.33748 8.59088 4.25 8.79068 4.25 9H5ZM5 20H4.25V20.75H5V20ZM18 20V20.75H18.75V20H18ZM18 9H18.75C18.75 8.79068 18.6625 8.59088 18.5087 8.4489L18 9ZM11.5 3L12.0087 2.4489C11.7214 2.1837 11.2786 2.1837 10.9913 2.4489L11.5 3ZM5 9H4.25V20H5H5.75V9H5ZM5 20V20.75H18V20V19.25H5V20ZM18 20H18.75V9H18H17.25V20H18ZM18 9L18.5087 8.4489L12.0087 2.4489L11.5 3L10.9913 3.5511L17.4913 9.5511L18 9ZM11.5 3L10.9913 2.4489L4.49129 8.4489L5 9L5.50871 9.5511L12.0087 3.5511L11.5 3Z' fill='%23919191'/%3E%3Cpath d='M14 12L9.5 16.5' stroke='%23919191' stroke-width='1.5'/%3E%3C/svg%3E") no-repeat;background-size:100% 100%;background-color:transparent;display:inline-flex;width:24;height:24}.i-menu\:dark-home-active{background:url("data:image/svg+xml;utf8,%3Csvg display='inline-flex' width='24' height='24' viewBox='0 0 24 24' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M2 11.5L11.5 3L21 11.5' stroke='white' stroke-width='1.5' stroke-linecap='square'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M5 9V20H18V9L11.5 3L5 9Z' fill='white'/%3E%3Cpath d='M5 9L4.49129 8.4489C4.33748 8.59088 4.25 8.79068 4.25 9H5ZM5 20H4.25V20.75H5V20ZM18 20V20.75H18.75V20H18ZM18 9H18.75C18.75 8.79068 18.6625 8.59088 18.5087 8.4489L18 9ZM11.5 3L12.0087 2.4489C11.7214 2.1837 11.2786 2.1837 10.9913 2.4489L11.5 3ZM5 9H4.25V20H5H5.75V9H5ZM5 20V20.75H18V20V19.25H5V20ZM18 20H18.75V9H18H17.25V20H18ZM18 9L18.5087 8.4489L12.0087 2.4489L11.5 3L10.9913 3.5511L17.4913 9.5511L18 9ZM11.5 3L10.9913 2.4489L4.49129 8.4489L5 9L5.50871 9.5511L12.0087 3.5511L11.5 3Z' fill='white'/%3E%3Cpath d='M14 12L9.5 16.5' stroke='%23202020' stroke-width='1.5'/%3E%3C/svg%3E") no-repeat;background-size:100% 100%;background-color:transparent;display:inline-flex;width:24;height:24}.i-menu\:dark-logout{background:url("data:image/svg+xml;utf8,%3Csvg display='inline-flex' width='24' height='24' viewBox='0 0 24 24' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M20 12H9.67226H8' stroke='%23919191' stroke-width='1.5'/%3E%3Cpath d='M16 8L20 12L16 16' stroke='%23919191' stroke-width='1.5'/%3E%3Cpath d='M10 4H5V20H10' stroke='%23919191' stroke-width='1.5' stroke-linecap='square' stroke-linejoin='round'/%3E%3C/svg%3E") no-repeat;background-size:100% 100%;background-color:transparent;display:inline-flex;width:24;height:24}.i-menu\:dark-logout-active,.i-menu\:logout-active{background:url("data:image/svg+xml;utf8,%3Csvg display='inline-flex' width='24' height='24' viewBox='0 0 24 24' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M20 12H9.67226H8' stroke='white' stroke-width='1.5'/%3E%3Cpath d='M16 8L20 12L16 16' stroke='white' stroke-width='1.5'/%3E%3Cpath d='M10 4H5V20H10' stroke='white' stroke-width='1.5' stroke-linecap='square' stroke-linejoin='round'/%3E%3C/svg%3E") no-repeat;background-size:100% 100%;background-color:transparent;display:inline-flex;width:24;height:24}.i-menu\:dark-logs{background:url("data:image/svg+xml;utf8,%3Csvg display='inline-flex' width='24' height='24' viewBox='0 0 24 24' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M17.5 5.49994L15 2.99994L4 2.99999V21H20V7.99994L17.5 5.49994Z' stroke='%23919191' stroke-width='1.5' stroke-linecap='round'/%3E%3Cpath d='M8 11L12 11' stroke='%23919191' stroke-width='1.5'/%3E%3Cpath d='M8 15L16 15' stroke='%23919191' stroke-width='1.5'/%3E%3C/svg%3E") no-repeat;background-size:100% 100%;background-color:transparent;display:inline-flex;width:24;height:24}.i-menu\:dark-logs-active{background:url("data:image/svg+xml;utf8,%3Csvg display='inline-flex' width='24' height='24' viewBox='0 0 24 24' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M17.5 5.49994L15 2.99994L4 2.99999V21H20V7.99994L17.5 5.49994Z' fill='white' stroke='white' stroke-width='1.5' stroke-linecap='round'/%3E%3Cpath d='M8 11L12 11' stroke='%23202020' stroke-width='1.5'/%3E%3Cpath d='M8 15L16 15' stroke='%23202020' stroke-width='1.5'/%3E%3C/svg%3E") no-repeat;background-size:100% 100%;background-color:transparent;display:inline-flex;width:24;height:24}.i-menu\:dark-mail{background:url("data:image/svg+xml;utf8,%3Csvg display='inline-flex' width='24' height='24' viewBox='0 0 24 24' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M20 5H3V18H20V5Z' stroke='%23919191' stroke-width='1.5' stroke-linecap='round'/%3E%3Cpath d='M6 8L11.5 12L17 8' stroke='%23919191' stroke-width='1.5'/%3E%3C/svg%3E") no-repeat;background-size:100% 100%;background-color:transparent;display:inline-flex;width:24;height:24}.i-menu\:dark-mail-active{background:url("data:image/svg+xml;utf8,%3Csvg display='inline-flex' width='24' height='24' viewBox='0 0 24 24' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M20 5H3V18H20V5Z' fill='white' stroke='white' stroke-width='1.5' stroke-linecap='round'/%3E%3Cpath d='M6 8L11.5 12L17 8' stroke='%23202020' stroke-width='1.5'/%3E%3C/svg%3E") no-repeat;background-size:100% 100%;background-color:transparent;display:inline-flex;width:24;height:24}.i-menu\:dark-monitor{background:url("data:image/svg+xml;utf8,%3Csvg display='inline-flex' width='24' height='24' viewBox='0 0 24 24' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M19.0574 4.10237L20 4V17L19.0574 16.8976C14.0339 16.3521 8.96611 16.3521 3.94262 16.8976L3 17V4L3.94262 4.10237C8.9661 4.6479 14.0339 4.6479 19.0574 4.10237Z' stroke='%23919191' stroke-width='1.5'/%3E%3Cpath d='M8 11.8L10 10L12.375 12L15 10' stroke='%23919191' stroke-width='1.5' stroke-linecap='square'/%3E%3Cpath d='M11.5 16.5V20' stroke='%23919191' stroke-width='1.5' stroke-linecap='round' stroke-linejoin='round'/%3E%3Cpath d='M8 20.5H15' stroke='%23919191' stroke-width='1.5' stroke-linecap='square' stroke-linejoin='round'/%3E%3C/svg%3E") no-repeat;background-size:100% 100%;background-color:transparent;display:inline-flex;width:24;height:24}.i-menu\:dark-monitor-active{background:url("data:image/svg+xml;utf8,%3Csvg display='inline-flex' width='24' height='24' viewBox='0 0 24 24' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M19.0574 4.10237L20 4V17L19.0574 16.8976C14.0339 16.3521 8.96611 16.3521 3.94262 16.8976L3 17V4L3.94262 4.10237C8.9661 4.6479 14.0339 4.6479 19.0574 4.10237Z' fill='white' stroke='white' stroke-width='1.5'/%3E%3Cpath d='M8 11.8L10 10L12.375 12L15 10' stroke='%23202020' stroke-width='1.5' stroke-linecap='square'/%3E%3Cpath d='M11.5 16.5V20' stroke='white' stroke-width='1.5' stroke-linecap='round' stroke-linejoin='round'/%3E%3Cpath d='M8 20.5H15' stroke='white' stroke-width='1.5' stroke-linecap='square' stroke-linejoin='round'/%3E%3C/svg%3E") no-repeat;background-size:100% 100%;background-color:transparent;display:inline-flex;width:24;height:24}.i-menu\:dark-security{background:url("data:image/svg+xml;utf8,%3Csvg display='inline-flex' width='24' height='24' viewBox='0 0 24 24' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M11.4667 4L20 6.64706V12.0545C20 14.9721 18.5857 17.7087 16.2056 19.3963L12.5333 22L8.25531 19.3459C5.60944 17.7044 4 14.8119 4 11.6982V7.17647L11.4667 4Z' stroke='%23919191' stroke-width='1.5'/%3E%3Cpath d='M9 13L11.25 15L15 11' stroke='%23919191' stroke-width='1.5' stroke-linecap='square'/%3E%3C/svg%3E") no-repeat;background-size:100% 100%;background-color:transparent;display:inline-flex;width:24;height:24}.i-menu\:dark-security-active{background:url("data:image/svg+xml;utf8,%3Csvg display='inline-flex' width='24' height='24' viewBox='0 0 24 24' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M11.4667 4L20 6.64706V12.0545C20 14.9721 18.5857 17.7087 16.2056 19.3963L12.5333 22L8.25531 19.3459C5.60944 17.7044 4 14.8119 4 11.6982V7.17647L11.4667 4Z' fill='white' stroke='white' stroke-width='1.5'/%3E%3Cpath d='M9 13L11.25 15L15 11' stroke='%23202020' stroke-width='1.5' stroke-linecap='square'/%3E%3C/svg%3E") no-repeat;background-size:100% 100%;background-color:transparent;display:inline-flex;width:24;height:24}.i-menu\:dark-settings{background:url("data:image/svg+xml;utf8,%3Csvg display='inline-flex' width='24' height='24' viewBox='0 0 24 24' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cg clip-path='url(%23clip0_1_185)'%3E%3Cpath d='M3 17.0238L3 7.97619L11.2585 3L20 7.97619L20 17.0238L11.2585 22L3 17.0238Z' stroke='%23919191' stroke-width='1.5' stroke-linecap='square' stroke-linejoin='round'/%3E%3Ccircle cx='11.5' cy='12.5' r='2.5' transform='rotate(-90 11.5 12.5)' stroke='%23919191' stroke-width='1.5'/%3E%3C/g%3E%3Cdefs%3E%3CclipPath id='clip0_1_185'%3E%3Crect width='24' height='24' fill='white'/%3E%3C/clipPath%3E%3C/defs%3E%3C/svg%3E") no-repeat;background-size:100% 100%;background-color:transparent;display:inline-flex;width:24;height:24}.i-menu\:dark-settings-active{background:url("data:image/svg+xml;utf8,%3Csvg display='inline-flex' width='24' height='24' viewBox='0 0 24 24' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cg clip-path='url(%23clip0_3_174)'%3E%3Cpath d='M3 17.0238L3 7.97619L11.2585 3L20 7.97619L20 17.0238L11.2585 22L3 17.0238Z' fill='white' stroke='white' stroke-width='1.5' stroke-linecap='square' stroke-linejoin='round'/%3E%3Ccircle cx='11.5' cy='12.5' r='2.5' transform='rotate(-90 11.5 12.5)' stroke='%23202020' stroke-width='1.5'/%3E%3C/g%3E%3Cdefs%3E%3CclipPath id='clip0_3_174'%3E%3Crect width='24' height='24' fill='white'/%3E%3C/clipPath%3E%3C/defs%3E%3C/svg%3E") no-repeat;background-size:100% 100%;background-color:transparent;display:inline-flex;width:24;height:24}.i-menu\:dark-terminal{background:url("data:image/svg+xml;utf8,%3Csvg display='inline-flex' width='24' height='24' viewBox='0 0 24 24' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M20 4H4V20H20V4Z' stroke='%23919191' stroke-width='1.5' stroke-linecap='round'/%3E%3Cpath d='M7 9H17' stroke='%23919191' stroke-width='1.5'/%3E%3Cpath d='M7 15H17' stroke='%23919191' stroke-width='1.5'/%3E%3Cpath d='M10 13L10 17' stroke='%23919191' stroke-width='1.5'/%3E%3Cpath d='M14 7L14 11' stroke='%23919191' stroke-width='1.5'/%3E%3C/svg%3E") no-repeat;background-size:100% 100%;background-color:transparent;display:inline-flex;width:24;height:24}.i-menu\:dark-terminal-active{background:url("data:image/svg+xml;utf8,%3Csvg display='inline-flex' width='24' height='24' viewBox='0 0 24 24' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M20 4H4V20H20V4Z' fill='white' stroke='white' stroke-width='1.5' stroke-linecap='round'/%3E%3Cpath d='M7 9H17' stroke='%23202020' stroke-width='1.5'/%3E%3Cpath d='M7 15H17' stroke='%23202020' stroke-width='1.5'/%3E%3Cpath d='M10 13L10 17' stroke='%23202020' stroke-width='1.5'/%3E%3Cpath d='M14 7L14 11' stroke='%23202020' stroke-width='1.5'/%3E%3C/svg%3E") no-repeat;background-size:100% 100%;background-color:transparent;display:inline-flex;width:24;height:24}.i-menu\:dark-waf{background:url("data:image/svg+xml;utf8,%3Csvg display='inline-flex' width='24' height='24' viewBox='0 0 24 24' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M20 12H3V22H20V12Z' stroke='%23919191' stroke-width='1.5' stroke-linecap='round'/%3E%3Cpath d='M4 17H20' stroke='%23919191' stroke-width='1.5' stroke-linecap='round' stroke-linejoin='round'/%3E%3Cpath d='M9.5 17V21' stroke='%23919191' stroke-width='1.5' stroke-linecap='round' stroke-linejoin='round'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M11.3232 2.04234C11.2748 2.01463 11.2196 2 11.1633 2C11.107 2 11.0518 2.01463 11.0034 2.04234C10.9636 2.07265 10.9366 2.11595 10.9278 2.16401C10.919 2.21208 10.9288 2.26159 10.9555 2.30317C11.9388 3.93723 12.1466 6.16201 10.8036 7.38948C10.2868 6.97277 9.87657 6.44787 9.6044 5.85515C9.10773 6.11987 8.69611 6.51008 8.41424 6.98344C8.13236 7.45679 7.991 7.99521 8.00551 8.54022C8.02579 9.02069 8.146 9.4924 8.35908 9.92758C8.57216 10.3628 8.87381 10.7527 9.24626 11.0744C9.61872 11.3961 10.0545 11.643 10.5279 11.8007C11.0012 11.9583 11.5027 12.0235 12.0028 11.9925C14.5769 11.9925 15.912 10.4582 16 8.54022C16.1039 6.23874 14.4011 3.40789 11.3232 2.04234Z' stroke='%23919191' stroke-width='1.5' stroke-linecap='round'/%3E%3C/svg%3E") no-repeat;background-size:100% 100%;background-color:transparent;display:inline-flex;width:24;height:24}.i-menu\:dark-waf-active{background:url("data:image/svg+xml;utf8,%3Csvg display='inline-flex' width='24' height='24' viewBox='0 0 24 24' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M20 12H3V22H20V12Z' fill='white' stroke='white' stroke-width='1.5' stroke-linecap='round'/%3E%3Cpath d='M3 17L20 17' stroke='%23202020' stroke-width='1.5' stroke-linecap='square' stroke-linejoin='round'/%3E%3Cpath d='M9.5 17V22' stroke='%23202020' stroke-width='1.5' stroke-linecap='square' stroke-linejoin='round'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M11.3232 2.04234C11.2748 2.01463 11.2196 2 11.1633 2C11.107 2 11.0518 2.01463 11.0034 2.04234C10.9636 2.07265 10.9366 2.11595 10.9278 2.16401C10.919 2.21208 10.9288 2.26159 10.9555 2.30317C11.9388 3.93723 12.1466 6.16201 10.8036 7.38948C10.2868 6.97277 9.87657 6.44787 9.6044 5.85515C9.10773 6.11987 8.69611 6.51008 8.41424 6.98344C8.13236 7.45679 7.991 7.99521 8.00551 8.54022C8.02579 9.02069 8.146 9.4924 8.35908 9.92758C8.57216 10.3628 8.87381 10.7527 9.24626 11.0744C9.61872 11.3961 10.0545 11.643 10.5279 11.8007C11.0012 11.9583 11.5027 12.0235 12.0028 11.9925C14.5769 11.9925 15.912 10.4582 16 8.54022C16.1039 6.23874 14.4011 3.40789 11.3232 2.04234Z' stroke='white' stroke-width='1.5' stroke-linecap='round'/%3E%3C/svg%3E") no-repeat;background-size:100% 100%;background-color:transparent;display:inline-flex;width:24;height:24}.i-menu\:dark-website{background:url("data:image/svg+xml;utf8,%3Csvg display='inline-flex' width='24' height='24' viewBox='0 0 24 24' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M4 12H20' stroke='%23919191' stroke-width='1.5'/%3E%3Ccircle cx='12' cy='12' r='8' stroke='%23919191' stroke-width='1.5' stroke-linecap='round' stroke-linejoin='round'/%3E%3Cellipse cx='12' cy='12' rx='3' ry='8' stroke='%23919191' stroke-width='1.5' stroke-linecap='round' stroke-linejoin='round'/%3E%3C/svg%3E") no-repeat;background-size:100% 100%;background-color:transparent;display:inline-flex;width:24;height:24}.i-menu\:dark-website-active{background:url("data:image/svg+xml;utf8,%3Csvg display='inline-flex' width='24' height='24' viewBox='0 0 24 24' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Ccircle cx='12' cy='12' r='8' fill='white' stroke='white' stroke-width='1.5' stroke-linecap='round' stroke-linejoin='round'/%3E%3Cpath d='M4 12H20' stroke='%23202020' stroke-width='1.5' stroke-linecap='round'/%3E%3Cellipse cx='12' cy='12' rx='3' ry='8' stroke='%23202020' stroke-width='1.5' stroke-linecap='round' stroke-linejoin='round'/%3E%3C/svg%3E") no-repeat;background-size:100% 100%;background-color:transparent;display:inline-flex;width:24;height:24}.i-menu\:dark-wp{background:url("data:image/svg+xml;utf8,%3Csvg display='inline-flex' width='24' height='24' viewBox='0 0 24 24' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M20 7H3V20H20V7Z' stroke='%23919191' stroke-width='1.5' stroke-linecap='round'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M16 4H7V7H16V4Z' stroke='%23919191' stroke-width='1.5' stroke-linecap='round'/%3E%3Cpath d='M7 12H16' stroke='%23919191' stroke-width='1.5'/%3E%3C/svg%3E") no-repeat;background-size:100% 100%;background-color:transparent;display:inline-flex;width:24;height:24}.i-menu\:dark-wp-active{background:url("data:image/svg+xml;utf8,%3Csvg display='inline-flex' width='24' height='24' viewBox='0 0 24 24' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M20 7H3V20H20V7Z' fill='white' stroke='white' stroke-width='1.5' stroke-linecap='round'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M16 4H7V7H16V4Z' stroke='white' stroke-width='1.5' stroke-linecap='round'/%3E%3Cpath d='M7 12H16' stroke='%23202020' stroke-width='1.5'/%3E%3C/svg%3E") no-repeat;background-size:100% 100%;background-color:transparent;display:inline-flex;width:24;height:24}.i-menu\:database{background:url("data:image/svg+xml;utf8,%3Csvg display='inline-flex' width='24' height='24' viewBox='0 0 24 24' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cg clip-path='url(%23clip0_1_62)'%3E%3Cpath d='M19 15.2216C18.5033 16.3991 17.7263 17.4367 16.7371 18.2437C15.7478 19.0507 14.5764 19.6025 13.3253 19.8509C12.0741 20.0992 10.7813 20.0366 9.55992 19.6685C8.33849 19.3004 7.22562 18.638 6.31861 17.7391C5.41159 16.8403 4.73805 15.7325 4.35687 14.5125C3.97568 13.2924 3.89846 11.9974 4.13196 10.7405C4.36546 9.48371 4.90256 8.30333 5.69631 7.30262C6.49006 6.30191 7.51629 5.51133 8.68528 5' stroke='%233A424D' stroke-width='1.5' stroke-linecap='square' stroke-linejoin='round'/%3E%3Cpath d='M20 12C20 10.9488 19.7931 9.90792 19.391 8.93676C18.989 7.96559 18.3997 7.08316 17.6569 6.33986C16.914 5.59656 16.0321 5.00695 15.0615 4.60468C14.0909 4.2024 13.0506 4 12 4V12H20Z' stroke='%2320A53A' stroke-width='1.5' stroke-linecap='square' stroke-linejoin='round'/%3E%3C/g%3E%3Cdefs%3E%3CclipPath id='clip0_1_62'%3E%3Crect width='24' height='24' fill='white'/%3E%3C/clipPath%3E%3C/defs%3E%3C/svg%3E") no-repeat;background-size:100% 100%;background-color:transparent;display:inline-flex;width:24;height:24}.i-menu\:docker{background:url("data:image/svg+xml;utf8,%3Csvg display='inline-flex' width='24' height='24' viewBox='0 0 24 24' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cg clip-path='url(%23clip0_1_69)'%3E%3Cpath d='M4.5 18C6 17.8333 9.3 17 10.5 15' stroke='%233BAF52' stroke-width='1.5'/%3E%3Crect x='5' y='8' width='4' height='4' stroke='%233A424D' stroke-width='1.5' stroke-linecap='square'/%3E%3Crect x='9' y='8' width='4' height='4' stroke='%233A424D' stroke-width='1.5' stroke-linecap='square'/%3E%3Crect x='9' y='4' width='4' height='4' stroke='%233A424D' stroke-width='1.5' stroke-linecap='square'/%3E%3Cpath d='M15.186 12H2C2.16279 14.4267 3.95349 20 9.81395 20C17.1395 20 19.093 13.76 19.5814 12.72C21.0465 12.72 23 11.16 23 10.64C22.1433 10.1839 20.5351 10.5279 19.8232 10.6193C19.7235 10.6321 19.6414 10.64 19.5814 10.64C20.0698 10.12 19.093 7.52 18.1163 7C17.3349 8.248 17.4651 10.64 17.6279 11.68C17.6471 11.8023 17.1395 12 15.186 12Z' stroke='%233A424D' stroke-width='1.5' stroke-linecap='square'/%3E%3C/g%3E%3Cdefs%3E%3CclipPath id='clip0_1_69'%3E%3Crect width='24' height='24' fill='white'/%3E%3C/clipPath%3E%3C/defs%3E%3C/svg%3E") no-repeat;background-size:100% 100%;background-color:transparent;display:inline-flex;width:24;height:24}.i-menu\:docker-active{background:url("data:image/svg+xml;utf8,%3Csvg display='inline-flex' width='24' height='24' viewBox='0 0 24 24' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cg clip-path='url(%23clip0_3_58)'%3E%3Crect x='5' y='8' width='4' height='4' stroke='white' stroke-width='1.5' stroke-linecap='square'/%3E%3Crect x='9' y='8' width='4' height='4' stroke='white' stroke-width='1.5' stroke-linecap='square'/%3E%3Crect x='9' y='4' width='4' height='4' stroke='white' stroke-width='1.5' stroke-linecap='square'/%3E%3Cpath d='M15.186 12H2C2.16279 14.4267 3.95349 20 9.81395 20C17.1395 20 19.093 13.76 19.5814 12.72C21.0465 12.72 23 11.16 23 10.64C22.1433 10.1839 20.5351 10.5279 19.8232 10.6193C19.7235 10.6321 19.6414 10.64 19.5814 10.64C20.0698 10.12 19.093 7.52 18.1163 7C17.3349 8.248 17.4651 10.64 17.6279 11.68C17.6471 11.8023 17.1395 12 15.186 12Z' fill='white' stroke='white' stroke-width='1.5' stroke-linecap='square'/%3E%3Cpath d='M4.5 18C6 17.8333 9.3 17 10.5 15' stroke='%233BAF52' stroke-width='1.5'/%3E%3C/g%3E%3Cdefs%3E%3CclipPath id='clip0_3_58'%3E%3Crect width='24' height='24' fill='white'/%3E%3C/clipPath%3E%3C/defs%3E%3C/svg%3E") no-repeat;background-size:100% 100%;background-color:transparent;display:inline-flex;width:24;height:24}.i-menu\:domain{background:url("data:image/svg+xml;utf8,%3Csvg display='inline-flex' width='24' height='24' viewBox='0 0 24 24' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M11.5 10V15' stroke='%233BAF52' stroke-width='1.5'/%3E%3Cpath d='M7.5 11V14' stroke='%233BAF52' stroke-width='1.5'/%3E%3Cpath d='M15.5 11V14' stroke='%233BAF52' stroke-width='1.5'/%3E%3Cpath d='M9 4H4V9' stroke='%233A424D' stroke-width='1.5' stroke-linecap='square'/%3E%3Cpath d='M15 4H20V9' stroke='%233A424D' stroke-width='1.5' stroke-linecap='square'/%3E%3Cpath d='M9 21H4V16' stroke='%233A424D' stroke-width='1.5' stroke-linecap='square'/%3E%3Cpath d='M15 21H20V16' stroke='%233A424D' stroke-width='1.5' stroke-linecap='square'/%3E%3C/svg%3E") no-repeat;background-size:100% 100%;background-color:transparent;display:inline-flex;width:24;height:24}.i-menu\:files{background:url("data:image/svg+xml;utf8,%3Csvg display='inline-flex' width='24' height='24' viewBox='0 0 24 24' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cg clip-path='url(%23clip0_1_118)'%3E%3Cpath d='M10.5 7H20V19.5H3V4H8.5L10.5 7Z' stroke='%233A424D' stroke-width='1.5' stroke-linecap='round'/%3E%3Cpath d='M7 15L16 15' stroke='%233BAF52' stroke-width='1.5'/%3E%3C/g%3E%3Cdefs%3E%3CclipPath id='clip0_1_118'%3E%3Crect width='24' height='24' fill='white'/%3E%3C/clipPath%3E%3C/defs%3E%3C/svg%3E") no-repeat;background-size:100% 100%;background-color:transparent;display:inline-flex;width:24;height:24}.i-menu\:files-active{background:url("data:image/svg+xml;utf8,%3Csvg display='inline-flex' width='24' height='24' viewBox='0 0 24 24' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cg clip-path='url(%23clip0_3_107)'%3E%3Cpath d='M10.5 7H20V19.5H3V4H8.5L10.5 7Z' fill='white' stroke='white' stroke-width='1.5' stroke-linecap='round'/%3E%3Cpath d='M7 15L16 15' stroke='%233BAF52' stroke-width='1.5'/%3E%3C/g%3E%3Cdefs%3E%3CclipPath id='clip0_3_107'%3E%3Crect width='24' height='24' fill='white'/%3E%3C/clipPath%3E%3C/defs%3E%3C/svg%3E") no-repeat;background-size:100% 100%;background-color:transparent;display:inline-flex;width:24;height:24}.i-menu\:ftp{background:url("data:image/svg+xml;utf8,%3Csvg display='inline-flex' width='24' height='24' viewBox='0 0 24 24' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M19.5356 7.53514L15.7256 3.7254L14.9999 2.99974' stroke='%2320A53A' stroke-width='1.5'/%3E%3Cpath d='M19.9999 7.99963L6.65991 7.99963L4.49991 7.99963' stroke='%233A424D' stroke-width='1.5'/%3E%3Cpath d='M4.96427 15.4646L7.93412 18.4344L9.49991 20' stroke='%2320A53A' stroke-width='1.5'/%3E%3Cpath d='M4.49991 15.0001L17.8399 15.0001L19.9999 15.0001' stroke='%233A424D' stroke-width='1.5'/%3E%3C/svg%3E") no-repeat;background-size:100% 100%;background-color:transparent;display:inline-flex;width:24;height:24}.i-menu\:home{background:url("data:image/svg+xml;utf8,%3Csvg display='inline-flex' width='24' height='24' viewBox='0 0 24 24' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M2 11.5L11.5 3L21 11.5' stroke='%233A424D' stroke-width='1.5' stroke-linecap='square'/%3E%3Cpath d='M5 9L4.49129 8.4489C4.33748 8.59088 4.25 8.79068 4.25 9H5ZM5 20H4.25V20.75H5V20ZM18 20V20.75H18.75V20H18ZM18 9H18.75C18.75 8.79068 18.6625 8.59088 18.5087 8.4489L18 9ZM11.5 3L12.0087 2.4489C11.7214 2.1837 11.2786 2.1837 10.9913 2.4489L11.5 3ZM5 9H4.25V20H5H5.75V9H5ZM5 20V20.75H18V20V19.25H5V20ZM18 20H18.75V9H18H17.25V20H18ZM18 9L18.5087 8.4489L12.0087 2.4489L11.5 3L10.9913 3.5511L17.4913 9.5511L18 9ZM11.5 3L10.9913 2.4489L4.49129 8.4489L5 9L5.50871 9.5511L12.0087 3.5511L11.5 3Z' fill='%233A424D'/%3E%3Cpath d='M14 12L9.5 16.5' stroke='%2320A53A' stroke-width='1.5'/%3E%3C/svg%3E") no-repeat;background-size:100% 100%;background-color:transparent;display:inline-flex;width:24;height:24}.i-menu\:home-active{background:url("data:image/svg+xml;utf8,%3Csvg display='inline-flex' width='24' height='24' viewBox='0 0 24 24' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M2 11.5L11.5 3L21 11.5' stroke='white' stroke-width='1.5' stroke-linecap='square'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M5 9V20H18V9L11.5 3L5 9Z' fill='white'/%3E%3Cpath d='M5 9L4.49129 8.4489C4.33748 8.59088 4.25 8.79068 4.25 9H5ZM5 20H4.25V20.75H5V20ZM18 20V20.75H18.75V20H18ZM18 9H18.75C18.75 8.79068 18.6625 8.59088 18.5087 8.4489L18 9ZM11.5 3L12.0087 2.4489C11.7214 2.1837 11.2786 2.1837 10.9913 2.4489L11.5 3ZM5 9H4.25V20H5H5.75V9H5ZM5 20V20.75H18V20V19.25H5V20ZM18 20H18.75V9H18H17.25V20H18ZM18 9L18.5087 8.4489L12.0087 2.4489L11.5 3L10.9913 3.5511L17.4913 9.5511L18 9ZM11.5 3L10.9913 2.4489L4.49129 8.4489L5 9L5.50871 9.5511L12.0087 3.5511L11.5 3Z' fill='white'/%3E%3Cpath d='M14 12L9.5 16.5' stroke='%2320A53A' stroke-width='1.5'/%3E%3C/svg%3E") no-repeat;background-size:100% 100%;background-color:transparent;display:inline-flex;width:24;height:24}.i-menu\:logout{background:url("data:image/svg+xml;utf8,%3Csvg display='inline-flex' width='24' height='24' viewBox='0 0 24 24' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M20 12H9.67226H8' stroke='%233BAF52' stroke-width='1.5'/%3E%3Cpath d='M16 8L20 12L16 16' stroke='%233A424D' stroke-width='1.5'/%3E%3Cpath d='M10 4H5V20H10' stroke='%233A424D' stroke-width='1.5' stroke-linecap='square' stroke-linejoin='round'/%3E%3C/svg%3E") no-repeat;background-size:100% 100%;background-color:transparent;display:inline-flex;width:24;height:24}.i-menu\:logs{background:url("data:image/svg+xml;utf8,%3Csvg display='inline-flex' width='24' height='24' viewBox='0 0 24 24' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M17.5 5.49994L15 2.99994L4 2.99999V21H20V7.99994L17.5 5.49994Z' stroke='%233A424D' stroke-width='1.5' stroke-linecap='round'/%3E%3Cpath d='M8 11L12 11' stroke='%233BAF52' stroke-width='1.5'/%3E%3Cpath d='M8 15L16 15' stroke='%233BAF52' stroke-width='1.5'/%3E%3C/svg%3E") no-repeat;background-size:100% 100%;background-color:transparent;display:inline-flex;width:24;height:24}.i-menu\:logs-active{background:url("data:image/svg+xml;utf8,%3Csvg display='inline-flex' width='24' height='24' viewBox='0 0 24 24' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M17.5 5.49994L15 2.99994L4 2.99999V21H20V7.99994L17.5 5.49994Z' fill='white' stroke='white' stroke-width='1.5' stroke-linecap='round'/%3E%3Cpath d='M8 11L12 11' stroke='%233BAF52' stroke-width='1.5'/%3E%3Cpath d='M8 15L16 15' stroke='%233BAF52' stroke-width='1.5'/%3E%3C/svg%3E") no-repeat;background-size:100% 100%;background-color:transparent;display:inline-flex;width:24;height:24}.i-menu\:mail{background:url("data:image/svg+xml;utf8,%3Csvg display='inline-flex' width='24' height='24' viewBox='0 0 24 24' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M20 5H3V18H20V5Z' stroke='%233A424D' stroke-width='1.5' stroke-linecap='round'/%3E%3Cpath d='M6 8L11.5 12L17 8' stroke='%233BAF52' stroke-width='1.5'/%3E%3C/svg%3E") no-repeat;background-size:100% 100%;background-color:transparent;display:inline-flex;width:24;height:24}.i-menu\:mail-active{background:url("data:image/svg+xml;utf8,%3Csvg display='inline-flex' width='24' height='24' viewBox='0 0 24 24' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M20 5H3V18H20V5Z' fill='white' stroke='white' stroke-width='1.5' stroke-linecap='round'/%3E%3Cpath d='M6 8L11.5 12L17 8' stroke='%233BAF52' stroke-width='1.5'/%3E%3C/svg%3E") no-repeat;background-size:100% 100%;background-color:transparent;display:inline-flex;width:24;height:24}.i-menu\:monitor{background:url("data:image/svg+xml;utf8,%3Csvg display='inline-flex' width='24' height='24' viewBox='0 0 24 24' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M19.0574 4.10237L20 4V17L19.0574 16.8976C14.0339 16.3521 8.96611 16.3521 3.94262 16.8976L3 17V4L3.94262 4.10237C8.9661 4.6479 14.0339 4.6479 19.0574 4.10237Z' stroke='%233A424D' stroke-width='1.5'/%3E%3Cpath d='M8 11.8L10 10L12.375 12L15 10' stroke='%2320A53A' stroke-width='1.5' stroke-linecap='square'/%3E%3Cpath d='M11.5 16.5V20' stroke='%233A424D' stroke-width='1.5' stroke-linecap='round' stroke-linejoin='round'/%3E%3Cpath d='M8 20.5H15' stroke='%233A424D' stroke-width='1.5' stroke-linecap='square' stroke-linejoin='round'/%3E%3C/svg%3E") no-repeat;background-size:100% 100%;background-color:transparent;display:inline-flex;width:24;height:24}.i-menu\:monitor-active{background:url("data:image/svg+xml;utf8,%3Csvg display='inline-flex' width='24' height='24' viewBox='0 0 24 24' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M19.0574 4.10237L20 4V17L19.0574 16.8976C14.0339 16.3521 8.96611 16.3521 3.94262 16.8976L3 17V4L3.94262 4.10237C8.9661 4.6479 14.0339 4.6479 19.0574 4.10237Z' fill='white' stroke='white' stroke-width='1.5'/%3E%3Cpath d='M8 11.8L10 10L12.375 12L15 10' stroke='%2320A53A' stroke-width='1.5' stroke-linecap='square'/%3E%3Cpath d='M11.5 16.5V20' stroke='white' stroke-width='1.5' stroke-linecap='round' stroke-linejoin='round'/%3E%3Cpath d='M8 20.5H15' stroke='white' stroke-width='1.5' stroke-linecap='square' stroke-linejoin='round'/%3E%3C/svg%3E") no-repeat;background-size:100% 100%;background-color:transparent;display:inline-flex;width:24;height:24}.i-menu\:security{background:url("data:image/svg+xml;utf8,%3Csvg display='inline-flex' width='24' height='24' viewBox='0 0 24 24' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M11.4667 4L20 6.64706V12.0545C20 14.9721 18.5857 17.7087 16.2056 19.3963L12.5333 22L8.25531 19.3459C5.60944 17.7044 4 14.8119 4 11.6982V7.17647L11.4667 4Z' stroke='%233A424D' stroke-width='1.5'/%3E%3Cpath d='M9 13L11.25 15L15 11' stroke='%2320A53A' stroke-width='1.5' stroke-linecap='square'/%3E%3C/svg%3E") no-repeat;background-size:100% 100%;background-color:transparent;display:inline-flex;width:24;height:24}.i-menu\:security-active{background:url("data:image/svg+xml;utf8,%3Csvg display='inline-flex' width='24' height='24' viewBox='0 0 24 24' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M11.4667 4L20 6.64706V12.0545C20 14.9721 18.5857 17.7087 16.2056 19.3963L12.5333 22L8.25531 19.3459C5.60944 17.7044 4 14.8119 4 11.6982V7.17647L11.4667 4Z' fill='white' stroke='white' stroke-width='1.5'/%3E%3Cpath d='M9 13L11.25 15L15 11' stroke='%2320A53A' stroke-width='1.5' stroke-linecap='square'/%3E%3C/svg%3E") no-repeat;background-size:100% 100%;background-color:transparent;display:inline-flex;width:24;height:24}.i-menu\:settings{background:url("data:image/svg+xml;utf8,%3Csvg display='inline-flex' width='24' height='24' viewBox='0 0 24 24' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cg clip-path='url(%23clip0_1_185)'%3E%3Cpath d='M3 17.0238L3 7.97619L11.2585 3L20 7.97619L20 17.0238L11.2585 22L3 17.0238Z' stroke='%233A424D' stroke-width='1.5' stroke-linecap='square' stroke-linejoin='round'/%3E%3Ccircle cx='11.5' cy='12.5' r='2.5' transform='rotate(-90 11.5 12.5)' stroke='%233BAF52' stroke-width='1.5'/%3E%3C/g%3E%3Cdefs%3E%3CclipPath id='clip0_1_185'%3E%3Crect width='24' height='24' fill='white'/%3E%3C/clipPath%3E%3C/defs%3E%3C/svg%3E") no-repeat;background-size:100% 100%;background-color:transparent;display:inline-flex;width:24;height:24}.i-menu\:settings-active{background:url("data:image/svg+xml;utf8,%3Csvg display='inline-flex' width='24' height='24' viewBox='0 0 24 24' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cg clip-path='url(%23clip0_3_174)'%3E%3Cpath d='M3 17.0238L3 7.97619L11.2585 3L20 7.97619L20 17.0238L11.2585 22L3 17.0238Z' fill='white' stroke='white' stroke-width='1.5' stroke-linecap='square' stroke-linejoin='round'/%3E%3Ccircle cx='11.5' cy='12.5' r='2.5' transform='rotate(-90 11.5 12.5)' stroke='%233BAF52' stroke-width='1.5'/%3E%3C/g%3E%3Cdefs%3E%3CclipPath id='clip0_3_174'%3E%3Crect width='24' height='24' fill='white'/%3E%3C/clipPath%3E%3C/defs%3E%3C/svg%3E") no-repeat;background-size:100% 100%;background-color:transparent;display:inline-flex;width:24;height:24}.i-menu\:terminal{background:url("data:image/svg+xml;utf8,%3Csvg display='inline-flex' width='24' height='24' viewBox='0 0 24 24' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M20 4H4V20H20V4Z' stroke='%233A424D' stroke-width='1.5' stroke-linecap='round'/%3E%3Cpath d='M7 9H17' stroke='%233A424D' stroke-width='1.5'/%3E%3Cpath d='M7 15H17' stroke='%233BAF52' stroke-width='1.5'/%3E%3Cpath d='M10 13L10 17' stroke='%233BAF52' stroke-width='1.5'/%3E%3Cpath d='M14 7L14 11' stroke='%233A424D' stroke-width='1.5'/%3E%3C/svg%3E") no-repeat;background-size:100% 100%;background-color:transparent;display:inline-flex;width:24;height:24}.i-menu\:terminal-active{background:url("data:image/svg+xml;utf8,%3Csvg display='inline-flex' width='24' height='24' viewBox='0 0 24 24' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M20 4H4V20H20V4Z' fill='white' stroke='white' stroke-width='1.5' stroke-linecap='round'/%3E%3Cpath d='M7 9H17' stroke='%2320A53A' stroke-width='1.5'/%3E%3Cpath d='M7 15H17' stroke='%233BAF52' stroke-width='1.5'/%3E%3Cpath d='M10 13L10 17' stroke='%233BAF52' stroke-width='1.5'/%3E%3Cpath d='M14 7L14 11' stroke='%2320A53A' stroke-width='1.5'/%3E%3C/svg%3E") no-repeat;background-size:100% 100%;background-color:transparent;display:inline-flex;width:24;height:24}.i-menu\:waf{background:url("data:image/svg+xml;utf8,%3Csvg display='inline-flex' width='24' height='24' viewBox='0 0 24 24' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M20 12H3V22H20V12Z' stroke='%233A424D' stroke-width='1.5' stroke-linecap='round'/%3E%3Cpath d='M4 17H20' stroke='%233A424D' stroke-width='1.5' stroke-linecap='round' stroke-linejoin='round'/%3E%3Cpath d='M9.5 17V21' stroke='%233A424D' stroke-width='1.5' stroke-linecap='round' stroke-linejoin='round'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M11.3232 2.04234C11.2748 2.01463 11.2196 2 11.1633 2C11.107 2 11.0518 2.01463 11.0034 2.04234C10.9636 2.07265 10.9366 2.11595 10.9278 2.16401C10.919 2.21208 10.9288 2.26159 10.9555 2.30317C11.9388 3.93723 12.1466 6.16201 10.8036 7.38948C10.2868 6.97277 9.87657 6.44787 9.6044 5.85515C9.10773 6.11987 8.69611 6.51008 8.41424 6.98344C8.13236 7.45679 7.991 7.99521 8.00551 8.54022C8.02579 9.02069 8.146 9.4924 8.35908 9.92758C8.57216 10.3628 8.87381 10.7527 9.24626 11.0744C9.61872 11.3961 10.0545 11.643 10.5279 11.8007C11.0012 11.9583 11.5027 12.0235 12.0028 11.9925C14.5769 11.9925 15.912 10.4582 16 8.54022C16.1039 6.23874 14.4011 3.40789 11.3232 2.04234Z' stroke='%233BAF52' stroke-width='1.5' stroke-linecap='round'/%3E%3C/svg%3E") no-repeat;background-size:100% 100%;background-color:transparent;display:inline-flex;width:24;height:24}.i-menu\:waf-active{background:url("data:image/svg+xml;utf8,%3Csvg display='inline-flex' width='24' height='24' viewBox='0 0 24 24' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M20 12H3V22H20V12Z' fill='white' stroke='white' stroke-width='1.5' stroke-linecap='round'/%3E%3Cpath d='M3 17L20 17' stroke='%2320A53A' stroke-width='1.5' stroke-linecap='square' stroke-linejoin='round'/%3E%3Cpath d='M9.5 17V22' stroke='%2320A53A' stroke-width='1.5' stroke-linecap='square' stroke-linejoin='round'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M11.3232 2.04234C11.2748 2.01463 11.2196 2 11.1633 2C11.107 2 11.0518 2.01463 11.0034 2.04234C10.9636 2.07265 10.9366 2.11595 10.9278 2.16401C10.919 2.21208 10.9288 2.26159 10.9555 2.30317C11.9388 3.93723 12.1466 6.16201 10.8036 7.38948C10.2868 6.97277 9.87657 6.44787 9.6044 5.85515C9.10773 6.11987 8.69611 6.51008 8.41424 6.98344C8.13236 7.45679 7.991 7.99521 8.00551 8.54022C8.02579 9.02069 8.146 9.4924 8.35908 9.92758C8.57216 10.3628 8.87381 10.7527 9.24626 11.0744C9.61872 11.3961 10.0545 11.643 10.5279 11.8007C11.0012 11.9583 11.5027 12.0235 12.0028 11.9925C14.5769 11.9925 15.912 10.4582 16 8.54022C16.1039 6.23874 14.4011 3.40789 11.3232 2.04234Z' stroke='white' stroke-width='1.5' stroke-linecap='round'/%3E%3C/svg%3E") no-repeat;background-size:100% 100%;background-color:transparent;display:inline-flex;width:24;height:24}.i-menu\:website{background:url("data:image/svg+xml;utf8,%3Csvg display='inline-flex' width='24' height='24' viewBox='0 0 24 24' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M4 12H20' stroke='%2320A53A' stroke-width='1.5'/%3E%3Ccircle cx='12' cy='12' r='8' stroke='%233A424D' stroke-width='1.5' stroke-linecap='round' stroke-linejoin='round'/%3E%3Cellipse cx='12' cy='12' rx='3' ry='8' stroke='%233A424D' stroke-width='1.5' stroke-linecap='round' stroke-linejoin='round'/%3E%3C/svg%3E") no-repeat;background-size:100% 100%;background-color:transparent;display:inline-flex;width:24;height:24}.i-menu\:website-active{background:url("data:image/svg+xml;utf8,%3Csvg display='inline-flex' width='24' height='24' viewBox='0 0 24 24' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Ccircle cx='12' cy='12' r='8' fill='white' stroke='white' stroke-width='1.5' stroke-linecap='round' stroke-linejoin='round'/%3E%3Cpath d='M4 12H20' stroke='%2320A53A' stroke-width='1.5' stroke-linecap='round'/%3E%3Cellipse cx='12' cy='12' rx='3' ry='8' stroke='%2320A53A' stroke-width='1.5' stroke-linecap='round' stroke-linejoin='round'/%3E%3C/svg%3E") no-repeat;background-size:100% 100%;background-color:transparent;display:inline-flex;width:24;height:24}.i-menu\:wp{background:url("data:image/svg+xml;utf8,%3Csvg display='inline-flex' width='24' height='24' viewBox='0 0 24 24' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M20 7H3V20H20V7Z' stroke='%233A424D' stroke-width='1.5' stroke-linecap='round'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M16 4H7V7H16V4Z' stroke='%233A424D' stroke-width='1.5' stroke-linecap='round'/%3E%3Cpath d='M7 12H16' stroke='%233BAF52' stroke-width='1.5'/%3E%3C/svg%3E") no-repeat;background-size:100% 100%;background-color:transparent;display:inline-flex;width:24;height:24}.i-menu\:wp-active{background:url("data:image/svg+xml;utf8,%3Csvg display='inline-flex' width='24' height='24' viewBox='0 0 24 24' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M20 7H3V20H20V7Z' fill='white' stroke='white' stroke-width='1.5' stroke-linecap='round'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M16 4H7V7H16V4Z' stroke='white' stroke-width='1.5' stroke-linecap='round'/%3E%3Cpath d='M7 12H16' stroke='%233BAF52' stroke-width='1.5'/%3E%3C/svg%3E") no-repeat;background-size:100% 100%;background-color:transparent;display:inline-flex;width:24;height:24}.i-mingcute\:plugin-2-line{--un-icon:url("data:image/svg+xml;utf8,%3Csvg viewBox='0 0 24 24' display='inline-flex' width='1em' height='1em' xmlns='http://www.w3.org/2000/svg' %3E%3Cg fill='none' fill-rule='evenodd'%3E%3Cpath d='m12.593 23.258l-.011.002l-.071.035l-.02.004l-.014-.004l-.071-.035q-.016-.005-.024.005l-.004.01l-.017.428l.005.02l.01.013l.104.074l.015.004l.012-.004l.104-.074l.012-.016l.004-.017l-.017-.427q-.004-.016-.017-.018m.265-.113l-.013.002l-.185.093l-.01.01l-.003.011l.018.43l.005.012l.008.007l.201.093q.019.005.029-.008l.004-.014l-.034-.614q-.005-.018-.02-.022m-.715.002a.02.02 0 0 0-.027.006l-.006.014l-.034.614q.001.018.017.024l.015-.002l.201-.093l.01-.008l.004-.011l.017-.43l-.003-.012l-.01-.01z'/%3E%3Cpath fill='currentColor' d='M10.5 4a1.472 1.472 0 0 0-1.317 2.13l.163.325A1.067 1.067 0 0 1 8.39 8H5a1 1 0 0 0-1 1v1.194c1.82-.109 3.5 1.331 3.5 3.306S5.82 16.915 4 16.806V19a1 1 0 0 0 1 1h2.194c-.109-1.82 1.331-3.5 3.306-3.5s3.415 1.68 3.306 3.5H15a1 1 0 0 0 1-1v-3.39c0-.794.835-1.31 1.545-.956l.324.163a1.472 1.472 0 1 0 0-2.634l-.324.163A1.067 1.067 0 0 1 16 11.39V9a1 1 0 0 0-1-1h-2.39c-.794 0-1.31-.835-.956-1.545l.163-.325A1.472 1.472 0 0 0 10.5 4M7.064 6c-.316-2.017 1.23-4 3.436-4s3.752 1.983 3.436 4H15a3 3 0 0 1 3 3v1.064c2.017-.316 4 1.23 4 3.436s-1.983 3.752-4 3.436V19a3 3 0 0 1-3 3h-2.407a1.06 1.06 0 0 1-.976-1.48l.085-.197a1.308 1.308 0 1 0-2.404 0l.085.198c.3.7-.214 1.479-.976 1.479H5a3 3 0 0 1-3-3v-3.407c0-.762.779-1.276 1.48-.976l.197.085a1.308 1.308 0 1 0 0-2.404l-.198.085c-.7.3-1.479-.214-1.479-.976V9a3 3 0 0 1 3-3z'/%3E%3C/g%3E%3C/svg%3E");-webkit-mask:var(--un-icon) no-repeat;mask:var(--un-icon) no-repeat;-webkit-mask-size:100% 100%;mask-size:100% 100%;background-color:currentColor;color:inherit;display:inline-flex;width:1em;height:1em}.i-mynaui\:refresh-solid{--un-icon:url("data:image/svg+xml;utf8,%3Csvg viewBox='0 0 24 24' display='inline-flex' width='1em' height='1em' xmlns='http://www.w3.org/2000/svg' %3E%3Cpath fill='currentColor' d='M21.074 12.154a.75.75 0 0 1 .672.82c-.49 4.93-4.658 8.776-9.724 8.776c-2.724 0-5.364-.933-7.238-2.68L3 20.85a.75.75 0 0 1-.75-.75v-3.96c0-.714.58-1.29 1.291-1.29h3.97a.75.75 0 0 1 .75.75l-2.413 2.407c1.558 1.433 3.78 2.243 6.174 2.243c4.29 0 7.817-3.258 8.232-7.424a.75.75 0 0 1 .82-.672m-18.82-1.128c.49-4.93 4.658-8.776 9.724-8.776c2.724 0 5.364.933 7.238 2.68L21 3.15a.75.75 0 0 1 .75.75v3.96c0 .714-.58 1.29-1.291 1.29h-3.97a.75.75 0 0 1-.75-.75l2.413-2.408c-1.558-1.432-3.78-2.242-6.174-2.242c-4.29 0-7.817 3.258-8.232 7.424a.75.75 0 1 1-1.492-.148'/%3E%3C/svg%3E");-webkit-mask:var(--un-icon) no-repeat;mask:var(--un-icon) no-repeat;-webkit-mask-size:100% 100%;mask-size:100% 100%;background-color:currentColor;color:inherit;display:inline-flex;width:1em;height:1em}.i-octicon\:git-branch-16{--un-icon:url("data:image/svg+xml;utf8,%3Csvg viewBox='0 0 16 16' display='inline-flex' width='1em' height='1em' xmlns='http://www.w3.org/2000/svg' %3E%3Cpath fill='currentColor' d='M9.5 3.25a2.25 2.25 0 1 1 3 2.122V6A2.5 2.5 0 0 1 10 8.5H6a1 1 0 0 0-1 1v1.128a2.251 2.251 0 1 1-1.5 0V5.372a2.25 2.25 0 1 1 1.5 0v1.836A2.5 2.5 0 0 1 6 7h4a1 1 0 0 0 1-1v-.628A2.25 2.25 0 0 1 9.5 3.25m-6 0a.75.75 0 1 0 1.5 0a.75.75 0 0 0-1.5 0m8.25-.75a.75.75 0 1 0 0 1.5a.75.75 0 0 0 0-1.5M4.25 12a.75.75 0 1 0 0 1.5a.75.75 0 0 0 0-1.5'/%3E%3C/svg%3E");-webkit-mask:var(--un-icon) no-repeat;mask:var(--un-icon) no-repeat;-webkit-mask-size:100% 100%;mask-size:100% 100%;background-color:currentColor;color:inherit;display:inline-flex;width:1em;height:1em}.i-pajamas\:issue-type-maintenance{--un-icon:url("data:image/svg+xml;utf8,%3Csvg viewBox='0 0 16 16' display='inline-flex' width='1em' height='1em' xmlns='http://www.w3.org/2000/svg' %3E%3Cpath fill='currentColor' fill-rule='evenodd' d='M11.25 2.5a2.25 2.25 0 0 0-2.154 2.904l.13.43l-.317.318l-6.254 6.253l-.53-.53l.53.53a.664.664 0 0 0 .94.94L9.848 7.09l.318-.318l.43.13a2.25 2.25 0 0 0 2.685-3.124l-1.5 1.501a.75.75 0 1 1-1.061-1.06l1.5-1.5a2.24 2.24 0 0 0-.97-.22ZM7.5 4.75a3.75 3.75 0 1 1 3.114 3.696L10.061 9l.939.94l.47-.47l.53-.53l.53.53l1.875 1.875a2.164 2.164 0 1 1-3.06 3.06L9.47 12.53L8.94 12l.53-.53l.47-.47l-.94-.94l-4.345 4.345l-.53-.53l.53.53a2.164 2.164 0 1 1-3.06-3.06L5.939 7L3.5 4.56l-.617.617l-.507-.761l-1-1.5l-.341-.512l.435-.434l.5-.5l.434-.435l.512.341l1.5 1l.761.507l-.616.617L7 5.94l.554-.554A4 4 0 0 1 7.5 4.75m4.5 6.31l1.345 1.345a.664.664 0 0 1-.94.94L11.061 12z' clip-rule='evenodd'/%3E%3C/svg%3E");-webkit-mask:var(--un-icon) no-repeat;mask:var(--un-icon) no-repeat;-webkit-mask-size:100% 100%;mask-size:100% 100%;background-color:currentColor;color:inherit;display:inline-flex;width:1em;height:1em}.i-prime\:clone{--un-icon:url("data:image/svg+xml;utf8,%3Csvg viewBox='0 0 24 24' display='inline-flex' width='1em' height='1em' xmlns='http://www.w3.org/2000/svg' %3E%3Cpath fill='currentColor' d='M14 16.75H6A2.75 2.75 0 0 1 3.25 14V6A2.75 2.75 0 0 1 6 3.25h8A2.75 2.75 0 0 1 16.75 6v8A2.75 2.75 0 0 1 14 16.75m-8-12A1.25 1.25 0 0 0 4.75 6v8A1.25 1.25 0 0 0 6 15.25h8A1.25 1.25 0 0 0 15.25 14V6A1.25 1.25 0 0 0 14 4.75Z'/%3E%3Cpath fill='currentColor' d='M18 20.75h-8A2.75 2.75 0 0 1 7.25 18v-2h1.5v2A1.25 1.25 0 0 0 10 19.25h8A1.25 1.25 0 0 0 19.25 18v-8A1.25 1.25 0 0 0 18 8.75h-2v-1.5h2A2.75 2.75 0 0 1 20.75 10v8A2.75 2.75 0 0 1 18 20.75'/%3E%3C/svg%3E");-webkit-mask:var(--un-icon) no-repeat;mask:var(--un-icon) no-repeat;-webkit-mask-size:100% 100%;mask-size:100% 100%;background-color:currentColor;color:inherit;display:inline-flex;width:1em;height:1em}.i-ri\:menu-fill{--un-icon:url("data:image/svg+xml;utf8,%3Csvg viewBox='0 0 24 24' display='inline-flex' width='1em' height='1em' xmlns='http://www.w3.org/2000/svg' %3E%3Cpath fill='currentColor' d='M3 4h18v2H3zm0 7h18v2H3zm0 7h18v2H3z'/%3E%3C/svg%3E");-webkit-mask:var(--un-icon) no-repeat;mask:var(--un-icon) no-repeat;-webkit-mask-size:100% 100%;mask-size:100% 100%;background-color:currentColor;color:inherit;display:inline-flex;width:1em;height:1em}.i-security\:backend{--un-icon:url("data:image/svg+xml;utf8,%3Csvg display='inline-flex' width='1em' height='1em' viewBox='0 0 14 14' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M6.82 3.283c.35.262.727.456 1.131.583.527.168.961.22 1.262.23-.026.378-.081.97-.196 1.74-.097.646-.29 1.209-.572 1.676-.293.48-.592.709-.745.802-.483.294-.852.314-.88.315-.029.001-.397-.02-.88-.315-.153-.093-.453-.321-.745-.802-.283-.466-.476-1.03-.572-1.675a22.466 22.466 0 0 1-.197-1.74 4.768 4.768 0 0 0 1.262-.23 3.769 3.769 0 0 0 1.132-.584zm0-.569s-.44.46-1.24.714a4.248 4.248 0 0 1-1.277.215c-.195 0-.303-.019-.303-.019s.008.828.226 2.288c.232 1.56.958 2.458 1.523 2.802.601.367 1.057.37 1.07.37.015 0 .47-.003 1.072-.37.564-.344 1.29-1.242 1.523-2.802.218-1.46.226-2.288.226-2.288s-.108.02-.304.02c-.272 0-.716-.038-1.275-.216-.801-.254-1.241-.714-1.241-.714z' fill='currentColor'/%3E%3Cpath d='M6.82 3.17V5.9H4.403l-.197-1.98 2.614-.75zm0 2.73v2.944l.805-.215.856-.839.464-.9.292-.99H6.82z' fill='currentColor'/%3E%3Crect x='1.5' y='1.5' rx='2' width='11' height='9.286' stroke='currentColor'/%3E%3Cpath stroke='currentColor' d='M7 11.286V13'/%3E%3Cpath d='M3.25 13h7.5' stroke='currentColor' stroke-linecap='round'/%3E%3C/svg%3E");-webkit-mask:var(--un-icon) no-repeat;mask:var(--un-icon) no-repeat;-webkit-mask-size:100% 100%;mask-size:100% 100%;background-color:currentColor;color:inherit;display:inline-flex;width:1em;height:1em}.i-security\:backup{--un-icon:url("data:image/svg+xml;utf8,%3Csvg display='inline-flex' width='1em' height='1em' xmlns='http://www.w3.org/2000/svg' x='0' y='0' viewBox='0 0 128 128' style='enable-background:new 0 0 128 128' xml:space='preserve'%3E%3Cpath d='M76.6 112H25.4c-5.2 0-9.4-4.2-9.4-9.4V40.2c0-5.2 4.2-9.4 9.4-9.4h51.2c5.2 0 9.4 4.2 9.4 9.4v2.9c0 2.1-1.7 3.7-3.7 3.7s-3.7-1.7-3.7-3.7v-2.9c0-1-.8-1.9-1.9-1.9H25.4c-1 0-1.9.8-1.9 1.9v62.4c0 1 .8 1.9 1.9 1.9h51.2c1 0 1.9-.8 1.9-1.9V82.8c0-2.1 1.7-3.7 3.7-3.7s3.7 1.7 3.7 3.7v19.8c0 5.2-4.2 9.4-9.3 9.4z' fill='currentColor'/%3E%3Cpath d='M102.6 97.2h-11c-2.1 0-3.7-1.7-3.7-3.7 0-2.1 1.7-3.7 3.7-3.7h11.1c1 0 1.9-.8 1.9-1.9V25.4c0-1-.8-1.9-1.9-1.9H51.4c-1 0-1.9.8-1.9 1.9v.7c0 2.1-1.7 3.7-3.7 3.7s-3.7-1.7-3.7-3.7v-.7c0-5.2 4.2-9.4 9.4-9.4h51.2c5.2 0 9.4 4.2 9.4 9.4v62.4c-.1 5.2-4.3 9.4-9.5 9.4z' fill='currentColor'/%3E%3Cpath d='M60 99.1c-.9 0-1.8-.3-2.5-.9L30.3 73.9c-1.5-1.4-1.6-3.8-.2-5.3l.3-.3 27.2-23.2c1.6-1.3 3.9-1.2 5.3.4.6.7.9 1.5.9 2.4v12c8.8-.9 16.9-5.2 22.6-12l8.8-10.4c1.3-1.6 3.6-1.9 5.3-.6 1.2.9 1.7 2.4 1.3 3.9L99.3 51c-3.9 17-18.2 29.5-35.5 31.1v13.3c-.1 2.1-1.8 3.7-3.8 3.7zM38.5 71.2 56.2 87v-8.5c0-2.1 1.7-3.7 3.7-3.7 13.5 0 25.2-8 30.3-20.1-7.9 8.2-18.8 12.9-30.2 12.9-2.1 0-3.7-1.7-3.7-3.7V56L38.5 71.2z' fill='currentColor'/%3E%3C/svg%3E");-webkit-mask:var(--un-icon) no-repeat;mask:var(--un-icon) no-repeat;-webkit-mask-size:100% 100%;mask-size:100% 100%;background-color:currentColor;color:inherit;display:inline-flex;width:1em;height:1em}.i-security\:feature-record{--un-icon:url("data:image/svg+xml;utf8,%3Csvg display='inline-flex' xmlns='http://www.w3.org/2000/svg' width='34px' height='34px' fill='none'%3E%3Cpath d='M0 0h34v34H0z'/%3E%3Cpath fill='currentColor' d='M7.65.17h1.744v6.474H7.65zm15.849 15.941a7.88 7.88 0 0 1 5.451 2.181 7.862 7.862 0 0 1 2.447 5.358 7.845 7.845 0 0 1-2.057 5.69 7.868 7.868 0 0 1-5.857 2.579 7.88 7.88 0 0 1-5.452-2.182 7.862 7.862 0 0 1-2.447-5.358 7.845 7.845 0 0 1 2.058-5.689 7.868 7.868 0 0 1 5.856-2.579zm0-1.741c-.15 0-.301.003-.453.01-5.329.246-9.45 4.759-9.203 10.08.239 5.17 4.511 9.2 9.641 9.2.15 0 .302-.003.453-.01 5.329-.246 9.45-4.759 9.204-10.08-.24-5.17-4.512-9.2-9.642-9.2'/%3E%3Cpath fill='currentColor' d='M16.19 31.67c-.47-.445-.897-.932-1.278-1.454H4.083a1.48 1.48 0 0 1-1.482-1.476V5.77a1.48 1.48 0 0 1 1.482-1.476h21.584a1.48 1.48 0 0 1 1.482 1.476v8.39a10.52 10.52 0 0 1 1.751.835V5.77a3.227 3.227 0 0 0-3.233-3.22H4.083A3.227 3.227 0 0 0 .85 5.77v22.97a3.227 3.227 0 0 0 3.233 3.22H16.51a10.68 10.68 0 0 1-.32-.29'/%3E%3Cpath fill='currentColor' d='M27.152 15.997a8.794 8.794 0 0 1 1.748 1.056v-.008a8.785 8.785 0 0 0-1.748-1.051zM28.785 27.2H22.32v-7.849h1.747v6.111h4.717zM5.27 11.752h19.429v1.738H5.27zM20.522.17h1.747v6.46h-1.747zm-7.559 24.457H5.27v1.738h7.95a10.49 10.49 0 0 1-.257-1.738m1.72-6.438H5.27v1.738h8.479c.255-.607.568-1.189.934-1.738'/%3E%3C/svg%3E");-webkit-mask:var(--un-icon) no-repeat;mask:var(--un-icon) no-repeat;-webkit-mask-size:100% 100%;mask-size:100% 100%;background-color:currentColor;color:inherit;display:inline-flex;width:34px;height:34px}.i-security\:feature-tips{--un-icon:url("data:image/svg+xml;utf8,%3Csvg display='inline-flex' xmlns='http://www.w3.org/2000/svg' width='34px' height='34px' fill='none'%3E%3Cpath d='M0 0h34v34H0z'/%3E%3Cpath fill='currentColor' d='M32.44 25.345a1.251 1.251 0 0 0-1.253 1.252v4.59h-4.59a1.251 1.251 0 1 0 0 2.504h5.425a1.67 1.67 0 0 0 1.669-1.67v-5.424a1.251 1.251 0 0 0-1.252-1.252M32.022.31h-5.425a1.252 1.252 0 1 0 0 2.504h4.59v4.59a1.251 1.251 0 1 0 2.504 0V1.978A1.669 1.669 0 0 0 32.02.31M1.56 8.655a1.252 1.252 0 0 0 1.252-1.252v-4.59h4.59a1.252 1.252 0 1 0 0-2.504H1.978A1.67 1.67 0 0 0 .31 1.98v5.424c0 .69.561 1.252 1.252 1.252m5.842 22.532h-4.59v-4.59a1.252 1.252 0 1 0-2.504 0v5.425c0 .92.748 1.669 1.67 1.669h5.424a1.252 1.252 0 1 0 0-2.504m8.438-17.646c0-.638.52-1.153 1.159-1.153.64 0 1.16.515 1.16 1.153v5.517A1.154 1.154 0 0 1 17 20.214a1.155 1.155 0 0 1-1.16-1.155zm0 8.276c0-.637.52-1.153 1.159-1.153a1.156 1.156 0 0 1 1.003 1.731 1.156 1.156 0 0 1-1.003.577 1.155 1.155 0 0 1-1.16-1.155m12.503 1.272c.704 1.21-.177 2.72-1.578 2.72H7.233c-1.402 0-2.283-1.51-1.578-2.72l9.767-16.773A1.808 1.808 0 0 1 17 5.41c.643 0 1.244.33 1.578.906zm-2.387.416-8.955-15.3-8.933 15.342z'/%3E%3C/svg%3E");-webkit-mask:var(--un-icon) no-repeat;mask:var(--un-icon) no-repeat;-webkit-mask-size:100% 100%;mask-size:100% 100%;background-color:currentColor;color:inherit;display:inline-flex;width:34px;height:34px}.i-security\:feature-trojan{--un-icon:url("data:image/svg+xml;utf8,%3Csvg display='inline-flex' xmlns='http://www.w3.org/2000/svg' width='34px' height='34px' fill='none'%3E%3Cpath d='M0 0h34v34H0z'/%3E%3Cpath fill='currentColor' d='M1.062 27.228a.662.662 0 0 1 .718.607v3.426a.81.81 0 0 0 .792.792H4.67a.68.68 0 0 1 .718.644v.074a.758.758 0 0 1-.718.718h-2.1a2.248 2.248 0 0 1-2.228-2.228v-3.297a.68.68 0 0 1 .626-.736zm31.71 0a.68.68 0 0 1 .717.644v3.407a2.257 2.257 0 0 1-2.228 2.21h-2.1a.68.68 0 0 1-.717-.644v-.074a.68.68 0 0 1 .644-.718h2.173a.81.81 0 0 0 .792-.792v-3.297a.665.665 0 0 1 .59-.736zM20.304 3.656c1.951.57 8.212 3.02 7.365 10.239 0 .865-.147 1.841-.147 3.02v3.168a2.513 2.513 0 0 1-2.339 2.67h-.847v.331a9.968 9.968 0 0 0 .369 3.039c.22.902 0 1.86-.59 2.596a3.289 3.289 0 0 1-2.449 1.142h-9.723c-1.73.019-3.13-1.38-3.148-3.112 0-.387.073-.755.202-1.123a12.36 12.36 0 0 1 2.652-4.052 6.07 6.07 0 0 0 1.454-3.241c-.405.092-.791.24-1.16.424l-2.67 1.841a2.19 2.19 0 0 1-2.799-.368l-1.38-1.473a1.837 1.837 0 0 1-.203-2.302l6.04-9.484a3.907 3.907 0 0 1 1.841-1.603c.774-.534 1.62-.976 2.486-1.344a8.038 8.038 0 0 1 5.046-.368M13.62 6.602h-.092c-.552.203-.994.608-1.289 1.105l-5.027 7.827a.666.666 0 0 1 .331.81.71.71 0 0 1-.644.497H6.42l-.313.516c-.129.129-.147.332-.037.46 0 .019.019.019.037.037l1.363 1.437c.276.257.681.331 1.013.147l2.67-1.731a6.135 6.135 0 0 1 2.301-.866 4.164 4.164 0 0 0 2.892-1.583 2.477 2.477 0 0 0 .276-1.842.708.708 0 0 1 .626-.792.73.73 0 0 1 .755.442 4.524 4.524 0 0 1-.46 3.02 5.071 5.071 0 0 1-3.02 1.952 6.918 6.918 0 0 1-1.713 4.402 9.385 9.385 0 0 0-2.45 3.683 1.419 1.419 0 0 0 .222 1.51c.313.479.865.755 1.436.718h9.723a1.526 1.526 0 0 0 1.307-.644c.295-.387.405-.884.277-1.363a12.07 12.07 0 0 1-.277-3.978c.921-11.528 0-12.246-2.817-14.18a11.51 11.51 0 0 0-5.524-1.657 2.695 2.695 0 0 0-1.087.073m2.652-1.436h-.258a11.33 11.33 0 0 1 4.935 1.841c3.204 2.229 4.309 3.684 3.554 14.273h.552c.645 0 1.16-.516 1.16-1.16v-3.205c0-1.234 0-2.228.148-3.167.202-2.026 0-6.851-6.427-8.73a6.699 6.699 0 0 0-3.664.148m-3.315 5.525c.276.257.35.662.147.994l-.515.663a.644.644 0 0 1-.57.276 1.252 1.252 0 0 1-.443-.147.769.769 0 0 1-.22-1.05c0-.018.018-.018.036-.037l.497-.663a.794.794 0 0 1 1.068-.073zM4.671.34a.68.68 0 0 1 .718.644v.074a.708.708 0 0 1-.718.718h-2.1a.81.81 0 0 0-.791.792v3.683a.68.68 0 0 1-.645.719h-.073a.68.68 0 0 1-.719-.645V2.569A2.248 2.248 0 0 1 2.572.341zm26.59 0a2.248 2.248 0 0 1 2.228 2.228v3.683a.68.68 0 0 1-.644.719h-.074a.68.68 0 0 1-.718-.645V2.569a.81.81 0 0 0-.792-.792h-2.1a.68.68 0 0 1-.717-.644v-.074a.68.68 0 0 1 .644-.718z'/%3E%3Cpath fill='currentColor' d='M31.334 33.66H29.23a.78.78 0 0 1-.812-.74v-.073c-.037-.425.277-.775.701-.812h2.215a.726.726 0 0 0 .702-.702V28.03a.82.82 0 0 1 .812-.812.82.82 0 0 1 .812.812v3.323a2.348 2.348 0 0 1-2.326 2.307m-2.104-1.44a.622.622 0 0 0-.628.627c0 .35.277.628.628.628h2.104a2.144 2.144 0 0 0 2.234-2.05V28.03a.622.622 0 0 0-.628-.627.622.622 0 0 0-.627.627v3.323a.924.924 0 0 1-.886.886zM4.68 33.66H2.577a2.347 2.347 0 0 1-2.233-2.327V28.03a.75.75 0 0 1 .701-.812h.111a.75.75 0 0 1 .812.702v3.433a.726.726 0 0 0 .702.701H4.68c.424-.037.775.277.812.702v.11a.816.816 0 0 1-.812.794M.99 27.382a.584.584 0 0 0-.629.554v3.396a2.145 2.145 0 0 0 2.05 2.234h2.27c.35 0 .627-.277.627-.628a.584.584 0 0 0-.553-.627H2.576a.924.924 0 0 1-.886-.886v-3.397a.585.585 0 0 0-.535-.646zm20.654 2.585h-9.672a3.254 3.254 0 0 1-3.249-3.25c0-.387.074-.756.203-1.125a12.098 12.098 0 0 1 2.695-4.08 6.563 6.563 0 0 0 1.403-3.064c-.35.11-.683.277-.997.461l-2.676 1.736a2.285 2.285 0 0 1-2.935-.388L5.05 18.8a1.95 1.95 0 0 1-.24-2.4l6.073-9.47a4.094 4.094 0 0 1 1.846-1.642 13.994 13.994 0 0 1 2.436-1.422 8.214 8.214 0 0 1 5.113-.295c1.975.59 8.325 3.046 7.512 10.356 0 .904-.147 1.846-.147 3.027v3.175c.11 1.421-.96 2.658-2.4 2.769h-.794v.24c-.018 1.033.111 2.049.388 3.045.24.905.055 1.846-.498 2.603a3.312 3.312 0 0 1-2.621 1.181zm-8.38-11.777v.129a6.14 6.14 0 0 1-1.477 3.304 12.235 12.235 0 0 0-2.658 4.024 3.07 3.07 0 0 0 1.68 4.006c.369.147.775.221 1.163.221h9.746a3.257 3.257 0 0 0 2.4-1.126c.553-.701.756-1.624.553-2.51a9.763 9.763 0 0 1-.332-3.101v-.425h.738a2.336 2.336 0 0 0 1.846-.757c.48-.498.72-1.163.664-1.846v-3.156c0-1.145 0-2.141.148-3.046.794-7.162-5.537-9.58-7.383-10.152a8.062 8.062 0 0 0-5.02.277c-.85.387-1.662.867-2.419 1.42a3.782 3.782 0 0 0-1.846 1.588l-6.091 9.451c-.48.72-.406 1.68.203 2.308l1.366 1.44a2.108 2.108 0 0 0 2.695.332l2.676-1.772c.37-.222.757-.406 1.182-.517zm8.564 10.263h-9.782a1.88 1.88 0 0 1-1.514-.757 1.5 1.5 0 0 1-.24-1.514 9.453 9.453 0 0 1 2.418-3.691 6.934 6.934 0 0 0 1.717-4.412 4.849 4.849 0 0 0 2.971-1.846 4.233 4.233 0 0 0 .443-2.954.57.57 0 0 0-.277-.406.508.508 0 0 0-.46 0 .533.533 0 0 0-.352.388 2.517 2.517 0 0 1-.295 1.957 4.266 4.266 0 0 1-2.953 1.624 5.838 5.838 0 0 0-2.27.85l-2.677 1.734c-.37.203-.812.13-1.126-.147L6.047 17.82a.457.457 0 0 1 0-.627l.35-.554.314.092h.203a.572.572 0 0 0 .554-.443.555.555 0 0 0-.277-.683l4.984-7.882a2.66 2.66 0 0 1 1.273-1.107h.13c.35-.11.72-.166 1.089-.13 1.956.074 3.876.647 5.537 1.68 2.769 1.957 3.802 2.695 2.861 14.306-.13 1.33-.037 2.658.277 3.95a1.514 1.514 0 0 1-.314 1.44c-.295.37-.757.59-1.236.59zm-7.124-10.337a7.277 7.277 0 0 1-1.846 4.448v.093a8.99 8.99 0 0 0-2.381 3.525 1.33 1.33 0 0 0 .203 1.422c.295.443.83.72 1.366.683h9.746c.48.018.94-.203 1.218-.61.295-.35.406-.83.295-1.292a11.704 11.704 0 0 1-.295-4.005c.923-11.5 0-12.22-2.788-14.14a11.074 11.074 0 0 0-5.537-1.643 2.373 2.373 0 0 0-1.015.13h-.092a2.438 2.438 0 0 0-1.237.996l-4.984 7.827a.758.758 0 0 1 .37.868.787.787 0 0 1-.739.553H6.49l-.296.443c-.11.093-.11.259-.018.37l.018.018 1.366 1.458c.24.24.61.277.905.111l2.658-1.717a6.047 6.047 0 0 1 2.344-.886 4.07 4.07 0 0 0 2.842-1.661 2.483 2.483 0 0 0 .277-1.846.634.634 0 0 1 0-.628.917.917 0 0 1 .536-.369.705.705 0 0 1 .609 0c.203.111.332.314.369.536a4.42 4.42 0 0 1-.443 3.1 5.098 5.098 0 0 1-2.99 2.216zm10.447 3.34h-.646v-.11c.775-10.78-.443-12.072-3.526-14.213a11.532 11.532 0 0 0-4.91-1.846v-.111l.277-.092a6.96 6.96 0 0 1 3.692 0c6.516 1.846 6.7 6.83 6.497 8.842 0 .941-.147 1.956-.147 3.175v3.174c-.037.683-.591 1.2-1.274 1.182zm-.462-.184h.462c.59 0 1.07-.48 1.07-1.07v-3.25c0-1.217 0-2.251.148-3.192.203-1.976 0-6.775-6.368-8.64a6.72 6.72 0 0 0-3.526 0c1.643.222 3.23.831 4.615 1.754 3.083 2.29 4.338 3.6 3.563 14.398zm-12.643-8.565a1.12 1.12 0 0 1-.48-.147.935.935 0 0 1-.314-.554.853.853 0 0 1 .166-.59l.498-.665a.877.877 0 0 1 1.145-.148c.35.258.443.757.203 1.126l-.517.665a.736.736 0 0 1-.701.313m.516-2.067a.67.67 0 0 0-.516.221l-.499.665a.595.595 0 0 0-.129.461.6.6 0 0 0 .222.407c.11.073.258.11.387.129a.533.533 0 0 0 .498-.24l.517-.665a.703.703 0 0 0-.129-.867.608.608 0 0 0-.35-.111m20.304-3.563a.78.78 0 0 1-.812-.738V2.574a.726.726 0 0 0-.701-.701H29.23a.78.78 0 0 1-.812-.738V1.06a.777.777 0 0 1 .812-.72h2.104a2.364 2.364 0 0 1 2.326 2.326v3.691a.777.777 0 0 1-.812.72zM29.175.433a.584.584 0 0 0-.628.554v.074a.584.584 0 0 0 .554.627h2.178c.48.019.868.406.886.886v3.692c0 .35.277.628.627.628.351 0 .628-.277.628-.628V2.574c0-1.181-.96-2.14-2.141-2.14zM1.063 7.078a.777.777 0 0 1-.72-.812V2.574A2.33 2.33 0 0 1 2.576.341h2.105a.78.78 0 0 1 .812.738v.074a.82.82 0 0 1-.812.812H2.576a.726.726 0 0 0-.7.702v3.691a.75.75 0 0 1-.795.72zM2.576.433c-1.18 0-2.14.96-2.14 2.141v3.692a.584.584 0 0 0 .553.628h.074a.584.584 0 0 0 .627-.554V2.574a.924.924 0 0 1 .886-.886h2.105c.35 0 .627-.277.627-.627a.584.584 0 0 0-.553-.628z'/%3E%3C/svg%3E");-webkit-mask:var(--un-icon) no-repeat;mask:var(--un-icon) no-repeat;-webkit-mask-size:100% 100%;mask-size:100% 100%;background-color:currentColor;color:inherit;display:inline-flex;width:34px;height:34px}.i-security\:filescan{--un-icon:url("data:image/svg+xml;utf8,%3Csvg display='inline-flex' width='1em' height='1em' xmlns='http://www.w3.org/2000/svg' viewBox='0 0 128 128' style='enable-background:new 0 0 128 128' xml:space='preserve'%3E%3Cpath class='st0' d='M36.8 46.8h20.6c1.9 0 3.4-1.5 3.4-3.4S59.3 40 57.4 40H36.8c-1.9 0-3.4 1.5-3.4 3.4s1.5 3.4 3.4 3.4z' fill='currentColor'/%3E%3Cpath class='st0' d='M88.4 105.2H30.1c-1.9 0-3.4-1.5-3.4-3.4V26.3c0-1.9 1.5-3.4 3.4-3.4h41.2V40c0 3.8 3.1 6.9 6.9 6.9h17.2V64c0 1.9 1.5 3.4 3.4 3.4s3.4-1.5 3.4-3.4V38.1c0-.9-.4-1.8-1-2.4L82.6 17c-.6-.6-1.5-1-2.4-1H26.6c-3.8 0-6.9 3.1-6.9 6.9v82.3c0 3.8 3.1 6.9 6.9 6.9h61.8c1.9 0 3.4-1.5 3.4-3.4s-1.5-3.5-3.4-3.5zM78.1 22.8 95.3 40H81.5c-1.9 0-3.4-1.5-3.4-3.4V22.8z' fill='currentColor'/%3E%3Cpath class='st0' d='M36.8 81.2c-1.9 0-3.4 1.5-3.4 3.4s1.5 3.4 3.4 3.4h34.4c1.9 0 3.4-1.5 3.4-3.4s-1.5-3.4-3.4-3.4H36.8zM81.4 64c0-1.9-1.5-3.4-3.4-3.4H36.8c-1.9 0-3.4 1.5-3.4 3.4s1.5 3.4 3.4 3.4H78c1.9 0 3.4-1.5 3.4-3.4zm20.8 37.8c-2 0-3.6-1.5-3.9-3.4l-2.2-17.2c-.5-3.6 2.4-6.8 6-6.8s6.5 3.2 6 6.8L106 98.4c-.2 2-1.9 3.4-3.8 3.4zm-3.5 6.7c0 1.9 1.5 3.4 3.4 3.4s3.4-1.5 3.4-3.4-1.5-3.4-3.4-3.4c-1.8 0-3.4 1.5-3.4 3.4z' fill='currentColor'/%3E%3C/svg%3E");-webkit-mask:var(--un-icon) no-repeat;mask:var(--un-icon) no-repeat;-webkit-mask-size:100% 100%;mask-size:100% 100%;background-color:currentColor;color:inherit;display:inline-flex;width:1em;height:1em}.i-security\:ftps{--un-icon:url("data:image/svg+xml;utf8,%3Csvg display='inline-flex' width='1em' height='1em' viewBox='0 0 14 14' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M2.082 9.897c.23.356.502.687.814.992.168.164.43.164.598 0a.404.404 0 0 0 0-.585 4.887 4.887 0 0 1-1.197-1.856h1.662V9.69c0 .231.186.414.423.414a.414.414 0 0 0 .423-.414V8.448h1.69V9.69c0 .231.187.414.424.414a.414.414 0 0 0 .422-.414V8.448h1.691V9.69c0 .231.186.414.423.414a.414.414 0 0 0 .423-.414V8.448h1.988a5.078 5.078 0 0 1-.49.992c-.2.31-.436.598-.707.864a.404.404 0 0 0 0 .585c.167.164.43.164.597 0A5.713 5.713 0 0 0 13 6.793a5.701 5.701 0 0 0-1.734-4.096 5.896 5.896 0 0 0-2.985-1.578A6.046 6.046 0 0 0 7.08 1a6.046 6.046 0 0 0-2.227.424A5.9 5.9 0 0 0 2.08 3.688a5.706 5.706 0 0 0 0 6.21zm10.003-2.276a4.89 4.89 0 0 0-.093-2.082v.427H9.878V7.62h2.207zm-3.053 0V5.966h-1.69V7.62h1.69zm-2.536 0V5.966H4.805V7.62h1.69zm-2.537 0V5.966H2.078a4.896 4.896 0 0 0 0 1.655h1.881zM2.297 5.138h1.662v-2.26a5.13 5.13 0 0 0-1.172 1.268 4.887 4.887 0 0 0-.49.992zm2.508-2.784v2.784h1.69V1.86a5.096 5.096 0 0 0-1.69.494zm2.536-.52v3.304h1.691V2.242c-.284-.113-.617-.25-.913-.311a5.143 5.143 0 0 0-.778-.097zm2.537.814c.282.183.546.394.79.634a4.904 4.904 0 0 1 1.198 1.856H9.878v-2.49z' fill='currentColor' fill-rule='evenodd'/%3E%3Cpath d='M9.455 11.345H5.228a.841.841 0 0 0-.736.414H1v.827h3.492a.841.841 0 0 0 .736.414h4.227a.841.841 0 0 0 .736-.414h2.646v-.827h-2.646a.841.841 0 0 0-.736-.414z' clip-rule='evenodd' fill='currentColor' fill-rule='evenodd'/%3E%3C/svg%3E");-webkit-mask:var(--un-icon) no-repeat;mask:var(--un-icon) no-repeat;-webkit-mask-size:100% 100%;mask-size:100% 100%;background-color:currentColor;color:inherit;display:inline-flex;width:1em;height:1em}.i-security\:malicious-scan{--un-icon:url("data:image/svg+xml;utf8,%3Csvg display='inline-flex' xmlns='http://www.w3.org/2000/svg' width='60px' height='60px' fill='none'%3E%3Cpath d='M0 0h60v60H0z'/%3E%3Cpath fill='currentColor' d='M57.246 44.727a2.209 2.209 0 0 0-2.21 2.21v8.1h-8.1a2.21 2.21 0 1 0 0 4.418h9.573a2.945 2.945 0 0 0 2.946-2.946v-9.573a2.209 2.209 0 0 0-2.21-2.209M56.51.545h-9.573a2.21 2.21 0 1 0 0 4.419h8.1v8.1a2.208 2.208 0 1 0 4.419 0V3.49A2.945 2.945 0 0 0 56.509.545M2.755 15.273a2.21 2.21 0 0 0 2.209-2.21v-8.1h8.1a2.209 2.209 0 0 0 0-4.418H3.49A2.945 2.945 0 0 0 .545 3.491v9.573c0 1.219.99 2.209 2.21 2.209m10.309 39.763h-8.1v-8.1a2.209 2.209 0 1 0-4.419 0v9.573a2.947 2.947 0 0 0 2.946 2.946h9.573a2.208 2.208 0 1 0 0-4.419m14.89-31.14c0-1.126.917-2.034 2.046-2.034 1.13 0 2.045.908 2.045 2.034v9.737A2.037 2.037 0 0 1 30 35.67a2.038 2.038 0 0 1-2.045-2.037zm0 14.605A2.04 2.04 0 0 1 30 36.466c1.13 0 2.045.911 2.045 2.035A2.04 2.04 0 0 1 30 40.538a2.04 2.04 0 0 1-2.045-2.037m22.064 2.244c1.244 2.136-.31 4.8-2.784 4.8h-34.47c-2.474 0-4.029-2.664-2.785-4.8l17.237-29.599A3.19 3.19 0 0 1 30 9.546a3.2 3.2 0 0 1 2.785 1.598zm-4.21.734-15.805-27-15.764 27.074z'/%3E%3C/svg%3E");-webkit-mask:var(--un-icon) no-repeat;mask:var(--un-icon) no-repeat;-webkit-mask-size:100% 100%;mask-size:100% 100%;background-color:currentColor;color:inherit;display:inline-flex;width:60px;height:60px}.i-security\:overview{--un-icon:url("data:image/svg+xml;utf8,%3Csvg display='inline-flex' xmlns='http://www.w3.org/2000/svg' width='25px' height='25px' fill='none'%3E%3Cpath d='M0 0h25v25H0z'/%3E%3Cpath fill='currentColor' d='M3.125 11.458h8.333V3.125H3.125zm2.083-6.25h4.167v4.167H5.208zm17.696 2.117-5.218-5.219-5.246 5.246 5.219 5.218zm-5.218-2.273 2.272 2.273-2.3 2.299-2.272-2.272zM3.125 21.875h8.333v-8.333H3.125zm2.083-6.25h4.167v4.167H5.208zm8.334 6.25h8.333v-8.333h-8.333zm2.083-6.25h4.167v4.167h-4.167z'/%3E%3C/svg%3E");-webkit-mask:var(--un-icon) no-repeat;mask:var(--un-icon) no-repeat;-webkit-mask-size:100% 100%;mask-size:100% 100%;background-color:currentColor;color:inherit;display:inline-flex;width:25px;height:25px}.i-security\:php{--un-icon:url("data:image/svg+xml;utf8,%3Csvg display='inline-flex' xmlns='http://www.w3.org/2000/svg' width='60px' height='60px' fill='none'%3E%3Cpath d='M0 0h60v60H0z'/%3E%3Cpath fill='currentColor' d='M30.499 13.083c3.4 0 6.739.894 9.683 2.59a19.35 19.35 0 0 1 7.089 7.077 19.308 19.308 0 0 1 2.594 9.667v21.747l4.842.003V59H6.291v-4.833l4.841-.003V32.417c0-3.394.895-6.728 2.595-9.667a19.35 19.35 0 0 1 7.089-7.076 19.393 19.393 0 0 1 9.683-2.59m0 4.834c-2.488 0-4.935.638-7.105 1.852a14.514 14.514 0 0 0-5.29 5.086 14.482 14.482 0 0 0-2.12 7.018l-.01.544-.003 21.75h29.05l.003-21.75a14.48 14.48 0 0 0-1.946-7.25 14.512 14.512 0 0 0-5.317-5.308 14.545 14.545 0 0 0-7.262-1.942m3.781 7.832-2.905 9.805h7.112L26.458 48.676l3.02-9.887h-6.912l11.717-13.04zM51.577 7.958 55 11.375l-6.846 6.834-3.423-3.417zm-42.156 0 6.846 6.834-3.423 3.417L6 11.375l3.423-3.417zM32.92 1v9.667h-4.842V1z'/%3E%3C/svg%3E");-webkit-mask:var(--un-icon) no-repeat;mask:var(--un-icon) no-repeat;-webkit-mask-size:100% 100%;mask-size:100% 100%;background-color:currentColor;color:inherit;display:inline-flex;width:60px;height:60px}.i-security\:sql{--un-icon:url("data:image/svg+xml;utf8,%3Csvg display='inline-flex' xmlns='http://www.w3.org/2000/svg' width='60px' height='60px' fill='none'%3E%3Cpath d='M0 0h60v60H0z'/%3E%3Cpath fill='currentColor' d='M32.37 53.4a1.687 1.687 0 0 1-1.084.393l-.06-.002h.004c-.87 0-1.637-.607-2.302-1.837l-2.214 1.339v.012c.52 1.034 1.146 1.79 1.877 2.277.735.482 1.59.72 2.575.72 1.265 0 2.29-.369 3.075-1.112a3.705 3.705 0 0 0 1.175-2.71l-.002-.118v-.033c0-.573-.122-1.117-.341-1.608l.01.025c-.3-.6-.68-1.113-1.135-1.549l-.002-.002c-.217-.22-.825-.755-1.828-1.595-1.077-.913-1.724-1.506-1.932-1.78a1.069 1.069 0 0 1-.238-.664c0-.235.113-.447.333-.63a1.283 1.283 0 0 1 .85-.278h-.002c.712 0 1.411.479 2.098 1.435l1.947-1.73c-.717-.847-1.396-1.434-2.016-1.746a4.238 4.238 0 0 0-1.967-.479h-.01l-.105-.002a3.798 3.798 0 0 0-2.608 1.033l.001-.001a3.256 3.256 0 0 0-1.098 2.444v.034-.002c0 .67.217 1.339.66 2.006.438.67 1.417 1.62 2.923 2.854.791.652 1.304 1.129 1.533 1.447a1.572 1.572 0 0 1 .352.94v.003c0 .348-.157.652-.465.913zm16.204-9.55a6.855 6.855 0 0 0-4.98-2.134h-.09.006a7.03 7.03 0 0 0-3.613.982 7.178 7.178 0 0 0-3.61 6.222v.09-.005c0 1.985.681 3.7 2.059 5.14 1.377 1.433 3.11 2.154 5.19 2.154 1.242 0 2.367-.277 3.385-.834l1.225 1.586h3.128l-2.41-3.122c1.216-1.364 1.828-2.985 1.828-4.87 0-2.05-.703-3.788-2.12-5.208zm-1.36 7.944-1.256-1.617h-3.14l2.476 3.203a4.486 4.486 0 0 1-1.801.37 4.554 4.554 0 0 1-2.915-1.049l.007.006c-1.095-.905-1.651-2.12-1.651-3.658 0-1.378.443-2.512 1.316-3.405.872-.894 1.955-1.346 3.25-1.346 1.259 0 2.327.46 3.214 1.377.887.92 1.334 2.033 1.334 3.354a4.88 4.88 0 0 1-.834 2.768zm7.632-9.73h-2.637V55.95h6.48v-2.52h-3.845V42.067zM30.499 34.96c8.947 0 18.33-1.629 23.7-4.474v5.678h.009c.065 1.066 1.042 1.911 2.232 1.911 1.194 0 2.164-.847 2.233-1.91h.009v-24.37c0-13.406-56.345-13.406-56.345 0v36.57c0 5.34 9.652 8.757 20.772 9.808.088.014.192.025.298.026h.002l.122.013v-.013c1.217-.02 2.194-.92 2.194-2.032 0-1.122-1.004-2.03-2.238-2.03h-.057c-10.738-.99-16.62-4.083-16.62-5.777v-6.104c3.861 2.042 9.808 3.458 16.168 4.092.152.032.329.052.507.052h.044c1.217-.018 2.194-.917 2.194-2.03 0-1.125-1.003-2.033-2.238-2.033h-.092c-10.715-1-16.593-4.083-16.593-5.773v-6.096c5.36 2.858 14.751 4.488 23.695 4.488zm23.778-10.972c0 2.441-8.492 6.498-23.695 6.498-15.204 0-23.7-4.057-23.7-6.095v-6.099c5.363 2.846 14.75 4.474 23.7 4.474 8.944 0 18.33-1.628 23.695-4.474v5.691zM30.499 5.696c15.203 0 23.7 4.062 23.7 6.09 0 2.033-8.497 6.098-23.7 6.098-15.204 0-23.7-4.062-23.7-6.098-.004-2.02 8.496-6.087 23.7-6.087z'/%3E%3C/svg%3E");-webkit-mask:var(--un-icon) no-repeat;mask:var(--un-icon) no-repeat;-webkit-mask-size:100% 100%;mask-size:100% 100%;background-color:currentColor;color:inherit;display:inline-flex;width:60px;height:60px}.i-security\:time{--un-icon:url("data:image/svg+xml;utf8,%3Csvg display='inline-flex' xmlns='http://www.w3.org/2000/svg' width='60px' height='60px' fill='none'%3E%3Cpath d='M0 0h60v60H0z'/%3E%3Cpath fill='currentColor' d='M5 33.386c0-5.198 1.705-10.262 4.87-14.467s7.629-7.335 12.75-8.942a26.374 26.374 0 0 1 15.76 0c5.121 1.607 9.585 4.737 12.75 8.942 3.165 4.205 4.87 9.27 4.87 14.467 0 5.198-1.705 10.263-4.87 14.468s-7.629 7.335-12.75 8.941a26.373 26.373 0 0 1-15.76 0C17.5 55.19 13.035 52.06 9.87 47.854 6.705 43.649 5 38.584 5 33.386m25.5-19.432c-4.251 0-8.394 1.3-11.833 3.712-3.44 2.412-6 5.813-7.313 9.716a18.79 18.79 0 0 0 0 12.01c1.314 3.902 3.874 7.303 7.313 9.715 3.44 2.412 7.582 3.711 11.833 3.711s8.394-1.299 11.833-3.711c3.44-2.412 6-5.813 7.313-9.716a18.79 18.79 0 0 0 0-12.01c-1.313-3.902-3.873-7.303-7.313-9.715-3.44-2.412-7.582-3.712-11.833-3.712M18.421 3.592c0-.455.124-.902.36-1.296a2.64 2.64 0 0 1 .982-.948c.408-.227.871-.347 1.342-.347h18.79a2.75 2.75 0 0 1 1.577.495c.458.322.8.775.974 1.296.175.52.175 1.08 0 1.6s-.516.974-.974 1.296a2.75 2.75 0 0 1-1.577.495h-18.79c-.47 0-.934-.12-1.342-.347a2.64 2.64 0 0 1-.982-.949 2.522 2.522 0 0 1-.36-1.295'/%3E%3Cpath fill='currentColor' d='M51.217 8.783a2.667 2.667 0 0 1 0 3.776l-4 3.999a2.67 2.67 0 1 1-3.775-3.775l4-4a2.666 2.666 0 0 1 3.775 0m-20.55 9.887a2.666 2.666 0 0 1 2.665 2.666v11.998a2.666 2.666 0 0 1-5.332 0V21.336a2.666 2.666 0 0 1 2.666-2.666'/%3E%3C/svg%3E");-webkit-mask:var(--un-icon) no-repeat;mask:var(--un-icon) no-repeat;-webkit-mask-size:100% 100%;mask-size:100% 100%;background-color:currentColor;color:inherit;display:inline-flex;width:60px;height:60px}.i-security\:webhorse{--un-icon:url("data:image/svg+xml;utf8,%3Csvg display='inline-flex' width='1em' height='1em' viewBox='0 0 14 14' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M8.518 10.297a2.1 2.1 0 0 1 2.096-2.105 2.1 2.1 0 0 1 2.095 2.105c0 .675-.315 1.275-.806 1.66L13 13.611l-.581.389-1.134-1.708a2.1 2.1 0 0 1-2.767-1.995zm.699 0a1.4 1.4 0 0 1 1.397-1.403 1.4 1.4 0 0 1 1.397 1.403 1.4 1.4 0 0 1-1.397 1.403 1.4 1.4 0 0 1-1.397-1.403z' clip-rule='evenodd' fill='currentColor' fill-rule='evenodd'/%3E%3Cpath d='M5.927 3.43a.226.226 0 0 0 .227-.224.228.228 0 0 0-.234-.218.226.226 0 0 0-.23.222c0 .058.026.115.07.156a.236.236 0 0 0 .163.064h.004zM4.438 9.014a.317.317 0 0 0 .074.356.353.353 0 0 0 .373.07.325.325 0 0 0 .21-.302.317.317 0 0 0-.098-.23.338.338 0 0 0-.242-.094.34.34 0 0 0-.317.2zm2.724-1.021h.007-.007zm-.244-2.12c-.001-.845-.716-1.528-1.599-1.53-.882 0-1.598.684-1.598 1.53 0 .843.715 1.528 1.598 1.528.884 0 1.599-.685 1.599-1.529z' fill='currentColor'/%3E%3Cpath d='M7.323 10.503a4.28 4.28 0 0 1-.497.03c-1.409-.004-2.72-.697-3.471-1.839a3.789 3.789 0 0 1-.236-3.789l.313-.52c1.102-1.546 3.19-2.135 4.992-1.408 1.695.684 2.696 2.355 2.485 4.076.255.07.497.172.72.3.017-.1.03-.201.04-.303h.5a.48.48 0 0 0 .433-.22.438.438 0 0 0 0-.467.48.48 0 0 0-.433-.22h-.506a4.475 4.475 0 0 0-.377-1.396l.607-.336.012-.007a.44.44 0 0 0 .17-.615.483.483 0 0 0-.643-.162.02.02 0 0 0-.011 0l-.596.327a4.744 4.744 0 0 0-1.184-1.15l.315-.523c.093-.14.1-.317.016-.463a.474.474 0 0 0-.417-.233.477.477 0 0 0-.413.241.02.02 0 0 0 0 .012l-.31.52a4.948 4.948 0 0 0-1.58-.399v-.505A.465.465 0 0 0 6.778 1a.465.465 0 0 0-.475.454v.512a4.993 4.993 0 0 0-1.476.39l-.316-.523a.476.476 0 0 0-.413-.242.473.473 0 0 0-.417.233.434.434 0 0 0 .016.463l.316.518A4.74 4.74 0 0 0 2.846 3.92l-.516-.292a.492.492 0 0 0-.484-.016.447.447 0 0 0-.243.4.451.451 0 0 0 .252.394l.523.292a4.41 4.41 0 0 0-.401 1.435h-.528A.463.463 0 0 0 1 6.587c0 .241.197.44.449.454h.534c.042.45.155.895.335 1.313l-.577.32a.45.45 0 0 0-.252.396.445.445 0 0 0 .243.399.49.49 0 0 0 .484-.016l.546-.31c.274.4.61.757.997 1.06l-.37.618a.443.443 0 0 0 .171.62.486.486 0 0 0 .649-.164l.34-.564c.55.28 1.15.455 1.769.518v.483h-.009a.46.46 0 0 0 .469.424.46.46 0 0 0 .468-.424v-.476a4.73 4.73 0 0 0 .395-.048 2.716 2.716 0 0 1-.318-.687z' fill='currentColor'/%3E%3Cpath d='M7.219 9.957a2.683 2.683 0 0 1 .504-1.806 1.055 1.055 0 0 0-.558-.158 1.029 1.029 0 0 0-.951.603.953.953 0 0 0 .218 1.073c.21.203.498.304.787.288zm.977-5.748a.28.28 0 0 0-.288.27.278.278 0 0 0 .28.277.28.28 0 0 0 .286-.274h.005a.278.278 0 0 0-.283-.273zm1.012 1.593c-.458.004-.828.361-.826.8.002.28.154.524.383.665a3 3 0 0 1 1.195-.314.77.77 0 0 0 .088-.355c-.005-.441-.379-.795-.84-.796z' fill='currentColor'/%3E%3C/svg%3E");-webkit-mask:var(--un-icon) no-repeat;mask:var(--un-icon) no-repeat;-webkit-mask-size:100% 100%;mask-size:100% 100%;background-color:currentColor;color:inherit;display:inline-flex;width:1em;height:1em}.i-security\:webscan{--un-icon:url("data:image/svg+xml;utf8,%3Csvg display='inline-flex' width='1em' height='1em' xmlns='http://www.w3.org/2000/svg' viewBox='0 0 128 128' style='enable-background:new 0 0 128 128' xml:space='preserve'%3E%3Cpath d='M108.1 81.3c2.2 0 4 1.8 3.9 4V98c0 7.3-6.4 14-13.2 14H29.2c-6.9 0-13.2-6.8-13.2-14V85.5c0-2.1 2-4.2 3.9-4.2 2 0 3.9 2.1 3.9 4.2V98c0 3.1 2.4 5.7 5.4 5.7h69.6c2.9 0 5.4-2.6 5.4-5.7V85.5c-.1-2.1 1.9-4.2 3.9-4.2zM69.2 41l.8.1c2.4 1.1 3.6 3.3 3 5.6L63 85.8c-1.2 2.8-3.6 3.9-5.9 2.8-2.4-1.1-3.6-3.3-3-5.6L64 44c1.1-2.2 3.5-3.3 5.9-2.8l-.7-.2zm-25 7.5c2-1 4.4-.5 5.4 1.6s.5 4.7-1.5 5.8l-12.7 7.8 12.7 7.8c2 1 2.4 3.7 1.5 5.8-1 2.1-3.4 2.6-5.4 1.6L25.6 67.3c-1-1-2-2.1-2-3.7s1-3.1 2-3.7l18.6-11.4zM79 50c1-2.1 3.4-2.6 5.4-1.6L102.9 60c1 1 2 2.1 2 3.7s-1 3.1-2 3.7L84.3 78.8c-2 1-4.4.5-5.4-1.6s-.5-4.7 1.5-5.8l12.7-7.8-12.7-7.8C78.5 54.7 78 52.1 79 50zm19.8-34.1c6.9 0 13.2 6.2 13.2 14v12.5c0 2.1-2 4.2-3.9 4.2-2 0-3.9-2.1-3.9-4.2V30c0-3.1-2.4-5.7-5.4-5.7H29.2c-2.9 0-5.4 2.6-5.4 5.7v12c0 2.1-2 4.2-3.9 4.2S16 44.1 16 42V30c0-7.3 6.4-14 13.2-14h69.6z' fill='currentColor'/%3E%3C/svg%3E");-webkit-mask:var(--un-icon) no-repeat;mask:var(--un-icon) no-repeat;-webkit-mask-size:100% 100%;mask-size:100% 100%;background-color:currentColor;color:inherit;display:inline-flex;width:1em;height:1em}.i-security\:xss{--un-icon:url("data:image/svg+xml;utf8,%3Csvg display='inline-flex' xmlns='http://www.w3.org/2000/svg' width='60px' height='60px' fill='none'%3E%3Cpath d='M0 0h60v60H0z'/%3E%3Cpath fill='currentColor' d='M55.838 19.49a26.886 26.886 0 0 0-5.893-8.582 27.439 27.439 0 0 0-8.74-5.785A27.767 27.767 0 0 0 30.5 3c-3.712 0-7.313.714-10.705 2.123a27.44 27.44 0 0 0-8.74 5.785 26.885 26.885 0 0 0-5.893 8.582A26.411 26.411 0 0 0 3 30c0 3.644.727 7.18 2.162 10.51a26.886 26.886 0 0 0 5.893 8.582 27.439 27.439 0 0 0 8.74 5.785A27.768 27.768 0 0 0 30.5 57c3.712 0 7.313-.714 10.705-2.123a27.438 27.438 0 0 0 8.74-5.785 26.885 26.885 0 0 0 5.893-8.582A26.413 26.413 0 0 0 58 30c0-3.644-.727-7.18-2.162-10.51m-23.3 2.047a129.031 129.031 0 0 0 9.145-.44c.646 2.148 1.059 4.456 1.234 6.903h-10.38zm0-4.005V8.248a21.85 21.85 0 0 1 3.887 3.387 23.558 23.558 0 0 1 3.742 5.564 129.3 129.3 0 0 1-7.63.333m-4.075-9.047v9.044a132.158 132.158 0 0 1-7.295-.319 23.592 23.592 0 0 1 3.608-5.42 21.972 21.972 0 0 1 3.687-3.305m-6.946 12.76c2.313.154 4.629.25 6.946.287V28H18.424c.175-2.442.586-4.747 1.231-6.893.602.049 1.223.095 1.862.137M14.341 28H7.163a22.494 22.494 0 0 1 2.3-8.142c1.29.223 3.364.547 6.074.852-.63 2.294-1.03 4.73-1.196 7.29m-.054 4a25.82 25.82 0 0 0 1.47 7.3c-2.807.31-4.952.645-6.278.874A22.493 22.493 0 0 1 7.163 32zm4.08 0h10.096v6.503a137.807 137.807 0 0 0-8.512.401c-.912-2.282-1.442-4.596-1.584-6.904m10.096 10.506v8.232a39.132 39.132 0 0 1-3.567-3.733 33.357 33.357 0 0 1-3.016-4.23c2.192-.144 4.387-.234 6.583-.269m4.074 8.542v-8.545c2.19.031 4.506.119 6.918.283a33.338 33.338 0 0 1-3.01 4.219 39.248 39.248 0 0 1-3.908 4.043m3.344-12.464c-1.114-.043-2.229-.072-3.344-.087V32h10.437c-.142 2.31-.673 4.628-1.587 6.913a129.247 129.247 0 0 0-5.506-.33M47.055 32h6.782a22.493 22.493 0 0 1-2.312 8.166c-1.975-.33-3.96-.61-5.95-.84A25.827 25.827 0 0 0 47.055 32M47 28c-.166-2.57-.568-5.015-1.203-7.316a117.98 117.98 0 0 0 5.744-.818A22.493 22.493 0 0 1 53.837 28zm.065-14.263c.779.765 1.503 1.583 2.167 2.447-1.59.241-3.184.449-4.782.624-1.243-2.925-2.917-5.557-4.984-7.834a26.531 26.531 0 0 0-.343-.37 23.413 23.413 0 0 1 7.942 5.133M22.407 8.405c-.18.187-.358.377-.532.569-2.073 2.283-3.75 4.923-4.994 7.857-2.06-.218-3.786-.453-5.107-.655a23.463 23.463 0 0 1 2.161-2.44 23.405 23.405 0 0 1 8.472-5.331m-8.472 37.858a23.474 23.474 0 0 1-2.137-2.409c1.434-.218 3.343-.476 5.641-.708 1.16 2.221 2.63 4.397 4.384 6.488a42.629 42.629 0 0 0 2.274 2.5 23.392 23.392 0 0 1-10.162-5.87m23.442 5.734a42.568 42.568 0 0 0 2.14-2.363c1.75-2.084 3.215-4.253 4.374-6.467 1.777.186 3.55.413 5.317.68a23.472 23.472 0 0 1-2.143 2.416 23.392 23.392 0 0 1-9.688 5.734'/%3E%3C/svg%3E");-webkit-mask:var(--un-icon) no-repeat;mask:var(--un-icon) no-repeat;-webkit-mask-size:100% 100%;mask-size:100% 100%;background-color:currentColor;color:inherit;display:inline-flex;width:60px;height:60px}.i-settings\:network{--un-icon:url("data:image/svg+xml;utf8,%3Csvg display='inline-flex' width='1em' height='1em' viewBox='0 0 20 20' xmlns='http://www.w3.org/2000/svg' xmlns:xlink='http://www.w3.org/1999/xlink'%3E%3Crect id='svg 2' x='0.000000' y='0.000000'/%3E%3Cpath id='矢量 8' d='M10 1.875C14.4875 1.875 18.125 5.5125 18.125 10C18.125 14.4875 14.4875 18.125 10 18.125C5.5125 18.125 1.875 14.4875 1.875 10C1.875 5.5125 5.5125 1.875 10 1.875ZM9.375 10.625L6.88833 10.6254C6.90583 11.0254 6.93958 11.4146 6.98833 11.7908L7.02708 12.07L7.07542 12.3679C7.46125 14.5729 8.35917 16.23 9.37542 16.7233L9.375 10.625ZM13.1117 10.6254L10.625 10.625L10.625 16.7233C11.6183 16.2404 12.4987 14.6458 12.8979 12.5142L12.9246 12.3679L12.9729 12.0704C13.0447 11.5915 13.091 11.1092 13.1117 10.6254L13.1117 10.6254ZM5.63708 10.6254L3.15292 10.6254C3.38042 13.1463 4.96917 15.2754 7.17833 16.2712C6.74625 15.6017 6.39 14.7788 6.12833 13.8488L6.06917 13.6321L6.00042 13.3554L5.93708 13.0729C5.76796 12.2671 5.6676 11.4483 5.63708 10.6254L5.63708 10.6254ZM16.8471 10.6254L14.3625 10.6254C14.3349 11.3606 14.2522 12.0926 14.115 12.8154L14.0625 13.0729L13.9992 13.3554L13.9304 13.6325C13.6637 14.6508 13.2867 15.5504 12.8212 16.2712C15.0304 15.2754 16.6192 13.1463 16.8463 10.6254L16.8471 10.6254ZM7.17833 3.72833L7.1225 3.75375C4.94167 4.76042 3.37833 6.875 3.15292 9.375L5.63708 9.375C5.66708 8.6125 5.75167 7.87708 5.88458 7.18458L5.93708 6.92708L6.00042 6.64458L6.06917 6.3675C6.33583 5.34917 6.71292 4.44958 7.17833 3.72875L7.17833 3.72833ZM9.375 3.27667C8.38458 3.7575 7.50625 5.345 7.10542 7.46792L7.07542 7.63208L7.02708 7.92958C6.9553 8.40859 6.90898 8.89108 6.88833 9.375L9.375 9.375L9.375 3.27667ZM12.8217 3.72875L12.8717 3.80792C13.28 4.46083 13.6183 5.25292 13.8696 6.14292L13.9308 6.36792L13.9996 6.64458L14.0629 6.92708C14.2263 7.69375 14.3292 8.51708 14.3629 9.375L16.8471 9.375C16.62 6.85375 15.0312 4.72458 12.8217 3.72917L12.8217 3.72875ZM10.625 3.27667L10.625 9.375L13.1117 9.375C13.0944 8.97409 13.0596 8.57413 13.0075 8.17625L12.9729 7.92958L12.9246 7.63208C12.5388 5.4275 11.6412 3.77042 10.6254 3.27667L10.625 3.27667Z' fill='currentColor' fill-rule='nonzero'/%3E%3C/svg%3E");-webkit-mask:var(--un-icon) no-repeat;mask:var(--un-icon) no-repeat;-webkit-mask-size:100% 100%;mask-size:100% 100%;background-color:currentColor;color:inherit;display:inline-flex;width:1em;height:1em}.i-settings\:page{--un-icon:url("data:image/svg+xml;utf8,%3Csvg display='inline-flex' width='1em' height='1em' viewBox='0 0 20 20' xmlns='http://www.w3.org/2000/svg' xmlns:xlink='http://www.w3.org/1999/xlink'%3E%3Crect id='svg 5' x='0.000000' y='0.000000'/%3E%3Cpath id='矢量 12' d='M18.0879 7.86328C17.7598 7.53125 17.3223 7.34375 16.8535 7.33594C16.7676 7.32617 16.5078 7.30078 16.1328 7.26562C15.9512 6.85547 15.7305 6.46484 15.4707 6.10156C15.6328 5.75 15.7129 5.57227 15.75 5.47461L15.7559 5.47656C16.25 4.61914 15.957 3.51758 15.1016 3.02148L13.5996 2.15039C13.3262 1.99219 13.0137 1.9082 12.6973 1.90625C12.0684 1.90625 11.4707 2.23828 11.1719 2.75391C11.1426 2.79492 10.9824 3.01758 10.7422 3.35352C10.2969 3.30859 9.84766 3.31055 9.40234 3.35547C9.17773 3.03711 9.06445 2.87695 8.99609 2.79492L9 2.79297C8.67969 2.23828 8.08203 1.89453 7.44141 1.89453C7.12891 1.89453 6.82031 1.97656 6.54688 2.13281L5.04102 2.99805C4.62109 3.24023 4.32031 3.63086 4.19336 4.10156C4.07227 4.55078 4.12891 5.01367 4.35156 5.40234C4.37305 5.44922 4.49805 5.72656 4.6875 6.14062C4.58203 6.28906 4.48047 6.44531 4.38867 6.60352C4.27344 6.80469 4.16602 7.01367 4.07422 7.22656C3.56641 7.27344 3.375 7.29102 3.29492 7.30078C2.31055 7.30469 1.50781 8.10742 1.50391 9.0957L1.5 10.832C1.5 11.3164 1.68945 11.7734 2.0332 12.1172C2.36328 12.4473 2.78906 12.6289 3.23828 12.6309C3.29297 12.6367 3.62891 12.6699 4.12891 12.7168C4.29297 13.0664 4.48828 13.4004 4.71094 13.7168C4.50391 14.1641 4.40625 14.3789 4.36523 14.4941L4.35938 14.4902C4.12109 14.8984 4.05664 15.3945 4.17773 15.8516C4.29883 16.3105 4.60352 16.709 5.01367 16.9453L6.51563 17.8164C6.78906 17.9746 7.09961 18.0586 7.41602 18.0586C8.04492 18.0586 8.64258 17.7266 8.94141 17.2109C8.97461 17.166 9.17383 16.8887 9.4668 16.4766C9.85352 16.5137 10.2422 16.5176 10.623 16.4863C10.9043 16.8867 11.041 17.0762 11.1172 17.168L11.1113 17.1719C11.4316 17.7266 12.0293 18.0703 12.6699 18.0703C12.9824 18.0703 13.293 17.9883 13.5645 17.832L15.0703 16.9688C15.4824 16.7344 15.7891 16.3359 15.9121 15.877C16.0352 15.4258 15.9785 14.9531 15.752 14.5449C15.7148 14.4609 15.5938 14.1934 15.418 13.8105C15.5566 13.625 15.6855 13.4277 15.8047 13.2266C15.8965 13.0684 15.9805 12.9043 16.0566 12.7383C16.5195 12.6953 16.7207 12.6777 16.8145 12.6641L16.8145 12.666C17.8027 12.6641 18.6074 11.8594 18.6094 10.8711L18.6133 9.13476C18.6152 8.66211 18.4238 8.19922 18.0879 7.86328L18.0879 7.86328ZM14.1406 13.2969C13.9785 13.4922 13.9414 13.7656 14.0469 13.9961C14.3145 14.582 14.5059 15.0039 14.5469 15.0977C14.5508 15.1055 14.5527 15.1133 14.5566 15.1172C14.5664 15.1367 14.5762 15.1562 14.5879 15.1758C14.6504 15.2832 14.668 15.4141 14.6348 15.5352C14.6016 15.6562 14.5215 15.7617 14.4121 15.8242L12.9063 16.6895C12.834 16.7305 12.7539 16.752 12.6719 16.752C12.4941 16.752 12.3379 16.6523 12.2305 16.4707L12.2148 16.4473C12.166 16.377 11.875 15.9707 11.4805 15.4102C11.3359 15.2051 11.0938 15.0996 10.8457 15.1367C10.3203 15.2129 9.78711 15.207 9.26368 15.123C9.01368 15.084 8.76563 15.1875 8.61914 15.3945C8.375 15.7402 8.16993 16.0254 8.03125 16.2188C7.91602 16.3789 7.84571 16.4785 7.82813 16.5059C7.76954 16.6094 7.66211 16.6875 7.53711 16.7207C7.41211 16.7539 7.28125 16.7383 7.17774 16.6777L5.67579 15.8066C5.56641 15.7422 5.48829 15.6406 5.45508 15.5176C5.41993 15.3887 5.44336 15.2578 5.52735 15.1113L5.53321 15.0977C5.53907 15.084 5.75586 14.6074 6.07618 13.918C6.1836 13.6875 6.15039 13.4219 5.99219 13.2246C5.65821 12.8105 5.39063 12.3516 5.19532 11.8574C5.10352 11.625 4.89063 11.4648 4.64063 11.4414C4.26368 11.4063 3.94532 11.375 3.71485 11.3535C3.44141 11.3281 3.33008 11.3164 3.29493 11.3145C3.03321 11.3125 2.82032 11.0996 2.82032 10.8379L2.82422 9.10156C2.82422 8.83984 3.03711 8.62695 3.29883 8.62695C3.32032 8.62695 3.34375 8.625 3.36524 8.62305C3.3711 8.62305 3.37696 8.62305 3.38672 8.62109C3.48438 8.61133 3.94922 8.56641 4.59375 8.50977C4.84571 8.48633 5.06641 8.31836 5.1543 8.08203C5.26954 7.77344 5.39258 7.50781 5.53125 7.26953C5.64454 7.07227 5.78516 6.87109 5.97071 6.63867C6.12696 6.44336 6.15821 6.17969 6.05469 5.95313C5.91602 5.65039 5.79883 5.39258 5.71094 5.19922C5.5918 4.9375 5.54297 4.83008 5.52539 4.79688C5.39454 4.57031 5.47461 4.2793 5.70118 4.14844L7.20704 3.2832C7.44141 3.14844 7.73243 3.24219 7.88282 3.5L7.89649 3.51953C7.93555 3.57227 8.19141 3.93359 8.55469 4.44922C8.70118 4.65625 8.95704 4.76367 9.20704 4.7207C9.76758 4.625 10.3672 4.62305 10.9453 4.7168C11.1953 4.75781 11.4434 4.6543 11.5898 4.44727C11.7813 4.17773 11.9434 3.95117 12.0625 3.78516C12.207 3.58203 12.2676 3.5 12.2871 3.46875C12.3477 3.36523 12.4531 3.28711 12.5762 3.25391C12.7012 3.2207 12.832 3.23633 12.9356 3.29492L14.4395 4.16797C14.5469 4.23047 14.627 4.33594 14.6602 4.45703C14.6953 4.58594 14.6719 4.7168 14.5879 4.86328L14.5664 4.90039L14.5664 4.9082C14.5176 5.01367 14.3457 5.39258 14.1074 5.9082C14.002 6.13477 14.0352 6.4082 14.1934 6.60156C14.5664 7.06445 14.8555 7.57227 15.0527 8.11328C15.1387 8.35156 15.3594 8.52148 15.6113 8.54492C16.2051 8.60156 16.6309 8.64453 16.7305 8.6543C16.7402 8.65625 16.7481 8.65625 16.7539 8.65625C16.9473 8.67188 17.0703 8.7168 17.1524 8.79883C17.2402 8.88672 17.291 9.00977 17.291 9.13477L17.2871 10.873C17.2871 11.1426 17.0606 11.3477 16.7617 11.3496C16.7617 11.3496 16.7461 11.3496 16.7188 11.3535C16.6055 11.3652 16.1602 11.4063 15.5469 11.4609C15.2969 11.4844 15.0859 11.6426 14.9922 11.875C14.8828 12.1465 14.7793 12.3672 14.6621 12.5684C14.5176 12.8105 14.3477 13.0488 14.1406 13.2969L14.1406 13.2969Z' fill='currentColor' fill-rule='nonzero'/%3E%3Cpath id='矢量 13' d='M11.6387 7.25586C11.1699 6.98438 10.6387 6.8418 10.0977 6.83984C9.00393 6.83984 7.98245 7.42773 7.43362 8.37305C6.58206 9.83984 7.08401 11.7266 8.55081 12.5781C9.01956 12.8496 9.55276 12.9941 10.0938 12.9941C11.1875 12.9941 12.209 12.4062 12.7578 11.4609C13.166 10.7598 13.2813 9.91016 13.0703 9.12695C12.8633 8.34375 12.3418 7.66016 11.6387 7.25586L11.6387 7.25586ZM11.6114 10.7969C11.2969 11.3359 10.7149 11.6699 10.0918 11.6699C9.78323 11.6699 9.4805 11.5879 9.21292 11.4316C8.37698 10.9453 8.09182 9.87109 8.5762 9.03516C8.89065 8.49609 9.47268 8.16211 10.0957 8.16016C10.4043 8.16016 10.7071 8.24219 10.9746 8.39844C11.375 8.62891 11.6719 9.01758 11.7891 9.46484C11.9102 9.91992 11.8477 10.3926 11.6114 10.7969L11.6114 10.7969Z' fill='currentColor' fill-rule='nonzero'/%3E%3Cpath id='矢量 14' d='M18.0684 7.86328C17.7402 7.53125 17.3027 7.34375 16.834 7.33594C16.7481 7.32617 16.4883 7.30078 16.1133 7.26562C15.9316 6.85547 15.7109 6.46484 15.4512 6.10156C15.6133 5.75 15.6934 5.57227 15.7305 5.47461L15.7363 5.47656C16.2305 4.61914 15.9375 3.51758 15.082 3.02148L13.5801 2.15039C13.3066 1.99219 12.9941 1.9082 12.6777 1.90625C12.0488 1.90625 11.4512 2.23828 11.1523 2.75391C11.123 2.79492 10.9629 3.01758 10.7227 3.35352C10.2773 3.30859 9.82813 3.31055 9.38281 3.35547C9.1582 3.03711 9.04492 2.87695 8.97656 2.79492L8.98047 2.79297C8.66016 2.23828 8.0625 1.89453 7.42188 1.89453C7.10938 1.89453 6.80078 1.97656 6.52734 2.13281L5.02148 2.99805C4.60156 3.24023 4.30078 3.63086 4.17383 4.10156C4.05273 4.55078 4.10938 5.01367 4.33203 5.40234C4.35352 5.44922 4.47852 5.72656 4.66797 6.14062C4.5625 6.28906 4.46094 6.44531 4.36914 6.60352C4.25391 6.80469 4.14648 7.01367 4.05469 7.22656C3.54688 7.27344 3.35547 7.29102 3.27539 7.30078C2.29102 7.30469 1.48828 8.10742 1.48438 9.0957L1.48047 10.832C1.48047 11.3164 1.66992 11.7734 2.01367 12.1172C2.34375 12.4473 2.76953 12.6289 3.21875 12.6309C3.27344 12.6367 3.60938 12.6699 4.10938 12.7168C4.27344 13.0664 4.46875 13.4004 4.69141 13.7168C4.48438 14.1641 4.38672 14.3789 4.3457 14.4941L4.33984 14.4902C4.10156 14.8984 4.03711 15.3945 4.1582 15.8516C4.2793 16.3105 4.58398 16.709 4.99414 16.9453L6.49609 17.8164C6.76953 17.9746 7.08008 18.0586 7.39649 18.0586C8.02539 18.0586 8.62305 17.7266 8.92188 17.2109C8.95508 17.166 9.1543 16.8887 9.44727 16.4766C9.83399 16.5137 10.2227 16.5176 10.6035 16.4863C10.8848 16.8867 11.0215 17.0762 11.0977 17.168L11.0918 17.1719C11.4121 17.7266 12.0098 18.0703 12.6504 18.0703C12.9629 18.0703 13.2734 17.9883 13.5449 17.832L15.0508 16.9688C15.4629 16.7344 15.7695 16.3359 15.8926 15.877C16.0156 15.4258 15.959 14.9531 15.7324 14.5449C15.6953 14.4609 15.5742 14.1934 15.3984 13.8105C15.5371 13.625 15.666 13.4277 15.7852 13.2266C15.877 13.0684 15.9609 12.9043 16.0371 12.7383C16.5 12.6953 16.7012 12.6777 16.7949 12.6641L16.7949 12.666C17.7832 12.6641 18.5879 11.8594 18.5898 10.8711L18.5938 9.13476C18.5957 8.66211 18.4043 8.19922 18.0684 7.86328L18.0684 7.86328ZM14.1211 13.2969C13.959 13.4922 13.9219 13.7656 14.0273 13.9961C14.2949 14.582 14.4863 15.0039 14.5273 15.0977C14.5313 15.1055 14.5332 15.1133 14.5371 15.1172C14.5469 15.1367 14.5566 15.1562 14.5684 15.1758C14.6309 15.2832 14.6484 15.4141 14.6152 15.5352C14.582 15.6562 14.502 15.7617 14.3926 15.8242L12.8867 16.6895C12.8145 16.7305 12.7344 16.752 12.6523 16.752C12.4746 16.752 12.3184 16.6523 12.2109 16.4707L12.1953 16.4473C12.1465 16.377 11.8555 15.9707 11.4609 15.4102C11.3164 15.2051 11.0742 15.0996 10.8262 15.1367C10.3008 15.2129 9.76758 15.207 9.24414 15.123C8.99414 15.084 8.7461 15.1875 8.59961 15.3945C8.35547 15.7402 8.15039 16.0254 8.01172 16.2188C7.89649 16.3789 7.82618 16.4785 7.8086 16.5059C7.75 16.6094 7.64258 16.6875 7.51758 16.7207C7.39258 16.7539 7.26172 16.7383 7.15821 16.6777L5.65625 15.8066C5.54688 15.7422 5.46875 15.6406 5.43555 15.5176C5.40039 15.3887 5.42383 15.2578 5.50782 15.1113L5.51368 15.0977C5.51954 15.084 5.73633 14.6074 6.05664 13.918C6.16407 13.6875 6.13086 13.4219 5.97266 13.2246C5.63868 12.8105 5.3711 12.3516 5.17579 11.8574C5.08399 11.625 4.8711 11.4648 4.6211 11.4414C4.24414 11.4063 3.92579 11.375 3.69532 11.3535C3.42188 11.3281 3.31055 11.3164 3.27539 11.3145C3.01368 11.3125 2.80079 11.0996 2.80079 10.8379L2.80469 9.10156C2.80469 8.83984 3.01758 8.62695 3.2793 8.62695C3.30079 8.62695 3.32422 8.625 3.34571 8.62305C3.35157 8.62305 3.35743 8.62305 3.36719 8.62109C3.46485 8.61133 3.92969 8.56641 4.57422 8.50977C4.82618 8.48633 5.04688 8.31836 5.13477 8.08203C5.25 7.77344 5.37305 7.50781 5.51172 7.26953C5.625 7.07227 5.76563 6.87109 5.95118 6.63867C6.10743 6.44336 6.13868 6.17969 6.03516 5.95313C5.89649 5.65039 5.7793 5.39258 5.69141 5.19922C5.57227 4.9375 5.52344 4.83008 5.50586 4.79688C5.375 4.57031 5.45508 4.2793 5.68164 4.14844L7.1875 3.2832C7.42188 3.14844 7.71289 3.24219 7.86329 3.5L7.87696 3.51953C7.91602 3.57227 8.17188 3.93359 8.53516 4.44922C8.68165 4.65625 8.93751 4.76367 9.18751 4.7207C9.74805 4.625 10.3477 4.62305 10.9258 4.7168C11.1758 4.75781 11.4238 4.6543 11.5703 4.44727C11.7617 4.17773 11.9238 3.95117 12.043 3.78516C12.1875 3.58203 12.2481 3.5 12.2676 3.46875C12.3281 3.36523 12.4336 3.28711 12.5566 3.25391C12.6816 3.2207 12.8125 3.23633 12.916 3.29492L14.4199 4.16797C14.5273 4.23047 14.6074 4.33594 14.6406 4.45703C14.6758 4.58594 14.6524 4.7168 14.5684 4.86328L14.5469 4.90039L14.5469 4.9082C14.4981 5.01367 14.3262 5.39258 14.0879 5.9082C13.9824 6.13477 14.0156 6.4082 14.1738 6.60156C14.5469 7.06445 14.8359 7.57227 15.0332 8.11328C15.1191 8.35156 15.3399 8.52148 15.5918 8.54492C16.1856 8.60156 16.6113 8.64453 16.7109 8.6543C16.7207 8.65625 16.7285 8.65625 16.7344 8.65625C16.9277 8.67188 17.0508 8.7168 17.1328 8.79883C17.2207 8.88672 17.2715 9.00977 17.2715 9.13477L17.2676 10.873C17.2676 11.1426 17.041 11.3477 16.7422 11.3496C16.7422 11.3496 16.7266 11.3496 16.6992 11.3535C16.5859 11.3652 16.1406 11.4063 15.5273 11.4609C15.2773 11.4844 15.0664 11.6426 14.9727 11.875C14.8633 12.1465 14.7598 12.3672 14.6426 12.5684C14.498 12.8105 14.3281 13.0488 14.1211 13.2969L14.1211 13.2969Z' fill='currentColor' fill-rule='nonzero'/%3E%3Cpath id='矢量 15' d='M11.6192 7.25586C11.1504 6.98438 10.6192 6.8418 10.0782 6.83984C8.9844 6.83984 7.96292 7.42773 7.41409 8.37305C6.56253 9.83984 7.06448 11.7266 8.53128 12.5781C9.00003 12.8496 9.53323 12.9941 10.0742 12.9941C11.168 12.9941 12.1895 12.4062 12.7383 11.4609C13.1465 10.7598 13.2617 9.91016 13.0508 9.12695C12.8438 8.34375 12.3223 7.66016 11.6192 7.25586L11.6192 7.25586ZM11.5918 10.7969C11.2774 11.3359 10.6953 11.6699 10.0723 11.6699C9.7637 11.6699 9.46096 11.5879 9.19339 11.4316C8.35745 10.9453 8.07229 9.87109 8.55667 9.03516C8.87112 8.49609 9.45315 8.16211 10.0762 8.16016C10.3848 8.16016 10.6875 8.24219 10.9551 8.39844C11.3555 8.62891 11.6524 9.01758 11.7696 9.46484C11.8907 9.91992 11.8282 10.3926 11.5918 10.7969L11.5918 10.7969Z' fill='currentColor' fill-rule='nonzero'/%3E%3Cpath id='矢量 16' d='M18.0488 7.86328C17.7207 7.53125 17.2832 7.34375 16.8145 7.33594C16.7285 7.32617 16.4688 7.30078 16.0938 7.26562C15.9121 6.85547 15.6914 6.46484 15.4316 6.10156C15.5938 5.75 15.6738 5.57227 15.7109 5.47461L15.7168 5.47656C16.2109 4.61914 15.918 3.51758 15.0625 3.02148L13.5605 2.15039C13.2871 1.99219 12.9746 1.9082 12.6582 1.90625C12.0293 1.90625 11.4316 2.23828 11.1328 2.75391C11.1035 2.79492 10.9434 3.01758 10.7031 3.35352C10.2578 3.30859 9.80859 3.31055 9.36328 3.35547C9.13867 3.03711 9.02539 2.87695 8.95703 2.79492L8.96094 2.79297C8.64063 2.23828 8.04297 1.89453 7.40234 1.89453C7.08984 1.89453 6.78125 1.97656 6.50781 2.13281L5.00195 2.99805C4.58203 3.24023 4.28125 3.63086 4.1543 4.10156C4.0332 4.55078 4.08984 5.01367 4.3125 5.40234C4.33398 5.44922 4.45898 5.72656 4.64844 6.14062C4.54297 6.28906 4.44141 6.44531 4.34961 6.60352C4.23438 6.80469 4.12695 7.01367 4.03516 7.22656C3.52734 7.27344 3.33594 7.29102 3.25586 7.30078C2.27148 7.30469 1.46875 8.10742 1.46484 9.0957L1.46094 10.832C1.46094 11.3164 1.65039 11.7734 1.99414 12.1172C2.32422 12.4473 2.75 12.6289 3.19922 12.6309C3.25391 12.6367 3.58984 12.6699 4.08984 12.7168C4.25391 13.0664 4.44922 13.4004 4.67188 13.7168C4.46484 14.1641 4.36719 14.3789 4.32617 14.4941L4.32031 14.4902C4.08203 14.8984 4.01758 15.3945 4.13867 15.8516C4.25977 16.3105 4.56445 16.709 4.97461 16.9453L6.47656 17.8164C6.75 17.9746 7.06055 18.0586 7.37695 18.0586C8.00586 18.0586 8.60352 17.7266 8.90235 17.2109C8.93555 17.166 9.13477 16.8887 9.42774 16.4766C9.81445 16.5137 10.2031 16.5176 10.584 16.4863C10.8652 16.8867 11.002 17.0762 11.0781 17.168L11.0723 17.1719C11.3926 17.7266 11.9902 18.0703 12.6309 18.0703C12.9434 18.0703 13.2539 17.9883 13.5254 17.832L15.0312 16.9688C15.4434 16.7344 15.75 16.3359 15.873 15.877C15.9961 15.4258 15.9395 14.9531 15.7129 14.5449C15.6758 14.4609 15.5547 14.1934 15.3789 13.8105C15.5176 13.625 15.6465 13.4277 15.7656 13.2266C15.8574 13.0684 15.9414 12.9043 16.0176 12.7383C16.4805 12.6953 16.6816 12.6777 16.7754 12.6641L16.7754 12.666C17.7637 12.6641 18.5684 11.8594 18.5703 10.8711L18.5742 9.13476C18.5762 8.66211 18.3848 8.19922 18.0488 7.86328L18.0488 7.86328ZM14.1016 13.2969C13.9395 13.4922 13.9023 13.7656 14.0078 13.9961C14.2754 14.582 14.4668 15.0039 14.5078 15.0977C14.5117 15.1055 14.5137 15.1133 14.5176 15.1172C14.5273 15.1367 14.5371 15.1562 14.5488 15.1758C14.6113 15.2832 14.6289 15.4141 14.5957 15.5352C14.5625 15.6562 14.4824 15.7617 14.373 15.8242L12.8672 16.6895C12.7949 16.7305 12.7148 16.752 12.6328 16.752C12.4551 16.752 12.2988 16.6523 12.1914 16.4707L12.1758 16.4473C12.127 16.377 11.8359 15.9707 11.4414 15.4102C11.2969 15.2051 11.0547 15.0996 10.8066 15.1367C10.2813 15.2129 9.74805 15.207 9.22461 15.123C8.97461 15.084 8.72657 15.1875 8.58008 15.3945C8.33594 15.7402 8.13086 16.0254 7.99219 16.2188C7.87696 16.3789 7.80664 16.4785 7.78907 16.5059C7.73047 16.6094 7.62305 16.6875 7.49805 16.7207C7.37305 16.7539 7.24219 16.7383 7.13868 16.6777L5.63672 15.8066C5.52735 15.7422 5.44922 15.6406 5.41602 15.5176C5.38086 15.3887 5.4043 15.2578 5.48829 15.1113L5.49414 15.0977C5.5 15.084 5.7168 14.6074 6.03711 13.918C6.14454 13.6875 6.11133 13.4219 5.95313 13.2246C5.61914 12.8105 5.35157 12.3516 5.15625 11.8574C5.06446 11.625 4.85157 11.4648 4.60157 11.4414C4.22461 11.4063 3.90625 11.375 3.67579 11.3535C3.40235 11.3281 3.29102 11.3164 3.25586 11.3145C2.99414 11.3125 2.78125 11.0996 2.78125 10.8379L2.78516 9.10156C2.78516 8.83984 2.99805 8.62695 3.25977 8.62695C3.28125 8.62695 3.30469 8.625 3.32618 8.62305C3.33204 8.62305 3.33789 8.62305 3.34766 8.62109C3.44532 8.61133 3.91016 8.56641 4.55469 8.50977C4.80664 8.48633 5.02735 8.31836 5.11524 8.08203C5.23047 7.77344 5.35352 7.50781 5.49219 7.26953C5.60547 7.07227 5.7461 6.87109 5.93164 6.63867C6.08789 6.44336 6.11915 6.17969 6.01563 5.95313C5.87696 5.65039 5.75977 5.39258 5.67188 5.19922C5.55274 4.9375 5.50391 4.83008 5.48633 4.79688C5.35547 4.57031 5.43555 4.2793 5.66211 4.14844L7.16797 3.2832C7.40235 3.14844 7.69336 3.24219 7.84375 3.5L7.85743 3.51953C7.89649 3.57227 8.15235 3.93359 8.51563 4.44922C8.66212 4.65625 8.91797 4.76367 9.16797 4.7207C9.72852 4.625 10.3281 4.62305 10.9063 4.7168C11.1563 4.75781 11.4043 4.6543 11.5508 4.44727C11.7422 4.17773 11.9043 3.95117 12.0234 3.78516C12.168 3.58203 12.2285 3.5 12.2481 3.46875C12.3086 3.36523 12.4141 3.28711 12.5371 3.25391C12.6621 3.2207 12.793 3.23633 12.8965 3.29492L14.4004 4.16797C14.5078 4.23047 14.5879 4.33594 14.6211 4.45703C14.6563 4.58594 14.6328 4.7168 14.5488 4.86328L14.5273 4.90039L14.5273 4.9082C14.4785 5.01367 14.3066 5.39258 14.0684 5.9082C13.9629 6.13477 13.9961 6.4082 14.1543 6.60156C14.5274 7.06445 14.8164 7.57227 15.0137 8.11328C15.0996 8.35156 15.3203 8.52148 15.5723 8.54492C16.166 8.60156 16.5918 8.64453 16.6914 8.6543C16.7012 8.65625 16.709 8.65625 16.7149 8.65625C16.9082 8.67188 17.0313 8.7168 17.1133 8.79883C17.2012 8.88672 17.252 9.00977 17.252 9.13477L17.2481 10.873C17.2481 11.1426 17.0215 11.3477 16.7227 11.3496C16.7227 11.3496 16.707 11.3496 16.6797 11.3535C16.5664 11.3652 16.1211 11.4063 15.5078 11.4609C15.2578 11.4844 15.0469 11.6426 14.9531 11.875C14.8438 12.1465 14.7402 12.3672 14.6231 12.5684C14.4785 12.8105 14.3086 13.0488 14.1016 13.2969L14.1016 13.2969Z' fill='currentColor' fill-rule='nonzero'/%3E%3Cpath id='矢量 17' d='M11.5996 7.25586C11.1309 6.98438 10.5996 6.8418 10.0586 6.83984C8.96487 6.83984 7.94339 7.42773 7.39456 8.37305C6.54299 9.83984 7.04495 11.7266 8.51175 12.5781C8.9805 12.8496 9.5137 12.9941 10.0547 12.9941C11.1485 12.9941 12.1699 12.4062 12.7188 11.4609C13.127 10.7598 13.2422 9.91016 13.0313 9.12695C12.8242 8.34375 12.3028 7.66016 11.5996 7.25586L11.5996 7.25586ZM11.5723 10.7969C11.2578 11.3359 10.6758 11.6699 10.0528 11.6699C9.74417 11.6699 9.44143 11.5879 9.17385 11.4316C8.33792 10.9453 8.05276 9.87109 8.53714 9.03516C8.85159 8.49609 9.43362 8.16211 10.0567 8.16016C10.3653 8.16016 10.668 8.24219 10.9356 8.39844C11.336 8.62891 11.6328 9.01758 11.75 9.46484C11.8711 9.91992 11.8086 10.3926 11.5723 10.7969L11.5723 10.7969Z' fill='currentColor' fill-rule='nonzero'/%3E%3C/svg%3E");-webkit-mask:var(--un-icon) no-repeat;mask:var(--un-icon) no-repeat;-webkit-mask-size:100% 100%;mask-size:100% 100%;background-color:currentColor;color:inherit;display:inline-flex;width:1em;height:1em}.i-settings\:safe{--un-icon:url("data:image/svg+xml;utf8,%3Csvg display='inline-flex' width='1em' height='1em' viewBox='0 0 20 20' xmlns='http://www.w3.org/2000/svg' xmlns:xlink='http://www.w3.org/1999/xlink'%3E%3Crect id='svg 1' x='0.000000' y='0.000000'/%3E%3Cpath id='矢量 5' d='M9.99984 2.59545C13.1498 2.59545 15.0362 3.15908 15.9089 3.50454L15.9089 10.3227C15.9163 11.2154 15.6738 12.0924 15.2089 12.8545C14.6026 13.818 13.8408 14.6744 12.9546 15.3889C12.0684 16.1035 11.07 16.6663 9.99984 17.0545C8.93101 16.6686 7.93334 16.1086 7.04719 15.3972C6.16105 14.6859 5.39861 13.8328 4.79075 12.8727C4.32586 12.1106 4.0834 11.2336 4.09075 10.3409L4.09075 3.52272C4.97256 3.16363 6.85438 2.61363 9.99984 2.61363M9.99984 1.24999C4.80438 1.23181 2.72711 2.67272 2.72711 2.67272L2.72711 10.3409C2.72213 11.4877 3.03694 12.6131 3.6362 13.5909C4.3697 14.7492 5.30004 15.7703 6.38521 16.6082C7.47038 17.4461 8.69366 18.0879 9.99984 18.5045C11.306 18.0879 12.5293 17.4462 13.6145 16.6082C14.6996 15.7703 15.63 14.7492 16.3635 13.5909C16.9627 12.6131 17.2775 11.4877 17.2726 10.3409L17.2726 2.67272C17.2726 2.67272 15.1953 1.23181 9.99984 1.23181L9.99984 1.24999Z' fill='currentColor' fill-rule='nonzero'/%3E%3Cpath id='矢量 6' d='M9.14544 11.4591C9.01548 11.4588 8.88832 11.4212 8.77913 11.3508C8.66995 11.2803 8.58336 11.1798 8.52969 11.0615C8.47602 10.9431 8.45754 10.8118 8.47645 10.6832C8.49536 10.5546 8.55087 10.4342 8.63635 10.3363L11.7591 6.69996C11.8551 6.59053 11.9832 6.5143 12.1252 6.48219C12.2672 6.45008 12.4157 6.46374 12.5494 6.52122C12.6832 6.5787 12.7953 6.67704 12.8697 6.80215C12.9441 6.92725 12.977 7.07271 12.9636 7.21766C12.9503 7.36261 12.8914 7.49962 12.7954 7.60905L9.66817 11.2454C9.60211 11.3173 9.52101 11.3737 9.43066 11.4106C9.34031 11.4475 9.24292 11.4641 9.14544 11.4591L9.14544 11.4591Z' fill='currentColor' fill-rule='nonzero'/%3E%3Cpath id='矢量 7' d='M9.14538 11.4591C9.06995 11.4597 8.99497 11.4473 8.92371 11.4226C8.85246 11.3978 8.78599 11.3609 8.7272 11.3137L7.30447 10.1955C7.19125 10.1062 7.1092 9.98336 7.07006 9.84458C7.03093 9.7058 7.03673 9.5582 7.08663 9.42291C7.13653 9.28763 7.22796 9.17161 7.34784 9.09148C7.46772 9.01135 7.60988 8.97122 7.75397 8.97684C7.89805 8.98245 8.03666 9.03353 8.14993 9.12276L9.56811 10.2455C9.66223 10.319 9.73523 10.4161 9.7797 10.527C9.82417 10.6379 9.83853 10.7585 9.82133 10.8767C9.80413 10.9949 9.75597 11.1064 9.68175 11.2C9.61847 11.2818 9.5371 11.3477 9.44403 11.3926C9.35096 11.4376 9.24873 11.4604 9.14538 11.4591L9.14538 11.4591Z' fill='currentColor' fill-rule='nonzero'/%3E%3C/svg%3E");-webkit-mask:var(--un-icon) no-repeat;mask:var(--un-icon) no-repeat;-webkit-mask-size:100% 100%;mask-size:100% 100%;background-color:currentColor;color:inherit;display:inline-flex;width:1em;height:1em}.i-settings\:ssl{--un-icon:url("data:image/svg+xml;utf8,%3Csvg display='inline-flex' width='1em' height='1em' viewBox='0 0 20 20' xmlns='http://www.w3.org/2000/svg' xmlns:xlink='http://www.w3.org/1999/xlink'%3E%3Crect id='svg 2' x='0.000000' y='0.000000'/%3E%3Cpath id='矢量 5' d='M9.99984 2.59545C13.1498 2.59545 15.0362 3.15908 15.9089 3.50454L15.9089 10.3227C15.9163 11.2154 15.6738 12.0924 15.2089 12.8545C14.6026 13.818 13.8408 14.6744 12.9546 15.3889C12.0684 16.1035 11.07 16.6663 9.99984 17.0545C8.93101 16.6686 7.93334 16.1086 7.04719 15.3972C6.16105 14.6859 5.39861 13.8328 4.79075 12.8727C4.32586 12.1106 4.0834 11.2336 4.09075 10.3409L4.09075 3.52272C4.97256 3.16363 6.85438 2.61363 9.99984 2.61363M9.99984 1.24999C4.80438 1.23181 2.72711 2.67272 2.72711 2.67272L2.72711 10.3409C2.72213 11.4877 3.03694 12.6131 3.6362 13.5909C4.3697 14.7492 5.30004 15.7703 6.38521 16.6082C7.47038 17.4461 8.69366 18.0879 9.99984 18.5045C11.306 18.0879 12.5293 17.4462 13.6145 16.6082C14.6996 15.7703 15.63 14.7492 16.3635 13.5909C16.9627 12.6131 17.2775 11.4877 17.2726 10.3409L17.2726 2.67272C17.2726 2.67272 15.1953 1.23181 9.99984 1.23181L9.99984 1.24999Z' fill='currentColor' fill-rule='nonzero'/%3E%3C/svg%3E");-webkit-mask:var(--un-icon) no-repeat;mask:var(--un-icon) no-repeat;-webkit-mask-size:100% 100%;mask-size:100% 100%;background-color:currentColor;color:inherit;display:inline-flex;width:1em;height:1em}.i-settings\:success{--un-icon:url("data:image/svg+xml;utf8,%3Csvg display='inline-flex' width='1em' height='1em' viewBox='0 0 8.74341 8.74414' xmlns='http://www.w3.org/2000/svg' xmlns:xlink='http://www.w3.org/1999/xlink'%3E%3Cpath id='矢量 19' d='M4.01465 6.34766C3.93555 6.34766 3.85742 6.31738 3.79785 6.25586L1.80664 4.23828C1.68652 4.11719 1.68652 3.91992 1.80664 3.79785C1.92676 3.67578 2.12109 3.67578 2.24023 3.79785L4.01562 5.59668L8.21875 1.33594C8.25656 1.2972 8.30404 1.26927 8.35627 1.25505C8.40849 1.24083 8.46358 1.24083 8.51581 1.25505C8.56804 1.26927 8.61551 1.2972 8.65332 1.33594C8.77344 1.45703 8.77344 1.6543 8.65332 1.77637L4.23145 6.25684C4.17188 6.31738 4.09277 6.34766 4.01465 6.34766ZM4.31348 8.74414C3.73144 8.74414 3.16602 8.62891 2.63477 8.40137C2.12109 8.18066 1.66016 7.86621 1.26465 7.46484C0.869141 7.06348 0.557617 6.5957 0.34082 6.0752C0.114258 5.53418 0 4.96191 0 4.37207C0 3.78223 0.114258 3.20898 0.338867 2.66992C0.556641 2.14941 0.868164 1.68164 1.26367 1.28027C1.65918 0.878906 2.12012 0.563477 2.63379 0.34375C3.16602 0.116211 3.73144 0 4.31348 0C5.17188 0 6.00098 0.255859 6.71191 0.738281C6.83496 0.821289 6.86914 0.992188 6.78613 1.11719C6.7041 1.24219 6.53516 1.27637 6.41211 1.19141C5.79102 0.770508 5.06445 0.546875 4.31348 0.546875C2.23145 0.546875 0.540039 2.26367 0.540039 4.37207C0.540039 6.48047 2.23242 8.19727 4.31348 8.19727C6.39355 8.19727 8.08691 6.48145 8.08691 4.37207C8.08691 4.23633 8.08008 4.10059 8.06543 3.96484C8.04883 3.81445 8.15723 3.68066 8.30566 3.66406C8.4541 3.64746 8.58594 3.75684 8.60156 3.90723C8.61816 4.06055 8.62598 4.21777 8.62598 4.37207C8.62598 4.96191 8.51172 5.53516 8.28711 6.07422C8.06933 6.5957 7.75976 7.06152 7.36328 7.46387C6.96777 7.86523 6.50586 8.18066 5.99219 8.40039C5.45996 8.62695 4.89551 8.74414 4.31348 8.74414L4.31348 8.74414Z' fill='currentColor' fill-rule='nonzero'/%3E%3C/svg%3E");-webkit-mask:var(--un-icon) no-repeat;mask:var(--un-icon) no-repeat;-webkit-mask-size:100% 100%;mask-size:100% 100%;background-color:currentColor;color:inherit;display:inline-flex;width:1em;height:1em}.i-soft-dns-close{background:url("data:image/svg+xml;utf8,%3Csvg display='inline-flex' width='1em' height='1em' t='1762334981673' class='icon' viewBox='0 0 1024 1024' version='1.1' xmlns='http://www.w3.org/2000/svg' p-id='10737' xmlns:xlink='http://www.w3.org/1999/xlink'%3E%3Cpath d='M515.7 960.1c-29.2-0.1-52.9-23.9-52.9-53l-0.1-149.8c0.3-1.5 0.4-2.8 0.4-4V743l-10.1-2.1c-62.1-12.9-118.8-45.2-164-93.4-60-64.1-93.1-149.1-93.1-239.4v-107l-26.7 0.2c-6.3 0-12.2-2.5-16.7-7s-6.9-10.4-6.9-16.7c0-6.4 2.4-12.4 6.9-16.8 4.4-4.5 10.4-6.9 16.7-6.9h64.6l-102.9-103c-4.9-4.9-7.6-11.5-7.6-18.4 0-7 2.7-13.5 7.6-18.4 4.9-4.9 11.5-7.6 18.4-7.6s13.5 2.7 18.4 7.6l139.7 139.7h12.2V95c0-17.1 13.9-31.1 31.1-31.1 17.1 0 31 13.9 31 31.1l0.1 158.8h265.4V95c0-17.1 13.9-31 31.1-31 17.1 0 31 13.9 31 31.1v158.7l148.1 0.1c13.1 0 23.7 10.6 23.7 23.7 0 6.4-2.5 12.3-6.9 16.8-4.5 4.5-10.4 7-16.9 7h-21.9v106.9c0 94.5-35.7 182.2-100.5 246.9l-1.6 1.6c-1.7 1.7-3.5 3.3-5.4 5l-6.4 5.9L893 839.2c10.2 10.2 10.2 26.7 0 36.9-4.9 4.9-11.5 7.6-18.4 7.6-7 0-13.5-2.7-18.4-7.6L679.4 699.4l-3.1 1.9c-30.8 19-63.8 32.3-98.2 39.6l-10.7 2.3 0.7 10.9 0.2 2.4 0.1 150.7c0.1 14.1-5.4 27.3-15.4 37.4-10 10-23.3 15.5-37.3 15.5zM243.4 408.2c0 78.2 28.5 151.6 80.3 206.8 51.4 54.7 119.6 84.9 192 84.9 43 0 85.8-11.1 124-32l5.4-3-363.9-363.7h-37.9l0.1 107z m444.3 225.7l6.3-5.7c2.4-2.2 4.9-4.3 7.2-6.6 55-55.1 86.6-132.9 86.6-213.4v-12.7h-0.1v-94.2l-432.7-0.1 332.7 332.7z' p-id='10738' fill='%23ffffff'%3E%3C/path%3E%3C/svg%3E") no-repeat;background-size:100% 100%;background-color:transparent;display:inline-flex;width:1em;height:1em}.i-soft-dns-disk{--un-icon:url("data:image/svg+xml;utf8,%3Csvg display='inline-flex' width='1em' height='1em' t='1762244187005' class='icon' viewBox='0 0 1024 1024' version='1.1' xmlns='http://www.w3.org/2000/svg' p-id='7877' xmlns:xlink='http://www.w3.org/1999/xlink'%3E%3Cpath d='M554.688 682.624a42.688 42.688 0 0 0 0 85.376h0.448a42.688 42.688 0 1 0 0-85.376h-0.448zM767.488 682.624a42.688 42.688 0 0 0 0 85.376H768a42.688 42.688 0 1 0 0-85.376h-0.512z' fill='currentColor' p-id='7878'%3E%3C/path%3E%3Cpath d='M465.28 96h93.44c59.456 0 106.88 0 144.96 4.48 39.36 4.48 72.128 14.08 100.992 35.584 28.8 21.44 47.424 50.112 63.104 86.464 15.232 35.2 28.8 80.64 45.952 137.6l52.48 174.848c1.28 4.48 2.752 9.28 3.584 14.336v0.32l0.192 1.216c0.64 5.12 0.64 10.048 0.64 14.72v3.392c0 72.704 0 130.304-5.632 175.68-5.824 46.592-18.112 84.736-45.952 115.84-4.992 5.568-10.304 10.88-15.936 15.872-31.104 27.84-69.184 40.128-115.84 45.952-45.312 5.696-102.912 5.696-175.616 5.696H412.352c-72.704 0-130.304 0-175.68-5.696-46.592-5.824-84.672-18.112-115.84-45.888a202.944 202.944 0 0 1-15.872-16c-27.84-31.04-40.128-69.12-45.952-115.84-5.696-45.312-5.696-102.912-5.696-175.616v-3.328c0-4.672 0-9.664 0.704-14.784v-0.32l0.192-1.216c0.832-5.056 2.24-9.856 3.584-14.272l52.48-174.912c17.088-56.96 30.72-102.4 45.952-137.6 15.68-36.352 34.304-65.024 63.104-86.4 28.8-21.504 61.632-31.104 100.992-35.712C358.4 96 405.76 96 465.28 96zM327.68 164.032c-33.152 3.84-53.632 11.072-70.144 23.36-16.512 12.288-29.376 29.824-42.56 60.48-13.568 31.424-26.176 73.28-43.968 132.544l-42.688 142.272h767.36l-42.688-142.272c-17.792-59.264-30.4-101.12-43.968-132.48-13.184-30.72-26.048-48.256-42.56-60.544-16.512-12.288-36.992-19.52-70.144-23.36C662.336 160 618.624 160 556.736 160H467.328c-61.952 0-105.6 0-139.648 4.032zM122.496 736.64c5.056 40.128 14.528 63.616 30.144 81.088 3.456 3.84 7.04 7.488 10.88 10.88 17.536 15.68 40.96 25.088 81.152 30.144 40.96 5.12 94.464 5.184 169.92 5.184h194.816c75.456 0 129.024 0 169.92-5.184 40.128-5.056 63.616-14.464 81.152-30.08 3.84-3.456 7.424-7.104 10.88-10.944 15.616-17.536 25.088-40.96 30.08-81.088 4.672-37.248 5.12-84.928 5.248-150.016H117.312c0.064 65.088 0.512 112.768 5.184 150.016z' fill='currentColor' p-id='7879'%3E%3C/path%3E%3C/svg%3E");-webkit-mask:var(--un-icon) no-repeat;mask:var(--un-icon) no-repeat;-webkit-mask-size:100% 100%;mask-size:100% 100%;background-color:currentColor;color:inherit;display:inline-flex;width:1em;height:1em}.i-soft-dns-icon{--un-icon:url("data:image/svg+xml;utf8,%3Csvg display='inline-flex' width='1em' height='1em' t='1762335529080' class='icon' viewBox='0 0 1024 1024' version='1.1' xmlns='http://www.w3.org/2000/svg' p-id='11802' xmlns:xlink='http://www.w3.org/1999/xlink'%3E%3Cpath d='M170.666667 128h682.666666a42.666667 42.666667 0 0 1 42.666667 42.666667v298.666666H128V170.666667a42.666667 42.666667 0 0 1 42.666667-42.666667zM128 554.666667h768v298.666666a42.666667 42.666667 0 0 1-42.666667 42.666667H170.666667a42.666667 42.666667 0 0 1-42.666667-42.666667v-298.666666z m170.666667 128v85.333333h128v-85.333333H298.666667zM298.666667 256v85.333333h128V256H298.666667z' fill='currentColor' p-id='11803'%3E%3C/path%3E%3C/svg%3E");-webkit-mask:var(--un-icon) no-repeat;mask:var(--un-icon) no-repeat;-webkit-mask-size:100% 100%;mask-size:100% 100%;background-color:currentColor;color:inherit;display:inline-flex;width:1em;height:1em}.i-soft-dns-menu{--un-icon:url("data:image/svg+xml;utf8,%3Csvg display='inline-flex' width='1em' height='1em' t='1762241899839' class='icon' viewBox='0 0 1025 1024' version='1.1' xmlns='http://www.w3.org/2000/svg' p-id='12295' xmlns:xlink='http://www.w3.org/1999/xlink'%3E%3Cpath d='M163.231468 552.233328c6.707287 4.471525 14.905083 6.707287 23.102879 6.707287 12.669321-0.745254 24.593387-5.216779 33.536437-14.159829 17.8861-17.8861 17.8861-46.951012 0-65.582365-8.94305-8.94305-20.867116-13.414575-33.536437-14.159829-8.197796 0-16.395591 2.235762-23.102879 6.707287-7.452542 4.471525-12.669321 10.433558-17.140846 17.140846-8.197796 14.159829-8.197796 31.300674 0 46.205757 4.471525 6.707287 10.433558 13.414575 17.140846 17.140846zM1024.74527 791.459911c0-11.924066-4.471525-23.848133-13.414575-32.791182-8.94305-8.94305-20.121862-13.414575-32.791183-14.159829H46.226566c-12.669321 0.745254-23.848133 5.216779-32.791183 14.159829-8.94305 8.94305-13.414575 20.121862-13.414575 32.791182v186.313539c-0.745254 24.593387 18.631354 45.460503 43.969995 46.205757H978.539512c24.593387 0.745254 45.460503-18.631354 45.460504-43.969995v-188.549301z m-46.205758 0v186.313539H46.226566v-186.313539h932.312946z' p-id='12296' fill='currentColor'%3E%3C/path%3E%3Cpath d='M978.539512 371.881823H46.226566c-12.669321 0-24.593387 4.471525-32.791183 13.414575C5.237587 394.984702 0.766062 406.908768 0.766062 418.832834v185.568285c0 12.669321 4.471525 24.593387 13.414575 33.536437 8.197796 8.94305 20.121862 14.159829 32.791183 13.414574h932.312946c12.669321 0 24.593387-4.471525 32.791183-13.414574 8.94305-8.94305 13.414575-20.867116 13.414575-33.536437V418.832834c0-12.669321-4.471525-24.593387-13.414575-33.536436-8.94305-8.197796-20.867116-13.414575-33.536437-13.414575z m0 46.951011v185.568285H46.226566V418.832834h932.312946zM980.775275 0H46.226566C34.302499 0 22.378433 4.471525 13.435383 13.414575 5.237587 21.61237 0.020808 33.536437 0.766062 45.460503v186.313539c0 11.924066 4.471525 23.848133 13.414575 32.791183 8.94305 8.94305 20.121862 13.414575 32.791183 14.159829h932.312946c12.669321-0.745254 23.848133-5.216779 32.791183-14.159829 8.94305-8.94305 13.414575-20.867116 13.414575-32.791183v-186.313539c0-24.593387-20.121862-44.715249-44.715249-45.460503z m-2.235763 232.519296H46.226566v-186.313538h932.312946v186.313538z' p-id='12297' fill='currentColor'%3E%3C/path%3E%3Cpath d='M163.231468 179.606251c18.631354 10.433558 40.988978 7.452542 55.894061-6.707287 8.94305-8.197796 14.159829-20.121862 13.414575-32.791183 0-26.083895-20.867116-46.951012-46.205757-46.951012h-0.745255c-8.197796 0-15.650337 2.235762-23.102878 5.962033s-12.669321 9.688304-17.140846 17.140846c-8.197796 14.905083-8.197796 32.045929 0 46.951012 5.216779 6.707287 11.178812 12.669321 17.8861 16.395591z' p-id='12298' fill='currentColor'%3E%3C/path%3E%3C/svg%3E");-webkit-mask:var(--un-icon) no-repeat;mask:var(--un-icon) no-repeat;-webkit-mask-size:100% 100%;mask-size:100% 100%;background-color:currentColor;color:inherit;display:inline-flex;width:1em;height:1em}.i-soft-dns-open{background:url("data:image/svg+xml;utf8,%3Csvg display='inline-flex' width='1em' height='1em' t='1762328247815' class='icon' viewBox='0 0 1024 1024' version='1.1' xmlns='http://www.w3.org/2000/svg' p-id='7956' xmlns:xlink='http://www.w3.org/1999/xlink'%3E%3Cpath d='M341.333333 386.773333h341.333334a85.333333 85.333333 0 0 1 85.333333 85.333334v149.333333a234.752 234.752 0 0 1-177.28 227.584A64 64 0 0 1 533.333333 941.44h-42.666666a64 64 0 0 1-57.386667-92.416A234.752 234.752 0 0 1 256 621.44v-149.333333a85.333333 85.333333 0 0 1 85.333333-85.333334z m85.333334-42.666666H341.333333v-213.333334a42.666667 42.666667 0 1 1 85.333334 0v213.333334z m256 0H597.333333v-213.333334a42.666667 42.666667 0 1 1 85.333334 0v213.333334z' p-id='7957' fill='%234CAF50'%3E%3C/path%3E%3C/svg%3E") no-repeat;background-size:100% 100%;background-color:transparent;display:inline-flex;width:1em;height:1em}.i-soft-dns-reload{background:url("data:image/svg+xml;utf8,%3Csvg display='inline-flex' width='1em' height='1em' t='1762410163124' class='icon' viewBox='0 0 1024 1024' version='1.1' xmlns='http://www.w3.org/2000/svg' p-id='32942' xmlns:xlink='http://www.w3.org/1999/xlink'%3E%3Cpath d='M758.5792 234.2912c0 29.0816 23.3472 52.4288 52.4288 52.4288 29.0816 0 52.4288-23.3472 52.4288-52.4288s-23.7568-52.4288-52.4288-52.4288c-29.0816 0-52.4288 23.7568-52.4288 52.4288zM855.6544 516.9152c0 23.3472 12.288 44.2368 31.9488 56.1152 19.6608 11.8784 45.056 11.8784 64.7168 0a65.3312 65.3312 0 0 0 0-112.2304c-19.6608-11.8784-45.056-11.8784-64.7168 0s-31.9488 33.1776-31.9488 56.1152zM736.8704 801.1776c0 27.0336 14.7456 52.4288 38.0928 65.9456 23.3472 13.5168 52.4288 13.5168 76.1856 0 23.3472-13.5168 38.0928-38.912 38.0928-65.9456s-14.7456-52.4288-38.0928-65.9456c-23.3472-13.5168-52.4288-13.5168-76.1856 0-23.3472 13.9264-38.0928 38.912-38.0928 65.9456zM440.7296 915.0464c0 31.5392 16.7936 60.2112 44.2368 76.1856 27.0336 15.9744 61.0304 15.9744 88.064 0a89.2928 89.2928 0 0 0 44.2368-76.1856c0-31.5392-16.7936-60.2112-44.2368-76.1856-27.0336-15.9744-61.0304-15.9744-88.064 0-26.624 15.9744-44.2368 45.056-44.2368 76.1856zM151.1424 797.0816c0 35.2256 18.432 67.584 49.152 84.7872 30.3104 17.2032 67.584 17.2032 97.8944 0a97.4848 97.4848 0 0 0 48.7424-84.7872 97.8944 97.8944 0 0 0-97.8944-97.8944c-54.4768-0.8192-97.8944 43.8272-97.8944 97.8944zM426.8032 124.1088c0 57.344 46.6944 104.0384 104.0384 104.0384s104.0384-46.6944 104.0384-104.0384c0-36.864-19.6608-71.2704-51.6096-89.7024-31.9488-18.432-72.0896-18.432-104.0384 0a103.6288 103.6288 0 0 0-52.4288 89.7024zM144.9984 236.7488c0 36.864 19.6608 71.2704 51.6096 89.7024 31.9488 18.432 72.0896 18.432 104.0384 0a102.8096 102.8096 0 0 0 52.4288-89.7024c0-57.344-46.6944-104.0384-104.0384-104.0384-57.344 0-104.0384 46.2848-104.0384 104.0384zM39.7312 514.048c0 54.8864 44.2368 99.1232 99.1232 99.1232s99.1232-44.2368 99.1232-99.1232c0-54.8864-44.2368-99.1232-99.1232-99.1232-54.8864 0-99.1232 44.2368-99.1232 99.1232z' p-id='32943' fill='%2320A53A'%3E%3C/path%3E%3C/svg%3E") no-repeat;background-size:100% 100%;background-color:transparent;display:inline-flex;width:1em;height:1em}.i-soft-dns-restart{background:url("data:image/svg+xml;utf8,%3Csvg display='inline-flex' width='1em' height='1em' t='1762327725612' class='icon' viewBox='0 0 1024 1024' version='1.1' xmlns='http://www.w3.org/2000/svg' p-id='5980' xmlns:xlink='http://www.w3.org/1999/xlink'%3E%3Cpath d='M512.170724 1024c-282.416084 0-512.17061-208.087082-512.17061-463.888037 0-255.744085 229.754526-463.774297 512.17061-463.774298h8.24614V0l247.327335 149.681662-247.384205 149.567921V203.025658H512.170724c-216.674442 0-392.857492 160.259469-392.857492 357.200045 0 196.940575 176.23992 357.086305 392.857492 357.086304s392.857492-160.202599 392.857491-357.200044c0-29.401755 26.728868-53.343996 59.656559-53.343997 32.870821 0 59.599689 23.942241 59.599689 53.343997 0 123.521493-53.173387 239.877374-149.795401 327.570809-96.906365 87.864045-225.546151 136.317228-362.318338 136.317228z' fill='%2320A53A' p-id='5981'%3E%3C/path%3E%3C/svg%3E") no-repeat;background-size:100% 100%;background-color:transparent;display:inline-flex;width:1em;height:1em}.i-soft-dns-server{--un-icon:url("data:image/svg+xml;utf8,%3Csvg display='inline-flex' width='1em' height='1em' t='1762241874270' class='icon' viewBox='0 0 1024 1024' version='1.1' xmlns='http://www.w3.org/2000/svg' p-id='10262' xmlns:xlink='http://www.w3.org/1999/xlink' %3E%3Cpath d='M306.820741 191.525926c-51.579259 11.188148-103.632593 63.241481-114.820741 114.820741-21.428148 99.176296 53.475556 186.785185 148.954074 186.785185l152.651852 0 0-6.447407 0-31.478519L493.605926 333.937778l-0.18963 0C489.623704 241.682963 403.816296 170.571852 306.820741 191.525926zM455.68 455.205926l-114.725926 0c-63.905185 0-115.579259-52.242963-114.725926-116.337778 0.853333-61.819259 51.294815-112.260741 113.114074-113.114074 64.094815-0.853333 116.337778 50.820741 116.337778 114.725926L455.68 455.205926z' fill='currentColor' p-id='10263'%3E%3C/path%3E%3Cpath d='M832.663704 306.346667c-11.188148-51.579259-63.241481-103.632593-114.820741-114.820741-96.900741-20.954074-182.802963 50.157037-186.595556 142.506667l-0.18963 0 0 121.173333 0 31.478519 0 6.447407 152.651852 0C779.093333 493.131852 854.091852 405.522963 832.663704 306.346667zM568.983704 340.48c0-63.905185 52.242963-115.579259 116.337778-114.725926 61.819259 0.853333 112.260741 51.294815 113.114074 113.114074 0.853333 64.094815-50.820741 116.337778-114.725926 116.337778l-114.725926 0L568.983704 340.48z' fill='currentColor' p-id='10264'%3E%3C/path%3E%3Cpath d='M192 717.842963c11.188148 51.579259 63.241481 103.632593 114.820741 114.820741 96.900741 20.954074 182.802963-50.157037 186.595556-142.506667l0.18963 0L493.605926 568.983704l0-31.478519 0-6.447407-152.651852 0C245.475556 531.057778 170.571852 618.666667 192 717.842963zM455.68 683.70963c0 63.905185-52.242963 115.579259-116.337778 114.725926-61.819259-0.853333-112.260741-51.294815-113.114074-113.114074-0.853333-64.094815 50.820741-116.337778 114.725926-116.337778l114.725926 0L455.68 683.70963z' fill='currentColor' p-id='10265'%3E%3C/path%3E%3Cpath d='M683.70963 531.057778l-152.651852 0 0 6.447407 0 31.478519 0 121.173333 0.18963 0c3.887407 92.34963 89.694815 163.460741 186.595556 142.506667 51.579259-11.188148 103.632593-63.241481 114.820741-114.820741C854.091852 618.666667 779.093333 531.057778 683.70963 531.057778zM798.435556 685.321481C797.582222 747.140741 747.140741 797.582222 685.321481 798.435556c-64.094815 0.853333-116.337778-50.820741-116.337778-114.725926l0-114.725926 114.725926 0C747.614815 568.983704 799.288889 621.226667 798.435556 685.321481z' fill='currentColor' p-id='10266'%3E%3C/path%3E%3C/svg%3E");-webkit-mask:var(--un-icon) no-repeat;mask:var(--un-icon) no-repeat;-webkit-mask-size:100% 100%;mask-size:100% 100%;background-color:currentColor;color:inherit;display:inline-flex;width:1em;height:1em}.i-soft-dns-stop{background:url("data:image/svg+xml;utf8,%3Csvg display='inline-flex' width='1em' height='1em' t='1762327609688' class='icon' viewBox='0 0 1024 1024' version='1.1' xmlns='http://www.w3.org/2000/svg' p-id='4672' xmlns:xlink='http://www.w3.org/1999/xlink'%3E%3Cpath d='M320 128A64 64 0 0 0 256 192v640a64 64 0 0 0 128 0v-640A64 64 0 0 0 320 128z m384 0A64 64 0 0 0 640 192v640a64 64 0 0 0 128 0v-640A64 64 0 0 0 704 128z' fill='%2320A53A' p-id='4673'%3E%3C/path%3E%3C/svg%3E") no-repeat;background-size:100% 100%;background-color:transparent;display:inline-flex;width:1em;height:1em}.i-soft-dns-system{--un-icon:url("data:image/svg+xml;utf8,%3Csvg display='inline-flex' width='1em' height='1em' t='1762241912388' class='icon' viewBox='0 0 1024 1024' version='1.1' xmlns='http://www.w3.org/2000/svg' p-id='13400' xmlns:xlink='http://www.w3.org/1999/xlink'%3E%3Cpath d='M608 96c35.3456 0 64 28.6544 64 64v192c0 35.3456-28.6544 64-64 64h-72v71.9984L760 488c34.992 0 63.4256 28.0832 63.992 62.9424L824 552v56h72c35.3456 0 64 28.6544 64 64v192c0 35.3456-28.6544 64-64 64H704c-35.3456 0-64-28.6544-64-64V672c0-35.3456 28.6544-64 64-64h72v-56c0-8.688-6.9232-15.7568-15.552-15.9936L760 536H264c-8.688 0-15.7568 6.9232-15.9936 15.552L248 552v56h72c35.3456 0 64 28.6544 64 64v192c0 35.3456-28.6544 64-64 64H128c-35.3456 0-64-28.6544-64-64V672c0-35.3456 28.6544-64 64-64h72v-56c0-34.992 28.0832-63.4256 62.9424-63.992L264 488l224-0.0016V416h-72c-35.3456 0-64-28.6544-64-64V160c0-35.3456 28.6544-64 64-64h192zM320 656H128c-8.8368 0-16 7.1632-16 16v192c0 8.8368 7.1632 16 16 16h192c8.8368 0 16-7.1632 16-16V672c0-8.8368-7.1632-16-16-16z m576 0H704c-8.8368 0-16 7.1632-16 16v192c0 8.8368 7.1632 16 16 16h192c8.8368 0 16-7.1632 16-16V672c0-8.8368-7.1632-16-16-16zM608 144H416c-8.8368 0-16 7.1632-16 16v192c0 8.8368 7.1632 16 16 16h192c8.8368 0 16-7.1632 16-16V160c0-8.8368-7.1632-16-16-16z' fill='currentColor' p-id='13401'%3E%3C/path%3E%3C/svg%3E");-webkit-mask:var(--un-icon) no-repeat;mask:var(--un-icon) no-repeat;-webkit-mask-size:100% 100%;mask-size:100% 100%;background-color:currentColor;color:inherit;display:inline-flex;width:1em;height:1em}.i-soft-dns-uninstall{--un-icon:url("data:image/svg+xml;utf8,%3Csvg display='inline-flex' width='1em' height='1em' t='1762327863599' class='icon' viewBox='0 0 1024 1024' version='1.1' xmlns='http://www.w3.org/2000/svg' p-id='7095' xmlns:xlink='http://www.w3.org/1999/xlink'%3E%3Cpath d='M464.18 82.59h96.4v96.37h-96.4z' p-id='7096' fill='currentColor'%3E%3C/path%3E%3Cpath d='M78.68 169.93h867.35v96.37H78.68z' p-id='7097' fill='%23ffffff'%3E%3C/path%3E%3Cpath d='M849.65 940.93h-674.6v-771h674.6v771z m-578.22-96.37h481.85V266.31H271.43v578.25z' p-id='7098' fill='currentColor'%3E%3C/path%3E%3Cpath d='M367.8 362.68h96.37v385.5H367.8zM560.53 362.68h96.37v385.5h-96.37z' p-id='7099' fill='currentColor'%3E%3C/path%3E%3C/svg%3E");-webkit-mask:var(--un-icon) no-repeat;mask:var(--un-icon) no-repeat;-webkit-mask-size:100% 100%;mask-size:100% 100%;background-color:currentColor;color:inherit;display:inline-flex;width:1em;height:1em}.i-solar\:close-circle-bold{--un-icon:url("data:image/svg+xml;utf8,%3Csvg viewBox='0 0 24 24' display='inline-flex' width='1em' height='1em' xmlns='http://www.w3.org/2000/svg' %3E%3Cpath fill='currentColor' fill-rule='evenodd' d='M22 12c0 5.523-4.477 10-10 10S2 17.523 2 12S6.477 2 12 2s10 4.477 10 10M8.97 8.97a.75.75 0 0 1 1.06 0L12 10.94l1.97-1.97a.75.75 0 0 1 1.06 1.06L13.06 12l1.97 1.97a.75.75 0 0 1-1.06 1.06L12 13.06l-1.97 1.97a.75.75 0 0 1-1.06-1.06L10.94 12l-1.97-1.97a.75.75 0 0 1 0-1.06' clip-rule='evenodd'/%3E%3C/svg%3E");-webkit-mask:var(--un-icon) no-repeat;mask:var(--un-icon) no-repeat;-webkit-mask-size:100% 100%;mask-size:100% 100%;background-color:currentColor;color:inherit;display:inline-flex;width:1em;height:1em}.i-streamline\:delete-1-solid{--un-icon:url("data:image/svg+xml;utf8,%3Csvg viewBox='0 0 14 14' display='inline-flex' width='1em' height='1em' xmlns='http://www.w3.org/2000/svg' %3E%3Cpath fill='currentColor' fill-rule='evenodd' d='M1.707.293A1 1 0 0 0 .293 1.707L5.586 7L.293 12.293a1 1 0 1 0 1.414 1.414L7 8.414l5.293 5.293a1 1 0 0 0 1.414-1.414L8.414 7l5.293-5.293A1 1 0 0 0 12.293.293L7 5.586z' clip-rule='evenodd'/%3E%3C/svg%3E");-webkit-mask:var(--un-icon) no-repeat;mask:var(--un-icon) no-repeat;-webkit-mask-size:100% 100%;mask-size:100% 100%;background-color:currentColor;color:inherit;display:inline-flex;width:1em;height:1em}.i-svg-spinners\:3-dots-fade{--un-icon:url("data:image/svg+xml;utf8,%3Csvg viewBox='0 0 24 24' display='inline-flex' width='1em' height='1em' xmlns='http://www.w3.org/2000/svg' %3E%3Ccircle cx='4' cy='12' r='3' fill='currentColor'%3E%3Canimate id='SVG7x14Dcom' fill='freeze' attributeName='opacity' begin='0;SVGqSjG0dUp.end-0.25s' dur='0.75s' values='1;.2'/%3E%3C/circle%3E%3Ccircle cx='12' cy='12' r='3' fill='currentColor' opacity='.4'%3E%3Canimate fill='freeze' attributeName='opacity' begin='SVG7x14Dcom.begin+0.15s' dur='0.75s' values='1;.2'/%3E%3C/circle%3E%3Ccircle cx='20' cy='12' r='3' fill='currentColor' opacity='.3'%3E%3Canimate id='SVGqSjG0dUp' fill='freeze' attributeName='opacity' begin='SVG7x14Dcom.begin+0.3s' dur='0.75s' values='1;.2'/%3E%3C/circle%3E%3C/svg%3E");-webkit-mask:var(--un-icon) no-repeat;mask:var(--un-icon) no-repeat;-webkit-mask-size:100% 100%;mask-size:100% 100%;background-color:currentColor;color:inherit;display:inline-flex;width:1em;height:1em}.i-svg-spinners\:90-ring-with-bg{--un-icon:url("data:image/svg+xml;utf8,%3Csvg viewBox='0 0 24 24' display='inline-flex' width='1em' height='1em' xmlns='http://www.w3.org/2000/svg' %3E%3Cpath fill='currentColor' d='M12,1A11,11,0,1,0,23,12,11,11,0,0,0,12,1Zm0,19a8,8,0,1,1,8-8A8,8,0,0,1,12,20Z' opacity='.25'/%3E%3Cpath fill='currentColor' d='M10.14,1.16a11,11,0,0,0-9,8.92A1.59,1.59,0,0,0,2.46,12,1.52,1.52,0,0,0,4.11,10.7a8,8,0,0,1,6.66-6.61A1.42,1.42,0,0,0,12,2.69h0A1.57,1.57,0,0,0,10.14,1.16Z'%3E%3CanimateTransform attributeName='transform' dur='0.75s' repeatCount='indefinite' type='rotate' values='0 12 12;360 12 12'/%3E%3C/path%3E%3C/svg%3E");-webkit-mask:var(--un-icon) no-repeat;mask:var(--un-icon) no-repeat;-webkit-mask-size:100% 100%;mask-size:100% 100%;background-color:currentColor;color:inherit;display:inline-flex;width:1em;height:1em}.i-system\:alibaba{background:url("data:image/svg+xml;utf8,%3Csvg display='inline-flex' width='1em' height='1em' id='_图层_1' data-name='图层_1' xmlns='http://www.w3.org/2000/svg' version='1.1' viewBox='0 0 1024 1024'%3E%3C!-- Generator: Adobe Illustrator 29.0.1, SVG Export Plug-In . SVG Version: 2.1.0 Build 192) --%3E%3Cdefs%3E%3Cstyle%3E.st0 {fill: %23f76e05;}%3C/style%3E%3C/defs%3E%3Cpath class='st0' d='M224.55,659.8c-18.73-3.86-32.23-20.25-32.44-39.37v-216.85c.74-18.92,14.01-35.03,32.44-39.37l201.33-43.6,21.16-86.3h-233.84c-81.84-.57-148.63,65.31-149.2,147.15,0,.32,0,.64,0,.97v256.28c.53,82.19,67.01,148.71,149.2,149.27h233.71l-21.16-85.92-201.33-42.19.13-.06ZM810.28,234.3h-235.51l21.48,86.24,201.33,43.6c18.7,3.93,32.16,20.33,32.38,39.43v216.85c-.76,18.91-13.99,35.01-32.38,39.43l-201.33,43.6-21.48,86.24h235.51c82.51.18,149.54-66.57,149.72-149.08,0-.17,0-.34,0-.51v-257.63c-1.02-82.01-67.7-148.01-149.72-148.18Z'/%3E%3Cpath class='st0' d='M425.89,500.72h171.71v21.16h-171.71v-21.16Z'/%3E%3C/svg%3E") no-repeat;background-size:100% 100%;background-color:transparent;display:inline-flex;width:1em;height:1em}.i-system\:alma{background:url("data:image/svg+xml;utf8,%3Csvg display='inline-flex' width='1em' height='1em' id='_图层_1' data-name='图层_1' xmlns='http://www.w3.org/2000/svg' version='1.1' viewBox='0 0 1024 1024'%3E%3C!-- Generator: Adobe Illustrator 29.0.1, SVG Export Plug-In . SVG Version: 2.1.0 Build 192) --%3E%3Cdefs%3E%3Cstyle%3E.st0 {fill: %2386da2f;}.st1 {fill: %23ffcb12;}.st2 {fill: %230069da;}.st3 {fill: %23ff4649;}.st4 {fill: %2324c2ff;}%3C/style%3E%3C/defs%3E%3Cpath class='st0' d='M887.84,568.74c38.14-2.92,68.99,22.01,71.95,60.19,2.92,39.66-25.01,71.95-63.15,74.87-36.85,2.71-68.99-24.83-71.95-61.67-2.96-39.62,23.45-69.03,63.11-73.43v.04h.04Z'/%3E%3Cpath class='st4' d='M423.92,881.47c0-38.14,29.37-67.51,64.59-67.51s69.03,32.33,69.03,68.99-29.33,66.11-63.11,67.55c-42.58,0-70.51-26.49-70.51-68.99v-.04Z'/%3E%3Cpath class='st1' d='M528.12,452.77c-5.84,2.96-8.8-1.44-10.25-5.84-54.3-101.36-38.18-229.06,57.26-305.41,24.97-20.53,71.95-25.01,92.48-4.4,8.8,7.4,10.28,16.13,11.76,26.41,2.92,22.05,7.32,44.06,22.05,61.67,16.13,19.13,36.66,26.41,60.15,25.01,20.53,0,41.1-2.92,54.34,20.53,7.32,13.24,4.4,64.55-7.32,74.83-5.88,4.44-10.28,1.48-14.69,0-33.81-13.21-69.03-13.21-104.28-7.32-11.73,1.44-17.61-1.48-17.61-14.69-1.48-22.05-5.84-42.58-17.61-61.67-22.01-39.66-63.11-41.14-89.56-4.4-22.01,29.37-27.85,64.59-33.77,99.88-5.88,30.77-4.4,63.11-2.96,95.44v-.04Z'/%3E%3Cpath class='st0' d='M564.82,474.78c-2.92-4.44-1.48-8.8,2.92-11.73,83.72-76.35,208.53-91.04,305.41-16.17,24.93,20.57,41.1,63.15,27.89,88.12-4.67,8.62-12.64,14.98-22.09,17.61-20.53,8.8-39.62,17.65-52.82,36.7-13.21,19.17-16.13,41.1-10.25,64.67,4.4,19.05,11.73,39.58-7.36,57.19-10.25,10.28-60.19,19.13-73.39,10.28-5.84-4.4-4.4-8.8-2.96-14.69,4.4-36.7-4.4-70.51-17.61-102.76-4.4-11.73-2.92-17.61,8.8-20.53,20.57-5.84,39.7-16.17,54.34-30.81,32.29-30.81,25.01-70.43-17.61-88.08-33.77-14.73-68.99-11.76-102.76-8.8-32.26,1.44-63.11,10.25-92.48,19.09,0,0-.04-.08-.04-.08Z'/%3E%3Cpath class='st4' d='M545.73,512.95c4.4-4.4,7.4-2.96,11.76,0,96.88,58.75,146.78,174.68,102.76,287.77-11.76,29.41-49.94,58.75-77.79,51.42-11.73-2.88-17.65-8.8-23.53-16.13-13.21-17.69-27.89-33.81-49.86-41.1-23.49-7.32-44.1-2.92-64.67,8.8-17.57,10.28-35.18,23.49-57.19,10.28-13.24-7.36-35.25-52.82-30.85-67.51,2.92-5.84,8.8-5.84,14.73-5.84,36.66-5.88,66.07-23.49,93.96-47.02,8.8-7.36,16.13-7.36,23.45,2.92,11.76,17.61,26.41,32.29,45.5,42.54,38.18,22.09,74.87,2.96,79.27-41.06,4.4-36.7-8.8-68.95-20.53-101.28-13.34-29.15-29.07-57.15-47.02-83.72v-.08Z'/%3E%3Cpath class='st2' d='M498.75,521.8c-5.84,29.33-19.09,57.23-36.62,82.2-52.9,79.24-129.25,111.57-223.22,102.76-33.74-2.96-61.67-30.85-64.55-58.75-1.66-10.61,1.58-21.39,8.8-29.33,10.25-13.21,19.09-25.01,23.45-41.1,8.8-32.33-2.92-58.75-26.41-82.2-32.26-32.33-27.85-61.71,10.28-85.16,4.4-2.96,10.28-5.84,16.13-8.8,8.8-4.4,16.17-4.4,19.13,5.84,13.24,33.77,39.62,58.75,69.03,79.31,10.28,8.8,10.28,14.65,1.48,24.97-17.63,18.79-28.03,43.22-29.37,68.95-2.92,32.33,16.17,52.9,48.42,52.9,20.57,0,39.62-7.32,57.26-16.13,45.5-23.53,80.72-57.26,114.53-92.56,4.4-1.48,5.84-4.4,11.73-2.92h-.08Z'/%3E%3Cpath class='st3' d='M258.01,213.46c2.92,0,10.25,1.44,17.61,2.92,54.34,10.28,88.08-8.8,105.69-60.23,11.73-33.74,36.7-44.06,69.03-26.41,1.44,0,1.44,1.48,2.92,1.48,33.74,19.09,33.74,22.01,13.21,51.42-17.61,23.45-26.49,49.86-30.81,77.79-2.92,16.17-8.8,19.13-23.49,13.24-23.45-8.84-48.42-8.84-73.39,0-27.89,8.76-39.62,33.7-30.81,61.63,11.73,36.7,44.02,52.9,71.87,71.95,27.93,19.13,60.23,29.41,91.04,42.58,4.44,1.44,11.73,1.44,10.28,8.8-1.48,4.44-7.36,4.44-13.24,4.44-66.07,2.92-129.14-7.4-180.56-51.42-48.46-39.62-83.68-88.04-77.83-155.59,4.4-22.05,20.57-38.18,48.5-42.58,0,0,0-.04,0-.04Z'/%3E%3Cpath class='st2' d='M137.63,626c-35.22,4.4-70.43-24.97-73.43-61.67-2.92-35.22,26.41-70.51,60.19-73.39,38.14-4.48,73.39,21.97,76.35,57.19,1.44,33.81-20.57,74.91-63.15,77.79v.08h.04Z'/%3E%3Cpath class='st1' d='M754.26,103.37c36.66-2.96,71.95,26.41,74.87,63.11,2.96,35.25-26.49,69.03-61.67,71.91-38.18,2.96-71.95-24.93-74.87-61.67-2.96-36.7,23.45-70.43,61.67-73.35Z'/%3E%3Cpath class='st3' d='M371.05,131.19c4.44,38.18-22.09,70.47-61.71,76.35-33.74,4.44-68.99-23.45-73.39-55.71-4.44-42.62,19.09-73.47,58.75-77.87,36.66-4.44,71.87,23.45,76.35,57.23Z'/%3E%3C/svg%3E") no-repeat;background-size:100% 100%;background-color:transparent;display:inline-flex;width:1em;height:1em}.i-system\:anolis{background:url("data:image/svg+xml;utf8,%3Csvg display='inline-flex' width='1em' height='1em' id='_图层_1' data-name='图层_1' xmlns='http://www.w3.org/2000/svg' version='1.1' viewBox='0 0 1024 1024'%3E%3C!-- Generator: Adobe Illustrator 29.0.1, SVG Export Plug-In . SVG Version: 2.1.0 Build 192) --%3E%3Cdefs%3E%3Cstyle%3E.st0 {fill: %2359ab2d;}%3C/style%3E%3C/defs%3E%3Cpath class='st0' d='M513.19,63.99c-118.97,0-233.12,47.59-317.24,132.51-84.27,85.23-131.5,200.27-131.42,320.13,0,4.23.5,8.41.55,12.54l-1,310.87c-.8,20.21,3.83,40.32,13.39,58.24,9.46,17.87,20.91,31.36,40.82,43.61,19.71,12.2,36.74,16.48,56.9,16.88,20.14.43,40.04-4.55,57.59-14.44,35.88-20.29,58.14-58.24,58.34-99.46v-34.5l1.39-163.52v-127.88c.33-23.73-8.17-46.74-23.84-64.56-25.17-29.14-22.89-72.94,5.18-99.31,28-26.27,71.92-25.16,98.56,2.49,26.72,27.71,26.85,71.54.3,99.41-15.67,17.17-24.2,39.68-23.84,62.92v26.98s11.9,100.21,82.73,10.06l44.8-73.77c12.3-20.26,16.78-44.5,12.44-67.85-7.29-37.94,17.01-74.76,54.76-82.98,37.74-7.95,74.88,15.82,83.48,53.41,8.98,37.56-13.57,75.45-50.87,85.47-22.1,6.47-40.82,21.16-52.52,40.97l-47.44,77.85s-24.24,46.19,31.61,46.19l64.21-2.04c23.05-.3,45.1-9.46,61.68-25.54,26.72-27.62,70.7-28.55,98.56-2.09,27.98,26.38,29.92,70.49,4.48,99.36-25.31,28.98-69.27,32.09-98.41,6.97-17.83-15.56-40.86-23.84-64.51-23.2,0,0-64.81-1-107.97,48.58-35.01,39.96-43.44,96.69-21.55,145.11,1.14,2.49,2.49,4.93,3.68,7.72l1.49,2.24c.95,1.69,1.99,3.29,2.99,4.88l1.79,2.74c1,1.49,1.99,2.79,3.14,4.18l2.24,2.84c1.1,1.39,2.19,2.69,3.34,3.88l2.64,2.89,3.58,3.63,2.99,2.69,3.98,3.48,3.34,2.49,4.43,3.29c1.13.83,2.29,1.61,3.48,2.34,1.6,1.1,3.26,2.09,4.98,2.99l3.78,2.29c1.79,1,3.63,1.94,5.43,2.79l4.08,1.99,6.37,2.59,4.03,1.69,7.72,2.64,3.34,1.1c3.93,1.24,7.67,2.24,12.1,3.24l2.39.5c3.53.75,7.12,1.49,10.65,2.09l4.98.75c2.94.45,5.87.9,9.01,1.19l5.97.6,8.11.6c8.61.55,17.32.3,25.89-.55,223.81-48.93,375.14-260,351.24-489.73-23.84-229.78-215.34-404.45-444.28-405.45h-.05Z'/%3E%3C/svg%3E") no-repeat;background-size:100% 100%;background-color:transparent;display:inline-flex;width:1em;height:1em}.i-system\:arch{background:url("data:image/svg+xml;utf8,%3Csvg display='inline-flex' width='1em' height='1em' id='_图层_1' data-name='图层_1' xmlns='http://www.w3.org/2000/svg' version='1.1' viewBox='0 0 1024 1024'%3E%3C!-- Generator: Adobe Illustrator 29.0.1, SVG Export Plug-In . SVG Version: 2.1.0 Build 192) --%3E%3Cdefs%3E%3Cstyle%3E.st0 {fill: %231793d1;}%3C/style%3E%3C/defs%3E%3Cpath class='st0' d='M511.92,64c-39.89,97.78-63.95,161.73-108.36,256.6,27.23,28.86,60.65,62.46,114.93,100.42-58.36-24.01-98.16-48.11-127.9-73.12-56.84,118.58-145.88,287.48-326.59,612.1,142.03-81.98,252.12-132.52,354.72-151.81-4.63-19.94-6.9-40.35-6.74-60.82l.17-4.55c2.25-90.97,49.59-160.93,105.66-156.18,56.07,4.75,99.66,82.4,97.41,173.37-.43,17.11-2.36,33.59-5.73,48.86,101.49,19.85,210.41,70.26,350.51,151.13-27.63-50.85-52.28-96.69-75.83-140.35-37.09-28.74-75.78-66.15-154.7-106.65,54.24,14.09,93.08,30.34,123.35,48.52-239.42-445.67-258.8-504.89-340.91-697.53Z'/%3E%3C/svg%3E") no-repeat;background-size:100% 100%;background-color:transparent;display:inline-flex;width:1em;height:1em}.i-system\:centos{background:url("data:image/svg+xml;utf8,%3Csvg display='inline-flex' width='1em' height='1em' id='_图层_1' data-name='图层_1' xmlns='http://www.w3.org/2000/svg' version='1.1' viewBox='0 0 1024 1024'%3E%3C!-- Generator: Adobe Illustrator 29.0.1, SVG Export Plug-In . SVG Version: 2.1.0 Build 192) --%3E%3Cdefs%3E%3Cstyle%3E.st0 {fill: %23ffa648;}.st1 {fill: %23ffa64c;}.st2 {fill: %232f3597;}.st3 {fill: %23a3248d;}.st4 {fill: %2392307f;}.st5 {fill: %23a6218e;}.st6 {fill: %232b30a5;}.st7 {fill: %232f3291;}.st8 {fill: %23a6cd3c;}.st9 {fill: %23f6ab46;}.st10 {fill: %23a4cb3e;}%3C/style%3E%3C/defs%3E%3Cpath class='st10' d='M195.23,340.05l31.68-31.68,20.38-20.35,20.35,20.35,146.04,146.04h40.74v-40.71l-146.04-146.04-20.38-20.41,20.38-20.35,31.65-31.65h-144.81v144.81Z'/%3E%3Cpath class='st8' d='M454.42,372.96v-177.75h-73.62l-52.07,52.07s125.68,125.68,125.68,125.68ZM195.23,380.82v73.62h177.75l-125.68-125.68s-52.07,52.07-52.07,52.07Z'/%3E%3Cpath class='st4' d='M736.03,247.28l-20.38,20.38-146.07,146.04v40.71h40.74l146.07-146.04,20.38-20.35,20.35,20.35,31.65,31.68v-144.81h-144.81l31.68,31.65,20.38,20.38Z'/%3E%3Cpath class='st9' d='M409.64,166.44h73.59v235.33l28.78,28.81,28.81-28.81v-235.33h73.62l-102.42-102.42-102.36,102.42Z'/%3E%3Cpath class='st3' d='M651.05,454.4h177.72v-73.59l-52.07-52.07-125.65,125.65Z'/%3E%3Cpath class='st5' d='M166.42,540.82h235.33l28.81-28.81-28.81-28.81h-235.33v-73.62l-102.42,102.42,102.42,102.42v-73.62Z'/%3E%3Cpath class='st1' d='M569.58,651.07v177.75h73.65l52.04-52.07s-125.68-125.68-125.68-125.68ZM651.05,569.6l125.65,125.68,52.07-52.07v-73.62s-177.72,0-177.72,0Z'/%3E%3Cpath class='st3' d='M569.58,372.96l125.68-125.68-52.04-52.04h-73.65v177.72Z'/%3E%3Cpath class='st0' d='M828.74,683.98l-31.65,31.68-20.38,20.35-20.35-20.35-146.04-146.07h-40.74v40.74l146.07,146.07,20.38,20.35-20.38,20.38-31.68,31.65h144.78v-144.81Z'/%3E%3Cpath class='st6' d='M857.58,483.21h-235.33l-28.78,28.81,28.78,28.81h235.33v73.62l102.42-102.42-102.42-102.42v73.62Z'/%3E%3Cpath class='st2' d='M247.29,695.28l125.65-125.68h-177.72v73.62l52.07,52.07Z'/%3E%3Cpath class='st7' d='M288,776.72l20.35-20.38,146.04-146.01v-40.74h-40.71l-146.07,146.07-20.35,20.35-20.35-20.35-31.68-31.68v144.81h144.84l-31.68-31.68s-20.38-20.38-20.38-20.38ZM614.42,857.59h-73.62v-235.36l-28.81-28.81-28.78,28.81v235.36h-73.62l102.42,102.39s102.39-102.39,102.39-102.39Z'/%3E%3Cpath class='st7' d='M454.42,651.07l-125.68,125.65,52.07,52.07h73.62v-177.72Z'/%3E%3C/svg%3E") no-repeat;background-size:100% 100%;background-color:transparent;display:inline-flex;width:1em;height:1em}.i-system\:debian{background:url("data:image/svg+xml;utf8,%3Csvg display='inline-flex' width='1em' height='1em' id='_图层_1' data-name='图层_1' xmlns='http://www.w3.org/2000/svg' version='1.1' viewBox='0 0 1024 1024'%3E%3C!-- Generator: Adobe Illustrator 29.0.1, SVG Export Plug-In . SVG Version: 2.1.0 Build 192) --%3E%3Cdefs%3E%3Cstyle%3E.st0 {fill: %23ce0c48;}%3C/style%3E%3C/defs%3E%3Cpath class='st0' d='M881.64,392.44c-2.99-34.03-9.55-67.66-19.56-100.32l11.64,3.88c-31.2-71.21-78.83-143.17-134.36-174.37-7.61-4.48-30.75,4.33-23.29-10.6s-32.84-7.17-49.71-4.18c-22.99,3.73-26.28-25.53-65.69-31.35-22.39-3.14-28.22,16.12-39.11,11.64-20.6-8.21-18.21-24.19-50.46-8.21-16.12,7.91,10.15-22.84-43-4.03l-4.48-10.9c-94.95,36.43-121.67,66.73-148.39,69.42-6.12,0-29.86,28.66-46.88,46.43-14.93,14.93-22.99,31.95-43,34.64l-14.93,61.81c-25.43,21.16-40.95,51.92-42.85,84.95-5.16-15.3-3.76-32.05,3.88-46.28-14.93,5.97-40.16,14.93-25.98,84.8,11.2,55.24-4.63,118.24,8.81,179.15,4.18,18.36,0,35.08,5.37,44.79,94.2,206.32,182.73,343.07,413.38,336.05l3.88-7.76c-24.63-5.97-48.22-14.93-97.64-26.87-16.27-3.88-20.15-29.86-35.23-38.67-8.21-4.78-24.78-3.58-32.55-8.66s3.73-18.96-17.47-12.54c-7.46,2.24-12.09-9.55-17.62-14.93s0-20.75-20.45-21.65c-20.45-.9-16.12-25.98-17.32-39.11-10.6,1.34-1.05-1.34-11.64,3.88-9.75-6.79-17.07-16.52-20.9-27.77-8.96-42.85-9.26-18.81-13.14-28.37-4.73-12.68-10.37-25-16.87-36.87l23.44,7.76h3.88l3.88-11.64-23.29-7.61h27.32c-6.72,12.24,1.79,4.63-11.79,7.76v11.64l19.56-7.76v-11.64c-18.06-8.96-25.08-11.64-43-19.26l7.91,7.76v3.88h-43c-19.26-12.99-12.24-27.77-15.68-46.43,14.93,0,8.06,5.82,14.93-11.5l-14.93,7.76,11.64-29.71-11.64,11.5c-25.53-33.89-14.18-85.54-10.45-133.02,1.51-32.54,13.03-63.83,32.99-89.57,7.76-8.81,4.48-22.09,4.78-32.55l27.32-23.14h15.68c6.72,14.93,4.18,4.78,0,19.26l7.76,3.88c6.27-7.61,5.37-5.23,7.76-19.26-8.81-9.26-6.12-8.66-23.29-11.64,20.44-33.84,58.22-53.26,97.64-50.16l3.88-11.64-15.68,7.91-3.88-11.5c18.36-16.11,42.18-24.6,66.58-23.74,5.52,0,6.12-14.93,11.2-17.02,141.38-53,270.66,8.21,324.71,128.99,2.93,9.82,5.32,19.78,7.17,29.86,14.93,49.86-6.27,106.29,8.51,136.15-6.87,31.5-32.1,12.09-35.23,27.02-7.46,36.13-12.99,52.25-35.68,68.97-8.3,7.37-17.3,13.92-26.87,19.56,9.59-9.58,16.36-21.61,19.56-34.78-93.01,97.64-229.76,55.98-253.79-92.71-4.75-30.68,6.92-61.61,30.75-81.51,81.36-76.59,131.38-45.83,180.04-17.91l-7.76-26.87c-28.81-21.35-14.93-17.32-7.91-50.16v-3.88l-15.68-11.5c2.24,8.81.9,4.63,7.91,14.93-3.88,14.03,0,7.91-7.76,14.93-13.14,8.51-20.75,6.42-39.11,3.88l3.88-11.64-11.64-11.64c0,10.3-3.58,2.39,0,14.93-110.33,8.66-190.79,70.02-156.31,227.67,1.26,13.12,3.86,26.08,7.76,38.67l-7.76,7.61-3.88-23.14h-11.79l-3.88,11.64c-11.05-22.54-.75,9.41,35.23,46.28,3.51,3.9,7.25,7.59,11.2,11.05,41.8,29.86,99.13,71.21,176.16,43h7.91v-3.88l-89.57-11.64-3.88-7.61c93.46,21.65,154.81-7.46,207.07-42.4,11.5-14.93,10-21.05,19.41-7.91,16.87-14.93,3.43-23.44,11.79-38.52,5.67-10.3,28.51-14.93,39.11-30.9l35.08-119.43h-14.93c2.69-12.54,19.71-29.86-3.88-42.4-2.24-1.34,7.91-1.19,7.76-3.73-1.65-20.65-8.31-40.58-19.41-58.07,28.96,18.96,31.8,59.72,46.88,92.56v7.76h3.88v-41.5h-1.04ZM459.75,585.02l-8.36-23.14,54.64,50.16-46.28-27.02ZM191.03,249.27l-20.3-3.88v34.78c14.63-9.26,16.57-9.11,19.56-30.9h.75ZM694.14,403.64c-10.3,10.14-15.74,24.23-14.93,38.67l11.79,7.61c13.69-11.79,15.42-32.37,3.88-46.28h-.75ZM822.97,550.39c22.99-10.15,47.77-50.76,31.35-84.95l-31.35,84.8v.15ZM670.7,480.82c-13.73,10.3-17.32,11.64-19.56,34.78l11.64,7.76,15.68-7.76c7.2-12.96,8.61-28.35,3.88-42.4-7.32,11.79-2.24,18.06-11.64,7.61ZM612.03,550.39c13.88-9.55,10.45-12.99,15.68-19.41v-4.18c-18.16,1.95-36.48,1.95-54.64,0-11.5-12.24-11.64-25.68-27.32-34.64,14.93,30.75,2.84,33.44,27.32,54.04,11.48,2.79,23.27,4.09,35.08,3.88,1.34,0-5.97-.9,3.88,0v.3ZM244.92,519.48h-11.79l-7.76,7.61c8.36,8.96,4.78,6.27,11.64-3.88l11.79,19.41,3.88-14.93-7.76-7.61v-.6ZM259.85,569.65l3.88-7.76c-8.81-7.61,0-3.14-11.64,0l-11.64-14.93,3.88,14.93v7.76h15.53Z'/%3E%3C/svg%3E") no-repeat;background-size:100% 100%;background-color:transparent;display:inline-flex;width:1em;height:1em}.i-system\:deepin{background:url("data:image/svg+xml;utf8,%3Csvg display='inline-flex' width='1em' height='1em' id='_图层_1' data-name='图层_1' xmlns='http://www.w3.org/2000/svg' version='1.1' viewBox='0 0 1024 1024'%3E%3C!-- Generator: Adobe Illustrator 29.0.1, SVG Export Plug-In . SVG Version: 2.1.0 Build 192) --%3E%3Cdefs%3E%3Cstyle%3E.st0 {fill: %23007cff;}%3C/style%3E%3C/defs%3E%3Cpath class='st0' d='M665.21,90c-64.37-23.52-130.28-29.87-194.31-23.89-74.22,5.85-110.43,28.81-108.27,24.67-121.37,43.31-223.99,136.52-271.48,267.19-84.58,232.72,35.25,490.09,267.58,574.84,232.5,84.75,489.44-35.28,574.08-268,84.64-232.7-35.19-490.06-267.64-574.78l.03-.03ZM374.05,890.73c-24.91-9.17-48.83-20.81-71.43-34.75l1.74.98c108.27,8.31,249.61-16.6,344.92-105.81,0,0,181.65-145.14,50.2-383.36,0,0,21.19,96.01-5.82,174.96,0,0-25.76,107.4-140.25,138.57-168.64,45.95-360.77-72.04-441.12-129.27-6.05-58.77-.67-119.47,20.91-178.74,31.92-87.8,91.95-156.34,165.28-202.35-18.29,128.26-3.81,246.38,17.02,295.86,27.97,66.33,76.52,143.72,171.35,153.63,94.83,9.97,147.08-78.76,147.08-78.76,48.69-73.91,56.31-180.06,55.55-182.64-.76-2.6-12.96-9.6-12.96-9.6-32.73,132.49-86.71,176.73-86.71,176.73-85.12,82.18-145.4,25.2-145.4,25.2-64.82-69.63-19.4-182.75-19.4-182.75,25.4-77.05,99.31-189.8,183.11-247.14,13.97,3.44,28,5.6,41.8,10.61,51.35,19.09,95.45,46.45,132.97,80.89l-.28-.25c-61.26,22.37-160.18,69.63-160.18,69.63-156.82,66.08-167.43,165.98-167.43,165.98-16.24,102.95,65.49,59.36,65.49,59.36,84.08-40.96,125.41-168.58,125.41-168.58-26.23-5.01-46.93,3-46.93,3-33.57,82.87-102.03,116.92-102.03,116.92-26.96,14.25-33.23-10.95-33.23-10.95-4.56-18.9,19.49-22.09,19.49-22.09,37.32-14.53,61.18-53.73,66.61-69.74,5.38-16.04,15.37-17.33,15.37-17.33,28.31-9.27,61.49-16.32,95.73-19.79l2.04-.17c63.47-7.81,160.63,22.49,160.63,22.49,20.04,7.94,40.49,14.81,61.26,20.58,35.61,89.01,41.24,190.31,5.96,287.46-76.13,209.43-307.46,317.48-516.71,241.24h-.03Z'/%3E%3C/svg%3E") no-repeat;background-size:100% 100%;background-color:transparent;display:inline-flex;width:1em;height:1em}.i-system\:opencloudos{background:url("data:image/svg+xml;utf8,%3Csvg display='inline-flex' width='1em' height='1em' id='_图层_1' data-name='图层_1' xmlns='http://www.w3.org/2000/svg' version='1.1' viewBox='0 0 1024 1024'%3E%3C!-- Generator: Adobe Illustrator 29.0.1, SVG Export Plug-In . SVG Version: 2.1.0 Build 192) --%3E%3Cdefs%3E%3Cstyle%3E.st0 {fill: %23060198;}.st1 {fill: %230368ec;}.st2 {fill: %2300c0ff;}%3C/style%3E%3C/defs%3E%3Cpath class='st0' d='M213.3,661.37l149.34-149.34,149.34,149.34c-82.47,82.48-216.19,82.49-298.67.02,0,0-.01-.01-.02-.02ZM511.98,362.68c82.47-82.48,216.19-82.49,298.67-.02,0,0,.01.01.02.02l-149.34,149.34s-149.34-149.34-149.34-149.34Z'/%3E%3Cpath class='st2' d='M213.3,661.37c-82.48-82.47-82.49-216.19-.02-298.67,0,0,.01-.01.02-.02L511.98,64c82.48,82.47,82.49,216.19.02,298.67l-.02.02-298.68,298.68Z'/%3E%3Cpath class='st1' d='M661.32,810.66l-149.34,149.34c-82.48-82.47-82.49-216.19-.02-298.67,0,0,.01-.01.02-.02l149.34-149.34,149.34-149.34c82.48,82.39,82.55,216.05.16,298.53-.05.05-.1.11-.16.16,0,0-149.34,149.34-149.34,149.34Z'/%3E%3C/svg%3E") no-repeat;background-size:100% 100%;background-color:transparent;display:inline-flex;width:1em;height:1em}.i-system\:openeuler{background:url("data:image/svg+xml;utf8,%3Csvg display='inline-flex' width='1em' height='1em' id='_图层_1' data-name='图层_1' xmlns='http://www.w3.org/2000/svg' version='1.1' viewBox='0 0 1024 1024'%3E%3C!-- Generator: Adobe Illustrator 29.0.1, SVG Export Plug-In . SVG Version: 2.1.0 Build 192) --%3E%3Cdefs%3E%3Cstyle%3E.st0 {fill: %23002fa7;}%3C/style%3E%3C/defs%3E%3Cpath class='st0' d='M841.43,413.79c-28.88,24.54-68.56,32.01-104.39,19.64-35.36-10.66-47.14-35.92-27.5-56.12,26.78-20.62,61.69-27.48,94.28-18.52,36.48,8.98,53.32,33.11,35.92,56.12M675.31,369.45c-25.82,20.36-59.87,27.05-91.48,17.96-16.84-5.05-26.38-15.71-26.94-24.69s-11.22-12.91-23.01-16.28c-12.47-3.1-25.41-3.87-38.16-2.24l-15.71,3.37c-11.86,3.56-23.05,9.06-33.11,16.28-8.98,8.08-14.42,19.37-15.15,31.43,0,8.42,8.98,15.71,21.33,20.2,13.82,3.47,28.28,3.47,42.09,0,18.31-5.46,37.81-5.46,56.12,0,17.78,4.27,28.73,22.15,24.46,39.93-1.48,6.18-4.71,11.8-9.31,16.19-27.71,23.76-65.96,31.03-100.46,19.08-13.7-4.89-23.19-17.47-24.13-31.99,0-9.54-9.54-16.84-21.33-21.89-13.64-4.04-27.98-5.19-42.09-3.37l-17.4,3.37c-13.93,3.43-26.83,10.17-37.6,19.64-7.55,7.19-13.65,15.76-17.96,25.25-2.01,4.26-3.33,8.8-3.93,13.47.46,11.66,7.71,21.98,18.52,26.38,13.95,6.06,29.38,7.82,44.34,5.05,18.58-4.95,38.27-3.77,56.12,3.37,30.87,14.03,34.23,48.26,5.61,76.32-29.52,29.53-74.28,37.59-112.24,20.2-14.81-8.41-22.52-25.41-19.08-42.09.21-2.05.21-4.12,0-6.17-.48-2.76-1.43-5.42-2.81-7.86-3.23-6.59-8.56-11.92-15.15-15.15-13.49-6.26-28.57-8.22-43.21-5.61-18.43,6.24-38.57,5.03-56.12-3.37-21.89-13.47-15.71-41.53,13.47-62.86,14.49-11.01,31.44-18.33,49.39-21.33,16.79-1.22,33.1-6.21,47.7-14.59,10.54-6.72,17.84-17.47,20.2-29.74.49-3.35.49-6.75,0-10.1-1.21-8.9,1.45-17.88,7.3-24.69,8.01-7.11,17.99-11.61,28.62-12.91,8.04-.52,16.1-.52,24.13,0h16.84c9.87-2.72,19.05-7.5,26.94-14.03,7.44-4.56,12.86-11.78,15.15-20.2v-8.42c0-15.15,19.08-31.43,49.39-37.04,13.28-3.17,27.12-3.17,40.41,0,8.71,1.24,16.37,6.41,20.76,14.03.24,1.11.24,2.26,0,3.37,4.69,8.4,12.96,14.19,22.45,15.71,13.35,2.55,27.06,2.55,40.41,0,17.16-4.1,35.04-4.1,52.19,0,29.74,7.3,39.85,28.06,21.33,46.02M603.48,706.18c-32.46,36.72-85.93,46.25-129.08,23.01-28.74-15.92-39.13-52.12-23.21-80.86,3.27-5.89,7.51-11.19,12.55-15.66,31.39-29.78,77.43-38.16,117.29-21.33,29.73,8.76,46.73,39.96,37.97,69.69-2.83,9.62-8.19,18.3-15.52,25.15M895.31,268.43l-354.13-197.55c-17.58-9.18-38.54-9.18-56.12,0L127.01,267.87c-17.09,9.86-27.74,27.97-28.06,47.7v392.85c.32,19.73,10.97,37.84,28.06,47.7l356.93,196.99c17.58,9.18,38.54,9.18,56.12,0l356.93-196.99c17.09-9.86,27.74-27.97,28.06-47.7v-392.85c-.32-19.73-10.97-37.84-28.06-47.7'/%3E%3C/svg%3E") no-repeat;background-size:100% 100%;background-color:transparent;display:inline-flex;width:1em;height:1em}.i-system\:oracle{background:url("data:image/svg+xml;utf8,%3Csvg display='inline-flex' width='1em' height='1em' id='_图层_1' data-name='图层_1' xmlns='http://www.w3.org/2000/svg' version='1.1' viewBox='0 0 1024 1024'%3E%3C!-- Generator: Adobe Illustrator 29.0.1, SVG Export Plug-In . SVG Version: 2.1.0 Build 192) --%3E%3Cdefs%3E%3Cstyle%3E.st0 {fill: %23fff;}.st1 {fill: %23e10025;}%3C/style%3E%3C/defs%3E%3Cpath class='st1' d='M64,512c0,247.42,200.58,448,448,448s448-200.58,448-448S759.42,64,512,64,64,264.58,64,512Z'/%3E%3Cpath class='st0' d='M427.2,344h169.59c92.34,0,167.2,75.22,167.2,168s-74.86,168-167.2,168h-169.59c-92.34,0-167.2-75.22-167.2-168s74.86-168,167.2-168ZM427.2,404.59c-59.04,0-106.9,48.09-106.9,107.41s47.86,107.41,106.9,107.41h169.59c59.04,0,106.9-48.09,106.9-107.41s-47.86-107.41-106.9-107.41h-169.59Z'/%3E%3C/svg%3E") no-repeat;background-size:100% 100%;background-color:transparent;display:inline-flex;width:1em;height:1em}.i-system\:rocky{background:url("data:image/svg+xml;utf8,%3Csvg display='inline-flex' width='1em' height='1em' id='_图层_1' data-name='图层_1' xmlns='http://www.w3.org/2000/svg' version='1.1' viewBox='0 0 1024 1024'%3E%3C!-- Generator: Adobe Illustrator 29.0.1, SVG Export Plug-In . SVG Version: 2.1.0 Build 192) --%3E%3Cdefs%3E%3Cstyle%3E.st0 {fill: %2310b981;}%3C/style%3E%3C/defs%3E%3Cpath class='st0' d='M935.07,659.74c16.15-46.26,24.93-95.98,24.93-147.74,0-247.43-200.58-448-448-448S64,264.57,64,512c0,122.42,49.11,233.38,128.7,314.25l454.43-454.44,112.19,112.2s175.75,175.74,175.75,175.74ZM853.24,802.29l-206.11-206.1-322.74,322.75c57.07,26.35,120.62,41.05,187.61,41.05,136.69,0,259.07-61.21,341.25-157.71h0Z'/%3E%3C/svg%3E") no-repeat;background-size:100% 100%;background-color:transparent;display:inline-flex;width:1em;height:1em}.i-system\:tencent{background:url("data:image/svg+xml;utf8,%3Csvg display='inline-flex' width='1em' height='1em' id='_图层_1' data-name='图层_1' xmlns='http://www.w3.org/2000/svg' version='1.1' viewBox='0 0 1024 1024'%3E%3C!-- Generator: Adobe Illustrator 29.0.1, SVG Export Plug-In . SVG Version: 2.1.0 Build 192) --%3E%3Cdefs%3E%3Cstyle%3E.st0 {fill: %230052d9;}%3C/style%3E%3C/defs%3E%3Cpath class='st0' d='M960,134.74H205.47L64,889.26h754.53s141.47-754.53,141.47-754.53ZM392.63,771.37l61.89-330.11h-131.16l-47.16-82.53h193.79l22.11-117.89,267.47,200.42h-198.95l-44.21,235.79h148.84l82.53,94.32s-355.16,0-355.16,0Z'/%3E%3C/svg%3E") no-repeat;background-size:100% 100%;background-color:transparent;display:inline-flex;width:1em;height:1em}.i-system\:ubuntu{background:url("data:image/svg+xml;utf8,%3Csvg display='inline-flex' width='1em' height='1em' id='_图层_1' data-name='图层_1' xmlns='http://www.w3.org/2000/svg' version='1.1' viewBox='0 0 1024 1024'%3E%3C!-- Generator: Adobe Illustrator 29.0.1, SVG Export Plug-In . SVG Version: 2.1.0 Build 192) --%3E%3Cdefs%3E%3Cstyle%3E.st0 {fill: %23e9000c;}.st1 {fill: %23fac400;}.st2 {fill: %23fb9200;}%3C/style%3E%3C/defs%3E%3Cpath class='st2' d='M168.77,415.97c51.69,0,93.83,42,93.83,93.53s-42.15,93.54-93.83,93.54c-51.69-.14-93.83-42.14-93.83-93.68s42.15-93.39,93.83-93.39ZM586.52,139.03c23.2,0,45.82,2.2,67.69,6.32-.42,4-.61,8.02-.59,12.04,0,71.8,58.74,130.39,130.69,130.39,28.35,0,54.47-8.96,75.92-24.38,49.78,56.83,82.08,129.22,88.54,208.66l-148.01,4.55c-12.33-106.9-103.81-190.3-214.24-190.3-31.12,0-60.94,6.61-87.66,18.65l-74.01-127.89c48.61-24.38,103.67-38.03,161.67-38.03Z'/%3E%3Cpath class='st1' d='M789.31,772.93c51.69,0,93.68,42,93.68,93.54s-42.14,93.53-93.68,93.53-93.83-41.99-93.83-93.53c.15-51.55,42.29-93.54,93.83-93.54ZM379.19,798.63c-63.14-44.05-111.9-107.49-137-181.49,34.51-23.5,57.27-63,57.27-107.78s-24.67-87.37-61.53-110.42c23.2-78.42,72.54-145.96,137.74-192.51l77.98,125.7c-50.37,39.36-82.82,100.73-82.82,169.3s31.87,128.77,81.49,168.13c0,0-73.12,129.07-73.12,129.07Z'/%3E%3Cpath class='st0' d='M949.06,526.98c-6.02,86.49-42.72,164.61-99.26,223.93-18.63-9.73-39.33-14.81-60.35-14.83-68.72,0-125.26,53.31-130.4,120.4-23.5,4.71-47.72,7.35-72.54,7.35-55.05.04-109.38-12.46-158.88-36.56l73.72-128.19c26.14,11.31,54.92,17.47,85.17,17.47,110.86,0,202.79-84.28,214.38-191.77,0,0,148.15,2.21,148.15,2.21ZM784.31,64c51.69,0,93.83,41.99,93.83,93.54s-42.14,93.53-93.83,93.53-93.83-42-93.83-93.53c.14-51.54,42.28-93.53,93.83-93.53h0Z'/%3E%3C/svg%3E") no-repeat;background-size:100% 100%;background-color:transparent;display:inline-flex;width:1em;height:1em}.i-tdesign\:caret-left{--un-icon:url("data:image/svg+xml;utf8,%3Csvg viewBox='0 0 24 24' display='inline-flex' width='1em' height='1em' xmlns='http://www.w3.org/2000/svg' %3E%3Cpath fill='currentColor' d='M15.5 2.586v18.828L6.086 12zM8.914 12l4.586 4.586V7.414z'/%3E%3C/svg%3E");-webkit-mask:var(--un-icon) no-repeat;mask:var(--un-icon) no-repeat;-webkit-mask-size:100% 100%;mask-size:100% 100%;background-color:currentColor;color:inherit;display:inline-flex;width:1em;height:1em}.i-tdesign\:caret-right{--un-icon:url("data:image/svg+xml;utf8,%3Csvg viewBox='0 0 24 24' display='inline-flex' width='1em' height='1em' xmlns='http://www.w3.org/2000/svg' %3E%3Cpath fill='currentColor' d='M8.5 21.414L17.914 12L8.5 2.586zm2-4.828V7.414L15.086 12z'/%3E%3C/svg%3E");-webkit-mask:var(--un-icon) no-repeat;mask:var(--un-icon) no-repeat;-webkit-mask-size:100% 100%;mask-size:100% 100%;background-color:currentColor;color:inherit;display:inline-flex;width:1em;height:1em}.i-theme\:auto{--un-icon:url("data:image/svg+xml;utf8,%3Csvg display='inline-flex' width='1em' height='1em' xmlns='http://www.w3.org/2000/svg' version='1.1' viewBox='0 0 1024 1024'%3E%3Cpath fill='currentColor' d='M868.2,129.4c39.9,0,72.2,32.3,72.2,72.2v498.3c0,39.9-32.3,72.2-72.2,72.2h-313.3c-6.1,0-11,4.9-11,11v39.3c0,6.1,4.9,11,11,11h160.6c6.1,0,11,5,11,11.1v39.2c0,6.1-4.9,11-11,11h-406.4c-6.1,0-11-4.9-11-11v-39.2c0-6.1,4.9-11,11-11h162.7c6.1,0,11-5,11-11.1v-39.3c0-6.1-4.9-11-11-11H155.8c-39.9,0-72.2-32.3-72.2-72.2V201.6c0-39.9,32.3-72.2,72.2-72.2h712.5ZM868.2,190.6H155.8c-6.1,0-11,4.9-11,11v498.3c0,6.1,4.9,11,11,11h712.5c6.1,0,11-4.9,11-11V201.6c0-6.1-4.9-11-11-11Z'/%3E%3Cg id='Layer_1'%3E%3Cpath fill='currentColor' d='M512,263.9c11.8,0,21.4,9.6,21.4,21.4v26.7c0,11.8-9.6,21.4-21.4,21.4-11.8,0-21.3-9.6-21.4-21.4v-26.7c0-11.8,9.6-21.4,21.4-21.4ZM512,568.1c11.8,0,21.4,9.6,21.4,21.4v26.7c0,11.8-9.6,21.4-21.4,21.4s-21.4-9.6-21.4-21.4h0v-26.7c0-11.8,9.6-21.4,21.4-21.4ZM698.8,450.7c0,11.8-9.6,21.4-21.4,21.4h-26.7c-11.8,0-21.4-9.6-21.4-21.4,0-11.8,9.6-21.4,21.4-21.4h26.7c11.8,0,21.4,9.6,21.4,21.4ZM394.6,450.7c0,11.8-9.6,21.4-21.4,21.4h-26.7c-11.8,0-21.4-9.6-21.4-21.4,0-11.8,9.6-21.3,21.4-21.4h26.7c11.8,0,21.4,9.6,21.4,21.4ZM644.1,318.6c8.3,8.3,8.3,21.9,0,30.2l-18.9,18.9c-8.2,8.5-21.7,8.7-30.2.5-8.5-8.2-8.7-21.7-.5-30.2.2-.2.4-.4.5-.5l18.9-18.9c8.3-8.3,21.9-8.3,30.2,0h0ZM428.9,533.8c8.3,8.3,8.3,21.9,0,30.2l-18.9,18.9c-8.2,8.5-21.7,8.7-30.2.5-8.5-8.2-8.7-21.7-.5-30.2.2-.2.4-.4.5-.5l18.9-18.9c8.3-8.3,21.9-8.3,30.2,0ZM644.1,582.8c-8.3,8.3-21.9,8.3-30.2,0l-18.9-18.9c-8.5-8.2-8.7-21.7-.5-30.2,8.2-8.5,21.7-8.7,30.2-.5.2.2.4.4.5.5l18.9,18.9c8.3,8.3,8.3,21.9,0,30.2ZM428.9,367.7c-8.3,8.3-21.9,8.3-30.2,0l-18.9-18.9c-8.5-8.2-8.7-21.7-.5-30.2,8.2-8.5,21.7-8.7,30.2-.5.2.2.4.4.5.5l18.9,18.9c8.3,8.3,8.3,21.9,0,30.2ZM512,530.8c-44.2,0-80.1-35.8-80.1-80.1s35.8-80.1,80.1-80.1,80.1,35.8,80.1,80.1-35.8,80.1-80.1,80.1Z'/%3E%3C/g%3E%3C/svg%3E");-webkit-mask:var(--un-icon) no-repeat;mask:var(--un-icon) no-repeat;-webkit-mask-size:100% 100%;mask-size:100% 100%;background-color:currentColor;color:inherit;display:inline-flex;width:1em;height:1em}.i-theme\:dark{--un-icon:url("data:image/svg+xml;utf8,%3Csvg display='inline-flex' width='1em' height='1em' viewBox='0 0 20 20' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M12.6009 2C15.724 2.94694 18 5.87417 18 9.33934C18 13.5702 14.607 17 10.4217 17C6.76389 17 3.71152 14.3805 3 10.8966C3.88275 11.2745 4.83184 11.4687 5.7905 11.4673C9.74343 11.4673 12.9478 8.22812 12.9478 4.23223C12.9478 3.49723 12.8396 2.7882 12.6379 2.12002L12.6009 2Z' stroke='currentColor' stroke-width='1.5'/%3E%3C/svg%3E");-webkit-mask:var(--un-icon) no-repeat;mask:var(--un-icon) no-repeat;-webkit-mask-size:100% 100%;mask-size:100% 100%;background-color:currentColor;color:inherit;display:inline-flex;width:1em;height:1em}.i-theme\:light{--un-icon:url("data:image/svg+xml;utf8,%3Csvg display='inline-flex' width='1em' height='1em' viewBox='0 0 20 20' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M13 9.68439C13 11.254 11.6569 12.5265 10 12.5265C8.34315 12.5265 7 11.254 7 9.68439C7 8.11474 8.34315 6.84229 10 6.84229C11.6569 6.84229 13 8.11474 13 9.68439Z' stroke='currentColor' stroke-width='1.5' stroke-linecap='round' stroke-linejoin='round'/%3E%3Cpath d='M18 10.4345C18.4142 10.4345 18.75 10.0988 18.75 9.68455C18.75 9.27033 18.4142 8.93455 18 8.93455V10.4345ZM16 8.93455C15.5858 8.93455 15.25 9.27033 15.25 9.68455C15.25 10.0988 15.5858 10.4345 16 10.4345V8.93455ZM4 10.4345C4.41421 10.4345 4.75 10.0988 4.75 9.68455C4.75 9.27033 4.41421 8.93455 4 8.93455V10.4345ZM2 8.93455C1.58579 8.93455 1.25 9.27033 1.25 9.68455C1.25 10.0988 1.58579 10.4345 2 10.4345V8.93455ZM10.7506 2.10547C10.7506 1.69126 10.4148 1.35547 10.0006 1.35547C9.58638 1.35547 9.2506 1.69126 9.2506 2.10547H10.7506ZM9.2506 4.00021C9.2506 4.41442 9.58638 4.75021 10.0006 4.75021C10.4148 4.75021 10.7506 4.41442 10.7506 4.00021H9.2506ZM10.7506 15.3686C10.7506 14.9544 10.4148 14.6186 10.0006 14.6186C9.58638 14.6186 9.2506 14.9544 9.2506 15.3686H10.7506ZM9.2506 17.2634C9.2506 17.6776 9.58638 18.0134 10.0006 18.0134C10.4148 18.0134 10.7506 17.6776 10.7506 17.2634H9.2506ZM16.1744 4.86959C16.4751 4.58471 16.4879 4.11001 16.2031 3.80931C15.9182 3.50862 15.4435 3.49579 15.1428 3.78066L16.1744 4.86959ZM13.7279 5.12105C13.4272 5.40592 13.4144 5.88062 13.6993 6.18132C13.9842 6.48202 14.4589 6.49485 14.7596 6.20998L13.7279 5.12105ZM6.27442 14.2478C6.57512 13.9629 6.58794 13.4882 6.30307 13.1875C6.0182 12.8868 5.5435 12.874 5.2428 13.1589L6.27442 14.2478ZM3.82794 14.4993C3.52724 14.7841 3.51441 15.2588 3.79929 15.5595C4.08416 15.8602 4.55886 15.8731 4.85956 15.5882L3.82794 14.4993ZM4.85956 3.78066C4.55886 3.49579 4.08416 3.50862 3.79929 3.80931C3.51441 4.11001 3.52724 4.58471 3.82794 4.86959L4.85956 3.78066ZM5.2428 6.20998C5.5435 6.49485 6.0182 6.48202 6.30307 6.18132C6.58794 5.88062 6.57512 5.40592 6.27442 5.12105L5.2428 6.20998ZM14.7596 13.1599C14.4589 12.875 13.9842 12.8878 13.6993 13.1885C13.4144 13.4892 13.4272 13.9639 13.7279 14.2488L14.7596 13.1599ZM15.1417 15.5881C15.4424 15.873 15.9171 15.8601 16.2019 15.5594C16.4868 15.2587 16.474 14.784 16.1733 14.4992L15.1417 15.5881ZM18 9.68455V8.93455H16V9.68455V10.4345H18V9.68455ZM4 9.68455V8.93455H2V9.68455V10.4345H4V9.68455ZM10.0006 2.10547H9.2506V4.00021H10.0006H10.7506V2.10547H10.0006ZM10.0006 15.3686H9.2506V17.2634H10.0006H10.7506V15.3686H10.0006ZM15.6586 4.32512L15.1428 3.78066L13.7279 5.12105L14.2437 5.66551L14.7596 6.20998L16.1744 4.86959L15.6586 4.32512ZM5.75861 13.7033L5.2428 13.1589L3.82794 14.4993L4.34375 15.0437L4.85956 15.5882L6.27442 14.2478L5.75861 13.7033ZM4.34375 4.32512L3.82794 4.86959L5.2428 6.20998L5.75861 5.66551L6.27442 5.12105L4.85956 3.78066L4.34375 4.32512ZM14.2437 13.7043L13.7279 14.2488L15.1417 15.5881L15.6575 15.0436L16.1733 14.4992L14.7596 13.1599L14.2437 13.7043Z' fill='currentColor'/%3E%3C/svg%3E");-webkit-mask:var(--un-icon) no-repeat;mask:var(--un-icon) no-repeat;-webkit-mask-size:100% 100%;mask-size:100% 100%;background-color:currentColor;color:inherit;display:inline-flex;width:1em;height:1em}.i-uiw\:question-circle-o{--un-icon:url("data:image/svg+xml;utf8,%3Csvg viewBox='0 0 20 20' display='inline-flex' width='1em' height='1em' xmlns='http://www.w3.org/2000/svg' %3E%3Cpath fill='currentColor' d='M10 0c5.523 0 10 4.477 10 10s-4.477 10-10 10S0 15.523 0 10S4.477 0 10 0m0 1.395a8.605 8.605 0 1 0 0 17.21a8.605 8.605 0 0 0 0-17.21m0 12.241a.91.91 0 1 1 0 1.819a.91.91 0 0 1 0-1.819m2.68-8.306c.726.73.96 1.564.838 2.436c-.096.691-.52 1.435-1.084 1.926c-.7.606-.872.756-1.004.889l-.06.062l-.101.11a2.6 2.6 0 0 0-.538.915q-.111.308-.183.905a.682.682 0 0 1-1.354-.158c.058-.493.14-.893.255-1.21a3.9 3.9 0 0 1 .82-1.379c.17-.184.365-.37.614-.593c.115-.103.567-.494.678-.59c.313-.282.558-.718.607-1.066c.066-.471-.048-.876-.455-1.285c-.43-.432-1.106-.64-1.625-.572c-.758.098-1.065.21-1.588.668c-.382.336-.634.833-.75 1.519a.682.682 0 0 1-1.344-.227c.164-.98.561-1.76 1.194-2.316c.759-.667 1.31-.867 2.312-.997c.925-.12 2.027.218 2.768.963'/%3E%3C/svg%3E");-webkit-mask:var(--un-icon) no-repeat;mask:var(--un-icon) no-repeat;-webkit-mask-size:100% 100%;mask-size:100% 100%;background-color:currentColor;color:inherit;display:inline-flex;width:1em;height:1em}.i-waf\:attack-map{--un-icon:url("data:image/svg+xml;utf8,%3Csvg display='inline-flex' width='1em' height='1em' xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='currentColor' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Ccircle cx='12' cy='12' r='10'%3E%3C/circle%3E%3Cline x1='2' y1='12' x2='22' y2='12'%3E%3C/line%3E%3Cpath d='M12 2a15.3 15.3 0 0 1 4 10 15.3 15.3 0 0 1-4 10 15.3 15.3 0 0 1-4-10 15.3 15.3 0 0 1 4-10z'%3E%3C/path%3E%3C/svg%3E");-webkit-mask:var(--un-icon) no-repeat;mask:var(--un-icon) no-repeat;-webkit-mask-size:100% 100%;mask-size:100% 100%;background-color:currentColor;color:inherit;display:inline-flex;width:1em;height:1em}.i-waf\:attacked-domain{--un-icon:url("data:image/svg+xml;utf8,%3Csvg display='inline-flex' width='1em' height='1em' xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='currentColor' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M10.29 3.86L1.82 18a2 2 0 0 0 1.71 3h16.94a2 2 0 0 0 1.71-3L13.71 3.86a2 2 0 0 0-3.42 0z'%3E%3C/path%3E%3Cline x1='12' y1='9' x2='12' y2='13'%3E%3C/line%3E%3Cline x1='12' y1='17' x2='12.01' y2='17'%3E%3C/line%3E%3C/svg%3E");-webkit-mask:var(--un-icon) no-repeat;mask:var(--un-icon) no-repeat;-webkit-mask-size:100% 100%;mask-size:100% 100%;background-color:currentColor;color:inherit;display:inline-flex;width:1em;height:1em}.i-waf\:interception-event{--un-icon:url("data:image/svg+xml;utf8,%3Csvg display='inline-flex' width='1em' height='1em' xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='currentColor' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8z'%3E%3C/path%3E%3Cpolyline points='14 2 14 8 20 8'%3E%3C/polyline%3E%3Cline x1='12' y1='18' x2='12' y2='12'%3E%3C/line%3E%3Cline x1='9' y1='15' x2='15' y2='15'%3E%3C/line%3E%3C/svg%3E");-webkit-mask:var(--un-icon) no-repeat;mask:var(--un-icon) no-repeat;-webkit-mask-size:100% 100%;mask-size:100% 100%;background-color:currentColor;color:inherit;display:inline-flex;width:1em;height:1em}.i-waf\:interception-type{--un-icon:url("data:image/svg+xml;utf8,%3Csvg display='inline-flex' width='1em' height='1em' xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='currentColor' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M12 22s8-4 8-10V5l-8-3-8 3v7c0 6 8 10 8 10z'%3E%3C/path%3E%3C/svg%3E");-webkit-mask:var(--un-icon) no-repeat;mask:var(--un-icon) no-repeat;-webkit-mask-size:100% 100%;mask-size:100% 100%;background-color:currentColor;color:inherit;display:inline-flex;width:1em;height:1em}.i-waf\:malicious{--un-icon:url("data:image/svg+xml;utf8,%3Csvg display='inline-flex' width='1em' height='1em' viewBox='0 0 96 117' xmlns='http://www.w3.org/2000/svg' xmlns:xlink='http://www.w3.org/1999/xlink' customFrame='%23000000'%3E%3Cpath id='矢量 8' d='M48 116C47.3625 116 46.783 115.824 46.2614 115.472C32.1788 106.847 21.979 99.6888 14.4451 90.477C5.75216 79.9158 1.52158 67.5944 1.05795 51.7525L1.05795 51.4592C1.05795 50.5791 1 49.7577 1 48.9362C1 48.1148 1 47.2347 1.05795 46.4133L1.05795 30.102C1.05795 28.2245 2.56473 26.6403 4.47719 26.6403C21.2256 26.6403 36.7571 17.4872 45.0444 2.7602C45.6239 1.70408 46.783 1 48 1C49.217 1 50.3761 1.64541 50.9556 2.7602C59.2429 17.4872 74.8323 26.6403 91.5808 26.6403C93.4353 26.6403 95 28.1658 95 30.102L95 51.7525C95 51.9872 95 52.2219 94.942 52.398C93.783 85.9592 75.4698 99.7474 49.7966 115.531C49.217 115.824 48.6375 116 48 116L48 116ZM7.89643 51.6352C8.3021 65.8342 12.0691 76.7475 19.7189 86.0765C26.3255 94.1735 35.5401 100.745 48.058 108.49C71.8187 93.8214 87.3502 81.4413 88.2195 51.5765C88.2195 51.4005 88.2195 51.2832 88.2774 51.1071L88.2774 33.3878C72.2244 32.3316 57.4464 24 48.1159 10.7985C38.6696 24 23.8915 32.3316 7.89643 33.3878L7.89643 46.5306C7.89643 47.352 7.83848 48.1735 7.83848 48.9362C7.83848 49.7577 7.83848 50.5204 7.89643 51.3418L7.89643 51.6352L7.89643 51.6352ZM49.275 88.5408C50.9556 88.8733 48.4636 88.4821 48.058 88.3061C46.3194 87.6021 45.4501 85.6071 46.0876 83.8469L53.7953 63.7219L39.7707 63.7219C38.6695 63.7219 37.6264 63.1939 36.9889 62.2551C36.3514 61.3163 36.1776 60.1429 36.5832 59.0867L44.8126 35.6173C45.4501 33.7985 47.3625 32.8597 49.1591 33.5051C50.9556 34.1505 51.8829 36.0867 51.2454 37.9056L44.5808 56.8571L58.7793 56.8571C59.8804 56.8571 60.9815 57.4439 61.561 58.3827C62.1985 59.3214 62.3144 60.4949 61.9088 61.551L52.4044 86.3699C51.9408 87.7194 50.6658 88.5408 49.275 88.5408L49.275 88.5408Z' fill='currentColor' fill-rule='nonzero'/%3E%3Cpath id='矢量 8' d='M45.7214 116.314C37.953 111.556 31.8091 107.447 27.2898 103.989C21.791 99.7807 17.2514 95.4878 13.6711 91.1101C10.7158 87.5198 8.25265 83.691 6.28146 79.6238C5.30765 77.6145 4.45391 75.547 3.72025 73.4213C1.51414 67.0293 0.293512 59.8161 0.0583818 51.7818L0.0579532 51.7672L0.0579532 51.4592C0.0579532 51.1723 0.0482447 50.7488 0.0288275 50.1887C0.00960916 49.6344 0 49.2169 0 48.9362C0 47.8024 0.0193177 46.9499 0.0579532 46.3788L0.0579532 30.102C0.0579532 29.4963 0.163393 28.9333 0.374273 28.413C0.587083 27.888 0.907274 27.4065 1.33484 26.9685C1.77524 26.5174 2.26313 26.1812 2.79851 25.9599C3.31404 25.7468 3.87359 25.6403 4.47719 25.6403C6.4059 25.6403 8.31889 25.5182 10.2162 25.2739C12.3133 25.0039 14.3913 24.5846 16.45 24.0161C18.1246 23.5537 19.7621 22.9994 21.3625 22.3532C23.4467 21.5117 25.468 20.5143 27.4263 19.3612C29.085 18.3845 30.6703 17.3127 32.1821 16.1457C33.8256 14.8772 35.3822 13.4963 36.8521 12.0029C38.1908 10.643 39.436 9.21141 40.5878 7.70825C41.905 5.98908 43.1001 4.17626 44.1729 2.26979C44.3167 2.00777 44.4836 1.76561 44.6738 1.54331C44.9792 1.1864 45.3443 0.880682 45.7693 0.626148C46.186 0.376603 46.6193 0.201649 47.0693 0.101284C47.372 0.0337613 47.6822 -1.19209e-07 48 -1.19209e-07C48.4263 0 48.8361 0.0569096 49.2294 0.170729C49.5727 0.270062 49.9034 0.412742 50.2216 0.598767C50.5919 0.815253 50.9166 1.07401 51.1957 1.37504C51.4451 1.64402 51.6581 1.94675 51.8347 2.28324C52.8557 4.09619 53.9882 5.82467 55.2325 7.46868C56.436 9.05891 57.7439 10.5701 59.1563 12.0023C60.5755 13.4414 62.0758 14.7763 63.6573 16.0069C65.2257 17.2274 66.8739 18.3453 68.6019 19.3607C70.5572 20.5097 72.5749 21.5041 74.655 22.3438C76.2654 22.9939 77.9133 23.5513 79.5986 24.016C81.7251 24.6024 83.8713 25.03 86.0373 25.2989C87.871 25.5265 89.7188 25.6403 91.5808 25.6403C92.1637 25.6403 92.7066 25.7407 93.2094 25.9415C93.7504 26.1575 94.245 26.4897 94.6932 26.9382C95.1229 27.3682 95.4466 27.8427 95.6644 28.3616C95.8881 28.8948 96 29.475 96 30.102L96 51.7525C96 52.0708 95.9793 52.3313 95.9379 52.5341C95.6467 60.7095 94.3171 68.0461 91.9489 74.544C91.3296 76.2435 90.6314 77.9053 89.8545 79.5294C87.8644 83.6893 85.3574 87.602 82.3335 91.2674C78.6497 95.7327 73.9123 100.152 68.1211 104.525C63.7812 107.802 57.8476 111.755 50.3203 116.382L50.2851 116.404L50.2482 116.423C49.488 116.808 48.7386 117 48 117C47.5552 117 47.1315 116.935 46.7288 116.805C46.3769 116.691 46.0411 116.527 45.7214 116.314ZM94.942 52.398C95 52.2219 95 51.9872 95 51.7525L95 30.102C95 28.1658 93.4353 26.6403 91.5808 26.6403C74.8323 26.6403 59.2429 17.4872 50.9556 2.7602C50.3761 1.64541 49.217 1 48 1C46.783 1 45.6239 1.70408 45.0444 2.7602C36.7571 17.4872 21.2256 26.6403 4.47719 26.6403C2.56473 26.6403 1.05795 28.2245 1.05795 30.102L1.05795 46.4133C1 47.2347 1 48.1148 1 48.9362C1 49.7577 1.05795 50.5791 1.05795 51.4592L1.05795 51.7525C1.52158 67.5944 5.75216 79.9158 14.4451 90.477C21.979 99.6888 32.1788 106.847 46.2614 115.472C46.783 115.824 47.3625 116 48 116C48.6375 116 49.217 115.824 49.7966 115.531C75.4698 99.7474 93.783 85.9592 94.942 52.398ZM7.93078 52.6352C8.48209 66.3485 12.2496 76.9677 19.7189 86.0765C26.3255 94.1735 35.5401 100.745 48.058 108.49C71.8187 93.8214 87.3502 81.4413 88.2195 51.5765C88.2195 51.4005 88.2195 51.2832 88.2774 51.1071L88.2774 33.3878C72.5737 32.3546 58.0901 24.3591 48.7327 11.6533C48.5246 11.3707 48.3189 11.0857 48.1159 10.7985C47.9112 11.0846 47.704 11.3684 47.4943 11.6499C38.0285 24.3577 23.5449 32.3545 7.89643 33.3878L7.89643 46.5306C7.89643 47.352 7.83848 48.1735 7.83848 48.9362C7.83848 49.5181 7.83848 50.0705 7.85908 50.6352C7.86756 50.8677 7.87953 51.1023 7.89643 51.3418L7.89643 51.6352C7.906 51.9704 7.91745 52.3037 7.93078 52.6352ZM8.89643 51.6212C9.09717 58.6048 10.144 64.8501 12.0368 70.357C12.6578 72.1636 13.3804 73.9212 14.2046 75.6297C15.8803 79.1033 17.9762 82.3742 20.4921 85.4425L20.4937 85.4443C23.55 89.19 27.4796 92.9164 32.2827 96.6236C36.2275 99.6683 41.4861 103.232 48.0586 107.314C54.5823 103.271 59.7716 99.7718 63.6264 96.8151C68.677 92.9413 72.7827 89.0381 75.9436 85.1054C78.2718 82.2085 80.2287 79.131 81.8141 75.8727C82.6335 74.1889 83.3537 72.4568 83.9747 70.6764C85.929 65.0733 87.0106 58.7012 87.2195 51.5603C87.2205 51.3453 87.2398 51.1517 87.2774 50.9793L87.2774 34.3163C83.7549 34.0256 80.3256 33.4065 76.9895 32.459C72.9157 31.302 68.9809 29.6554 65.1852 27.5191C61.6507 25.5298 58.4096 23.2133 55.4619 20.5696C52.7663 18.1519 50.316 15.4605 48.1112 12.4955C45.767 15.6129 43.1581 18.4275 40.2845 20.9392C37.4341 23.4305 34.3233 25.6239 30.952 27.5193C26.9785 29.7533 22.859 31.4518 18.5935 32.6148C15.4409 33.4744 12.2085 34.0415 8.89643 34.316L8.89643 46.5306C8.89643 46.8215 8.88629 47.2492 8.86601 47.8137C8.84766 48.3245 8.83848 48.6987 8.83848 48.9362C8.83848 49.9689 8.85697 50.7473 8.89396 51.2715L8.89643 51.3066L8.89643 51.6212ZM46.2949 88.3567C46.6843 88.723 47.1445 89.0141 47.6753 89.23C47.9398 89.3407 48.4755 89.4641 49.2824 89.6002C49.4099 89.6217 49.5155 89.6383 49.5991 89.6498C49.9298 89.6953 50.1999 89.6489 50.4094 89.5107C50.4772 89.466 50.5386 89.4116 50.5937 89.3477C50.6386 89.3339 50.6832 89.3193 50.7275 89.3039C51.0848 89.1805 51.4254 89.0087 51.7494 88.7886C52.1358 88.526 52.463 88.2185 52.7311 87.8659C52.9912 87.5238 53.1956 87.1392 53.3442 86.7122L62.8423 61.9096C62.9924 61.5187 63.0869 61.1224 63.1258 60.7208C63.1547 60.4224 63.1529 60.121 63.1204 59.8167C63.082 59.4569 63.0027 59.112 62.8825 58.782C62.7625 58.4528 62.6018 58.1384 62.4004 57.8388C62.2737 57.6359 62.1315 57.4469 61.9738 57.2718C61.6588 56.9221 61.2821 56.6279 60.8436 56.3894C60.4493 56.1749 60.0419 56.0252 59.6214 55.9404C59.3463 55.8849 59.0656 55.8571 58.7793 55.8571L45.9925 55.8571L52.1891 38.2364C52.4044 37.622 52.4906 37.0169 52.4476 36.4212C52.409 35.8852 52.2658 35.3567 52.0181 34.8358C51.7674 34.3087 51.4435 33.8601 51.0463 33.4901C50.6159 33.0891 50.0995 32.7804 49.4972 32.564C48.8899 32.3458 48.2919 32.2576 47.703 32.2992C47.1653 32.3373 46.6353 32.4836 46.113 32.7382C45.6169 32.9801 45.1913 33.2887 44.8363 33.664C44.414 34.1104 44.0915 34.6512 43.8689 35.2865L35.6441 58.7428C35.5283 59.0475 35.4484 59.3573 35.4043 59.6721C35.3506 60.0563 35.3504 60.448 35.4037 60.8472C35.4406 61.124 35.5017 61.3929 35.587 61.654C35.7199 62.0608 35.9114 62.4484 36.1616 62.8169C36.3754 63.1317 36.6209 63.41 36.8982 63.652C37.1531 63.8745 37.4349 64.0663 37.7435 64.2272C38.0368 64.3802 38.3395 64.4977 38.6516 64.5798C39.0121 64.6746 39.3852 64.722 39.7707 64.7219L52.3415 64.7219L45.1473 83.5064C44.9489 84.0542 44.8557 84.5997 44.8678 85.1429C44.8806 85.723 45.0135 86.3005 45.2664 86.8753C45.5237 87.4601 45.8665 87.9539 46.2949 88.3567ZM52.7245 63.7219L39.7707 63.7219C38.6695 63.7219 37.6264 63.1939 36.9889 62.2551C36.3514 61.3163 36.1776 60.1429 36.5832 59.0867L44.8126 35.6173C45.4501 33.7985 47.3625 32.8597 49.1591 33.5051C50.9556 34.1505 51.8829 36.0867 51.2454 37.9056L44.9324 55.8571L44.5808 56.8571L58.7793 56.8571C59.8804 56.8571 60.9815 57.4439 61.561 58.3827C62.1985 59.3214 62.3144 60.4949 61.9088 61.551L52.4044 86.3699C52.1134 87.2169 51.5028 87.8559 50.7445 88.2143C50.2947 88.4269 49.7929 88.5408 49.275 88.5408C50.2145 88.7267 49.85 88.6864 49.275 88.584C49.1424 88.5604 48.9987 88.5335 48.8572 88.5053C48.5144 88.437 48.1846 88.3611 48.058 88.3061C47.6145 88.1266 47.2276 87.863 46.9079 87.5408C45.9739 86.5997 45.6127 85.1582 46.0876 83.8469L53.4123 64.7219L53.7953 63.7219L52.7245 63.7219Z' fill='currentColor' fill-rule='evenodd'/%3E%3C/svg%3E");-webkit-mask:var(--un-icon) no-repeat;mask:var(--un-icon) no-repeat;-webkit-mask-size:100% 100%;mask-size:100% 100%;background-color:currentColor;color:inherit;display:inline-flex;width:1em;height:1em}.i-waf\:qps{--un-icon:url("data:image/svg+xml;utf8,%3Csvg display='inline-flex' width='1em' height='1em' xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='currentColor' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpolyline points='22 12 18 12 15 21 9 3 6 12 2 12'%3E%3C/polyline%3E%3C/svg%3E");-webkit-mask:var(--un-icon) no-repeat;mask:var(--un-icon) no-repeat;-webkit-mask-size:100% 100%;mask-size:100% 100%;background-color:currentColor;color:inherit;display:inline-flex;width:1em;height:1em}.i-waf\:response{--un-icon:url("data:image/svg+xml;utf8,%3Csvg display='inline-flex' width='1em' height='1em' xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='currentColor' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Ccircle cx='12' cy='12' r='10'%3E%3C/circle%3E%3Cpolyline points='12 6 12 12 16 14'%3E%3C/polyline%3E%3C/svg%3E");-webkit-mask:var(--un-icon) no-repeat;mask:var(--un-icon) no-repeat;-webkit-mask-size:100% 100%;mask-size:100% 100%;background-color:currentColor;color:inherit;display:inline-flex;width:1em;height:1em}.i-waf\:site-traffic{--un-icon:url("data:image/svg+xml;utf8,%3Csvg display='inline-flex' width='1em' height='1em' t='1766214102461' viewBox='0 0 1024 1024' version='1.1' xmlns='http://www.w3.org/2000/svg' p-id='3552'%3E%3Cpath d='M290.1 409.6H155.135A371.405 371.405 0 0 0 140.851 512c0 35.533 4.967 69.888 14.336 102.4H290.15c-5.632-32.768-8.499-66.918-8.499-102.4s2.867-69.632 8.5-102.4z m52.07 0A542.106 542.106 0 0 0 332.8 512c0 35.738 3.072 69.888 9.37 102.4H486.4V409.6H342.17z m75.008 461.363A491.878 491.878 0 0 1 301.568 665.6h-127.59a372.07 372.07 0 0 0 243.2 205.363z m69.222-3.584V665.6H354.97c24.064 77.107 67.84 144.23 131.43 201.83z m-69.222-714.291a372.07 372.07 0 0 0-243.2 205.312h127.59a491.878 491.878 0 0 1 115.558-205.363z m69.222 3.584c-63.59 57.446-107.315 124.57-131.43 201.728H486.4V156.57zM733.9 409.6c5.633 32.768 8.5 66.918 8.5 102.4s-2.867 69.632-8.5 102.4h135.015c9.319-32.512 14.285-66.867 14.285-102.4s-4.966-69.888-14.336-102.4H733.901z m-52.07 0H537.6v204.8h144.23c6.247-32.512 9.37-66.662 9.37-102.4s-3.072-69.888-9.37-102.4z m-75.008 461.363a372.07 372.07 0 0 0 243.2-205.363h-127.59a491.878 491.878 0 0 1-115.558 205.363zM537.6 867.38c63.59-57.55 107.315-124.673 131.43-201.78H537.6v201.83z m69.222-714.291A491.878 491.878 0 0 1 722.432 358.4h127.642a372.07 372.07 0 0 0-243.2-205.363z m-69.222 3.584V358.4h131.43c-24.064-77.107-67.84-144.23-131.43-201.83zM512 947.2a435.2 435.2 0 1 1 0-870.4 435.2 435.2 0 0 1 0 870.4z' fill='currentColor' p-id='3553'%3E%3C/path%3E%3C/svg%3E");-webkit-mask:var(--un-icon) no-repeat;mask:var(--un-icon) no-repeat;-webkit-mask-size:100% 100%;mask-size:100% 100%;background-color:currentColor;color:inherit;display:inline-flex;width:1em;height:1em}.i-waf\:today{--un-icon:url("data:image/svg+xml;utf8,%3Csvg display='inline-flex' width='1em' height='1em' viewBox='0 0 101.2 101.2' xmlns='http://www.w3.org/2000/svg' xmlns:xlink='http://www.w3.org/1999/xlink' customFrame='%23000000'%3E%3Cpath id='矢量 6' d='M50.6 0.599976C62.1042 0.599976 71.4333 10.225 71.4333 22.0958C71.4333 23.9301 71.2091 25.7311 70.7761 27.4658C70.2889 29.4175 70.9661 31.5435 72.5949 32.7239C74.979 34.4516 77.1552 36.4556 79.0768 38.6965C79.1296 38.758 79.0892 38.8531 79.0083 38.8583C83.9375 38.8583 88.1 34.6916 88.1 29.3875C88.1 27.3416 89.62 25.6 91.6659 25.6L92.6417 25.6C94.7357 25.6 96.4333 27.2976 96.4333 29.3916C96.4333 35.4035 93.2323 40.7463 88.3562 43.7833C86.2 45.1262 84.9812 47.8855 85.8501 50.2725C86.827 52.9565 87.5055 55.7844 87.8451 58.7138C87.86 58.8422 87.9708 58.9463 88.1 58.9416L88.1 58.9333L96.6027 58.9416C98.8108 58.9431 100.6 60.7309 100.6 62.939L100.6 63.2723C100.6 65.4825 98.8075 67.2764 96.5973 67.275L88.1 67.2666C87.9715 67.2596 87.8599 67.3543 87.8451 67.4822C87.5101 70.3714 86.8385 73.206 85.8476 75.9292C84.9792 78.3155 86.1983 81.0731 88.354 82.4153C93.2313 85.452 96.4333 90.7955 96.4333 96.8083C96.4333 98.9024 94.7357 100.6 92.6417 100.6L91.921 100.6C89.8221 100.6 88.1161 98.9071 88.1 96.8083C88.1 92.2739 85.0565 88.5748 81.0943 87.597C79.9211 87.3076 78.7601 87.8909 77.9338 88.7725C74.6543 92.2714 70.7283 95.1117 66.3663 97.1329C61.4258 99.4221 56.0451 100.605 50.6 100.6C45.1553 100.606 39.7749 99.4229 34.8344 97.1344C29.9533 94.8733 25.6177 91.5867 22.1228 87.4993C22.0709 87.4386 22.1119 87.3534 22.1917 87.35L22.1917 87.3416C17.2625 87.3416 13.1 91.5083 13.1 96.8125C13.1 98.9042 11.4043 100.6 9.31251 100.6L8.55834 100.6C6.46426 100.6 4.76667 98.9024 4.76667 96.8083C4.76667 90.7959 7.96824 85.4528 12.845 82.4159C15.0009 81.0734 16.2199 78.315 15.3514 75.9284C14.3605 73.2055 13.6892 70.3712 13.3549 67.4822C13.3401 67.3543 13.2285 67.2596 13.1 67.2666L4.60001 67.2666C2.39087 67.2666 0.600006 65.4758 0.600006 63.2666L0.600006 62.9333C0.600006 60.7242 2.39087 58.9333 4.60001 58.9333L13.1 58.9333C13.1046 58.9333 13.1 58.9287 13.1 58.9333L13.1 58.9416C13.2292 58.9463 13.34 58.8422 13.3549 58.7138C13.6902 55.826 14.3617 52.9928 15.3522 50.2709C16.2207 47.8845 15.0016 45.1268 12.8458 43.7845C7.96861 40.7478 4.76667 35.4044 4.76667 29.3916C4.76667 27.2976 6.46426 25.6 8.55834 25.6L9.30834 25.6C11.4024 25.6 13.1 27.2976 13.1 29.3916C13.1 33.9269 16.1447 37.6266 20.1081 38.6035C21.28 38.8923 22.4398 38.3103 23.2658 37.4303C24.8948 35.6945 26.684 34.1181 28.609 32.7218C30.2378 31.5403 30.9137 29.4132 30.4243 27.4614C29.9859 25.7126 29.7639 23.9119 29.7667 22.1C29.7667 10.2208 39.0958 0.599976 50.6 0.599976ZM41.9325 35.2442C38.1038 36.4364 34.5456 38.4104 31.4912 41.0593C27.2681 44.7219 24.1862 49.5206 22.6121 54.8845C21.0379 60.2484 21.0379 65.9516 22.612 71.3154C24.1862 76.6793 27.2681 81.478 31.4912 85.1406C34.5456 87.7895 38.1038 89.7635 41.9325 90.9557C44.2591 91.6802 46.4333 89.7921 46.4333 87.3553L46.4333 38.8446C46.4333 36.4078 44.2591 34.5197 41.9325 35.2442ZM54.7708 34.2291L54.7708 87.3465C54.7708 89.7849 56.9478 91.6734 59.2751 90.9457C63.0972 89.7507 66.6488 87.7763 69.6974 85.1292C73.9153 81.4667 76.9931 76.6702 78.565 71.3099C80.137 65.9495 80.137 60.2505 78.565 54.8901C76.9931 49.5297 73.9153 44.7333 69.6974 41.0708C65.4794 37.4083 60.2987 35.0337 54.7708 34.2291L54.7708 34.2291ZM50.6 9.19581C43.6958 9.19581 38.1 14.9708 38.1 22.0958C38.1 22.7076 38.141 23.3125 38.2218 23.9076C38.4979 25.9406 40.6743 26.8757 42.6796 26.4422C45.2788 25.8803 47.9339 25.5972 50.6 25.6C53.3214 25.6 55.9746 25.8904 58.5303 26.4405C60.5313 26.8712 62.7015 25.9392 62.9777 23.911C63.0588 23.315 63.1 22.7089 63.1 22.0958C63.1 14.9708 57.5042 9.19581 50.6 9.19581L50.6 9.19581Z' fill='currentColor' fill-rule='nonzero'/%3E%3Cpath id='矢量 6' d='M71.4333 22.0958C71.4333 23.9301 71.2091 25.7311 70.7761 27.4658C70.2889 29.4175 70.9661 31.5435 72.5949 32.7239C74.979 34.4516 77.1552 36.4556 79.0768 38.6965C79.1296 38.758 79.0892 38.8531 79.0083 38.8583C83.9375 38.8583 88.1 34.6916 88.1 29.3875C88.1 27.3416 89.62 25.6 91.6659 25.6L92.6417 25.6C94.7357 25.6 96.4333 27.2976 96.4333 29.3916C96.4333 35.4035 93.2323 40.7463 88.3562 43.7833C86.2 45.1262 84.9812 47.8855 85.8501 50.2725C86.827 52.9565 87.5055 55.7844 87.8451 58.7138C87.86 58.8422 87.9708 58.9463 88.1 58.9416L88.1 58.9333L96.6027 58.9416C98.8108 58.9431 100.6 60.7309 100.6 62.939L100.6 63.2723C100.6 65.4825 98.8075 67.2764 96.5973 67.275L88.1 67.2666C87.9715 67.2596 87.8599 67.3543 87.8451 67.4822C87.5101 70.3714 86.8385 73.206 85.8476 75.9292C84.9792 78.3155 86.1983 81.0731 88.354 82.4153C93.2313 85.452 96.4333 90.7955 96.4333 96.8083C96.4333 98.9024 94.7357 100.6 92.6417 100.6L91.921 100.6C89.8221 100.6 88.1161 98.9071 88.1 96.8083C88.1 92.2739 85.0565 88.5748 81.0943 87.597C79.9211 87.3076 78.7601 87.8909 77.9338 88.7725C74.6543 92.2714 70.7283 95.1117 66.3663 97.1329C61.4258 99.4221 56.0451 100.605 50.6 100.6C45.1553 100.606 39.7749 99.4229 34.8344 97.1344C29.9533 94.8733 25.6177 91.5867 22.1228 87.4993C22.0709 87.4386 22.1119 87.3534 22.1917 87.35L22.1917 87.3416C17.2625 87.3416 13.1 91.5083 13.1 96.8125C13.1 98.9042 11.4043 100.6 9.31251 100.6L8.55834 100.6C6.46426 100.6 4.76667 98.9024 4.76667 96.8083C4.76667 90.7959 7.96824 85.4528 12.845 82.4159C15.0009 81.0734 16.2199 78.315 15.3514 75.9284C14.3605 73.2055 13.6892 70.3712 13.3549 67.4822C13.3401 67.3543 13.2285 67.2596 13.1 67.2666L4.60001 67.2666C2.39087 67.2666 0.600006 65.4758 0.600006 63.2666L0.600006 62.9333C0.600006 60.7242 2.39087 58.9333 4.60001 58.9333L13.1 58.9333C13.1046 58.9333 13.1 58.9287 13.1 58.9333L13.1 58.9416C13.2292 58.9463 13.34 58.8422 13.3549 58.7138C13.6902 55.826 14.3617 52.9928 15.3522 50.2709C16.2207 47.8845 15.0016 45.1268 12.8458 43.7845C7.96861 40.7478 4.76667 35.4044 4.76667 29.3916C4.76667 27.2976 6.46426 25.6 8.55834 25.6L9.30834 25.6C11.4024 25.6 13.1 27.2976 13.1 29.3916C13.1 33.9269 16.1447 37.6266 20.1081 38.6035C21.28 38.8923 22.4398 38.3103 23.2658 37.4303C24.8948 35.6945 26.684 34.1181 28.609 32.7218C30.2378 31.5403 30.9137 29.4132 30.4243 27.4614C29.9859 25.7126 29.7639 23.9119 29.7667 22.1C29.7667 10.2208 39.0958 0.599976 50.6 0.599976C62.1042 0.599976 71.4333 10.225 71.4333 22.0958ZM31.4912 41.0593C27.2681 44.7219 24.1862 49.5206 22.6121 54.8845C21.0379 60.2484 21.0379 65.9516 22.612 71.3154C24.1862 76.6793 27.2681 81.478 31.4912 85.1406C34.5456 87.7895 38.1038 89.7635 41.9325 90.9557C44.2591 91.6802 46.4333 89.7921 46.4333 87.3553L46.4333 38.8446C46.4333 36.4078 44.2591 34.5197 41.9325 35.2442C38.1038 36.4364 34.5456 38.4104 31.4912 41.0593ZM54.7708 87.3465C54.7708 89.7849 56.9478 91.6734 59.2751 90.9457C63.0972 89.7507 66.6488 87.7763 69.6974 85.1292C73.9153 81.4667 76.9931 76.6702 78.565 71.3099C80.137 65.9495 80.137 60.2505 78.565 54.8901C76.9931 49.5297 73.9153 44.7333 69.6974 41.0708C65.4794 37.4083 60.2987 35.0337 54.7708 34.2291L54.7708 34.2291L54.7708 87.3465ZM38.1 22.0958C38.1 22.7076 38.141 23.3125 38.2218 23.9076C38.4979 25.9406 40.6743 26.8757 42.6796 26.4422C45.2788 25.8803 47.9339 25.5972 50.6 25.6C53.3214 25.6 55.9746 25.8904 58.5303 26.4405C60.5313 26.8712 62.7015 25.9392 62.9777 23.911C63.0588 23.315 63.1 22.7089 63.1 22.0958C63.1 14.9708 57.5042 9.19581 50.6 9.19581L50.6 9.19581C43.6958 9.19581 38.1 14.9708 38.1 22.0958Z' fill-rule='nonzero' stroke='currentColor' stroke-width='1.20000005'/%3E%3C/svg%3E");-webkit-mask:var(--un-icon) no-repeat;mask:var(--un-icon) no-repeat;-webkit-mask-size:100% 100%;mask-size:100% 100%;background-color:currentColor;color:inherit;display:inline-flex;width:1em;height:1em}.i-waf\:traffic-filter,[i-waf\:traffic-filter=""]{--un-icon:url("data:image/svg+xml;utf8,%3Csvg display='inline-flex' width='1em' height='1em' xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='currentColor' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpolygon points='22 3 2 3 10 12.46 10 19 14 21 14 12.46 22 3'%3E%3C/polygon%3E%3C/svg%3E");-webkit-mask:var(--un-icon) no-repeat;mask:var(--un-icon) no-repeat;-webkit-mask-size:100% 100%;mask-size:100% 100%;background-color:currentColor;color:inherit;display:inline-flex;width:1em;height:1em}.i-waf\:traffic-ranking{--un-icon:url("data:image/svg+xml;utf8,%3Csvg display='inline-flex' width='1em' height='1em' xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='currentColor' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cline x1='18' y1='20' x2='18' y2='10'%3E%3C/line%3E%3Cline x1='12' y1='20' x2='12' y2='4'%3E%3C/line%3E%3Cline x1='6' y1='20' x2='6' y2='14'%3E%3C/line%3E%3C/svg%3E");-webkit-mask:var(--un-icon) no-repeat;mask:var(--un-icon) no-repeat;-webkit-mask-size:100% 100%;mask-size:100% 100%;background-color:currentColor;color:inherit;display:inline-flex;width:1em;height:1em}.i-waf\:visit-page{--un-icon:url("data:image/svg+xml;utf8,%3Csvg display='inline-flex' width='1em' height='1em' xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='currentColor' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8z'%3E%3C/path%3E%3Cpolyline points='14 2 14 8 20 8'%3E%3C/polyline%3E%3Cline x1='16' y1='13' x2='8' y2='13'%3E%3C/line%3E%3Cline x1='16' y1='17' x2='8' y2='17'%3E%3C/line%3E%3Cpolyline points='10 9 9 9 8 9'%3E%3C/polyline%3E%3C/svg%3E");-webkit-mask:var(--un-icon) no-repeat;mask:var(--un-icon) no-repeat;-webkit-mask-size:100% 100%;mask-size:100% 100%;background-color:currentColor;color:inherit;display:inline-flex;width:1em;height:1em}.i-weui\:delete-outlined{--un-icon:url("data:image/svg+xml;utf8,%3Csvg viewBox='0 0 24 24' display='inline-flex' width='1em' height='1em' xmlns='http://www.w3.org/2000/svg' %3E%3Cpath fill='currentColor' fill-rule='evenodd' d='m6.774 6.4l.812 13.648a.8.8 0 0 0 .798.752h7.232a.8.8 0 0 0 .798-.752L17.226 6.4zm11.655 0l-.817 13.719A2 2 0 0 1 15.616 22H8.384a2 2 0 0 1-1.996-1.881L5.571 6.4H3.5v-.7a.5.5 0 0 1 .5-.5h16a.5.5 0 0 1 .5.5v.7zM14 3a.5.5 0 0 1 .5.5v.7h-5v-.7A.5.5 0 0 1 10 3zM9.5 9h1.2l.5 9H10zm3.8 0h1.2l-.5 9h-1.2z'/%3E%3C/svg%3E");-webkit-mask:var(--un-icon) no-repeat;mask:var(--un-icon) no-repeat;-webkit-mask-size:100% 100%;mask-size:100% 100%;background-color:currentColor;color:inherit;display:inline-flex;width:1em;height:1em}.container,[container=""]{width:100%}[\!container=""]{width:100%!important}.empty-container:empty{width:100%}[before~=container]:before{width:100%}.flex-center{display:flex;align-items:center;justify-content:center}@media (min-width: 640px){.container,[container=""]{max-width:640px}[\!container=""]{max-width:640px!important}.empty-container:empty{max-width:640px}[before~=container]:before{max-width:640px}}@media (min-width: 768px){.container,[container=""]{max-width:768px}[\!container=""]{max-width:768px!important}.empty-container:empty{max-width:768px}[before~=container]:before{max-width:768px}}@media (min-width: 1024px){.container,[container=""]{max-width:1024px}[\!container=""]{max-width:1024px!important}.empty-container:empty{max-width:1024px}[before~=container]:before{max-width:1024px}}@media (min-width: 1280px){.container,[container=""]{max-width:1280px}[\!container=""]{max-width:1280px!important}.empty-container:empty{max-width:1280px}[before~=container]:before{max-width:1280px}}@media (min-width: 1536px){.container,[container=""]{max-width:1536px}[\!container=""]{max-width:1536px!important}.empty-container:empty{max-width:1536px}[before~=container]:before{max-width:1536px}}.\[http\:\/\/\]{http://}.visible{visibility:visible}.absolute{position:absolute}.fixed{position:fixed}.relative{position:relative}.sticky{position:sticky}.static,[static=""]{position:static}.-left-4px{left:-4px}.-top-1\.5px{top:-1.5px}.-top-90px{top:-90px}.bottom--1px{bottom:-1px}.bottom-\[10em\]{bottom:10em}.bottom-0{bottom:0}.bottom-12px{bottom:12px}.bottom-20px{bottom:20px}.bottom-5px{bottom:5px}.left-\[-21px\]{left:-21px}.left-\[0\.4rem\]{left:.4rem}.left-\[2\.6rem\]{left:2.6rem}.left-\[50\%\]{left:50%}.left-0{left:0}.left-15px{left:15px}.left-24px{left:24px}.left-50px{left:50px}.right--2px{right:-2px}.right-\[2rem\]{right:2rem}.right-0,.right-0px{right:0}.right-12px{right:12px}.right-15px{right:15px}.right-16px{right:16px}.right-1px{right:1px}.right-1rem{right:1rem}.right-20px{right:20px}.right-40px{right:40px}.right-8px{right:8px}.top--10px{top:-10px}.top-\[0\.4rem\]{top:.4rem}.top-\[1\.6rem\]{top:1.6rem}.top-\[1rem\]{top:1rem}.top-\[5rem\]{top:5rem}.top-0{top:0}.top-1\/2{top:50%}.top-12px{top:12px}.top-15px{top:15px}.top-16px{top:16px}.top-92px{top:92px}[line-clamp~="1"]{overflow:hidden;display:-webkit-box;-webkit-box-orient:vertical;-webkit-line-clamp:1;line-clamp:1}[line-clamp~="2"]{overflow:hidden;display:-webkit-box;-webkit-box-orient:vertical;-webkit-line-clamp:2;line-clamp:2}[line-clamp~="999"]{overflow:hidden;display:-webkit-box;-webkit-box-orient:vertical;-webkit-line-clamp:999;line-clamp:999}[line-clamp~="9999"]{overflow:hidden;display:-webkit-box;-webkit-box-orient:vertical;-webkit-line-clamp:9999;line-clamp:9999}.isolate{isolation:isolate}.z-1,.z01{z-index:1}.z-2,.z02{z-index:2}.z-\[55\],.z-55{z-index:55}.z-\[99\],.z-99{z-index:99}.z-10{z-index:10}.z-100{z-index:100}.z-1000{z-index:1000}.z-20{z-index:20}.z-50{z-index:50}.z-996{z-index:996}.z-9999{z-index:9999}.grid{display:grid}[cols~="10"]{grid-template-columns:repeat(10,minmax(0,1fr))}[cols~="11"]{grid-template-columns:repeat(11,minmax(0,1fr))}[cols~="15"]{grid-template-columns:repeat(15,minmax(0,1fr))}[cols~="2"]{grid-template-columns:repeat(2,minmax(0,1fr))}[cols~="24"]{grid-template-columns:repeat(24,minmax(0,1fr))}[cols~="3"]{grid-template-columns:repeat(3,minmax(0,1fr))}[cols~="4"]{grid-template-columns:repeat(4,minmax(0,1fr))}[cols~="6"]{grid-template-columns:repeat(6,minmax(0,1fr))}[rows~="1"]{grid-template-rows:repeat(1,minmax(0,1fr))}[rows~="10"]{grid-template-rows:repeat(10,minmax(0,1fr))}[rows~="12"]{grid-template-rows:repeat(12,minmax(0,1fr))}[rows~="14"]{grid-template-rows:repeat(14,minmax(0,1fr))}[rows~="15"]{grid-template-rows:repeat(15,minmax(0,1fr))}[rows~="16"]{grid-template-rows:repeat(16,minmax(0,1fr))}[rows~="2"]{grid-template-rows:repeat(2,minmax(0,1fr))}[rows~="3"]{grid-template-rows:repeat(3,minmax(0,1fr))}[rows~="4"]{grid-template-rows:repeat(4,minmax(0,1fr))}[rows~="5"]{grid-template-rows:repeat(5,minmax(0,1fr))}[rows~="6"]{grid-template-rows:repeat(6,minmax(0,1fr))}[rows~="8"]{grid-template-rows:repeat(8,minmax(0,1fr))}[rows~="80"]{grid-template-rows:repeat(80,minmax(0,1fr))}.float-right{float:right}.m-\[1rem\]{margin:1rem}.m-\[auto\],.m-auto{margin:auto}.m-15px{margin:15px}.m-16px{margin:16px}.m-20px{margin:20px}.m-2px{margin:2px}.mx-\[0\.4rem\]{margin-left:.4rem;margin-right:.4rem}.mx-\[1\.2rem\]{margin-left:1.2rem;margin-right:1.2rem}.mx-\[4px\],.mx-4px{margin-left:4px;margin-right:4px}.mx-\[8px\],.mx-8px{margin-left:8px;margin-right:8px}.mx-0\!{margin-left:0!important;margin-right:0!important}.mx-10px{margin-left:10px;margin-right:10px}.mx-12px{margin-left:12px;margin-right:12px}.mx-16px{margin-left:16px;margin-right:16px}.mx-20px{margin-left:20px;margin-right:20px}.mx-2px{margin-left:2px;margin-right:2px}.mx-32px{margin-left:32px;margin-right:32px}.mx-4px\!{margin-left:4px!important;margin-right:4px!important}.mx-5px{margin-left:5px;margin-right:5px}.mx-6px{margin-left:6px;margin-right:6px}.mx-auto{margin-left:auto;margin-right:auto}.my-\[1\.2rem\]{margin-top:1.2rem;margin-bottom:1.2rem}.my-\[1rem\]\!{margin-top:1rem!important;margin-bottom:1rem!important}.my-\[3rem\]{margin-top:3rem;margin-bottom:3rem}.my-10px{margin-top:10px;margin-bottom:10px}.my-10px\!{margin-top:10px!important;margin-bottom:10px!important}.my-15px,[my-15px=""]{margin-top:15px;margin-bottom:15px}.my-16px{margin-top:16px;margin-bottom:16px}.my-16px\!{margin-top:16px!important;margin-bottom:16px!important}.my-18px{margin-top:18px;margin-bottom:18px}.my-20px{margin-top:20px;margin-bottom:20px}.my-20px\!{margin-top:20px!important;margin-bottom:20px!important}.my-24px{margin-top:24px;margin-bottom:24px}.my-25px{margin-top:25px;margin-bottom:25px}.my-4{margin-top:1rem;margin-bottom:1rem}.my-6\!{margin-top:1.5rem!important;margin-bottom:1.5rem!important}.my-8px{margin-top:8px;margin-bottom:8px}[my-15px~="default:"]:default{margin-top:15px;margin-bottom:15px}.\!mb-\[1\.8rem\]{margin-bottom:1.8rem!important}.\!mt-\[12px\],.mt-12px\!{margin-top:12px!important}.\!mt-0{margin-top:0!important}.mb-\[\.2rem\]{margin-bottom:.2rem}.mb-\[1\.6rem\]{margin-bottom:1.6rem}.mb-\[12px\],.mb-12px{margin-bottom:12px}.mb-\[1rem\]{margin-bottom:1rem}.mb-\[20px\],.mb-20px{margin-bottom:20px}.mb-\[2rem\],.mb-8{margin-bottom:2rem}.mb-10px{margin-bottom:10px}.mb-14px{margin-bottom:14px}.mb-15px{margin-bottom:15px}.mb-15px\!{margin-bottom:15px!important}.mb-16px{margin-bottom:16px}.mb-16px\!{margin-bottom:16px!important}.mb-2{margin-bottom:.5rem}.mb-20px\!{margin-bottom:20px!important}.mb-24px{margin-bottom:24px}.mb-30px{margin-bottom:30px}.mb-32px{margin-bottom:32px}.mb-38px{margin-bottom:38px}.mb-40px{margin-bottom:40px}.mb-4px{margin-bottom:4px}.mb-6px{margin-bottom:6px}.mb-7px{margin-bottom:7px}.mb-8px{margin-bottom:8px}.ml-\[0\.6rem\]{margin-left:.6rem}.ml-\[1\.2rem\]{margin-left:1.2rem}.ml-\[1rem\]{margin-left:1rem}.ml-\[20px\],.ml-20px{margin-left:20px}.ml-\[3rem\]{margin-left:3rem}.ml-\[8px\],.ml-8px{margin-left:8px}.ml-0\.5em{margin-left:.5em}.ml-108px{margin-left:108px}.ml-10px,[ml-10px=""]{margin-left:10px}.ml-10px\!{margin-left:10px!important}.ml-126px{margin-left:126px}.ml-12px{margin-left:12px}.ml-14px{margin-left:14px}.ml-15px{margin-left:15px}.ml-16px{margin-left:16px}.ml-24px{margin-left:24px}.ml-2px{margin-left:2px}.ml-32px{margin-left:32px}.ml-3px{margin-left:3px}.ml-40px{margin-left:40px}.ml-4px{margin-left:4px}.ml-5{margin-left:1.25rem}.ml-5px{margin-left:5px}.ml-5px\!{margin-left:5px!important}.ml-6{margin-left:1.5rem}.ml-60px{margin-left:60px}.ml-6px{margin-left:6px}.ml-70px{margin-left:70px}.ml-7px{margin-left:7px}.ml-90px{margin-left:90px}.ml-auto{margin-left:auto}.mr-\[\.8rem\]{margin-right:.8rem}.mr-\[0\.1rem\]{margin-right:.1rem}.mr-\[1\.6rem\]{margin-right:1.6rem}.mr-\[1rem\]{margin-right:1rem}.mr-\[2rem\]{margin-right:2rem}.mr-\[4rem\]{margin-right:4rem}.mr-0\.25em{margin-right:.25em}.mr-1{margin-right:.25rem}.mr-10px{margin-right:10px}.mr-10px\!{margin-right:10px!important}.mr-12px{margin-right:12px}.mr-15px{margin-right:15px}.mr-16px{margin-right:16px}.mr-20px{margin-right:20px}.mr-22px{margin-right:22px}.mr-24px{margin-right:24px}.mr-2px{margin-right:2px}.mr-30px{margin-right:30px}.mr-32px{margin-right:32px}.mr-3px{margin-right:3px}.mr-40px{margin-right:40px}.mr-48px{margin-right:48px}.mr-4px{margin-right:4px}.mr-5{margin-right:1.25rem}.mr-5px{margin-right:5px}.mr-6px{margin-right:6px}.mr-80px{margin-right:80px}.mr-8px{margin-right:8px}.ms,[ms=""]{margin-inline-start:1rem}.mt,.mt-\[1rem\],.mt-4{margin-top:1rem}.mt--10px{margin-top:-10px}.mt--2px{margin-top:-2px}.mt-\[0rem\]{margin-top:0rem}.mt-\[1\.2rem\]{margin-top:1.2rem}.mt-\[1\.6rem\]{margin-top:1.6rem}.mt-\[10\.5rem\]{margin-top:10.5rem}.mt-\[12px\],.mt-12px{margin-top:12px}.mt-\[16px\],.mt-16px{margin-top:16px}.mt-\[2rem\]{margin-top:2rem}.mt-\[4px\],.mt-4px{margin-top:4px}.mt-10px{margin-top:10px}.mt-14px{margin-top:14px}.mt-15{margin-top:3.75rem}.mt-15px{margin-top:15px}.mt-16px\!{margin-top:16px!important}.mt-1px{margin-top:1px}.mt-20px{margin-top:20px}.mt-24px{margin-top:24px}.mt-2px{margin-top:2px}.mt-30px{margin-top:30px}.mt-32px{margin-top:32px}.mt-36px{margin-top:36px}.mt-40px{margin-top:40px}.mt-49px{margin-top:49px}.mt-50px{margin-top:50px}.mt-5px{margin-top:5px}.mt-6px{margin-top:6px}.mt-8px{margin-top:8px}.inline,[inline=""]{display:inline}.block,[block=""]{display:block}.inline-block{display:inline-block}.contents,[contents=""]{display:contents}.list-item{display:list-item}.hidden{display:none}[hidden~="default:"]:default{display:none}[size~="0"]{width:0;height:0}[size~="10"]{width:2.5rem;height:2.5rem}[size~="100"]{width:25rem;height:25rem}[size~="12"]{width:3rem;height:3rem}[size~="120"]{width:30rem;height:30rem}[size~="13"]{width:3.25rem;height:3.25rem}[size~="14"]{width:3.5rem;height:3.5rem}[size~="15"]{width:3.75rem;height:3.75rem}[size~="150"]{width:37.5rem;height:37.5rem}[size~="16"]{width:4rem;height:4rem}[size~="17"]{width:4.25rem;height:4.25rem}[size~="18"]{width:4.5rem;height:4.5rem}[size~="2"]{width:.5rem;height:.5rem}[size~="20"]{width:5rem;height:5rem}[size~="21"]{width:5.25rem;height:5.25rem}[size~="22"]{width:5.5rem;height:5.5rem}[size~="24"]{width:6rem;height:6rem}[size~="26"]{width:6.5rem;height:6.5rem}[size~="3"]{width:.75rem;height:.75rem}[size~="30"]{width:7.5rem;height:7.5rem}[size~="32"]{width:8rem;height:8rem}[size~="34"]{width:8.5rem;height:8.5rem}[size~="4"]{width:1rem;height:1rem}[size~="40"]{width:10rem;height:10rem}[size~="46"]{width:11.5rem;height:11.5rem}[size~="48"]{width:12rem;height:12rem}[size~="5"]{width:1.25rem;height:1.25rem}[size~="50"]{width:12.5rem;height:12.5rem}[size~="6"]{width:1.5rem;height:1.5rem}[size~="60"]{width:15rem;height:15rem}[size~="8"]{width:2rem;height:2rem}[size~="80"]{width:20rem;height:20rem}.\!w-\[12rem\]{width:12rem!important}.h-\[100px\]{height:100px}.h-\[10rem\]{height:10rem}.h-\[1rem\]{height:1rem}.h-\[2\.2rem\]{height:2.2rem}.h-\[22rem\]{height:22rem}.h-\[24rem\]{height:24rem}.h-\[3\.2rem\]{height:3.2rem}.h-\[30\.1rem\]{height:30.1rem}.h-\[32rem\]{height:32rem}.h-\[34rem\]{height:34rem}.h-\[36px\],.h-36px{height:36px}.h-\[38rem\]{height:38rem}.h-\[3rem\]{height:3rem}.h-\[4\.4rem\]{height:4.4rem}.h-\[40rem\]{height:40rem}.h-\[4rem\],.h-16{height:4rem}.h-\[5\.4rem\]{height:5.4rem}.h-\[50px\],.h-50px,[h-50px=""]{height:50px}.h-\[5px\]{height:5px}.h-\[67px\]{height:67px}.h-\[92px\]{height:92px}.h-\[96px\]{height:96px}.h-10{height:2.5rem}.h-100\%,.h-full{height:100%}.h-103px{height:103px}.h-10px{height:10px}.h-110px{height:110px}.h-114px{height:114px}.h-116px{height:116px}.h-120px{height:120px}.h-124px{height:124px}.h-130px,[h-130px=""]{height:130px}.h-150px{height:150px}.h-15px{height:15px}.h-160px{height:160px}.h-176px{height:176px}.h-180px{height:180px}.h-18px{height:18px}.h-190px{height:190px}.h-200px{height:200px}.h-200px\!{height:200px!important}.h-20px{height:20px}.h-22px{height:22px}.h-24px,[h-24px=""]{height:24px}.h-250px{height:250px}.h-25px{height:25px}.h-260px{height:260px}.h-268px{height:268px}.h-280px{height:280px}.h-28px{height:28px}.h-300px{height:300px}.h-30px{height:30px}.h-320px{height:320px}.h-32px{height:32px}.h-34px{height:34px}.h-350px{height:350px}.h-35px{height:35px}.h-360px{height:360px}.h-388px{height:388px}.h-38px{height:38px}.h-392px{height:392px}.h-400px{height:400px}.h-40px{height:40px}.h-420px{height:420px}.h-428px{height:428px}.h-42px{height:42px}.h-440px{height:440px}.h-44px{height:44px}.h-456px{height:456px}.h-460px{height:460px}.h-468px{height:468px}.h-475px{height:475px}.h-480px{height:480px}.h-48px{height:48px}.h-498px{height:498px}.h-500px{height:500px}.h-52px{height:52px}.h-530px{height:530px}.h-540px{height:540px}.h-55\%{height:55%}.h-550px{height:550px}.h-560px{height:560px}.h-56px{height:56px}.h-580px{height:580px}.h-600px{height:600px}.h-60px,[h-60px=""]{height:60px}.h-610px{height:610px}.h-620px{height:620px}.h-6px{height:6px}.h-700px{height:700px}.h-70px{height:70px}.h-720px{height:720px}.h-72px{height:72px}.h-8{height:2rem}.h-80px{height:80px}.h-8px,[h-8px=""]{height:8px}.h-95px{height:95px}.h1{height:.25rem}.h2,[h2=""]{height:.5rem}.h3{height:.75rem}.max-h-\[14rem\]{max-height:14rem}.max-h-200px{max-height:200px}.max-h-22px{max-height:22px}.max-h-300px{max-height:300px}.max-h-460px{max-height:460px}.max-h-600px{max-height:600px}.max-h-640px{max-height:640px}.max-w-\[36rem\]{max-width:36rem}.max-w-\[90rem\]{max-width:90rem}.max-w-100\%,.max-w-full{max-width:100%}.max-w-1000px{max-width:1000px}.max-w-150px\!{max-width:150px!important}.max-w-160px{max-width:160px}.max-w-190px\!{max-width:190px!important}.max-w-1920px{max-width:1920px}.max-w-250px{max-width:250px}.max-w-260px{max-width:260px}.max-w-290px{max-width:290px}.max-w-300px{max-width:300px}.max-w-350px{max-width:350px}.max-w-360px{max-width:360px}.max-w-360px\!{max-width:360px!important}.max-w-480px\!{max-width:480px!important}.max-w-500px{max-width:500px}.min-h-100px{min-height:100px}.min-h-172px{min-height:172px}.min-h-18px{min-height:18px}.min-h-244px{min-height:244px}.min-h-24px{min-height:24px}.min-h-26px{min-height:26px}.min-h-28px{min-height:28px}.min-h-30px{min-height:30px}.min-h-34px{min-height:34px}.min-h-48px{min-height:48px}.min-h-50px{min-height:50px}.min-h-520px{min-height:520px}.min-h-52px{min-height:52px}.min-h-60px{min-height:60px}.min-h-654px{min-height:654px}.min-w-0{min-width:0}.min-w-120px{min-width:120px}.min-w-134px{min-width:134px}.min-w-140px{min-width:140px}.min-w-160px{min-width:160px}.min-w-18px{min-width:18px}.min-w-240px{min-width:240px}.min-w-250px{min-width:250px}.min-w-260px{min-width:260px}.min-w-32px{min-width:32px}.min-w-450px{min-width:450px}.min-w-500px{min-width:500px}.min-w-52px{min-width:52px}.min-w-68px{min-width:68px}.min-w-70px{min-width:70px}.min-w-auto\!{min-width:auto!important}.w-\[0\.7rem\]{width:.7rem}.w-\[100px\],.w-100px{width:100px}.w-\[10px\],.w-10px{width:10px}.w-\[10rem\]{width:10rem}.w-\[12rem\]{width:12rem}.w-\[150px\],.w-150px{width:150px}.w-\[17rem\]{width:17rem}.w-\[25rem\]{width:25rem}.w-\[26rem\]{width:26rem}.w-\[30rem\]\!{width:30rem!important}.w-\[33\%\],.w-33\%{width:33%}.w-\[34\.0rem\]{width:34rem}.w-\[350px\],.w-350px,[w-350px=""]{width:350px}.w-\[36px\],.w-36px{width:36px}.w-\[36rem\]{width:36rem}.w-\[40\%\],.w-40\%{width:40%}.w-\[48rem\]{width:48rem}.w-\[5\.8rem\]{width:5.8rem}.w-\[50px\],.w-50px{width:50px}.w-\[50rem\]{width:50rem}.w-\[50rem\]\!{width:50rem!important}.w-\[58px\]{width:58px}.w-\[60\%\]{width:60%}.w-\[78px\]{width:78px}.w-\[92px\],.w-92px{width:92px}.w-\[96px\]{width:96px}.w-\[9rem\]{width:9rem}.w-0{width:0}.w-1\/3{width:33.3333333333%}.w-100\%,.w-full{width:100%}.w-100px\!{width:100px!important}.w-1020px{width:1020px}.w-105px\!,[w-105px\!=""]{width:105px!important}.w-110px{width:110px}.w-110px\!{width:110px!important}.w-114px{width:114px}.w-120px{width:120px}.w-120px\!{width:120px!important}.w-12px{width:12px}.w-130px{width:130px}.w-130px\!{width:130px!important}.w-140px{width:140px}.w-140px\!{width:140px!important}.w-142px{width:142px}.w-145px\!{width:145px!important}.w-150px\!{width:150px!important}.w-160px{width:160px}.w-16px{width:16px}.w-170{width:42.5rem}.w-170px{width:170px}.w-174px{width:174px}.w-180px{width:180px}.w-180px\!{width:180px!important}.w-186px{width:186px}.w-190px\!{width:190px!important}.w-194px{width:194px}.w-200px{width:200px}.w-200px\!{width:200px!important}.w-208px\!,[w-208px\!=""]{width:208px!important}.w-20px{width:20px}.w-20rem{width:20rem}.w-210px{width:210px}.w-214px{width:214px}.w-215px\!{width:215px!important}.w-218px\!{width:218px!important}.w-220px{width:220px}.w-225px{width:225px}.w-22px{width:22px}.w-230px{width:230px}.w-240px{width:240px}.w-240px\!{width:240px!important}.w-24px,[w-24px=""]{width:24px}.w-250px{width:250px}.w-250px\!{width:250px!important}.w-25px{width:25px}.w-260px{width:260px}.w-280px{width:280px}.w-280px\!{width:280px!important}.w-290px{width:290px}.w-290px\!{width:290px!important}.w-300px{width:300px}.w-300px\!{width:300px!important}.w-302px{width:302px}.w-310px{width:310px}.w-32\%{width:32%}.w-320px{width:320px}.w-320px\!{width:320px!important}.w-328px{width:328px}.w-32px{width:32px}.w-330px{width:330px}.w-330px\!{width:330px!important}.w-332px{width:332px}.w-34px{width:34px}.w-350px\!{width:350px!important}.w-360px{width:360px}.w-360px\!{width:360px!important}.w-380px{width:380px}.w-380px\!{width:380px!important}.w-38px{width:38px}.w-400px{width:400px}.w-400px\!{width:400px!important}.w-40px{width:40px}.w-410px{width:410px}.w-410px\!{width:410px!important}.w-415px{width:415px}.w-42\%{width:42%}.w-420px{width:420px}.w-420px\!{width:420px!important}.w-42px{width:42px}.w-430px{width:430px}.w-440px{width:440px}.w-44px{width:44px}.w-45\%{width:45%}.w-450px{width:450px}.w-450px\!{width:450px!important}.w-460px{width:460px}.w-466px{width:466px}.w-470px{width:470px}.w-476px{width:476px}.w-48\%{width:48%}.w-480px{width:480px}.w-48px{width:48px}.w-5{width:1.25rem}.w-50\%{width:50%}.w-500px{width:500px}.w-500px\!{width:500px!important}.w-50px\!{width:50px!important}.w-510px{width:510px}.w-530px,[w-530px=""]{width:530px}.w-540px{width:540px}.w-550px{width:550px}.w-550px\!{width:550px!important}.w-56px{width:56px}.w-570px{width:570px}.w-580px\!{width:580px!important}.w-600px{width:600px}.w-600px\!{width:600px!important}.w-60px{width:60px}.w-620px{width:620px}.w-640px{width:640px}.w-650px{width:650px}.w-680px{width:680px}.w-70\%{width:70%}.w-700px{width:700px}.w-70px{width:70px}.w-740px{width:740px}.w-76\%{width:76%}.w-760px{width:760px}.w-8{width:2rem}.w-80\%{width:80%}.w-80px{width:80px}.w-80px\!{width:80px!important}.w-820px{width:820px}.w-850px\!{width:850px!important}.w-860px{width:860px}.w-86px{width:86px}.w-88px,[w-88px=""]{width:88px}.w-8px,[w-8px=""]{width:8px}.w-90\%{width:90%}.w-900px{width:900px}.w-90px{width:90px}.w-920px{width:920px}.w-950px{width:950px}.w-96\%{width:96%}.w-auto{width:auto}.w-full\!{width:100%!important}[w-310px~="default:"]:default{width:310px}[w-570px~="default:"]:default{width:570px}[w-full~="default:"]:default{width:100%}.flex,[flex=""]{display:flex}.inline-flex{display:inline-flex}.flex-1{flex:1 1 0%}.flex-shrink{flex-shrink:1}.flex-shrink-0,.shrink-0{flex-shrink:0}.flex-shrink-0\!{flex-shrink:0!important}.flex-basis-30px{flex-basis:30px}.flex-col,[flex-col=""]{flex-direction:column}.flex-col\!{flex-direction:column!important}.flex-wrap{flex-wrap:wrap}.flex-nowrap{flex-wrap:nowrap}.flex-nowrap\!{flex-wrap:nowrap!important}.table,[table=""]{display:table}.border-collapse{border-collapse:collapse}.table-fixed{table-layout:fixed}.transform{transform:translate(var(--un-translate-x)) translateY(var(--un-translate-y)) translateZ(var(--un-translate-z)) rotate(var(--un-rotate)) rotateX(var(--un-rotate-x)) rotateY(var(--un-rotate-y)) rotate(var(--un-rotate-z)) skew(var(--un-skew-x)) skewY(var(--un-skew-y)) scaleX(var(--un-scale-x)) scaleY(var(--un-scale-y)) scaleZ(var(--un-scale-z))}@keyframes spin{0%{transform:rotate(0)}to{transform:rotate(360deg)}}.animate-spin{animation:spin 1s linear infinite}.\!animate-none{animation:none!important}.cursor-default{cursor:default}.cursor-pointer,[cursor-pointer=""]{cursor:pointer}.cursor-pointer\!{cursor:pointer!important}.cursor-move{cursor:move}.cursor-not-allowed{cursor:not-allowed}.cursor-grab{cursor:grab}.select-none{-webkit-user-select:none;user-select:none}.resize,[resize=""]{resize:both}.list-disc{list-style-type:disc}.list-outside{list-style-position:outside}.list-none\!{list-style-type:none!important}[columns~="1"]{columns:1}.\!items-start{align-items:flex-start!important}.items-start{align-items:flex-start}.items-end{align-items:flex-end}.items-end\!{align-items:flex-end!important}.items-center,[items-center=""]{align-items:center}.items-center\!{align-items:center!important}.items-baseline{align-items:baseline}.self-start{align-self:flex-start}.justify-start{justify-content:flex-start}.justify-end,[justify~=end]{justify-content:flex-end}.justify-end\!{justify-content:flex-end!important}.justify-center,[justify~=center]{justify-content:center}.justify-center\!{justify-content:center!important}.justify-between{justify-content:space-between}.justify-between\!,[justify-between\!=""]{justify-content:space-between!important}.justify-evenly{justify-content:space-evenly}.justify-evenly\!{justify-content:space-evenly!important}.gap-0\!{gap:0!important}.gap-10px{gap:10px}.gap-12px{gap:12px}.gap-12px\!{gap:12px!important}.gap-16px{gap:16px}.gap-16px\!{gap:16px!important}.gap-2\.5{gap:.625rem}.gap-20px{gap:20px}.gap-24px{gap:24px}.gap-2px{gap:2px}.gap-32px{gap:32px}.gap-3px{gap:3px}.gap-4{gap:1rem}.gap-4px{gap:4px}.gap-5{gap:1.25rem}.gap-6{gap:1.5rem}.gap-6px{gap:6px}.gap-8px{gap:8px}.gap-x-24px{column-gap:24px}.overflow-auto{overflow:auto}.overflow-hidden{overflow:hidden}.overflow-y-auto{overflow-y:auto}.overflow-y-hidden{overflow-y:hidden}.truncate{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.whitespace-nowrap{white-space:nowrap}.whitespace-pre{white-space:pre}.whitespace-pre-line{white-space:pre-line}.whitespace-pre-wrap{white-space:pre-wrap}.break-all{word-break:break-all}.break-all\!{word-break:break-all!important}.b,.border,.border-1,.border-1px,[b=""],[border-1px=""]{border-width:1px}.border-\[0\.1rem\]{border-width:.1rem}.border-2px{border-width:2px}.b-b,.border-b-\[1px\],.border-b-1,.border-b-1px,[b-b~="1"]{border-bottom-width:1px}.b-l,[b-l~="1"]{border-left-width:1px}.border-\[\#e8e8e8\]{--un-border-opacity:1;border-color:rgb(232 232 232 / var(--un-border-opacity))}.border-\[\#EBEEF5\],.border-\#EBEEF5{--un-border-opacity:1;border-color:rgb(235 238 245 / var(--un-border-opacity))}.border-\[\#ececec\],.border-\#ececec{--un-border-opacity:1;border-color:rgb(236 236 236 / var(--un-border-opacity))}.border-\[var\(--color-border\)\]{border-color:var(--color-border)}.border-\[var\(--site-global-ip-white-ips-border\)\]{border-color:var(--site-global-ip-white-ips-border)}.border-\#20a53a{--un-border-opacity:1;border-color:rgb(32 165 58 / var(--un-border-opacity))}.border-\#b8e29f{--un-border-opacity:1;border-color:rgb(184 226 159 / var(--un-border-opacity))}.border-\#ccc{--un-border-opacity:1;border-color:rgb(204 204 204 / var(--un-border-opacity))}.border-\#d6e9c6{--un-border-opacity:1;border-color:rgb(214 233 198 / var(--un-border-opacity))}.border-\#e3e4e5{--un-border-opacity:1;border-color:rgb(227 228 229 / var(--un-border-opacity))}.border-\#f3adaa{--un-border-opacity:1;border-color:rgb(243 173 170 / var(--un-border-opacity))}.border-\#f4cf8f{--un-border-opacity:1;border-color:rgb(244 207 143 / var(--un-border-opacity))}.border-white{--un-border-opacity:1;border-color:rgb(255 255 255 / var(--un-border-opacity))}.border-b-\#EBEEF5{--un-border-opacity:1;--un-border-bottom-opacity:var(--un-border-opacity);border-bottom-color:rgb(235 238 245 / var(--un-border-bottom-opacity))}[b-b~="#aaa"]{--un-border-opacity:1;--un-border-bottom-opacity:var(--un-border-opacity);border-bottom-color:rgb(170 170 170 / var(--un-border-bottom-opacity))}[b-l~="#aaa"]{--un-border-opacity:1;--un-border-left-opacity:var(--un-border-opacity);border-left-color:rgb(170 170 170 / var(--un-border-left-opacity))}.rounded{border-radius:.25rem}.rounded-\[0\.2rem\]{border-radius:.2rem}.rounded-\[0\.4rem\]{border-radius:.4rem}.rounded-\[100\%\]{border-radius:100%}.rounded-\[2px\],.rounded-2px{border-radius:2px}.rounded-\[6px\]{border-radius:6px}.rounded-\[8px\],.rounded-8px{border-radius:8px}.rounded-1\/2,.rounded-50\%{border-radius:50%}.rounded-10px{border-radius:10px}.rounded-20px{border-radius:20px}.rounded-4px,[rounded-4px=""]{border-radius:4px}.rounded-5px{border-radius:5px}.rounded-full{border-radius:9999px}.rounded-b-4px{border-bottom-left-radius:4px;border-bottom-right-radius:4px}.rounded-bl-10px{border-bottom-left-radius:10px}.rounded-bl-full{border-bottom-left-radius:9999px}.rounded-tl-10px{border-top-left-radius:10px}.rounded-tl-full{border-top-left-radius:9999px}.rounded-tr-10px{border-top-right-radius:10px}.\!border-none{border-style:none!important}.border-none{border-style:none}.border-solid,[border-solid=""]{border-style:solid}.border-b-solid,[b-b~=solid]{border-bottom-style:solid}[b-l~=solid]{border-left-style:solid}.bg-\[\#20a53a\],.bg-\#20a53a{--un-bg-opacity:1;background-color:rgb(32 165 58 / var(--un-bg-opacity))}.bg-\[\#333\]{--un-bg-opacity:1;background-color:rgb(51 51 51 / var(--un-bg-opacity))}.bg-\[\#a1a1a1\]{--un-bg-opacity:1;background-color:rgb(161 161 161 / var(--un-bg-opacity))}.bg-\[\#CBCBCB\]{--un-bg-opacity:1;background-color:rgb(203 203 203 / var(--un-bg-opacity))}.bg-\[\#ef0808\]{--un-bg-opacity:1;background-color:rgb(239 8 8 / var(--un-bg-opacity))}.bg-\[\#efefef\]{--un-bg-opacity:1;background-color:rgb(239 239 239 / var(--un-bg-opacity))}.bg-\[\#f0ad4e\]{--un-bg-opacity:1;background-color:rgb(240 173 78 / var(--un-bg-opacity))}.bg-\[\#F1F9F3\],.bg-\#F1F9F3{--un-bg-opacity:1;background-color:rgb(241 249 243 / var(--un-bg-opacity))}.bg-\[\#f6f6f6\]{--un-bg-opacity:1;background-color:rgb(246 246 246 / var(--un-bg-opacity))}.bg-\[\#fc6d26\]{--un-bg-opacity:1;background-color:rgb(252 109 38 / var(--un-bg-opacity))}.bg-\[100\%\]{background-position:100%}.bg-\[var\(--app-third-install-tip-bg\)\]{background-color:var(--app-third-install-tip-bg)}.bg-\[var\(--data-base-del-input-bg\)\]{background-color:var(--data-base-del-input-bg)}.bg-\[var\(--domains-lets-ssl-apply-bg\)\]{background-color:var(--domains-lets-ssl-apply-bg)}.bg-\[var\(--home-overview-btn-color\)\]{background-color:var(--home-overview-btn-color)}.bg-\[var\(--home-update-latest-bg\)\]{background-color:var(--home-update-latest-bg)}.bg-\[var\(--setting-security-google-login-key-bg\)\]{background-color:var(--setting-security-google-login-key-bg)}.bg-\[var\(--site-global-ip-white-ips-bg\)\]{background-color:var(--site-global-ip-white-ips-bg)}.bg-\#282c34,.bg-\#282C34{--un-bg-opacity:1;background-color:rgb(40 44 52 / var(--un-bg-opacity))}.bg-\#333333{--un-bg-opacity:1;background-color:rgb(51 51 51 / var(--un-bg-opacity))}.bg-\#424251{--un-bg-opacity:1;background-color:rgb(66 66 81 / var(--un-bg-opacity))}.bg-\#4caf50{--un-bg-opacity:1;background-color:rgb(76 175 80 / var(--un-bg-opacity))}.bg-\#7f7f7f{--un-bg-opacity:1;background-color:rgb(127 127 127 / var(--un-bg-opacity))}.bg-\#c7f7ce{--un-bg-opacity:1;background-color:rgb(199 247 206 / var(--un-bg-opacity))}.bg-\#c8e6c9{--un-bg-opacity:1;background-color:rgb(200 230 201 / var(--un-bg-opacity))}.bg-\#cccccc{--un-bg-opacity:1;background-color:rgb(204 204 204 / var(--un-bg-opacity))}.bg-\#cccccc00{--un-bg-opacity:0;background-color:rgb(204 204 204 / var(--un-bg-opacity))}.bg-\#e7f5e9{--un-bg-opacity:1;background-color:rgb(231 245 233 / var(--un-bg-opacity))}.bg-\#ececec{--un-bg-opacity:1;background-color:rgb(236 236 236 / var(--un-bg-opacity))}.bg-\#f5f5f5{--un-bg-opacity:1;background-color:rgb(245 245 245 / var(--un-bg-opacity))}.bg-\#f5f6fa{--un-bg-opacity:1;background-color:rgb(245 246 250 / var(--un-bg-opacity))}.bg-\#f70b3c{--un-bg-opacity:1;background-color:rgb(247 11 60 / var(--un-bg-opacity))}.bg-\#f7cfce{--un-bg-opacity:1;background-color:rgb(247 207 206 / var(--un-bg-opacity))}.bg-\#f7e6ce{--un-bg-opacity:1;background-color:rgb(247 230 206 / var(--un-bg-opacity))}.bg-\#f7f7f7{--un-bg-opacity:1;background-color:rgb(247 247 247 / var(--un-bg-opacity))}.bg-\#ff0000{--un-bg-opacity:1;background-color:rgb(255 0 0 / var(--un-bg-opacity))}.bg-\#ff6000{--un-bg-opacity:1;background-color:rgb(255 96 0 / var(--un-bg-opacity))}.bg-\#ffaa2c{--un-bg-opacity:1;background-color:rgb(255 170 44 / var(--un-bg-opacity))}.bg-\#FFB04C{--un-bg-opacity:1;background-color:rgb(255 176 76 / var(--un-bg-opacity))}.bg-\#ffc107\!{--un-bg-opacity:1 !important;background-color:rgb(255 193 7 / var(--un-bg-opacity))!important}.bg-\#fff,.bg-white,.bg-\#ffffff{--un-bg-opacity:1;background-color:rgb(255 255 255 / var(--un-bg-opacity))}.bg-black{--un-bg-opacity:1;background-color:rgb(0 0 0 / var(--un-bg-opacity))}.bg-gray-500{--un-bg-opacity:1;background-color:rgb(107 114 128 / var(--un-bg-opacity))}.bg-gray-700{--un-bg-opacity:1;background-color:rgb(55 65 81 / var(--un-bg-opacity))}.bg-modal{background-color:var(--color-modal)}.bg-red-500{--un-bg-opacity:1;background-color:rgb(239 68 68 / var(--un-bg-opacity))}.hover\:bg-\#ececec:hover{--un-bg-opacity:1;background-color:rgb(236 236 236 / var(--un-bg-opacity))}.hover\:bg-\#F68900:hover{--un-bg-opacity:1;background-color:rgb(246 137 0 / var(--un-bg-opacity))}.hover\:bg-primary:hover{background-color:var(--color-primary)}[stroke-width~="10"]{stroke-width:10px}[stroke-width~="12"]{stroke-width:12px}[stroke-width~="4"]{stroke-width:4px}[stroke-width~="7"]{stroke-width:7px}.\!p-\[0\],.\!p-0{padding:0!important}.p-\[1\.6rem\]{padding:1.6rem}.p-\[12px\],.p-12px{padding:12px}.p-\[20px\],.p-20px{padding:20px}.p-\[2rem\],.p-8{padding:2rem}.p-10{padding:2.5rem}.p-10px{padding:10px}.p-15px{padding:15px}.p-16px{padding:16px}.p-24px{padding:24px}.p-26px{padding:26px}.p-30px{padding:30px}.p-32px{padding:32px}.p-40px{padding:40px}.p-4px{padding:4px}.p-5{padding:1.25rem}.p-5px,[p-5px=""]{padding:5px}.p-6px{padding:6px}.p-8px,[p-8px=""]{padding:8px}.px,[px=""]{padding-left:1rem;padding-right:1rem}.px-\[0\.8rem\]{padding-left:.8rem;padding-right:.8rem}.px-\[1\.6rem\]{padding-left:1.6rem;padding-right:1.6rem}.px-\[3rem\]{padding-left:3rem;padding-right:3rem}.px-\[8px\],.px-8px{padding-left:8px;padding-right:8px}.px-0{padding-left:0;padding-right:0}.px-10px{padding-left:10px;padding-right:10px}.px-12px{padding-left:12px;padding-right:12px}.px-15px{padding-left:15px;padding-right:15px}.px-16px{padding-left:16px;padding-right:16px}.px-2{padding-left:.5rem;padding-right:.5rem}.px-20px,[px-20px=""]{padding-left:20px;padding-right:20px}.px-24px{padding-left:24px;padding-right:24px}.px-2px{padding-left:2px;padding-right:2px}.px-30px{padding-left:30px;padding-right:30px}.px-32px{padding-left:32px;padding-right:32px}.px-36px{padding-left:36px;padding-right:36px}.px-40px{padding-left:40px;padding-right:40px}.px-4px{padding-left:4px;padding-right:4px}.px-50px{padding-left:50px;padding-right:50px}.px-5px{padding-left:5px;padding-right:5px}.px-6px{padding-left:6px;padding-right:6px}.py,.py-\[1rem\]{padding-top:1rem;padding-bottom:1rem}.py-\[0\.6rem\]{padding-top:.6rem;padding-bottom:.6rem}.py-\[3\.2rem\]{padding-top:3.2rem;padding-bottom:3.2rem}.py-1{padding-top:.25rem;padding-bottom:.25rem}.py-10px{padding-top:10px;padding-bottom:10px}.py-12px{padding-top:12px;padding-bottom:12px}.py-15px{padding-top:15px;padding-bottom:15px}.py-16px{padding-top:16px;padding-bottom:16px}.py-20px{padding-top:20px;padding-bottom:20px}.py-24px{padding-top:24px;padding-bottom:24px}.py-26px{padding-top:26px;padding-bottom:26px}.py-2px{padding-top:2px;padding-bottom:2px}.py-30px{padding-top:30px;padding-bottom:30px}.py-3px{padding-top:3px;padding-bottom:3px}.py-40px{padding-top:40px;padding-bottom:40px}.py-4px{padding-top:4px;padding-bottom:4px}.py-52px{padding-top:52px;padding-bottom:52px}.py-5px{padding-top:5px;padding-bottom:5px}.py-6px{padding-top:6px;padding-bottom:6px}.py-8px{padding-top:8px;padding-bottom:8px}[px~="14"]{padding-left:3.5rem;padding-right:3.5rem}[px-8px~="default:"]:default{padding-left:8px;padding-right:8px}[px~="default:"]:default{padding-left:1rem;padding-right:1rem}.pb-0{padding-bottom:0}.pb-100px{padding-bottom:100px}.pb-10px{padding-bottom:10px}.pb-12px{padding-bottom:12px}.pb-16px{padding-bottom:16px}.pb-24px{padding-bottom:24px}.pb-32px{padding-bottom:32px}.pb-40px{padding-bottom:40px}.pb-8px{padding-bottom:8px}.pl{padding-left:1rem}.pl-\[2\.5rem\]{padding-left:2.5rem}.pl-10\%{padding-left:10%}.pl-10px{padding-left:10px}.pl-12px{padding-left:12px}.pl-15px{padding-left:15px}.pl-16px,[pl-16px=""]{padding-left:16px}.pl-20px{padding-left:20px}.pl-21px{padding-left:21px}.pl-22px{padding-left:22px}.pl-24px{padding-left:24px}.pl-30px{padding-left:30px}.pl-36px{padding-left:36px}.pl-48px{padding-left:48px}.pl-5px{padding-left:5px}.pl-8px{padding-left:8px}.pr-\[0\.8rem\]{padding-right:.8rem}.pr-\[1\.5rem\]{padding-right:1.5rem}.pr-\[2rem\]{padding-right:2rem}.pr-10px{padding-right:10px}.pr-15px{padding-right:15px}.pr-16px{padding-right:16px}.pr-24px{padding-right:24px}.pr-40px{padding-right:40px}.pr-56px{padding-right:56px}.pr-8\%{padding-right:8%}.pr-8px{padding-right:8px}.ps,[ps=""]{padding-inline-start:1rem}.ps1{padding-inline-start:.25rem}.pt{padding-top:1rem}.pt-0,.pt-0px{padding-top:0}.pt-0\!{padding-top:0!important}.pt-100px{padding-top:100px}.pt-120px{padding-top:120px}.pt-12px{padding-top:12px}.pt-140px{padding-top:140px}.pt-14px{padding-top:14px}.pt-15px{padding-top:15px}.pt-16px{padding-top:16px}.pt-20px{padding-top:20px}.pt-22px{padding-top:22px}.pt-24px,[pt-24px=""]{padding-top:24px}.pt-28px{padding-top:28px}.pt-32px{padding-top:32px}.pt-35px{padding-top:35px}.pt-40px{padding-top:40px}.pt-44px{padding-top:44px}.pt-4px{padding-top:4px}.pt-50px{padding-top:50px}.pt-52px{padding-top:52px}.pt-5px{padding-top:5px}.pt-68px{padding-top:68px}.pt-6px{padding-top:6px}.pt-8\%{padding-top:8%}.pt-80px{padding-top:80px}.pt-8px{padding-top:8px}[pb-12px~="default:"]:default{padding-bottom:12px}.pie{padding-inline-end:1rem}.text-center{text-align:center}.text-left{text-align:left}.text-right{text-align:right}.indent--15px{text-indent:-15px}.root-indent:root{text-indent:1.5rem}[root-indent~="0"]:root{text-indent:0}[root-indent~="26"]:root{text-indent:6.5rem}.text-nowrap{text-wrap:nowrap}.text-nowrap\!{text-wrap:nowrap!important}.align-middle{vertical-align:middle}.text-\[1\.2rem\]{font-size:1.2rem}.text-\[1\.4rem\]{font-size:1.4rem}.text-\[1\.5rem\]{font-size:1.5rem}.text-\[1\.6rem\]{font-size:1.6rem}.text-\[1\.8rem\]{font-size:1.8rem}.text-\[11px\]{font-size:11px}.text-\[14px\],.text-14px{font-size:14px}.text-\[18px\],.text-18px{font-size:18px}.text-\[2\.4rem\]{font-size:2.4rem}.text-\[22px\],.text-22px{font-size:22px}.text-\[2rem\]{font-size:2rem}.text-\[3\.2rem\]{font-size:3.2rem}.text-\[30px\],.text-30px{font-size:30px}.text-10px{font-size:10px}.text-12px{font-size:12px}.text-12px\!{font-size:12px!important}.text-13px{font-size:13px}.text-15px{font-size:15px}.text-16{font-size:4rem}.text-16px{font-size:16px}.text-17px,[text-17px=""]{font-size:17px}.text-19px{font-size:19px}.text-20px{font-size:20px}.text-21px{font-size:21px}.text-24px{font-size:24px}.text-26px{font-size:26px}.text-28px{font-size:28px}.text-2xl{font-size:1.5rem;line-height:2rem}.text-32px{font-size:32px}.text-34px{font-size:34px}.text-4xl\!{font-size:2.25rem!important;line-height:2.5rem!important}.text-50px{font-size:50px}.text-7{font-size:1.75rem}.text-lg{font-size:1.125rem;line-height:1.75rem}.text-xl{font-size:1.25rem;line-height:1.75rem}.text-xs{font-size:.75rem;line-height:1rem}[text-14px~="default:"]:default{font-size:14px}[font-size~="12"]{font-size:3rem}.\!text-\[\#20a53A\]{--un-text-opacity:1 !important;color:rgb(32 165 58 / var(--un-text-opacity))!important}.\!text-\[\#E8D544\]{--un-text-opacity:1 !important;color:rgb(232 213 68 / var(--un-text-opacity))!important}.\!text-\[\#EF0808\]{--un-text-opacity:1 !important;color:rgb(239 8 8 / var(--un-text-opacity))!important}.\!text-\[\#F0AD4E\]{--un-text-opacity:1 !important;color:rgb(240 173 78 / var(--un-text-opacity))!important}.text-\[\'\ \+\ \(_unref\(scanDetect\)\.security_count\ \=\=\=\ 100\ \?\ \'\ \#20a53a\ \'\ \:\ \'\ \#fc6d26\ \'\)\ \+\ \'\]{color:" + ( unref(scanDetect).security count === 100 ? " #20a53a " : " #fc6d26 ") + "}.text-\[\'\ \+\ \(scanDetect\.security_count\ \=\=\=\ 100\ \?\ \'\ \#20a53a\ \'\ \:\ \'\ \#fc6d26\ \'\)\ \+\ \'\]{color:" + (scanDetect.security count === 100 ? " #20a53a " : " #fc6d26 ") + "}.color-\#20a53a,.text-\[\#20a53a\],.text-\#20a53a,[color~="#20a53a"]{--un-text-opacity:1;color:rgb(32 165 58 / var(--un-text-opacity))}.color-\#333,.text-\[\#333\],.text-\#333{--un-text-opacity:1;color:rgb(51 51 51 / var(--un-text-opacity))}.text-\[\#36ad6a\]{--un-text-opacity:1;color:rgb(54 173 106 / var(--un-text-opacity))}.text-\[\#555\],.text-\#555{--un-text-opacity:1;color:rgb(85 85 85 / var(--un-text-opacity))}.text-\[\#565656\]{--un-text-opacity:1;color:rgb(86 86 86 / var(--un-text-opacity))}.text-\[\#909399\],[color~="#909399"]{--un-text-opacity:1;color:rgb(144 147 153 / var(--un-text-opacity))}.color-\#999,.text-\[\#999\],.text-\#999,[color~="#999"]{--un-text-opacity:1;color:rgb(153 153 153 / var(--un-text-opacity))}.color-\#ef0808,.text-\[\#ef0808\],[color~="#ef0808"]{--un-text-opacity:1;color:rgb(239 8 8 / var(--un-text-opacity))}.text-\[\#f0a020\],[color~="#f0a020"]{--un-text-opacity:1;color:rgb(240 160 32 / var(--un-text-opacity))}.text-\[\#F0AD4E\]{--un-text-opacity:1;color:rgb(240 173 78 / var(--un-text-opacity))}.color-\#fc6d26,.text-\[\#fc6d26\],.text-\#fc6d26,[color~="#fc6d26"]{--un-text-opacity:1;color:rgb(252 109 38 / var(--un-text-opacity))}.color-\#fff,.color-white,.text-\[\#fff\],.text-\#fff,.text-white,[color~="#fff"],[color~=white]{--un-text-opacity:1;color:rgb(255 255 255 / var(--un-text-opacity))}.text-\[red\]{color:red}.text-\[var\(--border-hover-focus-color\)\]{color:var(--border-hover-focus-color)}.text-\[var\(--home-success-text-color\)\]{color:var(--home-success-text-color)}.text-\[var\(--setting-security-google-login-bind-text\)\]{color:var(--setting-security-google-login-bind-text)}.text-\[var\(--setting-security-google-login-bind-title\)\]{color:var(--setting-security-google-login-bind-title)}.text-\[var\(--setting-security-google-login-key-text\)\]{color:var(--setting-security-google-login-key-text)}.color-\#1d9534,.text-\#1d9534{--un-text-opacity:1;color:rgb(29 149 52 / var(--un-text-opacity))}.text-\#20a53a\!{--un-text-opacity:1 !important;color:rgb(32 165 58 / var(--un-text-opacity))!important}.color-\#3c763d,.text-\#3c763d{--un-text-opacity:1;color:rgb(60 118 61 / var(--un-text-opacity))}.color-\#666,.text-\#666,[color~="#666"]{--un-text-opacity:1;color:rgb(102 102 102 / var(--un-text-opacity))}.text-\#666\!{--un-text-opacity:1 !important;color:rgb(102 102 102 / var(--un-text-opacity))!important}.text-\#69be3d{--un-text-opacity:1;color:rgb(105 190 61 / var(--un-text-opacity))}.text-\#6c7688{--un-text-opacity:1;color:rgb(108 118 136 / var(--un-text-opacity))}.text-\#777{--un-text-opacity:1;color:rgb(119 119 119 / var(--un-text-opacity))}.text-\#919191{--un-text-opacity:1;color:rgb(145 145 145 / var(--un-text-opacity))}.text-\#9DA1A6{--un-text-opacity:1;color:rgb(157 161 166 / var(--un-text-opacity))}.text-\#ccc,[color~="#ccc"]{--un-text-opacity:1;color:rgb(204 204 204 / var(--un-text-opacity))}.text-\#e6a23c{--un-text-opacity:1;color:rgb(230 162 60 / var(--un-text-opacity))}.text-\#ef8581{--un-text-opacity:1;color:rgb(239 133 129 / var(--un-text-opacity))}.text-\#f7be56{--un-text-opacity:1;color:rgb(247 190 86 / var(--un-text-opacity))}.text-\#fcb040{--un-text-opacity:1;color:rgb(252 176 64 / var(--un-text-opacity))}.text-base,.text-title{color:var(--color-text-base)}.text-blue-500{--un-text-opacity:1;color:rgb(59 130 246 / var(--un-text-opacity))}.text-body{--un-text-opacity:1;color:rgb(58 66 77 / var(--un-text-opacity))}.text-dark{--un-text-opacity:1;color:rgb(34 34 34 / var(--un-text-opacity))}.text-default{color:var(--color-text-4)}.color-desc,.text-desc{color:var(--color-text-desc)}.color-error,.text-error,[text-error=""]{color:var(--color-error)}.text-font1{color:var(--color-text-1)}.color-font2,.text-font2{color:var(--color-text-2)}.text-font3{color:var(--color-text-3)}.color-primary,.text-primary,.text-primary\:hover{color:var(--color-primary)}.text-primary-hover{--un-text-opacity:1;color:rgb(29 149 52 / var(--un-text-opacity))}.text-primary\!{color:var(--color-primary)!important}.text-pro{color:var(--color-pro)}.text-purple-500{--un-text-opacity:1;color:rgb(168 85 247 / var(--un-text-opacity))}.text-red-5,.text-red-500{--un-text-opacity:1;color:rgb(239 68 68 / var(--un-text-opacity))}.color-warning,.text-warning{color:var(--color-warning)}.text-warning\!{color:var(--color-warning)!important}.text-weak{--un-text-opacity:1;color:rgb(196 198 201 / var(--un-text-opacity))}.text-yellow-500{--un-text-opacity:1;color:rgb(234 179 8 / var(--un-text-opacity))}[text~="$t("]{color:var(--t\()}.hover\:text-\#777777:hover{--un-text-opacity:1;color:rgb(119 119 119 / var(--un-text-opacity))}.hover\:text-primary-hover:hover{--un-text-opacity:1;color:rgb(29 149 52 / var(--un-text-opacity))}.hover\:text-primary:hover{color:var(--color-primary)}.color-\[var\(--home-update-bt-link-color\)\]{color:var(--home-update-bt-link-color)}.color-\#666666,[color~="#666666"]{--un-text-opacity:1;color:rgb(102 102 102 / var(--un-text-opacity))}.color-\#888888{--un-text-opacity:1;color:rgb(136 136 136 / var(--un-text-opacity))}.color-\#999999{--un-text-opacity:1;color:rgb(153 153 153 / var(--un-text-opacity))}.color-\#a94442{--un-text-opacity:1;color:rgb(169 68 66 / var(--un-text-opacity))}.color-\#f23836{--un-text-opacity:1;color:rgb(242 56 54 / var(--un-text-opacity))}.color-\#fc7938{--un-text-opacity:1;color:rgb(252 121 56 / var(--un-text-opacity))}.color-\#ff3333{--un-text-opacity:1;color:rgb(255 51 51 / var(--un-text-opacity))}.color-\#ffb800{--un-text-opacity:1;color:rgb(255 184 0 / var(--un-text-opacity))}.color-red{--un-text-opacity:1;color:rgb(248 113 113 / var(--un-text-opacity))}[color~="#000"]{--un-text-opacity:1;color:rgb(0 0 0 / var(--un-text-opacity))}[color~="#0a8c46"]{--un-text-opacity:1;color:rgb(10 140 70 / var(--un-text-opacity))}[color~="#4fb233"]{--un-text-opacity:1;color:rgb(79 178 51 / var(--un-text-opacity))}[color~="#67c23a"]{--un-text-opacity:1;color:rgb(103 194 58 / var(--un-text-opacity))}[color~="#A6ADB3"]{--un-text-opacity:1;color:rgb(166 173 179 / var(--un-text-opacity))}[color~="#bbb"]{--un-text-opacity:1;color:rgb(187 187 187 / var(--un-text-opacity))}[color~="#c2c2c2"]{--un-text-opacity:1;color:rgb(194 194 194 / var(--un-text-opacity))}[color~="#cbcbcb"]{--un-text-opacity:1;color:rgb(203 203 203 / var(--un-text-opacity))}[color~="#E65100"]{--un-text-opacity:1;color:rgb(230 81 0 / var(--un-text-opacity))}[color~="#E85445"]{--un-text-opacity:1;color:rgb(232 84 69 / var(--un-text-opacity))}[color~="#f08a00"]{--un-text-opacity:1;color:rgb(240 138 0 / var(--un-text-opacity))}[color~="#f2711c"]{--un-text-opacity:1;color:rgb(242 113 28 / var(--un-text-opacity))}[color~="#FDCA62"]{--un-text-opacity:1;color:rgb(253 202 98 / var(--un-text-opacity))}[color~="#ff8d00"]{--un-text-opacity:1;color:rgb(255 141 0 / var(--un-text-opacity))}[color~="#ffae45"]{--un-text-opacity:1;color:rgb(255 174 69 / var(--un-text-opacity))}.font-500{font-weight:500}.font-600{font-weight:600}.font-700,.font-bold,.fw-bold{font-weight:700}.font-bold\!{font-weight:700!important}.leading-\[0\.14rem\]{line-height:.14rem}.leading-\[1\.2\]{line-height:1.2}.leading-\[1\.4\]{line-height:1.4}.leading-\[1\.5\]{line-height:1.5}.leading-\[1\.8rem\]{line-height:1.8rem}.leading-\[1\],.leading-none{line-height:1}.leading-\[2rem\]{line-height:2rem}.leading-1{line-height:.25rem}.leading-14px{line-height:14px}.leading-15px{line-height:15px}.leading-16px{line-height:16px}.leading-17px{line-height:17px}.leading-18{line-height:4.5rem}.leading-18px{line-height:18px}.leading-20px{line-height:20px}.leading-22px,.lh-22px{line-height:22px}.leading-24px,.line-height-24px{line-height:24px}.leading-25px{line-height:25px}.leading-26px{line-height:26px}.leading-28px{line-height:28px}.leading-30px{line-height:30px}.leading-32px{line-height:32px}.leading-36px{line-height:36px}.leading-40px{line-height:40px}.leading-50px{line-height:50px}.uppercase{text-transform:uppercase}.capitalize{text-transform:capitalize}.italic{font-style:italic}.line-through{text-decoration-line:line-through}.underline{text-decoration-line:underline}.tab,[tab=""]{-moz-tab-size:4;-o-tab-size:4;tab-size:4}.tab-0{-moz-tab-size:0;-o-tab-size:0;tab-size:0}[tab~="$t("]{-moz-tab-size:var(--t\();-o-tab-size:var(--t\();tab-size:var(--t\()}[tab~="1"]{-moz-tab-size:1;-o-tab-size:1;tab-size:1}.text-shadow{--un-text-shadow:0 0 1px var(--un-text-shadow-color, rgb(0 0 0 / .2)),0 0 1px var(--un-text-shadow-color, rgb(1 0 5 / .1));text-shadow:var(--un-text-shadow)}.write-vertical-right{writing-mode:vertical-rl}.opacity-0{opacity:0}.opacity-50{opacity:.5}.shadow{--un-shadow:var(--un-shadow-inset) 0 1px 3px 0 var(--un-shadow-color, rgb(0 0 0 / .1)),var(--un-shadow-inset) 0 1px 2px -1px var(--un-shadow-color, rgb(0 0 0 / .1));box-shadow:var(--un-ring-offset-shadow),var(--un-ring-shadow),var(--un-shadow)}.outline{outline-style:solid}.blur,[blur=""]{--un-blur:blur(8px);filter:var(--un-blur) var(--un-brightness) var(--un-contrast) var(--un-drop-shadow) var(--un-grayscale) var(--un-hue-rotate) var(--un-invert) var(--un-saturate) var(--un-sepia)}[blur~="required:"]:required{--un-blur:blur(8px);filter:var(--un-blur) var(--un-brightness) var(--un-contrast) var(--un-drop-shadow) var(--un-grayscale) var(--un-hue-rotate) var(--un-invert) var(--un-saturate) var(--un-sepia)}.filter{filter:var(--un-blur) var(--un-brightness) var(--un-contrast) var(--un-drop-shadow) var(--un-grayscale) var(--un-hue-rotate) var(--un-invert) var(--un-saturate) var(--un-sepia)}.backdrop-filter{-webkit-backdrop-filter:var(--un-backdrop-blur) var(--un-backdrop-brightness) var(--un-backdrop-contrast) var(--un-backdrop-grayscale) var(--un-backdrop-hue-rotate) var(--un-backdrop-invert) var(--un-backdrop-opacity) var(--un-backdrop-saturate) var(--un-backdrop-sepia);backdrop-filter:var(--un-backdrop-blur) var(--un-backdrop-brightness) var(--un-backdrop-contrast) var(--un-backdrop-grayscale) var(--un-backdrop-hue-rotate) var(--un-backdrop-invert) var(--un-backdrop-opacity) var(--un-backdrop-saturate) var(--un-backdrop-sepia)}.transition{transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition-all{transition-property:all;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition-colors,[transition-colors=""]{transition-property:color,background-color,border-color,text-decoration-color,fill,stroke;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.duration-100{transition-duration:.1s}.duration-200{transition-duration:.2s}.ease,.ease-in-out{transition-timing-function:cubic-bezier(.4,0,.2,1)}.ease-in{transition-timing-function:cubic-bezier(.4,0,1,1)}.content-none{content:none}[placeholder~="$t("]::placeholder{color:var(--t\()}:where(html){line-height:1.15;-webkit-text-size-adjust:100%;text-size-adjust:100%}:where(h1){font-size:2em;margin-block-end:.67em;margin-block-start:.67em}:where(dl,ol,ul) :where(dl,ol,ul){margin-block-end:0;margin-block-start:0}:where(hr){box-sizing:content-box;color:inherit;height:0}:where(abbr[title]){text-decoration:underline;text-decoration:underline dotted}:where(b,strong){font-weight:bolder}:where(code,kbd,pre,samp){font-family:monospace,monospace;font-size:1em}:where(small){font-size:80%}:where(table){border-color:currentColor;text-indent:0}:where(button,input,select){margin:0}:where(button){text-transform:none}:where(button,input:is([type=button i],[type=reset i],[type=submit i])){-webkit-appearance:button}:where(progress){vertical-align:baseline}:where(select){text-transform:none}:where(textarea){margin:0}:where(input[type=search i]){-webkit-appearance:textfield;outline-offset:-2px}::-webkit-inner-spin-button,::-webkit-outer-spin-button{height:auto}::-webkit-input-placeholder{color:inherit;opacity:.54}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}:where(button,input:is([type=button i],[type=color i],[type=reset i],[type=submit i]))::-moz-focus-inner{border-style:none;padding:0}:where(button,input:is([type=button i],[type=color i],[type=reset i],[type=submit i]))::-moz-focusring{outline:1px dotted ButtonText}:where(:-moz-ui-invalid){box-shadow:none}:where(dialog){background-color:#fff;border:solid;color:#000;height:-moz-fit-content;height:fit-content;left:0;margin:auto;padding:1em;position:absolute;right:0;width:-moz-fit-content;width:fit-content}:where(dialog:not([open])){display:none}:where(summary){display:list-item}@font-face{font-family:Outfit;font-style:normal;font-display:swap;font-weight:500;src:url(/static/vite/fonts/outfit-latin-500-normal.woff2) format("woff2"),url(/static/vite/fonts/outfit-all-500-normal.woff) format("woff");unicode-range:U+0000-00FF,U+0131,U+0152-0153,U+02BB-02BC,U+02C6,U+02DA,U+02DC,U+2000-206F,U+2074,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD}@font-face{font-family:Inter;font-style:normal;font-weight:100 900;font-display:swap;src:url(/static/vite/fonts/inter.woff2) format("woff2")}:root{--color-primary: #20a53a;--color-primary-1: #e4f4e7;--color-success: #20a53a;--color-warning: #ffae45;--color-error: #e73a33;--color-pro: #ff8f00;--primary-button-color-hover: #1d9534;--primary-button-color-pressed: #1a8a30;--primary-button-color-suppl: #1d9534;--color-text-base: #3a424d;--color-text-1: #131313;--color-text-2: #3a424d;--color-text-3: #999999;--color-text-4: #666666;--color-text-5: #333333;--color-text-desc: #999999;--color-bg-1: #f2f5f9;--color-bg-2: #ffffff;--color-bg-3: #f2f5f9;--color-bg-4: #f7f7f7;--layout-bg: url(/static/vite/images/bg.png);--color-border: #dcdfe6;--border-hover-focus-color: var(--color-primary);--color-sider-text: #3a424d;--color-sider: #f2f5f999;--color-sider-active: #20a53a;--color-sider-hover: #20a53a1a;--color-sider-hover-text: #20a53a;--color-sider-active-text: #ffffff;--router-menu-active-text: var(--color-primary);--router-menu-active-bg: rgba(32, 165, 58, .063);--color-table-td: var(--color-bg-2);--color-table-th: #f6f6f6;--color-table-border: var(--color-border);--color-table-td-hover: #f0f9f7;--color-modal: #fff;--modal-header-bg: #f6f8f8;--modal-header-bottom-border: #eee;--modal-action-bg: var(--modal-header-bg);--modal-action-top-border: #edf1f2;---card-bg-color-1: #f9fafb;---card-border-primary-color-1: #c6f6d1;---card-border-error-color-1: #ef080830;--color-tabs: #f5f5f5;--dialog-color-text: #333;--dialog-color-title-text: #333;--color-message: #ffffff;--color-message-border: #d3d4d3;--popover-color: #ffffff;--input-text-color: #333;--input-focus-bg-color: var(--color-bg-2);--input-disabled-color: #f5f5f5;--input-group-label-color: #f5f5f5;--input-disabled-border-color: 1px solid #d9d9d9;--select-box-shadow: 0 0 8px 0 rgba(32, 165, 58, .4);--button-text-color: var(--color-text-2);--button-bg-hover: #f1f9f3;--button-border-hover: 1px solid #bce4c4;--button-type-text-primary: var(--color-primary);--button-text-base-color: #fff;--button-gray-color: #eee;--radio-text-color: #333333;--radio-bg-color: var(--color-bg-2);--radio-active-dot-color: var(--color-primary);--radio-border-dot-color: inset 0 0 0 1px #d2ffdb;--check-color-checked: var(--color-primary);--check-border-checked: 1px solid #20a53a;--switch-active-color: var(--color-primary);--upload-dragger-color: #ffffff;--tooltip-color-text: #666;--alert-default-bg: #f0f0f1;--alert-warning-bg: #fdf6ec;--alert-error-bg: #fde6e6;--alert-success-bg: #f5faf2;--alert-success-text: #333;--alert-error-border: 1px solid #fde6e6;--alert-success-border: 1px solid #eaf1f2;--tag-primary-bg-color: #e4f4e7;--tag-primary-text-color: var(--color-primary);--collapse-color: #f2f5f9;--collapse-header-bg: #fafafa;--time-picker-separator-color: #ccc;--tabs-panel-color-text: #333333;--tabs-border-color: #cacad9;--tabs-bg: -webkit-gradient(linear, 0% 0, 0% 100%, from(#f6f6f6), to(#ddd));--tabs-active-bg: #ffffff;--tabs-active-text-color: #333333;--bt-tabs-modal-bg: #f0f0f1;--bt-tabs-modal-active-bg: var(--color-modal);--bt-tabs-modal-cancel-btn-bg: #cbcbcb;--bt-tabs-modal-header-close: brightness(1);--bt-tabs-modal-color: #f9fbfc;--bt-tabs-modal-left-active-bg: #4caf50;--bt-tabs-modal-left-shadow: 2px 0 3px #e4e3e3;--confirm-calc-bg: #f0f0f0;--progress-rail-color: #f2f5f9;--pagination-item-active-border: 1px solid var(--color-primary);--pagination-item-active-color: var(--color-primary);--ace-editor-tip-color: #555;--pre-color-text: #333;--pre-bg-color: #f5f5f5;--modal-boxshadow: 0 6px 16px -9px rgba(0, 0, 0, .08), 0 9px 28px 0 rgba(0, 0, 0, .05), 0 12px 48px 16px rgba(0, 0, 0, .03);--bt-input-path-hover-bg: #ececec;--flow-container-bg: #f3f4f6;--flow-config-title-color: #333333;--home-ad-bg-color: #fff;--home-ad-badge-bg-color: linear-gradient( 270deg, rgba(255, 255, 255, .2) 0%, rgba(255, 174, 69, .2) 100% );--home-overview-btn-color: #f2f5f9;--home-soft-bg-color: transparent;--home-soft-bg-hover-color: linear-gradient(244.14deg, #ffffff -1.23%, #e5f7ee 72.39%);--home-soft-border-color: #edf0f4;--home-soft-border-hover-color: var(--color-primary);--home-monitor-tabs-active-color: var(--color-primary);--home-risk-overview-circle-bg: #ffffff;--home-risk-security-list-hover-bg: #f5f7fa;--home-risk-security-list-spin-bg: #f2f2f2;--home-risk-security-list-collapse-item-color: #666;--home-risk-security-ignore-collapse-bg: #f8f8f8;--home-risk-file-info-title-color: #666;--home-risk-file-info-item-color: #333;--home-risk-server-list-bg: #f7f7f7;--home-risk-server-list-text: #555;--home-risk-server-list-hover: #efefef;--home-update-bg-url: url(/static/vite/images/update-bg.png);--home-update-title-color: #565656;--home-update-content-bg: #f6fbf7;--home-update-content-text: #666666;--home-update-detail-bg: #f7f7f7;--home-update-detail-date: #333;--home-pro-icon-color: #fff;--home-disk-color-warning: #ffefda;--home-disk-color-error: #fad8d6;--home-update-latest-bg: #f7fcf8;--home-update-latest-border: 1px solid #eeefec;--home-update-latest-text-color: #4f4f4f;--home-update-head-bg: #37bc51;--home-update-back-bg: linear-gradient(to top, rgb(255 255 255), #37bc51);--home-update-bt-link-color: var(--color-primary);--home-soft-install-bg-color: var(--color-table-td-hover);--home-soft-install-border-color: var(--color-primary);--home-success-bg-color: #37bc51;--home-success-text-color: #c7c7c7;--site-config-ssl-label: #666;--site-config-business-tips: #dff0d8;--site-ace-editor-border: #ccc;--site-confirm-calc-box-bg: #f0f0f0;--site-detele-content-item-hover-bg: #fcfcfc;--site-task-progress-border: #e5e7eb;--site-multi-service-rollback-bg: #f0f0f1;--site-global-ip-white-ips-bg: #f8f9fa;--site-global-ip-white-ips-border: #e4e8eb;--data-base-del-input-bg: #e6e6e6;--docker-type-list-bg: #e6e6e6;--docker-type-list-text: #555555;--docker-type-list-active-bg: #e8f6eb;--docker-type-list-active-text: var(--color-primary);--docker-plugin-list-tag-gb: #f4f4f5;--docker-plugin-list-tag-tips-bg: #fff;--docker-plugin-list-border: #ffffff;--app-soft-sort-bg: #e6e6e6;--app-soft-sort-active-bg: var(--color-primary);--app-soft-sort-hover-color: #ffffff;--app-soft-used-hover: #f5f5f5;--app-soft-pro-tips-text: #3c763d;--app-soft-pro-tips-bg: #dff0d8;--app-third-security-tip-bg: #f2dede;--app-plugin-dns-bg: #f7fffa;--app-third-install-tip-bg: #f5f6fa;--pay-color: #ff8f00;--pay-color-bg: #fff5e1;--pay-color-border: #ecb566;--coupon-bg: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAZIAAAHlCAMAAADoe4qxAAAATlBMVEVHcEz////////////////////////////////////////////////////////////////////////////////////z8/P8/Pz5+fn29vbA3pgqAAAAFXRSTlMAMOCg0M8QIECQ34+AcD/Ar79/sJ+9bwY+AAADsElEQVR42u3YyVLCUBBA0Y5AXgLOCuj//6jBocqBULrqxjp38dZUn3rpkIiptlltld5q0+K9jWlUafMm4oZUuikHkdEcKjVOe8QUatVcknrXxCYpt03MoFpIkAgJEiFBIiRIhERIkAgJEiFBIiRIhERIkAgJEiFBIiRCgkRIkAgJEiFBIiRCgkRIkAgJEiEREiRCgkRIkAgJEiEREiRCgkRIkAiJkCAREiRCgkRIkAiJkCAREiRCgkRIhASJkCAREiRCgkRIhASJkCAREiRCIiRIhASJkCAREiRCIiRIhASJkCAREiFBIiRIhASJkCAREiFBIiRIhASJkAgJEiFBIiRIhASJkAgJEiFBIiRIhASJESAREiRCgkRIkAiJkCAREiRCgkRIkAiJkCAREiRCgkRIhASJkCAREiRCgkRIhASJkCAREiRCIiRIhASJkCAREiRCIiRIhASJkCAREiFBIiRIhASJkCAREiFBIiRIhASJkAgJEiFBIiRIhASJkAgJEiFBIiRIhERIkAgJEiFBIiRIhERIkAgJEiFBIiRCgkRIkAgJEiFBIiRCgkRIkAgJEiEREiRCgkRIkAgJEiEREiRCgkRIkAgJEiEREiRCgkRIkAiJkCAREiRCgkRIkAiJkCARkv9FEt1wuTSHGi2vhi7eagvjyG/R4nPDhZHkdjHEt3pPr9Ru+vgZk0yROFbv2ZX31OqPksRgNFkNMdOD2SS9a82JRDOcnNosiQ2f9A9xXiQujSejqxMkFnyt5T7VGU9G3QkS34VTOiUSu912u9sdO/fb51+fT9P59IdzP53Pvz5nf+LZ/vRTIh2SjJ/eWe/ntN69BJd7CV4ZT0ar8EHlfD6o3BpOTgvL/VwWfL82mqzWvd1erbtjd4RIrsmPezJ4amU/u77uk+Zdq0CPH+/C3fW9Z1aV/4z3153P8fVCgkRIkAgJEiFBIiRCgkRIkAgJEiFBIiRCgkRIkAgJEiEREiRCgkRIkAgJEiEREiRCgkRIkAiJkCAREiRCgkRIkAiJkCAREiRCgkRIhASJkCAREiRCgkRIhASJkCAREiRCIiRIhASJkCAREiRCIiRIhASJkCAREiFBIiRIhASJkCAREiFBIiRIhASJkAgJEiFBIiRIhASJkAgJEiFBIiRIhERIkAgJEiFBIiRIhERIkAgJEiFBIiRIjACJkCAREiRCgkRI9I1kaQa1WsZoCLUaoxlCrVq4JtUuyZRtUmqTvOae1Lojh9roplS4IWM7aLwA+X5JA+6n7UAAAAAASUVORK5CYII=);--mailserver-overview-bg: #fafafa;--mailserver-domain-check-tips-bg: #f6f6f6;--mailserver-domain-check-box-bg: #edf7f2;--log-type-list-active-bg: #eef8f0;--log-type-list-hover-bg: #f5f7fa;--log-type-list-border: #e9e9e9;--security-brute-force-tips-bg: #f2dede;--domains-business-ssl-buy-bg: #f1f9f3;--domains-business-ssl-buy-bg-border: #ececec;--domains-business-ssl-count-disable: #efefef;--domains-lets-ssl-apply-bg: #f8f8f8;--domains-lets-ssl-apply-border: #dedede;--domains-lets-ssl-upload-border: #ccc;--domains-lets-ssl-upload-text: #e9f8ec;--setting-card-title-color: #666666;--setting-back-create-collapse-border: #f5f5f5;--setting-back-create-table-th-bg: var(--color-bg-2);--setting-back-create-collapse-title: #666;--setting-security-panel-port-tips: #f7f7f7;--setting-panel-bind-account-left-bg: linear-gradient(0deg, #d8efdb, #edf7ef);--setting-security-google-login-key-bg: #f8f8f8;--setting-security-google-login-key-text: #444;--setting-security-google-login-bind-title: #555;--setting-security-google-login-bind-text: #666;--install-box-bg: #fff5;--install-desc-bg: #fff;--install-box-text-color: #555;--file-choose-hover-color: #f5f7fa;--file-choose-hover-border-color: #e1e1e1;--file-card-hover-color: #f0f9f7;--terminal-head-bg: #f1f1f1;--terminal-head-item-close-hover: #f7f7f7;--terminal-head-item-hover: #dadada;--chart-tooltip-bg-color: #ffffff;--chart-tooltip-text-color: #333333;--chart-tooltip-header-bg-color: #f6f6f6;--waf-map-color: #e6e6e6;--waf-map-border-color: #ffffff;--waf-overview-text-color: #666666;--nps-box-hover-bg: var(--color-primary);--scrollbar-thumb-bg-color: #999;--scrollbar-track-bg-color: #ededed;--bt-error-modal-bg: #f5f5f5;--bt-error-modal-title-color: #333}:root[theme-mode=dark]{--color-primary: #20a53a;--color-primary-1: #e8f5e9;--color-success: #20a53a;--color-warning: #e67e22;--color-error: #f16575;--color-pro: #feaa04;--primary-button-color-hover: #267544;--primary-button-color-pressed: #20633a;--primary-button-color-suppl: #267544;--color-text-base: #c7c7c7;--color-text-1: #d8dce2;--color-text-2: #c7c7c7;--color-text-3: #919191;--color-text-4: #aaaaaa;--color-text-5: #e0e0e0;--color-text-desc: #777777;--color-bg-1: #18191c;--color-bg-2: #202020;--color-bg-3: #2e2e2e;--color-bg-4: #2e2e2e;--layout-bg: none;--color-border: #434343;--border-hover-focus-color: var(--color-text-base);--color-sider-text: #a1a1aa;--color-sider: #00000000;--color-sider-active: #353535;--color-sider-hover: #353535;--color-sider-hover-text: #ffffff;--color-sider-active-text: #ffffff;--router-menu-active-text: var(--color-text-base);--router-menu-active-bg: #353535;--color-table-td: var(--color-bg-2);--color-table-th: #232323;--color-table-border: var(--color-border);--color-table-td-hover: #353535;--color-modal: var(--color-bg-1);--modal-header-bg: var(--color-bg-2);--modal-header-bottom-border: var(--color-bg-3);--modal-action-bg: var(--modal-header-bg);--modal-action-top-border: var(--color-bg-3);---card-bg-color-1: #1a1a1a;---card-border-primary-color-1: #2a4d3a;---card-border-error-color-1: #ff646466;--color-tabs: #1e1e1e;--dialog-color-text: var(--color-text-base);--dialog-color-title-text: var(--color-text-base);--color-message: #48484e;--color-message-border: #48484e;--popover-color: var(--color-bg-1);--input-text-color: var(--color-text-base);--input-focus-bg-color: var(--color-bg-2);--input-disabled-color: var(--color-bg-1);--input-group-label-color: #333333;--input-disabled-border-color: 1px solid var(--color-border);--select-box-shadow: 0 0 8px 0 rgba(48, 53, 49, .4);--button-text-color: var(--color-text-base);--button-bg-hover: var(--color-bg-2);--button-border-hover: 1px solid var(--color-text-base);--button-type-text-primary: var(--color-text-base);--button-text-base-color: var(--color-text-base);--button-gray-color: #353535;--radio-text-color: var(--color-text-base);--radio-bg-color: var(--color-bg-2);--radio-active-dot-color: var(--color-text-base);--radio-border-dot-color: inset 0 0 0 1px var(--color-text-base);--check-color-checked: var(--color-text-base);--check-border-checked: 1px solid var(--color-text-base);--switch-active-color: var(--color-primary);--upload-dragger-color: var(--color-bg-2);--tooltip-color-text: var(--color-text-base);--alert-default-bg: var(--color-bg-1);--alert-warning-bg: #4a3c1a;--alert-error-bg: #4a1f1f;--alert-success-bg: var(--color-bg-2);--alert-success-text: var(--color-text-base);--alert-error-border: 1px solid var(--color-border);--alert-success-border: 1px solid var(--color-border);--tag-primary-bg-color: #464646;--tag-primary-text-color: var(--color-text-base);--collapse-color: #222222;--collapse-header-bg: var(--color-bg-2);--time-picker-separator-color: #434343;--tabs-panel-color-text: var(--color-text-base);--tabs-border-color: #555555;--tabs-bg: #353535;--tabs-active-bg: var(--color-bg-1);--tabs-active-text-color: var(--color-text-base);--bt-tabs-modal-bg: var(--color-bg-2);--bt-tabs-modal-active-bg: #353535;--bt-tabs-modal-cancel-btn-bg: #353535;--bt-tabs-modal-header-close: brightness(.7) contrast(1.1);--bt-tabs-modal-color: var(--bt-tabs-modal-bg);--bt-tabs-modal-left-active-bg: #353535;--bt-tabs-modal-left-shadow: 2px 0 3px #444444;--confirm-calc-bg: var(--color-bg-1);--progress-rail-color: #444444;--pagination-item-active-border: 1px solid var(--color-border);--pagination-item-active-color: var(--color-text-base);--ace-editor-tip-color: var(--color-text-base);--pre-color-text: var(--color-text-base);--pre-bg-color: var(--color-bg-3);--modal-boxshadow: 0 0 3px 1px rgba(255, 255, 255, .4);--bt-input-path-hover-bg: #353535;--flow-container-bg: var(--color-bg-2);--flow-config-title-color: var(--color-text-base);--home-ad-bg-color: linear-gradient(90deg, #333333 0%, rgba(63, 57, 49, .5) 100%);--home-ad-badge-bg-color: linear-gradient( 270deg, rgba(51, 51, 51, .2) 0%, rgba(236, 188, 152, .2) 100% );--home-overview-btn-color: #181818;--home-soft-bg-color: var(--color-bg-2);--home-soft-bg-hover-color: linear-gradient( 244.14deg, var(--color-bg-2) -1.23%, var(--color-bg-1) 72.39% );--home-soft-border-color: #333333;--home-soft-border-hover-color: var(--color-text-base);--home-monitor-tabs-active-color: var(--color-text-base);--home-risk-overview-circle-bg: var(--color-bg-1);--home-risk-security-list-hover-bg: #333333;--home-risk-security-list-spin-bg: var(--color-bg-3);--home-risk-security-list-collapse-item-color: #999;--home-risk-security-ignore-collapse-bg: var(--color-bg-1);--home-risk-file-info-title-color: var(--color-text-base);--home-risk-file-info-item-color: var(--color-text-base);--home-risk-server-list-bg: var(--color-bg-2);--home-risk-server-list-text: var(--color-text-base);--home-risk-server-list-hover: var(--color-bg-3);--home-update-bg-url: url(/static/vite/images/update-bg-dark.png);--home-update-title-color: var(--color-text-base);--home-update-content-bg: var(--color-bg-2);--home-update-content-text: #999999;--home-update-detail-bg: var(--color-bg-2);--home-update-detail-date: var(--color-text-base);--home-pro-icon-color: var(--color-text-base);--home-disk-color-warning: #d4941e;--home-disk-color-error: #ec7063;--home-update-latest-bg: var(--color-bg-1);--home-update-latest-border: 1px solid var(--color-border);--home-update-latest-text-color: #999999;--home-update-head-bg: var(--color-bg-1);--home-update-back-bg: none;--home-update-bt-link-color: var(--color-primary);--home-soft-install-bg-color: var(--color-bg-2);--home-soft-install-border-color: var(--color-text-base);--home-success-bg-color: var(--color-bg-1);--home-success-text-color: #333333;--site-config-ssl-label: var(--color-text-base);--site-config-business-tips: var(--color-bg-2);--site-ace-editor-border: var(--color-border);--site-confirm-calc-box-bg: #333333;--site-detele-content-item-hover-bg: #333333;--site-task-progress-border: var(--color-border);--site-multi-service-rollback-bg: var(--color-bg-2);--site-global-ip-white-ips-bg: var(--color-bg-2);--site-global-ip-white-ips-border: var(--color-bg-2);--data-base-del-input-bg: #353535;--docker-type-list-bg: var(--color-bg-1);--docker-type-list-text: var(--color-text-base);--docker-type-list-active-bg: var(--color-bg-3);--docker-type-list-active-text: var(--color-text-base);--docker-plugin-list-tag-gb: var(--color-bg-1);--docker-plugin-list-tag-tips-bg: var(--color-bg-1);--docker-plugin-list-border: var(--color-border);--app-soft-sort-bg: var(--color-bg-1);--app-soft-sort-active-bg: var(--color-bg-3);--app-soft-sort-hover-color: var(--color-text-base);--app-soft-used-hover: var(--color-bg-3);--app-soft-pro-tips-text: var(--color-text-base);--app-soft-pro-tips-bg: var(--color-bg-1);--app-third-security-tip-bg: var(--color-bg-1);--app-plugin-dns-bg: var(--color-bg-3);--app-third-install-tip-bg: var(--color-bg-3);--pay-color: #feaa04;--pay-color-bg: #292929;--pay-color-border: #ecb665;--coupon-bg: url(/static/vite/images/bg_dark.png);--mailserver-overview-bg: var(--color-bg-3);--mailserver-domain-check-tips-bg: var(--color-bg-2);--mailserver-domain-check-box-bg: var(--color-bg-2);--log-type-list-active-bg: var(--color-bg-3);--log-type-list-hover-bg: var(--color-bg-3);--log-type-list-border: var(--color-border);--security-brute-force-tips-bg: var(--color-bg-2);--domains-business-ssl-buy-bg: var(--color-bg-2);--domains-business-ssl-buy-bg-border: #929292;--domains-business-ssl-count-disable: var(--color-bg-3);--domains-lets-ssl-apply-bg: var(--color-bg-2);--domains-lets-ssl-apply-border: var(--color-bg-3);--domains-lets-ssl-upload-border: var(--color-border);--domains-lets-ssl-upload-text: var(--color-bg-2);--setting-card-title-color: var(--color-text-base);--setting-back-create-collapse-border: var(--color-border);--setting-back-create-table-th-bg: #232323;--setting-back-create-collapse-title: var(--color-text-base);--setting-security-panel-port-tips: var(--color-bg-2);--setting-panel-bind-account-left-bg: linear-gradient(0deg, #404440, #202020);--setting-security-google-login-key-bg: var(--color-bg-2);--setting-security-google-login-key-text: var(--color-text-base);--setting-security-google-login-bind-title: var(--color-text-base);--setting-security-google-login-bind-text: var(--color-text-base);--install-box-bg: rgba(114, 114, 114, .333);--install-desc-bg: var(--color-bg-1);--install-box-text-color: var(--color-text-base);--file-choose-hover-color: #333;--file-choose-hover-border-color: #333;--file-card-hover-color: #333;--terminal-head-bg: #666666;--terminal-head-item-close-hover: #666666;--terminal-head-item-hover: #555555;--chart-tooltip-bg-color: #181818;--chart-tooltip-text-color: #c5c5c5;--chart-tooltip-header-bg-color: #121212;--waf-map-color: #353535;--waf-map-border-color: #aaa;--waf-overview-text-color: var(--color-text-3);--nps-box-hover-bg: #353535;--scrollbar-thumb-bg-color: rgba(255, 255, 255, .2);--scrollbar-track-bg-color: rgba(255, 255, 255, 0);--bt-error-modal-bg: var(--color-bg-2);--bt-error-modal-title-color: var(--color-text-base)}.modal-footer-btns{display:flex;align-items:center;flex-direction:row;justify-content:end;gap:10px;padding:10px}.single-line-ellipsis{white-space:nowrap;overflow:hidden;text-overflow:ellipsis}*,*:before{box-sizing:border-box}html,body,#app{width:100%;height:100%;margin:0;padding:0}body{line-height:normal;font-size:12px;font-family:PingFang SC,Inter,Microsoft YaHei,Segoe UI,sans-serif;font-weight:400;overflow:hidden}input[type=password]::-ms-reveal{display:none}input::-webkit-outer-spin-button,input::-webkit-inner-spin-button{-webkit-appearance:none;appearance:none}input[type=number]{-webkit-appearance:textfield;appearance:textfield;-moz-appearance:textfield}a{text-decoration:none;cursor:pointer}p,ul,li,pre{margin:0;padding:0}body,h1,h2,h3,h4,h5,h6,p,ul,ol,label,form{margin:0}ul,li{list-style:none}input{outline:none}code,kbd,pre,samp{font-family:Menlo,Monaco,Consolas,Courier New,monospace}.h1,.h2,.h3,.h4,.h5,.h6,h1,h2,h3,h4,h5,h6{font-family:inherit;font-weight:500;line-height:1.1;color:inherit}.h3,h3{font-size:24px}h4,h5,h6{font-size:1em}ul li::marker{display:block;height:100%}mark{padding:0;background:#ff0;color:inherit}::-webkit-scrollbar{width:8px;height:8px}::-webkit-scrollbar-thumb{border-radius:8px;box-shadow:inset 0 0 5px rgba(0,0,0,.2);background:var(--scrollbar-thumb-bg-color)}::-webkit-scrollbar-track{box-shadow:inset 0 0 5px rgba(0,0,0,.2);border-radius:8px;background:var(--scrollbar-track-bg-color)}iframe::-webkit-scrollbar{width:8px;height:8px}iframe::-webkit-scrollbar-thumb{border-radius:8px;box-shadow:inset 0 0 5px rgba(0,0,0,.2);background:var(--scrollbar-thumb-bg-color)}iframe::-webkit-scrollbar-track{box-shadow:inset 0 0 5px rgba(0,0,0,.2);border-radius:8px;background:var(--scrollbar-track-bg-color)}.leader-line{z-index:9999}@font-face{font-family:Glyphicons Halflings;src:url(/static/vite/fonts/glyphicons-halflings-regular.eot);src:url(/static/vite/fonts/glyphicons-halflings-regular.eot?#iefix) format("embedded-opentype"),url(/static/vite/fonts/glyphicons-halflings-regular.woff2) format("woff2"),url(/static/vite/fonts/glyphicons-halflings-regular.woff) format("woff"),url(/static/vite/fonts/glyphicons-halflings-regular.ttf) format("truetype"),url(/static/vite/images/glyphicons-halflings-regular.svg#glyphicons_halflingsregular) format("svg")}.glyphicon{position:relative;top:1px;display:inline-block;font-family:Glyphicons Halflings;font-style:normal;font-weight:400;line-height:1;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.glyphicon-vip:before{content:""}.glyphicon-ok:before{content:""}.n-layout .n-layout-scroll-container{overflow-x:auto}.n-dialog .n-dialog__title{position:relative}.n-form-item .n-form-item-label,.n-button{line-height:normal}.n-divider:not(.n-divider--vertical){margin:0}.n-ellipsis p{display:inline}.n-card{background-color:rgba(var(--n-color),var(--main-content-opacity));box-shadow:0 0 8px rgba(0,0,0,.06)}.n-card.n-card--bordered{border:none}.n-card .n-card-header{display:flex;align-items:center;min-height:48px;padding:0 20px;border-bottom:1px solid var(--color-border)}.n-card .n-card__content{padding:0}.n-alert .n-alert__icon{top:50%;transform:translateY(-50%)}.n-alert .n-alert-body{line-height:16px}.n-radio-group .n-radio{margin-right:16px}.n-radio-group .n-radio:last-of-type{margin-right:0}.n-radio-group .n-radio-button{font-weight:inherit}.n-data-table{font-family:PingFang SC,Microsoft YaHei,Segoe UI,sans-serif}.n-data-table .n-data-table-th{height:34px}.n-data-table .n-data-table-td{height:36px}.n-pagination .n-pagination-prefix{flex:1}.n-tabs.n-tabs--left>.n-tab-pane{padding:var(--n-pane-padding-top) var(--n-pane-padding-right) var(--n-pane-padding-bottom) var(--n-pane-padding-left)}.n-tabs.n-tabs--top>.n-tab-pane{padding:var(--n-pane-padding-top) var(--n-pane-padding-right) var(--n-pane-padding-bottom) var(--n-pane-padding-left)}.n-tabs.n-tabs--top .n-tabs-nav-scroll-content{flex-direction:row}.n-select .n-base-selection--multiple .n-tag{--n-height: 24px;--n-close-size: 14px;font-size:12px}.n-badge.n-badge--dot .n-badge-sup{width:6px;height:6px;min-width:6px;bottom:calc(100% - 3px)}.n-spin-container .n-spin-content{height:100%}.n-base-select-option .n-base-select-option__content{width:100%}.n-data-table .n-data-table-th.n-data-table-th--sortable.sort-center .n-data-table-th__title-wrapper{justify-content:center}.n-data-table .n-data-table-th.n-data-table-th--sortable .n-data-table-th__title-wrapper .n-data-table-th__title{flex:none;min-width:auto}:root{--el-font-size-base: 12px}.el-select .el-select__wrapper{gap:0;min-height:30px;font-size:12px;line-height:22px}.el-select .el-select__wrapper .el-select__selection{margin-right:4px}div.el-alert{--el-alert-padding: 12px;--el-alert-icon-large-size: 20px;--el-alert-description-font-size: 13px;border:1px solid #eee}div.el-alert .el-alert__icon.is-big{margin-right:8px}div.el-alert .el-alert__content{flex:1}.help-info-text{margin-top:15px}.help-info-text li{line-height:24px}#nprogress .bar{background-color:#20a53a}#nprogress .spinner-icon{border-top-color:#20a53a;border-left-color:#20a53a}.bt-message pre{display:block;padding:9.5px;margin:10px 0 0;font-size:13px;line-height:1.42857143;color:#333;word-break:break-all;word-wrap:break-word;background-color:#f5f5f5;border:1px solid #ccc;border-radius:4px;overflow:auto}.bt-error-modal pre{display:block;padding:9.5px;margin:0 0 10px;font-size:13px;line-height:1.42857143;color:var(--bt-error-modal-title-color);word-break:break-all;word-wrap:break-word;background-color:var(--bt-error-modal-bg);border:1px solid #ccc;border-radius:4px;overflow:auto}.bt-tips-ul li{list-style:disc;margin-left:1.5em}.bt-ask-ico{display:inline-flex;align-items:center;justify-content:center;width:16px;height:16px;border:1px solid #fb7d00;border-radius:8px;color:#fb7d00;font-family:arial;font-size:11px;font-style:normal;text-align:center;cursor:help}.bt-ask-ico:hover{background-color:#fb7d00;color:#fff}button.reset{display:inline-flex;background:none;border:none;padding:0;cursor:pointer;outline:inherit}.bt-link{color:#20a53a;cursor:pointer}.bt-link:hover{color:#1d9534}.bt-link.error{color:#ef0808}.bt-link.error:hover{color:#c81e1e}.btn-xs{padding:4px 8px;height:auto}.code-toolbar{height:100%}.pre-code[class*=language-]{border:none;margin:0;font-size:14px}.echarts-tooltip{display:flex;flex-direction:column;background-color:var(--chart-tooltip-bg-color);color:var(--chart-tooltip-text-color);border-radius:10px}.echarts-tooltip .formatter-header{display:flex;align-items:center;height:40px;padding:0 16px;background-color:var(--chart-tooltip-header-bg-color);border-top-left-radius:4px;border-top-right-radius:4px}.echarts-tooltip .formatter-header img{margin-right:6px;height:24px;width:24px}.echarts-tooltip .formatter-body{padding:16px 20px}.echarts-tooltip .formatter-body .select-data{display:flex;align-items:center;margin-bottom:8px;font-size:14px}.echarts-tooltip .process-top5{border:1px solid var(--color-border);border-radius:8px}.echarts-tooltip .process-top5 table{width:100%;table-layout:fixed;border-collapse:collapse;font-size:12px;border-radius:8px;overflow:hidden}.echarts-tooltip .process-top5 table thead{background-color:var(--chart-tooltip-header-bg-color)}.echarts-tooltip .process-top5 table thead th{height:24px;padding:5px 10px;border:0;border-bottom:1px solid var(--color-border);line-height:24px;text-align:left;color:var(--color-text-4)}.echarts-tooltip .process-top5 table tbody tr{height:22px;line-height:22px;text-align:left}.echarts-tooltip .process-top5 table tbody tr:last-child{border-bottom:none}.echarts-tooltip .process-top5 table tbody tr td{padding:4px 10px;border:0;white-space:normal}::view-transition-old(root),::view-transition-new(root){animation:none;mix-blend-mode:normal}::view-transition-old(root){z-index:1}::view-transition-new(root){z-index:9999999}.home-tooltip{min-width:220px;padding:12px;background-color:var(--chart-tooltip-bg-color);color:var(--chart-tooltip-text-color);border-radius:6px}.home-tooltip .time{display:flex;align-items:center;margin-bottom:10px}.home-tooltip .time .icon{width:20px;height:20px;margin-right:6px;background-image:url("data:image/svg+xml,%3csvg%20width='20'%20height='20'%20viewBox='0%200%2020%2020'%20fill='none'%20xmlns='http://www.w3.org/2000/svg'%3e%3cpath%20d='M2.99963%207.99994H15.9996'%20stroke='white'%20stroke-width='1.5'%20stroke-linecap='square'%20stroke-linejoin='round'/%3e%3cpath%20d='M12.9908%202.98676V3.98676'%20stroke='white'%20stroke-width='1.5'%20stroke-linecap='square'%20stroke-linejoin='round'/%3e%3cpath%20d='M5.99084%202.98676V3.98676'%20stroke='white'%20stroke-width='1.5'%20stroke-linecap='square'%20stroke-linejoin='round'/%3e%3crect%20x='2.75'%20y='4.75006'%20width='13.5'%20height='11.5'%20stroke='white'%20stroke-width='1.5'/%3e%3c/svg%3e")}.home-tooltip .home-tooltip-content{display:flex;flex-direction:column;gap:8px}.home-tooltip .home-tooltip-content .item{display:flex;align-items:center;white-space:pre}.home-tooltip .home-tooltip-content .item .icon{display:flex;justify-content:center;width:20px;margin-right:6px}.home-tooltip .home-tooltip-content .item .icon .circular{width:6px;height:6px;border-radius:50%}.home-tooltip .home-tooltip-content .item .text{line-height:20px;color:rgba(255,255,255,.8)} +.login-tips-box[data-v-01864afc]{margin-bottom:16px;display:flex;align-items:center;justify-content:center;gap:10px;border-radius:10px;padding:16px;background-color:var(--color-bg-2)} diff --git a/BTPanel/static/vite/css/index121.css b/BTPanel/static/vite/css/index121.css new file mode 100644 index 00000000..68a2e4e8 --- /dev/null +++ b/BTPanel/static/vite/css/index121.css @@ -0,0 +1 @@ +.login-tips-box[data-v-dc67c593]{margin-bottom:16px;display:flex;align-items:center;justify-content:center;gap:10px;border-radius:10px;padding:16px;background-color:var(--color-bg-2)} diff --git a/BTPanel/static/vite/css/index122.css b/BTPanel/static/vite/css/index122.css new file mode 100644 index 00000000..e431c153 --- /dev/null +++ b/BTPanel/static/vite/css/index122.css @@ -0,0 +1 @@ +.n-alert[data-v-4bc7ae38]{--n-font-size: 12px}.cert-info[data-v-4bc7ae38]{display:flex;align-items:center;height:24px}.cert-info .cert-label[data-v-4bc7ae38]{color:var(--site-config-ssl-label);font-weight:700}.cert-info .cert-value[data-v-4bc7ae38]{flex:1;width:0;margin-left:4px}.business-top-tips[data-v-12873ea8]{background:var(--site-config-business-tips)}.n-alert[data-v-50ee5bfe]{--n-font-size: 12px}.cert-info[data-v-50ee5bfe]{display:flex;align-items:center;height:24px}.cert-info .cert-label[data-v-50ee5bfe]{color:var(--site-config-ssl-label);font-weight:700}.cert-info .cert-value[data-v-50ee5bfe]{flex:1;width:0;margin-left:4px} diff --git a/BTPanel/static/vite/css/index123.css b/BTPanel/static/vite/css/index123.css new file mode 100644 index 00000000..ffc0f917 --- /dev/null +++ b/BTPanel/static/vite/css/index123.css @@ -0,0 +1 @@ +@charset "UTF-8";#nprogress{pointer-events:none}#nprogress .bar{background:#29d;position:fixed;z-index:1031;top:0;left:0;width:100%;height:2px}#nprogress .peg{display:block;position:absolute;right:0;width:100px;height:100%;box-shadow:0 0 10px #29d,0 0 5px #29d;opacity:1;-webkit-transform:rotate(3deg) translate(0px,-4px);-ms-transform:rotate(3deg) translate(0px,-4px);transform:rotate(3deg) translateY(-4px)}#nprogress .spinner{display:block;position:fixed;z-index:1031;top:15px;right:15px}#nprogress .spinner-icon{width:18px;height:18px;box-sizing:border-box;border:solid 2px transparent;border-top-color:#29d;border-left-color:#29d;border-radius:50%;-webkit-animation:nprogress-spinner .4s linear infinite;animation:nprogress-spinner .4s linear infinite}.nprogress-custom-parent{overflow:hidden;position:relative}.nprogress-custom-parent #nprogress .spinner,.nprogress-custom-parent #nprogress .bar{position:absolute}@-webkit-keyframes nprogress-spinner{0%{-webkit-transform:rotate(0deg)}to{-webkit-transform:rotate(360deg)}}@keyframes nprogress-spinner{0%{transform:rotate(0)}to{transform:rotate(360deg)}}pre code.hljs{display:block;overflow-x:auto;padding:1em}code.hljs{padding:3px 5px}.hljs{color:#abb2bf;background:#282c34}.hljs-comment,.hljs-quote{color:#5c6370;font-style:italic}.hljs-doctag,.hljs-keyword,.hljs-formula{color:#c678dd}.hljs-section,.hljs-name,.hljs-selector-tag,.hljs-deletion,.hljs-subst{color:#e06c75}.hljs-literal{color:#56b6c2}.hljs-string,.hljs-regexp,.hljs-addition,.hljs-attribute,.hljs-meta .hljs-string{color:#98c379}.hljs-attr,.hljs-variable,.hljs-template-variable,.hljs-type,.hljs-selector-class,.hljs-selector-attr,.hljs-selector-pseudo,.hljs-number{color:#d19a66}.hljs-symbol,.hljs-bullet,.hljs-link,.hljs-meta,.hljs-selector-id,.hljs-title{color:#61aeee}.hljs-built_in,.hljs-title.class_,.hljs-class .hljs-title{color:#e6c07b}.hljs-emphasis{font-style:italic}.hljs-strong{font-weight:700}.hljs-link{text-decoration:underline}.i-ant-design\:clear-outlined{--un-icon:url("data:image/svg+xml;utf8,%3Csvg viewBox='0 0 1024 1024' display='inline-flex' width='1em' height='1em' xmlns='http://www.w3.org/2000/svg' %3E%3Cpath fill='currentColor' d='m899.1 869.6l-53-305.6H864c14.4 0 26-11.6 26-26V346c0-14.4-11.6-26-26-26H618V138c0-14.4-11.6-26-26-26H432c-14.4 0-26 11.6-26 26v182H160c-14.4 0-26 11.6-26 26v192c0 14.4 11.6 26 26 26h17.9l-53 305.6c-.3 1.5-.4 3-.4 4.4c0 14.4 11.6 26 26 26h723c1.5 0 3-.1 4.4-.4c14.2-2.4 23.7-15.9 21.2-30M204 390h272V182h72v208h272v104H204zm468 440V674c0-4.4-3.6-8-8-8h-48c-4.4 0-8 3.6-8 8v156H416V674c0-4.4-3.6-8-8-8h-48c-4.4 0-8 3.6-8 8v156H202.8l45.1-260H776l45.1 260z'/%3E%3C/svg%3E");-webkit-mask:var(--un-icon) no-repeat;mask:var(--un-icon) no-repeat;-webkit-mask-size:100% 100%;mask-size:100% 100%;background-color:currentColor;color:inherit;display:inline-flex;width:1em;height:1em}.i-ant-design\:security-scan-outlined{--un-icon:url("data:image/svg+xml;utf8,%3Csvg viewBox='0 0 1024 1024' display='inline-flex' width='1em' height='1em' xmlns='http://www.w3.org/2000/svg' %3E%3Cpath fill='currentColor' d='M866.9 169.9L527.1 54.1C523 52.7 517.5 52 512 52s-11 .7-15.1 2.1L157.1 169.9c-8.3 2.8-15.1 12.4-15.1 21.2v482.4c0 8.8 5.7 20.4 12.6 25.9L499.3 968c3.5 2.7 8 4.1 12.6 4.1s9.2-1.4 12.6-4.1l344.7-268.6c6.9-5.4 12.6-17 12.6-25.9V191.1c.2-8.8-6.6-18.3-14.9-21.2M810 654.3L512 886.5L214 654.3V226.7l298-101.6l298 101.6zM402.9 528.8l-77.5 77.5a8.03 8.03 0 0 0 0 11.3l34 34c3.1 3.1 8.2 3.1 11.3 0l77.5-77.5c55.7 35.1 130.1 28.4 178.6-20.1c56.3-56.3 56.3-147.5 0-203.8s-147.5-56.3-203.8 0c-48.5 48.5-55.2 123-20.1 178.6m65.4-133.3c31.3-31.3 82-31.3 113.2 0c31.3 31.3 31.3 82 0 113.2c-31.3 31.3-82 31.3-113.2 0s-31.3-81.9 0-113.2'/%3E%3C/svg%3E");-webkit-mask:var(--un-icon) no-repeat;mask:var(--un-icon) no-repeat;-webkit-mask-size:100% 100%;mask-size:100% 100%;background-color:currentColor;color:inherit;display:inline-flex;width:1em;height:1em}.i-ant-design\:skin-outlined{--un-icon:url("data:image/svg+xml;utf8,%3Csvg viewBox='0 0 1024 1024' display='inline-flex' width='1em' height='1em' xmlns='http://www.w3.org/2000/svg' %3E%3Cpath fill='currentColor' d='M870 126H663.8c-17.4 0-32.9 11.9-37 29.3C614.3 208.1 567 246 512 246s-102.3-37.9-114.8-90.7a37.93 37.93 0 0 0-37-29.3H154a44 44 0 0 0-44 44v252a44 44 0 0 0 44 44h75v388a44 44 0 0 0 44 44h478a44 44 0 0 0 44-44V466h75a44 44 0 0 0 44-44V170a44 44 0 0 0-44-44m-28 268H723v432H301V394H182V198h153.3c28.2 71.2 97.5 120 176.7 120s148.5-48.8 176.7-120H842z'/%3E%3C/svg%3E");-webkit-mask:var(--un-icon) no-repeat;mask:var(--un-icon) no-repeat;-webkit-mask-size:100% 100%;mask-size:100% 100%;background-color:currentColor;color:inherit;display:inline-flex;width:1em;height:1em}.i-carbon-calendar{--un-icon:url("data:image/svg+xml;utf8,%3Csvg viewBox='0 0 32 32' display='inline-flex' width='1em' height='1em' xmlns='http://www.w3.org/2000/svg' %3E%3Cpath fill='currentColor' d='M26 4h-4V2h-2v2h-8V2h-2v2H6c-1.1 0-2 .9-2 2v20c0 1.1.9 2 2 2h20c1.1 0 2-.9 2-2V6c0-1.1-.9-2-2-2m0 22H6V12h20zm0-16H6V6h4v2h2V6h8v2h2V6h4z'/%3E%3C/svg%3E");-webkit-mask:var(--un-icon) no-repeat;mask:var(--un-icon) no-repeat;-webkit-mask-size:100% 100%;mask-size:100% 100%;background-color:currentColor;color:inherit;display:inline-flex;width:1em;height:1em}.i-carbon-search{--un-icon:url("data:image/svg+xml;utf8,%3Csvg viewBox='0 0 32 32' display='inline-flex' width='1em' height='1em' xmlns='http://www.w3.org/2000/svg' %3E%3Cpath fill='currentColor' d='m29 27.586l-7.552-7.552a11.018 11.018 0 1 0-1.414 1.414L27.586 29ZM4 13a9 9 0 1 1 9 9a9.01 9.01 0 0 1-9-9'/%3E%3C/svg%3E");-webkit-mask:var(--un-icon) no-repeat;mask:var(--un-icon) no-repeat;-webkit-mask-size:100% 100%;mask-size:100% 100%;background-color:currentColor;color:inherit;display:inline-flex;width:1em;height:1em}.i-carbon\:certificate{--un-icon:url("data:image/svg+xml;utf8,%3Csvg viewBox='0 0 32 32' display='inline-flex' width='1em' height='1em' xmlns='http://www.w3.org/2000/svg' %3E%3Cpath fill='currentColor' d='m24 17l1.912 3.703l4.088.594L27 24l.771 4L24 25.75L20.229 28L21 24l-3-2.703l4.2-.594zM6 16h6v2H6zm0-4h10v2H6zm0-4h10v2H6z'/%3E%3Cpath fill='currentColor' d='M16 26H4V6h24v10h2V6a2 2 0 0 0-2-2H4a2 2 0 0 0-2 2v20a2 2 0 0 0 2 2h12Z'/%3E%3C/svg%3E");-webkit-mask:var(--un-icon) no-repeat;mask:var(--un-icon) no-repeat;-webkit-mask-size:100% 100%;mask-size:100% 100%;background-color:currentColor;color:inherit;display:inline-flex;width:1em;height:1em}.i-carbon\:data-base{--un-icon:url("data:image/svg+xml;utf8,%3Csvg viewBox='0 0 32 32' display='inline-flex' width='1em' height='1em' xmlns='http://www.w3.org/2000/svg' %3E%3Cpath fill='currentColor' d='M24 3H8a2 2 0 0 0-2 2v22a2 2 0 0 0 2 2h16a2 2 0 0 0 2-2V5a2 2 0 0 0-2-2m0 2v6H8V5ZM8 19v-6h16v6Zm0 8v-6h16v6Z'/%3E%3Ccircle cx='11' cy='8' r='1' fill='currentColor'/%3E%3Ccircle cx='11' cy='16' r='1' fill='currentColor'/%3E%3Ccircle cx='11' cy='24' r='1' fill='currentColor'/%3E%3C/svg%3E");-webkit-mask:var(--un-icon) no-repeat;mask:var(--un-icon) no-repeat;-webkit-mask-size:100% 100%;mask-size:100% 100%;background-color:currentColor;color:inherit;display:inline-flex;width:1em;height:1em}.i-carbon\:ibm-cloud-direct-link-1-dedicated{--un-icon:url("data:image/svg+xml;utf8,%3Csvg viewBox='0 0 32 32' display='inline-flex' width='1em' height='1em' xmlns='http://www.w3.org/2000/svg' %3E%3Cpath fill='currentColor' d='M27 29H13c-1.1 0-2-.9-2-2v-4h2v4h14V13h-4v-2h4c1.1 0 2 .9 2 2v14c0 1.1-.9 2-2 2'/%3E%3Cpath fill='currentColor' d='M19 21h-6c-1.1 0-2-.9-2-2v-6c0-1.1.9-2 2-2h6c1.1 0 2 .9 2 2v6c0 1.1-.9 2-2 2m-6-8v6h6v-6z'/%3E%3Cpath fill='currentColor' d='M5 3h14c1.1 0 2 .9 2 2v4h-2V5H5v14h4v2H5c-1.1 0-2-.9-2-2V5c0-1.1.9-2 2-2'/%3E%3C/svg%3E");-webkit-mask:var(--un-icon) no-repeat;mask:var(--un-icon) no-repeat;-webkit-mask-size:100% 100%;mask-size:100% 100%;background-color:currentColor;color:inherit;display:inline-flex;width:1em;height:1em}.i-carbon\:locked{--un-icon:url("data:image/svg+xml;utf8,%3Csvg viewBox='0 0 32 32' display='inline-flex' width='1em' height='1em' xmlns='http://www.w3.org/2000/svg' %3E%3Cpath fill='currentColor' d='M24 14h-2V8a6 6 0 0 0-12 0v6H8a2 2 0 0 0-2 2v12a2 2 0 0 0 2 2h16a2 2 0 0 0 2-2V16a2 2 0 0 0-2-2M12 8a4 4 0 0 1 8 0v6h-8Zm12 20H8V16h16Z'/%3E%3C/svg%3E");-webkit-mask:var(--un-icon) no-repeat;mask:var(--un-icon) no-repeat;-webkit-mask-size:100% 100%;mask-size:100% 100%;background-color:currentColor;color:inherit;display:inline-flex;width:1em;height:1em}.i-carbon\:meter{--un-icon:url("data:image/svg+xml;utf8,%3Csvg viewBox='0 0 32 32' display='inline-flex' width='1em' height='1em' xmlns='http://www.w3.org/2000/svg' %3E%3Cpath fill='currentColor' d='M26 16a9.9 9.9 0 0 0-1.14-4.618l-1.495 1.496A7.95 7.95 0 0 1 24 16zm-2.586-6L22 8.586L17.285 13.3A3 3 0 0 0 16 13a3 3 0 1 0 3 3a3 3 0 0 0-.3-1.285zM16 17a1 1 0 1 1 1-1a1 1 0 0 1-1 1m0-9a8 8 0 0 1 3.122.635l1.496-1.496A9.986 9.986 0 0 0 6 16h2a8.01 8.01 0 0 1 8-8'/%3E%3Cpath fill='currentColor' d='M16 30a14 14 0 1 1 14-14a14.016 14.016 0 0 1-14 14m0-26a12 12 0 1 0 12 12A12.014 12.014 0 0 0 16 4'/%3E%3C/svg%3E");-webkit-mask:var(--un-icon) no-repeat;mask:var(--un-icon) no-repeat;-webkit-mask-size:100% 100%;mask-size:100% 100%;background-color:currentColor;color:inherit;display:inline-flex;width:1em;height:1em}.i-carbon\:reminder{--un-icon:url("data:image/svg+xml;utf8,%3Csvg viewBox='0 0 32 32' display='inline-flex' width='1em' height='1em' xmlns='http://www.w3.org/2000/svg' %3E%3Cpath fill='currentColor' d='m30 23.382l-2-1V20a6.005 6.005 0 0 0-5-5.91V12h-2v2.09A6.005 6.005 0 0 0 16 20v2.382l-2 1V28h6v2h4v-2h6ZM28 26H16v-1.382l2-1V20a4 4 0 0 1 8 0v3.618l2 1Z'/%3E%3Cpath fill='currentColor' d='M28 6a2 2 0 0 0-2-2h-4V2h-2v2h-8V2h-2v2H6a2 2 0 0 0-2 2v20a2 2 0 0 0 2 2h4v-2H6V6h4v2h2V6h8v2h2V6h4v6h2Z'/%3E%3C/svg%3E");-webkit-mask:var(--un-icon) no-repeat;mask:var(--un-icon) no-repeat;-webkit-mask-size:100% 100%;mask-size:100% 100%;background-color:currentColor;color:inherit;display:inline-flex;width:1em;height:1em}.i-carbon\:security{--un-icon:url("data:image/svg+xml;utf8,%3Csvg viewBox='0 0 32 32' display='inline-flex' width='1em' height='1em' xmlns='http://www.w3.org/2000/svg' %3E%3Cpath fill='currentColor' d='M14 16.59L11.41 14L10 15.41l4 4l8-8L20.59 10z'/%3E%3Cpath fill='currentColor' d='m16 30l-6.176-3.293A10.98 10.98 0 0 1 4 17V4a2 2 0 0 1 2-2h20a2 2 0 0 1 2 2v13a10.98 10.98 0 0 1-5.824 9.707ZM6 4v13a8.99 8.99 0 0 0 4.766 7.942L16 27.733l5.234-2.79A8.99 8.99 0 0 0 26 17V4Z'/%3E%3C/svg%3E");-webkit-mask:var(--un-icon) no-repeat;mask:var(--un-icon) no-repeat;-webkit-mask-size:100% 100%;mask-size:100% 100%;background-color:currentColor;color:inherit;display:inline-flex;width:1em;height:1em}.i-carbon\:terminal{--un-icon:url("data:image/svg+xml;utf8,%3Csvg viewBox='0 0 32 32' display='inline-flex' width='1em' height='1em' xmlns='http://www.w3.org/2000/svg' %3E%3Cpath fill='currentColor' d='M26 4.01H6a2 2 0 0 0-2 2v20a2 2 0 0 0 2 2h20a2 2 0 0 0 2-2v-20a2 2 0 0 0-2-2m0 2v4H6v-4Zm-20 20v-14h20v14Z'/%3E%3Cpath fill='currentColor' d='m10.76 16.18l2.82 2.83l-2.82 2.83l1.41 1.41l4.24-4.24l-4.24-4.24z'/%3E%3C/svg%3E");-webkit-mask:var(--un-icon) no-repeat;mask:var(--un-icon) no-repeat;-webkit-mask-size:100% 100%;mask-size:100% 100%;background-color:currentColor;color:inherit;display:inline-flex;width:1em;height:1em}.i-carbon\:time{--un-icon:url("data:image/svg+xml;utf8,%3Csvg viewBox='0 0 32 32' display='inline-flex' width='1em' height='1em' xmlns='http://www.w3.org/2000/svg' %3E%3Cpath fill='currentColor' d='M16 30a14 14 0 1 1 14-14a14 14 0 0 1-14 14m0-26a12 12 0 1 0 12 12A12 12 0 0 0 16 4'/%3E%3Cpath fill='currentColor' d='M20.59 22L15 16.41V7h2v8.58l5 5.01z'/%3E%3C/svg%3E");-webkit-mask:var(--un-icon) no-repeat;mask:var(--un-icon) no-repeat;-webkit-mask-size:100% 100%;mask-size:100% 100%;background-color:currentColor;color:inherit;display:inline-flex;width:1em;height:1em}.i-carbon\:warning{--un-icon:url("data:image/svg+xml;utf8,%3Csvg viewBox='0 0 32 32' display='inline-flex' width='1em' height='1em' xmlns='http://www.w3.org/2000/svg' %3E%3Cpath fill='currentColor' d='M16 2a14 14 0 1 0 14 14A14 14 0 0 0 16 2m0 26a12 12 0 1 1 12-12a12 12 0 0 1-12 12'/%3E%3Cpath fill='currentColor' d='M15 8h2v11h-2zm1 14a1.5 1.5 0 1 0 1.5 1.5A1.5 1.5 0 0 0 16 22'/%3E%3C/svg%3E");-webkit-mask:var(--un-icon) no-repeat;mask:var(--un-icon) no-repeat;-webkit-mask-size:100% 100%;mask-size:100% 100%;background-color:currentColor;color:inherit;display:inline-flex;width:1em;height:1em}.i-common\:feedback{background:url("data:image/svg+xml;utf8,%3Csvg display='inline-flex' width='1em' height='1em' viewBox='0 0 20 20' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M16.6665 10V17.5H3.33313V2.5L10.8331 2.49996' stroke='%233A424D' stroke-width='1.5' stroke-linecap='square'/%3E%3Cpath d='M16.6669 3.33332L10.0002 9.99999' stroke='%233BAF52' stroke-width='1.5'/%3E%3Cpath d='M6.66687 13.3333L13.3335 13.3333' stroke='%233A424D' stroke-width='1.5'/%3E%3C/svg%3E") no-repeat;background-size:100% 100%;background-color:transparent;display:inline-flex;width:1em;height:1em}.i-common\:feedback-dark{background:url("data:image/svg+xml;utf8,%3Csvg display='inline-flex' width='1em' height='1em' viewBox='0 0 20 20' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M16.6665 10.0001V17.5H3.33313V2.50004L10.8331 2.5' stroke='%23C7C7C7' stroke-width='1.5' stroke-linecap='square'/%3E%3Cpath d='M16.6669 3.33337L10.0002 10' stroke='%2320a53a' stroke-width='1.5'/%3E%3Cpath d='M6.66687 13.3334L13.3335 13.3334' stroke='%23C7C7C7' stroke-width='1.5'/%3E%3C/svg%3E") no-repeat;background-size:100% 100%;background-color:transparent;display:inline-flex;width:1em;height:1em}.i-common\:fire{background:url("data:image/svg+xml;utf8,%3Csvg display='inline-flex' width='1em' height='1em' viewBox='0 0 18 18' xmlns='http://www.w3.org/2000/svg' xmlns:xlink='http://www.w3.org/1999/xlink' fill='none' customFrame='%23000000'%3E%3Crect id='控件/红点/火' x='0.000000' y='0.000000' fill='rgb(255,255,255)' fill-opacity='0'/%3E%3Cg id='Group 23'%3E%3Ccircle id='Oval 3' cx='9' cy='9' r='9' fill='rgb(255,143,0)'/%3E%3Ccircle id='Oval 3' cx='9' cy='9' r='9' stroke='rgb(151,151,151)' stroke-opacity='0' stroke-width='0'/%3E%3Cpath id='形状' d='M8.7772 2C8.7772 2 6.92746 6.03452 5.11464 8.08207C2.74809 10.7552 4.45539 14.0743 7.38007 14.8398C7.38007 14.8398 6.05756 13.5418 7.61239 11.2286C8.50315 9.90333 9.04363 9.22321 9.04363 9.22321C9.04122 9.22321 8.78924 10.9791 10.0199 12.0311C11.2388 13.0732 10.7489 14.8398 10.7489 14.8398C10.7489 14.8398 15.2513 13.3263 13.6592 9.09562C13.6592 9.09562 13.1865 7.71814 12.1055 6.73028C12.1055 6.73028 12.2424 8.37659 11.7805 8.41992C11.3183 8.46326 11.0081 8.17356 10.8043 6.05458C10.6394 4.33926 9.73096 3.34337 8.7772 2Z' fill='rgb(255,255,255)' fill-rule='evenodd'/%3E%3C/g%3E%3C/svg%3E") no-repeat;background-size:100% 100%;background-color:transparent;display:inline-flex;width:1em;height:1em}.i-common\:google{background:url("data:image/svg+xml;utf8,%3Csvg display='inline-flex' width='1em' height='1em' xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Cpath fill='%234285f4' d='M22.56 12.25c0-.78-.07-1.53-.2-2.25H12v4.26h5.92c-.26 1.37-1.04 2.53-2.21 3.31v2.77h3.57c2.08-1.92 3.28-4.74 3.28-8.09z'/%3E%3Cpath fill='%2334a853' d='M12 23c2.97 0 5.46-.98 7.28-2.66l-3.57-2.77c-.98.66-2.23 1.06-3.71 1.06-2.86 0-5.29-1.93-6.16-4.53H2.18v2.84C3.99 20.53 7.7 23 12 23z'/%3E%3Cpath fill='%23fbbc05' d='M5.84 14.09c-.22-.66-.35-1.36-.35-2.09s.13-1.43.35-2.09V7.07H2.18C1.43 8.55 1 10.22 1 12s.43 3.45 1.18 4.93l2.85-2.22.81-.62z'/%3E%3Cpath fill='%23ea4335' d='M12 5.38c1.62 0 3.06.56 4.21 1.64l3.15-3.15C17.45 2.09 14.97 1 12 1 7.7 1 3.99 3.47 2.18 7.07l3.66 2.84c.87-2.6 3.3-4.53 6.16-4.53z'/%3E%3C/svg%3E") no-repeat;background-size:100% 100%;background-color:transparent;display:inline-flex;width:1em;height:1em}.i-common\:lang{--un-icon:url("data:image/svg+xml;utf8,%3Csvg display='inline-flex' width='1em' height='1em' viewBox='0 0 20 20' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M4 15.1054H7L9.5 17.0001L11.5 15.1054H15C16.1046 15.1054 17 14.2099 17 13.1054V5.05273C17 3.94816 16.1046 3.05273 15 3.05273H4C2.89543 3.05273 2 3.94816 2 5.05273V13.1054C2 14.2099 2.89543 15.1054 4 15.1054Z' stroke='currentColor' stroke-width='1.5'/%3E%3Cpath d='M6 13L8.8 6H10.2L13 13' stroke='currentColor' stroke-width='1.5'/%3E%3Cpath d='M7 10H12' stroke='currentColor' stroke-width='1.5'/%3E%3C/svg%3E");-webkit-mask:var(--un-icon) no-repeat;mask:var(--un-icon) no-repeat;-webkit-mask-size:100% 100%;mask-size:100% 100%;background-color:currentColor;color:inherit;display:inline-flex;width:1em;height:1em}.i-common\:loading{background:url("data:image/svg+xml;utf8,%3Csvg display='inline-flex' width='1em' height='1em' xmlns='http://www.w3.org/2000/svg' viewBox='0 0 1024 1024' data-v-ea893728=''%3E%3Cpath d='M512 64a32 32 0 0 1 32 32v192a32 32 0 0 1-64 0V96a32 32 0 0 1 32-32m0 640a32 32 0 0 1 32 32v192a32 32 0 1 1-64 0V736a32 32 0 0 1 32-32m448-192a32 32 0 0 1-32 32H736a32 32 0 1 1 0-64h192a32 32 0 0 1 32 32m-640 0a32 32 0 0 1-32 32H96a32 32 0 0 1 0-64h192a32 32 0 0 1 32 32M195.2 195.2a32 32 0 0 1 45.248 0L376.32 331.008a32 32 0 0 1-45.248 45.248L195.2 240.448a32 32 0 0 1 0-45.248zm452.544 452.544a32 32 0 0 1 45.248 0L828.8 783.552a32 32 0 0 1-45.248 45.248L647.744 692.992a32 32 0 0 1 0-45.248zM828.8 195.264a32 32 0 0 1 0 45.184L692.992 376.32a32 32 0 0 1-45.248-45.248l135.808-135.808a32 32 0 0 1 45.248 0m-452.544 452.48a32 32 0 0 1 0 45.248L240.448 828.8a32 32 0 0 1-45.248-45.248l135.808-135.808a32 32 0 0 1 45.248 0z'%3E%3C/path%3E%3C/svg%3E") no-repeat;background-size:100% 100%;background-color:transparent;display:inline-flex;width:1em;height:1em}.i-common\:pro{--un-icon:url("data:image/svg+xml;utf8,%3Csvg display='inline-flex' width='1em' height='1em' viewBox='0 0 16 17' xmlns='http://www.w3.org/2000/svg'%3E%3Cg clip-path='url(%23clip0_1_3186)'%3E%3Cpath d='M12.8 0.5H3.2L0 6.3L8 16.7L16 6.3L12.8 0.5ZM8 12.276L3.592 6.1H5.552L8 9.524L10.448 6.1H12.416L8 12.276Z' fill='currentColor'/%3E%3C/g%3E%3Cdefs%3E%3CclipPath id='clip0_1_3186'%3E%3Crect width='16' height='16' fill='white' transform='translate(0 0.5)'/%3E%3C/clipPath%3E%3C/defs%3E%3C/svg%3E");-webkit-mask:var(--un-icon) no-repeat;mask:var(--un-icon) no-repeat;-webkit-mask-size:100% 100%;mask-size:100% 100%;background-color:currentColor;color:inherit;display:inline-flex;width:1em;height:1em}.i-common\:refresh,[i-common\:refresh=""]{--un-icon:url("data:image/svg+xml;utf8,%3Csvg display='inline-flex' width='1em' height='1em' viewBox='0 0 1024 1024' version='1.1' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M896.128 378.752a29.888 29.888 0 0 1-27.52-18.304 388.224 388.224 0 0 0-715.392 0 29.888 29.888 0 1 1-54.976-23.296 448 448 0 0 1 825.6 0 29.888 29.888 0 0 1-27.52 41.6z' fill='currentColor'/%3E%3Cpath d='M510.912 959.168a448.576 448.576 0 0 1-412.672-274.176 29.888 29.888 0 1 1 54.976-23.296 388.224 388.224 0 0 0 715.392 0 29.888 29.888 0 1 1 54.976 23.296 447.424 447.424 0 0 1-412.736 274.176z' fill='currentColor'/%3E%3Cpath d='M92.992 393.472a29.888 29.888 0 0 1-29.952-29.952V180.224a29.952 29.952 0 0 1 59.84 0V363.52a29.888 29.888 0 0 1-29.888 29.952z' fill='currentColor'/%3E%3Cpath d='M276.352 393.472H93.056a29.952 29.952 0 0 1 0-59.84h183.296a29.952 29.952 0 0 1 0 59.84z' fill='currentColor'/%3E%3Cpath d='M929.216 864.768a29.952 29.952 0 0 1-29.952-29.952V651.52a29.952 29.952 0 1 1 59.84 0v183.296a29.952 29.952 0 0 1-29.888 29.952z' fill='currentColor'/%3E%3Cpath d='M929.216 681.6h-183.296a29.952 29.952 0 1 1 0-59.84h183.296a29.952 29.952 0 0 1 0 59.84z' fill='currentColor'/%3E%3C/svg%3E");-webkit-mask:var(--un-icon) no-repeat;mask:var(--un-icon) no-repeat;-webkit-mask-size:100% 100%;mask-size:100% 100%;background-color:currentColor;color:inherit;display:inline-flex;width:1em;height:1em}.i-dashicons\:admin-site-alt3{--un-icon:url("data:image/svg+xml;utf8,%3Csvg viewBox='0 0 20 20' display='inline-flex' width='1em' height='1em' xmlns='http://www.w3.org/2000/svg' %3E%3Cpath fill='currentColor' d='M9 0a9 9 0 1 0 0 18A9 9 0 0 0 9 0M1.11 9.68h2.51c.04.91.167 1.814.38 2.7H1.84a7.9 7.9 0 0 1-.73-2.7m8.57-5.4V1.19a4.13 4.13 0 0 1 2.22 2q.308.521.54 1.08zm3.22 1.35c.232.883.37 1.788.41 2.7H9.68v-2.7zM8.32 1.19v3.09H5.56A8.5 8.5 0 0 1 6.1 3.2a4.13 4.13 0 0 1 2.22-2.01m0 4.44v2.7H4.7c.04-.912.178-1.817.41-2.7zm-4.7 2.69H1.11a7.9 7.9 0 0 1 .73-2.7H4a14 14 0 0 0-.38 2.7M4.7 9.68h3.62v2.7H5.11a13 13 0 0 1-.41-2.7m3.63 4v3.09a4.13 4.13 0 0 1-2.22-2a8.5 8.5 0 0 1-.54-1.08zm1.35 3.09v-3.04h2.76a8.5 8.5 0 0 1-.54 1.08a4.13 4.13 0 0 1-2.22 2zm0-4.44v-2.7h3.62a13 13 0 0 1-.41 2.7zm4.71-2.7h2.51a7.9 7.9 0 0 1-.73 2.7H14c.21-.87.337-1.757.38-2.65zm0-1.35A14 14 0 0 0 14 5.63h2.16c.403.85.65 1.764.73 2.7zm1-4H13.6a8.9 8.9 0 0 0-1.39-2.52a8 8 0 0 1 3.14 2.52zm-9.6-2.52A8.9 8.9 0 0 0 4.4 4.28H2.65a8 8 0 0 1 3.14-2.52m-3.15 12H4.4a8.9 8.9 0 0 0 1.39 2.52a8 8 0 0 1-3.14-2.55zm9.56 2.52a8.9 8.9 0 0 0 1.39-2.52h1.76a8 8 0 0 1-3.14 2.48z'/%3E%3C/svg%3E");-webkit-mask:var(--un-icon) no-repeat;mask:var(--un-icon) no-repeat;-webkit-mask-size:100% 100%;mask-size:100% 100%;background-color:currentColor;color:inherit;display:inline-flex;width:1em;height:1em}.i-domain\:setting{--un-icon:url("data:image/svg+xml;utf8,%3Csvg display='inline-flex' width='1em' height='1em' viewBox='0 0 18 18' xmlns='http://www.w3.org/2000/svg' xmlns:xlink='http://www.w3.org/1999/xlink' fill='currentColor'%3E%3Crect id='资源管理' x='0.000000' y='0.000000' fill='currentColor' fill-opacity='0'/%3E%3Cpath id='形状结合' d='M2.57806 1.40698L13.2342 1.40698C13.8256 1.40698 14.305 1.88637 14.305 2.47772L14.305 4.90995C14.305 5.25242 14.1442 5.55733 13.894 5.75333C13.4005 5.55625 12.8918 5.68477 12.5228 5.98068L10.9975 5.98068C10.6393 5.68927 10.1742 5.57036 9.67089 5.73813L9.36093 5.87039C9.2799 5.90655 9.20049 5.9433 9.12263 5.98068L2.57806 5.98068C1.98671 5.98068 1.50732 5.5013 1.50732 4.90995L1.50732 2.47772C1.50732 1.88637 1.98671 1.40698 2.57806 1.40698ZM8.10536 6.56504L2.57806 6.56504C1.98671 6.56504 1.50732 7.04442 1.50732 7.63577L1.50732 10.068C1.50732 10.6594 1.98671 11.1387 2.57806 11.1387L5.3785 11.1387C5.39874 10.9888 5.42464 10.8357 5.45625 10.6777L5.49351 10.5374C5.53804 10.4038 5.59925 10.279 5.67447 10.1653L2.57806 10.1653C2.5243 10.1653 2.48072 10.1218 2.48072 10.068L2.48072 7.63577C2.48072 7.58201 2.5243 7.53843 2.57806 7.53843L7.15438 7.53843C7.23545 7.32313 7.37166 7.12735 7.5631 6.97539L7.62866 6.92808L7.78482 6.80023C7.8886 6.71909 7.99532 6.64078 8.10536 6.56504ZM5.32766 11.7231L2.57806 11.7231C1.98671 11.7231 1.50732 12.2025 1.50732 12.7938L1.50732 15.2261C1.50732 15.8174 1.98671 16.2968 2.57806 16.2968L7.1537 16.2968C7.03764 15.9974 7.02133 15.657 7.15365 15.3234L2.57806 15.3234C2.5243 15.3234 2.48072 15.2798 2.48072 15.2261L2.48072 12.7938C2.48072 12.7401 2.5243 12.6965 2.57806 12.6965L5.37289 12.6965C5.35414 12.5489 5.34066 12.3997 5.33263 12.2516L5.32382 11.931C5.32382 11.8618 5.3251 11.7925 5.32766 11.7231ZM13.2342 2.38038L2.57806 2.38038C2.5243 2.38038 2.48072 2.42396 2.48072 2.47772L2.48072 4.90995C2.48072 4.96371 2.5243 5.00729 2.57806 5.00729L13.2342 5.00729C13.288 5.00729 13.3316 4.96371 13.3316 4.90995L13.3316 2.47772C13.3316 2.42396 13.288 2.38038 13.2342 2.38038Z' fill='rgb(251,252,251)' fill-rule='evenodd'/%3E%3Cpath id='路径' d='M10.2593 16.5606C9.67847 16.3556 9.13184 16.0481 8.65354 15.604C8.58521 15.5356 8.55104 15.4331 8.58521 15.3648C8.75603 14.8523 8.6877 14.3057 8.41438 13.8616C8.14107 13.3833 7.7311 13.0758 7.21863 12.9733C7.11613 12.9391 7.04781 12.8708 7.04781 12.7683C6.97948 12.4608 6.94531 12.1192 6.94531 11.8117C6.94531 11.5042 6.97948 11.1967 7.04781 10.8551C7.08197 10.7526 7.1503 10.6843 7.21863 10.6501C7.7311 10.5135 8.17523 10.206 8.41438 9.76184C8.6877 9.28353 8.72187 8.77106 8.58521 8.2586C8.55104 8.15611 8.58521 8.05361 8.65354 8.01945C9.13184 7.60947 9.67847 7.30199 10.2593 7.06284C10.3618 7.02868 10.4301 7.06284 10.4984 7.13117C10.8742 7.50698 11.3525 7.74613 11.865 7.74613C12.3775 7.74613 12.8899 7.54114 13.2316 7.13117C13.2999 7.06284 13.4024 7.02868 13.4707 7.06284C14.0515 7.26783 14.5982 7.57531 15.0765 8.01945C15.1448 8.08778 15.179 8.19027 15.1448 8.2586C14.974 8.77106 15.0423 9.3177 15.3156 9.76184C15.5889 10.2401 15.9989 10.5476 16.5114 10.6501C16.6139 10.6843 16.6822 10.7526 16.6822 10.8551C16.7505 11.1626 16.7847 11.5042 16.7847 11.8117C16.7847 12.1192 16.7505 12.4267 16.6822 12.7683C16.648 12.8708 16.5797 12.9391 16.5114 12.9733C15.9989 13.11 15.5548 13.4174 15.3156 13.8616C15.0423 14.3399 15.0081 14.8523 15.1448 15.3648C15.179 15.4673 15.1448 15.5698 15.0765 15.604C14.5982 16.0139 14.0515 16.3214 13.4707 16.5606C13.3682 16.5947 13.2999 16.5606 13.2316 16.4922C12.8558 16.1164 12.3775 15.8773 11.865 15.8773C11.3525 15.8773 10.8401 16.0823 10.4984 16.4922C10.4643 16.5264 10.3959 16.5606 10.3276 16.5606C10.2934 16.5606 10.2593 16.5606 10.2593 16.5606Z' fill='rgb(255,255,255)' fill-opacity='0' fill-rule='evenodd'/%3E%3Cpath id='路径' d='M8.65354 15.604C8.58521 15.5356 8.55104 15.4331 8.58521 15.3648C8.75603 14.8523 8.6877 14.3057 8.41438 13.8616C8.14107 13.3833 7.7311 13.0758 7.21863 12.9733C7.11613 12.9391 7.04781 12.8708 7.04781 12.7683C6.97948 12.4608 6.94531 12.1192 6.94531 11.8117C6.94531 11.5042 6.97948 11.1967 7.04781 10.8551C7.08197 10.7526 7.1503 10.6843 7.21863 10.6501C7.7311 10.5135 8.17523 10.206 8.41438 9.76184C8.6877 9.28353 8.72187 8.77106 8.58521 8.2586C8.55104 8.15611 8.58521 8.05361 8.65354 8.01945C9.13184 7.60947 9.67847 7.30199 10.2593 7.06284C10.3618 7.02868 10.4301 7.06284 10.4984 7.13117C10.8742 7.50698 11.3525 7.74613 11.865 7.74613C12.3775 7.74613 12.8899 7.54114 13.2316 7.13117C13.2999 7.06284 13.4024 7.02868 13.4707 7.06284C14.0515 7.26783 14.5982 7.57531 15.0765 8.01945C15.1448 8.08778 15.179 8.19027 15.1448 8.2586C14.974 8.77106 15.0423 9.3177 15.3156 9.76184C15.5889 10.2401 15.9989 10.5476 16.5114 10.6501C16.6139 10.6843 16.6822 10.7526 16.6822 10.8551C16.7505 11.1626 16.7847 11.5042 16.7847 11.8117C16.7847 12.1192 16.7505 12.4267 16.6822 12.7683C16.648 12.8708 16.5797 12.9391 16.5114 12.9733C15.9989 13.11 15.5548 13.4174 15.3156 13.8616C15.0423 14.3399 15.0081 14.8523 15.1448 15.3648C15.179 15.4673 15.1448 15.5698 15.0765 15.604C14.5982 16.0139 14.0515 16.3214 13.4707 16.5606C13.3682 16.5947 13.2999 16.5606 13.2316 16.4922C12.8558 16.1164 12.3775 15.8773 11.865 15.8773C11.3525 15.8773 10.8401 16.0823 10.4984 16.4922C10.4643 16.5264 10.3959 16.5606 10.3276 16.5606C10.2934 16.5606 10.2593 16.5606 10.2593 16.5606C9.67847 16.3556 9.13184 16.0481 8.65354 15.604Z' fill-rule='evenodd' fill='rgb(255,255,255)' fill-opacity='0' stroke='rgb(251,252,251)' stroke-width='1.10000002'/%3E%3Cpath id='路径' d='M11.865 13.451C12.7694 13.451 13.476 12.7161 13.476 11.8117C13.476 10.9072 12.7412 10.1724 11.865 10.1724C10.9605 10.1724 10.2539 10.9072 10.2539 11.8117C10.2539 12.7161 10.9888 13.451 11.865 13.451L11.865 13.451Z' fill='rgb(0,0,0)' fill-opacity='0' fill-rule='evenodd'/%3E%3Cpath id='路径' d='M13.476 11.8117C13.476 10.9072 12.7412 10.1724 11.865 10.1724C10.9605 10.1724 10.2539 10.9072 10.2539 11.8117C10.2539 12.7161 10.9888 13.451 11.865 13.451L11.865 13.451C12.7694 13.451 13.476 12.7161 13.476 11.8117Z' fill-rule='evenodd' stroke='rgb(251,252,251)' stroke-width='1.10000002'/%3E%3C/svg%3E");-webkit-mask:var(--un-icon) no-repeat;mask:var(--un-icon) no-repeat;-webkit-mask-size:100% 100%;mask-size:100% 100%;background-color:currentColor;color:inherit;display:inline-flex;width:1em;height:1em}.i-fa-solid\:external-link-alt{--un-icon:url("data:image/svg+xml;utf8,%3Csvg viewBox='0 0 512 512' display='inline-flex' width='1em' height='1em' xmlns='http://www.w3.org/2000/svg' %3E%3Cpath fill='currentColor' d='M432 320h-32a16 16 0 0 0-16 16v112H64V128h144a16 16 0 0 0 16-16V80a16 16 0 0 0-16-16H48a48 48 0 0 0-48 48v352a48 48 0 0 0 48 48h352a48 48 0 0 0 48-48V336a16 16 0 0 0-16-16M488 0H360c-21.37 0-32.05 25.91-17 41l35.73 35.73L135 320.37a24 24 0 0 0 0 34L157.67 377a24 24 0 0 0 34 0l243.61-243.68L471 169c15 15 41 4.5 41-17V24a24 24 0 0 0-24-24'/%3E%3C/svg%3E");-webkit-mask:var(--un-icon) no-repeat;mask:var(--un-icon) no-repeat;-webkit-mask-size:100% 100%;mask-size:100% 100%;background-color:currentColor;color:inherit;display:inline-flex;width:1em;height:1em}.i-fa\:angle-down{--un-icon:url("data:image/svg+xml;utf8,%3Csvg viewBox='0 0 1024 1280' display='inline-flex' width='0.8em' height='1em' xmlns='http://www.w3.org/2000/svg' %3E%3Cpath fill='currentColor' d='M1011 480q0 13-10 23L535 969q-10 10-23 10t-23-10L23 503q-10-10-10-23t10-23l50-50q10-10 23-10t23 10l393 393l393-393q10-10 23-10t23 10l50 50q10 10 10 23'/%3E%3C/svg%3E");-webkit-mask:var(--un-icon) no-repeat;mask:var(--un-icon) no-repeat;-webkit-mask-size:100% 100%;mask-size:100% 100%;background-color:currentColor;color:inherit;display:inline-flex;width:.8em;height:1em}.i-fa\:folder-open-o{--un-icon:url("data:image/svg+xml;utf8,%3Csvg viewBox='0 0 1920 1408' display='inline-flex' width='1.37em' height='1em' xmlns='http://www.w3.org/2000/svg' %3E%3Cpath fill='currentColor' d='M1781 803q0-35-53-35H640q-40 0-85.5 21.5T483 842l-294 363q-18 24-18 40q0 35 53 35h1088q40 0 86-22t71-53l294-363q18-22 18-39M640 640h768V480q0-40-28-68t-68-28H736q-40 0-68-28t-28-68v-64q0-40-28-68t-68-28H224q-40 0-68 28t-28 68v853l256-315q44-53 116-87.5T640 640m1269 163q0 62-46 120l-295 363q-43 53-116 87.5t-140 34.5H224q-92 0-158-66T0 1184V224q0-92 66-158T224 0h320q92 0 158 66t66 158v32h544q92 0 158 66t66 158v160h192q54 0 99 24.5t67 70.5q15 32 15 68'/%3E%3C/svg%3E");-webkit-mask:var(--un-icon) no-repeat;mask:var(--un-icon) no-repeat;-webkit-mask-size:100% 100%;mask-size:100% 100%;background-color:currentColor;color:inherit;display:inline-flex;width:1.37em;height:1em}.i-fa\:lightbulb-o{--un-icon:url("data:image/svg+xml;utf8,%3Csvg viewBox='0 0 1024 1536' display='inline-flex' width='0.67em' height='1em' xmlns='http://www.w3.org/2000/svg' %3E%3Cpath fill='currentColor' d='M736 448q0 13-9.5 22.5T704 480t-22.5-9.5T672 448q0-46-54-71t-106-25q-13 0-22.5-9.5T480 320t9.5-22.5T512 288q50 0 99.5 16t87 54t37.5 90m160 0q0-72-34.5-134t-90-101.5t-123-62T512 128t-136.5 22.5t-123 62t-90 101.5T128 448q0 101 68 180q10 11 30.5 33t30.5 33q128 153 141 298h228q13-145 141-298q10-11 30.5-33t30.5-33q68-79 68-180m128 0q0 155-103 268q-45 49-74.5 87T787 898.5T753 1006q47 28 47 82q0 37-25 64q25 27 25 64q0 52-45 81q13 23 13 47q0 46-31.5 71t-77.5 25q-20 44-60 70t-87 26t-87-26t-60-70q-46 0-77.5-25t-31.5-71q0-24 13-47q-45-29-45-81q0-37 25-64q-25-27-25-64q0-54 47-82q-4-50-34-107.5T177.5 803T103 716Q0 603 0 448q0-99 44.5-184.5t117-142t164-89T512 0t186.5 32.5t164 89t117 142T1024 448'/%3E%3C/svg%3E");-webkit-mask:var(--un-icon) no-repeat;mask:var(--un-icon) no-repeat;-webkit-mask-size:100% 100%;mask-size:100% 100%;background-color:currentColor;color:inherit;display:inline-flex;width:.67em;height:1em}.i-famicons\:ellipsis-vertical{--un-icon:url("data:image/svg+xml;utf8,%3Csvg viewBox='0 0 512 512' display='inline-flex' width='1em' height='1em' xmlns='http://www.w3.org/2000/svg' %3E%3Ccircle cx='256' cy='256' r='48' fill='currentColor'/%3E%3Ccircle cx='256' cy='416' r='48' fill='currentColor'/%3E%3Ccircle cx='256' cy='96' r='48' fill='currentColor'/%3E%3C/svg%3E");-webkit-mask:var(--un-icon) no-repeat;mask:var(--un-icon) no-repeat;-webkit-mask-size:100% 100%;mask-size:100% 100%;background-color:currentColor;color:inherit;display:inline-flex;width:1em;height:1em}.i-famicons\:pause-circle-outline{--un-icon:url("data:image/svg+xml;utf8,%3Csvg viewBox='0 0 512 512' display='inline-flex' width='1em' height='1em' xmlns='http://www.w3.org/2000/svg' %3E%3Cpath fill='none' stroke='currentColor' stroke-miterlimit='10' stroke-width='32' d='M448 256c0-106-86-192-192-192S64 150 64 256s86 192 192 192s192-86 192-192Z'/%3E%3Cpath fill='none' stroke='currentColor' stroke-linecap='round' stroke-miterlimit='10' stroke-width='32' d='M208 192v128m96-128v128'/%3E%3C/svg%3E");-webkit-mask:var(--un-icon) no-repeat;mask:var(--un-icon) no-repeat;-webkit-mask-size:100% 100%;mask-size:100% 100%;background-color:currentColor;color:inherit;display:inline-flex;width:1em;height:1em}.i-famicons\:play-circle-outline{--un-icon:url("data:image/svg+xml;utf8,%3Csvg viewBox='0 0 512 512' display='inline-flex' width='1em' height='1em' xmlns='http://www.w3.org/2000/svg' %3E%3Cpath fill='none' stroke='currentColor' stroke-miterlimit='10' stroke-width='32' d='M448 256c0-106-86-192-192-192S64 150 64 256s86 192 192 192s192-86 192-192Z'/%3E%3Cpath fill='currentColor' d='m216.32 334.44l114.45-69.14a10.89 10.89 0 0 0 0-18.6l-114.45-69.14a10.78 10.78 0 0 0-16.32 9.31v138.26a10.78 10.78 0 0 0 16.32 9.31'/%3E%3C/svg%3E");-webkit-mask:var(--un-icon) no-repeat;mask:var(--un-icon) no-repeat;-webkit-mask-size:100% 100%;mask-size:100% 100%;background-color:currentColor;color:inherit;display:inline-flex;width:1em;height:1em}.i-famicons\:settings-outline,[i-famicons\:settings-outline=""]{--un-icon:url("data:image/svg+xml;utf8,%3Csvg viewBox='0 0 512 512' display='inline-flex' width='1em' height='1em' xmlns='http://www.w3.org/2000/svg' %3E%3Cpath fill='none' stroke='currentColor' stroke-linecap='round' stroke-linejoin='round' stroke-width='32' d='M262.29 192.31a64 64 0 1 0 57.4 57.4a64.13 64.13 0 0 0-57.4-57.4M416.39 256a154 154 0 0 1-1.53 20.79l45.21 35.46a10.81 10.81 0 0 1 2.45 13.75l-42.77 74a10.81 10.81 0 0 1-13.14 4.59l-44.9-18.08a16.11 16.11 0 0 0-15.17 1.75A164.5 164.5 0 0 1 325 400.8a15.94 15.94 0 0 0-8.82 12.14l-6.73 47.89a11.08 11.08 0 0 1-10.68 9.17h-85.54a11.11 11.11 0 0 1-10.69-8.87l-6.72-47.82a16.07 16.07 0 0 0-9-12.22a155 155 0 0 1-21.46-12.57a16 16 0 0 0-15.11-1.71l-44.89 18.07a10.81 10.81 0 0 1-13.14-4.58l-42.77-74a10.8 10.8 0 0 1 2.45-13.75l38.21-30a16.05 16.05 0 0 0 6-14.08c-.36-4.17-.58-8.33-.58-12.5s.21-8.27.58-12.35a16 16 0 0 0-6.07-13.94l-38.19-30A10.81 10.81 0 0 1 49.48 186l42.77-74a10.81 10.81 0 0 1 13.14-4.59l44.9 18.08a16.11 16.11 0 0 0 15.17-1.75A164.5 164.5 0 0 1 187 111.2a15.94 15.94 0 0 0 8.82-12.14l6.73-47.89A11.08 11.08 0 0 1 213.23 42h85.54a11.11 11.11 0 0 1 10.69 8.87l6.72 47.82a16.07 16.07 0 0 0 9 12.22a155 155 0 0 1 21.46 12.57a16 16 0 0 0 15.11 1.71l44.89-18.07a10.81 10.81 0 0 1 13.14 4.58l42.77 74a10.8 10.8 0 0 1-2.45 13.75l-38.21 30a16.05 16.05 0 0 0-6.05 14.08c.33 4.14.55 8.3.55 12.47'/%3E%3C/svg%3E");-webkit-mask:var(--un-icon) no-repeat;mask:var(--un-icon) no-repeat;-webkit-mask-size:100% 100%;mask-size:100% 100%;background-color:currentColor;color:inherit;display:inline-flex;width:1em;height:1em}.i-fontisto\:close{--un-icon:url("data:image/svg+xml;utf8,%3Csvg viewBox='0 0 24 24' display='inline-flex' width='1em' height='1em' xmlns='http://www.w3.org/2000/svg' %3E%3Cpath fill='currentColor' d='M20.48 3.512a11.97 11.97 0 0 0-8.486-3.514C5.366-.002-.007 5.371-.007 11.999c0 3.314 1.344 6.315 3.516 8.487A11.97 11.97 0 0 0 11.995 24c6.628 0 12.001-5.373 12.001-12.001c0-3.314-1.344-6.315-3.516-8.487m-1.542 15.427a9.8 9.8 0 0 1-6.943 2.876c-5.423 0-9.819-4.396-9.819-9.819a9.8 9.8 0 0 1 2.876-6.943a9.8 9.8 0 0 1 6.942-2.876c5.422 0 9.818 4.396 9.818 9.818a9.8 9.8 0 0 1-2.876 6.942z'/%3E%3Cpath fill='currentColor' d='m13.537 12l3.855-3.855a1.091 1.091 0 0 0-1.542-1.541l.001-.001l-3.855 3.855l-3.855-3.855A1.091 1.091 0 0 0 6.6 8.145l-.001-.001l3.855 3.855l-3.855 3.855a1.091 1.091 0 1 0 1.541 1.542l.001-.001l3.855-3.855l3.855 3.855a1.091 1.091 0 1 0 1.542-1.541l-.001-.001z'/%3E%3C/svg%3E");-webkit-mask:var(--un-icon) no-repeat;mask:var(--un-icon) no-repeat;-webkit-mask-size:100% 100%;mask-size:100% 100%;background-color:currentColor;color:inherit;display:inline-flex;width:1em;height:1em}.i-healthicons\:health-vulnerability-through-social-determinants-outline-24px{--un-icon:url("data:image/svg+xml;utf8,%3Csvg viewBox='0 0 24 24' display='inline-flex' width='1em' height='1em' xmlns='http://www.w3.org/2000/svg' %3E%3Cg fill='currentColor'%3E%3Cpath d='M3.017 7.6A9.96 9.96 0 0 0 2 12c0 5.523 4.477 10 10 10q1.022-.002 1.985-.197a.3.3 0 0 1-.005-.053v-.99a.25.25 0 0 0-.074-.177l-.677-.677Q12.628 20 12 20A8 8 0 0 1 4.582 9H3.354a.25.25 0 0 1-.25-.25v-.958a.25.25 0 0 0-.073-.177zm5.988-3.02l-1.51-1.51A9.96 9.96 0 0 1 12 2c5.523 0 10 4.477 10 10a9.95 9.95 0 0 1-1.433 5.16L19.1 15.693A8 8 0 0 0 9.005 4.58M6 3l3 3l-.79.79l-.35-.35v1.443H6.745v-.93a.744.744 0 1 0-1.488 0v.93H4.139V6.44l-.35.35L3 6z'/%3E%3Cpath d='M11 16v-3H8v-2h3V8h2v3h3v2h-3v3zm6.4-.6l3.5 3.529l-.82.826l-.362-.366v1.51h-1.545v-.973a.776.776 0 0 0-.773-.779a.776.776 0 0 0-.773.78v.973h-1.545v-1.51l-.363.365l-.82-.826z'/%3E%3C/g%3E%3C/svg%3E");-webkit-mask:var(--un-icon) no-repeat;mask:var(--un-icon) no-repeat;-webkit-mask-size:100% 100%;mask-size:100% 100%;background-color:currentColor;color:inherit;display:inline-flex;width:1em;height:1em}.i-home\:check{--un-icon:url("data:image/svg+xml;utf8,%3Csvg display='inline-flex' width='1em' height='1em' viewBox='0 0 14 14' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M1 6.5L5.5 11L12.5 4' fill='none' stroke='currentColor' stroke-width='2'/%3E%3C/svg%3E");-webkit-mask:var(--un-icon) no-repeat;mask:var(--un-icon) no-repeat;-webkit-mask-size:100% 100%;mask-size:100% 100%;background-color:currentColor;color:inherit;display:inline-flex;width:1em;height:1em}.i-home\:fix{--un-icon:url("data:image/svg+xml;utf8,%3Csvg display='inline-flex' width='1em' height='1em' viewBox='0 0 20 20' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M18 7.48571C18 10.5154 15.544 12.9714 12.5143 12.9714C11.5878 12.9714 10.7149 12.7417 9.94953 12.3362L4.28571 18L2 15.7143L7.66382 10.0505C7.25829 9.28507 7.02857 8.41221 7.02857 7.48571C7.02857 4.45604 9.48462 2 12.5143 2C13.4408 2 14.3136 2.22969 15.079 2.63524L11.6 6.11429L13.8857 8.4L17.3648 4.92096C17.7703 5.68635 18 6.55922 18 7.48571Z' stroke='currentColor' stroke-width='1.5' stroke-linecap='square'/%3E%3C/svg%3E");-webkit-mask:var(--un-icon) no-repeat;mask:var(--un-icon) no-repeat;-webkit-mask-size:100% 100%;mask-size:100% 100%;background-color:currentColor;color:inherit;display:inline-flex;width:1em;height:1em}.i-home\:restart{--un-icon:url("data:image/svg+xml;utf8,%3Csvg display='inline-flex' width='1em' height='1em' viewBox='0 0 20 20' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M10 9V2' stroke='currentColor' stroke-width='1.5' stroke-linecap='square' stroke-linejoin='round'/%3E%3Cpath d='M5.61905 4C3.77138 5.35135 2.57129 7.53552 2.57129 9.99998C2.57129 14.1027 5.89717 17.4286 9.99986 17.4286C14.1025 17.4286 17.4284 14.1027 17.4284 9.99998C17.4284 7.32457 16.0141 4.97949 13.8923 3.67164' stroke='currentColor' stroke-width='1.5' stroke-linecap='square' stroke-linejoin='round'/%3E%3C/svg%3E");-webkit-mask:var(--un-icon) no-repeat;mask:var(--un-icon) no-repeat;-webkit-mask-size:100% 100%;mask-size:100% 100%;background-color:currentColor;color:inherit;display:inline-flex;width:1em;height:1em}.i-home\:update{--un-icon:url("data:image/svg+xml;utf8,%3Csvg display='inline-flex' width='1em' height='1em' viewBox='0 0 20 20' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cg clip-path='url(%23clip0_3_230)'%3E%3Cpath d='M4.13753 13.7501C4.87923 14.8601 5.93344 15.7253 7.16684 16.2362C8.40024 16.7471 9.75744 16.8808 11.0668 16.6203C12.3762 16.3599 13.5789 15.717 14.5229 14.773C15.4669 13.829 16.1098 12.6262 16.3703 11.3169C16.6307 10.0075 16.497 8.65029 15.9861 7.41689C15.4752 6.18349 14.6101 5.12928 13.5001 4.38758C12.39 3.64588 11.085 3.25 9.74995 3.25C7.86292 3.2571 6.05168 3.99342 4.69495 5.305L3.44995 6.4' stroke='currentColor' stroke-width='1.5' stroke-linecap='square'/%3E%3Cpath d='M3 3.25V7H6.75' stroke='currentColor' stroke-width='1.5' stroke-linecap='square'/%3E%3C/g%3E%3Cdefs%3E%3CclipPath id='clip0_3_230'%3E%3Crect width='20' height='20' fill='white'/%3E%3C/clipPath%3E%3C/defs%3E%3C/svg%3E");-webkit-mask:var(--un-icon) no-repeat;mask:var(--un-icon) no-repeat;-webkit-mask-size:100% 100%;mask-size:100% 100%;background-color:currentColor;color:inherit;display:inline-flex;width:1em;height:1em}.i-home\:user{background:url("data:image/svg+xml;utf8,%3Csvg display='inline-flex' width='1em' height='1em' id='_图层_1' data-name='图层_1' xmlns='http://www.w3.org/2000/svg' version='1.1' viewBox='0 0 1024 1024'%3E%3C!-- Generator: Adobe Illustrator 29.0.1, SVG Export Plug-In . SVG Version: 2.1.0 Build 192) --%3E%3Cdefs%3E%3Cstyle%3E.st0 {fill: %233f3f3f;}.st1 {fill: %23ecb485;}.st2 {opacity: .1;}.st2, .st3 {fill: %2322b573;}.st4 {fill: %23f6caa9;}%3C/style%3E%3C/defs%3E%3Cpath class='st2' d='M64,512c0,247.42,200.58,448,448,448s448-200.58,448-448S759.42,64,512,64,64,264.58,64,512Z'/%3E%3Cpath class='st4' d='M698.6,459.8c0,113.87-82.01,206.18-183.17,206.18s-183.17-92.31-183.17-206.17,82.01-206.18,183.17-206.18,183.17,92.31,183.17,206.18'/%3E%3Cpath class='st4' d='M444.27,633.56h140.49v116.19h-140.49v-116.19ZM355.41,471.89c0,17.02-12.6,30.83-28.14,30.83s-28.14-13.8-28.14-30.83,12.6-30.83,28.14-30.83,28.14,13.8,28.14,30.83M731.35,471.51c0,17.02-12.6,30.83-28.14,30.83s-28.14-13.8-28.14-30.83,12.6-30.83,28.14-30.83,28.14,13.8,28.14,30.83'/%3E%3Cpath class='st1' d='M444.64,650.21s26.6,13.69,65.19,13.69c45.33,1.85,74.93-13.32,74.93-13.32v13.69s-49.83,26.64-72.31,26.64-68.18-31.45-68.18-31.45l.37-9.25h0ZM491.79,202.69s-123.95,12.35-125.23,93.49,95.71,96.67,131.65,105.55c35.94,8.88,134.78,20.29,192.54-73.53,0,0-15.84-36.79-24.51-62.45-3.85-6.66,6.22,11.43-28.44-10.44-34.66-21.87-81.19-57.68-146.01-52.61'/%3E%3Cpath class='st0' d='M405.01,247.01s-90.37,15.05-95.5,95.91c-5.14,80.86,9.21,102.22,9.21,102.22,0,0,20.38-.06,25.51,30.41,0,0,9.43,5.59,10.27,0,1.39-9.29-8.27-53.43,10.99-94.45,19.13-40.76,37.56-46.58,37.56-46.58l1.96-87.5ZM642.57,335.37s24.17,31.15,28.35,62.29c3.54,26.41,8.47,76.09,8.47,76.09,0,0,6.74,4.76,11.55-6.66,4.81-11.41,3.57-22.81,8.05-25.77,23.65-15.66,17.48-81.5,16.21-88.45-5.37-29.4-29.76-76.64-29.76-76.64,0,0-42.87,59.14-42.87,59.14Z'/%3E%3Cpath class='st0' d='M488.66,175.41s-128.26,5.27-129.55,90.56,100.02,109.34,135.97,118.66c35.94,9.33,134.78,21.32,192.54-77.29,0,0,14.44-44.64,5.78-71.63-3.85-7-24.07,17.99-58.72-5-34.66-22.99-81.19-60.63-146.01-55.31'/%3E%3Cpath class='st3' d='M839.09,818.12c-22.8-17.9-65.73-44.28-108.29-64.98-69.09-33.59-145.99-48.64-145.99-48.64l-.06,2.28c-5.6,5.98-32.63,32.62-69.86,32.62s-64.07-25.01-70.4-31.31l-.33-3.24s-74.05,10.15-143.14,43.74c-47.28,22.99-95,52.99-115.09,70.59,81.7,86.69,197.57,140.81,326.08,140.81s245.34-54.56,327.09-141.88h0Z'/%3E%3C/svg%3E") no-repeat;background-size:100% 100%;background-color:transparent;display:inline-flex;width:1em;height:1em}.i-hugeicons\:firewall{--un-icon:url("data:image/svg+xml;utf8,%3Csvg viewBox='0 0 24 24' display='inline-flex' width='1em' height='1em' xmlns='http://www.w3.org/2000/svg' %3E%3Cpath fill='none' stroke='currentColor' stroke-linecap='round' stroke-linejoin='round' stroke-width='1.5' d='M19 14H5c-1.414 0-2.121 0-2.56.44C2 14.878 2 15.585 2 17v2c0 1.414 0 2.121.44 2.56C2.878 22 3.585 22 5 22h14c1.414 0 2.121 0 2.56-.44c.44-.439.44-1.146.44-2.56v-2c0-1.414 0-2.121-.44-2.56C21.122 14 20.415 14 19 14M2 18h20m-10 0v-4m-5 8v-4m10 4v-4m1.841-7c-.287-1.194-1.005-2.36-2.466-3.4C12.437 4.8 12 2 12 2s-4.062 3.6-1.75 8c-2.1.32-3.078-2-3.304-3.2c-.97 1.29-1.74 2.736-1.91 4.2'/%3E%3C/svg%3E");-webkit-mask:var(--un-icon) no-repeat;mask:var(--un-icon) no-repeat;-webkit-mask-size:100% 100%;mask-size:100% 100%;background-color:currentColor;color:inherit;display:inline-flex;width:1em;height:1em}.i-ic\:baseline-pause-circle-outline{--un-icon:url("data:image/svg+xml;utf8,%3Csvg viewBox='0 0 24 24' display='inline-flex' width='1em' height='1em' xmlns='http://www.w3.org/2000/svg' %3E%3Cpath fill='currentColor' d='M9 16h2V8H9zm3-14C6.48 2 2 6.48 2 12s4.48 10 10 10s10-4.48 10-10S17.52 2 12 2m0 18c-4.41 0-8-3.59-8-8s3.59-8 8-8s8 3.59 8 8s-3.59 8-8 8m1-4h2V8h-2z'/%3E%3C/svg%3E");-webkit-mask:var(--un-icon) no-repeat;mask:var(--un-icon) no-repeat;-webkit-mask-size:100% 100%;mask-size:100% 100%;background-color:currentColor;color:inherit;display:inline-flex;width:1em;height:1em}.i-ic\:baseline-zoom-in{--un-icon:url("data:image/svg+xml;utf8,%3Csvg viewBox='0 0 24 24' display='inline-flex' width='1em' height='1em' xmlns='http://www.w3.org/2000/svg' %3E%3Cpath fill='currentColor' d='M15.5 14h-.79l-.28-.27A6.47 6.47 0 0 0 16 9.5A6.5 6.5 0 1 0 9.5 16c1.61 0 3.09-.59 4.23-1.57l.27.28v.79l5 4.99L20.49 19zm-6 0C7.01 14 5 11.99 5 9.5S7.01 5 9.5 5S14 7.01 14 9.5S11.99 14 9.5 14'/%3E%3Cpath fill='currentColor' d='M12 10h-2v2H9v-2H7V9h2V7h1v2h2z'/%3E%3C/svg%3E");-webkit-mask:var(--un-icon) no-repeat;mask:var(--un-icon) no-repeat;-webkit-mask-size:100% 100%;mask-size:100% 100%;background-color:currentColor;color:inherit;display:inline-flex;width:1em;height:1em}.i-ic\:baseline-zoom-out{--un-icon:url("data:image/svg+xml;utf8,%3Csvg viewBox='0 0 24 24' display='inline-flex' width='1em' height='1em' xmlns='http://www.w3.org/2000/svg' %3E%3Cpath fill='currentColor' d='M15.5 14h-.79l-.28-.27A6.47 6.47 0 0 0 16 9.5A6.5 6.5 0 1 0 9.5 16c1.61 0 3.09-.59 4.23-1.57l.27.28v.79l5 4.99L20.49 19zm-6 0C7.01 14 5 11.99 5 9.5S7.01 5 9.5 5S14 7.01 14 9.5S11.99 14 9.5 14M7 9h5v1H7z'/%3E%3C/svg%3E");-webkit-mask:var(--un-icon) no-repeat;mask:var(--un-icon) no-repeat;-webkit-mask-size:100% 100%;mask-size:100% 100%;background-color:currentColor;color:inherit;display:inline-flex;width:1em;height:1em}.i-ic\:outline-arrow-circle-left{--un-icon:url("data:image/svg+xml;utf8,%3Csvg viewBox='0 0 24 24' display='inline-flex' width='1em' height='1em' xmlns='http://www.w3.org/2000/svg' %3E%3Cpath fill='currentColor' d='M2 12c0 5.52 4.48 10 10 10s10-4.48 10-10S17.52 2 12 2S2 6.48 2 12m18 0c0 4.42-3.58 8-8 8s-8-3.58-8-8s3.58-8 8-8s8 3.58 8 8M8 12l4-4l1.41 1.41L11.83 11H16v2h-4.17l1.59 1.59L12 16z'/%3E%3C/svg%3E");-webkit-mask:var(--un-icon) no-repeat;mask:var(--un-icon) no-repeat;-webkit-mask-size:100% 100%;mask-size:100% 100%;background-color:currentColor;color:inherit;display:inline-flex;width:1em;height:1em}.i-ic\:outline-arrow-circle-right{--un-icon:url("data:image/svg+xml;utf8,%3Csvg viewBox='0 0 24 24' display='inline-flex' width='1em' height='1em' xmlns='http://www.w3.org/2000/svg' %3E%3Cpath fill='currentColor' d='M22 12c0-5.52-4.48-10-10-10S2 6.48 2 12s4.48 10 10 10s10-4.48 10-10M4 12c0-4.42 3.58-8 8-8s8 3.58 8 8s-3.58 8-8 8s-8-3.58-8-8m12 0l-4 4l-1.41-1.41L12.17 13H8v-2h4.17l-1.59-1.59L12 8z'/%3E%3C/svg%3E");-webkit-mask:var(--un-icon) no-repeat;mask:var(--un-icon) no-repeat;-webkit-mask-size:100% 100%;mask-size:100% 100%;background-color:currentColor;color:inherit;display:inline-flex;width:1em;height:1em}.i-iconamoon\:3d-bold{--un-icon:url("data:image/svg+xml;utf8,%3Csvg viewBox='0 0 24 24' display='inline-flex' width='1em' height='1em' xmlns='http://www.w3.org/2000/svg' %3E%3Cg fill='none' stroke='currentColor' stroke-linecap='round' stroke-linejoin='round' stroke-width='2.5'%3E%3Cpath d='m12 3l7.794 4.5v7.845a2 2 0 0 1-1 1.732L13 20.423a2 2 0 0 1-2 0l-5.794-3.346a2 2 0 0 1-1-1.732V7.5z'/%3E%3Cpath d='M12 7v5l-4.33 2.5M12 12l4.33 2.5'/%3E%3C/g%3E%3C/svg%3E");-webkit-mask:var(--un-icon) no-repeat;mask:var(--un-icon) no-repeat;-webkit-mask-size:100% 100%;mask-size:100% 100%;background-color:currentColor;color:inherit;display:inline-flex;width:1em;height:1em}.i-iconamoon\:file{--un-icon:url("data:image/svg+xml;utf8,%3Csvg viewBox='0 0 24 24' display='inline-flex' width='1em' height='1em' xmlns='http://www.w3.org/2000/svg' %3E%3Cg fill='none' stroke='currentColor' stroke-linejoin='round' stroke-width='2'%3E%3Cpath stroke-linecap='round' d='M7 21a2 2 0 0 1-2-2V3h9l5 5v11a2 2 0 0 1-2 2z'/%3E%3Cpath d='M13 3v6h6'/%3E%3C/g%3E%3C/svg%3E");-webkit-mask:var(--un-icon) no-repeat;mask:var(--un-icon) no-repeat;-webkit-mask-size:100% 100%;mask-size:100% 100%;background-color:currentColor;color:inherit;display:inline-flex;width:1em;height:1em}.i-iconoir\:xmark-circle{--un-icon:url("data:image/svg+xml;utf8,%3Csvg viewBox='0 0 24 24' display='inline-flex' width='1em' height='1em' xmlns='http://www.w3.org/2000/svg' %3E%3Cpath fill='none' stroke='currentColor' stroke-linecap='round' stroke-linejoin='round' stroke-width='1.5' d='M9.172 14.828L12.001 12m2.828-2.828L12.001 12m0 0L9.172 9.172M12.001 12l2.828 2.828M12 22c5.523 0 10-4.477 10-10S17.523 2 12 2S2 6.477 2 12s4.477 10 10 10'/%3E%3C/svg%3E");-webkit-mask:var(--un-icon) no-repeat;mask:var(--un-icon) no-repeat;-webkit-mask-size:100% 100%;mask-size:100% 100%;background-color:currentColor;color:inherit;display:inline-flex;width:1em;height:1em}.i-lets-icons\:lightning-ring{--un-icon:url("data:image/svg+xml;utf8,%3Csvg viewBox='0 0 24 24' display='inline-flex' width='1em' height='1em' xmlns='http://www.w3.org/2000/svg' %3E%3Cg fill='none'%3E%3Cpath fill='currentColor' d='M11.5 13.8h-1.063c-1.53 0-2.294 0-2.583-.497s.088-1.162.844-2.491l2.367-4.167c.375-.66.563-.99.749-.94c.186.049.186.428.186 1.187V9.7c0 .236 0 .354.073.427s.191.073.427.073h1.063c1.53 0 2.294 0 2.583.497s-.088 1.162-.844 2.491l-2.367 4.167c-.375.66-.563.99-.749.94C12 18.247 12 17.868 12 17.109V14.3c0-.236 0-.354-.073-.427s-.191-.073-.427-.073'/%3E%3Ccircle cx='12' cy='12' r='9' stroke='currentColor' stroke-width='2'/%3E%3C/g%3E%3C/svg%3E");-webkit-mask:var(--un-icon) no-repeat;mask:var(--un-icon) no-repeat;-webkit-mask-size:100% 100%;mask-size:100% 100%;background-color:currentColor;color:inherit;display:inline-flex;width:1em;height:1em}.i-lineicons\:protection{--un-icon:url("data:image/svg+xml;utf8,%3Csvg viewBox='0 0 64 64' display='inline-flex' width='1em' height='1em' xmlns='http://www.w3.org/2000/svg' %3E%3Cpath fill='currentColor' d='M53.6 7.5L33.3 1.9c-.8-.2-1.7-.2-2.5 0L10.4 7.5c-2.1.6-3.6 2.5-3.6 4.7V27c0 15.5 9.2 29.2 23.4 34.9c.6.2 1.2.4 1.8.4s1.2-.1 1.8-.4c14.2-5.7 23.4-19.5 23.4-35V12.2c0-2.2-1.5-4.1-3.6-4.7m-.9 19.4c0 13.4-8.3 25.8-20.5 30.8h-.3c-12.5-5-20.6-17.1-20.6-30.7V12.2c0-.1.1-.3.2-.3l20.4-5.6h.2l20.4 5.6c.1 0 .2.2.2.3z'/%3E%3Cpath fill='currentColor' d='M43.3 22.6L29.5 34.2L23.3 29c-1-.8-2.4-.7-3.2.3s-.7 2.4.3 3.2l7.6 6.4c.4.4.9.5 1.4.5s1-.2 1.4-.5L46.2 26c1-.8 1.1-2.2.3-3.2c-.8-.9-2.3-1-3.2-.2'/%3E%3C/svg%3E");-webkit-mask:var(--un-icon) no-repeat;mask:var(--un-icon) no-repeat;-webkit-mask-size:100% 100%;mask-size:100% 100%;background-color:currentColor;color:inherit;display:inline-flex;width:1em;height:1em}.i-lsicon\:clothes-outline{--un-icon:url("data:image/svg+xml;utf8,%3Csvg viewBox='0 0 16 16' display='inline-flex' width='1em' height='1em' xmlns='http://www.w3.org/2000/svg' %3E%3Cpath fill='none' stroke='currentColor' d='M5 13.5h6v-6l2 1L14 5l-2-2.5h-1.5C10.5 3 9.2 4 8 4S5.5 3 5.5 2.5H4L2 5l1 3.5l2-1z'/%3E%3C/svg%3E");-webkit-mask:var(--un-icon) no-repeat;mask:var(--un-icon) no-repeat;-webkit-mask-size:100% 100%;mask-size:100% 100%;background-color:currentColor;color:inherit;display:inline-flex;width:1em;height:1em}.i-lucide-arrow-up{--un-icon:url("data:image/svg+xml;utf8,%3Csvg viewBox='0 0 24 24' display='inline-flex' width='1em' height='1em' xmlns='http://www.w3.org/2000/svg' %3E%3Cpath fill='none' stroke='currentColor' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='m5 12l7-7l7 7m-7 7V5'/%3E%3C/svg%3E");-webkit-mask:var(--un-icon) no-repeat;mask:var(--un-icon) no-repeat;-webkit-mask-size:100% 100%;mask-size:100% 100%;background-color:currentColor;color:inherit;display:inline-flex;width:1em;height:1em}.i-lucide-plus{--un-icon:url("data:image/svg+xml;utf8,%3Csvg viewBox='0 0 24 24' display='inline-flex' width='1em' height='1em' xmlns='http://www.w3.org/2000/svg' %3E%3Cpath fill='none' stroke='currentColor' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='M5 12h14m-7-7v14'/%3E%3C/svg%3E");-webkit-mask:var(--un-icon) no-repeat;mask:var(--un-icon) no-repeat;-webkit-mask-size:100% 100%;mask-size:100% 100%;background-color:currentColor;color:inherit;display:inline-flex;width:1em;height:1em}.i-lucide-wrench{--un-icon:url("data:image/svg+xml;utf8,%3Csvg viewBox='0 0 24 24' display='inline-flex' width='1em' height='1em' xmlns='http://www.w3.org/2000/svg' %3E%3Cpath fill='none' stroke='currentColor' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='M14.7 6.3a1 1 0 0 0 0 1.4l1.6 1.6a1 1 0 0 0 1.4 0l3.106-3.105c.32-.322.863-.22.983.218a6 6 0 0 1-8.259 7.057l-7.91 7.91a1 1 0 0 1-2.999-3l7.91-7.91a6 6 0 0 1 7.057-8.259c.438.12.54.662.219.984z'/%3E%3C/svg%3E");-webkit-mask:var(--un-icon) no-repeat;mask:var(--un-icon) no-repeat;-webkit-mask-size:100% 100%;mask-size:100% 100%;background-color:currentColor;color:inherit;display:inline-flex;width:1em;height:1em}.i-lucide\:user-round{--un-icon:url("data:image/svg+xml;utf8,%3Csvg viewBox='0 0 24 24' display='inline-flex' width='1em' height='1em' xmlns='http://www.w3.org/2000/svg' %3E%3Cg fill='none' stroke='currentColor' stroke-linecap='round' stroke-linejoin='round' stroke-width='2'%3E%3Ccircle cx='12' cy='8' r='5'/%3E%3Cpath d='M20 21a8 8 0 0 0-16 0'/%3E%3C/g%3E%3C/svg%3E");-webkit-mask:var(--un-icon) no-repeat;mask:var(--un-icon) no-repeat;-webkit-mask-size:100% 100%;mask-size:100% 100%;background-color:currentColor;color:inherit;display:inline-flex;width:1em;height:1em}.i-majesticons\:eye-line{--un-icon:url("data:image/svg+xml;utf8,%3Csvg viewBox='0 0 24 24' display='inline-flex' width='1em' height='1em' xmlns='http://www.w3.org/2000/svg' %3E%3Cg fill='none' stroke='currentColor' stroke-linecap='round' stroke-linejoin='round' stroke-width='2'%3E%3Cpath d='M12 5c-6.307 0-9.367 5.683-9.91 6.808a.44.44 0 0 0 0 .384C2.632 13.317 5.692 19 12 19s9.367-5.683 9.91-6.808a.44.44 0 0 0 0-.384C21.368 10.683 18.308 5 12 5'/%3E%3Ccircle cx='12' cy='12' r='3'/%3E%3C/g%3E%3C/svg%3E");-webkit-mask:var(--un-icon) no-repeat;mask:var(--un-icon) no-repeat;-webkit-mask-size:100% 100%;mask-size:100% 100%;background-color:currentColor;color:inherit;display:inline-flex;width:1em;height:1em}.i-majesticons\:eye-off-line{--un-icon:url("data:image/svg+xml;utf8,%3Csvg viewBox='0 0 24 24' display='inline-flex' width='1em' height='1em' xmlns='http://www.w3.org/2000/svg' %3E%3Cpath fill='none' stroke='currentColor' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='M7 6.362A9.7 9.7 0 0 1 12 5c6.307 0 9.367 5.683 9.91 6.808c.06.123.06.261 0 .385c-.352.728-1.756 3.362-4.41 5.131M14 18.8a10 10 0 0 1-2 .2c-6.307 0-9.367-5.683-9.91-6.808a.44.44 0 0 1 0-.386c.219-.452.84-1.632 1.91-2.885m6 .843A3 3 0 0 1 14.236 14M3 3l18 18'/%3E%3C/svg%3E");-webkit-mask:var(--un-icon) no-repeat;mask:var(--un-icon) no-repeat;-webkit-mask-size:100% 100%;mask-size:100% 100%;background-color:currentColor;color:inherit;display:inline-flex;width:1em;height:1em}.i-material-symbols-light\:bottom-panel-close{--un-icon:url("data:image/svg+xml;utf8,%3Csvg viewBox='0 0 24 24' display='inline-flex' width='1em' height='1em' xmlns='http://www.w3.org/2000/svg' %3E%3Cpath fill='currentColor' d='m12 11.596l3.173-3.192H8.827zM18.384 4q.672 0 1.144.472T20 5.616v12.769q0 .67-.472 1.143q-.472.472-1.143.472H5.615q-.67 0-1.143-.472Q4 19.056 4 18.385V5.615q0-.67.472-1.143Q4.944 4 5.616 4zM19 15V5.616q0-.231-.192-.424T18.384 5H5.616q-.231 0-.424.192T5 5.616V15z'/%3E%3C/svg%3E");-webkit-mask:var(--un-icon) no-repeat;mask:var(--un-icon) no-repeat;-webkit-mask-size:100% 100%;mask-size:100% 100%;background-color:currentColor;color:inherit;display:inline-flex;width:1em;height:1em}.i-material-symbols-light\:check-small-rounded{--un-icon:url("data:image/svg+xml;utf8,%3Csvg viewBox='0 0 24 24' display='inline-flex' width='1em' height='1em' xmlns='http://www.w3.org/2000/svg' %3E%3Cpath fill='currentColor' d='m10 14.312l6.246-6.266q.139-.14.353-.14q.215 0 .355.139t.14.354t-.14.355l-6.389 6.369q-.242.243-.565.243t-.565-.243l-2.389-2.37q-.14-.138-.14-.352t.139-.355t.354-.14t.355.14z'/%3E%3C/svg%3E");-webkit-mask:var(--un-icon) no-repeat;mask:var(--un-icon) no-repeat;-webkit-mask-size:100% 100%;mask-size:100% 100%;background-color:currentColor;color:inherit;display:inline-flex;width:1em;height:1em}.i-material-symbols-light\:close-small-rounded{--un-icon:url("data:image/svg+xml;utf8,%3Csvg viewBox='0 0 24 24' display='inline-flex' width='1em' height='1em' xmlns='http://www.w3.org/2000/svg' %3E%3Cpath fill='currentColor' d='m12 12.727l-3.244 3.252q-.161.16-.358.15t-.358-.17t-.16-.363t.16-.363L11.274 12L8.04 8.782q-.16-.161-.16-.367t.16-.368t.364-.16q.204 0 .363.16L12 11.298l3.219-3.252q.161-.16.358-.16t.358.16q.165.166.165.367t-.165.36L12.702 12l3.252 3.244q.16.161.16.358t-.16.358q-.166.165-.367.165t-.36-.165z'/%3E%3C/svg%3E");-webkit-mask:var(--un-icon) no-repeat;mask:var(--un-icon) no-repeat;-webkit-mask-size:100% 100%;mask-size:100% 100%;background-color:currentColor;color:inherit;display:inline-flex;width:1em;height:1em}.i-material-symbols-light\:drag-pan{--un-icon:url("data:image/svg+xml;utf8,%3Csvg viewBox='0 0 24 24' display='inline-flex' width='1em' height='1em' xmlns='http://www.w3.org/2000/svg' %3E%3Cpath fill='currentColor' d='M12 21.308L8.442 17.75l.714-.713L11.5 19.38V12.5H4.625l2.344 2.339l-.719.719L2.692 12l3.552-3.552l.714.714L4.619 11.5H11.5V4.62L9.156 6.963l-.714-.714L12 2.692l3.558 3.558l-.714.714L12.5 4.618V11.5h6.875l-2.344-2.339l.719-.719L21.308 12l-3.558 3.558l-.713-.714L19.38 12.5H12.5v6.875l2.339-2.344l.719.719z'/%3E%3C/svg%3E");-webkit-mask:var(--un-icon) no-repeat;mask:var(--un-icon) no-repeat;-webkit-mask-size:100% 100%;mask-size:100% 100%;background-color:currentColor;color:inherit;display:inline-flex;width:1em;height:1em}.i-material-symbols-light\:edit-square-sharp{--un-icon:url("data:image/svg+xml;utf8,%3Csvg viewBox='0 0 24 24' display='inline-flex' width='1em' height='1em' xmlns='http://www.w3.org/2000/svg' %3E%3Cpath fill='currentColor' d='M10 14v-2.615l9.683-9.683l2.56 2.564L12.518 14zm9.466-8.354l1.347-1.361l-1.111-1.17l-1.387 1.381zM4 20V4h10.002l-6.386 6.387v5.998h5.896L20 9.895V20z'/%3E%3C/svg%3E");-webkit-mask:var(--un-icon) no-repeat;mask:var(--un-icon) no-repeat;-webkit-mask-size:100% 100%;mask-size:100% 100%;background-color:currentColor;color:inherit;display:inline-flex;width:1em;height:1em}.i-material-symbols\:arrow-right-alt-rounded{--un-icon:url("data:image/svg+xml;utf8,%3Csvg viewBox='0 0 24 24' display='inline-flex' width='1em' height='1em' xmlns='http://www.w3.org/2000/svg' %3E%3Cpath fill='currentColor' d='M16.15 13H5q-.425 0-.712-.288T4 12t.288-.712T5 11h11.15L13.3 8.15q-.3-.3-.288-.7t.288-.7q.3-.3.713-.312t.712.287L19.3 11.3q.15.15.213.325t.062.375t-.062.375t-.213.325l-4.575 4.575q-.3.3-.712.288t-.713-.313q-.275-.3-.288-.7t.288-.7z'/%3E%3C/svg%3E");-webkit-mask:var(--un-icon) no-repeat;mask:var(--un-icon) no-repeat;-webkit-mask-size:100% 100%;mask-size:100% 100%;background-color:currentColor;color:inherit;display:inline-flex;width:1em;height:1em}.i-material-symbols\:code-rounded{--un-icon:url("data:image/svg+xml;utf8,%3Csvg viewBox='0 0 24 24' display='inline-flex' width='1em' height='1em' xmlns='http://www.w3.org/2000/svg' %3E%3Cpath fill='currentColor' d='M4.825 12.025L8.7 15.9q.275.275.275.7t-.275.7t-.7.275t-.7-.275l-4.6-4.6q-.15-.15-.213-.325T2.426 12t.063-.375t.212-.325l4.6-4.6q.3-.3.713-.3t.712.3t.3.713t-.3.712zm14.35-.05L15.3 8.1q-.275-.275-.275-.7t.275-.7t.7-.275t.7.275l4.6 4.6q.15.15.213.325t.062.375t-.062.375t-.213.325l-4.6 4.6q-.3.3-.7.288t-.7-.313t-.3-.712t.3-.713z'/%3E%3C/svg%3E");-webkit-mask:var(--un-icon) no-repeat;mask:var(--un-icon) no-repeat;-webkit-mask-size:100% 100%;mask-size:100% 100%;background-color:currentColor;color:inherit;display:inline-flex;width:1em;height:1em}.i-material-symbols\:keyboard-arrow-down{--un-icon:url("data:image/svg+xml;utf8,%3Csvg viewBox='0 0 24 24' display='inline-flex' width='1em' height='1em' xmlns='http://www.w3.org/2000/svg' %3E%3Cpath fill='currentColor' d='m12 15.4l-6-6L7.4 8l4.6 4.6L16.6 8L18 9.4z'/%3E%3C/svg%3E");-webkit-mask:var(--un-icon) no-repeat;mask:var(--un-icon) no-repeat;-webkit-mask-size:100% 100%;mask-size:100% 100%;background-color:currentColor;color:inherit;display:inline-flex;width:1em;height:1em}.i-material-symbols\:library-add-check-outline{--un-icon:url("data:image/svg+xml;utf8,%3Csvg viewBox='0 0 24 24' display='inline-flex' width='1em' height='1em' xmlns='http://www.w3.org/2000/svg' %3E%3Cpath fill='currentColor' d='m12.7 14.05l5.65-5.65l-1.4-1.45l-4.25 4.25l-2.15-2.1l-1.4 1.4zM8 18q-.825 0-1.412-.587T6 16V4q0-.825.588-1.412T8 2h12q.825 0 1.413.588T22 4v12q0 .825-.587 1.413T20 18zm0-2h12V4H8zm-4 6q-.825 0-1.412-.587T2 20V6h2v14h14v2zM8 4v12z'/%3E%3C/svg%3E");-webkit-mask:var(--un-icon) no-repeat;mask:var(--un-icon) no-repeat;-webkit-mask-size:100% 100%;mask-size:100% 100%;background-color:currentColor;color:inherit;display:inline-flex;width:1em;height:1em}.i-material-symbols\:network-node{--un-icon:url("data:image/svg+xml;utf8,%3Csvg viewBox='0 0 24 24' display='inline-flex' width='1em' height='1em' xmlns='http://www.w3.org/2000/svg' %3E%3Cpath fill='currentColor' d='M5.5 22q-1.45 0-2.475-1.025T2 18.5t1.025-2.475T5.5 15q.45 0 .875.112t.8.313L11 11.6V8.85q-1.1-.325-1.8-1.237T8.5 5.5q0-1.45 1.025-2.475T12 2t2.475 1.025T15.5 5.5q0 1.2-.7 2.113T13 8.85v2.75l3.85 3.825q.375-.2.788-.312T18.5 15q1.45 0 2.475 1.025T22 18.5t-1.025 2.475T18.5 22t-2.475-1.025T15 18.5q0-.45.112-.875t.313-.8L12 13.4l-3.425 3.425q.2.375.313.8T9 18.5q0 1.45-1.025 2.475T5.5 22m13-2q.625 0 1.063-.437T20 18.5t-.437-1.062T18.5 17t-1.062.438T17 18.5t.438 1.063T18.5 20M12 7q.625 0 1.063-.437T13.5 5.5t-.437-1.062T12 4t-1.062.438T10.5 5.5t.438 1.063T12 7M5.5 20q.625 0 1.063-.437T7 18.5t-.437-1.062T5.5 17t-1.062.438T4 18.5t.438 1.063T5.5 20'/%3E%3C/svg%3E");-webkit-mask:var(--un-icon) no-repeat;mask:var(--un-icon) no-repeat;-webkit-mask-size:100% 100%;mask-size:100% 100%;background-color:currentColor;color:inherit;display:inline-flex;width:1em;height:1em}.i-material-symbols\:service-toolbox-outline-rounded{--un-icon:url("data:image/svg+xml;utf8,%3Csvg viewBox='0 0 24 24' display='inline-flex' width='1em' height='1em' xmlns='http://www.w3.org/2000/svg' %3E%3Cpath fill='currentColor' d='M7 6V5q0-.825.588-1.412T9 3h6q.825 0 1.413.588T17 5v1h.7q.575 0 1.075.325t.725.875l2.35 5.4q.075.2.113.4t.037.4V18q0 .825-.587 1.413T20 20H4q-.825 0-1.412-.587T2 18v-4.6q0-.2.038-.4t.112-.4L4.5 7.2q.225-.55.725-.875T6.3 6zm2 0h6V5H9zm-2 6v-.025q0-.425.288-.712T8 10.974t.713.288t.287.712V12h6v-.025q0-.425.288-.712t.712-.288t.713.288t.287.712V12h2.4l-1.7-4H6.3l-1.7 4zm0 2H4v4h16v-4h-3v.025q0 .425-.288.713t-.712.287t-.712-.288t-.288-.712V14H9v.025q0 .425-.288.713T8 15.025t-.712-.288T7 14.026zm5 0'/%3E%3C/svg%3E");-webkit-mask:var(--un-icon) no-repeat;mask:var(--un-icon) no-repeat;-webkit-mask-size:100% 100%;mask-size:100% 100%;background-color:currentColor;color:inherit;display:inline-flex;width:1em;height:1em}.i-material-symbols\:settings-outline{--un-icon:url("data:image/svg+xml;utf8,%3Csvg viewBox='0 0 24 24' display='inline-flex' width='1em' height='1em' xmlns='http://www.w3.org/2000/svg' %3E%3Cpath fill='currentColor' d='m9.25 22l-.4-3.2q-.325-.125-.612-.3t-.563-.375L4.7 19.375l-2.75-4.75l2.575-1.95Q4.5 12.5 4.5 12.338v-.675q0-.163.025-.338L1.95 9.375l2.75-4.75l2.975 1.25q.275-.2.575-.375t.6-.3l.4-3.2h5.5l.4 3.2q.325.125.613.3t.562.375l2.975-1.25l2.75 4.75l-2.575 1.95q.025.175.025.338v.674q0 .163-.05.338l2.575 1.95l-2.75 4.75l-2.95-1.25q-.275.2-.575.375t-.6.3l-.4 3.2zM11 20h1.975l.35-2.65q.775-.2 1.438-.587t1.212-.938l2.475 1.025l.975-1.7l-2.15-1.625q.125-.35.175-.737T17.5 12t-.05-.787t-.175-.738l2.15-1.625l-.975-1.7l-2.475 1.05q-.55-.575-1.212-.962t-1.438-.588L13 4h-1.975l-.35 2.65q-.775.2-1.437.588t-1.213.937L5.55 7.15l-.975 1.7l2.15 1.6q-.125.375-.175.75t-.05.8q0 .4.05.775t.175.75l-2.15 1.625l.975 1.7l2.475-1.05q.55.575 1.213.963t1.437.587zm1.05-4.5q1.45 0 2.475-1.025T15.55 12t-1.025-2.475T12.05 8.5q-1.475 0-2.488 1.025T8.55 12t1.013 2.475T12.05 15.5M12 12'/%3E%3C/svg%3E");-webkit-mask:var(--un-icon) no-repeat;mask:var(--un-icon) no-repeat;-webkit-mask-size:100% 100%;mask-size:100% 100%;background-color:currentColor;color:inherit;display:inline-flex;width:1em;height:1em}.i-mdi-github{--un-icon:url("data:image/svg+xml;utf8,%3Csvg viewBox='0 0 24 24' display='inline-flex' width='1em' height='1em' xmlns='http://www.w3.org/2000/svg' %3E%3Cpath fill='currentColor' d='M12 2A10 10 0 0 0 2 12c0 4.42 2.87 8.17 6.84 9.5c.5.08.66-.23.66-.5v-1.69c-2.77.6-3.36-1.34-3.36-1.34c-.46-1.16-1.11-1.47-1.11-1.47c-.91-.62.07-.6.07-.6c1 .07 1.53 1.03 1.53 1.03c.87 1.52 2.34 1.07 2.91.83c.09-.65.35-1.09.63-1.34c-2.22-.25-4.55-1.11-4.55-4.92c0-1.11.38-2 1.03-2.71c-.1-.25-.45-1.29.1-2.64c0 0 .84-.27 2.75 1.02c.79-.22 1.65-.33 2.5-.33s1.71.11 2.5.33c1.91-1.29 2.75-1.02 2.75-1.02c.55 1.35.2 2.39.1 2.64c.65.71 1.03 1.6 1.03 2.71c0 3.82-2.34 4.66-4.57 4.91c.36.31.69.92.69 1.85V21c0 .27.16.59.67.5C19.14 20.16 22 16.42 22 12A10 10 0 0 0 12 2'/%3E%3C/svg%3E");-webkit-mask:var(--un-icon) no-repeat;mask:var(--un-icon) no-repeat;-webkit-mask-size:100% 100%;mask-size:100% 100%;background-color:currentColor;color:inherit;display:inline-flex;width:1em;height:1em}.i-mdi\:earth{--un-icon:url("data:image/svg+xml;utf8,%3Csvg viewBox='0 0 24 24' display='inline-flex' width='1em' height='1em' xmlns='http://www.w3.org/2000/svg' %3E%3Cpath fill='currentColor' d='M17.9 17.39c-.26-.8-1.01-1.39-1.9-1.39h-1v-3a1 1 0 0 0-1-1H8v-2h2a1 1 0 0 0 1-1V7h2a2 2 0 0 0 2-2v-.41a7.984 7.984 0 0 1 2.9 12.8M11 19.93c-3.95-.49-7-3.85-7-7.93c0-.62.08-1.22.21-1.79L9 15v1a2 2 0 0 0 2 2m1-16A10 10 0 0 0 2 12a10 10 0 0 0 10 10a10 10 0 0 0 10-10A10 10 0 0 0 12 2'/%3E%3C/svg%3E");-webkit-mask:var(--un-icon) no-repeat;mask:var(--un-icon) no-repeat;-webkit-mask-size:100% 100%;mask-size:100% 100%;background-color:currentColor;color:inherit;display:inline-flex;width:1em;height:1em}.i-menu\:account{background:url("data:image/svg+xml;utf8,%3Csvg display='inline-flex' width='24' height='24' viewBox='0 0 24 24' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M5 19C5.73154 17.7785 6.75968 16.7689 7.98558 16.0684C9.21148 15.368 10.5939 15 12 15C13.4061 15 14.7885 15.368 16.0144 16.0684C17.2403 16.7689 18.2685 17.7785 19 19' stroke='%233A424D' stroke-width='1.5' stroke-linecap='square' stroke-linejoin='round'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M12 12C14.2091 12 16 10.2092 16 8.00002C16 5.79087 14.2091 4 12 4C9.79086 4 8 5.79087 8 8.00002C8 10.2092 9.79086 12 12 12Z' stroke='%233BAF52' stroke-width='1.5' stroke-linecap='round' stroke-linejoin='round'/%3E%3C/svg%3E") no-repeat;background-size:100% 100%;background-color:transparent;display:inline-flex;width:24;height:24}.i-menu\:account-active,.i-menu\:dark-account-active{background:url("data:image/svg+xml;utf8,%3Csvg display='inline-flex' width='24' height='24' viewBox='0 0 24 24' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M5 19C5.73154 17.7785 6.75968 16.7689 7.98558 16.0684C9.21148 15.368 10.5939 15 12 15C13.4061 15 14.7885 15.368 16.0144 16.0684C17.2403 16.7689 18.2685 17.7785 19 19' stroke='white' stroke-width='1.5' stroke-linecap='square' stroke-linejoin='round'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M12 12C14.2091 12 16 10.2092 16 8.00002C16 5.79087 14.2091 4 12 4C9.79086 4 8 5.79087 8 8.00002C8 10.2092 9.79086 12 12 12Z' fill='white' stroke='white' stroke-width='1.5' stroke-linecap='round' stroke-linejoin='round'/%3E%3C/svg%3E") no-repeat;background-size:100% 100%;background-color:transparent;display:inline-flex;width:24;height:24}.i-menu\:app{background:url("data:image/svg+xml;utf8,%3Csvg display='inline-flex' width='24' height='24' viewBox='0 0 24 24' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M5.5 4H18.5L20 20H4L5.5 4Z' stroke='%233A424D' stroke-width='1.5'/%3E%3Cpath d='M9 8C9.42857 8.66667 10.2857 10 12 10C13.7143 10 14.5714 8.5 15 8' stroke='%233BAF52' stroke-width='1.5'/%3E%3C/svg%3E") no-repeat;background-size:100% 100%;background-color:transparent;display:inline-flex;width:24;height:24}.i-menu\:app-active{background:url("data:image/svg+xml;utf8,%3Csvg display='inline-flex' width='24' height='24' viewBox='0 0 24 24' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M5.5 4H18.5L20 20H4L5.5 4Z' fill='white' stroke='white' stroke-width='1.5'/%3E%3Cpath d='M9 8C9.42857 8.66667 10.2857 10 12 10C13.7143 10 14.5714 8.5 15 8' stroke='%233BAF52' stroke-width='1.5'/%3E%3C/svg%3E") no-repeat;background-size:100% 100%;background-color:transparent;display:inline-flex;width:24;height:24}.i-menu\:cron{background:url("data:image/svg+xml;utf8,%3Csvg display='inline-flex' width='24' height='24' viewBox='0 0 24 24' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cg clip-path='url(%23clip0_1_170)'%3E%3Cpath d='M12.5 21C17.1944 21 21 17.1944 21 12.5C21 7.80558 17.1944 4 12.5 4C7.80558 4 4 7.80558 4 12.5C4 17.1944 7.80558 21 12.5 21Z' stroke='%233A424D' stroke-width='1.5' stroke-linecap='square' stroke-linejoin='round'/%3E%3Cpath d='M12 9V12.75L15 14.5' stroke='%233BAF52' stroke-width='1.5' stroke-linecap='square'/%3E%3C/g%3E%3Cdefs%3E%3CclipPath id='clip0_1_170'%3E%3Crect width='24' height='24' fill='white'/%3E%3C/clipPath%3E%3C/defs%3E%3C/svg%3E") no-repeat;background-size:100% 100%;background-color:transparent;display:inline-flex;width:24;height:24}.i-menu\:cron-active{background:url("data:image/svg+xml;utf8,%3Csvg display='inline-flex' width='24' height='24' viewBox='0 0 24 24' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cg clip-path='url(%23clip0_3_159)'%3E%3Cpath d='M12.5 21C17.1944 21 21 17.1944 21 12.5C21 7.80558 17.1944 4 12.5 4C7.80558 4 4 7.80558 4 12.5C4 17.1944 7.80558 21 12.5 21Z' fill='white' stroke='white' stroke-width='1.5' stroke-linecap='square' stroke-linejoin='round'/%3E%3Cpath d='M12 9V12.75L15 14.5' stroke='%233BAF52' stroke-width='1.5' stroke-linecap='square'/%3E%3C/g%3E%3Cdefs%3E%3CclipPath id='clip0_3_159'%3E%3Crect width='24' height='24' fill='white'/%3E%3C/clipPath%3E%3C/defs%3E%3C/svg%3E") no-repeat;background-size:100% 100%;background-color:transparent;display:inline-flex;width:24;height:24}.i-menu\:dark-account{background:url("data:image/svg+xml;utf8,%3Csvg display='inline-flex' width='24' height='24' viewBox='0 0 24 24' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M5 19C5.73154 17.7785 6.75968 16.7689 7.98558 16.0684C9.21148 15.368 10.5939 15 12 15C13.4061 15 14.7885 15.368 16.0144 16.0684C17.2403 16.7689 18.2685 17.7785 19 19' stroke='%23919191' stroke-width='1.5' stroke-linecap='square' stroke-linejoin='round'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M12 12C14.2091 12 16 10.2092 16 8.00002C16 5.79087 14.2091 4 12 4C9.79086 4 8 5.79087 8 8.00002C8 10.2092 9.79086 12 12 12Z' stroke='%23919191' stroke-width='1.5' stroke-linecap='round' stroke-linejoin='round'/%3E%3C/svg%3E") no-repeat;background-size:100% 100%;background-color:transparent;display:inline-flex;width:24;height:24}.i-menu\:dark-app{background:url("data:image/svg+xml;utf8,%3Csvg display='inline-flex' width='24' height='24' viewBox='0 0 24 24' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M5.5 4H18.5L20 20H4L5.5 4Z' stroke='%23919191' stroke-width='1.5'/%3E%3Cpath d='M9 8C9.42857 8.66667 10.2857 10 12 10C13.7143 10 14.5714 8.5 15 8' stroke='%23919191' stroke-width='1.5'/%3E%3C/svg%3E") no-repeat;background-size:100% 100%;background-color:transparent;display:inline-flex;width:24;height:24}.i-menu\:dark-app-active{background:url("data:image/svg+xml;utf8,%3Csvg display='inline-flex' width='24' height='24' viewBox='0 0 24 24' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M5.5 4H18.5L20 20H4L5.5 4Z' fill='white' stroke='white' stroke-width='1.5'/%3E%3Cpath d='M9 8C9.42857 8.66667 10.2857 10 12 10C13.7143 10 14.5714 8.5 15 8' stroke='%23202020' stroke-width='1.5'/%3E%3C/svg%3E") no-repeat;background-size:100% 100%;background-color:transparent;display:inline-flex;width:24;height:24}.i-menu\:dark-cron{background:url("data:image/svg+xml;utf8,%3Csvg display='inline-flex' width='24' height='24' viewBox='0 0 24 24' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cg clip-path='url(%23clip0_1_170)'%3E%3Cpath d='M12.5 21C17.1944 21 21 17.1944 21 12.5C21 7.80558 17.1944 4 12.5 4C7.80558 4 4 7.80558 4 12.5C4 17.1944 7.80558 21 12.5 21Z' stroke='%23919191' stroke-width='1.5' stroke-linecap='square' stroke-linejoin='round'/%3E%3Cpath d='M12 9V12.75L15 14.5' stroke='%23919191' stroke-width='1.5' stroke-linecap='square'/%3E%3C/g%3E%3Cdefs%3E%3CclipPath id='clip0_1_170'%3E%3Crect width='24' height='24' fill='white'/%3E%3C/clipPath%3E%3C/defs%3E%3C/svg%3E") no-repeat;background-size:100% 100%;background-color:transparent;display:inline-flex;width:24;height:24}.i-menu\:dark-cron-active{background:url("data:image/svg+xml;utf8,%3Csvg display='inline-flex' width='24' height='24' viewBox='0 0 24 24' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cg clip-path='url(%23clip0_3_159)'%3E%3Cpath d='M12.5 21C17.1944 21 21 17.1944 21 12.5C21 7.80558 17.1944 4 12.5 4C7.80558 4 4 7.80558 4 12.5C4 17.1944 7.80558 21 12.5 21Z' fill='white' stroke='white' stroke-width='1.5' stroke-linecap='square' stroke-linejoin='round'/%3E%3Cpath d='M12 9V12.75L15 14.5' stroke='%23202020' stroke-width='1.5' stroke-linecap='square'/%3E%3C/g%3E%3Cdefs%3E%3CclipPath id='clip0_3_159'%3E%3Crect width='24' height='24' fill='white'/%3E%3C/clipPath%3E%3C/defs%3E%3C/svg%3E") no-repeat;background-size:100% 100%;background-color:transparent;display:inline-flex;width:24;height:24}.i-menu\:dark-database{background:url("data:image/svg+xml;utf8,%3Csvg display='inline-flex' width='24' height='24' viewBox='0 0 24 24' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cg clip-path='url(%23clip0_1_62)'%3E%3Cpath d='M19 15.2216C18.5033 16.3991 17.7263 17.4367 16.7371 18.2437C15.7478 19.0507 14.5764 19.6025 13.3253 19.8509C12.0741 20.0992 10.7813 20.0366 9.55992 19.6685C8.33849 19.3004 7.22562 18.638 6.31861 17.7391C5.41159 16.8403 4.73805 15.7325 4.35687 14.5125C3.97568 13.2924 3.89846 11.9974 4.13196 10.7405C4.36546 9.48371 4.90256 8.30333 5.69631 7.30262C6.49006 6.30191 7.51629 5.51133 8.68528 5' stroke='%23919191' stroke-width='1.5' stroke-linecap='square' stroke-linejoin='round'/%3E%3Cpath d='M20 12C20 10.9488 19.7931 9.90792 19.391 8.93676C18.989 7.96559 18.3997 7.08316 17.6569 6.33986C16.914 5.59656 16.0321 5.00695 15.0615 4.60468C14.0909 4.2024 13.0506 4 12 4V12H20Z' stroke='%23919191' stroke-width='1.5' stroke-linecap='square' stroke-linejoin='round'/%3E%3C/g%3E%3Cdefs%3E%3CclipPath id='clip0_1_62'%3E%3Crect width='24' height='24' fill='white'/%3E%3C/clipPath%3E%3C/defs%3E%3C/svg%3E") no-repeat;background-size:100% 100%;background-color:transparent;display:inline-flex;width:24;height:24}.i-menu\:dark-database-active,.i-menu\:database-active{background:url("data:image/svg+xml;utf8,%3Csvg display='inline-flex' width='24' height='24' viewBox='0 0 24 24' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cg clip-path='url(%23clip0_3_51)'%3E%3Cpath d='M19 15.2216C18.5033 16.3991 17.7263 17.4367 16.7371 18.2437C15.7478 19.0507 14.5764 19.6025 13.3253 19.8509C12.0741 20.0992 10.7813 20.0366 9.55992 19.6685C8.33849 19.3004 7.22562 18.638 6.31861 17.7391C5.41159 16.8403 4.73805 15.7325 4.35687 14.5125C3.97568 13.2924 3.89846 11.9974 4.13196 10.7405C4.36546 9.48371 4.90256 8.30333 5.69631 7.30262C6.49006 6.30191 7.51629 5.51133 8.68528 5' stroke='white' stroke-width='1.5' stroke-linecap='square' stroke-linejoin='round'/%3E%3Cpath d='M20 12C20 10.9488 19.7931 9.90792 19.391 8.93676C18.989 7.96559 18.3997 7.08316 17.6569 6.33986C16.914 5.59656 16.0321 5.00695 15.0615 4.60468C14.0909 4.2024 13.0506 4 12 4V12H20Z' fill='white' stroke='white' stroke-width='1.5' stroke-linecap='square' stroke-linejoin='round'/%3E%3C/g%3E%3Cdefs%3E%3CclipPath id='clip0_3_51'%3E%3Crect width='24' height='24' fill='white'/%3E%3C/clipPath%3E%3C/defs%3E%3C/svg%3E") no-repeat;background-size:100% 100%;background-color:transparent;display:inline-flex;width:24;height:24}.i-menu\:dark-docker{background:url("data:image/svg+xml;utf8,%3Csvg display='inline-flex' width='24' height='24' viewBox='0 0 24 24' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cg clip-path='url(%23clip0_1_69)'%3E%3Cpath d='M4.5 18C6 17.8333 9.3 17 10.5 15' stroke='%23919191' stroke-width='1.5'/%3E%3Crect x='5' y='8' width='4' height='4' stroke='%23919191' stroke-width='1.5' stroke-linecap='square'/%3E%3Crect x='9' y='8' width='4' height='4' stroke='%23919191' stroke-width='1.5' stroke-linecap='square'/%3E%3Crect x='9' y='4' width='4' height='4' stroke='%23919191' stroke-width='1.5' stroke-linecap='square'/%3E%3Cpath d='M15.186 12H2C2.16279 14.4267 3.95349 20 9.81395 20C17.1395 20 19.093 13.76 19.5814 12.72C21.0465 12.72 23 11.16 23 10.64C22.1433 10.1839 20.5351 10.5279 19.8232 10.6193C19.7235 10.6321 19.6414 10.64 19.5814 10.64C20.0698 10.12 19.093 7.52 18.1163 7C17.3349 8.248 17.4651 10.64 17.6279 11.68C17.6471 11.8023 17.1395 12 15.186 12Z' stroke='%23919191' stroke-width='1.5' stroke-linecap='square'/%3E%3C/g%3E%3Cdefs%3E%3CclipPath id='clip0_1_69'%3E%3Crect width='24' height='24' fill='white'/%3E%3C/clipPath%3E%3C/defs%3E%3C/svg%3E") no-repeat;background-size:100% 100%;background-color:transparent;display:inline-flex;width:24;height:24}.i-menu\:dark-docker-active{background:url("data:image/svg+xml;utf8,%3Csvg display='inline-flex' width='24' height='24' viewBox='0 0 24 24' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cg clip-path='url(%23clip0_3_58)'%3E%3Crect x='5' y='8' width='4' height='4' stroke='white' stroke-width='1.5' stroke-linecap='square'/%3E%3Crect x='9' y='8' width='4' height='4' stroke='white' stroke-width='1.5' stroke-linecap='square'/%3E%3Crect x='9' y='4' width='4' height='4' stroke='white' stroke-width='1.5' stroke-linecap='square'/%3E%3Cpath d='M15.186 12H2C2.16279 14.4267 3.95349 20 9.81395 20C17.1395 20 19.093 13.76 19.5814 12.72C21.0465 12.72 23 11.16 23 10.64C22.1433 10.1839 20.5351 10.5279 19.8232 10.6193C19.7235 10.6321 19.6414 10.64 19.5814 10.64C20.0698 10.12 19.093 7.52 18.1163 7C17.3349 8.248 17.4651 10.64 17.6279 11.68C17.6471 11.8023 17.1395 12 15.186 12Z' fill='white' stroke='white' stroke-width='1.5' stroke-linecap='square'/%3E%3Cpath d='M4.5 18C6 17.8333 9.3 17 10.5 15' stroke='%23202020' stroke-width='1.5'/%3E%3C/g%3E%3Cdefs%3E%3CclipPath id='clip0_3_58'%3E%3Crect width='24' height='24' fill='white'/%3E%3C/clipPath%3E%3C/defs%3E%3C/svg%3E") no-repeat;background-size:100% 100%;background-color:transparent;display:inline-flex;width:24;height:24}.i-menu\:dark-domain{background:url("data:image/svg+xml;utf8,%3Csvg display='inline-flex' width='24' height='24' viewBox='0 0 24 24' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M11.5 10V15' stroke='%23919191' stroke-width='1.5'/%3E%3Cpath d='M7.5 11V14' stroke='%23919191' stroke-width='1.5'/%3E%3Cpath d='M15.5 11V14' stroke='%23919191' stroke-width='1.5'/%3E%3Cpath d='M9 4H4V9' stroke='%23919191' stroke-width='1.5' stroke-linecap='square'/%3E%3Cpath d='M15 4H20V9' stroke='%23919191' stroke-width='1.5' stroke-linecap='square'/%3E%3Cpath d='M9 21H4V16' stroke='%23919191' stroke-width='1.5' stroke-linecap='square'/%3E%3Cpath d='M15 21H20V16' stroke='%23919191' stroke-width='1.5' stroke-linecap='square'/%3E%3C/svg%3E") no-repeat;background-size:100% 100%;background-color:transparent;display:inline-flex;width:24;height:24}.i-menu\:dark-domain-active,.i-menu\:domain-active{background:url("data:image/svg+xml;utf8,%3Csvg display='inline-flex' width='24' height='24' viewBox='0 0 24 24' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M11.5 10V15' stroke='white' stroke-width='1.5'/%3E%3Cpath d='M7.5 11V14' stroke='white' stroke-width='1.5'/%3E%3Cpath d='M15.5 11V14' stroke='white' stroke-width='1.5'/%3E%3Cpath d='M9 4H4V9' stroke='white' stroke-width='1.5' stroke-linecap='square'/%3E%3Cpath d='M15 4H20V9' stroke='white' stroke-width='1.5' stroke-linecap='square'/%3E%3Cpath d='M9 21H4V16' stroke='white' stroke-width='1.5' stroke-linecap='square'/%3E%3Cpath d='M15 21H20V16' stroke='white' stroke-width='1.5' stroke-linecap='square'/%3E%3C/svg%3E") no-repeat;background-size:100% 100%;background-color:transparent;display:inline-flex;width:24;height:24}.i-menu\:dark-files{background:url("data:image/svg+xml;utf8,%3Csvg display='inline-flex' width='24' height='24' viewBox='0 0 24 24' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cg clip-path='url(%23clip0_1_118)'%3E%3Cpath d='M10.5 7H20V19.5H3V4H8.5L10.5 7Z' stroke='%23919191' stroke-width='1.5' stroke-linecap='round'/%3E%3Cpath d='M7 15L16 15' stroke='%23919191' stroke-width='1.5'/%3E%3C/g%3E%3Cdefs%3E%3CclipPath id='clip0_1_118'%3E%3Crect width='24' height='24' fill='white'/%3E%3C/clipPath%3E%3C/defs%3E%3C/svg%3E") no-repeat;background-size:100% 100%;background-color:transparent;display:inline-flex;width:24;height:24}.i-menu\:dark-files-active{background:url("data:image/svg+xml;utf8,%3Csvg display='inline-flex' width='24' height='24' viewBox='0 0 24 24' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cg clip-path='url(%23clip0_3_107)'%3E%3Cpath d='M10.5 7H20V19.5H3V4H8.5L10.5 7Z' fill='white' stroke='white' stroke-width='1.5' stroke-linecap='round'/%3E%3Cpath d='M7 15L16 15' stroke='%23202020' stroke-width='1.5'/%3E%3C/g%3E%3Cdefs%3E%3CclipPath id='clip0_3_107'%3E%3Crect width='24' height='24' fill='white'/%3E%3C/clipPath%3E%3C/defs%3E%3C/svg%3E") no-repeat;background-size:100% 100%;background-color:transparent;display:inline-flex;width:24;height:24}.i-menu\:dark-ftp{background:url("data:image/svg+xml;utf8,%3Csvg display='inline-flex' width='24' height='24' viewBox='0 0 24 24' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M19.5356 7.53514L15.7256 3.7254L14.9999 2.99974' stroke='%23919191' stroke-width='1.5'/%3E%3Cpath d='M19.9999 7.99963L6.65991 7.99963L4.49991 7.99963' stroke='%23919191' stroke-width='1.5'/%3E%3Cpath d='M4.96427 15.4646L7.93412 18.4344L9.49991 20' stroke='%23919191' stroke-width='1.5'/%3E%3Cpath d='M4.49991 15.0001L17.8399 15.0001L19.9999 15.0001' stroke='%23919191' stroke-width='1.5'/%3E%3C/svg%3E") no-repeat;background-size:100% 100%;background-color:transparent;display:inline-flex;width:24;height:24}.i-menu\:dark-ftp-active,.i-menu\:ftp-active{background:url("data:image/svg+xml;utf8,%3Csvg display='inline-flex' width='24' height='24' viewBox='0 0 24 24' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M19.5356 7.53514L15.7256 3.7254L14.9999 2.99974' stroke='white' stroke-width='1.5'/%3E%3Cpath d='M19.9999 7.99963L6.65991 7.99963L4.49991 7.99963' stroke='white' stroke-width='1.5'/%3E%3Cpath d='M4.96426 15.4646L7.93411 18.4344L9.49991 20' stroke='white' stroke-width='1.5'/%3E%3Cpath d='M4.49991 15.0001L17.8399 15.0001L19.9999 15.0001' stroke='white' stroke-width='1.5'/%3E%3C/svg%3E") no-repeat;background-size:100% 100%;background-color:transparent;display:inline-flex;width:24;height:24}.i-menu\:dark-home{background:url("data:image/svg+xml;utf8,%3Csvg display='inline-flex' width='24' height='24' viewBox='0 0 24 24' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M2 11.5L11.5 3L21 11.5' stroke='%23919191' stroke-width='1.5' stroke-linecap='square'/%3E%3Cpath d='M5 9L4.49129 8.4489C4.33748 8.59088 4.25 8.79068 4.25 9H5ZM5 20H4.25V20.75H5V20ZM18 20V20.75H18.75V20H18ZM18 9H18.75C18.75 8.79068 18.6625 8.59088 18.5087 8.4489L18 9ZM11.5 3L12.0087 2.4489C11.7214 2.1837 11.2786 2.1837 10.9913 2.4489L11.5 3ZM5 9H4.25V20H5H5.75V9H5ZM5 20V20.75H18V20V19.25H5V20ZM18 20H18.75V9H18H17.25V20H18ZM18 9L18.5087 8.4489L12.0087 2.4489L11.5 3L10.9913 3.5511L17.4913 9.5511L18 9ZM11.5 3L10.9913 2.4489L4.49129 8.4489L5 9L5.50871 9.5511L12.0087 3.5511L11.5 3Z' fill='%23919191'/%3E%3Cpath d='M14 12L9.5 16.5' stroke='%23919191' stroke-width='1.5'/%3E%3C/svg%3E") no-repeat;background-size:100% 100%;background-color:transparent;display:inline-flex;width:24;height:24}.i-menu\:dark-home-active{background:url("data:image/svg+xml;utf8,%3Csvg display='inline-flex' width='24' height='24' viewBox='0 0 24 24' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M2 11.5L11.5 3L21 11.5' stroke='white' stroke-width='1.5' stroke-linecap='square'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M5 9V20H18V9L11.5 3L5 9Z' fill='white'/%3E%3Cpath d='M5 9L4.49129 8.4489C4.33748 8.59088 4.25 8.79068 4.25 9H5ZM5 20H4.25V20.75H5V20ZM18 20V20.75H18.75V20H18ZM18 9H18.75C18.75 8.79068 18.6625 8.59088 18.5087 8.4489L18 9ZM11.5 3L12.0087 2.4489C11.7214 2.1837 11.2786 2.1837 10.9913 2.4489L11.5 3ZM5 9H4.25V20H5H5.75V9H5ZM5 20V20.75H18V20V19.25H5V20ZM18 20H18.75V9H18H17.25V20H18ZM18 9L18.5087 8.4489L12.0087 2.4489L11.5 3L10.9913 3.5511L17.4913 9.5511L18 9ZM11.5 3L10.9913 2.4489L4.49129 8.4489L5 9L5.50871 9.5511L12.0087 3.5511L11.5 3Z' fill='white'/%3E%3Cpath d='M14 12L9.5 16.5' stroke='%23202020' stroke-width='1.5'/%3E%3C/svg%3E") no-repeat;background-size:100% 100%;background-color:transparent;display:inline-flex;width:24;height:24}.i-menu\:dark-logout{background:url("data:image/svg+xml;utf8,%3Csvg display='inline-flex' width='24' height='24' viewBox='0 0 24 24' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M20 12H9.67226H8' stroke='%23919191' stroke-width='1.5'/%3E%3Cpath d='M16 8L20 12L16 16' stroke='%23919191' stroke-width='1.5'/%3E%3Cpath d='M10 4H5V20H10' stroke='%23919191' stroke-width='1.5' stroke-linecap='square' stroke-linejoin='round'/%3E%3C/svg%3E") no-repeat;background-size:100% 100%;background-color:transparent;display:inline-flex;width:24;height:24}.i-menu\:dark-logout-active,.i-menu\:logout-active{background:url("data:image/svg+xml;utf8,%3Csvg display='inline-flex' width='24' height='24' viewBox='0 0 24 24' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M20 12H9.67226H8' stroke='white' stroke-width='1.5'/%3E%3Cpath d='M16 8L20 12L16 16' stroke='white' stroke-width='1.5'/%3E%3Cpath d='M10 4H5V20H10' stroke='white' stroke-width='1.5' stroke-linecap='square' stroke-linejoin='round'/%3E%3C/svg%3E") no-repeat;background-size:100% 100%;background-color:transparent;display:inline-flex;width:24;height:24}.i-menu\:dark-logs{background:url("data:image/svg+xml;utf8,%3Csvg display='inline-flex' width='24' height='24' viewBox='0 0 24 24' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M17.5 5.49994L15 2.99994L4 2.99999V21H20V7.99994L17.5 5.49994Z' stroke='%23919191' stroke-width='1.5' stroke-linecap='round'/%3E%3Cpath d='M8 11L12 11' stroke='%23919191' stroke-width='1.5'/%3E%3Cpath d='M8 15L16 15' stroke='%23919191' stroke-width='1.5'/%3E%3C/svg%3E") no-repeat;background-size:100% 100%;background-color:transparent;display:inline-flex;width:24;height:24}.i-menu\:dark-logs-active{background:url("data:image/svg+xml;utf8,%3Csvg display='inline-flex' width='24' height='24' viewBox='0 0 24 24' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M17.5 5.49994L15 2.99994L4 2.99999V21H20V7.99994L17.5 5.49994Z' fill='white' stroke='white' stroke-width='1.5' stroke-linecap='round'/%3E%3Cpath d='M8 11L12 11' stroke='%23202020' stroke-width='1.5'/%3E%3Cpath d='M8 15L16 15' stroke='%23202020' stroke-width='1.5'/%3E%3C/svg%3E") no-repeat;background-size:100% 100%;background-color:transparent;display:inline-flex;width:24;height:24}.i-menu\:dark-mail{background:url("data:image/svg+xml;utf8,%3Csvg display='inline-flex' width='24' height='24' viewBox='0 0 24 24' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M20 5H3V18H20V5Z' stroke='%23919191' stroke-width='1.5' stroke-linecap='round'/%3E%3Cpath d='M6 8L11.5 12L17 8' stroke='%23919191' stroke-width='1.5'/%3E%3C/svg%3E") no-repeat;background-size:100% 100%;background-color:transparent;display:inline-flex;width:24;height:24}.i-menu\:dark-mail-active{background:url("data:image/svg+xml;utf8,%3Csvg display='inline-flex' width='24' height='24' viewBox='0 0 24 24' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M20 5H3V18H20V5Z' fill='white' stroke='white' stroke-width='1.5' stroke-linecap='round'/%3E%3Cpath d='M6 8L11.5 12L17 8' stroke='%23202020' stroke-width='1.5'/%3E%3C/svg%3E") no-repeat;background-size:100% 100%;background-color:transparent;display:inline-flex;width:24;height:24}.i-menu\:dark-monitor{background:url("data:image/svg+xml;utf8,%3Csvg display='inline-flex' width='24' height='24' viewBox='0 0 24 24' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M19.0574 4.10237L20 4V17L19.0574 16.8976C14.0339 16.3521 8.96611 16.3521 3.94262 16.8976L3 17V4L3.94262 4.10237C8.9661 4.6479 14.0339 4.6479 19.0574 4.10237Z' stroke='%23919191' stroke-width='1.5'/%3E%3Cpath d='M8 11.8L10 10L12.375 12L15 10' stroke='%23919191' stroke-width='1.5' stroke-linecap='square'/%3E%3Cpath d='M11.5 16.5V20' stroke='%23919191' stroke-width='1.5' stroke-linecap='round' stroke-linejoin='round'/%3E%3Cpath d='M8 20.5H15' stroke='%23919191' stroke-width='1.5' stroke-linecap='square' stroke-linejoin='round'/%3E%3C/svg%3E") no-repeat;background-size:100% 100%;background-color:transparent;display:inline-flex;width:24;height:24}.i-menu\:dark-monitor-active{background:url("data:image/svg+xml;utf8,%3Csvg display='inline-flex' width='24' height='24' viewBox='0 0 24 24' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M19.0574 4.10237L20 4V17L19.0574 16.8976C14.0339 16.3521 8.96611 16.3521 3.94262 16.8976L3 17V4L3.94262 4.10237C8.9661 4.6479 14.0339 4.6479 19.0574 4.10237Z' fill='white' stroke='white' stroke-width='1.5'/%3E%3Cpath d='M8 11.8L10 10L12.375 12L15 10' stroke='%23202020' stroke-width='1.5' stroke-linecap='square'/%3E%3Cpath d='M11.5 16.5V20' stroke='white' stroke-width='1.5' stroke-linecap='round' stroke-linejoin='round'/%3E%3Cpath d='M8 20.5H15' stroke='white' stroke-width='1.5' stroke-linecap='square' stroke-linejoin='round'/%3E%3C/svg%3E") no-repeat;background-size:100% 100%;background-color:transparent;display:inline-flex;width:24;height:24}.i-menu\:dark-node{background:url("data:image/svg+xml;utf8,%3Csvg display='inline-flex' class='icon' width='200px' height='200px' viewBox='0 0 1024 1024' xmlns='http://www.w3.org/2000/svg'%3E%3C!-- 1. 外边框 (Hexagon Outer) --%3E%3Cpath id='outer' fill='%23919191' d='M512.3 66.2 L124.9 289.7 v447 l387.4 223.5 l387.4 -223.5 v-447 L512.3 66.2 z'/%3E%3C!-- 1. 中心孔 (Hexagon Center Hole) --%3E%3Cpath id='center-hole' fill='%23919191' d='M512,288 L662,374 L662,546 L512,632 L362,546 L362,374 Z' transform='translate(0, 50)'/%3E%3C!-- 2. 顶部色块 (Top Section) --%3E%3Cpath id='top' fill='%23202020' d='M806.8 318.5 l-144.7 83.6 l-149.3 -85.6 l-149.5 85.9 L218 318.6 l294.3 -169.8 l294.5 169.7 z'/%3E%3C!-- 3. 左下色块 (Bottom Left Section) --%3E%3Cpath id='bottom-left' fill='%23202020' d='M187.8 363.8 l153.8 88.8 v150 l139.3 79.1 v187.9 l-293 -169 V363.8 z'/%3E%3C!-- 4. 右下色块 (Bottom Right Section) --%3E%3Cpath id='bottom-right' fill='%23202020' d='M543.8 681.2 l138.4 -78.5 V453.2 L836.8 364 v336.4 l-293 169 V681.2 z'/%3E%3C/svg%3E") no-repeat;background-size:100% 100%;background-color:transparent;display:inline-flex;width:200px;height:200px}.i-menu\:dark-node-active{background:url("data:image/svg+xml;utf8,%3Csvg display='inline-flex' class='icon' width='200px' height='200px' viewBox='0 0 1024 1024' xmlns='http://www.w3.org/2000/svg'%3E%3C!-- 1. 外边框 (Hexagon Outer) --%3E%3Cpath id='outer' fill='%23919191' d='M512.3 66.2 L124.9 289.7 v447 l387.4 223.5 l387.4 -223.5 v-447 L512.3 66.2 z'/%3E%3C!-- 1. 中心孔 (Hexagon Center Hole) --%3E%3Cpath id='center-hole' fill='%23919191' d='M512,288 L662,374 L662,546 L512,632 L362,546 L362,374 Z' transform='translate(0, 50)'/%3E%3C!-- 2. 顶部色块 (Top Section) --%3E%3Cpath id='top' fill='%23ffffff' d='M806.8 318.5 l-144.7 83.6 l-149.3 -85.6 l-149.5 85.9 L218 318.6 l294.3 -169.8 l294.5 169.7 z'/%3E%3C!-- 3. 左下色块 (Bottom Left Section) --%3E%3Cpath id='bottom-left' fill='%23ffffff' d='M187.8 363.8 l153.8 88.8 v150 l139.3 79.1 v187.9 l-293 -169 V363.8 z'/%3E%3C!-- 4. 右下色块 (Bottom Right Section) --%3E%3Cpath id='bottom-right' fill='%23ffffff' d='M543.8 681.2 l138.4 -78.5 V453.2 L836.8 364 v336.4 l-293 169 V681.2 z'/%3E%3C/svg%3E") no-repeat;background-size:100% 100%;background-color:transparent;display:inline-flex;width:200px;height:200px}.i-menu\:dark-security{background:url("data:image/svg+xml;utf8,%3Csvg display='inline-flex' width='24' height='24' viewBox='0 0 24 24' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M11.4667 4L20 6.64706V12.0545C20 14.9721 18.5857 17.7087 16.2056 19.3963L12.5333 22L8.25531 19.3459C5.60944 17.7044 4 14.8119 4 11.6982V7.17647L11.4667 4Z' stroke='%23919191' stroke-width='1.5'/%3E%3Cpath d='M9 13L11.25 15L15 11' stroke='%23919191' stroke-width='1.5' stroke-linecap='square'/%3E%3C/svg%3E") no-repeat;background-size:100% 100%;background-color:transparent;display:inline-flex;width:24;height:24}.i-menu\:dark-security-active{background:url("data:image/svg+xml;utf8,%3Csvg display='inline-flex' width='24' height='24' viewBox='0 0 24 24' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M11.4667 4L20 6.64706V12.0545C20 14.9721 18.5857 17.7087 16.2056 19.3963L12.5333 22L8.25531 19.3459C5.60944 17.7044 4 14.8119 4 11.6982V7.17647L11.4667 4Z' fill='white' stroke='white' stroke-width='1.5'/%3E%3Cpath d='M9 13L11.25 15L15 11' stroke='%23202020' stroke-width='1.5' stroke-linecap='square'/%3E%3C/svg%3E") no-repeat;background-size:100% 100%;background-color:transparent;display:inline-flex;width:24;height:24}.i-menu\:dark-settings{background:url("data:image/svg+xml;utf8,%3Csvg display='inline-flex' width='24' height='24' viewBox='0 0 24 24' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cg clip-path='url(%23clip0_1_185)'%3E%3Cpath d='M3 17.0238L3 7.97619L11.2585 3L20 7.97619L20 17.0238L11.2585 22L3 17.0238Z' stroke='%23919191' stroke-width='1.5' stroke-linecap='square' stroke-linejoin='round'/%3E%3Ccircle cx='11.5' cy='12.5' r='2.5' transform='rotate(-90 11.5 12.5)' stroke='%23919191' stroke-width='1.5'/%3E%3C/g%3E%3Cdefs%3E%3CclipPath id='clip0_1_185'%3E%3Crect width='24' height='24' fill='white'/%3E%3C/clipPath%3E%3C/defs%3E%3C/svg%3E") no-repeat;background-size:100% 100%;background-color:transparent;display:inline-flex;width:24;height:24}.i-menu\:dark-settings-active{background:url("data:image/svg+xml;utf8,%3Csvg display='inline-flex' width='24' height='24' viewBox='0 0 24 24' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cg clip-path='url(%23clip0_3_174)'%3E%3Cpath d='M3 17.0238L3 7.97619L11.2585 3L20 7.97619L20 17.0238L11.2585 22L3 17.0238Z' fill='white' stroke='white' stroke-width='1.5' stroke-linecap='square' stroke-linejoin='round'/%3E%3Ccircle cx='11.5' cy='12.5' r='2.5' transform='rotate(-90 11.5 12.5)' stroke='%23202020' stroke-width='1.5'/%3E%3C/g%3E%3Cdefs%3E%3CclipPath id='clip0_3_174'%3E%3Crect width='24' height='24' fill='white'/%3E%3C/clipPath%3E%3C/defs%3E%3C/svg%3E") no-repeat;background-size:100% 100%;background-color:transparent;display:inline-flex;width:24;height:24}.i-menu\:dark-terminal{background:url("data:image/svg+xml;utf8,%3Csvg display='inline-flex' width='24' height='24' viewBox='0 0 24 24' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M20 4H4V20H20V4Z' stroke='%23919191' stroke-width='1.5' stroke-linecap='round'/%3E%3Cpath d='M7 9H17' stroke='%23919191' stroke-width='1.5'/%3E%3Cpath d='M7 15H17' stroke='%23919191' stroke-width='1.5'/%3E%3Cpath d='M10 13L10 17' stroke='%23919191' stroke-width='1.5'/%3E%3Cpath d='M14 7L14 11' stroke='%23919191' stroke-width='1.5'/%3E%3C/svg%3E") no-repeat;background-size:100% 100%;background-color:transparent;display:inline-flex;width:24;height:24}.i-menu\:dark-terminal-active{background:url("data:image/svg+xml;utf8,%3Csvg display='inline-flex' width='24' height='24' viewBox='0 0 24 24' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M20 4H4V20H20V4Z' fill='white' stroke='white' stroke-width='1.5' stroke-linecap='round'/%3E%3Cpath d='M7 9H17' stroke='%23202020' stroke-width='1.5'/%3E%3Cpath d='M7 15H17' stroke='%23202020' stroke-width='1.5'/%3E%3Cpath d='M10 13L10 17' stroke='%23202020' stroke-width='1.5'/%3E%3Cpath d='M14 7L14 11' stroke='%23202020' stroke-width='1.5'/%3E%3C/svg%3E") no-repeat;background-size:100% 100%;background-color:transparent;display:inline-flex;width:24;height:24}.i-menu\:dark-waf{background:url("data:image/svg+xml;utf8,%3Csvg display='inline-flex' width='24' height='24' viewBox='0 0 24 24' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M20 12H3V22H20V12Z' stroke='%23919191' stroke-width='1.5' stroke-linecap='round'/%3E%3Cpath d='M4 17H20' stroke='%23919191' stroke-width='1.5' stroke-linecap='round' stroke-linejoin='round'/%3E%3Cpath d='M9.5 17V21' stroke='%23919191' stroke-width='1.5' stroke-linecap='round' stroke-linejoin='round'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M11.3232 2.04234C11.2748 2.01463 11.2196 2 11.1633 2C11.107 2 11.0518 2.01463 11.0034 2.04234C10.9636 2.07265 10.9366 2.11595 10.9278 2.16401C10.919 2.21208 10.9288 2.26159 10.9555 2.30317C11.9388 3.93723 12.1466 6.16201 10.8036 7.38948C10.2868 6.97277 9.87657 6.44787 9.6044 5.85515C9.10773 6.11987 8.69611 6.51008 8.41424 6.98344C8.13236 7.45679 7.991 7.99521 8.00551 8.54022C8.02579 9.02069 8.146 9.4924 8.35908 9.92758C8.57216 10.3628 8.87381 10.7527 9.24626 11.0744C9.61872 11.3961 10.0545 11.643 10.5279 11.8007C11.0012 11.9583 11.5027 12.0235 12.0028 11.9925C14.5769 11.9925 15.912 10.4582 16 8.54022C16.1039 6.23874 14.4011 3.40789 11.3232 2.04234Z' stroke='%23919191' stroke-width='1.5' stroke-linecap='round'/%3E%3C/svg%3E") no-repeat;background-size:100% 100%;background-color:transparent;display:inline-flex;width:24;height:24}.i-menu\:dark-waf-active{background:url("data:image/svg+xml;utf8,%3Csvg display='inline-flex' width='24' height='24' viewBox='0 0 24 24' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M20 12H3V22H20V12Z' fill='white' stroke='white' stroke-width='1.5' stroke-linecap='round'/%3E%3Cpath d='M3 17L20 17' stroke='%23202020' stroke-width='1.5' stroke-linecap='square' stroke-linejoin='round'/%3E%3Cpath d='M9.5 17V22' stroke='%23202020' stroke-width='1.5' stroke-linecap='square' stroke-linejoin='round'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M11.3232 2.04234C11.2748 2.01463 11.2196 2 11.1633 2C11.107 2 11.0518 2.01463 11.0034 2.04234C10.9636 2.07265 10.9366 2.11595 10.9278 2.16401C10.919 2.21208 10.9288 2.26159 10.9555 2.30317C11.9388 3.93723 12.1466 6.16201 10.8036 7.38948C10.2868 6.97277 9.87657 6.44787 9.6044 5.85515C9.10773 6.11987 8.69611 6.51008 8.41424 6.98344C8.13236 7.45679 7.991 7.99521 8.00551 8.54022C8.02579 9.02069 8.146 9.4924 8.35908 9.92758C8.57216 10.3628 8.87381 10.7527 9.24626 11.0744C9.61872 11.3961 10.0545 11.643 10.5279 11.8007C11.0012 11.9583 11.5027 12.0235 12.0028 11.9925C14.5769 11.9925 15.912 10.4582 16 8.54022C16.1039 6.23874 14.4011 3.40789 11.3232 2.04234Z' stroke='white' stroke-width='1.5' stroke-linecap='round'/%3E%3C/svg%3E") no-repeat;background-size:100% 100%;background-color:transparent;display:inline-flex;width:24;height:24}.i-menu\:dark-website{background:url("data:image/svg+xml;utf8,%3Csvg display='inline-flex' width='24' height='24' viewBox='0 0 24 24' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M4 12H20' stroke='%23919191' stroke-width='1.5'/%3E%3Ccircle cx='12' cy='12' r='8' stroke='%23919191' stroke-width='1.5' stroke-linecap='round' stroke-linejoin='round'/%3E%3Cellipse cx='12' cy='12' rx='3' ry='8' stroke='%23919191' stroke-width='1.5' stroke-linecap='round' stroke-linejoin='round'/%3E%3C/svg%3E") no-repeat;background-size:100% 100%;background-color:transparent;display:inline-flex;width:24;height:24}.i-menu\:dark-website-active{background:url("data:image/svg+xml;utf8,%3Csvg display='inline-flex' width='24' height='24' viewBox='0 0 24 24' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Ccircle cx='12' cy='12' r='8' fill='white' stroke='white' stroke-width='1.5' stroke-linecap='round' stroke-linejoin='round'/%3E%3Cpath d='M4 12H20' stroke='%23202020' stroke-width='1.5' stroke-linecap='round'/%3E%3Cellipse cx='12' cy='12' rx='3' ry='8' stroke='%23202020' stroke-width='1.5' stroke-linecap='round' stroke-linejoin='round'/%3E%3C/svg%3E") no-repeat;background-size:100% 100%;background-color:transparent;display:inline-flex;width:24;height:24}.i-menu\:dark-wp{background:url("data:image/svg+xml;utf8,%3Csvg display='inline-flex' width='24' height='24' viewBox='0 0 24 24' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M20 7H3V20H20V7Z' stroke='%23919191' stroke-width='1.5' stroke-linecap='round'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M16 4H7V7H16V4Z' stroke='%23919191' stroke-width='1.5' stroke-linecap='round'/%3E%3Cpath d='M7 12H16' stroke='%23919191' stroke-width='1.5'/%3E%3C/svg%3E") no-repeat;background-size:100% 100%;background-color:transparent;display:inline-flex;width:24;height:24}.i-menu\:dark-wp-active{background:url("data:image/svg+xml;utf8,%3Csvg display='inline-flex' width='24' height='24' viewBox='0 0 24 24' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M20 7H3V20H20V7Z' fill='white' stroke='white' stroke-width='1.5' stroke-linecap='round'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M16 4H7V7H16V4Z' stroke='white' stroke-width='1.5' stroke-linecap='round'/%3E%3Cpath d='M7 12H16' stroke='%23202020' stroke-width='1.5'/%3E%3C/svg%3E") no-repeat;background-size:100% 100%;background-color:transparent;display:inline-flex;width:24;height:24}.i-menu\:database{background:url("data:image/svg+xml;utf8,%3Csvg display='inline-flex' width='24' height='24' viewBox='0 0 24 24' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cg clip-path='url(%23clip0_1_62)'%3E%3Cpath d='M19 15.2216C18.5033 16.3991 17.7263 17.4367 16.7371 18.2437C15.7478 19.0507 14.5764 19.6025 13.3253 19.8509C12.0741 20.0992 10.7813 20.0366 9.55992 19.6685C8.33849 19.3004 7.22562 18.638 6.31861 17.7391C5.41159 16.8403 4.73805 15.7325 4.35687 14.5125C3.97568 13.2924 3.89846 11.9974 4.13196 10.7405C4.36546 9.48371 4.90256 8.30333 5.69631 7.30262C6.49006 6.30191 7.51629 5.51133 8.68528 5' stroke='%233A424D' stroke-width='1.5' stroke-linecap='square' stroke-linejoin='round'/%3E%3Cpath d='M20 12C20 10.9488 19.7931 9.90792 19.391 8.93676C18.989 7.96559 18.3997 7.08316 17.6569 6.33986C16.914 5.59656 16.0321 5.00695 15.0615 4.60468C14.0909 4.2024 13.0506 4 12 4V12H20Z' stroke='%2320A53A' stroke-width='1.5' stroke-linecap='square' stroke-linejoin='round'/%3E%3C/g%3E%3Cdefs%3E%3CclipPath id='clip0_1_62'%3E%3Crect width='24' height='24' fill='white'/%3E%3C/clipPath%3E%3C/defs%3E%3C/svg%3E") no-repeat;background-size:100% 100%;background-color:transparent;display:inline-flex;width:24;height:24}.i-menu\:docker{background:url("data:image/svg+xml;utf8,%3Csvg display='inline-flex' width='24' height='24' viewBox='0 0 24 24' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cg clip-path='url(%23clip0_1_69)'%3E%3Cpath d='M4.5 18C6 17.8333 9.3 17 10.5 15' stroke='%233BAF52' stroke-width='1.5'/%3E%3Crect x='5' y='8' width='4' height='4' stroke='%233A424D' stroke-width='1.5' stroke-linecap='square'/%3E%3Crect x='9' y='8' width='4' height='4' stroke='%233A424D' stroke-width='1.5' stroke-linecap='square'/%3E%3Crect x='9' y='4' width='4' height='4' stroke='%233A424D' stroke-width='1.5' stroke-linecap='square'/%3E%3Cpath d='M15.186 12H2C2.16279 14.4267 3.95349 20 9.81395 20C17.1395 20 19.093 13.76 19.5814 12.72C21.0465 12.72 23 11.16 23 10.64C22.1433 10.1839 20.5351 10.5279 19.8232 10.6193C19.7235 10.6321 19.6414 10.64 19.5814 10.64C20.0698 10.12 19.093 7.52 18.1163 7C17.3349 8.248 17.4651 10.64 17.6279 11.68C17.6471 11.8023 17.1395 12 15.186 12Z' stroke='%233A424D' stroke-width='1.5' stroke-linecap='square'/%3E%3C/g%3E%3Cdefs%3E%3CclipPath id='clip0_1_69'%3E%3Crect width='24' height='24' fill='white'/%3E%3C/clipPath%3E%3C/defs%3E%3C/svg%3E") no-repeat;background-size:100% 100%;background-color:transparent;display:inline-flex;width:24;height:24}.i-menu\:docker-active{background:url("data:image/svg+xml;utf8,%3Csvg display='inline-flex' width='24' height='24' viewBox='0 0 24 24' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cg clip-path='url(%23clip0_3_58)'%3E%3Crect x='5' y='8' width='4' height='4' stroke='white' stroke-width='1.5' stroke-linecap='square'/%3E%3Crect x='9' y='8' width='4' height='4' stroke='white' stroke-width='1.5' stroke-linecap='square'/%3E%3Crect x='9' y='4' width='4' height='4' stroke='white' stroke-width='1.5' stroke-linecap='square'/%3E%3Cpath d='M15.186 12H2C2.16279 14.4267 3.95349 20 9.81395 20C17.1395 20 19.093 13.76 19.5814 12.72C21.0465 12.72 23 11.16 23 10.64C22.1433 10.1839 20.5351 10.5279 19.8232 10.6193C19.7235 10.6321 19.6414 10.64 19.5814 10.64C20.0698 10.12 19.093 7.52 18.1163 7C17.3349 8.248 17.4651 10.64 17.6279 11.68C17.6471 11.8023 17.1395 12 15.186 12Z' fill='white' stroke='white' stroke-width='1.5' stroke-linecap='square'/%3E%3Cpath d='M4.5 18C6 17.8333 9.3 17 10.5 15' stroke='%233BAF52' stroke-width='1.5'/%3E%3C/g%3E%3Cdefs%3E%3CclipPath id='clip0_3_58'%3E%3Crect width='24' height='24' fill='white'/%3E%3C/clipPath%3E%3C/defs%3E%3C/svg%3E") no-repeat;background-size:100% 100%;background-color:transparent;display:inline-flex;width:24;height:24}.i-menu\:domain{background:url("data:image/svg+xml;utf8,%3Csvg display='inline-flex' width='24' height='24' viewBox='0 0 24 24' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M11.5 10V15' stroke='%233BAF52' stroke-width='1.5'/%3E%3Cpath d='M7.5 11V14' stroke='%233BAF52' stroke-width='1.5'/%3E%3Cpath d='M15.5 11V14' stroke='%233BAF52' stroke-width='1.5'/%3E%3Cpath d='M9 4H4V9' stroke='%233A424D' stroke-width='1.5' stroke-linecap='square'/%3E%3Cpath d='M15 4H20V9' stroke='%233A424D' stroke-width='1.5' stroke-linecap='square'/%3E%3Cpath d='M9 21H4V16' stroke='%233A424D' stroke-width='1.5' stroke-linecap='square'/%3E%3Cpath d='M15 21H20V16' stroke='%233A424D' stroke-width='1.5' stroke-linecap='square'/%3E%3C/svg%3E") no-repeat;background-size:100% 100%;background-color:transparent;display:inline-flex;width:24;height:24}.i-menu\:files{background:url("data:image/svg+xml;utf8,%3Csvg display='inline-flex' width='24' height='24' viewBox='0 0 24 24' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cg clip-path='url(%23clip0_1_118)'%3E%3Cpath d='M10.5 7H20V19.5H3V4H8.5L10.5 7Z' stroke='%233A424D' stroke-width='1.5' stroke-linecap='round'/%3E%3Cpath d='M7 15L16 15' stroke='%233BAF52' stroke-width='1.5'/%3E%3C/g%3E%3Cdefs%3E%3CclipPath id='clip0_1_118'%3E%3Crect width='24' height='24' fill='white'/%3E%3C/clipPath%3E%3C/defs%3E%3C/svg%3E") no-repeat;background-size:100% 100%;background-color:transparent;display:inline-flex;width:24;height:24}.i-menu\:files-active{background:url("data:image/svg+xml;utf8,%3Csvg display='inline-flex' width='24' height='24' viewBox='0 0 24 24' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cg clip-path='url(%23clip0_3_107)'%3E%3Cpath d='M10.5 7H20V19.5H3V4H8.5L10.5 7Z' fill='white' stroke='white' stroke-width='1.5' stroke-linecap='round'/%3E%3Cpath d='M7 15L16 15' stroke='%233BAF52' stroke-width='1.5'/%3E%3C/g%3E%3Cdefs%3E%3CclipPath id='clip0_3_107'%3E%3Crect width='24' height='24' fill='white'/%3E%3C/clipPath%3E%3C/defs%3E%3C/svg%3E") no-repeat;background-size:100% 100%;background-color:transparent;display:inline-flex;width:24;height:24}.i-menu\:ftp{background:url("data:image/svg+xml;utf8,%3Csvg display='inline-flex' width='24' height='24' viewBox='0 0 24 24' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M19.5356 7.53514L15.7256 3.7254L14.9999 2.99974' stroke='%2320A53A' stroke-width='1.5'/%3E%3Cpath d='M19.9999 7.99963L6.65991 7.99963L4.49991 7.99963' stroke='%233A424D' stroke-width='1.5'/%3E%3Cpath d='M4.96427 15.4646L7.93412 18.4344L9.49991 20' stroke='%2320A53A' stroke-width='1.5'/%3E%3Cpath d='M4.49991 15.0001L17.8399 15.0001L19.9999 15.0001' stroke='%233A424D' stroke-width='1.5'/%3E%3C/svg%3E") no-repeat;background-size:100% 100%;background-color:transparent;display:inline-flex;width:24;height:24}.i-menu\:home{background:url("data:image/svg+xml;utf8,%3Csvg display='inline-flex' width='24' height='24' viewBox='0 0 24 24' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M2 11.5L11.5 3L21 11.5' stroke='%233A424D' stroke-width='1.5' stroke-linecap='square'/%3E%3Cpath d='M5 9L4.49129 8.4489C4.33748 8.59088 4.25 8.79068 4.25 9H5ZM5 20H4.25V20.75H5V20ZM18 20V20.75H18.75V20H18ZM18 9H18.75C18.75 8.79068 18.6625 8.59088 18.5087 8.4489L18 9ZM11.5 3L12.0087 2.4489C11.7214 2.1837 11.2786 2.1837 10.9913 2.4489L11.5 3ZM5 9H4.25V20H5H5.75V9H5ZM5 20V20.75H18V20V19.25H5V20ZM18 20H18.75V9H18H17.25V20H18ZM18 9L18.5087 8.4489L12.0087 2.4489L11.5 3L10.9913 3.5511L17.4913 9.5511L18 9ZM11.5 3L10.9913 2.4489L4.49129 8.4489L5 9L5.50871 9.5511L12.0087 3.5511L11.5 3Z' fill='%233A424D'/%3E%3Cpath d='M14 12L9.5 16.5' stroke='%2320A53A' stroke-width='1.5'/%3E%3C/svg%3E") no-repeat;background-size:100% 100%;background-color:transparent;display:inline-flex;width:24;height:24}.i-menu\:home-active{background:url("data:image/svg+xml;utf8,%3Csvg display='inline-flex' width='24' height='24' viewBox='0 0 24 24' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M2 11.5L11.5 3L21 11.5' stroke='white' stroke-width='1.5' stroke-linecap='square'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M5 9V20H18V9L11.5 3L5 9Z' fill='white'/%3E%3Cpath d='M5 9L4.49129 8.4489C4.33748 8.59088 4.25 8.79068 4.25 9H5ZM5 20H4.25V20.75H5V20ZM18 20V20.75H18.75V20H18ZM18 9H18.75C18.75 8.79068 18.6625 8.59088 18.5087 8.4489L18 9ZM11.5 3L12.0087 2.4489C11.7214 2.1837 11.2786 2.1837 10.9913 2.4489L11.5 3ZM5 9H4.25V20H5H5.75V9H5ZM5 20V20.75H18V20V19.25H5V20ZM18 20H18.75V9H18H17.25V20H18ZM18 9L18.5087 8.4489L12.0087 2.4489L11.5 3L10.9913 3.5511L17.4913 9.5511L18 9ZM11.5 3L10.9913 2.4489L4.49129 8.4489L5 9L5.50871 9.5511L12.0087 3.5511L11.5 3Z' fill='white'/%3E%3Cpath d='M14 12L9.5 16.5' stroke='%2320A53A' stroke-width='1.5'/%3E%3C/svg%3E") no-repeat;background-size:100% 100%;background-color:transparent;display:inline-flex;width:24;height:24}.i-menu\:logout{background:url("data:image/svg+xml;utf8,%3Csvg display='inline-flex' width='24' height='24' viewBox='0 0 24 24' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M20 12H9.67226H8' stroke='%233BAF52' stroke-width='1.5'/%3E%3Cpath d='M16 8L20 12L16 16' stroke='%233A424D' stroke-width='1.5'/%3E%3Cpath d='M10 4H5V20H10' stroke='%233A424D' stroke-width='1.5' stroke-linecap='square' stroke-linejoin='round'/%3E%3C/svg%3E") no-repeat;background-size:100% 100%;background-color:transparent;display:inline-flex;width:24;height:24}.i-menu\:logs{background:url("data:image/svg+xml;utf8,%3Csvg display='inline-flex' width='24' height='24' viewBox='0 0 24 24' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M17.5 5.49994L15 2.99994L4 2.99999V21H20V7.99994L17.5 5.49994Z' stroke='%233A424D' stroke-width='1.5' stroke-linecap='round'/%3E%3Cpath d='M8 11L12 11' stroke='%233BAF52' stroke-width='1.5'/%3E%3Cpath d='M8 15L16 15' stroke='%233BAF52' stroke-width='1.5'/%3E%3C/svg%3E") no-repeat;background-size:100% 100%;background-color:transparent;display:inline-flex;width:24;height:24}.i-menu\:logs-active{background:url("data:image/svg+xml;utf8,%3Csvg display='inline-flex' width='24' height='24' viewBox='0 0 24 24' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M17.5 5.49994L15 2.99994L4 2.99999V21H20V7.99994L17.5 5.49994Z' fill='white' stroke='white' stroke-width='1.5' stroke-linecap='round'/%3E%3Cpath d='M8 11L12 11' stroke='%233BAF52' stroke-width='1.5'/%3E%3Cpath d='M8 15L16 15' stroke='%233BAF52' stroke-width='1.5'/%3E%3C/svg%3E") no-repeat;background-size:100% 100%;background-color:transparent;display:inline-flex;width:24;height:24}.i-menu\:mail{background:url("data:image/svg+xml;utf8,%3Csvg display='inline-flex' width='24' height='24' viewBox='0 0 24 24' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M20 5H3V18H20V5Z' stroke='%233A424D' stroke-width='1.5' stroke-linecap='round'/%3E%3Cpath d='M6 8L11.5 12L17 8' stroke='%233BAF52' stroke-width='1.5'/%3E%3C/svg%3E") no-repeat;background-size:100% 100%;background-color:transparent;display:inline-flex;width:24;height:24}.i-menu\:mail-active{background:url("data:image/svg+xml;utf8,%3Csvg display='inline-flex' width='24' height='24' viewBox='0 0 24 24' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M20 5H3V18H20V5Z' fill='white' stroke='white' stroke-width='1.5' stroke-linecap='round'/%3E%3Cpath d='M6 8L11.5 12L17 8' stroke='%233BAF52' stroke-width='1.5'/%3E%3C/svg%3E") no-repeat;background-size:100% 100%;background-color:transparent;display:inline-flex;width:24;height:24}.i-menu\:monitor{background:url("data:image/svg+xml;utf8,%3Csvg display='inline-flex' width='24' height='24' viewBox='0 0 24 24' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M19.0574 4.10237L20 4V17L19.0574 16.8976C14.0339 16.3521 8.96611 16.3521 3.94262 16.8976L3 17V4L3.94262 4.10237C8.9661 4.6479 14.0339 4.6479 19.0574 4.10237Z' stroke='%233A424D' stroke-width='1.5'/%3E%3Cpath d='M8 11.8L10 10L12.375 12L15 10' stroke='%2320A53A' stroke-width='1.5' stroke-linecap='square'/%3E%3Cpath d='M11.5 16.5V20' stroke='%233A424D' stroke-width='1.5' stroke-linecap='round' stroke-linejoin='round'/%3E%3Cpath d='M8 20.5H15' stroke='%233A424D' stroke-width='1.5' stroke-linecap='square' stroke-linejoin='round'/%3E%3C/svg%3E") no-repeat;background-size:100% 100%;background-color:transparent;display:inline-flex;width:24;height:24}.i-menu\:monitor-active{background:url("data:image/svg+xml;utf8,%3Csvg display='inline-flex' width='24' height='24' viewBox='0 0 24 24' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M19.0574 4.10237L20 4V17L19.0574 16.8976C14.0339 16.3521 8.96611 16.3521 3.94262 16.8976L3 17V4L3.94262 4.10237C8.9661 4.6479 14.0339 4.6479 19.0574 4.10237Z' fill='white' stroke='white' stroke-width='1.5'/%3E%3Cpath d='M8 11.8L10 10L12.375 12L15 10' stroke='%2320A53A' stroke-width='1.5' stroke-linecap='square'/%3E%3Cpath d='M11.5 16.5V20' stroke='white' stroke-width='1.5' stroke-linecap='round' stroke-linejoin='round'/%3E%3Cpath d='M8 20.5H15' stroke='white' stroke-width='1.5' stroke-linecap='square' stroke-linejoin='round'/%3E%3C/svg%3E") no-repeat;background-size:100% 100%;background-color:transparent;display:inline-flex;width:24;height:24}.i-menu\:node{background:url("data:image/svg+xml;utf8,%3Csvg display='inline-flex' class='icon' width='200px' height='200px' viewBox='0 0 1024 1024' xmlns='http://www.w3.org/2000/svg'%3E%3C!-- 1. 外边框 (Hexagon Outer) --%3E%3Cpath id='outer' fill='%233A424D' d='M512.3 66.2 L124.9 289.7 v447 l387.4 223.5 l387.4 -223.5 v-447 L512.3 66.2 z'/%3E%3C!-- 1. 中心孔 (Hexagon Center Hole) --%3E%3Cpath id='center-hole' fill='%233BAF52' d='M512,288 L662,374 L662,546 L512,632 L362,546 L362,374 Z' transform='translate(0, 50)'/%3E%3C!-- 2. 顶部色块 (Top Section) --%3E%3Cpath id='top' fill='%23ffffff' d='M806.8 318.5 l-144.7 83.6 l-149.3 -85.6 l-149.5 85.9 L218 318.6 l294.3 -169.8 l294.5 169.7 z'/%3E%3C!-- 3. 左下色块 (Bottom Left Section) --%3E%3Cpath id='bottom-left' fill='%23ffffff' d='M187.8 363.8 l153.8 88.8 v150 l139.3 79.1 v187.9 l-293 -169 V363.8 z'/%3E%3C!-- 4. 右下色块 (Bottom Right Section) --%3E%3Cpath id='bottom-right' fill='%23ffffff' d='M543.8 681.2 l138.4 -78.5 V453.2 L836.8 364 v336.4 l-293 169 V681.2 z'/%3E%3C/svg%3E") no-repeat;background-size:100% 100%;background-color:transparent;display:inline-flex;width:200px;height:200px}.i-menu\:node-active{background:url("data:image/svg+xml;utf8,%3Csvg display='inline-flex' class='icon' width='200px' height='200px' viewBox='0 0 1024 1024' xmlns='http://www.w3.org/2000/svg'%3E%3C!-- 1. 外边框 (Hexagon Outer) --%3E%3Cpath id='outer' fill='%2320a53a' d='M512.3 66.2 L124.9 289.7 v447 l387.4 223.5 l387.4 -223.5 v-447 L512.3 66.2 z'/%3E%3C!-- 1. 中心孔 (Hexagon Center Hole) --%3E%3Cpath id='center-hole' fill='%233BAF52' d='M512,288 L662,374 L662,546 L512,632 L362,546 L362,374 Z' transform='translate(0, 50)'/%3E%3C!-- 2. 顶部色块 (Top Section) --%3E%3Cpath id='top' fill='%23ffffff' d='M806.8 318.5 l-144.7 83.6 l-149.3 -85.6 l-149.5 85.9 L218 318.6 l294.3 -169.8 l294.5 169.7 z'/%3E%3C!-- 3. 左下色块 (Bottom Left Section) --%3E%3Cpath id='bottom-left' fill='%23ffffff' d='M187.8 363.8 l153.8 88.8 v150 l139.3 79.1 v187.9 l-293 -169 V363.8 z'/%3E%3C!-- 4. 右下色块 (Bottom Right Section) --%3E%3Cpath id='bottom-right' fill='%23ffffff' d='M543.8 681.2 l138.4 -78.5 V453.2 L836.8 364 v336.4 l-293 169 V681.2 z'/%3E%3C/svg%3E") no-repeat;background-size:100% 100%;background-color:transparent;display:inline-flex;width:200px;height:200px}.i-menu\:security{background:url("data:image/svg+xml;utf8,%3Csvg display='inline-flex' width='24' height='24' viewBox='0 0 24 24' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M11.4667 4L20 6.64706V12.0545C20 14.9721 18.5857 17.7087 16.2056 19.3963L12.5333 22L8.25531 19.3459C5.60944 17.7044 4 14.8119 4 11.6982V7.17647L11.4667 4Z' stroke='%233A424D' stroke-width='1.5'/%3E%3Cpath d='M9 13L11.25 15L15 11' stroke='%2320A53A' stroke-width='1.5' stroke-linecap='square'/%3E%3C/svg%3E") no-repeat;background-size:100% 100%;background-color:transparent;display:inline-flex;width:24;height:24}.i-menu\:security-active{background:url("data:image/svg+xml;utf8,%3Csvg display='inline-flex' width='24' height='24' viewBox='0 0 24 24' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M11.4667 4L20 6.64706V12.0545C20 14.9721 18.5857 17.7087 16.2056 19.3963L12.5333 22L8.25531 19.3459C5.60944 17.7044 4 14.8119 4 11.6982V7.17647L11.4667 4Z' fill='white' stroke='white' stroke-width='1.5'/%3E%3Cpath d='M9 13L11.25 15L15 11' stroke='%2320A53A' stroke-width='1.5' stroke-linecap='square'/%3E%3C/svg%3E") no-repeat;background-size:100% 100%;background-color:transparent;display:inline-flex;width:24;height:24}.i-menu\:settings{background:url("data:image/svg+xml;utf8,%3Csvg display='inline-flex' width='24' height='24' viewBox='0 0 24 24' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cg clip-path='url(%23clip0_1_185)'%3E%3Cpath d='M3 17.0238L3 7.97619L11.2585 3L20 7.97619L20 17.0238L11.2585 22L3 17.0238Z' stroke='%233A424D' stroke-width='1.5' stroke-linecap='square' stroke-linejoin='round'/%3E%3Ccircle cx='11.5' cy='12.5' r='2.5' transform='rotate(-90 11.5 12.5)' stroke='%233BAF52' stroke-width='1.5'/%3E%3C/g%3E%3Cdefs%3E%3CclipPath id='clip0_1_185'%3E%3Crect width='24' height='24' fill='white'/%3E%3C/clipPath%3E%3C/defs%3E%3C/svg%3E") no-repeat;background-size:100% 100%;background-color:transparent;display:inline-flex;width:24;height:24}.i-menu\:settings-active{background:url("data:image/svg+xml;utf8,%3Csvg display='inline-flex' width='24' height='24' viewBox='0 0 24 24' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cg clip-path='url(%23clip0_3_174)'%3E%3Cpath d='M3 17.0238L3 7.97619L11.2585 3L20 7.97619L20 17.0238L11.2585 22L3 17.0238Z' fill='white' stroke='white' stroke-width='1.5' stroke-linecap='square' stroke-linejoin='round'/%3E%3Ccircle cx='11.5' cy='12.5' r='2.5' transform='rotate(-90 11.5 12.5)' stroke='%233BAF52' stroke-width='1.5'/%3E%3C/g%3E%3Cdefs%3E%3CclipPath id='clip0_3_174'%3E%3Crect width='24' height='24' fill='white'/%3E%3C/clipPath%3E%3C/defs%3E%3C/svg%3E") no-repeat;background-size:100% 100%;background-color:transparent;display:inline-flex;width:24;height:24}.i-menu\:terminal{background:url("data:image/svg+xml;utf8,%3Csvg display='inline-flex' width='24' height='24' viewBox='0 0 24 24' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M20 4H4V20H20V4Z' stroke='%233A424D' stroke-width='1.5' stroke-linecap='round'/%3E%3Cpath d='M7 9H17' stroke='%233A424D' stroke-width='1.5'/%3E%3Cpath d='M7 15H17' stroke='%233BAF52' stroke-width='1.5'/%3E%3Cpath d='M10 13L10 17' stroke='%233BAF52' stroke-width='1.5'/%3E%3Cpath d='M14 7L14 11' stroke='%233A424D' stroke-width='1.5'/%3E%3C/svg%3E") no-repeat;background-size:100% 100%;background-color:transparent;display:inline-flex;width:24;height:24}.i-menu\:terminal-active{background:url("data:image/svg+xml;utf8,%3Csvg display='inline-flex' width='24' height='24' viewBox='0 0 24 24' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M20 4H4V20H20V4Z' fill='white' stroke='white' stroke-width='1.5' stroke-linecap='round'/%3E%3Cpath d='M7 9H17' stroke='%2320A53A' stroke-width='1.5'/%3E%3Cpath d='M7 15H17' stroke='%233BAF52' stroke-width='1.5'/%3E%3Cpath d='M10 13L10 17' stroke='%233BAF52' stroke-width='1.5'/%3E%3Cpath d='M14 7L14 11' stroke='%2320A53A' stroke-width='1.5'/%3E%3C/svg%3E") no-repeat;background-size:100% 100%;background-color:transparent;display:inline-flex;width:24;height:24}.i-menu\:waf{background:url("data:image/svg+xml;utf8,%3Csvg display='inline-flex' width='24' height='24' viewBox='0 0 24 24' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M20 12H3V22H20V12Z' stroke='%233A424D' stroke-width='1.5' stroke-linecap='round'/%3E%3Cpath d='M4 17H20' stroke='%233A424D' stroke-width='1.5' stroke-linecap='round' stroke-linejoin='round'/%3E%3Cpath d='M9.5 17V21' stroke='%233A424D' stroke-width='1.5' stroke-linecap='round' stroke-linejoin='round'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M11.3232 2.04234C11.2748 2.01463 11.2196 2 11.1633 2C11.107 2 11.0518 2.01463 11.0034 2.04234C10.9636 2.07265 10.9366 2.11595 10.9278 2.16401C10.919 2.21208 10.9288 2.26159 10.9555 2.30317C11.9388 3.93723 12.1466 6.16201 10.8036 7.38948C10.2868 6.97277 9.87657 6.44787 9.6044 5.85515C9.10773 6.11987 8.69611 6.51008 8.41424 6.98344C8.13236 7.45679 7.991 7.99521 8.00551 8.54022C8.02579 9.02069 8.146 9.4924 8.35908 9.92758C8.57216 10.3628 8.87381 10.7527 9.24626 11.0744C9.61872 11.3961 10.0545 11.643 10.5279 11.8007C11.0012 11.9583 11.5027 12.0235 12.0028 11.9925C14.5769 11.9925 15.912 10.4582 16 8.54022C16.1039 6.23874 14.4011 3.40789 11.3232 2.04234Z' stroke='%233BAF52' stroke-width='1.5' stroke-linecap='round'/%3E%3C/svg%3E") no-repeat;background-size:100% 100%;background-color:transparent;display:inline-flex;width:24;height:24}.i-menu\:waf-active{background:url("data:image/svg+xml;utf8,%3Csvg display='inline-flex' width='24' height='24' viewBox='0 0 24 24' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M20 12H3V22H20V12Z' fill='white' stroke='white' stroke-width='1.5' stroke-linecap='round'/%3E%3Cpath d='M3 17L20 17' stroke='%2320A53A' stroke-width='1.5' stroke-linecap='square' stroke-linejoin='round'/%3E%3Cpath d='M9.5 17V22' stroke='%2320A53A' stroke-width='1.5' stroke-linecap='square' stroke-linejoin='round'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M11.3232 2.04234C11.2748 2.01463 11.2196 2 11.1633 2C11.107 2 11.0518 2.01463 11.0034 2.04234C10.9636 2.07265 10.9366 2.11595 10.9278 2.16401C10.919 2.21208 10.9288 2.26159 10.9555 2.30317C11.9388 3.93723 12.1466 6.16201 10.8036 7.38948C10.2868 6.97277 9.87657 6.44787 9.6044 5.85515C9.10773 6.11987 8.69611 6.51008 8.41424 6.98344C8.13236 7.45679 7.991 7.99521 8.00551 8.54022C8.02579 9.02069 8.146 9.4924 8.35908 9.92758C8.57216 10.3628 8.87381 10.7527 9.24626 11.0744C9.61872 11.3961 10.0545 11.643 10.5279 11.8007C11.0012 11.9583 11.5027 12.0235 12.0028 11.9925C14.5769 11.9925 15.912 10.4582 16 8.54022C16.1039 6.23874 14.4011 3.40789 11.3232 2.04234Z' stroke='white' stroke-width='1.5' stroke-linecap='round'/%3E%3C/svg%3E") no-repeat;background-size:100% 100%;background-color:transparent;display:inline-flex;width:24;height:24}.i-menu\:website{background:url("data:image/svg+xml;utf8,%3Csvg display='inline-flex' width='24' height='24' viewBox='0 0 24 24' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M4 12H20' stroke='%2320A53A' stroke-width='1.5'/%3E%3Ccircle cx='12' cy='12' r='8' stroke='%233A424D' stroke-width='1.5' stroke-linecap='round' stroke-linejoin='round'/%3E%3Cellipse cx='12' cy='12' rx='3' ry='8' stroke='%233A424D' stroke-width='1.5' stroke-linecap='round' stroke-linejoin='round'/%3E%3C/svg%3E") no-repeat;background-size:100% 100%;background-color:transparent;display:inline-flex;width:24;height:24}.i-menu\:website-active{background:url("data:image/svg+xml;utf8,%3Csvg display='inline-flex' width='24' height='24' viewBox='0 0 24 24' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Ccircle cx='12' cy='12' r='8' fill='white' stroke='white' stroke-width='1.5' stroke-linecap='round' stroke-linejoin='round'/%3E%3Cpath d='M4 12H20' stroke='%2320A53A' stroke-width='1.5' stroke-linecap='round'/%3E%3Cellipse cx='12' cy='12' rx='3' ry='8' stroke='%2320A53A' stroke-width='1.5' stroke-linecap='round' stroke-linejoin='round'/%3E%3C/svg%3E") no-repeat;background-size:100% 100%;background-color:transparent;display:inline-flex;width:24;height:24}.i-menu\:wp{background:url("data:image/svg+xml;utf8,%3Csvg display='inline-flex' width='24' height='24' viewBox='0 0 24 24' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M20 7H3V20H20V7Z' stroke='%233A424D' stroke-width='1.5' stroke-linecap='round'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M16 4H7V7H16V4Z' stroke='%233A424D' stroke-width='1.5' stroke-linecap='round'/%3E%3Cpath d='M7 12H16' stroke='%233BAF52' stroke-width='1.5'/%3E%3C/svg%3E") no-repeat;background-size:100% 100%;background-color:transparent;display:inline-flex;width:24;height:24}.i-menu\:wp-active{background:url("data:image/svg+xml;utf8,%3Csvg display='inline-flex' width='24' height='24' viewBox='0 0 24 24' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M20 7H3V20H20V7Z' fill='white' stroke='white' stroke-width='1.5' stroke-linecap='round'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M16 4H7V7H16V4Z' stroke='white' stroke-width='1.5' stroke-linecap='round'/%3E%3Cpath d='M7 12H16' stroke='%233BAF52' stroke-width='1.5'/%3E%3C/svg%3E") no-repeat;background-size:100% 100%;background-color:transparent;display:inline-flex;width:24;height:24}.i-mingcute\:plugin-2-line{--un-icon:url("data:image/svg+xml;utf8,%3Csvg viewBox='0 0 24 24' display='inline-flex' width='1em' height='1em' xmlns='http://www.w3.org/2000/svg' %3E%3Cg fill='none' fill-rule='evenodd'%3E%3Cpath d='m12.593 23.258l-.011.002l-.071.035l-.02.004l-.014-.004l-.071-.035q-.016-.005-.024.005l-.004.01l-.017.428l.005.02l.01.013l.104.074l.015.004l.012-.004l.104-.074l.012-.016l.004-.017l-.017-.427q-.004-.016-.017-.018m.265-.113l-.013.002l-.185.093l-.01.01l-.003.011l.018.43l.005.012l.008.007l.201.093q.019.005.029-.008l.004-.014l-.034-.614q-.005-.018-.02-.022m-.715.002a.02.02 0 0 0-.027.006l-.006.014l-.034.614q.001.018.017.024l.015-.002l.201-.093l.01-.008l.004-.011l.017-.43l-.003-.012l-.01-.01z'/%3E%3Cpath fill='currentColor' d='M10.5 4a1.472 1.472 0 0 0-1.317 2.13l.163.325A1.067 1.067 0 0 1 8.39 8H5a1 1 0 0 0-1 1v1.194c1.82-.109 3.5 1.331 3.5 3.306S5.82 16.915 4 16.806V19a1 1 0 0 0 1 1h2.194c-.109-1.82 1.331-3.5 3.306-3.5s3.415 1.68 3.306 3.5H15a1 1 0 0 0 1-1v-3.39c0-.794.835-1.31 1.545-.956l.324.163a1.472 1.472 0 1 0 0-2.634l-.324.163A1.067 1.067 0 0 1 16 11.39V9a1 1 0 0 0-1-1h-2.39c-.794 0-1.31-.835-.956-1.545l.163-.325A1.472 1.472 0 0 0 10.5 4M7.064 6c-.316-2.017 1.23-4 3.436-4s3.752 1.983 3.436 4H15a3 3 0 0 1 3 3v1.064c2.017-.316 4 1.23 4 3.436s-1.983 3.752-4 3.436V19a3 3 0 0 1-3 3h-2.407a1.06 1.06 0 0 1-.976-1.48l.085-.197a1.308 1.308 0 1 0-2.404 0l.085.198c.3.7-.214 1.479-.976 1.479H5a3 3 0 0 1-3-3v-3.407c0-.762.779-1.276 1.48-.976l.197.085a1.308 1.308 0 1 0 0-2.404l-.198.085c-.7.3-1.479-.214-1.479-.976V9a3 3 0 0 1 3-3z'/%3E%3C/g%3E%3C/svg%3E");-webkit-mask:var(--un-icon) no-repeat;mask:var(--un-icon) no-repeat;-webkit-mask-size:100% 100%;mask-size:100% 100%;background-color:currentColor;color:inherit;display:inline-flex;width:1em;height:1em}.i-mynaui\:refresh-solid{--un-icon:url("data:image/svg+xml;utf8,%3Csvg viewBox='0 0 24 24' display='inline-flex' width='1em' height='1em' xmlns='http://www.w3.org/2000/svg' %3E%3Cpath fill='currentColor' d='M21.074 12.154a.75.75 0 0 1 .672.82c-.49 4.93-4.658 8.776-9.724 8.776c-2.724 0-5.364-.933-7.238-2.68L3 20.85a.75.75 0 0 1-.75-.75v-3.96c0-.714.58-1.29 1.291-1.29h3.97a.75.75 0 0 1 .75.75l-2.413 2.407c1.558 1.433 3.78 2.243 6.174 2.243c4.29 0 7.817-3.258 8.232-7.424a.75.75 0 0 1 .82-.672m-18.82-1.128c.49-4.93 4.658-8.776 9.724-8.776c2.724 0 5.364.933 7.238 2.68L21 3.15a.75.75 0 0 1 .75.75v3.96c0 .714-.58 1.29-1.291 1.29h-3.97a.75.75 0 0 1-.75-.75l2.413-2.408c-1.558-1.432-3.78-2.242-6.174-2.242c-4.29 0-7.817 3.258-8.232 7.424a.75.75 0 1 1-1.492-.148'/%3E%3C/svg%3E");-webkit-mask:var(--un-icon) no-repeat;mask:var(--un-icon) no-repeat;-webkit-mask-size:100% 100%;mask-size:100% 100%;background-color:currentColor;color:inherit;display:inline-flex;width:1em;height:1em}.i-octicon\:git-branch-16{--un-icon:url("data:image/svg+xml;utf8,%3Csvg viewBox='0 0 16 16' display='inline-flex' width='1em' height='1em' xmlns='http://www.w3.org/2000/svg' %3E%3Cpath fill='currentColor' d='M9.5 3.25a2.25 2.25 0 1 1 3 2.122V6A2.5 2.5 0 0 1 10 8.5H6a1 1 0 0 0-1 1v1.128a2.251 2.251 0 1 1-1.5 0V5.372a2.25 2.25 0 1 1 1.5 0v1.836A2.5 2.5 0 0 1 6 7h4a1 1 0 0 0 1-1v-.628A2.25 2.25 0 0 1 9.5 3.25m-6 0a.75.75 0 1 0 1.5 0a.75.75 0 0 0-1.5 0m8.25-.75a.75.75 0 1 0 0 1.5a.75.75 0 0 0 0-1.5M4.25 12a.75.75 0 1 0 0 1.5a.75.75 0 0 0 0-1.5'/%3E%3C/svg%3E");-webkit-mask:var(--un-icon) no-repeat;mask:var(--un-icon) no-repeat;-webkit-mask-size:100% 100%;mask-size:100% 100%;background-color:currentColor;color:inherit;display:inline-flex;width:1em;height:1em}.i-pajamas\:issue-type-maintenance{--un-icon:url("data:image/svg+xml;utf8,%3Csvg viewBox='0 0 16 16' display='inline-flex' width='1em' height='1em' xmlns='http://www.w3.org/2000/svg' %3E%3Cpath fill='currentColor' fill-rule='evenodd' d='M11.25 2.5a2.25 2.25 0 0 0-2.154 2.904l.13.43l-.317.318l-6.254 6.253l-.53-.53l.53.53a.664.664 0 0 0 .94.94L9.848 7.09l.318-.318l.43.13a2.25 2.25 0 0 0 2.685-3.124l-1.5 1.501a.75.75 0 1 1-1.061-1.06l1.5-1.5a2.24 2.24 0 0 0-.97-.22ZM7.5 4.75a3.75 3.75 0 1 1 3.114 3.696L10.061 9l.939.94l.47-.47l.53-.53l.53.53l1.875 1.875a2.164 2.164 0 1 1-3.06 3.06L9.47 12.53L8.94 12l.53-.53l.47-.47l-.94-.94l-4.345 4.345l-.53-.53l.53.53a2.164 2.164 0 1 1-3.06-3.06L5.939 7L3.5 4.56l-.617.617l-.507-.761l-1-1.5l-.341-.512l.435-.434l.5-.5l.434-.435l.512.341l1.5 1l.761.507l-.616.617L7 5.94l.554-.554A4 4 0 0 1 7.5 4.75m4.5 6.31l1.345 1.345a.664.664 0 0 1-.94.94L11.061 12z' clip-rule='evenodd'/%3E%3C/svg%3E");-webkit-mask:var(--un-icon) no-repeat;mask:var(--un-icon) no-repeat;-webkit-mask-size:100% 100%;mask-size:100% 100%;background-color:currentColor;color:inherit;display:inline-flex;width:1em;height:1em}.i-prime\:clone{--un-icon:url("data:image/svg+xml;utf8,%3Csvg viewBox='0 0 24 24' display='inline-flex' width='1em' height='1em' xmlns='http://www.w3.org/2000/svg' %3E%3Cpath fill='currentColor' d='M14 16.75H6A2.75 2.75 0 0 1 3.25 14V6A2.75 2.75 0 0 1 6 3.25h8A2.75 2.75 0 0 1 16.75 6v8A2.75 2.75 0 0 1 14 16.75m-8-12A1.25 1.25 0 0 0 4.75 6v8A1.25 1.25 0 0 0 6 15.25h8A1.25 1.25 0 0 0 15.25 14V6A1.25 1.25 0 0 0 14 4.75Z'/%3E%3Cpath fill='currentColor' d='M18 20.75h-8A2.75 2.75 0 0 1 7.25 18v-2h1.5v2A1.25 1.25 0 0 0 10 19.25h8A1.25 1.25 0 0 0 19.25 18v-8A1.25 1.25 0 0 0 18 8.75h-2v-1.5h2A2.75 2.75 0 0 1 20.75 10v8A2.75 2.75 0 0 1 18 20.75'/%3E%3C/svg%3E");-webkit-mask:var(--un-icon) no-repeat;mask:var(--un-icon) no-repeat;-webkit-mask-size:100% 100%;mask-size:100% 100%;background-color:currentColor;color:inherit;display:inline-flex;width:1em;height:1em}.i-ri\:menu-fill{--un-icon:url("data:image/svg+xml;utf8,%3Csvg viewBox='0 0 24 24' display='inline-flex' width='1em' height='1em' xmlns='http://www.w3.org/2000/svg' %3E%3Cpath fill='currentColor' d='M3 4h18v2H3zm0 7h18v2H3zm0 7h18v2H3z'/%3E%3C/svg%3E");-webkit-mask:var(--un-icon) no-repeat;mask:var(--un-icon) no-repeat;-webkit-mask-size:100% 100%;mask-size:100% 100%;background-color:currentColor;color:inherit;display:inline-flex;width:1em;height:1em}.i-security\:backend{--un-icon:url("data:image/svg+xml;utf8,%3Csvg display='inline-flex' width='1em' height='1em' viewBox='0 0 14 14' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M6.82 3.283c.35.262.727.456 1.131.583.527.168.961.22 1.262.23-.026.378-.081.97-.196 1.74-.097.646-.29 1.209-.572 1.676-.293.48-.592.709-.745.802-.483.294-.852.314-.88.315-.029.001-.397-.02-.88-.315-.153-.093-.453-.321-.745-.802-.283-.466-.476-1.03-.572-1.675a22.466 22.466 0 0 1-.197-1.74 4.768 4.768 0 0 0 1.262-.23 3.769 3.769 0 0 0 1.132-.584zm0-.569s-.44.46-1.24.714a4.248 4.248 0 0 1-1.277.215c-.195 0-.303-.019-.303-.019s.008.828.226 2.288c.232 1.56.958 2.458 1.523 2.802.601.367 1.057.37 1.07.37.015 0 .47-.003 1.072-.37.564-.344 1.29-1.242 1.523-2.802.218-1.46.226-2.288.226-2.288s-.108.02-.304.02c-.272 0-.716-.038-1.275-.216-.801-.254-1.241-.714-1.241-.714z' fill='currentColor'/%3E%3Cpath d='M6.82 3.17V5.9H4.403l-.197-1.98 2.614-.75zm0 2.73v2.944l.805-.215.856-.839.464-.9.292-.99H6.82z' fill='currentColor'/%3E%3Crect x='1.5' y='1.5' rx='2' width='11' height='9.286' stroke='currentColor'/%3E%3Cpath stroke='currentColor' d='M7 11.286V13'/%3E%3Cpath d='M3.25 13h7.5' stroke='currentColor' stroke-linecap='round'/%3E%3C/svg%3E");-webkit-mask:var(--un-icon) no-repeat;mask:var(--un-icon) no-repeat;-webkit-mask-size:100% 100%;mask-size:100% 100%;background-color:currentColor;color:inherit;display:inline-flex;width:1em;height:1em}.i-security\:backup{--un-icon:url("data:image/svg+xml;utf8,%3Csvg display='inline-flex' width='1em' height='1em' xmlns='http://www.w3.org/2000/svg' x='0' y='0' viewBox='0 0 128 128' style='enable-background:new 0 0 128 128' xml:space='preserve'%3E%3Cpath d='M76.6 112H25.4c-5.2 0-9.4-4.2-9.4-9.4V40.2c0-5.2 4.2-9.4 9.4-9.4h51.2c5.2 0 9.4 4.2 9.4 9.4v2.9c0 2.1-1.7 3.7-3.7 3.7s-3.7-1.7-3.7-3.7v-2.9c0-1-.8-1.9-1.9-1.9H25.4c-1 0-1.9.8-1.9 1.9v62.4c0 1 .8 1.9 1.9 1.9h51.2c1 0 1.9-.8 1.9-1.9V82.8c0-2.1 1.7-3.7 3.7-3.7s3.7 1.7 3.7 3.7v19.8c0 5.2-4.2 9.4-9.3 9.4z' fill='currentColor'/%3E%3Cpath d='M102.6 97.2h-11c-2.1 0-3.7-1.7-3.7-3.7 0-2.1 1.7-3.7 3.7-3.7h11.1c1 0 1.9-.8 1.9-1.9V25.4c0-1-.8-1.9-1.9-1.9H51.4c-1 0-1.9.8-1.9 1.9v.7c0 2.1-1.7 3.7-3.7 3.7s-3.7-1.7-3.7-3.7v-.7c0-5.2 4.2-9.4 9.4-9.4h51.2c5.2 0 9.4 4.2 9.4 9.4v62.4c-.1 5.2-4.3 9.4-9.5 9.4z' fill='currentColor'/%3E%3Cpath d='M60 99.1c-.9 0-1.8-.3-2.5-.9L30.3 73.9c-1.5-1.4-1.6-3.8-.2-5.3l.3-.3 27.2-23.2c1.6-1.3 3.9-1.2 5.3.4.6.7.9 1.5.9 2.4v12c8.8-.9 16.9-5.2 22.6-12l8.8-10.4c1.3-1.6 3.6-1.9 5.3-.6 1.2.9 1.7 2.4 1.3 3.9L99.3 51c-3.9 17-18.2 29.5-35.5 31.1v13.3c-.1 2.1-1.8 3.7-3.8 3.7zM38.5 71.2 56.2 87v-8.5c0-2.1 1.7-3.7 3.7-3.7 13.5 0 25.2-8 30.3-20.1-7.9 8.2-18.8 12.9-30.2 12.9-2.1 0-3.7-1.7-3.7-3.7V56L38.5 71.2z' fill='currentColor'/%3E%3C/svg%3E");-webkit-mask:var(--un-icon) no-repeat;mask:var(--un-icon) no-repeat;-webkit-mask-size:100% 100%;mask-size:100% 100%;background-color:currentColor;color:inherit;display:inline-flex;width:1em;height:1em}.i-security\:feature-record{--un-icon:url("data:image/svg+xml;utf8,%3Csvg display='inline-flex' xmlns='http://www.w3.org/2000/svg' width='34px' height='34px' fill='none'%3E%3Cpath d='M0 0h34v34H0z'/%3E%3Cpath fill='currentColor' d='M7.65.17h1.744v6.474H7.65zm15.849 15.941a7.88 7.88 0 0 1 5.451 2.181 7.862 7.862 0 0 1 2.447 5.358 7.845 7.845 0 0 1-2.057 5.69 7.868 7.868 0 0 1-5.857 2.579 7.88 7.88 0 0 1-5.452-2.182 7.862 7.862 0 0 1-2.447-5.358 7.845 7.845 0 0 1 2.058-5.689 7.868 7.868 0 0 1 5.856-2.579zm0-1.741c-.15 0-.301.003-.453.01-5.329.246-9.45 4.759-9.203 10.08.239 5.17 4.511 9.2 9.641 9.2.15 0 .302-.003.453-.01 5.329-.246 9.45-4.759 9.204-10.08-.24-5.17-4.512-9.2-9.642-9.2'/%3E%3Cpath fill='currentColor' d='M16.19 31.67c-.47-.445-.897-.932-1.278-1.454H4.083a1.48 1.48 0 0 1-1.482-1.476V5.77a1.48 1.48 0 0 1 1.482-1.476h21.584a1.48 1.48 0 0 1 1.482 1.476v8.39a10.52 10.52 0 0 1 1.751.835V5.77a3.227 3.227 0 0 0-3.233-3.22H4.083A3.227 3.227 0 0 0 .85 5.77v22.97a3.227 3.227 0 0 0 3.233 3.22H16.51a10.68 10.68 0 0 1-.32-.29'/%3E%3Cpath fill='currentColor' d='M27.152 15.997a8.794 8.794 0 0 1 1.748 1.056v-.008a8.785 8.785 0 0 0-1.748-1.051zM28.785 27.2H22.32v-7.849h1.747v6.111h4.717zM5.27 11.752h19.429v1.738H5.27zM20.522.17h1.747v6.46h-1.747zm-7.559 24.457H5.27v1.738h7.95a10.49 10.49 0 0 1-.257-1.738m1.72-6.438H5.27v1.738h8.479c.255-.607.568-1.189.934-1.738'/%3E%3C/svg%3E");-webkit-mask:var(--un-icon) no-repeat;mask:var(--un-icon) no-repeat;-webkit-mask-size:100% 100%;mask-size:100% 100%;background-color:currentColor;color:inherit;display:inline-flex;width:34px;height:34px}.i-security\:feature-tips{--un-icon:url("data:image/svg+xml;utf8,%3Csvg display='inline-flex' xmlns='http://www.w3.org/2000/svg' width='34px' height='34px' fill='none'%3E%3Cpath d='M0 0h34v34H0z'/%3E%3Cpath fill='currentColor' d='M32.44 25.345a1.251 1.251 0 0 0-1.253 1.252v4.59h-4.59a1.251 1.251 0 1 0 0 2.504h5.425a1.67 1.67 0 0 0 1.669-1.67v-5.424a1.251 1.251 0 0 0-1.252-1.252M32.022.31h-5.425a1.252 1.252 0 1 0 0 2.504h4.59v4.59a1.251 1.251 0 1 0 2.504 0V1.978A1.669 1.669 0 0 0 32.02.31M1.56 8.655a1.252 1.252 0 0 0 1.252-1.252v-4.59h4.59a1.252 1.252 0 1 0 0-2.504H1.978A1.67 1.67 0 0 0 .31 1.98v5.424c0 .69.561 1.252 1.252 1.252m5.842 22.532h-4.59v-4.59a1.252 1.252 0 1 0-2.504 0v5.425c0 .92.748 1.669 1.67 1.669h5.424a1.252 1.252 0 1 0 0-2.504m8.438-17.646c0-.638.52-1.153 1.159-1.153.64 0 1.16.515 1.16 1.153v5.517A1.154 1.154 0 0 1 17 20.214a1.155 1.155 0 0 1-1.16-1.155zm0 8.276c0-.637.52-1.153 1.159-1.153a1.156 1.156 0 0 1 1.003 1.731 1.156 1.156 0 0 1-1.003.577 1.155 1.155 0 0 1-1.16-1.155m12.503 1.272c.704 1.21-.177 2.72-1.578 2.72H7.233c-1.402 0-2.283-1.51-1.578-2.72l9.767-16.773A1.808 1.808 0 0 1 17 5.41c.643 0 1.244.33 1.578.906zm-2.387.416-8.955-15.3-8.933 15.342z'/%3E%3C/svg%3E");-webkit-mask:var(--un-icon) no-repeat;mask:var(--un-icon) no-repeat;-webkit-mask-size:100% 100%;mask-size:100% 100%;background-color:currentColor;color:inherit;display:inline-flex;width:34px;height:34px}.i-security\:feature-trojan{--un-icon:url("data:image/svg+xml;utf8,%3Csvg display='inline-flex' xmlns='http://www.w3.org/2000/svg' width='34px' height='34px' fill='none'%3E%3Cpath d='M0 0h34v34H0z'/%3E%3Cpath fill='currentColor' d='M1.062 27.228a.662.662 0 0 1 .718.607v3.426a.81.81 0 0 0 .792.792H4.67a.68.68 0 0 1 .718.644v.074a.758.758 0 0 1-.718.718h-2.1a2.248 2.248 0 0 1-2.228-2.228v-3.297a.68.68 0 0 1 .626-.736zm31.71 0a.68.68 0 0 1 .717.644v3.407a2.257 2.257 0 0 1-2.228 2.21h-2.1a.68.68 0 0 1-.717-.644v-.074a.68.68 0 0 1 .644-.718h2.173a.81.81 0 0 0 .792-.792v-3.297a.665.665 0 0 1 .59-.736zM20.304 3.656c1.951.57 8.212 3.02 7.365 10.239 0 .865-.147 1.841-.147 3.02v3.168a2.513 2.513 0 0 1-2.339 2.67h-.847v.331a9.968 9.968 0 0 0 .369 3.039c.22.902 0 1.86-.59 2.596a3.289 3.289 0 0 1-2.449 1.142h-9.723c-1.73.019-3.13-1.38-3.148-3.112 0-.387.073-.755.202-1.123a12.36 12.36 0 0 1 2.652-4.052 6.07 6.07 0 0 0 1.454-3.241c-.405.092-.791.24-1.16.424l-2.67 1.841a2.19 2.19 0 0 1-2.799-.368l-1.38-1.473a1.837 1.837 0 0 1-.203-2.302l6.04-9.484a3.907 3.907 0 0 1 1.841-1.603c.774-.534 1.62-.976 2.486-1.344a8.038 8.038 0 0 1 5.046-.368M13.62 6.602h-.092c-.552.203-.994.608-1.289 1.105l-5.027 7.827a.666.666 0 0 1 .331.81.71.71 0 0 1-.644.497H6.42l-.313.516c-.129.129-.147.332-.037.46 0 .019.019.019.037.037l1.363 1.437c.276.257.681.331 1.013.147l2.67-1.731a6.135 6.135 0 0 1 2.301-.866 4.164 4.164 0 0 0 2.892-1.583 2.477 2.477 0 0 0 .276-1.842.708.708 0 0 1 .626-.792.73.73 0 0 1 .755.442 4.524 4.524 0 0 1-.46 3.02 5.071 5.071 0 0 1-3.02 1.952 6.918 6.918 0 0 1-1.713 4.402 9.385 9.385 0 0 0-2.45 3.683 1.419 1.419 0 0 0 .222 1.51c.313.479.865.755 1.436.718h9.723a1.526 1.526 0 0 0 1.307-.644c.295-.387.405-.884.277-1.363a12.07 12.07 0 0 1-.277-3.978c.921-11.528 0-12.246-2.817-14.18a11.51 11.51 0 0 0-5.524-1.657 2.695 2.695 0 0 0-1.087.073m2.652-1.436h-.258a11.33 11.33 0 0 1 4.935 1.841c3.204 2.229 4.309 3.684 3.554 14.273h.552c.645 0 1.16-.516 1.16-1.16v-3.205c0-1.234 0-2.228.148-3.167.202-2.026 0-6.851-6.427-8.73a6.699 6.699 0 0 0-3.664.148m-3.315 5.525c.276.257.35.662.147.994l-.515.663a.644.644 0 0 1-.57.276 1.252 1.252 0 0 1-.443-.147.769.769 0 0 1-.22-1.05c0-.018.018-.018.036-.037l.497-.663a.794.794 0 0 1 1.068-.073zM4.671.34a.68.68 0 0 1 .718.644v.074a.708.708 0 0 1-.718.718h-2.1a.81.81 0 0 0-.791.792v3.683a.68.68 0 0 1-.645.719h-.073a.68.68 0 0 1-.719-.645V2.569A2.248 2.248 0 0 1 2.572.341zm26.59 0a2.248 2.248 0 0 1 2.228 2.228v3.683a.68.68 0 0 1-.644.719h-.074a.68.68 0 0 1-.718-.645V2.569a.81.81 0 0 0-.792-.792h-2.1a.68.68 0 0 1-.717-.644v-.074a.68.68 0 0 1 .644-.718z'/%3E%3Cpath fill='currentColor' d='M31.334 33.66H29.23a.78.78 0 0 1-.812-.74v-.073c-.037-.425.277-.775.701-.812h2.215a.726.726 0 0 0 .702-.702V28.03a.82.82 0 0 1 .812-.812.82.82 0 0 1 .812.812v3.323a2.348 2.348 0 0 1-2.326 2.307m-2.104-1.44a.622.622 0 0 0-.628.627c0 .35.277.628.628.628h2.104a2.144 2.144 0 0 0 2.234-2.05V28.03a.622.622 0 0 0-.628-.627.622.622 0 0 0-.627.627v3.323a.924.924 0 0 1-.886.886zM4.68 33.66H2.577a2.347 2.347 0 0 1-2.233-2.327V28.03a.75.75 0 0 1 .701-.812h.111a.75.75 0 0 1 .812.702v3.433a.726.726 0 0 0 .702.701H4.68c.424-.037.775.277.812.702v.11a.816.816 0 0 1-.812.794M.99 27.382a.584.584 0 0 0-.629.554v3.396a2.145 2.145 0 0 0 2.05 2.234h2.27c.35 0 .627-.277.627-.628a.584.584 0 0 0-.553-.627H2.576a.924.924 0 0 1-.886-.886v-3.397a.585.585 0 0 0-.535-.646zm20.654 2.585h-9.672a3.254 3.254 0 0 1-3.249-3.25c0-.387.074-.756.203-1.125a12.098 12.098 0 0 1 2.695-4.08 6.563 6.563 0 0 0 1.403-3.064c-.35.11-.683.277-.997.461l-2.676 1.736a2.285 2.285 0 0 1-2.935-.388L5.05 18.8a1.95 1.95 0 0 1-.24-2.4l6.073-9.47a4.094 4.094 0 0 1 1.846-1.642 13.994 13.994 0 0 1 2.436-1.422 8.214 8.214 0 0 1 5.113-.295c1.975.59 8.325 3.046 7.512 10.356 0 .904-.147 1.846-.147 3.027v3.175c.11 1.421-.96 2.658-2.4 2.769h-.794v.24c-.018 1.033.111 2.049.388 3.045.24.905.055 1.846-.498 2.603a3.312 3.312 0 0 1-2.621 1.181zm-8.38-11.777v.129a6.14 6.14 0 0 1-1.477 3.304 12.235 12.235 0 0 0-2.658 4.024 3.07 3.07 0 0 0 1.68 4.006c.369.147.775.221 1.163.221h9.746a3.257 3.257 0 0 0 2.4-1.126c.553-.701.756-1.624.553-2.51a9.763 9.763 0 0 1-.332-3.101v-.425h.738a2.336 2.336 0 0 0 1.846-.757c.48-.498.72-1.163.664-1.846v-3.156c0-1.145 0-2.141.148-3.046.794-7.162-5.537-9.58-7.383-10.152a8.062 8.062 0 0 0-5.02.277c-.85.387-1.662.867-2.419 1.42a3.782 3.782 0 0 0-1.846 1.588l-6.091 9.451c-.48.72-.406 1.68.203 2.308l1.366 1.44a2.108 2.108 0 0 0 2.695.332l2.676-1.772c.37-.222.757-.406 1.182-.517zm8.564 10.263h-9.782a1.88 1.88 0 0 1-1.514-.757 1.5 1.5 0 0 1-.24-1.514 9.453 9.453 0 0 1 2.418-3.691 6.934 6.934 0 0 0 1.717-4.412 4.849 4.849 0 0 0 2.971-1.846 4.233 4.233 0 0 0 .443-2.954.57.57 0 0 0-.277-.406.508.508 0 0 0-.46 0 .533.533 0 0 0-.352.388 2.517 2.517 0 0 1-.295 1.957 4.266 4.266 0 0 1-2.953 1.624 5.838 5.838 0 0 0-2.27.85l-2.677 1.734c-.37.203-.812.13-1.126-.147L6.047 17.82a.457.457 0 0 1 0-.627l.35-.554.314.092h.203a.572.572 0 0 0 .554-.443.555.555 0 0 0-.277-.683l4.984-7.882a2.66 2.66 0 0 1 1.273-1.107h.13c.35-.11.72-.166 1.089-.13 1.956.074 3.876.647 5.537 1.68 2.769 1.957 3.802 2.695 2.861 14.306-.13 1.33-.037 2.658.277 3.95a1.514 1.514 0 0 1-.314 1.44c-.295.37-.757.59-1.236.59zm-7.124-10.337a7.277 7.277 0 0 1-1.846 4.448v.093a8.99 8.99 0 0 0-2.381 3.525 1.33 1.33 0 0 0 .203 1.422c.295.443.83.72 1.366.683h9.746c.48.018.94-.203 1.218-.61.295-.35.406-.83.295-1.292a11.704 11.704 0 0 1-.295-4.005c.923-11.5 0-12.22-2.788-14.14a11.074 11.074 0 0 0-5.537-1.643 2.373 2.373 0 0 0-1.015.13h-.092a2.438 2.438 0 0 0-1.237.996l-4.984 7.827a.758.758 0 0 1 .37.868.787.787 0 0 1-.739.553H6.49l-.296.443c-.11.093-.11.259-.018.37l.018.018 1.366 1.458c.24.24.61.277.905.111l2.658-1.717a6.047 6.047 0 0 1 2.344-.886 4.07 4.07 0 0 0 2.842-1.661 2.483 2.483 0 0 0 .277-1.846.634.634 0 0 1 0-.628.917.917 0 0 1 .536-.369.705.705 0 0 1 .609 0c.203.111.332.314.369.536a4.42 4.42 0 0 1-.443 3.1 5.098 5.098 0 0 1-2.99 2.216zm10.447 3.34h-.646v-.11c.775-10.78-.443-12.072-3.526-14.213a11.532 11.532 0 0 0-4.91-1.846v-.111l.277-.092a6.96 6.96 0 0 1 3.692 0c6.516 1.846 6.7 6.83 6.497 8.842 0 .941-.147 1.956-.147 3.175v3.174c-.037.683-.591 1.2-1.274 1.182zm-.462-.184h.462c.59 0 1.07-.48 1.07-1.07v-3.25c0-1.217 0-2.251.148-3.192.203-1.976 0-6.775-6.368-8.64a6.72 6.72 0 0 0-3.526 0c1.643.222 3.23.831 4.615 1.754 3.083 2.29 4.338 3.6 3.563 14.398zm-12.643-8.565a1.12 1.12 0 0 1-.48-.147.935.935 0 0 1-.314-.554.853.853 0 0 1 .166-.59l.498-.665a.877.877 0 0 1 1.145-.148c.35.258.443.757.203 1.126l-.517.665a.736.736 0 0 1-.701.313m.516-2.067a.67.67 0 0 0-.516.221l-.499.665a.595.595 0 0 0-.129.461.6.6 0 0 0 .222.407c.11.073.258.11.387.129a.533.533 0 0 0 .498-.24l.517-.665a.703.703 0 0 0-.129-.867.608.608 0 0 0-.35-.111m20.304-3.563a.78.78 0 0 1-.812-.738V2.574a.726.726 0 0 0-.701-.701H29.23a.78.78 0 0 1-.812-.738V1.06a.777.777 0 0 1 .812-.72h2.104a2.364 2.364 0 0 1 2.326 2.326v3.691a.777.777 0 0 1-.812.72zM29.175.433a.584.584 0 0 0-.628.554v.074a.584.584 0 0 0 .554.627h2.178c.48.019.868.406.886.886v3.692c0 .35.277.628.627.628.351 0 .628-.277.628-.628V2.574c0-1.181-.96-2.14-2.141-2.14zM1.063 7.078a.777.777 0 0 1-.72-.812V2.574A2.33 2.33 0 0 1 2.576.341h2.105a.78.78 0 0 1 .812.738v.074a.82.82 0 0 1-.812.812H2.576a.726.726 0 0 0-.7.702v3.691a.75.75 0 0 1-.795.72zM2.576.433c-1.18 0-2.14.96-2.14 2.141v3.692a.584.584 0 0 0 .553.628h.074a.584.584 0 0 0 .627-.554V2.574a.924.924 0 0 1 .886-.886h2.105c.35 0 .627-.277.627-.627a.584.584 0 0 0-.553-.628z'/%3E%3C/svg%3E");-webkit-mask:var(--un-icon) no-repeat;mask:var(--un-icon) no-repeat;-webkit-mask-size:100% 100%;mask-size:100% 100%;background-color:currentColor;color:inherit;display:inline-flex;width:34px;height:34px}.i-security\:filescan{--un-icon:url("data:image/svg+xml;utf8,%3Csvg display='inline-flex' width='1em' height='1em' xmlns='http://www.w3.org/2000/svg' viewBox='0 0 128 128' style='enable-background:new 0 0 128 128' xml:space='preserve'%3E%3Cpath class='st0' d='M36.8 46.8h20.6c1.9 0 3.4-1.5 3.4-3.4S59.3 40 57.4 40H36.8c-1.9 0-3.4 1.5-3.4 3.4s1.5 3.4 3.4 3.4z' fill='currentColor'/%3E%3Cpath class='st0' d='M88.4 105.2H30.1c-1.9 0-3.4-1.5-3.4-3.4V26.3c0-1.9 1.5-3.4 3.4-3.4h41.2V40c0 3.8 3.1 6.9 6.9 6.9h17.2V64c0 1.9 1.5 3.4 3.4 3.4s3.4-1.5 3.4-3.4V38.1c0-.9-.4-1.8-1-2.4L82.6 17c-.6-.6-1.5-1-2.4-1H26.6c-3.8 0-6.9 3.1-6.9 6.9v82.3c0 3.8 3.1 6.9 6.9 6.9h61.8c1.9 0 3.4-1.5 3.4-3.4s-1.5-3.5-3.4-3.5zM78.1 22.8 95.3 40H81.5c-1.9 0-3.4-1.5-3.4-3.4V22.8z' fill='currentColor'/%3E%3Cpath class='st0' d='M36.8 81.2c-1.9 0-3.4 1.5-3.4 3.4s1.5 3.4 3.4 3.4h34.4c1.9 0 3.4-1.5 3.4-3.4s-1.5-3.4-3.4-3.4H36.8zM81.4 64c0-1.9-1.5-3.4-3.4-3.4H36.8c-1.9 0-3.4 1.5-3.4 3.4s1.5 3.4 3.4 3.4H78c1.9 0 3.4-1.5 3.4-3.4zm20.8 37.8c-2 0-3.6-1.5-3.9-3.4l-2.2-17.2c-.5-3.6 2.4-6.8 6-6.8s6.5 3.2 6 6.8L106 98.4c-.2 2-1.9 3.4-3.8 3.4zm-3.5 6.7c0 1.9 1.5 3.4 3.4 3.4s3.4-1.5 3.4-3.4-1.5-3.4-3.4-3.4c-1.8 0-3.4 1.5-3.4 3.4z' fill='currentColor'/%3E%3C/svg%3E");-webkit-mask:var(--un-icon) no-repeat;mask:var(--un-icon) no-repeat;-webkit-mask-size:100% 100%;mask-size:100% 100%;background-color:currentColor;color:inherit;display:inline-flex;width:1em;height:1em}.i-security\:ftps{--un-icon:url("data:image/svg+xml;utf8,%3Csvg display='inline-flex' width='1em' height='1em' viewBox='0 0 14 14' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M2.082 9.897c.23.356.502.687.814.992.168.164.43.164.598 0a.404.404 0 0 0 0-.585 4.887 4.887 0 0 1-1.197-1.856h1.662V9.69c0 .231.186.414.423.414a.414.414 0 0 0 .423-.414V8.448h1.69V9.69c0 .231.187.414.424.414a.414.414 0 0 0 .422-.414V8.448h1.691V9.69c0 .231.186.414.423.414a.414.414 0 0 0 .423-.414V8.448h1.988a5.078 5.078 0 0 1-.49.992c-.2.31-.436.598-.707.864a.404.404 0 0 0 0 .585c.167.164.43.164.597 0A5.713 5.713 0 0 0 13 6.793a5.701 5.701 0 0 0-1.734-4.096 5.896 5.896 0 0 0-2.985-1.578A6.046 6.046 0 0 0 7.08 1a6.046 6.046 0 0 0-2.227.424A5.9 5.9 0 0 0 2.08 3.688a5.706 5.706 0 0 0 0 6.21zm10.003-2.276a4.89 4.89 0 0 0-.093-2.082v.427H9.878V7.62h2.207zm-3.053 0V5.966h-1.69V7.62h1.69zm-2.536 0V5.966H4.805V7.62h1.69zm-2.537 0V5.966H2.078a4.896 4.896 0 0 0 0 1.655h1.881zM2.297 5.138h1.662v-2.26a5.13 5.13 0 0 0-1.172 1.268 4.887 4.887 0 0 0-.49.992zm2.508-2.784v2.784h1.69V1.86a5.096 5.096 0 0 0-1.69.494zm2.536-.52v3.304h1.691V2.242c-.284-.113-.617-.25-.913-.311a5.143 5.143 0 0 0-.778-.097zm2.537.814c.282.183.546.394.79.634a4.904 4.904 0 0 1 1.198 1.856H9.878v-2.49z' fill='currentColor' fill-rule='evenodd'/%3E%3Cpath d='M9.455 11.345H5.228a.841.841 0 0 0-.736.414H1v.827h3.492a.841.841 0 0 0 .736.414h4.227a.841.841 0 0 0 .736-.414h2.646v-.827h-2.646a.841.841 0 0 0-.736-.414z' clip-rule='evenodd' fill='currentColor' fill-rule='evenodd'/%3E%3C/svg%3E");-webkit-mask:var(--un-icon) no-repeat;mask:var(--un-icon) no-repeat;-webkit-mask-size:100% 100%;mask-size:100% 100%;background-color:currentColor;color:inherit;display:inline-flex;width:1em;height:1em}.i-security\:malicious-scan{--un-icon:url("data:image/svg+xml;utf8,%3Csvg display='inline-flex' xmlns='http://www.w3.org/2000/svg' width='60px' height='60px' fill='none'%3E%3Cpath d='M0 0h60v60H0z'/%3E%3Cpath fill='currentColor' d='M57.246 44.727a2.209 2.209 0 0 0-2.21 2.21v8.1h-8.1a2.21 2.21 0 1 0 0 4.418h9.573a2.945 2.945 0 0 0 2.946-2.946v-9.573a2.209 2.209 0 0 0-2.21-2.209M56.51.545h-9.573a2.21 2.21 0 1 0 0 4.419h8.1v8.1a2.208 2.208 0 1 0 4.419 0V3.49A2.945 2.945 0 0 0 56.509.545M2.755 15.273a2.21 2.21 0 0 0 2.209-2.21v-8.1h8.1a2.209 2.209 0 0 0 0-4.418H3.49A2.945 2.945 0 0 0 .545 3.491v9.573c0 1.219.99 2.209 2.21 2.209m10.309 39.763h-8.1v-8.1a2.209 2.209 0 1 0-4.419 0v9.573a2.947 2.947 0 0 0 2.946 2.946h9.573a2.208 2.208 0 1 0 0-4.419m14.89-31.14c0-1.126.917-2.034 2.046-2.034 1.13 0 2.045.908 2.045 2.034v9.737A2.037 2.037 0 0 1 30 35.67a2.038 2.038 0 0 1-2.045-2.037zm0 14.605A2.04 2.04 0 0 1 30 36.466c1.13 0 2.045.911 2.045 2.035A2.04 2.04 0 0 1 30 40.538a2.04 2.04 0 0 1-2.045-2.037m22.064 2.244c1.244 2.136-.31 4.8-2.784 4.8h-34.47c-2.474 0-4.029-2.664-2.785-4.8l17.237-29.599A3.19 3.19 0 0 1 30 9.546a3.2 3.2 0 0 1 2.785 1.598zm-4.21.734-15.805-27-15.764 27.074z'/%3E%3C/svg%3E");-webkit-mask:var(--un-icon) no-repeat;mask:var(--un-icon) no-repeat;-webkit-mask-size:100% 100%;mask-size:100% 100%;background-color:currentColor;color:inherit;display:inline-flex;width:60px;height:60px}.i-security\:overview{--un-icon:url("data:image/svg+xml;utf8,%3Csvg display='inline-flex' xmlns='http://www.w3.org/2000/svg' width='25px' height='25px' fill='none'%3E%3Cpath d='M0 0h25v25H0z'/%3E%3Cpath fill='currentColor' d='M3.125 11.458h8.333V3.125H3.125zm2.083-6.25h4.167v4.167H5.208zm17.696 2.117-5.218-5.219-5.246 5.246 5.219 5.218zm-5.218-2.273 2.272 2.273-2.3 2.299-2.272-2.272zM3.125 21.875h8.333v-8.333H3.125zm2.083-6.25h4.167v4.167H5.208zm8.334 6.25h8.333v-8.333h-8.333zm2.083-6.25h4.167v4.167h-4.167z'/%3E%3C/svg%3E");-webkit-mask:var(--un-icon) no-repeat;mask:var(--un-icon) no-repeat;-webkit-mask-size:100% 100%;mask-size:100% 100%;background-color:currentColor;color:inherit;display:inline-flex;width:25px;height:25px}.i-security\:php{--un-icon:url("data:image/svg+xml;utf8,%3Csvg display='inline-flex' xmlns='http://www.w3.org/2000/svg' width='60px' height='60px' fill='none'%3E%3Cpath d='M0 0h60v60H0z'/%3E%3Cpath fill='currentColor' d='M30.499 13.083c3.4 0 6.739.894 9.683 2.59a19.35 19.35 0 0 1 7.089 7.077 19.308 19.308 0 0 1 2.594 9.667v21.747l4.842.003V59H6.291v-4.833l4.841-.003V32.417c0-3.394.895-6.728 2.595-9.667a19.35 19.35 0 0 1 7.089-7.076 19.393 19.393 0 0 1 9.683-2.59m0 4.834c-2.488 0-4.935.638-7.105 1.852a14.514 14.514 0 0 0-5.29 5.086 14.482 14.482 0 0 0-2.12 7.018l-.01.544-.003 21.75h29.05l.003-21.75a14.48 14.48 0 0 0-1.946-7.25 14.512 14.512 0 0 0-5.317-5.308 14.545 14.545 0 0 0-7.262-1.942m3.781 7.832-2.905 9.805h7.112L26.458 48.676l3.02-9.887h-6.912l11.717-13.04zM51.577 7.958 55 11.375l-6.846 6.834-3.423-3.417zm-42.156 0 6.846 6.834-3.423 3.417L6 11.375l3.423-3.417zM32.92 1v9.667h-4.842V1z'/%3E%3C/svg%3E");-webkit-mask:var(--un-icon) no-repeat;mask:var(--un-icon) no-repeat;-webkit-mask-size:100% 100%;mask-size:100% 100%;background-color:currentColor;color:inherit;display:inline-flex;width:60px;height:60px}.i-security\:sql{--un-icon:url("data:image/svg+xml;utf8,%3Csvg display='inline-flex' xmlns='http://www.w3.org/2000/svg' width='60px' height='60px' fill='none'%3E%3Cpath d='M0 0h60v60H0z'/%3E%3Cpath fill='currentColor' d='M32.37 53.4a1.687 1.687 0 0 1-1.084.393l-.06-.002h.004c-.87 0-1.637-.607-2.302-1.837l-2.214 1.339v.012c.52 1.034 1.146 1.79 1.877 2.277.735.482 1.59.72 2.575.72 1.265 0 2.29-.369 3.075-1.112a3.705 3.705 0 0 0 1.175-2.71l-.002-.118v-.033c0-.573-.122-1.117-.341-1.608l.01.025c-.3-.6-.68-1.113-1.135-1.549l-.002-.002c-.217-.22-.825-.755-1.828-1.595-1.077-.913-1.724-1.506-1.932-1.78a1.069 1.069 0 0 1-.238-.664c0-.235.113-.447.333-.63a1.283 1.283 0 0 1 .85-.278h-.002c.712 0 1.411.479 2.098 1.435l1.947-1.73c-.717-.847-1.396-1.434-2.016-1.746a4.238 4.238 0 0 0-1.967-.479h-.01l-.105-.002a3.798 3.798 0 0 0-2.608 1.033l.001-.001a3.256 3.256 0 0 0-1.098 2.444v.034-.002c0 .67.217 1.339.66 2.006.438.67 1.417 1.62 2.923 2.854.791.652 1.304 1.129 1.533 1.447a1.572 1.572 0 0 1 .352.94v.003c0 .348-.157.652-.465.913zm16.204-9.55a6.855 6.855 0 0 0-4.98-2.134h-.09.006a7.03 7.03 0 0 0-3.613.982 7.178 7.178 0 0 0-3.61 6.222v.09-.005c0 1.985.681 3.7 2.059 5.14 1.377 1.433 3.11 2.154 5.19 2.154 1.242 0 2.367-.277 3.385-.834l1.225 1.586h3.128l-2.41-3.122c1.216-1.364 1.828-2.985 1.828-4.87 0-2.05-.703-3.788-2.12-5.208zm-1.36 7.944-1.256-1.617h-3.14l2.476 3.203a4.486 4.486 0 0 1-1.801.37 4.554 4.554 0 0 1-2.915-1.049l.007.006c-1.095-.905-1.651-2.12-1.651-3.658 0-1.378.443-2.512 1.316-3.405.872-.894 1.955-1.346 3.25-1.346 1.259 0 2.327.46 3.214 1.377.887.92 1.334 2.033 1.334 3.354a4.88 4.88 0 0 1-.834 2.768zm7.632-9.73h-2.637V55.95h6.48v-2.52h-3.845V42.067zM30.499 34.96c8.947 0 18.33-1.629 23.7-4.474v5.678h.009c.065 1.066 1.042 1.911 2.232 1.911 1.194 0 2.164-.847 2.233-1.91h.009v-24.37c0-13.406-56.345-13.406-56.345 0v36.57c0 5.34 9.652 8.757 20.772 9.808.088.014.192.025.298.026h.002l.122.013v-.013c1.217-.02 2.194-.92 2.194-2.032 0-1.122-1.004-2.03-2.238-2.03h-.057c-10.738-.99-16.62-4.083-16.62-5.777v-6.104c3.861 2.042 9.808 3.458 16.168 4.092.152.032.329.052.507.052h.044c1.217-.018 2.194-.917 2.194-2.03 0-1.125-1.003-2.033-2.238-2.033h-.092c-10.715-1-16.593-4.083-16.593-5.773v-6.096c5.36 2.858 14.751 4.488 23.695 4.488zm23.778-10.972c0 2.441-8.492 6.498-23.695 6.498-15.204 0-23.7-4.057-23.7-6.095v-6.099c5.363 2.846 14.75 4.474 23.7 4.474 8.944 0 18.33-1.628 23.695-4.474v5.691zM30.499 5.696c15.203 0 23.7 4.062 23.7 6.09 0 2.033-8.497 6.098-23.7 6.098-15.204 0-23.7-4.062-23.7-6.098-.004-2.02 8.496-6.087 23.7-6.087z'/%3E%3C/svg%3E");-webkit-mask:var(--un-icon) no-repeat;mask:var(--un-icon) no-repeat;-webkit-mask-size:100% 100%;mask-size:100% 100%;background-color:currentColor;color:inherit;display:inline-flex;width:60px;height:60px}.i-security\:time{--un-icon:url("data:image/svg+xml;utf8,%3Csvg display='inline-flex' xmlns='http://www.w3.org/2000/svg' width='60px' height='60px' fill='none'%3E%3Cpath d='M0 0h60v60H0z'/%3E%3Cpath fill='currentColor' d='M5 33.386c0-5.198 1.705-10.262 4.87-14.467s7.629-7.335 12.75-8.942a26.374 26.374 0 0 1 15.76 0c5.121 1.607 9.585 4.737 12.75 8.942 3.165 4.205 4.87 9.27 4.87 14.467 0 5.198-1.705 10.263-4.87 14.468s-7.629 7.335-12.75 8.941a26.373 26.373 0 0 1-15.76 0C17.5 55.19 13.035 52.06 9.87 47.854 6.705 43.649 5 38.584 5 33.386m25.5-19.432c-4.251 0-8.394 1.3-11.833 3.712-3.44 2.412-6 5.813-7.313 9.716a18.79 18.79 0 0 0 0 12.01c1.314 3.902 3.874 7.303 7.313 9.715 3.44 2.412 7.582 3.711 11.833 3.711s8.394-1.299 11.833-3.711c3.44-2.412 6-5.813 7.313-9.716a18.79 18.79 0 0 0 0-12.01c-1.313-3.902-3.873-7.303-7.313-9.715-3.44-2.412-7.582-3.712-11.833-3.712M18.421 3.592c0-.455.124-.902.36-1.296a2.64 2.64 0 0 1 .982-.948c.408-.227.871-.347 1.342-.347h18.79a2.75 2.75 0 0 1 1.577.495c.458.322.8.775.974 1.296.175.52.175 1.08 0 1.6s-.516.974-.974 1.296a2.75 2.75 0 0 1-1.577.495h-18.79c-.47 0-.934-.12-1.342-.347a2.64 2.64 0 0 1-.982-.949 2.522 2.522 0 0 1-.36-1.295'/%3E%3Cpath fill='currentColor' d='M51.217 8.783a2.667 2.667 0 0 1 0 3.776l-4 3.999a2.67 2.67 0 1 1-3.775-3.775l4-4a2.666 2.666 0 0 1 3.775 0m-20.55 9.887a2.666 2.666 0 0 1 2.665 2.666v11.998a2.666 2.666 0 0 1-5.332 0V21.336a2.666 2.666 0 0 1 2.666-2.666'/%3E%3C/svg%3E");-webkit-mask:var(--un-icon) no-repeat;mask:var(--un-icon) no-repeat;-webkit-mask-size:100% 100%;mask-size:100% 100%;background-color:currentColor;color:inherit;display:inline-flex;width:60px;height:60px}.i-security\:webhorse{--un-icon:url("data:image/svg+xml;utf8,%3Csvg display='inline-flex' width='1em' height='1em' viewBox='0 0 14 14' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M8.518 10.297a2.1 2.1 0 0 1 2.096-2.105 2.1 2.1 0 0 1 2.095 2.105c0 .675-.315 1.275-.806 1.66L13 13.611l-.581.389-1.134-1.708a2.1 2.1 0 0 1-2.767-1.995zm.699 0a1.4 1.4 0 0 1 1.397-1.403 1.4 1.4 0 0 1 1.397 1.403 1.4 1.4 0 0 1-1.397 1.403 1.4 1.4 0 0 1-1.397-1.403z' clip-rule='evenodd' fill='currentColor' fill-rule='evenodd'/%3E%3Cpath d='M5.927 3.43a.226.226 0 0 0 .227-.224.228.228 0 0 0-.234-.218.226.226 0 0 0-.23.222c0 .058.026.115.07.156a.236.236 0 0 0 .163.064h.004zM4.438 9.014a.317.317 0 0 0 .074.356.353.353 0 0 0 .373.07.325.325 0 0 0 .21-.302.317.317 0 0 0-.098-.23.338.338 0 0 0-.242-.094.34.34 0 0 0-.317.2zm2.724-1.021h.007-.007zm-.244-2.12c-.001-.845-.716-1.528-1.599-1.53-.882 0-1.598.684-1.598 1.53 0 .843.715 1.528 1.598 1.528.884 0 1.599-.685 1.599-1.529z' fill='currentColor'/%3E%3Cpath d='M7.323 10.503a4.28 4.28 0 0 1-.497.03c-1.409-.004-2.72-.697-3.471-1.839a3.789 3.789 0 0 1-.236-3.789l.313-.52c1.102-1.546 3.19-2.135 4.992-1.408 1.695.684 2.696 2.355 2.485 4.076.255.07.497.172.72.3.017-.1.03-.201.04-.303h.5a.48.48 0 0 0 .433-.22.438.438 0 0 0 0-.467.48.48 0 0 0-.433-.22h-.506a4.475 4.475 0 0 0-.377-1.396l.607-.336.012-.007a.44.44 0 0 0 .17-.615.483.483 0 0 0-.643-.162.02.02 0 0 0-.011 0l-.596.327a4.744 4.744 0 0 0-1.184-1.15l.315-.523c.093-.14.1-.317.016-.463a.474.474 0 0 0-.417-.233.477.477 0 0 0-.413.241.02.02 0 0 0 0 .012l-.31.52a4.948 4.948 0 0 0-1.58-.399v-.505A.465.465 0 0 0 6.778 1a.465.465 0 0 0-.475.454v.512a4.993 4.993 0 0 0-1.476.39l-.316-.523a.476.476 0 0 0-.413-.242.473.473 0 0 0-.417.233.434.434 0 0 0 .016.463l.316.518A4.74 4.74 0 0 0 2.846 3.92l-.516-.292a.492.492 0 0 0-.484-.016.447.447 0 0 0-.243.4.451.451 0 0 0 .252.394l.523.292a4.41 4.41 0 0 0-.401 1.435h-.528A.463.463 0 0 0 1 6.587c0 .241.197.44.449.454h.534c.042.45.155.895.335 1.313l-.577.32a.45.45 0 0 0-.252.396.445.445 0 0 0 .243.399.49.49 0 0 0 .484-.016l.546-.31c.274.4.61.757.997 1.06l-.37.618a.443.443 0 0 0 .171.62.486.486 0 0 0 .649-.164l.34-.564c.55.28 1.15.455 1.769.518v.483h-.009a.46.46 0 0 0 .469.424.46.46 0 0 0 .468-.424v-.476a4.73 4.73 0 0 0 .395-.048 2.716 2.716 0 0 1-.318-.687z' fill='currentColor'/%3E%3Cpath d='M7.219 9.957a2.683 2.683 0 0 1 .504-1.806 1.055 1.055 0 0 0-.558-.158 1.029 1.029 0 0 0-.951.603.953.953 0 0 0 .218 1.073c.21.203.498.304.787.288zm.977-5.748a.28.28 0 0 0-.288.27.278.278 0 0 0 .28.277.28.28 0 0 0 .286-.274h.005a.278.278 0 0 0-.283-.273zm1.012 1.593c-.458.004-.828.361-.826.8.002.28.154.524.383.665a3 3 0 0 1 1.195-.314.77.77 0 0 0 .088-.355c-.005-.441-.379-.795-.84-.796z' fill='currentColor'/%3E%3C/svg%3E");-webkit-mask:var(--un-icon) no-repeat;mask:var(--un-icon) no-repeat;-webkit-mask-size:100% 100%;mask-size:100% 100%;background-color:currentColor;color:inherit;display:inline-flex;width:1em;height:1em}.i-security\:webscan{--un-icon:url("data:image/svg+xml;utf8,%3Csvg display='inline-flex' width='1em' height='1em' xmlns='http://www.w3.org/2000/svg' viewBox='0 0 128 128' style='enable-background:new 0 0 128 128' xml:space='preserve'%3E%3Cpath d='M108.1 81.3c2.2 0 4 1.8 3.9 4V98c0 7.3-6.4 14-13.2 14H29.2c-6.9 0-13.2-6.8-13.2-14V85.5c0-2.1 2-4.2 3.9-4.2 2 0 3.9 2.1 3.9 4.2V98c0 3.1 2.4 5.7 5.4 5.7h69.6c2.9 0 5.4-2.6 5.4-5.7V85.5c-.1-2.1 1.9-4.2 3.9-4.2zM69.2 41l.8.1c2.4 1.1 3.6 3.3 3 5.6L63 85.8c-1.2 2.8-3.6 3.9-5.9 2.8-2.4-1.1-3.6-3.3-3-5.6L64 44c1.1-2.2 3.5-3.3 5.9-2.8l-.7-.2zm-25 7.5c2-1 4.4-.5 5.4 1.6s.5 4.7-1.5 5.8l-12.7 7.8 12.7 7.8c2 1 2.4 3.7 1.5 5.8-1 2.1-3.4 2.6-5.4 1.6L25.6 67.3c-1-1-2-2.1-2-3.7s1-3.1 2-3.7l18.6-11.4zM79 50c1-2.1 3.4-2.6 5.4-1.6L102.9 60c1 1 2 2.1 2 3.7s-1 3.1-2 3.7L84.3 78.8c-2 1-4.4.5-5.4-1.6s-.5-4.7 1.5-5.8l12.7-7.8-12.7-7.8C78.5 54.7 78 52.1 79 50zm19.8-34.1c6.9 0 13.2 6.2 13.2 14v12.5c0 2.1-2 4.2-3.9 4.2-2 0-3.9-2.1-3.9-4.2V30c0-3.1-2.4-5.7-5.4-5.7H29.2c-2.9 0-5.4 2.6-5.4 5.7v12c0 2.1-2 4.2-3.9 4.2S16 44.1 16 42V30c0-7.3 6.4-14 13.2-14h69.6z' fill='currentColor'/%3E%3C/svg%3E");-webkit-mask:var(--un-icon) no-repeat;mask:var(--un-icon) no-repeat;-webkit-mask-size:100% 100%;mask-size:100% 100%;background-color:currentColor;color:inherit;display:inline-flex;width:1em;height:1em}.i-security\:xss{--un-icon:url("data:image/svg+xml;utf8,%3Csvg display='inline-flex' xmlns='http://www.w3.org/2000/svg' width='60px' height='60px' fill='none'%3E%3Cpath d='M0 0h60v60H0z'/%3E%3Cpath fill='currentColor' d='M55.838 19.49a26.886 26.886 0 0 0-5.893-8.582 27.439 27.439 0 0 0-8.74-5.785A27.767 27.767 0 0 0 30.5 3c-3.712 0-7.313.714-10.705 2.123a27.44 27.44 0 0 0-8.74 5.785 26.885 26.885 0 0 0-5.893 8.582A26.411 26.411 0 0 0 3 30c0 3.644.727 7.18 2.162 10.51a26.886 26.886 0 0 0 5.893 8.582 27.439 27.439 0 0 0 8.74 5.785A27.768 27.768 0 0 0 30.5 57c3.712 0 7.313-.714 10.705-2.123a27.438 27.438 0 0 0 8.74-5.785 26.885 26.885 0 0 0 5.893-8.582A26.413 26.413 0 0 0 58 30c0-3.644-.727-7.18-2.162-10.51m-23.3 2.047a129.031 129.031 0 0 0 9.145-.44c.646 2.148 1.059 4.456 1.234 6.903h-10.38zm0-4.005V8.248a21.85 21.85 0 0 1 3.887 3.387 23.558 23.558 0 0 1 3.742 5.564 129.3 129.3 0 0 1-7.63.333m-4.075-9.047v9.044a132.158 132.158 0 0 1-7.295-.319 23.592 23.592 0 0 1 3.608-5.42 21.972 21.972 0 0 1 3.687-3.305m-6.946 12.76c2.313.154 4.629.25 6.946.287V28H18.424c.175-2.442.586-4.747 1.231-6.893.602.049 1.223.095 1.862.137M14.341 28H7.163a22.494 22.494 0 0 1 2.3-8.142c1.29.223 3.364.547 6.074.852-.63 2.294-1.03 4.73-1.196 7.29m-.054 4a25.82 25.82 0 0 0 1.47 7.3c-2.807.31-4.952.645-6.278.874A22.493 22.493 0 0 1 7.163 32zm4.08 0h10.096v6.503a137.807 137.807 0 0 0-8.512.401c-.912-2.282-1.442-4.596-1.584-6.904m10.096 10.506v8.232a39.132 39.132 0 0 1-3.567-3.733 33.357 33.357 0 0 1-3.016-4.23c2.192-.144 4.387-.234 6.583-.269m4.074 8.542v-8.545c2.19.031 4.506.119 6.918.283a33.338 33.338 0 0 1-3.01 4.219 39.248 39.248 0 0 1-3.908 4.043m3.344-12.464c-1.114-.043-2.229-.072-3.344-.087V32h10.437c-.142 2.31-.673 4.628-1.587 6.913a129.247 129.247 0 0 0-5.506-.33M47.055 32h6.782a22.493 22.493 0 0 1-2.312 8.166c-1.975-.33-3.96-.61-5.95-.84A25.827 25.827 0 0 0 47.055 32M47 28c-.166-2.57-.568-5.015-1.203-7.316a117.98 117.98 0 0 0 5.744-.818A22.493 22.493 0 0 1 53.837 28zm.065-14.263c.779.765 1.503 1.583 2.167 2.447-1.59.241-3.184.449-4.782.624-1.243-2.925-2.917-5.557-4.984-7.834a26.531 26.531 0 0 0-.343-.37 23.413 23.413 0 0 1 7.942 5.133M22.407 8.405c-.18.187-.358.377-.532.569-2.073 2.283-3.75 4.923-4.994 7.857-2.06-.218-3.786-.453-5.107-.655a23.463 23.463 0 0 1 2.161-2.44 23.405 23.405 0 0 1 8.472-5.331m-8.472 37.858a23.474 23.474 0 0 1-2.137-2.409c1.434-.218 3.343-.476 5.641-.708 1.16 2.221 2.63 4.397 4.384 6.488a42.629 42.629 0 0 0 2.274 2.5 23.392 23.392 0 0 1-10.162-5.87m23.442 5.734a42.568 42.568 0 0 0 2.14-2.363c1.75-2.084 3.215-4.253 4.374-6.467 1.777.186 3.55.413 5.317.68a23.472 23.472 0 0 1-2.143 2.416 23.392 23.392 0 0 1-9.688 5.734'/%3E%3C/svg%3E");-webkit-mask:var(--un-icon) no-repeat;mask:var(--un-icon) no-repeat;-webkit-mask-size:100% 100%;mask-size:100% 100%;background-color:currentColor;color:inherit;display:inline-flex;width:60px;height:60px}.i-settings\:network{--un-icon:url("data:image/svg+xml;utf8,%3Csvg display='inline-flex' width='1em' height='1em' viewBox='0 0 20 20' xmlns='http://www.w3.org/2000/svg' xmlns:xlink='http://www.w3.org/1999/xlink'%3E%3Crect id='svg 2' x='0.000000' y='0.000000'/%3E%3Cpath id='矢量 8' d='M10 1.875C14.4875 1.875 18.125 5.5125 18.125 10C18.125 14.4875 14.4875 18.125 10 18.125C5.5125 18.125 1.875 14.4875 1.875 10C1.875 5.5125 5.5125 1.875 10 1.875ZM9.375 10.625L6.88833 10.6254C6.90583 11.0254 6.93958 11.4146 6.98833 11.7908L7.02708 12.07L7.07542 12.3679C7.46125 14.5729 8.35917 16.23 9.37542 16.7233L9.375 10.625ZM13.1117 10.6254L10.625 10.625L10.625 16.7233C11.6183 16.2404 12.4987 14.6458 12.8979 12.5142L12.9246 12.3679L12.9729 12.0704C13.0447 11.5915 13.091 11.1092 13.1117 10.6254L13.1117 10.6254ZM5.63708 10.6254L3.15292 10.6254C3.38042 13.1463 4.96917 15.2754 7.17833 16.2712C6.74625 15.6017 6.39 14.7788 6.12833 13.8488L6.06917 13.6321L6.00042 13.3554L5.93708 13.0729C5.76796 12.2671 5.6676 11.4483 5.63708 10.6254L5.63708 10.6254ZM16.8471 10.6254L14.3625 10.6254C14.3349 11.3606 14.2522 12.0926 14.115 12.8154L14.0625 13.0729L13.9992 13.3554L13.9304 13.6325C13.6637 14.6508 13.2867 15.5504 12.8212 16.2712C15.0304 15.2754 16.6192 13.1463 16.8463 10.6254L16.8471 10.6254ZM7.17833 3.72833L7.1225 3.75375C4.94167 4.76042 3.37833 6.875 3.15292 9.375L5.63708 9.375C5.66708 8.6125 5.75167 7.87708 5.88458 7.18458L5.93708 6.92708L6.00042 6.64458L6.06917 6.3675C6.33583 5.34917 6.71292 4.44958 7.17833 3.72875L7.17833 3.72833ZM9.375 3.27667C8.38458 3.7575 7.50625 5.345 7.10542 7.46792L7.07542 7.63208L7.02708 7.92958C6.9553 8.40859 6.90898 8.89108 6.88833 9.375L9.375 9.375L9.375 3.27667ZM12.8217 3.72875L12.8717 3.80792C13.28 4.46083 13.6183 5.25292 13.8696 6.14292L13.9308 6.36792L13.9996 6.64458L14.0629 6.92708C14.2263 7.69375 14.3292 8.51708 14.3629 9.375L16.8471 9.375C16.62 6.85375 15.0312 4.72458 12.8217 3.72917L12.8217 3.72875ZM10.625 3.27667L10.625 9.375L13.1117 9.375C13.0944 8.97409 13.0596 8.57413 13.0075 8.17625L12.9729 7.92958L12.9246 7.63208C12.5388 5.4275 11.6412 3.77042 10.6254 3.27667L10.625 3.27667Z' fill='currentColor' fill-rule='nonzero'/%3E%3C/svg%3E");-webkit-mask:var(--un-icon) no-repeat;mask:var(--un-icon) no-repeat;-webkit-mask-size:100% 100%;mask-size:100% 100%;background-color:currentColor;color:inherit;display:inline-flex;width:1em;height:1em}.i-settings\:page{--un-icon:url("data:image/svg+xml;utf8,%3Csvg display='inline-flex' width='1em' height='1em' viewBox='0 0 20 20' xmlns='http://www.w3.org/2000/svg' xmlns:xlink='http://www.w3.org/1999/xlink'%3E%3Crect id='svg 5' x='0.000000' y='0.000000'/%3E%3Cpath id='矢量 12' d='M18.0879 7.86328C17.7598 7.53125 17.3223 7.34375 16.8535 7.33594C16.7676 7.32617 16.5078 7.30078 16.1328 7.26562C15.9512 6.85547 15.7305 6.46484 15.4707 6.10156C15.6328 5.75 15.7129 5.57227 15.75 5.47461L15.7559 5.47656C16.25 4.61914 15.957 3.51758 15.1016 3.02148L13.5996 2.15039C13.3262 1.99219 13.0137 1.9082 12.6973 1.90625C12.0684 1.90625 11.4707 2.23828 11.1719 2.75391C11.1426 2.79492 10.9824 3.01758 10.7422 3.35352C10.2969 3.30859 9.84766 3.31055 9.40234 3.35547C9.17773 3.03711 9.06445 2.87695 8.99609 2.79492L9 2.79297C8.67969 2.23828 8.08203 1.89453 7.44141 1.89453C7.12891 1.89453 6.82031 1.97656 6.54688 2.13281L5.04102 2.99805C4.62109 3.24023 4.32031 3.63086 4.19336 4.10156C4.07227 4.55078 4.12891 5.01367 4.35156 5.40234C4.37305 5.44922 4.49805 5.72656 4.6875 6.14062C4.58203 6.28906 4.48047 6.44531 4.38867 6.60352C4.27344 6.80469 4.16602 7.01367 4.07422 7.22656C3.56641 7.27344 3.375 7.29102 3.29492 7.30078C2.31055 7.30469 1.50781 8.10742 1.50391 9.0957L1.5 10.832C1.5 11.3164 1.68945 11.7734 2.0332 12.1172C2.36328 12.4473 2.78906 12.6289 3.23828 12.6309C3.29297 12.6367 3.62891 12.6699 4.12891 12.7168C4.29297 13.0664 4.48828 13.4004 4.71094 13.7168C4.50391 14.1641 4.40625 14.3789 4.36523 14.4941L4.35938 14.4902C4.12109 14.8984 4.05664 15.3945 4.17773 15.8516C4.29883 16.3105 4.60352 16.709 5.01367 16.9453L6.51563 17.8164C6.78906 17.9746 7.09961 18.0586 7.41602 18.0586C8.04492 18.0586 8.64258 17.7266 8.94141 17.2109C8.97461 17.166 9.17383 16.8887 9.4668 16.4766C9.85352 16.5137 10.2422 16.5176 10.623 16.4863C10.9043 16.8867 11.041 17.0762 11.1172 17.168L11.1113 17.1719C11.4316 17.7266 12.0293 18.0703 12.6699 18.0703C12.9824 18.0703 13.293 17.9883 13.5645 17.832L15.0703 16.9688C15.4824 16.7344 15.7891 16.3359 15.9121 15.877C16.0352 15.4258 15.9785 14.9531 15.752 14.5449C15.7148 14.4609 15.5938 14.1934 15.418 13.8105C15.5566 13.625 15.6855 13.4277 15.8047 13.2266C15.8965 13.0684 15.9805 12.9043 16.0566 12.7383C16.5195 12.6953 16.7207 12.6777 16.8145 12.6641L16.8145 12.666C17.8027 12.6641 18.6074 11.8594 18.6094 10.8711L18.6133 9.13476C18.6152 8.66211 18.4238 8.19922 18.0879 7.86328L18.0879 7.86328ZM14.1406 13.2969C13.9785 13.4922 13.9414 13.7656 14.0469 13.9961C14.3145 14.582 14.5059 15.0039 14.5469 15.0977C14.5508 15.1055 14.5527 15.1133 14.5566 15.1172C14.5664 15.1367 14.5762 15.1562 14.5879 15.1758C14.6504 15.2832 14.668 15.4141 14.6348 15.5352C14.6016 15.6562 14.5215 15.7617 14.4121 15.8242L12.9063 16.6895C12.834 16.7305 12.7539 16.752 12.6719 16.752C12.4941 16.752 12.3379 16.6523 12.2305 16.4707L12.2148 16.4473C12.166 16.377 11.875 15.9707 11.4805 15.4102C11.3359 15.2051 11.0938 15.0996 10.8457 15.1367C10.3203 15.2129 9.78711 15.207 9.26368 15.123C9.01368 15.084 8.76563 15.1875 8.61914 15.3945C8.375 15.7402 8.16993 16.0254 8.03125 16.2188C7.91602 16.3789 7.84571 16.4785 7.82813 16.5059C7.76954 16.6094 7.66211 16.6875 7.53711 16.7207C7.41211 16.7539 7.28125 16.7383 7.17774 16.6777L5.67579 15.8066C5.56641 15.7422 5.48829 15.6406 5.45508 15.5176C5.41993 15.3887 5.44336 15.2578 5.52735 15.1113L5.53321 15.0977C5.53907 15.084 5.75586 14.6074 6.07618 13.918C6.1836 13.6875 6.15039 13.4219 5.99219 13.2246C5.65821 12.8105 5.39063 12.3516 5.19532 11.8574C5.10352 11.625 4.89063 11.4648 4.64063 11.4414C4.26368 11.4063 3.94532 11.375 3.71485 11.3535C3.44141 11.3281 3.33008 11.3164 3.29493 11.3145C3.03321 11.3125 2.82032 11.0996 2.82032 10.8379L2.82422 9.10156C2.82422 8.83984 3.03711 8.62695 3.29883 8.62695C3.32032 8.62695 3.34375 8.625 3.36524 8.62305C3.3711 8.62305 3.37696 8.62305 3.38672 8.62109C3.48438 8.61133 3.94922 8.56641 4.59375 8.50977C4.84571 8.48633 5.06641 8.31836 5.1543 8.08203C5.26954 7.77344 5.39258 7.50781 5.53125 7.26953C5.64454 7.07227 5.78516 6.87109 5.97071 6.63867C6.12696 6.44336 6.15821 6.17969 6.05469 5.95313C5.91602 5.65039 5.79883 5.39258 5.71094 5.19922C5.5918 4.9375 5.54297 4.83008 5.52539 4.79688C5.39454 4.57031 5.47461 4.2793 5.70118 4.14844L7.20704 3.2832C7.44141 3.14844 7.73243 3.24219 7.88282 3.5L7.89649 3.51953C7.93555 3.57227 8.19141 3.93359 8.55469 4.44922C8.70118 4.65625 8.95704 4.76367 9.20704 4.7207C9.76758 4.625 10.3672 4.62305 10.9453 4.7168C11.1953 4.75781 11.4434 4.6543 11.5898 4.44727C11.7813 4.17773 11.9434 3.95117 12.0625 3.78516C12.207 3.58203 12.2676 3.5 12.2871 3.46875C12.3477 3.36523 12.4531 3.28711 12.5762 3.25391C12.7012 3.2207 12.832 3.23633 12.9356 3.29492L14.4395 4.16797C14.5469 4.23047 14.627 4.33594 14.6602 4.45703C14.6953 4.58594 14.6719 4.7168 14.5879 4.86328L14.5664 4.90039L14.5664 4.9082C14.5176 5.01367 14.3457 5.39258 14.1074 5.9082C14.002 6.13477 14.0352 6.4082 14.1934 6.60156C14.5664 7.06445 14.8555 7.57227 15.0527 8.11328C15.1387 8.35156 15.3594 8.52148 15.6113 8.54492C16.2051 8.60156 16.6309 8.64453 16.7305 8.6543C16.7402 8.65625 16.7481 8.65625 16.7539 8.65625C16.9473 8.67188 17.0703 8.7168 17.1524 8.79883C17.2402 8.88672 17.291 9.00977 17.291 9.13477L17.2871 10.873C17.2871 11.1426 17.0606 11.3477 16.7617 11.3496C16.7617 11.3496 16.7461 11.3496 16.7188 11.3535C16.6055 11.3652 16.1602 11.4063 15.5469 11.4609C15.2969 11.4844 15.0859 11.6426 14.9922 11.875C14.8828 12.1465 14.7793 12.3672 14.6621 12.5684C14.5176 12.8105 14.3477 13.0488 14.1406 13.2969L14.1406 13.2969Z' fill='currentColor' fill-rule='nonzero'/%3E%3Cpath id='矢量 13' d='M11.6387 7.25586C11.1699 6.98438 10.6387 6.8418 10.0977 6.83984C9.00393 6.83984 7.98245 7.42773 7.43362 8.37305C6.58206 9.83984 7.08401 11.7266 8.55081 12.5781C9.01956 12.8496 9.55276 12.9941 10.0938 12.9941C11.1875 12.9941 12.209 12.4062 12.7578 11.4609C13.166 10.7598 13.2813 9.91016 13.0703 9.12695C12.8633 8.34375 12.3418 7.66016 11.6387 7.25586L11.6387 7.25586ZM11.6114 10.7969C11.2969 11.3359 10.7149 11.6699 10.0918 11.6699C9.78323 11.6699 9.4805 11.5879 9.21292 11.4316C8.37698 10.9453 8.09182 9.87109 8.5762 9.03516C8.89065 8.49609 9.47268 8.16211 10.0957 8.16016C10.4043 8.16016 10.7071 8.24219 10.9746 8.39844C11.375 8.62891 11.6719 9.01758 11.7891 9.46484C11.9102 9.91992 11.8477 10.3926 11.6114 10.7969L11.6114 10.7969Z' fill='currentColor' fill-rule='nonzero'/%3E%3Cpath id='矢量 14' d='M18.0684 7.86328C17.7402 7.53125 17.3027 7.34375 16.834 7.33594C16.7481 7.32617 16.4883 7.30078 16.1133 7.26562C15.9316 6.85547 15.7109 6.46484 15.4512 6.10156C15.6133 5.75 15.6934 5.57227 15.7305 5.47461L15.7363 5.47656C16.2305 4.61914 15.9375 3.51758 15.082 3.02148L13.5801 2.15039C13.3066 1.99219 12.9941 1.9082 12.6777 1.90625C12.0488 1.90625 11.4512 2.23828 11.1523 2.75391C11.123 2.79492 10.9629 3.01758 10.7227 3.35352C10.2773 3.30859 9.82813 3.31055 9.38281 3.35547C9.1582 3.03711 9.04492 2.87695 8.97656 2.79492L8.98047 2.79297C8.66016 2.23828 8.0625 1.89453 7.42188 1.89453C7.10938 1.89453 6.80078 1.97656 6.52734 2.13281L5.02148 2.99805C4.60156 3.24023 4.30078 3.63086 4.17383 4.10156C4.05273 4.55078 4.10938 5.01367 4.33203 5.40234C4.35352 5.44922 4.47852 5.72656 4.66797 6.14062C4.5625 6.28906 4.46094 6.44531 4.36914 6.60352C4.25391 6.80469 4.14648 7.01367 4.05469 7.22656C3.54688 7.27344 3.35547 7.29102 3.27539 7.30078C2.29102 7.30469 1.48828 8.10742 1.48438 9.0957L1.48047 10.832C1.48047 11.3164 1.66992 11.7734 2.01367 12.1172C2.34375 12.4473 2.76953 12.6289 3.21875 12.6309C3.27344 12.6367 3.60938 12.6699 4.10938 12.7168C4.27344 13.0664 4.46875 13.4004 4.69141 13.7168C4.48438 14.1641 4.38672 14.3789 4.3457 14.4941L4.33984 14.4902C4.10156 14.8984 4.03711 15.3945 4.1582 15.8516C4.2793 16.3105 4.58398 16.709 4.99414 16.9453L6.49609 17.8164C6.76953 17.9746 7.08008 18.0586 7.39649 18.0586C8.02539 18.0586 8.62305 17.7266 8.92188 17.2109C8.95508 17.166 9.1543 16.8887 9.44727 16.4766C9.83399 16.5137 10.2227 16.5176 10.6035 16.4863C10.8848 16.8867 11.0215 17.0762 11.0977 17.168L11.0918 17.1719C11.4121 17.7266 12.0098 18.0703 12.6504 18.0703C12.9629 18.0703 13.2734 17.9883 13.5449 17.832L15.0508 16.9688C15.4629 16.7344 15.7695 16.3359 15.8926 15.877C16.0156 15.4258 15.959 14.9531 15.7324 14.5449C15.6953 14.4609 15.5742 14.1934 15.3984 13.8105C15.5371 13.625 15.666 13.4277 15.7852 13.2266C15.877 13.0684 15.9609 12.9043 16.0371 12.7383C16.5 12.6953 16.7012 12.6777 16.7949 12.6641L16.7949 12.666C17.7832 12.6641 18.5879 11.8594 18.5898 10.8711L18.5938 9.13476C18.5957 8.66211 18.4043 8.19922 18.0684 7.86328L18.0684 7.86328ZM14.1211 13.2969C13.959 13.4922 13.9219 13.7656 14.0273 13.9961C14.2949 14.582 14.4863 15.0039 14.5273 15.0977C14.5313 15.1055 14.5332 15.1133 14.5371 15.1172C14.5469 15.1367 14.5566 15.1562 14.5684 15.1758C14.6309 15.2832 14.6484 15.4141 14.6152 15.5352C14.582 15.6562 14.502 15.7617 14.3926 15.8242L12.8867 16.6895C12.8145 16.7305 12.7344 16.752 12.6523 16.752C12.4746 16.752 12.3184 16.6523 12.2109 16.4707L12.1953 16.4473C12.1465 16.377 11.8555 15.9707 11.4609 15.4102C11.3164 15.2051 11.0742 15.0996 10.8262 15.1367C10.3008 15.2129 9.76758 15.207 9.24414 15.123C8.99414 15.084 8.7461 15.1875 8.59961 15.3945C8.35547 15.7402 8.15039 16.0254 8.01172 16.2188C7.89649 16.3789 7.82618 16.4785 7.8086 16.5059C7.75 16.6094 7.64258 16.6875 7.51758 16.7207C7.39258 16.7539 7.26172 16.7383 7.15821 16.6777L5.65625 15.8066C5.54688 15.7422 5.46875 15.6406 5.43555 15.5176C5.40039 15.3887 5.42383 15.2578 5.50782 15.1113L5.51368 15.0977C5.51954 15.084 5.73633 14.6074 6.05664 13.918C6.16407 13.6875 6.13086 13.4219 5.97266 13.2246C5.63868 12.8105 5.3711 12.3516 5.17579 11.8574C5.08399 11.625 4.8711 11.4648 4.6211 11.4414C4.24414 11.4063 3.92579 11.375 3.69532 11.3535C3.42188 11.3281 3.31055 11.3164 3.27539 11.3145C3.01368 11.3125 2.80079 11.0996 2.80079 10.8379L2.80469 9.10156C2.80469 8.83984 3.01758 8.62695 3.2793 8.62695C3.30079 8.62695 3.32422 8.625 3.34571 8.62305C3.35157 8.62305 3.35743 8.62305 3.36719 8.62109C3.46485 8.61133 3.92969 8.56641 4.57422 8.50977C4.82618 8.48633 5.04688 8.31836 5.13477 8.08203C5.25 7.77344 5.37305 7.50781 5.51172 7.26953C5.625 7.07227 5.76563 6.87109 5.95118 6.63867C6.10743 6.44336 6.13868 6.17969 6.03516 5.95313C5.89649 5.65039 5.7793 5.39258 5.69141 5.19922C5.57227 4.9375 5.52344 4.83008 5.50586 4.79688C5.375 4.57031 5.45508 4.2793 5.68164 4.14844L7.1875 3.2832C7.42188 3.14844 7.71289 3.24219 7.86329 3.5L7.87696 3.51953C7.91602 3.57227 8.17188 3.93359 8.53516 4.44922C8.68165 4.65625 8.93751 4.76367 9.18751 4.7207C9.74805 4.625 10.3477 4.62305 10.9258 4.7168C11.1758 4.75781 11.4238 4.6543 11.5703 4.44727C11.7617 4.17773 11.9238 3.95117 12.043 3.78516C12.1875 3.58203 12.2481 3.5 12.2676 3.46875C12.3281 3.36523 12.4336 3.28711 12.5566 3.25391C12.6816 3.2207 12.8125 3.23633 12.916 3.29492L14.4199 4.16797C14.5273 4.23047 14.6074 4.33594 14.6406 4.45703C14.6758 4.58594 14.6524 4.7168 14.5684 4.86328L14.5469 4.90039L14.5469 4.9082C14.4981 5.01367 14.3262 5.39258 14.0879 5.9082C13.9824 6.13477 14.0156 6.4082 14.1738 6.60156C14.5469 7.06445 14.8359 7.57227 15.0332 8.11328C15.1191 8.35156 15.3399 8.52148 15.5918 8.54492C16.1856 8.60156 16.6113 8.64453 16.7109 8.6543C16.7207 8.65625 16.7285 8.65625 16.7344 8.65625C16.9277 8.67188 17.0508 8.7168 17.1328 8.79883C17.2207 8.88672 17.2715 9.00977 17.2715 9.13477L17.2676 10.873C17.2676 11.1426 17.041 11.3477 16.7422 11.3496C16.7422 11.3496 16.7266 11.3496 16.6992 11.3535C16.5859 11.3652 16.1406 11.4063 15.5273 11.4609C15.2773 11.4844 15.0664 11.6426 14.9727 11.875C14.8633 12.1465 14.7598 12.3672 14.6426 12.5684C14.498 12.8105 14.3281 13.0488 14.1211 13.2969L14.1211 13.2969Z' fill='currentColor' fill-rule='nonzero'/%3E%3Cpath id='矢量 15' d='M11.6192 7.25586C11.1504 6.98438 10.6192 6.8418 10.0782 6.83984C8.9844 6.83984 7.96292 7.42773 7.41409 8.37305C6.56253 9.83984 7.06448 11.7266 8.53128 12.5781C9.00003 12.8496 9.53323 12.9941 10.0742 12.9941C11.168 12.9941 12.1895 12.4062 12.7383 11.4609C13.1465 10.7598 13.2617 9.91016 13.0508 9.12695C12.8438 8.34375 12.3223 7.66016 11.6192 7.25586L11.6192 7.25586ZM11.5918 10.7969C11.2774 11.3359 10.6953 11.6699 10.0723 11.6699C9.7637 11.6699 9.46096 11.5879 9.19339 11.4316C8.35745 10.9453 8.07229 9.87109 8.55667 9.03516C8.87112 8.49609 9.45315 8.16211 10.0762 8.16016C10.3848 8.16016 10.6875 8.24219 10.9551 8.39844C11.3555 8.62891 11.6524 9.01758 11.7696 9.46484C11.8907 9.91992 11.8282 10.3926 11.5918 10.7969L11.5918 10.7969Z' fill='currentColor' fill-rule='nonzero'/%3E%3Cpath id='矢量 16' d='M18.0488 7.86328C17.7207 7.53125 17.2832 7.34375 16.8145 7.33594C16.7285 7.32617 16.4688 7.30078 16.0938 7.26562C15.9121 6.85547 15.6914 6.46484 15.4316 6.10156C15.5938 5.75 15.6738 5.57227 15.7109 5.47461L15.7168 5.47656C16.2109 4.61914 15.918 3.51758 15.0625 3.02148L13.5605 2.15039C13.2871 1.99219 12.9746 1.9082 12.6582 1.90625C12.0293 1.90625 11.4316 2.23828 11.1328 2.75391C11.1035 2.79492 10.9434 3.01758 10.7031 3.35352C10.2578 3.30859 9.80859 3.31055 9.36328 3.35547C9.13867 3.03711 9.02539 2.87695 8.95703 2.79492L8.96094 2.79297C8.64063 2.23828 8.04297 1.89453 7.40234 1.89453C7.08984 1.89453 6.78125 1.97656 6.50781 2.13281L5.00195 2.99805C4.58203 3.24023 4.28125 3.63086 4.1543 4.10156C4.0332 4.55078 4.08984 5.01367 4.3125 5.40234C4.33398 5.44922 4.45898 5.72656 4.64844 6.14062C4.54297 6.28906 4.44141 6.44531 4.34961 6.60352C4.23438 6.80469 4.12695 7.01367 4.03516 7.22656C3.52734 7.27344 3.33594 7.29102 3.25586 7.30078C2.27148 7.30469 1.46875 8.10742 1.46484 9.0957L1.46094 10.832C1.46094 11.3164 1.65039 11.7734 1.99414 12.1172C2.32422 12.4473 2.75 12.6289 3.19922 12.6309C3.25391 12.6367 3.58984 12.6699 4.08984 12.7168C4.25391 13.0664 4.44922 13.4004 4.67188 13.7168C4.46484 14.1641 4.36719 14.3789 4.32617 14.4941L4.32031 14.4902C4.08203 14.8984 4.01758 15.3945 4.13867 15.8516C4.25977 16.3105 4.56445 16.709 4.97461 16.9453L6.47656 17.8164C6.75 17.9746 7.06055 18.0586 7.37695 18.0586C8.00586 18.0586 8.60352 17.7266 8.90235 17.2109C8.93555 17.166 9.13477 16.8887 9.42774 16.4766C9.81445 16.5137 10.2031 16.5176 10.584 16.4863C10.8652 16.8867 11.002 17.0762 11.0781 17.168L11.0723 17.1719C11.3926 17.7266 11.9902 18.0703 12.6309 18.0703C12.9434 18.0703 13.2539 17.9883 13.5254 17.832L15.0312 16.9688C15.4434 16.7344 15.75 16.3359 15.873 15.877C15.9961 15.4258 15.9395 14.9531 15.7129 14.5449C15.6758 14.4609 15.5547 14.1934 15.3789 13.8105C15.5176 13.625 15.6465 13.4277 15.7656 13.2266C15.8574 13.0684 15.9414 12.9043 16.0176 12.7383C16.4805 12.6953 16.6816 12.6777 16.7754 12.6641L16.7754 12.666C17.7637 12.6641 18.5684 11.8594 18.5703 10.8711L18.5742 9.13476C18.5762 8.66211 18.3848 8.19922 18.0488 7.86328L18.0488 7.86328ZM14.1016 13.2969C13.9395 13.4922 13.9023 13.7656 14.0078 13.9961C14.2754 14.582 14.4668 15.0039 14.5078 15.0977C14.5117 15.1055 14.5137 15.1133 14.5176 15.1172C14.5273 15.1367 14.5371 15.1562 14.5488 15.1758C14.6113 15.2832 14.6289 15.4141 14.5957 15.5352C14.5625 15.6562 14.4824 15.7617 14.373 15.8242L12.8672 16.6895C12.7949 16.7305 12.7148 16.752 12.6328 16.752C12.4551 16.752 12.2988 16.6523 12.1914 16.4707L12.1758 16.4473C12.127 16.377 11.8359 15.9707 11.4414 15.4102C11.2969 15.2051 11.0547 15.0996 10.8066 15.1367C10.2813 15.2129 9.74805 15.207 9.22461 15.123C8.97461 15.084 8.72657 15.1875 8.58008 15.3945C8.33594 15.7402 8.13086 16.0254 7.99219 16.2188C7.87696 16.3789 7.80664 16.4785 7.78907 16.5059C7.73047 16.6094 7.62305 16.6875 7.49805 16.7207C7.37305 16.7539 7.24219 16.7383 7.13868 16.6777L5.63672 15.8066C5.52735 15.7422 5.44922 15.6406 5.41602 15.5176C5.38086 15.3887 5.4043 15.2578 5.48829 15.1113L5.49414 15.0977C5.5 15.084 5.7168 14.6074 6.03711 13.918C6.14454 13.6875 6.11133 13.4219 5.95313 13.2246C5.61914 12.8105 5.35157 12.3516 5.15625 11.8574C5.06446 11.625 4.85157 11.4648 4.60157 11.4414C4.22461 11.4063 3.90625 11.375 3.67579 11.3535C3.40235 11.3281 3.29102 11.3164 3.25586 11.3145C2.99414 11.3125 2.78125 11.0996 2.78125 10.8379L2.78516 9.10156C2.78516 8.83984 2.99805 8.62695 3.25977 8.62695C3.28125 8.62695 3.30469 8.625 3.32618 8.62305C3.33204 8.62305 3.33789 8.62305 3.34766 8.62109C3.44532 8.61133 3.91016 8.56641 4.55469 8.50977C4.80664 8.48633 5.02735 8.31836 5.11524 8.08203C5.23047 7.77344 5.35352 7.50781 5.49219 7.26953C5.60547 7.07227 5.7461 6.87109 5.93164 6.63867C6.08789 6.44336 6.11915 6.17969 6.01563 5.95313C5.87696 5.65039 5.75977 5.39258 5.67188 5.19922C5.55274 4.9375 5.50391 4.83008 5.48633 4.79688C5.35547 4.57031 5.43555 4.2793 5.66211 4.14844L7.16797 3.2832C7.40235 3.14844 7.69336 3.24219 7.84375 3.5L7.85743 3.51953C7.89649 3.57227 8.15235 3.93359 8.51563 4.44922C8.66212 4.65625 8.91797 4.76367 9.16797 4.7207C9.72852 4.625 10.3281 4.62305 10.9063 4.7168C11.1563 4.75781 11.4043 4.6543 11.5508 4.44727C11.7422 4.17773 11.9043 3.95117 12.0234 3.78516C12.168 3.58203 12.2285 3.5 12.2481 3.46875C12.3086 3.36523 12.4141 3.28711 12.5371 3.25391C12.6621 3.2207 12.793 3.23633 12.8965 3.29492L14.4004 4.16797C14.5078 4.23047 14.5879 4.33594 14.6211 4.45703C14.6563 4.58594 14.6328 4.7168 14.5488 4.86328L14.5273 4.90039L14.5273 4.9082C14.4785 5.01367 14.3066 5.39258 14.0684 5.9082C13.9629 6.13477 13.9961 6.4082 14.1543 6.60156C14.5274 7.06445 14.8164 7.57227 15.0137 8.11328C15.0996 8.35156 15.3203 8.52148 15.5723 8.54492C16.166 8.60156 16.5918 8.64453 16.6914 8.6543C16.7012 8.65625 16.709 8.65625 16.7149 8.65625C16.9082 8.67188 17.0313 8.7168 17.1133 8.79883C17.2012 8.88672 17.252 9.00977 17.252 9.13477L17.2481 10.873C17.2481 11.1426 17.0215 11.3477 16.7227 11.3496C16.7227 11.3496 16.707 11.3496 16.6797 11.3535C16.5664 11.3652 16.1211 11.4063 15.5078 11.4609C15.2578 11.4844 15.0469 11.6426 14.9531 11.875C14.8438 12.1465 14.7402 12.3672 14.6231 12.5684C14.4785 12.8105 14.3086 13.0488 14.1016 13.2969L14.1016 13.2969Z' fill='currentColor' fill-rule='nonzero'/%3E%3Cpath id='矢量 17' d='M11.5996 7.25586C11.1309 6.98438 10.5996 6.8418 10.0586 6.83984C8.96487 6.83984 7.94339 7.42773 7.39456 8.37305C6.54299 9.83984 7.04495 11.7266 8.51175 12.5781C8.9805 12.8496 9.5137 12.9941 10.0547 12.9941C11.1485 12.9941 12.1699 12.4062 12.7188 11.4609C13.127 10.7598 13.2422 9.91016 13.0313 9.12695C12.8242 8.34375 12.3028 7.66016 11.5996 7.25586L11.5996 7.25586ZM11.5723 10.7969C11.2578 11.3359 10.6758 11.6699 10.0528 11.6699C9.74417 11.6699 9.44143 11.5879 9.17385 11.4316C8.33792 10.9453 8.05276 9.87109 8.53714 9.03516C8.85159 8.49609 9.43362 8.16211 10.0567 8.16016C10.3653 8.16016 10.668 8.24219 10.9356 8.39844C11.336 8.62891 11.6328 9.01758 11.75 9.46484C11.8711 9.91992 11.8086 10.3926 11.5723 10.7969L11.5723 10.7969Z' fill='currentColor' fill-rule='nonzero'/%3E%3C/svg%3E");-webkit-mask:var(--un-icon) no-repeat;mask:var(--un-icon) no-repeat;-webkit-mask-size:100% 100%;mask-size:100% 100%;background-color:currentColor;color:inherit;display:inline-flex;width:1em;height:1em}.i-settings\:safe{--un-icon:url("data:image/svg+xml;utf8,%3Csvg display='inline-flex' width='1em' height='1em' viewBox='0 0 20 20' xmlns='http://www.w3.org/2000/svg' xmlns:xlink='http://www.w3.org/1999/xlink'%3E%3Crect id='svg 1' x='0.000000' y='0.000000'/%3E%3Cpath id='矢量 5' d='M9.99984 2.59545C13.1498 2.59545 15.0362 3.15908 15.9089 3.50454L15.9089 10.3227C15.9163 11.2154 15.6738 12.0924 15.2089 12.8545C14.6026 13.818 13.8408 14.6744 12.9546 15.3889C12.0684 16.1035 11.07 16.6663 9.99984 17.0545C8.93101 16.6686 7.93334 16.1086 7.04719 15.3972C6.16105 14.6859 5.39861 13.8328 4.79075 12.8727C4.32586 12.1106 4.0834 11.2336 4.09075 10.3409L4.09075 3.52272C4.97256 3.16363 6.85438 2.61363 9.99984 2.61363M9.99984 1.24999C4.80438 1.23181 2.72711 2.67272 2.72711 2.67272L2.72711 10.3409C2.72213 11.4877 3.03694 12.6131 3.6362 13.5909C4.3697 14.7492 5.30004 15.7703 6.38521 16.6082C7.47038 17.4461 8.69366 18.0879 9.99984 18.5045C11.306 18.0879 12.5293 17.4462 13.6145 16.6082C14.6996 15.7703 15.63 14.7492 16.3635 13.5909C16.9627 12.6131 17.2775 11.4877 17.2726 10.3409L17.2726 2.67272C17.2726 2.67272 15.1953 1.23181 9.99984 1.23181L9.99984 1.24999Z' fill='currentColor' fill-rule='nonzero'/%3E%3Cpath id='矢量 6' d='M9.14544 11.4591C9.01548 11.4588 8.88832 11.4212 8.77913 11.3508C8.66995 11.2803 8.58336 11.1798 8.52969 11.0615C8.47602 10.9431 8.45754 10.8118 8.47645 10.6832C8.49536 10.5546 8.55087 10.4342 8.63635 10.3363L11.7591 6.69996C11.8551 6.59053 11.9832 6.5143 12.1252 6.48219C12.2672 6.45008 12.4157 6.46374 12.5494 6.52122C12.6832 6.5787 12.7953 6.67704 12.8697 6.80215C12.9441 6.92725 12.977 7.07271 12.9636 7.21766C12.9503 7.36261 12.8914 7.49962 12.7954 7.60905L9.66817 11.2454C9.60211 11.3173 9.52101 11.3737 9.43066 11.4106C9.34031 11.4475 9.24292 11.4641 9.14544 11.4591L9.14544 11.4591Z' fill='currentColor' fill-rule='nonzero'/%3E%3Cpath id='矢量 7' d='M9.14538 11.4591C9.06995 11.4597 8.99497 11.4473 8.92371 11.4226C8.85246 11.3978 8.78599 11.3609 8.7272 11.3137L7.30447 10.1955C7.19125 10.1062 7.1092 9.98336 7.07006 9.84458C7.03093 9.7058 7.03673 9.5582 7.08663 9.42291C7.13653 9.28763 7.22796 9.17161 7.34784 9.09148C7.46772 9.01135 7.60988 8.97122 7.75397 8.97684C7.89805 8.98245 8.03666 9.03353 8.14993 9.12276L9.56811 10.2455C9.66223 10.319 9.73523 10.4161 9.7797 10.527C9.82417 10.6379 9.83853 10.7585 9.82133 10.8767C9.80413 10.9949 9.75597 11.1064 9.68175 11.2C9.61847 11.2818 9.5371 11.3477 9.44403 11.3926C9.35096 11.4376 9.24873 11.4604 9.14538 11.4591L9.14538 11.4591Z' fill='currentColor' fill-rule='nonzero'/%3E%3C/svg%3E");-webkit-mask:var(--un-icon) no-repeat;mask:var(--un-icon) no-repeat;-webkit-mask-size:100% 100%;mask-size:100% 100%;background-color:currentColor;color:inherit;display:inline-flex;width:1em;height:1em}.i-settings\:ssl{--un-icon:url("data:image/svg+xml;utf8,%3Csvg display='inline-flex' width='1em' height='1em' viewBox='0 0 20 20' xmlns='http://www.w3.org/2000/svg' xmlns:xlink='http://www.w3.org/1999/xlink'%3E%3Crect id='svg 2' x='0.000000' y='0.000000'/%3E%3Cpath id='矢量 5' d='M9.99984 2.59545C13.1498 2.59545 15.0362 3.15908 15.9089 3.50454L15.9089 10.3227C15.9163 11.2154 15.6738 12.0924 15.2089 12.8545C14.6026 13.818 13.8408 14.6744 12.9546 15.3889C12.0684 16.1035 11.07 16.6663 9.99984 17.0545C8.93101 16.6686 7.93334 16.1086 7.04719 15.3972C6.16105 14.6859 5.39861 13.8328 4.79075 12.8727C4.32586 12.1106 4.0834 11.2336 4.09075 10.3409L4.09075 3.52272C4.97256 3.16363 6.85438 2.61363 9.99984 2.61363M9.99984 1.24999C4.80438 1.23181 2.72711 2.67272 2.72711 2.67272L2.72711 10.3409C2.72213 11.4877 3.03694 12.6131 3.6362 13.5909C4.3697 14.7492 5.30004 15.7703 6.38521 16.6082C7.47038 17.4461 8.69366 18.0879 9.99984 18.5045C11.306 18.0879 12.5293 17.4462 13.6145 16.6082C14.6996 15.7703 15.63 14.7492 16.3635 13.5909C16.9627 12.6131 17.2775 11.4877 17.2726 10.3409L17.2726 2.67272C17.2726 2.67272 15.1953 1.23181 9.99984 1.23181L9.99984 1.24999Z' fill='currentColor' fill-rule='nonzero'/%3E%3C/svg%3E");-webkit-mask:var(--un-icon) no-repeat;mask:var(--un-icon) no-repeat;-webkit-mask-size:100% 100%;mask-size:100% 100%;background-color:currentColor;color:inherit;display:inline-flex;width:1em;height:1em}.i-settings\:success{--un-icon:url("data:image/svg+xml;utf8,%3Csvg display='inline-flex' width='1em' height='1em' viewBox='0 0 8.74341 8.74414' xmlns='http://www.w3.org/2000/svg' xmlns:xlink='http://www.w3.org/1999/xlink'%3E%3Cpath id='矢量 19' d='M4.01465 6.34766C3.93555 6.34766 3.85742 6.31738 3.79785 6.25586L1.80664 4.23828C1.68652 4.11719 1.68652 3.91992 1.80664 3.79785C1.92676 3.67578 2.12109 3.67578 2.24023 3.79785L4.01562 5.59668L8.21875 1.33594C8.25656 1.2972 8.30404 1.26927 8.35627 1.25505C8.40849 1.24083 8.46358 1.24083 8.51581 1.25505C8.56804 1.26927 8.61551 1.2972 8.65332 1.33594C8.77344 1.45703 8.77344 1.6543 8.65332 1.77637L4.23145 6.25684C4.17188 6.31738 4.09277 6.34766 4.01465 6.34766ZM4.31348 8.74414C3.73144 8.74414 3.16602 8.62891 2.63477 8.40137C2.12109 8.18066 1.66016 7.86621 1.26465 7.46484C0.869141 7.06348 0.557617 6.5957 0.34082 6.0752C0.114258 5.53418 0 4.96191 0 4.37207C0 3.78223 0.114258 3.20898 0.338867 2.66992C0.556641 2.14941 0.868164 1.68164 1.26367 1.28027C1.65918 0.878906 2.12012 0.563477 2.63379 0.34375C3.16602 0.116211 3.73144 0 4.31348 0C5.17188 0 6.00098 0.255859 6.71191 0.738281C6.83496 0.821289 6.86914 0.992188 6.78613 1.11719C6.7041 1.24219 6.53516 1.27637 6.41211 1.19141C5.79102 0.770508 5.06445 0.546875 4.31348 0.546875C2.23145 0.546875 0.540039 2.26367 0.540039 4.37207C0.540039 6.48047 2.23242 8.19727 4.31348 8.19727C6.39355 8.19727 8.08691 6.48145 8.08691 4.37207C8.08691 4.23633 8.08008 4.10059 8.06543 3.96484C8.04883 3.81445 8.15723 3.68066 8.30566 3.66406C8.4541 3.64746 8.58594 3.75684 8.60156 3.90723C8.61816 4.06055 8.62598 4.21777 8.62598 4.37207C8.62598 4.96191 8.51172 5.53516 8.28711 6.07422C8.06933 6.5957 7.75976 7.06152 7.36328 7.46387C6.96777 7.86523 6.50586 8.18066 5.99219 8.40039C5.45996 8.62695 4.89551 8.74414 4.31348 8.74414L4.31348 8.74414Z' fill='currentColor' fill-rule='nonzero'/%3E%3C/svg%3E");-webkit-mask:var(--un-icon) no-repeat;mask:var(--un-icon) no-repeat;-webkit-mask-size:100% 100%;mask-size:100% 100%;background-color:currentColor;color:inherit;display:inline-flex;width:1em;height:1em}.i-soft-dns-close{background:url("data:image/svg+xml;utf8,%3Csvg display='inline-flex' width='1em' height='1em' t='1762334981673' class='icon' viewBox='0 0 1024 1024' version='1.1' xmlns='http://www.w3.org/2000/svg' p-id='10737' xmlns:xlink='http://www.w3.org/1999/xlink'%3E%3Cpath d='M515.7 960.1c-29.2-0.1-52.9-23.9-52.9-53l-0.1-149.8c0.3-1.5 0.4-2.8 0.4-4V743l-10.1-2.1c-62.1-12.9-118.8-45.2-164-93.4-60-64.1-93.1-149.1-93.1-239.4v-107l-26.7 0.2c-6.3 0-12.2-2.5-16.7-7s-6.9-10.4-6.9-16.7c0-6.4 2.4-12.4 6.9-16.8 4.4-4.5 10.4-6.9 16.7-6.9h64.6l-102.9-103c-4.9-4.9-7.6-11.5-7.6-18.4 0-7 2.7-13.5 7.6-18.4 4.9-4.9 11.5-7.6 18.4-7.6s13.5 2.7 18.4 7.6l139.7 139.7h12.2V95c0-17.1 13.9-31.1 31.1-31.1 17.1 0 31 13.9 31 31.1l0.1 158.8h265.4V95c0-17.1 13.9-31 31.1-31 17.1 0 31 13.9 31 31.1v158.7l148.1 0.1c13.1 0 23.7 10.6 23.7 23.7 0 6.4-2.5 12.3-6.9 16.8-4.5 4.5-10.4 7-16.9 7h-21.9v106.9c0 94.5-35.7 182.2-100.5 246.9l-1.6 1.6c-1.7 1.7-3.5 3.3-5.4 5l-6.4 5.9L893 839.2c10.2 10.2 10.2 26.7 0 36.9-4.9 4.9-11.5 7.6-18.4 7.6-7 0-13.5-2.7-18.4-7.6L679.4 699.4l-3.1 1.9c-30.8 19-63.8 32.3-98.2 39.6l-10.7 2.3 0.7 10.9 0.2 2.4 0.1 150.7c0.1 14.1-5.4 27.3-15.4 37.4-10 10-23.3 15.5-37.3 15.5zM243.4 408.2c0 78.2 28.5 151.6 80.3 206.8 51.4 54.7 119.6 84.9 192 84.9 43 0 85.8-11.1 124-32l5.4-3-363.9-363.7h-37.9l0.1 107z m444.3 225.7l6.3-5.7c2.4-2.2 4.9-4.3 7.2-6.6 55-55.1 86.6-132.9 86.6-213.4v-12.7h-0.1v-94.2l-432.7-0.1 332.7 332.7z' p-id='10738' fill='%23ffffff'%3E%3C/path%3E%3C/svg%3E") no-repeat;background-size:100% 100%;background-color:transparent;display:inline-flex;width:1em;height:1em}.i-soft-dns-disk{--un-icon:url("data:image/svg+xml;utf8,%3Csvg display='inline-flex' width='1em' height='1em' t='1762244187005' class='icon' viewBox='0 0 1024 1024' version='1.1' xmlns='http://www.w3.org/2000/svg' p-id='7877' xmlns:xlink='http://www.w3.org/1999/xlink'%3E%3Cpath d='M554.688 682.624a42.688 42.688 0 0 0 0 85.376h0.448a42.688 42.688 0 1 0 0-85.376h-0.448zM767.488 682.624a42.688 42.688 0 0 0 0 85.376H768a42.688 42.688 0 1 0 0-85.376h-0.512z' fill='currentColor' p-id='7878'%3E%3C/path%3E%3Cpath d='M465.28 96h93.44c59.456 0 106.88 0 144.96 4.48 39.36 4.48 72.128 14.08 100.992 35.584 28.8 21.44 47.424 50.112 63.104 86.464 15.232 35.2 28.8 80.64 45.952 137.6l52.48 174.848c1.28 4.48 2.752 9.28 3.584 14.336v0.32l0.192 1.216c0.64 5.12 0.64 10.048 0.64 14.72v3.392c0 72.704 0 130.304-5.632 175.68-5.824 46.592-18.112 84.736-45.952 115.84-4.992 5.568-10.304 10.88-15.936 15.872-31.104 27.84-69.184 40.128-115.84 45.952-45.312 5.696-102.912 5.696-175.616 5.696H412.352c-72.704 0-130.304 0-175.68-5.696-46.592-5.824-84.672-18.112-115.84-45.888a202.944 202.944 0 0 1-15.872-16c-27.84-31.04-40.128-69.12-45.952-115.84-5.696-45.312-5.696-102.912-5.696-175.616v-3.328c0-4.672 0-9.664 0.704-14.784v-0.32l0.192-1.216c0.832-5.056 2.24-9.856 3.584-14.272l52.48-174.912c17.088-56.96 30.72-102.4 45.952-137.6 15.68-36.352 34.304-65.024 63.104-86.4 28.8-21.504 61.632-31.104 100.992-35.712C358.4 96 405.76 96 465.28 96zM327.68 164.032c-33.152 3.84-53.632 11.072-70.144 23.36-16.512 12.288-29.376 29.824-42.56 60.48-13.568 31.424-26.176 73.28-43.968 132.544l-42.688 142.272h767.36l-42.688-142.272c-17.792-59.264-30.4-101.12-43.968-132.48-13.184-30.72-26.048-48.256-42.56-60.544-16.512-12.288-36.992-19.52-70.144-23.36C662.336 160 618.624 160 556.736 160H467.328c-61.952 0-105.6 0-139.648 4.032zM122.496 736.64c5.056 40.128 14.528 63.616 30.144 81.088 3.456 3.84 7.04 7.488 10.88 10.88 17.536 15.68 40.96 25.088 81.152 30.144 40.96 5.12 94.464 5.184 169.92 5.184h194.816c75.456 0 129.024 0 169.92-5.184 40.128-5.056 63.616-14.464 81.152-30.08 3.84-3.456 7.424-7.104 10.88-10.944 15.616-17.536 25.088-40.96 30.08-81.088 4.672-37.248 5.12-84.928 5.248-150.016H117.312c0.064 65.088 0.512 112.768 5.184 150.016z' fill='currentColor' p-id='7879'%3E%3C/path%3E%3C/svg%3E");-webkit-mask:var(--un-icon) no-repeat;mask:var(--un-icon) no-repeat;-webkit-mask-size:100% 100%;mask-size:100% 100%;background-color:currentColor;color:inherit;display:inline-flex;width:1em;height:1em}.i-soft-dns-icon{--un-icon:url("data:image/svg+xml;utf8,%3Csvg display='inline-flex' width='1em' height='1em' t='1762335529080' class='icon' viewBox='0 0 1024 1024' version='1.1' xmlns='http://www.w3.org/2000/svg' p-id='11802' xmlns:xlink='http://www.w3.org/1999/xlink'%3E%3Cpath d='M170.666667 128h682.666666a42.666667 42.666667 0 0 1 42.666667 42.666667v298.666666H128V170.666667a42.666667 42.666667 0 0 1 42.666667-42.666667zM128 554.666667h768v298.666666a42.666667 42.666667 0 0 1-42.666667 42.666667H170.666667a42.666667 42.666667 0 0 1-42.666667-42.666667v-298.666666z m170.666667 128v85.333333h128v-85.333333H298.666667zM298.666667 256v85.333333h128V256H298.666667z' fill='currentColor' p-id='11803'%3E%3C/path%3E%3C/svg%3E");-webkit-mask:var(--un-icon) no-repeat;mask:var(--un-icon) no-repeat;-webkit-mask-size:100% 100%;mask-size:100% 100%;background-color:currentColor;color:inherit;display:inline-flex;width:1em;height:1em}.i-soft-dns-menu{--un-icon:url("data:image/svg+xml;utf8,%3Csvg display='inline-flex' width='1em' height='1em' t='1762241899839' class='icon' viewBox='0 0 1025 1024' version='1.1' xmlns='http://www.w3.org/2000/svg' p-id='12295' xmlns:xlink='http://www.w3.org/1999/xlink'%3E%3Cpath d='M163.231468 552.233328c6.707287 4.471525 14.905083 6.707287 23.102879 6.707287 12.669321-0.745254 24.593387-5.216779 33.536437-14.159829 17.8861-17.8861 17.8861-46.951012 0-65.582365-8.94305-8.94305-20.867116-13.414575-33.536437-14.159829-8.197796 0-16.395591 2.235762-23.102879 6.707287-7.452542 4.471525-12.669321 10.433558-17.140846 17.140846-8.197796 14.159829-8.197796 31.300674 0 46.205757 4.471525 6.707287 10.433558 13.414575 17.140846 17.140846zM1024.74527 791.459911c0-11.924066-4.471525-23.848133-13.414575-32.791182-8.94305-8.94305-20.121862-13.414575-32.791183-14.159829H46.226566c-12.669321 0.745254-23.848133 5.216779-32.791183 14.159829-8.94305 8.94305-13.414575 20.121862-13.414575 32.791182v186.313539c-0.745254 24.593387 18.631354 45.460503 43.969995 46.205757H978.539512c24.593387 0.745254 45.460503-18.631354 45.460504-43.969995v-188.549301z m-46.205758 0v186.313539H46.226566v-186.313539h932.312946z' p-id='12296' fill='currentColor'%3E%3C/path%3E%3Cpath d='M978.539512 371.881823H46.226566c-12.669321 0-24.593387 4.471525-32.791183 13.414575C5.237587 394.984702 0.766062 406.908768 0.766062 418.832834v185.568285c0 12.669321 4.471525 24.593387 13.414575 33.536437 8.197796 8.94305 20.121862 14.159829 32.791183 13.414574h932.312946c12.669321 0 24.593387-4.471525 32.791183-13.414574 8.94305-8.94305 13.414575-20.867116 13.414575-33.536437V418.832834c0-12.669321-4.471525-24.593387-13.414575-33.536436-8.94305-8.197796-20.867116-13.414575-33.536437-13.414575z m0 46.951011v185.568285H46.226566V418.832834h932.312946zM980.775275 0H46.226566C34.302499 0 22.378433 4.471525 13.435383 13.414575 5.237587 21.61237 0.020808 33.536437 0.766062 45.460503v186.313539c0 11.924066 4.471525 23.848133 13.414575 32.791183 8.94305 8.94305 20.121862 13.414575 32.791183 14.159829h932.312946c12.669321-0.745254 23.848133-5.216779 32.791183-14.159829 8.94305-8.94305 13.414575-20.867116 13.414575-32.791183v-186.313539c0-24.593387-20.121862-44.715249-44.715249-45.460503z m-2.235763 232.519296H46.226566v-186.313538h932.312946v186.313538z' p-id='12297' fill='currentColor'%3E%3C/path%3E%3Cpath d='M163.231468 179.606251c18.631354 10.433558 40.988978 7.452542 55.894061-6.707287 8.94305-8.197796 14.159829-20.121862 13.414575-32.791183 0-26.083895-20.867116-46.951012-46.205757-46.951012h-0.745255c-8.197796 0-15.650337 2.235762-23.102878 5.962033s-12.669321 9.688304-17.140846 17.140846c-8.197796 14.905083-8.197796 32.045929 0 46.951012 5.216779 6.707287 11.178812 12.669321 17.8861 16.395591z' p-id='12298' fill='currentColor'%3E%3C/path%3E%3C/svg%3E");-webkit-mask:var(--un-icon) no-repeat;mask:var(--un-icon) no-repeat;-webkit-mask-size:100% 100%;mask-size:100% 100%;background-color:currentColor;color:inherit;display:inline-flex;width:1em;height:1em}.i-soft-dns-open{background:url("data:image/svg+xml;utf8,%3Csvg display='inline-flex' width='1em' height='1em' t='1762328247815' class='icon' viewBox='0 0 1024 1024' version='1.1' xmlns='http://www.w3.org/2000/svg' p-id='7956' xmlns:xlink='http://www.w3.org/1999/xlink'%3E%3Cpath d='M341.333333 386.773333h341.333334a85.333333 85.333333 0 0 1 85.333333 85.333334v149.333333a234.752 234.752 0 0 1-177.28 227.584A64 64 0 0 1 533.333333 941.44h-42.666666a64 64 0 0 1-57.386667-92.416A234.752 234.752 0 0 1 256 621.44v-149.333333a85.333333 85.333333 0 0 1 85.333333-85.333334z m85.333334-42.666666H341.333333v-213.333334a42.666667 42.666667 0 1 1 85.333334 0v213.333334z m256 0H597.333333v-213.333334a42.666667 42.666667 0 1 1 85.333334 0v213.333334z' p-id='7957' fill='%234CAF50'%3E%3C/path%3E%3C/svg%3E") no-repeat;background-size:100% 100%;background-color:transparent;display:inline-flex;width:1em;height:1em}.i-soft-dns-reload{background:url("data:image/svg+xml;utf8,%3Csvg display='inline-flex' width='1em' height='1em' t='1762410163124' class='icon' viewBox='0 0 1024 1024' version='1.1' xmlns='http://www.w3.org/2000/svg' p-id='32942' xmlns:xlink='http://www.w3.org/1999/xlink'%3E%3Cpath d='M758.5792 234.2912c0 29.0816 23.3472 52.4288 52.4288 52.4288 29.0816 0 52.4288-23.3472 52.4288-52.4288s-23.7568-52.4288-52.4288-52.4288c-29.0816 0-52.4288 23.7568-52.4288 52.4288zM855.6544 516.9152c0 23.3472 12.288 44.2368 31.9488 56.1152 19.6608 11.8784 45.056 11.8784 64.7168 0a65.3312 65.3312 0 0 0 0-112.2304c-19.6608-11.8784-45.056-11.8784-64.7168 0s-31.9488 33.1776-31.9488 56.1152zM736.8704 801.1776c0 27.0336 14.7456 52.4288 38.0928 65.9456 23.3472 13.5168 52.4288 13.5168 76.1856 0 23.3472-13.5168 38.0928-38.912 38.0928-65.9456s-14.7456-52.4288-38.0928-65.9456c-23.3472-13.5168-52.4288-13.5168-76.1856 0-23.3472 13.9264-38.0928 38.912-38.0928 65.9456zM440.7296 915.0464c0 31.5392 16.7936 60.2112 44.2368 76.1856 27.0336 15.9744 61.0304 15.9744 88.064 0a89.2928 89.2928 0 0 0 44.2368-76.1856c0-31.5392-16.7936-60.2112-44.2368-76.1856-27.0336-15.9744-61.0304-15.9744-88.064 0-26.624 15.9744-44.2368 45.056-44.2368 76.1856zM151.1424 797.0816c0 35.2256 18.432 67.584 49.152 84.7872 30.3104 17.2032 67.584 17.2032 97.8944 0a97.4848 97.4848 0 0 0 48.7424-84.7872 97.8944 97.8944 0 0 0-97.8944-97.8944c-54.4768-0.8192-97.8944 43.8272-97.8944 97.8944zM426.8032 124.1088c0 57.344 46.6944 104.0384 104.0384 104.0384s104.0384-46.6944 104.0384-104.0384c0-36.864-19.6608-71.2704-51.6096-89.7024-31.9488-18.432-72.0896-18.432-104.0384 0a103.6288 103.6288 0 0 0-52.4288 89.7024zM144.9984 236.7488c0 36.864 19.6608 71.2704 51.6096 89.7024 31.9488 18.432 72.0896 18.432 104.0384 0a102.8096 102.8096 0 0 0 52.4288-89.7024c0-57.344-46.6944-104.0384-104.0384-104.0384-57.344 0-104.0384 46.2848-104.0384 104.0384zM39.7312 514.048c0 54.8864 44.2368 99.1232 99.1232 99.1232s99.1232-44.2368 99.1232-99.1232c0-54.8864-44.2368-99.1232-99.1232-99.1232-54.8864 0-99.1232 44.2368-99.1232 99.1232z' p-id='32943' fill='%2320A53A'%3E%3C/path%3E%3C/svg%3E") no-repeat;background-size:100% 100%;background-color:transparent;display:inline-flex;width:1em;height:1em}.i-soft-dns-restart{background:url("data:image/svg+xml;utf8,%3Csvg display='inline-flex' width='1em' height='1em' t='1762327725612' class='icon' viewBox='0 0 1024 1024' version='1.1' xmlns='http://www.w3.org/2000/svg' p-id='5980' xmlns:xlink='http://www.w3.org/1999/xlink'%3E%3Cpath d='M512.170724 1024c-282.416084 0-512.17061-208.087082-512.17061-463.888037 0-255.744085 229.754526-463.774297 512.17061-463.774298h8.24614V0l247.327335 149.681662-247.384205 149.567921V203.025658H512.170724c-216.674442 0-392.857492 160.259469-392.857492 357.200045 0 196.940575 176.23992 357.086305 392.857492 357.086304s392.857492-160.202599 392.857491-357.200044c0-29.401755 26.728868-53.343996 59.656559-53.343997 32.870821 0 59.599689 23.942241 59.599689 53.343997 0 123.521493-53.173387 239.877374-149.795401 327.570809-96.906365 87.864045-225.546151 136.317228-362.318338 136.317228z' fill='%2320A53A' p-id='5981'%3E%3C/path%3E%3C/svg%3E") no-repeat;background-size:100% 100%;background-color:transparent;display:inline-flex;width:1em;height:1em}.i-soft-dns-server{--un-icon:url("data:image/svg+xml;utf8,%3Csvg display='inline-flex' width='1em' height='1em' t='1762241874270' class='icon' viewBox='0 0 1024 1024' version='1.1' xmlns='http://www.w3.org/2000/svg' p-id='10262' xmlns:xlink='http://www.w3.org/1999/xlink' %3E%3Cpath d='M306.820741 191.525926c-51.579259 11.188148-103.632593 63.241481-114.820741 114.820741-21.428148 99.176296 53.475556 186.785185 148.954074 186.785185l152.651852 0 0-6.447407 0-31.478519L493.605926 333.937778l-0.18963 0C489.623704 241.682963 403.816296 170.571852 306.820741 191.525926zM455.68 455.205926l-114.725926 0c-63.905185 0-115.579259-52.242963-114.725926-116.337778 0.853333-61.819259 51.294815-112.260741 113.114074-113.114074 64.094815-0.853333 116.337778 50.820741 116.337778 114.725926L455.68 455.205926z' fill='currentColor' p-id='10263'%3E%3C/path%3E%3Cpath d='M832.663704 306.346667c-11.188148-51.579259-63.241481-103.632593-114.820741-114.820741-96.900741-20.954074-182.802963 50.157037-186.595556 142.506667l-0.18963 0 0 121.173333 0 31.478519 0 6.447407 152.651852 0C779.093333 493.131852 854.091852 405.522963 832.663704 306.346667zM568.983704 340.48c0-63.905185 52.242963-115.579259 116.337778-114.725926 61.819259 0.853333 112.260741 51.294815 113.114074 113.114074 0.853333 64.094815-50.820741 116.337778-114.725926 116.337778l-114.725926 0L568.983704 340.48z' fill='currentColor' p-id='10264'%3E%3C/path%3E%3Cpath d='M192 717.842963c11.188148 51.579259 63.241481 103.632593 114.820741 114.820741 96.900741 20.954074 182.802963-50.157037 186.595556-142.506667l0.18963 0L493.605926 568.983704l0-31.478519 0-6.447407-152.651852 0C245.475556 531.057778 170.571852 618.666667 192 717.842963zM455.68 683.70963c0 63.905185-52.242963 115.579259-116.337778 114.725926-61.819259-0.853333-112.260741-51.294815-113.114074-113.114074-0.853333-64.094815 50.820741-116.337778 114.725926-116.337778l114.725926 0L455.68 683.70963z' fill='currentColor' p-id='10265'%3E%3C/path%3E%3Cpath d='M683.70963 531.057778l-152.651852 0 0 6.447407 0 31.478519 0 121.173333 0.18963 0c3.887407 92.34963 89.694815 163.460741 186.595556 142.506667 51.579259-11.188148 103.632593-63.241481 114.820741-114.820741C854.091852 618.666667 779.093333 531.057778 683.70963 531.057778zM798.435556 685.321481C797.582222 747.140741 747.140741 797.582222 685.321481 798.435556c-64.094815 0.853333-116.337778-50.820741-116.337778-114.725926l0-114.725926 114.725926 0C747.614815 568.983704 799.288889 621.226667 798.435556 685.321481z' fill='currentColor' p-id='10266'%3E%3C/path%3E%3C/svg%3E");-webkit-mask:var(--un-icon) no-repeat;mask:var(--un-icon) no-repeat;-webkit-mask-size:100% 100%;mask-size:100% 100%;background-color:currentColor;color:inherit;display:inline-flex;width:1em;height:1em}.i-soft-dns-stop{background:url("data:image/svg+xml;utf8,%3Csvg display='inline-flex' width='1em' height='1em' t='1762327609688' class='icon' viewBox='0 0 1024 1024' version='1.1' xmlns='http://www.w3.org/2000/svg' p-id='4672' xmlns:xlink='http://www.w3.org/1999/xlink'%3E%3Cpath d='M320 128A64 64 0 0 0 256 192v640a64 64 0 0 0 128 0v-640A64 64 0 0 0 320 128z m384 0A64 64 0 0 0 640 192v640a64 64 0 0 0 128 0v-640A64 64 0 0 0 704 128z' fill='%2320A53A' p-id='4673'%3E%3C/path%3E%3C/svg%3E") no-repeat;background-size:100% 100%;background-color:transparent;display:inline-flex;width:1em;height:1em}.i-soft-dns-system{--un-icon:url("data:image/svg+xml;utf8,%3Csvg display='inline-flex' width='1em' height='1em' t='1762241912388' class='icon' viewBox='0 0 1024 1024' version='1.1' xmlns='http://www.w3.org/2000/svg' p-id='13400' xmlns:xlink='http://www.w3.org/1999/xlink'%3E%3Cpath d='M608 96c35.3456 0 64 28.6544 64 64v192c0 35.3456-28.6544 64-64 64h-72v71.9984L760 488c34.992 0 63.4256 28.0832 63.992 62.9424L824 552v56h72c35.3456 0 64 28.6544 64 64v192c0 35.3456-28.6544 64-64 64H704c-35.3456 0-64-28.6544-64-64V672c0-35.3456 28.6544-64 64-64h72v-56c0-8.688-6.9232-15.7568-15.552-15.9936L760 536H264c-8.688 0-15.7568 6.9232-15.9936 15.552L248 552v56h72c35.3456 0 64 28.6544 64 64v192c0 35.3456-28.6544 64-64 64H128c-35.3456 0-64-28.6544-64-64V672c0-35.3456 28.6544-64 64-64h72v-56c0-34.992 28.0832-63.4256 62.9424-63.992L264 488l224-0.0016V416h-72c-35.3456 0-64-28.6544-64-64V160c0-35.3456 28.6544-64 64-64h192zM320 656H128c-8.8368 0-16 7.1632-16 16v192c0 8.8368 7.1632 16 16 16h192c8.8368 0 16-7.1632 16-16V672c0-8.8368-7.1632-16-16-16z m576 0H704c-8.8368 0-16 7.1632-16 16v192c0 8.8368 7.1632 16 16 16h192c8.8368 0 16-7.1632 16-16V672c0-8.8368-7.1632-16-16-16zM608 144H416c-8.8368 0-16 7.1632-16 16v192c0 8.8368 7.1632 16 16 16h192c8.8368 0 16-7.1632 16-16V160c0-8.8368-7.1632-16-16-16z' fill='currentColor' p-id='13401'%3E%3C/path%3E%3C/svg%3E");-webkit-mask:var(--un-icon) no-repeat;mask:var(--un-icon) no-repeat;-webkit-mask-size:100% 100%;mask-size:100% 100%;background-color:currentColor;color:inherit;display:inline-flex;width:1em;height:1em}.i-soft-dns-uninstall{--un-icon:url("data:image/svg+xml;utf8,%3Csvg display='inline-flex' width='1em' height='1em' t='1762327863599' class='icon' viewBox='0 0 1024 1024' version='1.1' xmlns='http://www.w3.org/2000/svg' p-id='7095' xmlns:xlink='http://www.w3.org/1999/xlink'%3E%3Cpath d='M464.18 82.59h96.4v96.37h-96.4z' p-id='7096' fill='currentColor'%3E%3C/path%3E%3Cpath d='M78.68 169.93h867.35v96.37H78.68z' p-id='7097' fill='%23ffffff'%3E%3C/path%3E%3Cpath d='M849.65 940.93h-674.6v-771h674.6v771z m-578.22-96.37h481.85V266.31H271.43v578.25z' p-id='7098' fill='currentColor'%3E%3C/path%3E%3Cpath d='M367.8 362.68h96.37v385.5H367.8zM560.53 362.68h96.37v385.5h-96.37z' p-id='7099' fill='currentColor'%3E%3C/path%3E%3C/svg%3E");-webkit-mask:var(--un-icon) no-repeat;mask:var(--un-icon) no-repeat;-webkit-mask-size:100% 100%;mask-size:100% 100%;background-color:currentColor;color:inherit;display:inline-flex;width:1em;height:1em}.i-solar\:close-circle-bold{--un-icon:url("data:image/svg+xml;utf8,%3Csvg viewBox='0 0 24 24' display='inline-flex' width='1em' height='1em' xmlns='http://www.w3.org/2000/svg' %3E%3Cpath fill='currentColor' fill-rule='evenodd' d='M22 12c0 5.523-4.477 10-10 10S2 17.523 2 12S6.477 2 12 2s10 4.477 10 10M8.97 8.97a.75.75 0 0 1 1.06 0L12 10.94l1.97-1.97a.75.75 0 0 1 1.06 1.06L13.06 12l1.97 1.97a.75.75 0 0 1-1.06 1.06L12 13.06l-1.97 1.97a.75.75 0 0 1-1.06-1.06L10.94 12l-1.97-1.97a.75.75 0 0 1 0-1.06' clip-rule='evenodd'/%3E%3C/svg%3E");-webkit-mask:var(--un-icon) no-repeat;mask:var(--un-icon) no-repeat;-webkit-mask-size:100% 100%;mask-size:100% 100%;background-color:currentColor;color:inherit;display:inline-flex;width:1em;height:1em}.i-streamline\:delete-1-solid{--un-icon:url("data:image/svg+xml;utf8,%3Csvg viewBox='0 0 14 14' display='inline-flex' width='1em' height='1em' xmlns='http://www.w3.org/2000/svg' %3E%3Cpath fill='currentColor' fill-rule='evenodd' d='M1.707.293A1 1 0 0 0 .293 1.707L5.586 7L.293 12.293a1 1 0 1 0 1.414 1.414L7 8.414l5.293 5.293a1 1 0 0 0 1.414-1.414L8.414 7l5.293-5.293A1 1 0 0 0 12.293.293L7 5.586z' clip-rule='evenodd'/%3E%3C/svg%3E");-webkit-mask:var(--un-icon) no-repeat;mask:var(--un-icon) no-repeat;-webkit-mask-size:100% 100%;mask-size:100% 100%;background-color:currentColor;color:inherit;display:inline-flex;width:1em;height:1em}.i-svg-spinners\:3-dots-fade{--un-icon:url("data:image/svg+xml;utf8,%3Csvg viewBox='0 0 24 24' display='inline-flex' width='1em' height='1em' xmlns='http://www.w3.org/2000/svg' %3E%3Ccircle cx='4' cy='12' r='3' fill='currentColor'%3E%3Canimate id='SVG7x14Dcom' fill='freeze' attributeName='opacity' begin='0;SVGqSjG0dUp.end-0.25s' dur='0.75s' values='1;.2'/%3E%3C/circle%3E%3Ccircle cx='12' cy='12' r='3' fill='currentColor' opacity='.4'%3E%3Canimate fill='freeze' attributeName='opacity' begin='SVG7x14Dcom.begin+0.15s' dur='0.75s' values='1;.2'/%3E%3C/circle%3E%3Ccircle cx='20' cy='12' r='3' fill='currentColor' opacity='.3'%3E%3Canimate id='SVGqSjG0dUp' fill='freeze' attributeName='opacity' begin='SVG7x14Dcom.begin+0.3s' dur='0.75s' values='1;.2'/%3E%3C/circle%3E%3C/svg%3E");-webkit-mask:var(--un-icon) no-repeat;mask:var(--un-icon) no-repeat;-webkit-mask-size:100% 100%;mask-size:100% 100%;background-color:currentColor;color:inherit;display:inline-flex;width:1em;height:1em}.i-svg-spinners\:90-ring-with-bg{--un-icon:url("data:image/svg+xml;utf8,%3Csvg viewBox='0 0 24 24' display='inline-flex' width='1em' height='1em' xmlns='http://www.w3.org/2000/svg' %3E%3Cpath fill='currentColor' d='M12,1A11,11,0,1,0,23,12,11,11,0,0,0,12,1Zm0,19a8,8,0,1,1,8-8A8,8,0,0,1,12,20Z' opacity='.25'/%3E%3Cpath fill='currentColor' d='M10.14,1.16a11,11,0,0,0-9,8.92A1.59,1.59,0,0,0,2.46,12,1.52,1.52,0,0,0,4.11,10.7a8,8,0,0,1,6.66-6.61A1.42,1.42,0,0,0,12,2.69h0A1.57,1.57,0,0,0,10.14,1.16Z'%3E%3CanimateTransform attributeName='transform' dur='0.75s' repeatCount='indefinite' type='rotate' values='0 12 12;360 12 12'/%3E%3C/path%3E%3C/svg%3E");-webkit-mask:var(--un-icon) no-repeat;mask:var(--un-icon) no-repeat;-webkit-mask-size:100% 100%;mask-size:100% 100%;background-color:currentColor;color:inherit;display:inline-flex;width:1em;height:1em}.i-system\:alibaba{background:url("data:image/svg+xml;utf8,%3Csvg display='inline-flex' width='1em' height='1em' id='_图层_1' data-name='图层_1' xmlns='http://www.w3.org/2000/svg' version='1.1' viewBox='0 0 1024 1024'%3E%3C!-- Generator: Adobe Illustrator 29.0.1, SVG Export Plug-In . SVG Version: 2.1.0 Build 192) --%3E%3Cdefs%3E%3Cstyle%3E.st0 {fill: %23f76e05;}%3C/style%3E%3C/defs%3E%3Cpath class='st0' d='M224.55,659.8c-18.73-3.86-32.23-20.25-32.44-39.37v-216.85c.74-18.92,14.01-35.03,32.44-39.37l201.33-43.6,21.16-86.3h-233.84c-81.84-.57-148.63,65.31-149.2,147.15,0,.32,0,.64,0,.97v256.28c.53,82.19,67.01,148.71,149.2,149.27h233.71l-21.16-85.92-201.33-42.19.13-.06ZM810.28,234.3h-235.51l21.48,86.24,201.33,43.6c18.7,3.93,32.16,20.33,32.38,39.43v216.85c-.76,18.91-13.99,35.01-32.38,39.43l-201.33,43.6-21.48,86.24h235.51c82.51.18,149.54-66.57,149.72-149.08,0-.17,0-.34,0-.51v-257.63c-1.02-82.01-67.7-148.01-149.72-148.18Z'/%3E%3Cpath class='st0' d='M425.89,500.72h171.71v21.16h-171.71v-21.16Z'/%3E%3C/svg%3E") no-repeat;background-size:100% 100%;background-color:transparent;display:inline-flex;width:1em;height:1em}.i-system\:alma{background:url("data:image/svg+xml;utf8,%3Csvg display='inline-flex' width='1em' height='1em' id='_图层_1' data-name='图层_1' xmlns='http://www.w3.org/2000/svg' version='1.1' viewBox='0 0 1024 1024'%3E%3C!-- Generator: Adobe Illustrator 29.0.1, SVG Export Plug-In . SVG Version: 2.1.0 Build 192) --%3E%3Cdefs%3E%3Cstyle%3E.st0 {fill: %2386da2f;}.st1 {fill: %23ffcb12;}.st2 {fill: %230069da;}.st3 {fill: %23ff4649;}.st4 {fill: %2324c2ff;}%3C/style%3E%3C/defs%3E%3Cpath class='st0' d='M887.84,568.74c38.14-2.92,68.99,22.01,71.95,60.19,2.92,39.66-25.01,71.95-63.15,74.87-36.85,2.71-68.99-24.83-71.95-61.67-2.96-39.62,23.45-69.03,63.11-73.43v.04h.04Z'/%3E%3Cpath class='st4' d='M423.92,881.47c0-38.14,29.37-67.51,64.59-67.51s69.03,32.33,69.03,68.99-29.33,66.11-63.11,67.55c-42.58,0-70.51-26.49-70.51-68.99v-.04Z'/%3E%3Cpath class='st1' d='M528.12,452.77c-5.84,2.96-8.8-1.44-10.25-5.84-54.3-101.36-38.18-229.06,57.26-305.41,24.97-20.53,71.95-25.01,92.48-4.4,8.8,7.4,10.28,16.13,11.76,26.41,2.92,22.05,7.32,44.06,22.05,61.67,16.13,19.13,36.66,26.41,60.15,25.01,20.53,0,41.1-2.92,54.34,20.53,7.32,13.24,4.4,64.55-7.32,74.83-5.88,4.44-10.28,1.48-14.69,0-33.81-13.21-69.03-13.21-104.28-7.32-11.73,1.44-17.61-1.48-17.61-14.69-1.48-22.05-5.84-42.58-17.61-61.67-22.01-39.66-63.11-41.14-89.56-4.4-22.01,29.37-27.85,64.59-33.77,99.88-5.88,30.77-4.4,63.11-2.96,95.44v-.04Z'/%3E%3Cpath class='st0' d='M564.82,474.78c-2.92-4.44-1.48-8.8,2.92-11.73,83.72-76.35,208.53-91.04,305.41-16.17,24.93,20.57,41.1,63.15,27.89,88.12-4.67,8.62-12.64,14.98-22.09,17.61-20.53,8.8-39.62,17.65-52.82,36.7-13.21,19.17-16.13,41.1-10.25,64.67,4.4,19.05,11.73,39.58-7.36,57.19-10.25,10.28-60.19,19.13-73.39,10.28-5.84-4.4-4.4-8.8-2.96-14.69,4.4-36.7-4.4-70.51-17.61-102.76-4.4-11.73-2.92-17.61,8.8-20.53,20.57-5.84,39.7-16.17,54.34-30.81,32.29-30.81,25.01-70.43-17.61-88.08-33.77-14.73-68.99-11.76-102.76-8.8-32.26,1.44-63.11,10.25-92.48,19.09,0,0-.04-.08-.04-.08Z'/%3E%3Cpath class='st4' d='M545.73,512.95c4.4-4.4,7.4-2.96,11.76,0,96.88,58.75,146.78,174.68,102.76,287.77-11.76,29.41-49.94,58.75-77.79,51.42-11.73-2.88-17.65-8.8-23.53-16.13-13.21-17.69-27.89-33.81-49.86-41.1-23.49-7.32-44.1-2.92-64.67,8.8-17.57,10.28-35.18,23.49-57.19,10.28-13.24-7.36-35.25-52.82-30.85-67.51,2.92-5.84,8.8-5.84,14.73-5.84,36.66-5.88,66.07-23.49,93.96-47.02,8.8-7.36,16.13-7.36,23.45,2.92,11.76,17.61,26.41,32.29,45.5,42.54,38.18,22.09,74.87,2.96,79.27-41.06,4.4-36.7-8.8-68.95-20.53-101.28-13.34-29.15-29.07-57.15-47.02-83.72v-.08Z'/%3E%3Cpath class='st2' d='M498.75,521.8c-5.84,29.33-19.09,57.23-36.62,82.2-52.9,79.24-129.25,111.57-223.22,102.76-33.74-2.96-61.67-30.85-64.55-58.75-1.66-10.61,1.58-21.39,8.8-29.33,10.25-13.21,19.09-25.01,23.45-41.1,8.8-32.33-2.92-58.75-26.41-82.2-32.26-32.33-27.85-61.71,10.28-85.16,4.4-2.96,10.28-5.84,16.13-8.8,8.8-4.4,16.17-4.4,19.13,5.84,13.24,33.77,39.62,58.75,69.03,79.31,10.28,8.8,10.28,14.65,1.48,24.97-17.63,18.79-28.03,43.22-29.37,68.95-2.92,32.33,16.17,52.9,48.42,52.9,20.57,0,39.62-7.32,57.26-16.13,45.5-23.53,80.72-57.26,114.53-92.56,4.4-1.48,5.84-4.4,11.73-2.92h-.08Z'/%3E%3Cpath class='st3' d='M258.01,213.46c2.92,0,10.25,1.44,17.61,2.92,54.34,10.28,88.08-8.8,105.69-60.23,11.73-33.74,36.7-44.06,69.03-26.41,1.44,0,1.44,1.48,2.92,1.48,33.74,19.09,33.74,22.01,13.21,51.42-17.61,23.45-26.49,49.86-30.81,77.79-2.92,16.17-8.8,19.13-23.49,13.24-23.45-8.84-48.42-8.84-73.39,0-27.89,8.76-39.62,33.7-30.81,61.63,11.73,36.7,44.02,52.9,71.87,71.95,27.93,19.13,60.23,29.41,91.04,42.58,4.44,1.44,11.73,1.44,10.28,8.8-1.48,4.44-7.36,4.44-13.24,4.44-66.07,2.92-129.14-7.4-180.56-51.42-48.46-39.62-83.68-88.04-77.83-155.59,4.4-22.05,20.57-38.18,48.5-42.58,0,0,0-.04,0-.04Z'/%3E%3Cpath class='st2' d='M137.63,626c-35.22,4.4-70.43-24.97-73.43-61.67-2.92-35.22,26.41-70.51,60.19-73.39,38.14-4.48,73.39,21.97,76.35,57.19,1.44,33.81-20.57,74.91-63.15,77.79v.08h.04Z'/%3E%3Cpath class='st1' d='M754.26,103.37c36.66-2.96,71.95,26.41,74.87,63.11,2.96,35.25-26.49,69.03-61.67,71.91-38.18,2.96-71.95-24.93-74.87-61.67-2.96-36.7,23.45-70.43,61.67-73.35Z'/%3E%3Cpath class='st3' d='M371.05,131.19c4.44,38.18-22.09,70.47-61.71,76.35-33.74,4.44-68.99-23.45-73.39-55.71-4.44-42.62,19.09-73.47,58.75-77.87,36.66-4.44,71.87,23.45,76.35,57.23Z'/%3E%3C/svg%3E") no-repeat;background-size:100% 100%;background-color:transparent;display:inline-flex;width:1em;height:1em}.i-system\:anolis{background:url("data:image/svg+xml;utf8,%3Csvg display='inline-flex' width='1em' height='1em' id='_图层_1' data-name='图层_1' xmlns='http://www.w3.org/2000/svg' version='1.1' viewBox='0 0 1024 1024'%3E%3C!-- Generator: Adobe Illustrator 29.0.1, SVG Export Plug-In . SVG Version: 2.1.0 Build 192) --%3E%3Cdefs%3E%3Cstyle%3E.st0 {fill: %2359ab2d;}%3C/style%3E%3C/defs%3E%3Cpath class='st0' d='M513.19,63.99c-118.97,0-233.12,47.59-317.24,132.51-84.27,85.23-131.5,200.27-131.42,320.13,0,4.23.5,8.41.55,12.54l-1,310.87c-.8,20.21,3.83,40.32,13.39,58.24,9.46,17.87,20.91,31.36,40.82,43.61,19.71,12.2,36.74,16.48,56.9,16.88,20.14.43,40.04-4.55,57.59-14.44,35.88-20.29,58.14-58.24,58.34-99.46v-34.5l1.39-163.52v-127.88c.33-23.73-8.17-46.74-23.84-64.56-25.17-29.14-22.89-72.94,5.18-99.31,28-26.27,71.92-25.16,98.56,2.49,26.72,27.71,26.85,71.54.3,99.41-15.67,17.17-24.2,39.68-23.84,62.92v26.98s11.9,100.21,82.73,10.06l44.8-73.77c12.3-20.26,16.78-44.5,12.44-67.85-7.29-37.94,17.01-74.76,54.76-82.98,37.74-7.95,74.88,15.82,83.48,53.41,8.98,37.56-13.57,75.45-50.87,85.47-22.1,6.47-40.82,21.16-52.52,40.97l-47.44,77.85s-24.24,46.19,31.61,46.19l64.21-2.04c23.05-.3,45.1-9.46,61.68-25.54,26.72-27.62,70.7-28.55,98.56-2.09,27.98,26.38,29.92,70.49,4.48,99.36-25.31,28.98-69.27,32.09-98.41,6.97-17.83-15.56-40.86-23.84-64.51-23.2,0,0-64.81-1-107.97,48.58-35.01,39.96-43.44,96.69-21.55,145.11,1.14,2.49,2.49,4.93,3.68,7.72l1.49,2.24c.95,1.69,1.99,3.29,2.99,4.88l1.79,2.74c1,1.49,1.99,2.79,3.14,4.18l2.24,2.84c1.1,1.39,2.19,2.69,3.34,3.88l2.64,2.89,3.58,3.63,2.99,2.69,3.98,3.48,3.34,2.49,4.43,3.29c1.13.83,2.29,1.61,3.48,2.34,1.6,1.1,3.26,2.09,4.98,2.99l3.78,2.29c1.79,1,3.63,1.94,5.43,2.79l4.08,1.99,6.37,2.59,4.03,1.69,7.72,2.64,3.34,1.1c3.93,1.24,7.67,2.24,12.1,3.24l2.39.5c3.53.75,7.12,1.49,10.65,2.09l4.98.75c2.94.45,5.87.9,9.01,1.19l5.97.6,8.11.6c8.61.55,17.32.3,25.89-.55,223.81-48.93,375.14-260,351.24-489.73-23.84-229.78-215.34-404.45-444.28-405.45h-.05Z'/%3E%3C/svg%3E") no-repeat;background-size:100% 100%;background-color:transparent;display:inline-flex;width:1em;height:1em}.i-system\:arch{background:url("data:image/svg+xml;utf8,%3Csvg display='inline-flex' width='1em' height='1em' id='_图层_1' data-name='图层_1' xmlns='http://www.w3.org/2000/svg' version='1.1' viewBox='0 0 1024 1024'%3E%3C!-- Generator: Adobe Illustrator 29.0.1, SVG Export Plug-In . SVG Version: 2.1.0 Build 192) --%3E%3Cdefs%3E%3Cstyle%3E.st0 {fill: %231793d1;}%3C/style%3E%3C/defs%3E%3Cpath class='st0' d='M511.92,64c-39.89,97.78-63.95,161.73-108.36,256.6,27.23,28.86,60.65,62.46,114.93,100.42-58.36-24.01-98.16-48.11-127.9-73.12-56.84,118.58-145.88,287.48-326.59,612.1,142.03-81.98,252.12-132.52,354.72-151.81-4.63-19.94-6.9-40.35-6.74-60.82l.17-4.55c2.25-90.97,49.59-160.93,105.66-156.18,56.07,4.75,99.66,82.4,97.41,173.37-.43,17.11-2.36,33.59-5.73,48.86,101.49,19.85,210.41,70.26,350.51,151.13-27.63-50.85-52.28-96.69-75.83-140.35-37.09-28.74-75.78-66.15-154.7-106.65,54.24,14.09,93.08,30.34,123.35,48.52-239.42-445.67-258.8-504.89-340.91-697.53Z'/%3E%3C/svg%3E") no-repeat;background-size:100% 100%;background-color:transparent;display:inline-flex;width:1em;height:1em}.i-system\:centos{background:url("data:image/svg+xml;utf8,%3Csvg display='inline-flex' width='1em' height='1em' id='_图层_1' data-name='图层_1' xmlns='http://www.w3.org/2000/svg' version='1.1' viewBox='0 0 1024 1024'%3E%3C!-- Generator: Adobe Illustrator 29.0.1, SVG Export Plug-In . SVG Version: 2.1.0 Build 192) --%3E%3Cdefs%3E%3Cstyle%3E.st0 {fill: %23ffa648;}.st1 {fill: %23ffa64c;}.st2 {fill: %232f3597;}.st3 {fill: %23a3248d;}.st4 {fill: %2392307f;}.st5 {fill: %23a6218e;}.st6 {fill: %232b30a5;}.st7 {fill: %232f3291;}.st8 {fill: %23a6cd3c;}.st9 {fill: %23f6ab46;}.st10 {fill: %23a4cb3e;}%3C/style%3E%3C/defs%3E%3Cpath class='st10' d='M195.23,340.05l31.68-31.68,20.38-20.35,20.35,20.35,146.04,146.04h40.74v-40.71l-146.04-146.04-20.38-20.41,20.38-20.35,31.65-31.65h-144.81v144.81Z'/%3E%3Cpath class='st8' d='M454.42,372.96v-177.75h-73.62l-52.07,52.07s125.68,125.68,125.68,125.68ZM195.23,380.82v73.62h177.75l-125.68-125.68s-52.07,52.07-52.07,52.07Z'/%3E%3Cpath class='st4' d='M736.03,247.28l-20.38,20.38-146.07,146.04v40.71h40.74l146.07-146.04,20.38-20.35,20.35,20.35,31.65,31.68v-144.81h-144.81l31.68,31.65,20.38,20.38Z'/%3E%3Cpath class='st9' d='M409.64,166.44h73.59v235.33l28.78,28.81,28.81-28.81v-235.33h73.62l-102.42-102.42-102.36,102.42Z'/%3E%3Cpath class='st3' d='M651.05,454.4h177.72v-73.59l-52.07-52.07-125.65,125.65Z'/%3E%3Cpath class='st5' d='M166.42,540.82h235.33l28.81-28.81-28.81-28.81h-235.33v-73.62l-102.42,102.42,102.42,102.42v-73.62Z'/%3E%3Cpath class='st1' d='M569.58,651.07v177.75h73.65l52.04-52.07s-125.68-125.68-125.68-125.68ZM651.05,569.6l125.65,125.68,52.07-52.07v-73.62s-177.72,0-177.72,0Z'/%3E%3Cpath class='st3' d='M569.58,372.96l125.68-125.68-52.04-52.04h-73.65v177.72Z'/%3E%3Cpath class='st0' d='M828.74,683.98l-31.65,31.68-20.38,20.35-20.35-20.35-146.04-146.07h-40.74v40.74l146.07,146.07,20.38,20.35-20.38,20.38-31.68,31.65h144.78v-144.81Z'/%3E%3Cpath class='st6' d='M857.58,483.21h-235.33l-28.78,28.81,28.78,28.81h235.33v73.62l102.42-102.42-102.42-102.42v73.62Z'/%3E%3Cpath class='st2' d='M247.29,695.28l125.65-125.68h-177.72v73.62l52.07,52.07Z'/%3E%3Cpath class='st7' d='M288,776.72l20.35-20.38,146.04-146.01v-40.74h-40.71l-146.07,146.07-20.35,20.35-20.35-20.35-31.68-31.68v144.81h144.84l-31.68-31.68s-20.38-20.38-20.38-20.38ZM614.42,857.59h-73.62v-235.36l-28.81-28.81-28.78,28.81v235.36h-73.62l102.42,102.39s102.39-102.39,102.39-102.39Z'/%3E%3Cpath class='st7' d='M454.42,651.07l-125.68,125.65,52.07,52.07h73.62v-177.72Z'/%3E%3C/svg%3E") no-repeat;background-size:100% 100%;background-color:transparent;display:inline-flex;width:1em;height:1em}.i-system\:debian{background:url("data:image/svg+xml;utf8,%3Csvg display='inline-flex' width='1em' height='1em' id='_图层_1' data-name='图层_1' xmlns='http://www.w3.org/2000/svg' version='1.1' viewBox='0 0 1024 1024'%3E%3C!-- Generator: Adobe Illustrator 29.0.1, SVG Export Plug-In . SVG Version: 2.1.0 Build 192) --%3E%3Cdefs%3E%3Cstyle%3E.st0 {fill: %23ce0c48;}%3C/style%3E%3C/defs%3E%3Cpath class='st0' d='M881.64,392.44c-2.99-34.03-9.55-67.66-19.56-100.32l11.64,3.88c-31.2-71.21-78.83-143.17-134.36-174.37-7.61-4.48-30.75,4.33-23.29-10.6s-32.84-7.17-49.71-4.18c-22.99,3.73-26.28-25.53-65.69-31.35-22.39-3.14-28.22,16.12-39.11,11.64-20.6-8.21-18.21-24.19-50.46-8.21-16.12,7.91,10.15-22.84-43-4.03l-4.48-10.9c-94.95,36.43-121.67,66.73-148.39,69.42-6.12,0-29.86,28.66-46.88,46.43-14.93,14.93-22.99,31.95-43,34.64l-14.93,61.81c-25.43,21.16-40.95,51.92-42.85,84.95-5.16-15.3-3.76-32.05,3.88-46.28-14.93,5.97-40.16,14.93-25.98,84.8,11.2,55.24-4.63,118.24,8.81,179.15,4.18,18.36,0,35.08,5.37,44.79,94.2,206.32,182.73,343.07,413.38,336.05l3.88-7.76c-24.63-5.97-48.22-14.93-97.64-26.87-16.27-3.88-20.15-29.86-35.23-38.67-8.21-4.78-24.78-3.58-32.55-8.66s3.73-18.96-17.47-12.54c-7.46,2.24-12.09-9.55-17.62-14.93s0-20.75-20.45-21.65c-20.45-.9-16.12-25.98-17.32-39.11-10.6,1.34-1.05-1.34-11.64,3.88-9.75-6.79-17.07-16.52-20.9-27.77-8.96-42.85-9.26-18.81-13.14-28.37-4.73-12.68-10.37-25-16.87-36.87l23.44,7.76h3.88l3.88-11.64-23.29-7.61h27.32c-6.72,12.24,1.79,4.63-11.79,7.76v11.64l19.56-7.76v-11.64c-18.06-8.96-25.08-11.64-43-19.26l7.91,7.76v3.88h-43c-19.26-12.99-12.24-27.77-15.68-46.43,14.93,0,8.06,5.82,14.93-11.5l-14.93,7.76,11.64-29.71-11.64,11.5c-25.53-33.89-14.18-85.54-10.45-133.02,1.51-32.54,13.03-63.83,32.99-89.57,7.76-8.81,4.48-22.09,4.78-32.55l27.32-23.14h15.68c6.72,14.93,4.18,4.78,0,19.26l7.76,3.88c6.27-7.61,5.37-5.23,7.76-19.26-8.81-9.26-6.12-8.66-23.29-11.64,20.44-33.84,58.22-53.26,97.64-50.16l3.88-11.64-15.68,7.91-3.88-11.5c18.36-16.11,42.18-24.6,66.58-23.74,5.52,0,6.12-14.93,11.2-17.02,141.38-53,270.66,8.21,324.71,128.99,2.93,9.82,5.32,19.78,7.17,29.86,14.93,49.86-6.27,106.29,8.51,136.15-6.87,31.5-32.1,12.09-35.23,27.02-7.46,36.13-12.99,52.25-35.68,68.97-8.3,7.37-17.3,13.92-26.87,19.56,9.59-9.58,16.36-21.61,19.56-34.78-93.01,97.64-229.76,55.98-253.79-92.71-4.75-30.68,6.92-61.61,30.75-81.51,81.36-76.59,131.38-45.83,180.04-17.91l-7.76-26.87c-28.81-21.35-14.93-17.32-7.91-50.16v-3.88l-15.68-11.5c2.24,8.81.9,4.63,7.91,14.93-3.88,14.03,0,7.91-7.76,14.93-13.14,8.51-20.75,6.42-39.11,3.88l3.88-11.64-11.64-11.64c0,10.3-3.58,2.39,0,14.93-110.33,8.66-190.79,70.02-156.31,227.67,1.26,13.12,3.86,26.08,7.76,38.67l-7.76,7.61-3.88-23.14h-11.79l-3.88,11.64c-11.05-22.54-.75,9.41,35.23,46.28,3.51,3.9,7.25,7.59,11.2,11.05,41.8,29.86,99.13,71.21,176.16,43h7.91v-3.88l-89.57-11.64-3.88-7.61c93.46,21.65,154.81-7.46,207.07-42.4,11.5-14.93,10-21.05,19.41-7.91,16.87-14.93,3.43-23.44,11.79-38.52,5.67-10.3,28.51-14.93,39.11-30.9l35.08-119.43h-14.93c2.69-12.54,19.71-29.86-3.88-42.4-2.24-1.34,7.91-1.19,7.76-3.73-1.65-20.65-8.31-40.58-19.41-58.07,28.96,18.96,31.8,59.72,46.88,92.56v7.76h3.88v-41.5h-1.04ZM459.75,585.02l-8.36-23.14,54.64,50.16-46.28-27.02ZM191.03,249.27l-20.3-3.88v34.78c14.63-9.26,16.57-9.11,19.56-30.9h.75ZM694.14,403.64c-10.3,10.14-15.74,24.23-14.93,38.67l11.79,7.61c13.69-11.79,15.42-32.37,3.88-46.28h-.75ZM822.97,550.39c22.99-10.15,47.77-50.76,31.35-84.95l-31.35,84.8v.15ZM670.7,480.82c-13.73,10.3-17.32,11.64-19.56,34.78l11.64,7.76,15.68-7.76c7.2-12.96,8.61-28.35,3.88-42.4-7.32,11.79-2.24,18.06-11.64,7.61ZM612.03,550.39c13.88-9.55,10.45-12.99,15.68-19.41v-4.18c-18.16,1.95-36.48,1.95-54.64,0-11.5-12.24-11.64-25.68-27.32-34.64,14.93,30.75,2.84,33.44,27.32,54.04,11.48,2.79,23.27,4.09,35.08,3.88,1.34,0-5.97-.9,3.88,0v.3ZM244.92,519.48h-11.79l-7.76,7.61c8.36,8.96,4.78,6.27,11.64-3.88l11.79,19.41,3.88-14.93-7.76-7.61v-.6ZM259.85,569.65l3.88-7.76c-8.81-7.61,0-3.14-11.64,0l-11.64-14.93,3.88,14.93v7.76h15.53Z'/%3E%3C/svg%3E") no-repeat;background-size:100% 100%;background-color:transparent;display:inline-flex;width:1em;height:1em}.i-system\:deepin{background:url("data:image/svg+xml;utf8,%3Csvg display='inline-flex' width='1em' height='1em' id='_图层_1' data-name='图层_1' xmlns='http://www.w3.org/2000/svg' version='1.1' viewBox='0 0 1024 1024'%3E%3C!-- Generator: Adobe Illustrator 29.0.1, SVG Export Plug-In . SVG Version: 2.1.0 Build 192) --%3E%3Cdefs%3E%3Cstyle%3E.st0 {fill: %23007cff;}%3C/style%3E%3C/defs%3E%3Cpath class='st0' d='M665.21,90c-64.37-23.52-130.28-29.87-194.31-23.89-74.22,5.85-110.43,28.81-108.27,24.67-121.37,43.31-223.99,136.52-271.48,267.19-84.58,232.72,35.25,490.09,267.58,574.84,232.5,84.75,489.44-35.28,574.08-268,84.64-232.7-35.19-490.06-267.64-574.78l.03-.03ZM374.05,890.73c-24.91-9.17-48.83-20.81-71.43-34.75l1.74.98c108.27,8.31,249.61-16.6,344.92-105.81,0,0,181.65-145.14,50.2-383.36,0,0,21.19,96.01-5.82,174.96,0,0-25.76,107.4-140.25,138.57-168.64,45.95-360.77-72.04-441.12-129.27-6.05-58.77-.67-119.47,20.91-178.74,31.92-87.8,91.95-156.34,165.28-202.35-18.29,128.26-3.81,246.38,17.02,295.86,27.97,66.33,76.52,143.72,171.35,153.63,94.83,9.97,147.08-78.76,147.08-78.76,48.69-73.91,56.31-180.06,55.55-182.64-.76-2.6-12.96-9.6-12.96-9.6-32.73,132.49-86.71,176.73-86.71,176.73-85.12,82.18-145.4,25.2-145.4,25.2-64.82-69.63-19.4-182.75-19.4-182.75,25.4-77.05,99.31-189.8,183.11-247.14,13.97,3.44,28,5.6,41.8,10.61,51.35,19.09,95.45,46.45,132.97,80.89l-.28-.25c-61.26,22.37-160.18,69.63-160.18,69.63-156.82,66.08-167.43,165.98-167.43,165.98-16.24,102.95,65.49,59.36,65.49,59.36,84.08-40.96,125.41-168.58,125.41-168.58-26.23-5.01-46.93,3-46.93,3-33.57,82.87-102.03,116.92-102.03,116.92-26.96,14.25-33.23-10.95-33.23-10.95-4.56-18.9,19.49-22.09,19.49-22.09,37.32-14.53,61.18-53.73,66.61-69.74,5.38-16.04,15.37-17.33,15.37-17.33,28.31-9.27,61.49-16.32,95.73-19.79l2.04-.17c63.47-7.81,160.63,22.49,160.63,22.49,20.04,7.94,40.49,14.81,61.26,20.58,35.61,89.01,41.24,190.31,5.96,287.46-76.13,209.43-307.46,317.48-516.71,241.24h-.03Z'/%3E%3C/svg%3E") no-repeat;background-size:100% 100%;background-color:transparent;display:inline-flex;width:1em;height:1em}.i-system\:opencloudos{background:url("data:image/svg+xml;utf8,%3Csvg display='inline-flex' width='1em' height='1em' id='_图层_1' data-name='图层_1' xmlns='http://www.w3.org/2000/svg' version='1.1' viewBox='0 0 1024 1024'%3E%3C!-- Generator: Adobe Illustrator 29.0.1, SVG Export Plug-In . SVG Version: 2.1.0 Build 192) --%3E%3Cdefs%3E%3Cstyle%3E.st0 {fill: %23060198;}.st1 {fill: %230368ec;}.st2 {fill: %2300c0ff;}%3C/style%3E%3C/defs%3E%3Cpath class='st0' d='M213.3,661.37l149.34-149.34,149.34,149.34c-82.47,82.48-216.19,82.49-298.67.02,0,0-.01-.01-.02-.02ZM511.98,362.68c82.47-82.48,216.19-82.49,298.67-.02,0,0,.01.01.02.02l-149.34,149.34s-149.34-149.34-149.34-149.34Z'/%3E%3Cpath class='st2' d='M213.3,661.37c-82.48-82.47-82.49-216.19-.02-298.67,0,0,.01-.01.02-.02L511.98,64c82.48,82.47,82.49,216.19.02,298.67l-.02.02-298.68,298.68Z'/%3E%3Cpath class='st1' d='M661.32,810.66l-149.34,149.34c-82.48-82.47-82.49-216.19-.02-298.67,0,0,.01-.01.02-.02l149.34-149.34,149.34-149.34c82.48,82.39,82.55,216.05.16,298.53-.05.05-.1.11-.16.16,0,0-149.34,149.34-149.34,149.34Z'/%3E%3C/svg%3E") no-repeat;background-size:100% 100%;background-color:transparent;display:inline-flex;width:1em;height:1em}.i-system\:openeuler{background:url("data:image/svg+xml;utf8,%3Csvg display='inline-flex' width='1em' height='1em' id='_图层_1' data-name='图层_1' xmlns='http://www.w3.org/2000/svg' version='1.1' viewBox='0 0 1024 1024'%3E%3C!-- Generator: Adobe Illustrator 29.0.1, SVG Export Plug-In . SVG Version: 2.1.0 Build 192) --%3E%3Cdefs%3E%3Cstyle%3E.st0 {fill: %23002fa7;}%3C/style%3E%3C/defs%3E%3Cpath class='st0' d='M841.43,413.79c-28.88,24.54-68.56,32.01-104.39,19.64-35.36-10.66-47.14-35.92-27.5-56.12,26.78-20.62,61.69-27.48,94.28-18.52,36.48,8.98,53.32,33.11,35.92,56.12M675.31,369.45c-25.82,20.36-59.87,27.05-91.48,17.96-16.84-5.05-26.38-15.71-26.94-24.69s-11.22-12.91-23.01-16.28c-12.47-3.1-25.41-3.87-38.16-2.24l-15.71,3.37c-11.86,3.56-23.05,9.06-33.11,16.28-8.98,8.08-14.42,19.37-15.15,31.43,0,8.42,8.98,15.71,21.33,20.2,13.82,3.47,28.28,3.47,42.09,0,18.31-5.46,37.81-5.46,56.12,0,17.78,4.27,28.73,22.15,24.46,39.93-1.48,6.18-4.71,11.8-9.31,16.19-27.71,23.76-65.96,31.03-100.46,19.08-13.7-4.89-23.19-17.47-24.13-31.99,0-9.54-9.54-16.84-21.33-21.89-13.64-4.04-27.98-5.19-42.09-3.37l-17.4,3.37c-13.93,3.43-26.83,10.17-37.6,19.64-7.55,7.19-13.65,15.76-17.96,25.25-2.01,4.26-3.33,8.8-3.93,13.47.46,11.66,7.71,21.98,18.52,26.38,13.95,6.06,29.38,7.82,44.34,5.05,18.58-4.95,38.27-3.77,56.12,3.37,30.87,14.03,34.23,48.26,5.61,76.32-29.52,29.53-74.28,37.59-112.24,20.2-14.81-8.41-22.52-25.41-19.08-42.09.21-2.05.21-4.12,0-6.17-.48-2.76-1.43-5.42-2.81-7.86-3.23-6.59-8.56-11.92-15.15-15.15-13.49-6.26-28.57-8.22-43.21-5.61-18.43,6.24-38.57,5.03-56.12-3.37-21.89-13.47-15.71-41.53,13.47-62.86,14.49-11.01,31.44-18.33,49.39-21.33,16.79-1.22,33.1-6.21,47.7-14.59,10.54-6.72,17.84-17.47,20.2-29.74.49-3.35.49-6.75,0-10.1-1.21-8.9,1.45-17.88,7.3-24.69,8.01-7.11,17.99-11.61,28.62-12.91,8.04-.52,16.1-.52,24.13,0h16.84c9.87-2.72,19.05-7.5,26.94-14.03,7.44-4.56,12.86-11.78,15.15-20.2v-8.42c0-15.15,19.08-31.43,49.39-37.04,13.28-3.17,27.12-3.17,40.41,0,8.71,1.24,16.37,6.41,20.76,14.03.24,1.11.24,2.26,0,3.37,4.69,8.4,12.96,14.19,22.45,15.71,13.35,2.55,27.06,2.55,40.41,0,17.16-4.1,35.04-4.1,52.19,0,29.74,7.3,39.85,28.06,21.33,46.02M603.48,706.18c-32.46,36.72-85.93,46.25-129.08,23.01-28.74-15.92-39.13-52.12-23.21-80.86,3.27-5.89,7.51-11.19,12.55-15.66,31.39-29.78,77.43-38.16,117.29-21.33,29.73,8.76,46.73,39.96,37.97,69.69-2.83,9.62-8.19,18.3-15.52,25.15M895.31,268.43l-354.13-197.55c-17.58-9.18-38.54-9.18-56.12,0L127.01,267.87c-17.09,9.86-27.74,27.97-28.06,47.7v392.85c.32,19.73,10.97,37.84,28.06,47.7l356.93,196.99c17.58,9.18,38.54,9.18,56.12,0l356.93-196.99c17.09-9.86,27.74-27.97,28.06-47.7v-392.85c-.32-19.73-10.97-37.84-28.06-47.7'/%3E%3C/svg%3E") no-repeat;background-size:100% 100%;background-color:transparent;display:inline-flex;width:1em;height:1em}.i-system\:oracle{background:url("data:image/svg+xml;utf8,%3Csvg display='inline-flex' width='1em' height='1em' id='_图层_1' data-name='图层_1' xmlns='http://www.w3.org/2000/svg' version='1.1' viewBox='0 0 1024 1024'%3E%3C!-- Generator: Adobe Illustrator 29.0.1, SVG Export Plug-In . SVG Version: 2.1.0 Build 192) --%3E%3Cdefs%3E%3Cstyle%3E.st0 {fill: %23fff;}.st1 {fill: %23e10025;}%3C/style%3E%3C/defs%3E%3Cpath class='st1' d='M64,512c0,247.42,200.58,448,448,448s448-200.58,448-448S759.42,64,512,64,64,264.58,64,512Z'/%3E%3Cpath class='st0' d='M427.2,344h169.59c92.34,0,167.2,75.22,167.2,168s-74.86,168-167.2,168h-169.59c-92.34,0-167.2-75.22-167.2-168s74.86-168,167.2-168ZM427.2,404.59c-59.04,0-106.9,48.09-106.9,107.41s47.86,107.41,106.9,107.41h169.59c59.04,0,106.9-48.09,106.9-107.41s-47.86-107.41-106.9-107.41h-169.59Z'/%3E%3C/svg%3E") no-repeat;background-size:100% 100%;background-color:transparent;display:inline-flex;width:1em;height:1em}.i-system\:rocky{background:url("data:image/svg+xml;utf8,%3Csvg display='inline-flex' width='1em' height='1em' id='_图层_1' data-name='图层_1' xmlns='http://www.w3.org/2000/svg' version='1.1' viewBox='0 0 1024 1024'%3E%3C!-- Generator: Adobe Illustrator 29.0.1, SVG Export Plug-In . SVG Version: 2.1.0 Build 192) --%3E%3Cdefs%3E%3Cstyle%3E.st0 {fill: %2310b981;}%3C/style%3E%3C/defs%3E%3Cpath class='st0' d='M935.07,659.74c16.15-46.26,24.93-95.98,24.93-147.74,0-247.43-200.58-448-448-448S64,264.57,64,512c0,122.42,49.11,233.38,128.7,314.25l454.43-454.44,112.19,112.2s175.75,175.74,175.75,175.74ZM853.24,802.29l-206.11-206.1-322.74,322.75c57.07,26.35,120.62,41.05,187.61,41.05,136.69,0,259.07-61.21,341.25-157.71h0Z'/%3E%3C/svg%3E") no-repeat;background-size:100% 100%;background-color:transparent;display:inline-flex;width:1em;height:1em}.i-system\:tencent{background:url("data:image/svg+xml;utf8,%3Csvg display='inline-flex' width='1em' height='1em' id='_图层_1' data-name='图层_1' xmlns='http://www.w3.org/2000/svg' version='1.1' viewBox='0 0 1024 1024'%3E%3C!-- Generator: Adobe Illustrator 29.0.1, SVG Export Plug-In . SVG Version: 2.1.0 Build 192) --%3E%3Cdefs%3E%3Cstyle%3E.st0 {fill: %230052d9;}%3C/style%3E%3C/defs%3E%3Cpath class='st0' d='M960,134.74H205.47L64,889.26h754.53s141.47-754.53,141.47-754.53ZM392.63,771.37l61.89-330.11h-131.16l-47.16-82.53h193.79l22.11-117.89,267.47,200.42h-198.95l-44.21,235.79h148.84l82.53,94.32s-355.16,0-355.16,0Z'/%3E%3C/svg%3E") no-repeat;background-size:100% 100%;background-color:transparent;display:inline-flex;width:1em;height:1em}.i-system\:ubuntu{background:url("data:image/svg+xml;utf8,%3Csvg display='inline-flex' width='1em' height='1em' id='_图层_1' data-name='图层_1' xmlns='http://www.w3.org/2000/svg' version='1.1' viewBox='0 0 1024 1024'%3E%3C!-- Generator: Adobe Illustrator 29.0.1, SVG Export Plug-In . SVG Version: 2.1.0 Build 192) --%3E%3Cdefs%3E%3Cstyle%3E.st0 {fill: %23e9000c;}.st1 {fill: %23fac400;}.st2 {fill: %23fb9200;}%3C/style%3E%3C/defs%3E%3Cpath class='st2' d='M168.77,415.97c51.69,0,93.83,42,93.83,93.53s-42.15,93.54-93.83,93.54c-51.69-.14-93.83-42.14-93.83-93.68s42.15-93.39,93.83-93.39ZM586.52,139.03c23.2,0,45.82,2.2,67.69,6.32-.42,4-.61,8.02-.59,12.04,0,71.8,58.74,130.39,130.69,130.39,28.35,0,54.47-8.96,75.92-24.38,49.78,56.83,82.08,129.22,88.54,208.66l-148.01,4.55c-12.33-106.9-103.81-190.3-214.24-190.3-31.12,0-60.94,6.61-87.66,18.65l-74.01-127.89c48.61-24.38,103.67-38.03,161.67-38.03Z'/%3E%3Cpath class='st1' d='M789.31,772.93c51.69,0,93.68,42,93.68,93.54s-42.14,93.53-93.68,93.53-93.83-41.99-93.83-93.53c.15-51.55,42.29-93.54,93.83-93.54ZM379.19,798.63c-63.14-44.05-111.9-107.49-137-181.49,34.51-23.5,57.27-63,57.27-107.78s-24.67-87.37-61.53-110.42c23.2-78.42,72.54-145.96,137.74-192.51l77.98,125.7c-50.37,39.36-82.82,100.73-82.82,169.3s31.87,128.77,81.49,168.13c0,0-73.12,129.07-73.12,129.07Z'/%3E%3Cpath class='st0' d='M949.06,526.98c-6.02,86.49-42.72,164.61-99.26,223.93-18.63-9.73-39.33-14.81-60.35-14.83-68.72,0-125.26,53.31-130.4,120.4-23.5,4.71-47.72,7.35-72.54,7.35-55.05.04-109.38-12.46-158.88-36.56l73.72-128.19c26.14,11.31,54.92,17.47,85.17,17.47,110.86,0,202.79-84.28,214.38-191.77,0,0,148.15,2.21,148.15,2.21ZM784.31,64c51.69,0,93.83,41.99,93.83,93.54s-42.14,93.53-93.83,93.53-93.83-42-93.83-93.53c.14-51.54,42.28-93.53,93.83-93.53h0Z'/%3E%3C/svg%3E") no-repeat;background-size:100% 100%;background-color:transparent;display:inline-flex;width:1em;height:1em}.i-tdesign\:caret-left{--un-icon:url("data:image/svg+xml;utf8,%3Csvg viewBox='0 0 24 24' display='inline-flex' width='1em' height='1em' xmlns='http://www.w3.org/2000/svg' %3E%3Cpath fill='currentColor' d='M15.5 2.586v18.828L6.086 12zM8.914 12l4.586 4.586V7.414z'/%3E%3C/svg%3E");-webkit-mask:var(--un-icon) no-repeat;mask:var(--un-icon) no-repeat;-webkit-mask-size:100% 100%;mask-size:100% 100%;background-color:currentColor;color:inherit;display:inline-flex;width:1em;height:1em}.i-tdesign\:caret-right{--un-icon:url("data:image/svg+xml;utf8,%3Csvg viewBox='0 0 24 24' display='inline-flex' width='1em' height='1em' xmlns='http://www.w3.org/2000/svg' %3E%3Cpath fill='currentColor' d='M8.5 21.414L17.914 12L8.5 2.586zm2-4.828V7.414L15.086 12z'/%3E%3C/svg%3E");-webkit-mask:var(--un-icon) no-repeat;mask:var(--un-icon) no-repeat;-webkit-mask-size:100% 100%;mask-size:100% 100%;background-color:currentColor;color:inherit;display:inline-flex;width:1em;height:1em}.i-theme\:auto{--un-icon:url("data:image/svg+xml;utf8,%3Csvg display='inline-flex' width='1em' height='1em' xmlns='http://www.w3.org/2000/svg' version='1.1' viewBox='0 0 1024 1024'%3E%3Cpath fill='currentColor' d='M868.2,129.4c39.9,0,72.2,32.3,72.2,72.2v498.3c0,39.9-32.3,72.2-72.2,72.2h-313.3c-6.1,0-11,4.9-11,11v39.3c0,6.1,4.9,11,11,11h160.6c6.1,0,11,5,11,11.1v39.2c0,6.1-4.9,11-11,11h-406.4c-6.1,0-11-4.9-11-11v-39.2c0-6.1,4.9-11,11-11h162.7c6.1,0,11-5,11-11.1v-39.3c0-6.1-4.9-11-11-11H155.8c-39.9,0-72.2-32.3-72.2-72.2V201.6c0-39.9,32.3-72.2,72.2-72.2h712.5ZM868.2,190.6H155.8c-6.1,0-11,4.9-11,11v498.3c0,6.1,4.9,11,11,11h712.5c6.1,0,11-4.9,11-11V201.6c0-6.1-4.9-11-11-11Z'/%3E%3Cg id='Layer_1'%3E%3Cpath fill='currentColor' d='M512,263.9c11.8,0,21.4,9.6,21.4,21.4v26.7c0,11.8-9.6,21.4-21.4,21.4-11.8,0-21.3-9.6-21.4-21.4v-26.7c0-11.8,9.6-21.4,21.4-21.4ZM512,568.1c11.8,0,21.4,9.6,21.4,21.4v26.7c0,11.8-9.6,21.4-21.4,21.4s-21.4-9.6-21.4-21.4h0v-26.7c0-11.8,9.6-21.4,21.4-21.4ZM698.8,450.7c0,11.8-9.6,21.4-21.4,21.4h-26.7c-11.8,0-21.4-9.6-21.4-21.4,0-11.8,9.6-21.4,21.4-21.4h26.7c11.8,0,21.4,9.6,21.4,21.4ZM394.6,450.7c0,11.8-9.6,21.4-21.4,21.4h-26.7c-11.8,0-21.4-9.6-21.4-21.4,0-11.8,9.6-21.3,21.4-21.4h26.7c11.8,0,21.4,9.6,21.4,21.4ZM644.1,318.6c8.3,8.3,8.3,21.9,0,30.2l-18.9,18.9c-8.2,8.5-21.7,8.7-30.2.5-8.5-8.2-8.7-21.7-.5-30.2.2-.2.4-.4.5-.5l18.9-18.9c8.3-8.3,21.9-8.3,30.2,0h0ZM428.9,533.8c8.3,8.3,8.3,21.9,0,30.2l-18.9,18.9c-8.2,8.5-21.7,8.7-30.2.5-8.5-8.2-8.7-21.7-.5-30.2.2-.2.4-.4.5-.5l18.9-18.9c8.3-8.3,21.9-8.3,30.2,0ZM644.1,582.8c-8.3,8.3-21.9,8.3-30.2,0l-18.9-18.9c-8.5-8.2-8.7-21.7-.5-30.2,8.2-8.5,21.7-8.7,30.2-.5.2.2.4.4.5.5l18.9,18.9c8.3,8.3,8.3,21.9,0,30.2ZM428.9,367.7c-8.3,8.3-21.9,8.3-30.2,0l-18.9-18.9c-8.5-8.2-8.7-21.7-.5-30.2,8.2-8.5,21.7-8.7,30.2-.5.2.2.4.4.5.5l18.9,18.9c8.3,8.3,8.3,21.9,0,30.2ZM512,530.8c-44.2,0-80.1-35.8-80.1-80.1s35.8-80.1,80.1-80.1,80.1,35.8,80.1,80.1-35.8,80.1-80.1,80.1Z'/%3E%3C/g%3E%3C/svg%3E");-webkit-mask:var(--un-icon) no-repeat;mask:var(--un-icon) no-repeat;-webkit-mask-size:100% 100%;mask-size:100% 100%;background-color:currentColor;color:inherit;display:inline-flex;width:1em;height:1em}.i-theme\:dark{--un-icon:url("data:image/svg+xml;utf8,%3Csvg display='inline-flex' width='1em' height='1em' viewBox='0 0 20 20' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M12.6009 2C15.724 2.94694 18 5.87417 18 9.33934C18 13.5702 14.607 17 10.4217 17C6.76389 17 3.71152 14.3805 3 10.8966C3.88275 11.2745 4.83184 11.4687 5.7905 11.4673C9.74343 11.4673 12.9478 8.22812 12.9478 4.23223C12.9478 3.49723 12.8396 2.7882 12.6379 2.12002L12.6009 2Z' stroke='currentColor' stroke-width='1.5'/%3E%3C/svg%3E");-webkit-mask:var(--un-icon) no-repeat;mask:var(--un-icon) no-repeat;-webkit-mask-size:100% 100%;mask-size:100% 100%;background-color:currentColor;color:inherit;display:inline-flex;width:1em;height:1em}.i-theme\:light{--un-icon:url("data:image/svg+xml;utf8,%3Csvg display='inline-flex' width='1em' height='1em' viewBox='0 0 20 20' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M13 9.68439C13 11.254 11.6569 12.5265 10 12.5265C8.34315 12.5265 7 11.254 7 9.68439C7 8.11474 8.34315 6.84229 10 6.84229C11.6569 6.84229 13 8.11474 13 9.68439Z' stroke='currentColor' stroke-width='1.5' stroke-linecap='round' stroke-linejoin='round'/%3E%3Cpath d='M18 10.4345C18.4142 10.4345 18.75 10.0988 18.75 9.68455C18.75 9.27033 18.4142 8.93455 18 8.93455V10.4345ZM16 8.93455C15.5858 8.93455 15.25 9.27033 15.25 9.68455C15.25 10.0988 15.5858 10.4345 16 10.4345V8.93455ZM4 10.4345C4.41421 10.4345 4.75 10.0988 4.75 9.68455C4.75 9.27033 4.41421 8.93455 4 8.93455V10.4345ZM2 8.93455C1.58579 8.93455 1.25 9.27033 1.25 9.68455C1.25 10.0988 1.58579 10.4345 2 10.4345V8.93455ZM10.7506 2.10547C10.7506 1.69126 10.4148 1.35547 10.0006 1.35547C9.58638 1.35547 9.2506 1.69126 9.2506 2.10547H10.7506ZM9.2506 4.00021C9.2506 4.41442 9.58638 4.75021 10.0006 4.75021C10.4148 4.75021 10.7506 4.41442 10.7506 4.00021H9.2506ZM10.7506 15.3686C10.7506 14.9544 10.4148 14.6186 10.0006 14.6186C9.58638 14.6186 9.2506 14.9544 9.2506 15.3686H10.7506ZM9.2506 17.2634C9.2506 17.6776 9.58638 18.0134 10.0006 18.0134C10.4148 18.0134 10.7506 17.6776 10.7506 17.2634H9.2506ZM16.1744 4.86959C16.4751 4.58471 16.4879 4.11001 16.2031 3.80931C15.9182 3.50862 15.4435 3.49579 15.1428 3.78066L16.1744 4.86959ZM13.7279 5.12105C13.4272 5.40592 13.4144 5.88062 13.6993 6.18132C13.9842 6.48202 14.4589 6.49485 14.7596 6.20998L13.7279 5.12105ZM6.27442 14.2478C6.57512 13.9629 6.58794 13.4882 6.30307 13.1875C6.0182 12.8868 5.5435 12.874 5.2428 13.1589L6.27442 14.2478ZM3.82794 14.4993C3.52724 14.7841 3.51441 15.2588 3.79929 15.5595C4.08416 15.8602 4.55886 15.8731 4.85956 15.5882L3.82794 14.4993ZM4.85956 3.78066C4.55886 3.49579 4.08416 3.50862 3.79929 3.80931C3.51441 4.11001 3.52724 4.58471 3.82794 4.86959L4.85956 3.78066ZM5.2428 6.20998C5.5435 6.49485 6.0182 6.48202 6.30307 6.18132C6.58794 5.88062 6.57512 5.40592 6.27442 5.12105L5.2428 6.20998ZM14.7596 13.1599C14.4589 12.875 13.9842 12.8878 13.6993 13.1885C13.4144 13.4892 13.4272 13.9639 13.7279 14.2488L14.7596 13.1599ZM15.1417 15.5881C15.4424 15.873 15.9171 15.8601 16.2019 15.5594C16.4868 15.2587 16.474 14.784 16.1733 14.4992L15.1417 15.5881ZM18 9.68455V8.93455H16V9.68455V10.4345H18V9.68455ZM4 9.68455V8.93455H2V9.68455V10.4345H4V9.68455ZM10.0006 2.10547H9.2506V4.00021H10.0006H10.7506V2.10547H10.0006ZM10.0006 15.3686H9.2506V17.2634H10.0006H10.7506V15.3686H10.0006ZM15.6586 4.32512L15.1428 3.78066L13.7279 5.12105L14.2437 5.66551L14.7596 6.20998L16.1744 4.86959L15.6586 4.32512ZM5.75861 13.7033L5.2428 13.1589L3.82794 14.4993L4.34375 15.0437L4.85956 15.5882L6.27442 14.2478L5.75861 13.7033ZM4.34375 4.32512L3.82794 4.86959L5.2428 6.20998L5.75861 5.66551L6.27442 5.12105L4.85956 3.78066L4.34375 4.32512ZM14.2437 13.7043L13.7279 14.2488L15.1417 15.5881L15.6575 15.0436L16.1733 14.4992L14.7596 13.1599L14.2437 13.7043Z' fill='currentColor'/%3E%3C/svg%3E");-webkit-mask:var(--un-icon) no-repeat;mask:var(--un-icon) no-repeat;-webkit-mask-size:100% 100%;mask-size:100% 100%;background-color:currentColor;color:inherit;display:inline-flex;width:1em;height:1em}.i-uiw\:question-circle-o{--un-icon:url("data:image/svg+xml;utf8,%3Csvg viewBox='0 0 20 20' display='inline-flex' width='1em' height='1em' xmlns='http://www.w3.org/2000/svg' %3E%3Cpath fill='currentColor' d='M10 0c5.523 0 10 4.477 10 10s-4.477 10-10 10S0 15.523 0 10S4.477 0 10 0m0 1.395a8.605 8.605 0 1 0 0 17.21a8.605 8.605 0 0 0 0-17.21m0 12.241a.91.91 0 1 1 0 1.819a.91.91 0 0 1 0-1.819m2.68-8.306c.726.73.96 1.564.838 2.436c-.096.691-.52 1.435-1.084 1.926c-.7.606-.872.756-1.004.889l-.06.062l-.101.11a2.6 2.6 0 0 0-.538.915q-.111.308-.183.905a.682.682 0 0 1-1.354-.158c.058-.493.14-.893.255-1.21a3.9 3.9 0 0 1 .82-1.379c.17-.184.365-.37.614-.593c.115-.103.567-.494.678-.59c.313-.282.558-.718.607-1.066c.066-.471-.048-.876-.455-1.285c-.43-.432-1.106-.64-1.625-.572c-.758.098-1.065.21-1.588.668c-.382.336-.634.833-.75 1.519a.682.682 0 0 1-1.344-.227c.164-.98.561-1.76 1.194-2.316c.759-.667 1.31-.867 2.312-.997c.925-.12 2.027.218 2.768.963'/%3E%3C/svg%3E");-webkit-mask:var(--un-icon) no-repeat;mask:var(--un-icon) no-repeat;-webkit-mask-size:100% 100%;mask-size:100% 100%;background-color:currentColor;color:inherit;display:inline-flex;width:1em;height:1em}.i-waf\:attack-map{--un-icon:url("data:image/svg+xml;utf8,%3Csvg display='inline-flex' width='1em' height='1em' xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='currentColor' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Ccircle cx='12' cy='12' r='10'%3E%3C/circle%3E%3Cline x1='2' y1='12' x2='22' y2='12'%3E%3C/line%3E%3Cpath d='M12 2a15.3 15.3 0 0 1 4 10 15.3 15.3 0 0 1-4 10 15.3 15.3 0 0 1-4-10 15.3 15.3 0 0 1 4-10z'%3E%3C/path%3E%3C/svg%3E");-webkit-mask:var(--un-icon) no-repeat;mask:var(--un-icon) no-repeat;-webkit-mask-size:100% 100%;mask-size:100% 100%;background-color:currentColor;color:inherit;display:inline-flex;width:1em;height:1em}.i-waf\:attacked-domain{--un-icon:url("data:image/svg+xml;utf8,%3Csvg display='inline-flex' width='1em' height='1em' xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='currentColor' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M10.29 3.86L1.82 18a2 2 0 0 0 1.71 3h16.94a2 2 0 0 0 1.71-3L13.71 3.86a2 2 0 0 0-3.42 0z'%3E%3C/path%3E%3Cline x1='12' y1='9' x2='12' y2='13'%3E%3C/line%3E%3Cline x1='12' y1='17' x2='12.01' y2='17'%3E%3C/line%3E%3C/svg%3E");-webkit-mask:var(--un-icon) no-repeat;mask:var(--un-icon) no-repeat;-webkit-mask-size:100% 100%;mask-size:100% 100%;background-color:currentColor;color:inherit;display:inline-flex;width:1em;height:1em}.i-waf\:interception-event{--un-icon:url("data:image/svg+xml;utf8,%3Csvg display='inline-flex' width='1em' height='1em' xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='currentColor' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8z'%3E%3C/path%3E%3Cpolyline points='14 2 14 8 20 8'%3E%3C/polyline%3E%3Cline x1='12' y1='18' x2='12' y2='12'%3E%3C/line%3E%3Cline x1='9' y1='15' x2='15' y2='15'%3E%3C/line%3E%3C/svg%3E");-webkit-mask:var(--un-icon) no-repeat;mask:var(--un-icon) no-repeat;-webkit-mask-size:100% 100%;mask-size:100% 100%;background-color:currentColor;color:inherit;display:inline-flex;width:1em;height:1em}.i-waf\:interception-type{--un-icon:url("data:image/svg+xml;utf8,%3Csvg display='inline-flex' width='1em' height='1em' xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='currentColor' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M12 22s8-4 8-10V5l-8-3-8 3v7c0 6 8 10 8 10z'%3E%3C/path%3E%3C/svg%3E");-webkit-mask:var(--un-icon) no-repeat;mask:var(--un-icon) no-repeat;-webkit-mask-size:100% 100%;mask-size:100% 100%;background-color:currentColor;color:inherit;display:inline-flex;width:1em;height:1em}.i-waf\:malicious{--un-icon:url("data:image/svg+xml;utf8,%3Csvg display='inline-flex' width='1em' height='1em' viewBox='0 0 96 117' xmlns='http://www.w3.org/2000/svg' xmlns:xlink='http://www.w3.org/1999/xlink' customFrame='%23000000'%3E%3Cpath id='矢量 8' d='M48 116C47.3625 116 46.783 115.824 46.2614 115.472C32.1788 106.847 21.979 99.6888 14.4451 90.477C5.75216 79.9158 1.52158 67.5944 1.05795 51.7525L1.05795 51.4592C1.05795 50.5791 1 49.7577 1 48.9362C1 48.1148 1 47.2347 1.05795 46.4133L1.05795 30.102C1.05795 28.2245 2.56473 26.6403 4.47719 26.6403C21.2256 26.6403 36.7571 17.4872 45.0444 2.7602C45.6239 1.70408 46.783 1 48 1C49.217 1 50.3761 1.64541 50.9556 2.7602C59.2429 17.4872 74.8323 26.6403 91.5808 26.6403C93.4353 26.6403 95 28.1658 95 30.102L95 51.7525C95 51.9872 95 52.2219 94.942 52.398C93.783 85.9592 75.4698 99.7474 49.7966 115.531C49.217 115.824 48.6375 116 48 116L48 116ZM7.89643 51.6352C8.3021 65.8342 12.0691 76.7475 19.7189 86.0765C26.3255 94.1735 35.5401 100.745 48.058 108.49C71.8187 93.8214 87.3502 81.4413 88.2195 51.5765C88.2195 51.4005 88.2195 51.2832 88.2774 51.1071L88.2774 33.3878C72.2244 32.3316 57.4464 24 48.1159 10.7985C38.6696 24 23.8915 32.3316 7.89643 33.3878L7.89643 46.5306C7.89643 47.352 7.83848 48.1735 7.83848 48.9362C7.83848 49.7577 7.83848 50.5204 7.89643 51.3418L7.89643 51.6352L7.89643 51.6352ZM49.275 88.5408C50.9556 88.8733 48.4636 88.4821 48.058 88.3061C46.3194 87.6021 45.4501 85.6071 46.0876 83.8469L53.7953 63.7219L39.7707 63.7219C38.6695 63.7219 37.6264 63.1939 36.9889 62.2551C36.3514 61.3163 36.1776 60.1429 36.5832 59.0867L44.8126 35.6173C45.4501 33.7985 47.3625 32.8597 49.1591 33.5051C50.9556 34.1505 51.8829 36.0867 51.2454 37.9056L44.5808 56.8571L58.7793 56.8571C59.8804 56.8571 60.9815 57.4439 61.561 58.3827C62.1985 59.3214 62.3144 60.4949 61.9088 61.551L52.4044 86.3699C51.9408 87.7194 50.6658 88.5408 49.275 88.5408L49.275 88.5408Z' fill='currentColor' fill-rule='nonzero'/%3E%3Cpath id='矢量 8' d='M45.7214 116.314C37.953 111.556 31.8091 107.447 27.2898 103.989C21.791 99.7807 17.2514 95.4878 13.6711 91.1101C10.7158 87.5198 8.25265 83.691 6.28146 79.6238C5.30765 77.6145 4.45391 75.547 3.72025 73.4213C1.51414 67.0293 0.293512 59.8161 0.0583818 51.7818L0.0579532 51.7672L0.0579532 51.4592C0.0579532 51.1723 0.0482447 50.7488 0.0288275 50.1887C0.00960916 49.6344 0 49.2169 0 48.9362C0 47.8024 0.0193177 46.9499 0.0579532 46.3788L0.0579532 30.102C0.0579532 29.4963 0.163393 28.9333 0.374273 28.413C0.587083 27.888 0.907274 27.4065 1.33484 26.9685C1.77524 26.5174 2.26313 26.1812 2.79851 25.9599C3.31404 25.7468 3.87359 25.6403 4.47719 25.6403C6.4059 25.6403 8.31889 25.5182 10.2162 25.2739C12.3133 25.0039 14.3913 24.5846 16.45 24.0161C18.1246 23.5537 19.7621 22.9994 21.3625 22.3532C23.4467 21.5117 25.468 20.5143 27.4263 19.3612C29.085 18.3845 30.6703 17.3127 32.1821 16.1457C33.8256 14.8772 35.3822 13.4963 36.8521 12.0029C38.1908 10.643 39.436 9.21141 40.5878 7.70825C41.905 5.98908 43.1001 4.17626 44.1729 2.26979C44.3167 2.00777 44.4836 1.76561 44.6738 1.54331C44.9792 1.1864 45.3443 0.880682 45.7693 0.626148C46.186 0.376603 46.6193 0.201649 47.0693 0.101284C47.372 0.0337613 47.6822 -1.19209e-07 48 -1.19209e-07C48.4263 0 48.8361 0.0569096 49.2294 0.170729C49.5727 0.270062 49.9034 0.412742 50.2216 0.598767C50.5919 0.815253 50.9166 1.07401 51.1957 1.37504C51.4451 1.64402 51.6581 1.94675 51.8347 2.28324C52.8557 4.09619 53.9882 5.82467 55.2325 7.46868C56.436 9.05891 57.7439 10.5701 59.1563 12.0023C60.5755 13.4414 62.0758 14.7763 63.6573 16.0069C65.2257 17.2274 66.8739 18.3453 68.6019 19.3607C70.5572 20.5097 72.5749 21.5041 74.655 22.3438C76.2654 22.9939 77.9133 23.5513 79.5986 24.016C81.7251 24.6024 83.8713 25.03 86.0373 25.2989C87.871 25.5265 89.7188 25.6403 91.5808 25.6403C92.1637 25.6403 92.7066 25.7407 93.2094 25.9415C93.7504 26.1575 94.245 26.4897 94.6932 26.9382C95.1229 27.3682 95.4466 27.8427 95.6644 28.3616C95.8881 28.8948 96 29.475 96 30.102L96 51.7525C96 52.0708 95.9793 52.3313 95.9379 52.5341C95.6467 60.7095 94.3171 68.0461 91.9489 74.544C91.3296 76.2435 90.6314 77.9053 89.8545 79.5294C87.8644 83.6893 85.3574 87.602 82.3335 91.2674C78.6497 95.7327 73.9123 100.152 68.1211 104.525C63.7812 107.802 57.8476 111.755 50.3203 116.382L50.2851 116.404L50.2482 116.423C49.488 116.808 48.7386 117 48 117C47.5552 117 47.1315 116.935 46.7288 116.805C46.3769 116.691 46.0411 116.527 45.7214 116.314ZM94.942 52.398C95 52.2219 95 51.9872 95 51.7525L95 30.102C95 28.1658 93.4353 26.6403 91.5808 26.6403C74.8323 26.6403 59.2429 17.4872 50.9556 2.7602C50.3761 1.64541 49.217 1 48 1C46.783 1 45.6239 1.70408 45.0444 2.7602C36.7571 17.4872 21.2256 26.6403 4.47719 26.6403C2.56473 26.6403 1.05795 28.2245 1.05795 30.102L1.05795 46.4133C1 47.2347 1 48.1148 1 48.9362C1 49.7577 1.05795 50.5791 1.05795 51.4592L1.05795 51.7525C1.52158 67.5944 5.75216 79.9158 14.4451 90.477C21.979 99.6888 32.1788 106.847 46.2614 115.472C46.783 115.824 47.3625 116 48 116C48.6375 116 49.217 115.824 49.7966 115.531C75.4698 99.7474 93.783 85.9592 94.942 52.398ZM7.93078 52.6352C8.48209 66.3485 12.2496 76.9677 19.7189 86.0765C26.3255 94.1735 35.5401 100.745 48.058 108.49C71.8187 93.8214 87.3502 81.4413 88.2195 51.5765C88.2195 51.4005 88.2195 51.2832 88.2774 51.1071L88.2774 33.3878C72.5737 32.3546 58.0901 24.3591 48.7327 11.6533C48.5246 11.3707 48.3189 11.0857 48.1159 10.7985C47.9112 11.0846 47.704 11.3684 47.4943 11.6499C38.0285 24.3577 23.5449 32.3545 7.89643 33.3878L7.89643 46.5306C7.89643 47.352 7.83848 48.1735 7.83848 48.9362C7.83848 49.5181 7.83848 50.0705 7.85908 50.6352C7.86756 50.8677 7.87953 51.1023 7.89643 51.3418L7.89643 51.6352C7.906 51.9704 7.91745 52.3037 7.93078 52.6352ZM8.89643 51.6212C9.09717 58.6048 10.144 64.8501 12.0368 70.357C12.6578 72.1636 13.3804 73.9212 14.2046 75.6297C15.8803 79.1033 17.9762 82.3742 20.4921 85.4425L20.4937 85.4443C23.55 89.19 27.4796 92.9164 32.2827 96.6236C36.2275 99.6683 41.4861 103.232 48.0586 107.314C54.5823 103.271 59.7716 99.7718 63.6264 96.8151C68.677 92.9413 72.7827 89.0381 75.9436 85.1054C78.2718 82.2085 80.2287 79.131 81.8141 75.8727C82.6335 74.1889 83.3537 72.4568 83.9747 70.6764C85.929 65.0733 87.0106 58.7012 87.2195 51.5603C87.2205 51.3453 87.2398 51.1517 87.2774 50.9793L87.2774 34.3163C83.7549 34.0256 80.3256 33.4065 76.9895 32.459C72.9157 31.302 68.9809 29.6554 65.1852 27.5191C61.6507 25.5298 58.4096 23.2133 55.4619 20.5696C52.7663 18.1519 50.316 15.4605 48.1112 12.4955C45.767 15.6129 43.1581 18.4275 40.2845 20.9392C37.4341 23.4305 34.3233 25.6239 30.952 27.5193C26.9785 29.7533 22.859 31.4518 18.5935 32.6148C15.4409 33.4744 12.2085 34.0415 8.89643 34.316L8.89643 46.5306C8.89643 46.8215 8.88629 47.2492 8.86601 47.8137C8.84766 48.3245 8.83848 48.6987 8.83848 48.9362C8.83848 49.9689 8.85697 50.7473 8.89396 51.2715L8.89643 51.3066L8.89643 51.6212ZM46.2949 88.3567C46.6843 88.723 47.1445 89.0141 47.6753 89.23C47.9398 89.3407 48.4755 89.4641 49.2824 89.6002C49.4099 89.6217 49.5155 89.6383 49.5991 89.6498C49.9298 89.6953 50.1999 89.6489 50.4094 89.5107C50.4772 89.466 50.5386 89.4116 50.5937 89.3477C50.6386 89.3339 50.6832 89.3193 50.7275 89.3039C51.0848 89.1805 51.4254 89.0087 51.7494 88.7886C52.1358 88.526 52.463 88.2185 52.7311 87.8659C52.9912 87.5238 53.1956 87.1392 53.3442 86.7122L62.8423 61.9096C62.9924 61.5187 63.0869 61.1224 63.1258 60.7208C63.1547 60.4224 63.1529 60.121 63.1204 59.8167C63.082 59.4569 63.0027 59.112 62.8825 58.782C62.7625 58.4528 62.6018 58.1384 62.4004 57.8388C62.2737 57.6359 62.1315 57.4469 61.9738 57.2718C61.6588 56.9221 61.2821 56.6279 60.8436 56.3894C60.4493 56.1749 60.0419 56.0252 59.6214 55.9404C59.3463 55.8849 59.0656 55.8571 58.7793 55.8571L45.9925 55.8571L52.1891 38.2364C52.4044 37.622 52.4906 37.0169 52.4476 36.4212C52.409 35.8852 52.2658 35.3567 52.0181 34.8358C51.7674 34.3087 51.4435 33.8601 51.0463 33.4901C50.6159 33.0891 50.0995 32.7804 49.4972 32.564C48.8899 32.3458 48.2919 32.2576 47.703 32.2992C47.1653 32.3373 46.6353 32.4836 46.113 32.7382C45.6169 32.9801 45.1913 33.2887 44.8363 33.664C44.414 34.1104 44.0915 34.6512 43.8689 35.2865L35.6441 58.7428C35.5283 59.0475 35.4484 59.3573 35.4043 59.6721C35.3506 60.0563 35.3504 60.448 35.4037 60.8472C35.4406 61.124 35.5017 61.3929 35.587 61.654C35.7199 62.0608 35.9114 62.4484 36.1616 62.8169C36.3754 63.1317 36.6209 63.41 36.8982 63.652C37.1531 63.8745 37.4349 64.0663 37.7435 64.2272C38.0368 64.3802 38.3395 64.4977 38.6516 64.5798C39.0121 64.6746 39.3852 64.722 39.7707 64.7219L52.3415 64.7219L45.1473 83.5064C44.9489 84.0542 44.8557 84.5997 44.8678 85.1429C44.8806 85.723 45.0135 86.3005 45.2664 86.8753C45.5237 87.4601 45.8665 87.9539 46.2949 88.3567ZM52.7245 63.7219L39.7707 63.7219C38.6695 63.7219 37.6264 63.1939 36.9889 62.2551C36.3514 61.3163 36.1776 60.1429 36.5832 59.0867L44.8126 35.6173C45.4501 33.7985 47.3625 32.8597 49.1591 33.5051C50.9556 34.1505 51.8829 36.0867 51.2454 37.9056L44.9324 55.8571L44.5808 56.8571L58.7793 56.8571C59.8804 56.8571 60.9815 57.4439 61.561 58.3827C62.1985 59.3214 62.3144 60.4949 61.9088 61.551L52.4044 86.3699C52.1134 87.2169 51.5028 87.8559 50.7445 88.2143C50.2947 88.4269 49.7929 88.5408 49.275 88.5408C50.2145 88.7267 49.85 88.6864 49.275 88.584C49.1424 88.5604 48.9987 88.5335 48.8572 88.5053C48.5144 88.437 48.1846 88.3611 48.058 88.3061C47.6145 88.1266 47.2276 87.863 46.9079 87.5408C45.9739 86.5997 45.6127 85.1582 46.0876 83.8469L53.4123 64.7219L53.7953 63.7219L52.7245 63.7219Z' fill='currentColor' fill-rule='evenodd'/%3E%3C/svg%3E");-webkit-mask:var(--un-icon) no-repeat;mask:var(--un-icon) no-repeat;-webkit-mask-size:100% 100%;mask-size:100% 100%;background-color:currentColor;color:inherit;display:inline-flex;width:1em;height:1em}.i-waf\:qps{--un-icon:url("data:image/svg+xml;utf8,%3Csvg display='inline-flex' width='1em' height='1em' xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='currentColor' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpolyline points='22 12 18 12 15 21 9 3 6 12 2 12'%3E%3C/polyline%3E%3C/svg%3E");-webkit-mask:var(--un-icon) no-repeat;mask:var(--un-icon) no-repeat;-webkit-mask-size:100% 100%;mask-size:100% 100%;background-color:currentColor;color:inherit;display:inline-flex;width:1em;height:1em}.i-waf\:response{--un-icon:url("data:image/svg+xml;utf8,%3Csvg display='inline-flex' width='1em' height='1em' xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='currentColor' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Ccircle cx='12' cy='12' r='10'%3E%3C/circle%3E%3Cpolyline points='12 6 12 12 16 14'%3E%3C/polyline%3E%3C/svg%3E");-webkit-mask:var(--un-icon) no-repeat;mask:var(--un-icon) no-repeat;-webkit-mask-size:100% 100%;mask-size:100% 100%;background-color:currentColor;color:inherit;display:inline-flex;width:1em;height:1em}.i-waf\:site-traffic{--un-icon:url("data:image/svg+xml;utf8,%3Csvg display='inline-flex' width='1em' height='1em' t='1766214102461' viewBox='0 0 1024 1024' version='1.1' xmlns='http://www.w3.org/2000/svg' p-id='3552'%3E%3Cpath d='M290.1 409.6H155.135A371.405 371.405 0 0 0 140.851 512c0 35.533 4.967 69.888 14.336 102.4H290.15c-5.632-32.768-8.499-66.918-8.499-102.4s2.867-69.632 8.5-102.4z m52.07 0A542.106 542.106 0 0 0 332.8 512c0 35.738 3.072 69.888 9.37 102.4H486.4V409.6H342.17z m75.008 461.363A491.878 491.878 0 0 1 301.568 665.6h-127.59a372.07 372.07 0 0 0 243.2 205.363z m69.222-3.584V665.6H354.97c24.064 77.107 67.84 144.23 131.43 201.83z m-69.222-714.291a372.07 372.07 0 0 0-243.2 205.312h127.59a491.878 491.878 0 0 1 115.558-205.363z m69.222 3.584c-63.59 57.446-107.315 124.57-131.43 201.728H486.4V156.57zM733.9 409.6c5.633 32.768 8.5 66.918 8.5 102.4s-2.867 69.632-8.5 102.4h135.015c9.319-32.512 14.285-66.867 14.285-102.4s-4.966-69.888-14.336-102.4H733.901z m-52.07 0H537.6v204.8h144.23c6.247-32.512 9.37-66.662 9.37-102.4s-3.072-69.888-9.37-102.4z m-75.008 461.363a372.07 372.07 0 0 0 243.2-205.363h-127.59a491.878 491.878 0 0 1-115.558 205.363zM537.6 867.38c63.59-57.55 107.315-124.673 131.43-201.78H537.6v201.83z m69.222-714.291A491.878 491.878 0 0 1 722.432 358.4h127.642a372.07 372.07 0 0 0-243.2-205.363z m-69.222 3.584V358.4h131.43c-24.064-77.107-67.84-144.23-131.43-201.83zM512 947.2a435.2 435.2 0 1 1 0-870.4 435.2 435.2 0 0 1 0 870.4z' fill='currentColor' p-id='3553'%3E%3C/path%3E%3C/svg%3E");-webkit-mask:var(--un-icon) no-repeat;mask:var(--un-icon) no-repeat;-webkit-mask-size:100% 100%;mask-size:100% 100%;background-color:currentColor;color:inherit;display:inline-flex;width:1em;height:1em}.i-waf\:today{--un-icon:url("data:image/svg+xml;utf8,%3Csvg display='inline-flex' width='1em' height='1em' viewBox='0 0 101.2 101.2' xmlns='http://www.w3.org/2000/svg' xmlns:xlink='http://www.w3.org/1999/xlink' customFrame='%23000000'%3E%3Cpath id='矢量 6' d='M50.6 0.599976C62.1042 0.599976 71.4333 10.225 71.4333 22.0958C71.4333 23.9301 71.2091 25.7311 70.7761 27.4658C70.2889 29.4175 70.9661 31.5435 72.5949 32.7239C74.979 34.4516 77.1552 36.4556 79.0768 38.6965C79.1296 38.758 79.0892 38.8531 79.0083 38.8583C83.9375 38.8583 88.1 34.6916 88.1 29.3875C88.1 27.3416 89.62 25.6 91.6659 25.6L92.6417 25.6C94.7357 25.6 96.4333 27.2976 96.4333 29.3916C96.4333 35.4035 93.2323 40.7463 88.3562 43.7833C86.2 45.1262 84.9812 47.8855 85.8501 50.2725C86.827 52.9565 87.5055 55.7844 87.8451 58.7138C87.86 58.8422 87.9708 58.9463 88.1 58.9416L88.1 58.9333L96.6027 58.9416C98.8108 58.9431 100.6 60.7309 100.6 62.939L100.6 63.2723C100.6 65.4825 98.8075 67.2764 96.5973 67.275L88.1 67.2666C87.9715 67.2596 87.8599 67.3543 87.8451 67.4822C87.5101 70.3714 86.8385 73.206 85.8476 75.9292C84.9792 78.3155 86.1983 81.0731 88.354 82.4153C93.2313 85.452 96.4333 90.7955 96.4333 96.8083C96.4333 98.9024 94.7357 100.6 92.6417 100.6L91.921 100.6C89.8221 100.6 88.1161 98.9071 88.1 96.8083C88.1 92.2739 85.0565 88.5748 81.0943 87.597C79.9211 87.3076 78.7601 87.8909 77.9338 88.7725C74.6543 92.2714 70.7283 95.1117 66.3663 97.1329C61.4258 99.4221 56.0451 100.605 50.6 100.6C45.1553 100.606 39.7749 99.4229 34.8344 97.1344C29.9533 94.8733 25.6177 91.5867 22.1228 87.4993C22.0709 87.4386 22.1119 87.3534 22.1917 87.35L22.1917 87.3416C17.2625 87.3416 13.1 91.5083 13.1 96.8125C13.1 98.9042 11.4043 100.6 9.31251 100.6L8.55834 100.6C6.46426 100.6 4.76667 98.9024 4.76667 96.8083C4.76667 90.7959 7.96824 85.4528 12.845 82.4159C15.0009 81.0734 16.2199 78.315 15.3514 75.9284C14.3605 73.2055 13.6892 70.3712 13.3549 67.4822C13.3401 67.3543 13.2285 67.2596 13.1 67.2666L4.60001 67.2666C2.39087 67.2666 0.600006 65.4758 0.600006 63.2666L0.600006 62.9333C0.600006 60.7242 2.39087 58.9333 4.60001 58.9333L13.1 58.9333C13.1046 58.9333 13.1 58.9287 13.1 58.9333L13.1 58.9416C13.2292 58.9463 13.34 58.8422 13.3549 58.7138C13.6902 55.826 14.3617 52.9928 15.3522 50.2709C16.2207 47.8845 15.0016 45.1268 12.8458 43.7845C7.96861 40.7478 4.76667 35.4044 4.76667 29.3916C4.76667 27.2976 6.46426 25.6 8.55834 25.6L9.30834 25.6C11.4024 25.6 13.1 27.2976 13.1 29.3916C13.1 33.9269 16.1447 37.6266 20.1081 38.6035C21.28 38.8923 22.4398 38.3103 23.2658 37.4303C24.8948 35.6945 26.684 34.1181 28.609 32.7218C30.2378 31.5403 30.9137 29.4132 30.4243 27.4614C29.9859 25.7126 29.7639 23.9119 29.7667 22.1C29.7667 10.2208 39.0958 0.599976 50.6 0.599976ZM41.9325 35.2442C38.1038 36.4364 34.5456 38.4104 31.4912 41.0593C27.2681 44.7219 24.1862 49.5206 22.6121 54.8845C21.0379 60.2484 21.0379 65.9516 22.612 71.3154C24.1862 76.6793 27.2681 81.478 31.4912 85.1406C34.5456 87.7895 38.1038 89.7635 41.9325 90.9557C44.2591 91.6802 46.4333 89.7921 46.4333 87.3553L46.4333 38.8446C46.4333 36.4078 44.2591 34.5197 41.9325 35.2442ZM54.7708 34.2291L54.7708 87.3465C54.7708 89.7849 56.9478 91.6734 59.2751 90.9457C63.0972 89.7507 66.6488 87.7763 69.6974 85.1292C73.9153 81.4667 76.9931 76.6702 78.565 71.3099C80.137 65.9495 80.137 60.2505 78.565 54.8901C76.9931 49.5297 73.9153 44.7333 69.6974 41.0708C65.4794 37.4083 60.2987 35.0337 54.7708 34.2291L54.7708 34.2291ZM50.6 9.19581C43.6958 9.19581 38.1 14.9708 38.1 22.0958C38.1 22.7076 38.141 23.3125 38.2218 23.9076C38.4979 25.9406 40.6743 26.8757 42.6796 26.4422C45.2788 25.8803 47.9339 25.5972 50.6 25.6C53.3214 25.6 55.9746 25.8904 58.5303 26.4405C60.5313 26.8712 62.7015 25.9392 62.9777 23.911C63.0588 23.315 63.1 22.7089 63.1 22.0958C63.1 14.9708 57.5042 9.19581 50.6 9.19581L50.6 9.19581Z' fill='currentColor' fill-rule='nonzero'/%3E%3Cpath id='矢量 6' d='M71.4333 22.0958C71.4333 23.9301 71.2091 25.7311 70.7761 27.4658C70.2889 29.4175 70.9661 31.5435 72.5949 32.7239C74.979 34.4516 77.1552 36.4556 79.0768 38.6965C79.1296 38.758 79.0892 38.8531 79.0083 38.8583C83.9375 38.8583 88.1 34.6916 88.1 29.3875C88.1 27.3416 89.62 25.6 91.6659 25.6L92.6417 25.6C94.7357 25.6 96.4333 27.2976 96.4333 29.3916C96.4333 35.4035 93.2323 40.7463 88.3562 43.7833C86.2 45.1262 84.9812 47.8855 85.8501 50.2725C86.827 52.9565 87.5055 55.7844 87.8451 58.7138C87.86 58.8422 87.9708 58.9463 88.1 58.9416L88.1 58.9333L96.6027 58.9416C98.8108 58.9431 100.6 60.7309 100.6 62.939L100.6 63.2723C100.6 65.4825 98.8075 67.2764 96.5973 67.275L88.1 67.2666C87.9715 67.2596 87.8599 67.3543 87.8451 67.4822C87.5101 70.3714 86.8385 73.206 85.8476 75.9292C84.9792 78.3155 86.1983 81.0731 88.354 82.4153C93.2313 85.452 96.4333 90.7955 96.4333 96.8083C96.4333 98.9024 94.7357 100.6 92.6417 100.6L91.921 100.6C89.8221 100.6 88.1161 98.9071 88.1 96.8083C88.1 92.2739 85.0565 88.5748 81.0943 87.597C79.9211 87.3076 78.7601 87.8909 77.9338 88.7725C74.6543 92.2714 70.7283 95.1117 66.3663 97.1329C61.4258 99.4221 56.0451 100.605 50.6 100.6C45.1553 100.606 39.7749 99.4229 34.8344 97.1344C29.9533 94.8733 25.6177 91.5867 22.1228 87.4993C22.0709 87.4386 22.1119 87.3534 22.1917 87.35L22.1917 87.3416C17.2625 87.3416 13.1 91.5083 13.1 96.8125C13.1 98.9042 11.4043 100.6 9.31251 100.6L8.55834 100.6C6.46426 100.6 4.76667 98.9024 4.76667 96.8083C4.76667 90.7959 7.96824 85.4528 12.845 82.4159C15.0009 81.0734 16.2199 78.315 15.3514 75.9284C14.3605 73.2055 13.6892 70.3712 13.3549 67.4822C13.3401 67.3543 13.2285 67.2596 13.1 67.2666L4.60001 67.2666C2.39087 67.2666 0.600006 65.4758 0.600006 63.2666L0.600006 62.9333C0.600006 60.7242 2.39087 58.9333 4.60001 58.9333L13.1 58.9333C13.1046 58.9333 13.1 58.9287 13.1 58.9333L13.1 58.9416C13.2292 58.9463 13.34 58.8422 13.3549 58.7138C13.6902 55.826 14.3617 52.9928 15.3522 50.2709C16.2207 47.8845 15.0016 45.1268 12.8458 43.7845C7.96861 40.7478 4.76667 35.4044 4.76667 29.3916C4.76667 27.2976 6.46426 25.6 8.55834 25.6L9.30834 25.6C11.4024 25.6 13.1 27.2976 13.1 29.3916C13.1 33.9269 16.1447 37.6266 20.1081 38.6035C21.28 38.8923 22.4398 38.3103 23.2658 37.4303C24.8948 35.6945 26.684 34.1181 28.609 32.7218C30.2378 31.5403 30.9137 29.4132 30.4243 27.4614C29.9859 25.7126 29.7639 23.9119 29.7667 22.1C29.7667 10.2208 39.0958 0.599976 50.6 0.599976C62.1042 0.599976 71.4333 10.225 71.4333 22.0958ZM31.4912 41.0593C27.2681 44.7219 24.1862 49.5206 22.6121 54.8845C21.0379 60.2484 21.0379 65.9516 22.612 71.3154C24.1862 76.6793 27.2681 81.478 31.4912 85.1406C34.5456 87.7895 38.1038 89.7635 41.9325 90.9557C44.2591 91.6802 46.4333 89.7921 46.4333 87.3553L46.4333 38.8446C46.4333 36.4078 44.2591 34.5197 41.9325 35.2442C38.1038 36.4364 34.5456 38.4104 31.4912 41.0593ZM54.7708 87.3465C54.7708 89.7849 56.9478 91.6734 59.2751 90.9457C63.0972 89.7507 66.6488 87.7763 69.6974 85.1292C73.9153 81.4667 76.9931 76.6702 78.565 71.3099C80.137 65.9495 80.137 60.2505 78.565 54.8901C76.9931 49.5297 73.9153 44.7333 69.6974 41.0708C65.4794 37.4083 60.2987 35.0337 54.7708 34.2291L54.7708 34.2291L54.7708 87.3465ZM38.1 22.0958C38.1 22.7076 38.141 23.3125 38.2218 23.9076C38.4979 25.9406 40.6743 26.8757 42.6796 26.4422C45.2788 25.8803 47.9339 25.5972 50.6 25.6C53.3214 25.6 55.9746 25.8904 58.5303 26.4405C60.5313 26.8712 62.7015 25.9392 62.9777 23.911C63.0588 23.315 63.1 22.7089 63.1 22.0958C63.1 14.9708 57.5042 9.19581 50.6 9.19581L50.6 9.19581C43.6958 9.19581 38.1 14.9708 38.1 22.0958Z' fill-rule='nonzero' stroke='currentColor' stroke-width='1.20000005'/%3E%3C/svg%3E");-webkit-mask:var(--un-icon) no-repeat;mask:var(--un-icon) no-repeat;-webkit-mask-size:100% 100%;mask-size:100% 100%;background-color:currentColor;color:inherit;display:inline-flex;width:1em;height:1em}.i-waf\:traffic-filter,[i-waf\:traffic-filter=""]{--un-icon:url("data:image/svg+xml;utf8,%3Csvg display='inline-flex' width='1em' height='1em' xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='currentColor' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpolygon points='22 3 2 3 10 12.46 10 19 14 21 14 12.46 22 3'%3E%3C/polygon%3E%3C/svg%3E");-webkit-mask:var(--un-icon) no-repeat;mask:var(--un-icon) no-repeat;-webkit-mask-size:100% 100%;mask-size:100% 100%;background-color:currentColor;color:inherit;display:inline-flex;width:1em;height:1em}.i-waf\:traffic-ranking{--un-icon:url("data:image/svg+xml;utf8,%3Csvg display='inline-flex' width='1em' height='1em' xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='currentColor' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cline x1='18' y1='20' x2='18' y2='10'%3E%3C/line%3E%3Cline x1='12' y1='20' x2='12' y2='4'%3E%3C/line%3E%3Cline x1='6' y1='20' x2='6' y2='14'%3E%3C/line%3E%3C/svg%3E");-webkit-mask:var(--un-icon) no-repeat;mask:var(--un-icon) no-repeat;-webkit-mask-size:100% 100%;mask-size:100% 100%;background-color:currentColor;color:inherit;display:inline-flex;width:1em;height:1em}.i-waf\:visit-page{--un-icon:url("data:image/svg+xml;utf8,%3Csvg display='inline-flex' width='1em' height='1em' xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='currentColor' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8z'%3E%3C/path%3E%3Cpolyline points='14 2 14 8 20 8'%3E%3C/polyline%3E%3Cline x1='16' y1='13' x2='8' y2='13'%3E%3C/line%3E%3Cline x1='16' y1='17' x2='8' y2='17'%3E%3C/line%3E%3Cpolyline points='10 9 9 9 8 9'%3E%3C/polyline%3E%3C/svg%3E");-webkit-mask:var(--un-icon) no-repeat;mask:var(--un-icon) no-repeat;-webkit-mask-size:100% 100%;mask-size:100% 100%;background-color:currentColor;color:inherit;display:inline-flex;width:1em;height:1em}.i-weui\:delete-outlined{--un-icon:url("data:image/svg+xml;utf8,%3Csvg viewBox='0 0 24 24' display='inline-flex' width='1em' height='1em' xmlns='http://www.w3.org/2000/svg' %3E%3Cpath fill='currentColor' fill-rule='evenodd' d='m6.774 6.4l.812 13.648a.8.8 0 0 0 .798.752h7.232a.8.8 0 0 0 .798-.752L17.226 6.4zm11.655 0l-.817 13.719A2 2 0 0 1 15.616 22H8.384a2 2 0 0 1-1.996-1.881L5.571 6.4H3.5v-.7a.5.5 0 0 1 .5-.5h16a.5.5 0 0 1 .5.5v.7zM14 3a.5.5 0 0 1 .5.5v.7h-5v-.7A.5.5 0 0 1 10 3zM9.5 9h1.2l.5 9H10zm3.8 0h1.2l-.5 9h-1.2z'/%3E%3C/svg%3E");-webkit-mask:var(--un-icon) no-repeat;mask:var(--un-icon) no-repeat;-webkit-mask-size:100% 100%;mask-size:100% 100%;background-color:currentColor;color:inherit;display:inline-flex;width:1em;height:1em}.container,[container=""]{width:100%}[\!container=""]{width:100%!important}.empty-container:empty{width:100%}[before~=container]:before{width:100%}.flex-center{display:flex;align-items:center;justify-content:center}@media (min-width: 640px){.container,[container=""]{max-width:640px}[\!container=""]{max-width:640px!important}.empty-container:empty{max-width:640px}[before~=container]:before{max-width:640px}}@media (min-width: 768px){.container,[container=""]{max-width:768px}[\!container=""]{max-width:768px!important}.empty-container:empty{max-width:768px}[before~=container]:before{max-width:768px}}@media (min-width: 1024px){.container,[container=""]{max-width:1024px}[\!container=""]{max-width:1024px!important}.empty-container:empty{max-width:1024px}[before~=container]:before{max-width:1024px}}@media (min-width: 1280px){.container,[container=""]{max-width:1280px}[\!container=""]{max-width:1280px!important}.empty-container:empty{max-width:1280px}[before~=container]:before{max-width:1280px}}@media (min-width: 1536px){.container,[container=""]{max-width:1536px}[\!container=""]{max-width:1536px!important}.empty-container:empty{max-width:1536px}[before~=container]:before{max-width:1536px}}.\[http\:\/\/\]{http://}.visible{visibility:visible}.absolute{position:absolute}.fixed{position:fixed}.relative{position:relative}.sticky{position:sticky}.static,[static=""]{position:static}.-left-4px{left:-4px}.-top-1\.5px{top:-1.5px}.-top-90px{top:-90px}.bottom--1px{bottom:-1px}.bottom-\[10em\]{bottom:10em}.bottom-0{bottom:0}.bottom-12px{bottom:12px}.bottom-20px{bottom:20px}.bottom-5px{bottom:5px}.left-\[-21px\]{left:-21px}.left-\[0\.4rem\]{left:.4rem}.left-\[2\.6rem\]{left:2.6rem}.left-\[50\%\]{left:50%}.left-0{left:0}.left-15px{left:15px}.left-24px{left:24px}.left-50px{left:50px}.right--2px{right:-2px}.right-\[2rem\]{right:2rem}.right-0,.right-0px{right:0}.right-12px{right:12px}.right-15px{right:15px}.right-16px{right:16px}.right-1px{right:1px}.right-1rem{right:1rem}.right-20px{right:20px}.right-40px{right:40px}.right-8px{right:8px}.top--10px{top:-10px}.top-\[0\.4rem\]{top:.4rem}.top-\[1\.6rem\]{top:1.6rem}.top-\[1rem\]{top:1rem}.top-\[5rem\]{top:5rem}.top-0{top:0}.top-1\/2{top:50%}.top-12px{top:12px}.top-15px{top:15px}.top-16px{top:16px}.top-92px{top:92px}[line-clamp~="1"]{overflow:hidden;display:-webkit-box;-webkit-box-orient:vertical;-webkit-line-clamp:1;line-clamp:1}[line-clamp~="2"]{overflow:hidden;display:-webkit-box;-webkit-box-orient:vertical;-webkit-line-clamp:2;line-clamp:2}[line-clamp~="999"]{overflow:hidden;display:-webkit-box;-webkit-box-orient:vertical;-webkit-line-clamp:999;line-clamp:999}[line-clamp~="9999"]{overflow:hidden;display:-webkit-box;-webkit-box-orient:vertical;-webkit-line-clamp:9999;line-clamp:9999}.isolate{isolation:isolate}.z-1,.z01{z-index:1}.z-2,.z02{z-index:2}.z-\[55\],.z-55{z-index:55}.z-\[99\],.z-99{z-index:99}.z-10{z-index:10}.z-100{z-index:100}.z-1000{z-index:1000}.z-20{z-index:20}.z-50{z-index:50}.z-996{z-index:996}.z-9999{z-index:9999}.grid{display:grid}[cols~="1"]{grid-template-columns:repeat(1,minmax(0,1fr))}[cols~="10"]{grid-template-columns:repeat(10,minmax(0,1fr))}[cols~="11"]{grid-template-columns:repeat(11,minmax(0,1fr))}[cols~="15"]{grid-template-columns:repeat(15,minmax(0,1fr))}[cols~="2"]{grid-template-columns:repeat(2,minmax(0,1fr))}[cols~="24"]{grid-template-columns:repeat(24,minmax(0,1fr))}[cols~="3"]{grid-template-columns:repeat(3,minmax(0,1fr))}[cols~="4"]{grid-template-columns:repeat(4,minmax(0,1fr))}[cols~="6"]{grid-template-columns:repeat(6,minmax(0,1fr))}[rows~="1"]{grid-template-rows:repeat(1,minmax(0,1fr))}[rows~="10"]{grid-template-rows:repeat(10,minmax(0,1fr))}[rows~="12"]{grid-template-rows:repeat(12,minmax(0,1fr))}[rows~="14"]{grid-template-rows:repeat(14,minmax(0,1fr))}[rows~="15"]{grid-template-rows:repeat(15,minmax(0,1fr))}[rows~="16"]{grid-template-rows:repeat(16,minmax(0,1fr))}[rows~="2"]{grid-template-rows:repeat(2,minmax(0,1fr))}[rows~="3"]{grid-template-rows:repeat(3,minmax(0,1fr))}[rows~="4"]{grid-template-rows:repeat(4,minmax(0,1fr))}[rows~="5"]{grid-template-rows:repeat(5,minmax(0,1fr))}[rows~="6"]{grid-template-rows:repeat(6,minmax(0,1fr))}[rows~="8"]{grid-template-rows:repeat(8,minmax(0,1fr))}[rows~="80"]{grid-template-rows:repeat(80,minmax(0,1fr))}.float-right{float:right}.m-\[1rem\]{margin:1rem}.m-\[auto\],.m-auto{margin:auto}.m-0{margin:0}.m-15px{margin:15px}.m-16px{margin:16px}.m-20px{margin:20px}.m-2px{margin:2px}.mx-\[0\.4rem\]{margin-left:.4rem;margin-right:.4rem}.mx-\[1\.2rem\]{margin-left:1.2rem;margin-right:1.2rem}.mx-\[4px\],.mx-4px{margin-left:4px;margin-right:4px}.mx-\[8px\],.mx-8px{margin-left:8px;margin-right:8px}.mx-0\!{margin-left:0!important;margin-right:0!important}.mx-10px{margin-left:10px;margin-right:10px}.mx-12px{margin-left:12px;margin-right:12px}.mx-16px{margin-left:16px;margin-right:16px}.mx-20px{margin-left:20px;margin-right:20px}.mx-2px{margin-left:2px;margin-right:2px}.mx-32px{margin-left:32px;margin-right:32px}.mx-4px\!{margin-left:4px!important;margin-right:4px!important}.mx-5px{margin-left:5px;margin-right:5px}.mx-6px{margin-left:6px;margin-right:6px}.mx-auto{margin-left:auto;margin-right:auto}.my-\[1\.2rem\]{margin-top:1.2rem;margin-bottom:1.2rem}.my-\[1rem\]\!{margin-top:1rem!important;margin-bottom:1rem!important}.my-\[3rem\]{margin-top:3rem;margin-bottom:3rem}.my-10px{margin-top:10px;margin-bottom:10px}.my-10px\!{margin-top:10px!important;margin-bottom:10px!important}.my-15px,[my-15px=""]{margin-top:15px;margin-bottom:15px}.my-16px{margin-top:16px;margin-bottom:16px}.my-16px\!{margin-top:16px!important;margin-bottom:16px!important}.my-18px{margin-top:18px;margin-bottom:18px}.my-20px{margin-top:20px;margin-bottom:20px}.my-20px\!{margin-top:20px!important;margin-bottom:20px!important}.my-24px{margin-top:24px;margin-bottom:24px}.my-25px{margin-top:25px;margin-bottom:25px}.my-4{margin-top:1rem;margin-bottom:1rem}.my-6\!{margin-top:1.5rem!important;margin-bottom:1.5rem!important}.my-8px{margin-top:8px;margin-bottom:8px}[my-15px~="default:"]:default{margin-top:15px;margin-bottom:15px}.\!mb-\[1\.8rem\]{margin-bottom:1.8rem!important}.\!mt-\[12px\],.mt-12px\!{margin-top:12px!important}.\!mt-0{margin-top:0!important}.mb-\[\.2rem\]{margin-bottom:.2rem}.mb-\[1\.6rem\]{margin-bottom:1.6rem}.mb-\[12px\],.mb-12px{margin-bottom:12px}.mb-\[1rem\]{margin-bottom:1rem}.mb-\[20px\],.mb-20px{margin-bottom:20px}.mb-\[2rem\],.mb-8{margin-bottom:2rem}.mb-1{margin-bottom:.25rem}.mb-10px{margin-bottom:10px}.mb-14px{margin-bottom:14px}.mb-15px{margin-bottom:15px}.mb-15px\!{margin-bottom:15px!important}.mb-16px{margin-bottom:16px}.mb-16px\!{margin-bottom:16px!important}.mb-2{margin-bottom:.5rem}.mb-20px\!{margin-bottom:20px!important}.mb-24px{margin-bottom:24px}.mb-30px{margin-bottom:30px}.mb-32px{margin-bottom:32px}.mb-38px{margin-bottom:38px}.mb-40px{margin-bottom:40px}.mb-4px{margin-bottom:4px}.mb-6px{margin-bottom:6px}.mb-7px{margin-bottom:7px}.mb-8px{margin-bottom:8px}.ml-\[0\.6rem\]{margin-left:.6rem}.ml-\[1\.2rem\]{margin-left:1.2rem}.ml-\[1rem\]{margin-left:1rem}.ml-\[20px\],.ml-20px{margin-left:20px}.ml-\[3rem\]{margin-left:3rem}.ml-\[8px\],.ml-8px{margin-left:8px}.ml-0\.5em{margin-left:.5em}.ml-108px{margin-left:108px}.ml-10px,[ml-10px=""]{margin-left:10px}.ml-10px\!{margin-left:10px!important}.ml-126px{margin-left:126px}.ml-12px{margin-left:12px}.ml-14px{margin-left:14px}.ml-15px{margin-left:15px}.ml-16px{margin-left:16px}.ml-24px{margin-left:24px}.ml-2px{margin-left:2px}.ml-32px{margin-left:32px}.ml-3px{margin-left:3px}.ml-40px{margin-left:40px}.ml-4px{margin-left:4px}.ml-5{margin-left:1.25rem}.ml-5px{margin-left:5px}.ml-5px\!{margin-left:5px!important}.ml-6{margin-left:1.5rem}.ml-60px{margin-left:60px}.ml-6px{margin-left:6px}.ml-70px{margin-left:70px}.ml-7px{margin-left:7px}.ml-90px{margin-left:90px}.ml-auto{margin-left:auto}.mr-\[\.8rem\]{margin-right:.8rem}.mr-\[0\.1rem\]{margin-right:.1rem}.mr-\[1\.6rem\]{margin-right:1.6rem}.mr-\[1rem\]{margin-right:1rem}.mr-\[2rem\]{margin-right:2rem}.mr-\[4rem\]{margin-right:4rem}.mr-0\.25em{margin-right:.25em}.mr-1{margin-right:.25rem}.mr-10px{margin-right:10px}.mr-10px\!{margin-right:10px!important}.mr-12px{margin-right:12px}.mr-15px{margin-right:15px}.mr-16px{margin-right:16px}.mr-20px{margin-right:20px}.mr-22px{margin-right:22px}.mr-24px{margin-right:24px}.mr-2px{margin-right:2px}.mr-30px{margin-right:30px}.mr-32px{margin-right:32px}.mr-3px{margin-right:3px}.mr-40px{margin-right:40px}.mr-48px{margin-right:48px}.mr-4px{margin-right:4px}.mr-5{margin-right:1.25rem}.mr-5px{margin-right:5px}.mr-6px{margin-right:6px}.mr-80px{margin-right:80px}.mr-8px{margin-right:8px}.ms,[ms=""]{margin-inline-start:1rem}.mt,.mt-\[1rem\],.mt-4{margin-top:1rem}.mt--10px{margin-top:-10px}.mt--2px{margin-top:-2px}.mt-\[0rem\]{margin-top:0rem}.mt-\[1\.2rem\]{margin-top:1.2rem}.mt-\[1\.6rem\]{margin-top:1.6rem}.mt-\[10\.5rem\]{margin-top:10.5rem}.mt-\[12px\],.mt-12px{margin-top:12px}.mt-\[16px\],.mt-16px{margin-top:16px}.mt-\[2rem\]{margin-top:2rem}.mt-\[4px\],.mt-4px{margin-top:4px}.mt-10px{margin-top:10px}.mt-14px{margin-top:14px}.mt-15{margin-top:3.75rem}.mt-15px{margin-top:15px}.mt-16px\!{margin-top:16px!important}.mt-1px{margin-top:1px}.mt-20px{margin-top:20px}.mt-24px{margin-top:24px}.mt-2px{margin-top:2px}.mt-30px{margin-top:30px}.mt-32px{margin-top:32px}.mt-36px{margin-top:36px}.mt-40px{margin-top:40px}.mt-49px{margin-top:49px}.mt-50px{margin-top:50px}.mt-5px{margin-top:5px}.mt-6px{margin-top:6px}.mt-8px{margin-top:8px}[mt-10px~="default:"]:default{margin-top:10px}.last\:mb-0:last-child{margin-bottom:0}.inline,[inline=""]{display:inline}.block,[block=""]{display:block}.inline-block{display:inline-block}.contents,[contents=""]{display:contents}.list-item{display:list-item}.hidden{display:none}[hidden~="default:"]:default{display:none}[size~="0"]{width:0;height:0}[size~="10"]{width:2.5rem;height:2.5rem}[size~="100"]{width:25rem;height:25rem}[size~="12"]{width:3rem;height:3rem}[size~="120"]{width:30rem;height:30rem}[size~="13"]{width:3.25rem;height:3.25rem}[size~="14"]{width:3.5rem;height:3.5rem}[size~="15"]{width:3.75rem;height:3.75rem}[size~="150"]{width:37.5rem;height:37.5rem}[size~="16"]{width:4rem;height:4rem}[size~="17"]{width:4.25rem;height:4.25rem}[size~="18"]{width:4.5rem;height:4.5rem}[size~="2"]{width:.5rem;height:.5rem}[size~="20"]{width:5rem;height:5rem}[size~="21"]{width:5.25rem;height:5.25rem}[size~="22"]{width:5.5rem;height:5.5rem}[size~="24"]{width:6rem;height:6rem}[size~="26"]{width:6.5rem;height:6.5rem}[size~="3"]{width:.75rem;height:.75rem}[size~="30"]{width:7.5rem;height:7.5rem}[size~="32"]{width:8rem;height:8rem}[size~="34"]{width:8.5rem;height:8.5rem}[size~="36"]{width:9rem;height:9rem}[size~="4"]{width:1rem;height:1rem}[size~="40"]{width:10rem;height:10rem}[size~="46"]{width:11.5rem;height:11.5rem}[size~="48"]{width:12rem;height:12rem}[size~="5"]{width:1.25rem;height:1.25rem}[size~="50"]{width:12.5rem;height:12.5rem}[size~="6"]{width:1.5rem;height:1.5rem}[size~="60"]{width:15rem;height:15rem}[size~="8"]{width:2rem;height:2rem}[size~="80"]{width:20rem;height:20rem}.\!w-\[12rem\]{width:12rem!important}.h-\[100px\],.h-100px{height:100px}.h-\[10rem\]{height:10rem}.h-\[1rem\]{height:1rem}.h-\[2\.2rem\]{height:2.2rem}.h-\[22rem\]{height:22rem}.h-\[24rem\]{height:24rem}.h-\[3\.2rem\]{height:3.2rem}.h-\[30\.1rem\]{height:30.1rem}.h-\[32rem\]{height:32rem}.h-\[34rem\]{height:34rem}.h-\[36px\],.h-36px{height:36px}.h-\[38rem\]{height:38rem}.h-\[3rem\]{height:3rem}.h-\[4\.4rem\]{height:4.4rem}.h-\[40rem\]{height:40rem}.h-\[4rem\],.h-16{height:4rem}.h-\[5\.4rem\]{height:5.4rem}.h-\[50px\],.h-50px,[h-50px=""]{height:50px}.h-\[5px\]{height:5px}.h-\[67px\]{height:67px}.h-\[92px\]{height:92px}.h-\[96px\]{height:96px}.h-10{height:2.5rem}.h-100\%,.h-full{height:100%}.h-103px{height:103px}.h-10px{height:10px}.h-110px{height:110px}.h-114px{height:114px}.h-116px{height:116px}.h-120px{height:120px}.h-124px{height:124px}.h-130px,[h-130px=""]{height:130px}.h-150px{height:150px}.h-15px{height:15px}.h-160px{height:160px}.h-176px{height:176px}.h-180px{height:180px}.h-18px{height:18px}.h-190px{height:190px}.h-200px{height:200px}.h-200px\!{height:200px!important}.h-20px{height:20px}.h-22px{height:22px}.h-24px,[h-24px=""]{height:24px}.h-250px{height:250px}.h-25px{height:25px}.h-260px{height:260px}.h-268px{height:268px}.h-280px{height:280px}.h-28px{height:28px}.h-300px{height:300px}.h-30px{height:30px}.h-320px{height:320px}.h-32px{height:32px}.h-34px{height:34px}.h-350px{height:350px}.h-35px{height:35px}.h-360px{height:360px}.h-388px{height:388px}.h-38px{height:38px}.h-392px{height:392px}.h-400px{height:400px}.h-40px{height:40px}.h-420px{height:420px}.h-428px{height:428px}.h-42px{height:42px}.h-440px{height:440px}.h-44px{height:44px}.h-456px{height:456px}.h-460px{height:460px}.h-468px{height:468px}.h-475px{height:475px}.h-480px{height:480px}.h-48px{height:48px}.h-498px{height:498px}.h-500px{height:500px}.h-52px{height:52px}.h-530px{height:530px}.h-540px{height:540px}.h-55\%{height:55%}.h-550px{height:550px}.h-560px{height:560px}.h-56px{height:56px}.h-580px{height:580px}.h-600px{height:600px}.h-600px\!{height:600px!important}.h-60px,[h-60px=""]{height:60px}.h-610px{height:610px}.h-620px{height:620px}.h-6px{height:6px}.h-700px{height:700px}.h-70px{height:70px}.h-720px{height:720px}.h-72px{height:72px}.h-8{height:2rem}.h-80px{height:80px}.h-8px,[h-8px=""]{height:8px}.h-95px{height:95px}.h1{height:.25rem}.h2,[h2=""]{height:.5rem}.h3{height:.75rem}.max-h-\[14rem\]{max-height:14rem}.max-h-200px{max-height:200px}.max-h-22px{max-height:22px}.max-h-300px{max-height:300px}.max-h-460px{max-height:460px}.max-h-600px{max-height:600px}.max-h-640px{max-height:640px}.max-w-\[36rem\]{max-width:36rem}.max-w-\[90rem\]{max-width:90rem}.max-w-100\%,.max-w-full{max-width:100%}.max-w-1000px{max-width:1000px}.max-w-150px\!{max-width:150px!important}.max-w-160px{max-width:160px}.max-w-190px\!{max-width:190px!important}.max-w-1920px{max-width:1920px}.max-w-250px{max-width:250px}.max-w-260px{max-width:260px}.max-w-290px{max-width:290px}.max-w-300px{max-width:300px}.max-w-350px{max-width:350px}.max-w-360px{max-width:360px}.max-w-360px\!{max-width:360px!important}.max-w-480px\!{max-width:480px!important}.max-w-500px{max-width:500px}.min-h-100px{min-height:100px}.min-h-172px{min-height:172px}.min-h-18px{min-height:18px}.min-h-244px{min-height:244px}.min-h-24px{min-height:24px}.min-h-26px{min-height:26px}.min-h-28px{min-height:28px}.min-h-300px{min-height:300px}.min-h-30px{min-height:30px}.min-h-34px{min-height:34px}.min-h-48px{min-height:48px}.min-h-50px{min-height:50px}.min-h-520px{min-height:520px}.min-h-52px{min-height:52px}.min-h-60px{min-height:60px}.min-h-654px{min-height:654px}.min-w-0{min-width:0}.min-w-120px{min-width:120px}.min-w-134px{min-width:134px}.min-w-140px{min-width:140px}.min-w-160px{min-width:160px}.min-w-18px{min-width:18px}.min-w-240px{min-width:240px}.min-w-250px{min-width:250px}.min-w-260px{min-width:260px}.min-w-32px{min-width:32px}.min-w-450px{min-width:450px}.min-w-500px{min-width:500px}.min-w-52px{min-width:52px}.min-w-68px{min-width:68px}.min-w-70px{min-width:70px}.min-w-80px{min-width:80px}.min-w-auto\!{min-width:auto!important}.w-\[0\.7rem\]{width:.7rem}.w-\[100px\],.w-100px{width:100px}.w-\[10px\],.w-10px{width:10px}.w-\[10rem\]{width:10rem}.w-\[12rem\]{width:12rem}.w-\[150px\],.w-150px{width:150px}.w-\[17rem\]{width:17rem}.w-\[25rem\]{width:25rem}.w-\[26rem\]{width:26rem}.w-\[30rem\]\!{width:30rem!important}.w-\[33\%\],.w-33\%{width:33%}.w-\[34\.0rem\]{width:34rem}.w-\[350px\],.w-350px,[w-350px=""]{width:350px}.w-\[36px\],.w-36px{width:36px}.w-\[36rem\]{width:36rem}.w-\[40\%\],.w-40\%{width:40%}.w-\[48rem\]{width:48rem}.w-\[5\.8rem\]{width:5.8rem}.w-\[50px\],.w-50px{width:50px}.w-\[50rem\]{width:50rem}.w-\[50rem\]\!{width:50rem!important}.w-\[58px\]{width:58px}.w-\[60\%\]{width:60%}.w-\[78px\]{width:78px}.w-\[92px\],.w-92px{width:92px}.w-\[96px\]{width:96px}.w-\[9rem\]{width:9rem}.w-0{width:0}.w-1\/3{width:33.3333333333%}.w-100\%,.w-full{width:100%}.w-100px\!{width:100px!important}.w-1020px{width:1020px}.w-105px\!,[w-105px\!=""]{width:105px!important}.w-110px{width:110px}.w-110px\!{width:110px!important}.w-114px{width:114px}.w-120px{width:120px}.w-120px\!{width:120px!important}.w-12px{width:12px}.w-130px{width:130px}.w-130px\!{width:130px!important}.w-140px{width:140px}.w-140px\!{width:140px!important}.w-142px{width:142px}.w-145px\!{width:145px!important}.w-150px\!{width:150px!important}.w-160px{width:160px}.w-16px{width:16px}.w-170{width:42.5rem}.w-170px{width:170px}.w-174px{width:174px}.w-180px{width:180px}.w-180px\!{width:180px!important}.w-186px{width:186px}.w-190px\!{width:190px!important}.w-194px{width:194px}.w-200px{width:200px}.w-200px\!{width:200px!important}.w-208px\!,[w-208px\!=""]{width:208px!important}.w-20px{width:20px}.w-20rem{width:20rem}.w-210px{width:210px}.w-214px{width:214px}.w-215px\!{width:215px!important}.w-218px\!{width:218px!important}.w-220px{width:220px}.w-220px\!{width:220px!important}.w-225px{width:225px}.w-22px{width:22px}.w-230px{width:230px}.w-240px{width:240px}.w-240px\!{width:240px!important}.w-24px,[w-24px=""]{width:24px}.w-250px{width:250px}.w-250px\!{width:250px!important}.w-25px{width:25px}.w-260px{width:260px}.w-280px{width:280px}.w-280px\!{width:280px!important}.w-290px{width:290px}.w-290px\!{width:290px!important}.w-300px{width:300px}.w-300px\!{width:300px!important}.w-302px{width:302px}.w-310px{width:310px}.w-32\%{width:32%}.w-320px{width:320px}.w-320px\!{width:320px!important}.w-328px{width:328px}.w-32px{width:32px}.w-330px{width:330px}.w-330px\!{width:330px!important}.w-332px{width:332px}.w-34px{width:34px}.w-350px\!{width:350px!important}.w-360px{width:360px}.w-360px\!{width:360px!important}.w-380px{width:380px}.w-380px\!{width:380px!important}.w-38px{width:38px}.w-400px{width:400px}.w-400px\!{width:400px!important}.w-40px{width:40px}.w-410px{width:410px}.w-410px\!{width:410px!important}.w-415px{width:415px}.w-42\%{width:42%}.w-420px{width:420px}.w-420px\!{width:420px!important}.w-42px{width:42px}.w-430px{width:430px}.w-440px{width:440px}.w-44px{width:44px}.w-45\%{width:45%}.w-450px{width:450px}.w-450px\!{width:450px!important}.w-460px{width:460px}.w-466px{width:466px}.w-470px{width:470px}.w-476px{width:476px}.w-48\%{width:48%}.w-480px{width:480px}.w-48px{width:48px}.w-5{width:1.25rem}.w-50\%{width:50%}.w-500px{width:500px}.w-500px\!{width:500px!important}.w-50px\!{width:50px!important}.w-510px{width:510px}.w-530px,[w-530px=""]{width:530px}.w-540px{width:540px}.w-550px{width:550px}.w-550px\!{width:550px!important}.w-56px{width:56px}.w-570px{width:570px}.w-580px\!{width:580px!important}.w-600px{width:600px}.w-600px\!{width:600px!important}.w-60px{width:60px}.w-620px{width:620px}.w-640px{width:640px}.w-650px{width:650px}.w-660px{width:660px}.w-680px{width:680px}.w-70\%{width:70%}.w-700px{width:700px}.w-70px{width:70px}.w-720px{width:720px}.w-740px{width:740px}.w-76\%{width:76%}.w-760px{width:760px}.w-8{width:2rem}.w-80\%{width:80%}.w-80px{width:80px}.w-80px\!{width:80px!important}.w-820px{width:820px}.w-850px\!{width:850px!important}.w-860px{width:860px}.w-86px{width:86px}.w-88px,[w-88px=""]{width:88px}.w-8px,[w-8px=""]{width:8px}.w-90\%{width:90%}.w-900px{width:900px}.w-90px{width:90px}.w-920px{width:920px}.w-950px{width:950px}.w-96\%{width:96%}.w-98px\!{width:98px!important}.w-auto{width:auto}.w-full\!{width:100%!important}[max-w-150px\!~="default:"]:default{max-width:150px!important}[w-310px~="default:"]:default{width:310px}[w-570px~="default:"]:default{width:570px}[w-full~="default:"]:default{width:100%}.flex,[flex=""]{display:flex}.inline-flex{display:inline-flex}.flex-1{flex:1 1 0%}[flex-1~="placeholder:"]::placeholder{flex:1 1 0%}.flex-shrink{flex-shrink:1}.flex-shrink-0,.shrink-0{flex-shrink:0}.flex-shrink-0\!{flex-shrink:0!important}.flex-basis-30px{flex-basis:30px}.flex-col,[flex-col=""]{flex-direction:column}.flex-col\!{flex-direction:column!important}.flex-wrap{flex-wrap:wrap}.flex-nowrap{flex-wrap:nowrap}.flex-nowrap\!{flex-wrap:nowrap!important}.table,[table=""]{display:table}.border-collapse{border-collapse:collapse}.table-fixed{table-layout:fixed}.transform{transform:translate(var(--un-translate-x)) translateY(var(--un-translate-y)) translateZ(var(--un-translate-z)) rotate(var(--un-rotate)) rotateX(var(--un-rotate-x)) rotateY(var(--un-rotate-y)) rotate(var(--un-rotate-z)) skew(var(--un-skew-x)) skewY(var(--un-skew-y)) scaleX(var(--un-scale-x)) scaleY(var(--un-scale-y)) scaleZ(var(--un-scale-z))}@keyframes spin{0%{transform:rotate(0)}to{transform:rotate(360deg)}}.animate-spin{animation:spin 1s linear infinite}.\!animate-none{animation:none!important}.cursor-default{cursor:default}.cursor-pointer,[cursor-pointer=""]{cursor:pointer}.cursor-pointer\!{cursor:pointer!important}.cursor-move{cursor:move}.cursor-not-allowed{cursor:not-allowed}.cursor-grab{cursor:grab}.select-none{-webkit-user-select:none;user-select:none}.resize,[resize=""]{resize:both}.list-disc{list-style-type:disc}.list-outside{list-style-position:outside}.list-none\!{list-style-type:none!important}[columns~="1"]{columns:1}.\!items-start{align-items:flex-start!important}.items-start{align-items:flex-start}.items-end{align-items:flex-end}.items-end\!{align-items:flex-end!important}.items-center,[items-center=""]{align-items:center}.items-center\!{align-items:center!important}.items-baseline{align-items:baseline}.self-start{align-self:flex-start}.justify-start{justify-content:flex-start}.justify-end,[justify~=end]{justify-content:flex-end}.justify-end\!{justify-content:flex-end!important}.justify-center,[justify~=center]{justify-content:center}.justify-center\!{justify-content:center!important}.justify-between{justify-content:space-between}.justify-between\!,[justify-between\!=""]{justify-content:space-between!important}.justify-around\!{justify-content:space-around!important}.justify-evenly{justify-content:space-evenly}.justify-evenly\!{justify-content:space-evenly!important}.gap-0\!{gap:0!important}.gap-10px{gap:10px}.gap-12px{gap:12px}.gap-12px\!{gap:12px!important}.gap-16px{gap:16px}.gap-16px\!{gap:16px!important}.gap-2\.5{gap:.625rem}.gap-20px{gap:20px}.gap-24px{gap:24px}.gap-2px{gap:2px}.gap-32px{gap:32px}.gap-3px{gap:3px}.gap-4{gap:1rem}.gap-4px{gap:4px}.gap-5{gap:1.25rem}.gap-6{gap:1.5rem}.gap-6px{gap:6px}.gap-8px{gap:8px}.gap-x-24px{column-gap:24px}.overflow-auto{overflow:auto}.overflow-hidden{overflow:hidden}.overflow-y-auto{overflow-y:auto}.overflow-y-hidden{overflow-y:hidden}.truncate{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.whitespace-nowrap{white-space:nowrap}.whitespace-pre{white-space:pre}.whitespace-pre-line{white-space:pre-line}.whitespace-pre-wrap{white-space:pre-wrap}.break-all{word-break:break-all}.break-all\!{word-break:break-all!important}.b,.border,.border-1,.border-1px,[b=""],[border-1px=""]{border-width:1px}.border-\[0\.1rem\]{border-width:.1rem}.border-2px{border-width:2px}.b-b,.border-b-\[1px\],.border-b-1,.border-b-1px,[b-b~="1"]{border-bottom-width:1px}.b-l,[b-l~="1"]{border-left-width:1px}.border-\[\#e8e8e8\]{--un-border-opacity:1;border-color:rgb(232 232 232 / var(--un-border-opacity))}.border-\[\#EBEEF5\],.border-\#EBEEF5{--un-border-opacity:1;border-color:rgb(235 238 245 / var(--un-border-opacity))}.border-\[\#ececec\],.border-\#ececec{--un-border-opacity:1;border-color:rgb(236 236 236 / var(--un-border-opacity))}.border-\[var\(--color-border\)\]{border-color:var(--color-border)}.border-\[var\(--site-global-ip-white-ips-border\)\]{border-color:var(--site-global-ip-white-ips-border)}.border-\#20a53a{--un-border-opacity:1;border-color:rgb(32 165 58 / var(--un-border-opacity))}.border-\#b8e29f{--un-border-opacity:1;border-color:rgb(184 226 159 / var(--un-border-opacity))}.border-\#ccc{--un-border-opacity:1;border-color:rgb(204 204 204 / var(--un-border-opacity))}.border-\#d6e9c6{--un-border-opacity:1;border-color:rgb(214 233 198 / var(--un-border-opacity))}.border-\#e3e4e5{--un-border-opacity:1;border-color:rgb(227 228 229 / var(--un-border-opacity))}.border-\#f3adaa{--un-border-opacity:1;border-color:rgb(243 173 170 / var(--un-border-opacity))}.border-\#f4cf8f{--un-border-opacity:1;border-color:rgb(244 207 143 / var(--un-border-opacity))}.border-white{--un-border-opacity:1;border-color:rgb(255 255 255 / var(--un-border-opacity))}.border-b-\#EBEEF5{--un-border-opacity:1;--un-border-bottom-opacity:var(--un-border-opacity);border-bottom-color:rgb(235 238 245 / var(--un-border-bottom-opacity))}[b-b~="#aaa"]{--un-border-opacity:1;--un-border-bottom-opacity:var(--un-border-opacity);border-bottom-color:rgb(170 170 170 / var(--un-border-bottom-opacity))}[b-l~="#aaa"]{--un-border-opacity:1;--un-border-left-opacity:var(--un-border-opacity);border-left-color:rgb(170 170 170 / var(--un-border-left-opacity))}.rounded{border-radius:.25rem}.rounded-\[0\.2rem\]{border-radius:.2rem}.rounded-\[0\.4rem\]{border-radius:.4rem}.rounded-\[100\%\]{border-radius:100%}.rounded-\[2px\],.rounded-2px{border-radius:2px}.rounded-\[6px\]{border-radius:6px}.rounded-\[8px\],.rounded-8px{border-radius:8px}.rounded-1\/2,.rounded-50\%{border-radius:50%}.rounded-10px{border-radius:10px}.rounded-20px{border-radius:20px}.rounded-4px,[rounded-4px=""]{border-radius:4px}.rounded-5px{border-radius:5px}.rounded-full{border-radius:9999px}.rounded-b-4px{border-bottom-left-radius:4px;border-bottom-right-radius:4px}.rounded-bl-10px{border-bottom-left-radius:10px}.rounded-bl-full{border-bottom-left-radius:9999px}.rounded-tl-10px{border-top-left-radius:10px}.rounded-tl-full{border-top-left-radius:9999px}.rounded-tr-10px{border-top-right-radius:10px}.\!border-none{border-style:none!important}.border-none{border-style:none}.border-solid,[border-solid=""]{border-style:solid}.border-b-solid,[b-b~=solid]{border-bottom-style:solid}[b-l~=solid]{border-left-style:solid}.bg-\[\#20a53a\],.bg-\#20a53a{--un-bg-opacity:1;background-color:rgb(32 165 58 / var(--un-bg-opacity))}.bg-\[\#333\]{--un-bg-opacity:1;background-color:rgb(51 51 51 / var(--un-bg-opacity))}.bg-\[\#a1a1a1\]{--un-bg-opacity:1;background-color:rgb(161 161 161 / var(--un-bg-opacity))}.bg-\[\#CBCBCB\]{--un-bg-opacity:1;background-color:rgb(203 203 203 / var(--un-bg-opacity))}.bg-\[\#ef0808\]{--un-bg-opacity:1;background-color:rgb(239 8 8 / var(--un-bg-opacity))}.bg-\[\#efefef\]{--un-bg-opacity:1;background-color:rgb(239 239 239 / var(--un-bg-opacity))}.bg-\[\#f0ad4e\]{--un-bg-opacity:1;background-color:rgb(240 173 78 / var(--un-bg-opacity))}.bg-\[\#F1F9F3\],.bg-\#F1F9F3{--un-bg-opacity:1;background-color:rgb(241 249 243 / var(--un-bg-opacity))}.bg-\[\#f6f6f6\]{--un-bg-opacity:1;background-color:rgb(246 246 246 / var(--un-bg-opacity))}.bg-\[\#fc6d26\]{--un-bg-opacity:1;background-color:rgb(252 109 38 / var(--un-bg-opacity))}.bg-\[\#ffff00\]{--un-bg-opacity:1;background-color:rgb(255 255 0 / var(--un-bg-opacity))}.bg-\[100\%\]{background-position:100%}.bg-\[var\(--app-third-install-tip-bg\)\]{background-color:var(--app-third-install-tip-bg)}.bg-\[var\(--data-base-del-input-bg\)\]{background-color:var(--data-base-del-input-bg)}.bg-\[var\(--domains-lets-ssl-apply-bg\)\]{background-color:var(--domains-lets-ssl-apply-bg)}.bg-\[var\(--home-overview-btn-color\)\]{background-color:var(--home-overview-btn-color)}.bg-\[var\(--home-update-latest-bg\)\]{background-color:var(--home-update-latest-bg)}.bg-\[var\(--security-server-safe-progress\)\]{background-color:var(--security-server-safe-progress)}.bg-\[var\(--setting-security-google-login-key-bg\)\]{background-color:var(--setting-security-google-login-key-bg)}.bg-\[var\(--site-global-ip-white-ips-bg\)\]{background-color:var(--site-global-ip-white-ips-bg)}.bg-\#282c34,.bg-\#282C34{--un-bg-opacity:1;background-color:rgb(40 44 52 / var(--un-bg-opacity))}.bg-\#333333{--un-bg-opacity:1;background-color:rgb(51 51 51 / var(--un-bg-opacity))}.bg-\#424251{--un-bg-opacity:1;background-color:rgb(66 66 81 / var(--un-bg-opacity))}.bg-\#4caf50{--un-bg-opacity:1;background-color:rgb(76 175 80 / var(--un-bg-opacity))}.bg-\#7f7f7f{--un-bg-opacity:1;background-color:rgb(127 127 127 / var(--un-bg-opacity))}.bg-\#c7f7ce{--un-bg-opacity:1;background-color:rgb(199 247 206 / var(--un-bg-opacity))}.bg-\#c8e6c9{--un-bg-opacity:1;background-color:rgb(200 230 201 / var(--un-bg-opacity))}.bg-\#cccccc{--un-bg-opacity:1;background-color:rgb(204 204 204 / var(--un-bg-opacity))}.bg-\#cccccc00{--un-bg-opacity:0;background-color:rgb(204 204 204 / var(--un-bg-opacity))}.bg-\#e7f5e9{--un-bg-opacity:1;background-color:rgb(231 245 233 / var(--un-bg-opacity))}.bg-\#ececec{--un-bg-opacity:1;background-color:rgb(236 236 236 / var(--un-bg-opacity))}.bg-\#f5f5f5{--un-bg-opacity:1;background-color:rgb(245 245 245 / var(--un-bg-opacity))}.bg-\#f5f6fa{--un-bg-opacity:1;background-color:rgb(245 246 250 / var(--un-bg-opacity))}.bg-\#f70b3c{--un-bg-opacity:1;background-color:rgb(247 11 60 / var(--un-bg-opacity))}.bg-\#f7cfce{--un-bg-opacity:1;background-color:rgb(247 207 206 / var(--un-bg-opacity))}.bg-\#f7e6ce{--un-bg-opacity:1;background-color:rgb(247 230 206 / var(--un-bg-opacity))}.bg-\#f7f7f7{--un-bg-opacity:1;background-color:rgb(247 247 247 / var(--un-bg-opacity))}.bg-\#ff0000{--un-bg-opacity:1;background-color:rgb(255 0 0 / var(--un-bg-opacity))}.bg-\#ff6000{--un-bg-opacity:1;background-color:rgb(255 96 0 / var(--un-bg-opacity))}.bg-\#ffaa2c{--un-bg-opacity:1;background-color:rgb(255 170 44 / var(--un-bg-opacity))}.bg-\#FFB04C{--un-bg-opacity:1;background-color:rgb(255 176 76 / var(--un-bg-opacity))}.bg-\#ffc107\!{--un-bg-opacity:1 !important;background-color:rgb(255 193 7 / var(--un-bg-opacity))!important}.bg-\#fff,.bg-white,.bg-\#ffffff{--un-bg-opacity:1;background-color:rgb(255 255 255 / var(--un-bg-opacity))}.bg-black{--un-bg-opacity:1;background-color:rgb(0 0 0 / var(--un-bg-opacity))}.bg-error{background-color:var(--color-error)}.bg-gray-100{--un-bg-opacity:1;background-color:rgb(243 244 246 / var(--un-bg-opacity))}.bg-gray-500{--un-bg-opacity:1;background-color:rgb(107 114 128 / var(--un-bg-opacity))}.bg-gray-700,.dark .dark\:bg-gray-700{--un-bg-opacity:1;background-color:rgb(55 65 81 / var(--un-bg-opacity))}.bg-modal{background-color:var(--color-modal)}.bg-primary{background-color:var(--color-primary)}.bg-red-500{--un-bg-opacity:1;background-color:rgb(239 68 68 / var(--un-bg-opacity))}.hover\:bg-\#ececec:hover{--un-bg-opacity:1;background-color:rgb(236 236 236 / var(--un-bg-opacity))}.hover\:bg-\#F68900:hover{--un-bg-opacity:1;background-color:rgb(246 137 0 / var(--un-bg-opacity))}.hover\:bg-primary:hover{background-color:var(--color-primary)}[stroke-width~="10"]{stroke-width:10px}[stroke-width~="12"]{stroke-width:12px}[stroke-width~="4"]{stroke-width:4px}[stroke-width~="7"]{stroke-width:7px}.\!p-\[0\],.\!p-0{padding:0!important}.p-\[1\.6rem\]{padding:1.6rem}.p-\[12px\],.p-12px{padding:12px}.p-\[20px\],.p-20px{padding:20px}.p-\[2rem\],.p-8{padding:2rem}.p-10{padding:2.5rem}.p-10px{padding:10px}.p-15px{padding:15px}.p-16px{padding:16px}.p-24px{padding:24px}.p-26px{padding:26px}.p-30px{padding:30px}.p-32px{padding:32px}.p-40px{padding:40px}.p-4px{padding:4px}.p-5{padding:1.25rem}.p-5px,[p-5px=""]{padding:5px}.p-6px{padding:6px}.p-8px,[p-8px=""]{padding:8px}.px,[px=""]{padding-left:1rem;padding-right:1rem}.px-\[0\.8rem\]{padding-left:.8rem;padding-right:.8rem}.px-\[1\.6rem\]{padding-left:1.6rem;padding-right:1.6rem}.px-\[3rem\]{padding-left:3rem;padding-right:3rem}.px-\[8px\],.px-8px{padding-left:8px;padding-right:8px}.px-0{padding-left:0;padding-right:0}.px-10px{padding-left:10px;padding-right:10px}.px-12px{padding-left:12px;padding-right:12px}.px-15px{padding-left:15px;padding-right:15px}.px-16px{padding-left:16px;padding-right:16px}.px-2{padding-left:.5rem;padding-right:.5rem}.px-20px,[px-20px=""]{padding-left:20px;padding-right:20px}.px-24px{padding-left:24px;padding-right:24px}.px-2px{padding-left:2px;padding-right:2px}.px-30px{padding-left:30px;padding-right:30px}.px-32px{padding-left:32px;padding-right:32px}.px-36px{padding-left:36px;padding-right:36px}.px-40px{padding-left:40px;padding-right:40px}.px-4px{padding-left:4px;padding-right:4px}.px-50px{padding-left:50px;padding-right:50px}.px-5px{padding-left:5px;padding-right:5px}.px-6px{padding-left:6px;padding-right:6px}.py,.py-\[1rem\]{padding-top:1rem;padding-bottom:1rem}.py-\[0\.6rem\]{padding-top:.6rem;padding-bottom:.6rem}.py-\[3\.2rem\]{padding-top:3.2rem;padding-bottom:3.2rem}.py-1{padding-top:.25rem;padding-bottom:.25rem}.py-10px{padding-top:10px;padding-bottom:10px}.py-12px{padding-top:12px;padding-bottom:12px}.py-15px{padding-top:15px;padding-bottom:15px}.py-16px{padding-top:16px;padding-bottom:16px}.py-20px{padding-top:20px;padding-bottom:20px}.py-24px{padding-top:24px;padding-bottom:24px}.py-26px{padding-top:26px;padding-bottom:26px}.py-2px{padding-top:2px;padding-bottom:2px}.py-30px{padding-top:30px;padding-bottom:30px}.py-32px{padding-top:32px;padding-bottom:32px}.py-3px{padding-top:3px;padding-bottom:3px}.py-40px{padding-top:40px;padding-bottom:40px}.py-4px{padding-top:4px;padding-bottom:4px}.py-52px{padding-top:52px;padding-bottom:52px}.py-5px{padding-top:5px;padding-bottom:5px}.py-6px{padding-top:6px;padding-bottom:6px}.py-8px{padding-top:8px;padding-bottom:8px}[px~="14"]{padding-left:3.5rem;padding-right:3.5rem}[px-8px~="default:"]:default{padding-left:8px;padding-right:8px}[px~="default:"]:default{padding-left:1rem;padding-right:1rem}.pb-0{padding-bottom:0}.pb-100px{padding-bottom:100px}.pb-10px{padding-bottom:10px}.pb-12px{padding-bottom:12px}.pb-16px{padding-bottom:16px}.pb-20px{padding-bottom:20px}.pb-24px{padding-bottom:24px}.pb-32px{padding-bottom:32px}.pb-40px{padding-bottom:40px}.pb-8px{padding-bottom:8px}.pl{padding-left:1rem}.pl-\[2\.5rem\]{padding-left:2.5rem}.pl-10\%{padding-left:10%}.pl-10px{padding-left:10px}.pl-12px{padding-left:12px}.pl-15px{padding-left:15px}.pl-16px,[pl-16px=""]{padding-left:16px}.pl-20px{padding-left:20px}.pl-21px{padding-left:21px}.pl-22px{padding-left:22px}.pl-24px{padding-left:24px}.pl-28px{padding-left:28px}.pl-30px{padding-left:30px}.pl-36px{padding-left:36px}.pl-48px{padding-left:48px}.pl-4px{padding-left:4px}.pl-5px{padding-left:5px}.pl-8px{padding-left:8px}.pr-\[0\.8rem\]{padding-right:.8rem}.pr-\[1\.5rem\]{padding-right:1.5rem}.pr-\[2rem\]{padding-right:2rem}.pr-10px{padding-right:10px}.pr-15px{padding-right:15px}.pr-16px{padding-right:16px}.pr-24px{padding-right:24px}.pr-40px{padding-right:40px}.pr-56px{padding-right:56px}.pr-8\%{padding-right:8%}.pr-8px{padding-right:8px}.ps,[ps=""]{padding-inline-start:1rem}.ps1{padding-inline-start:.25rem}.pt{padding-top:1rem}.pt-0,.pt-0px{padding-top:0}.pt-0\!{padding-top:0!important}.pt-100px{padding-top:100px}.pt-120px{padding-top:120px}.pt-12px{padding-top:12px}.pt-140px{padding-top:140px}.pt-14px{padding-top:14px}.pt-15px{padding-top:15px}.pt-16px{padding-top:16px}.pt-20px{padding-top:20px}.pt-22px{padding-top:22px}.pt-24px,[pt-24px=""]{padding-top:24px}.pt-28px{padding-top:28px}.pt-32px{padding-top:32px}.pt-35px{padding-top:35px}.pt-40px{padding-top:40px}.pt-44px{padding-top:44px}.pt-4px{padding-top:4px}.pt-50px{padding-top:50px}.pt-52px{padding-top:52px}.pt-5px{padding-top:5px}.pt-68px{padding-top:68px}.pt-6px{padding-top:6px}.pt-8\%{padding-top:8%}.pt-80px{padding-top:80px}.pt-8px{padding-top:8px}[pb-12px~="default:"]:default{padding-bottom:12px}.pie{padding-inline-end:1rem}.text-center{text-align:center}.text-left{text-align:left}.text-right{text-align:right}.indent--15px{text-indent:-15px}.root-indent:root{text-indent:1.5rem}[root-indent~="0"]:root{text-indent:0}[root-indent~="26"]:root{text-indent:6.5rem}.text-nowrap{text-wrap:nowrap}.text-nowrap\!{text-wrap:nowrap!important}.align-middle{vertical-align:middle}.text-\[1\.2rem\]{font-size:1.2rem}.text-\[1\.4rem\]{font-size:1.4rem}.text-\[1\.5rem\]{font-size:1.5rem}.text-\[1\.6rem\]{font-size:1.6rem}.text-\[1\.8rem\]{font-size:1.8rem}.text-\[11px\]{font-size:11px}.text-\[14px\],.text-14px{font-size:14px}.text-\[18px\],.text-18px{font-size:18px}.text-\[2\.4rem\]{font-size:2.4rem}.text-\[22px\],.text-22px{font-size:22px}.text-\[2rem\]{font-size:2rem}.text-\[3\.2rem\]{font-size:3.2rem}.text-\[30px\],.text-30px{font-size:30px}.text-10px{font-size:10px}.text-12px{font-size:12px}.text-12px\!{font-size:12px!important}.text-13px{font-size:13px}.text-15px{font-size:15px}.text-16{font-size:4rem}.text-16px{font-size:16px}.text-17px,[text-17px=""]{font-size:17px}.text-19px{font-size:19px}.text-20px{font-size:20px}.text-21px{font-size:21px}.text-24px{font-size:24px}.text-26px{font-size:26px}.text-28px{font-size:28px}.text-2xl{font-size:1.5rem;line-height:2rem}.text-32px{font-size:32px}.text-34px{font-size:34px}.text-3xl{font-size:1.875rem;line-height:2.25rem}.text-4xl\!{font-size:2.25rem!important;line-height:2.5rem!important}.text-50px{font-size:50px}.text-7{font-size:1.75rem}.text-lg{font-size:1.125rem;line-height:1.75rem}.text-xl{font-size:1.25rem;line-height:1.75rem}.text-xs{font-size:.75rem;line-height:1rem}[text-14px~="default:"]:default{font-size:14px}[font-size~="12"]{font-size:3rem}.\!text-\[\#20a53A\]{--un-text-opacity:1 !important;color:rgb(32 165 58 / var(--un-text-opacity))!important}.\!text-\[\#E8D544\]{--un-text-opacity:1 !important;color:rgb(232 213 68 / var(--un-text-opacity))!important}.\!text-\[\#EF0808\]{--un-text-opacity:1 !important;color:rgb(239 8 8 / var(--un-text-opacity))!important}.\!text-\[\#F0AD4E\]{--un-text-opacity:1 !important;color:rgb(240 173 78 / var(--un-text-opacity))!important}.color-gray,.dark .dark\:text-gray-400,.text-gray-400{--un-text-opacity:1;color:rgb(156 163 175 / var(--un-text-opacity))}.text-\[\'\ \+\ \(_unref\(scanDetect\)\.security_count\ \=\=\=\ 100\ \?\ \'\ \#20a53a\ \'\ \:\ \'\ \#fc6d26\ \'\)\ \+\ \'\]{color:" + ( unref(scanDetect).security count === 100 ? " #20a53a " : " #fc6d26 ") + "}.text-\[\'\ \+\ \(scanDetect\.security_count\ \=\=\=\ 100\ \?\ \'\ \#20a53a\ \'\ \:\ \'\ \#fc6d26\ \'\)\ \+\ \'\]{color:" + (scanDetect.security count === 100 ? " #20a53a " : " #fc6d26 ") + "}.color-\#20a53a,.text-\[\#20a53a\],.text-\#20a53a,[color~="#20a53a"]{--un-text-opacity:1;color:rgb(32 165 58 / var(--un-text-opacity))}.text-\[\#333\],.text-\#333{--un-text-opacity:1;color:rgb(51 51 51 / var(--un-text-opacity))}.text-\[\#36ad6a\]{--un-text-opacity:1;color:rgb(54 173 106 / var(--un-text-opacity))}.text-\[\#555\],.text-\#555{--un-text-opacity:1;color:rgb(85 85 85 / var(--un-text-opacity))}.text-\[\#565656\]{--un-text-opacity:1;color:rgb(86 86 86 / var(--un-text-opacity))}.text-\[\#909399\],[color~="#909399"]{--un-text-opacity:1;color:rgb(144 147 153 / var(--un-text-opacity))}.color-\#999,.text-\[\#999\],.text-\#999,[color~="#999"]{--un-text-opacity:1;color:rgb(153 153 153 / var(--un-text-opacity))}.color-\#ef0808,.text-\[\#ef0808\],[color~="#ef0808"]{--un-text-opacity:1;color:rgb(239 8 8 / var(--un-text-opacity))}.text-\[\#f0a020\],[color~="#f0a020"]{--un-text-opacity:1;color:rgb(240 160 32 / var(--un-text-opacity))}.text-\[\#F0AD4E\]{--un-text-opacity:1;color:rgb(240 173 78 / var(--un-text-opacity))}.color-\#fc6d26,.text-\[\#fc6d26\],.text-\#fc6d26,[color~="#fc6d26"]{--un-text-opacity:1;color:rgb(252 109 38 / var(--un-text-opacity))}.color-\#fff,.color-white,.text-\[\#fff\],.text-\#fff,.text-white,[color~="#fff"],[color~=white]{--un-text-opacity:1;color:rgb(255 255 255 / var(--un-text-opacity))}.text-\[red\]{color:red}.text-\[var\(--border-hover-focus-color\)\]{color:var(--border-hover-focus-color)}.text-\[var\(--home-success-text-color\)\]{color:var(--home-success-text-color)}.text-\[var\(--setting-security-google-login-bind-text\)\]{color:var(--setting-security-google-login-bind-text)}.text-\[var\(--setting-security-google-login-bind-title\)\]{color:var(--setting-security-google-login-bind-title)}.text-\[var\(--setting-security-google-login-key-text\)\]{color:var(--setting-security-google-login-key-text)}.color-\#1d9534,.text-\#1d9534{--un-text-opacity:1;color:rgb(29 149 52 / var(--un-text-opacity))}.text-\#20a53a\!{--un-text-opacity:1 !important;color:rgb(32 165 58 / var(--un-text-opacity))!important}.color-\#3c763d,.text-\#3c763d{--un-text-opacity:1;color:rgb(60 118 61 / var(--un-text-opacity))}.color-\#666,.text-\#666,[color~="#666"]{--un-text-opacity:1;color:rgb(102 102 102 / var(--un-text-opacity))}.text-\#666\!{--un-text-opacity:1 !important;color:rgb(102 102 102 / var(--un-text-opacity))!important}.text-\#69be3d{--un-text-opacity:1;color:rgb(105 190 61 / var(--un-text-opacity))}.text-\#6c7688{--un-text-opacity:1;color:rgb(108 118 136 / var(--un-text-opacity))}.text-\#777{--un-text-opacity:1;color:rgb(119 119 119 / var(--un-text-opacity))}.text-\#919191{--un-text-opacity:1;color:rgb(145 145 145 / var(--un-text-opacity))}.text-\#9DA1A6{--un-text-opacity:1;color:rgb(157 161 166 / var(--un-text-opacity))}.text-\#ccc,[color~="#ccc"]{--un-text-opacity:1;color:rgb(204 204 204 / var(--un-text-opacity))}.text-\#e6a23c{--un-text-opacity:1;color:rgb(230 162 60 / var(--un-text-opacity))}.text-\#ef8581{--un-text-opacity:1;color:rgb(239 133 129 / var(--un-text-opacity))}.text-\#f7be56{--un-text-opacity:1;color:rgb(247 190 86 / var(--un-text-opacity))}.text-\#fcb040{--un-text-opacity:1;color:rgb(252 176 64 / var(--un-text-opacity))}.text-base,.text-title{color:var(--color-text-base)}.text-black,[color~="#000"]{--un-text-opacity:1;color:rgb(0 0 0 / var(--un-text-opacity))}.text-blue-500{--un-text-opacity:1;color:rgb(59 130 246 / var(--un-text-opacity))}.text-body{--un-text-opacity:1;color:rgb(58 66 77 / var(--un-text-opacity))}.text-dark{--un-text-opacity:1;color:rgb(34 34 34 / var(--un-text-opacity))}.text-default{color:var(--color-text-4)}.color-desc,.text-desc{color:var(--color-text-desc)}.color-error,.text-error,[text-error=""]{color:var(--color-error)}.text-font1{color:var(--color-text-1)}.color-font2,.text-font2{color:var(--color-text-2)}.text-font3{color:var(--color-text-3)}.text-gray-600{--un-text-opacity:1;color:rgb(75 85 99 / var(--un-text-opacity))}.color-primary,.text-primary,.text-primary\:hover{color:var(--color-primary)}.text-primary-hover{--un-text-opacity:1;color:rgb(29 149 52 / var(--un-text-opacity))}.text-primary\!{color:var(--color-primary)!important}.text-pro{color:var(--color-pro)}.text-purple-500{--un-text-opacity:1;color:rgb(168 85 247 / var(--un-text-opacity))}.text-red-5,.text-red-500{--un-text-opacity:1;color:rgb(239 68 68 / var(--un-text-opacity))}.color-warning,.text-warning{color:var(--color-warning)}.text-warning\!{color:var(--color-warning)!important}.text-weak{--un-text-opacity:1;color:rgb(196 198 201 / var(--un-text-opacity))}.text-yellow-500{--un-text-opacity:1;color:rgb(234 179 8 / var(--un-text-opacity))}[text~="$t("]{color:var(--t\()}.hover\:text-\#777777:hover{--un-text-opacity:1;color:rgb(119 119 119 / var(--un-text-opacity))}.hover\:text-primary-hover:hover{--un-text-opacity:1;color:rgb(29 149 52 / var(--un-text-opacity))}.hover\:text-primary:hover{color:var(--color-primary)}.color-\[var\(--home-update-bt-link-color\)\]{color:var(--home-update-bt-link-color)}.color-\#666666,[color~="#666666"]{--un-text-opacity:1;color:rgb(102 102 102 / var(--un-text-opacity))}.color-\#888888{--un-text-opacity:1;color:rgb(136 136 136 / var(--un-text-opacity))}.color-\#999999{--un-text-opacity:1;color:rgb(153 153 153 / var(--un-text-opacity))}.color-\#a94442{--un-text-opacity:1;color:rgb(169 68 66 / var(--un-text-opacity))}.color-\#f23836{--un-text-opacity:1;color:rgb(242 56 54 / var(--un-text-opacity))}.color-\#fc7938{--un-text-opacity:1;color:rgb(252 121 56 / var(--un-text-opacity))}.color-\#ff3333{--un-text-opacity:1;color:rgb(255 51 51 / var(--un-text-opacity))}.color-\#ffb800{--un-text-opacity:1;color:rgb(255 184 0 / var(--un-text-opacity))}.color-red{--un-text-opacity:1;color:rgb(248 113 113 / var(--un-text-opacity))}[color~="#0a8c46"]{--un-text-opacity:1;color:rgb(10 140 70 / var(--un-text-opacity))}[color~="#4fb233"]{--un-text-opacity:1;color:rgb(79 178 51 / var(--un-text-opacity))}[color~="#67c23a"]{--un-text-opacity:1;color:rgb(103 194 58 / var(--un-text-opacity))}[color~="#A6ADB3"]{--un-text-opacity:1;color:rgb(166 173 179 / var(--un-text-opacity))}[color~="#bbb"]{--un-text-opacity:1;color:rgb(187 187 187 / var(--un-text-opacity))}[color~="#c2c2c2"]{--un-text-opacity:1;color:rgb(194 194 194 / var(--un-text-opacity))}[color~="#cbcbcb"]{--un-text-opacity:1;color:rgb(203 203 203 / var(--un-text-opacity))}[color~="#E65100"]{--un-text-opacity:1;color:rgb(230 81 0 / var(--un-text-opacity))}[color~="#E85445"]{--un-text-opacity:1;color:rgb(232 84 69 / var(--un-text-opacity))}[color~="#f08a00"]{--un-text-opacity:1;color:rgb(240 138 0 / var(--un-text-opacity))}[color~="#f2711c"]{--un-text-opacity:1;color:rgb(242 113 28 / var(--un-text-opacity))}[color~="#FDCA62"]{--un-text-opacity:1;color:rgb(253 202 98 / var(--un-text-opacity))}[color~="#ff8d00"]{--un-text-opacity:1;color:rgb(255 141 0 / var(--un-text-opacity))}[color~="#ffae45"]{--un-text-opacity:1;color:rgb(255 174 69 / var(--un-text-opacity))}.font-500{font-weight:500}.font-600{font-weight:600}.font-700,.font-bold,.fw-bold{font-weight:700}.font-bold\!{font-weight:700!important}.leading-\[0\.14rem\]{line-height:.14rem}.leading-\[1\.2\]{line-height:1.2}.leading-\[1\.4\]{line-height:1.4}.leading-\[1\.5\]{line-height:1.5}.leading-\[1\.8rem\]{line-height:1.8rem}.leading-\[1\],.leading-none{line-height:1}.leading-\[2rem\]{line-height:2rem}.leading-1{line-height:.25rem}.leading-14px{line-height:14px}.leading-15px{line-height:15px}.leading-16px{line-height:16px}.leading-17px{line-height:17px}.leading-18{line-height:4.5rem}.leading-18px{line-height:18px}.leading-20px{line-height:20px}.leading-22px,.lh-22px{line-height:22px}.leading-24px,.line-height-24px{line-height:24px}.leading-25px{line-height:25px}.leading-26px{line-height:26px}.leading-28px{line-height:28px}.leading-30px{line-height:30px}.leading-32px{line-height:32px}.leading-36px{line-height:36px}.leading-40px{line-height:40px}.leading-50px{line-height:50px}.uppercase{text-transform:uppercase}.lowercase{text-transform:lowercase}.capitalize{text-transform:capitalize}.italic{font-style:italic}.line-through{text-decoration-line:line-through}.underline{text-decoration-line:underline}.tab,[tab=""]{-moz-tab-size:4;-o-tab-size:4;tab-size:4}.tab-0{-moz-tab-size:0;-o-tab-size:0;tab-size:0}[tab~="$t("]{-moz-tab-size:var(--t\();-o-tab-size:var(--t\();tab-size:var(--t\()}[tab~="1"]{-moz-tab-size:1;-o-tab-size:1;tab-size:1}.text-shadow{--un-text-shadow:0 0 1px var(--un-text-shadow-color, rgb(0 0 0 / .2)),0 0 1px var(--un-text-shadow-color, rgb(1 0 5 / .1));text-shadow:var(--un-text-shadow)}.write-vertical-right{writing-mode:vertical-rl}.opacity-0{opacity:0}.opacity-50{opacity:.5}.shadow{--un-shadow:var(--un-shadow-inset) 0 1px 3px 0 var(--un-shadow-color, rgb(0 0 0 / .1)),var(--un-shadow-inset) 0 1px 2px -1px var(--un-shadow-color, rgb(0 0 0 / .1));box-shadow:var(--un-ring-offset-shadow),var(--un-ring-shadow),var(--un-shadow)}.outline{outline-style:solid}.blur,[blur=""]{--un-blur:blur(8px);filter:var(--un-blur) var(--un-brightness) var(--un-contrast) var(--un-drop-shadow) var(--un-grayscale) var(--un-hue-rotate) var(--un-invert) var(--un-saturate) var(--un-sepia)}[blur~="required:"]:required{--un-blur:blur(8px);filter:var(--un-blur) var(--un-brightness) var(--un-contrast) var(--un-drop-shadow) var(--un-grayscale) var(--un-hue-rotate) var(--un-invert) var(--un-saturate) var(--un-sepia)}.filter{filter:var(--un-blur) var(--un-brightness) var(--un-contrast) var(--un-drop-shadow) var(--un-grayscale) var(--un-hue-rotate) var(--un-invert) var(--un-saturate) var(--un-sepia)}.backdrop-filter{-webkit-backdrop-filter:var(--un-backdrop-blur) var(--un-backdrop-brightness) var(--un-backdrop-contrast) var(--un-backdrop-grayscale) var(--un-backdrop-hue-rotate) var(--un-backdrop-invert) var(--un-backdrop-opacity) var(--un-backdrop-saturate) var(--un-backdrop-sepia);backdrop-filter:var(--un-backdrop-blur) var(--un-backdrop-brightness) var(--un-backdrop-contrast) var(--un-backdrop-grayscale) var(--un-backdrop-hue-rotate) var(--un-backdrop-invert) var(--un-backdrop-opacity) var(--un-backdrop-saturate) var(--un-backdrop-sepia)}.transition{transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition-all{transition-property:all;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition-colors,[transition-colors=""]{transition-property:color,background-color,border-color,text-decoration-color,fill,stroke;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.duration-100{transition-duration:.1s}.duration-200{transition-duration:.2s}.ease,.ease-in-out{transition-timing-function:cubic-bezier(.4,0,.2,1)}.ease-in{transition-timing-function:cubic-bezier(.4,0,1,1)}.content-none{content:none}[placeholder~="$t("]::placeholder{color:var(--t\()}@media (min-width: 1280px){[cols~="xl:4"]{grid-template-columns:repeat(4,minmax(0,1fr))}[cols~="xl:5"]{grid-template-columns:repeat(5,minmax(0,1fr))}}@media (min-width: 1536px){[cols~="2xl:5"]{grid-template-columns:repeat(5,minmax(0,1fr))}}:where(html){line-height:1.15;-webkit-text-size-adjust:100%;text-size-adjust:100%}:where(h1){font-size:2em;margin-block-end:.67em;margin-block-start:.67em}:where(dl,ol,ul) :where(dl,ol,ul){margin-block-end:0;margin-block-start:0}:where(hr){box-sizing:content-box;color:inherit;height:0}:where(abbr[title]){text-decoration:underline;text-decoration:underline dotted}:where(b,strong){font-weight:bolder}:where(code,kbd,pre,samp){font-family:monospace,monospace;font-size:1em}:where(small){font-size:80%}:where(table){border-color:currentColor;text-indent:0}:where(button,input,select){margin:0}:where(button){text-transform:none}:where(button,input:is([type=button i],[type=reset i],[type=submit i])){-webkit-appearance:button}:where(progress){vertical-align:baseline}:where(select){text-transform:none}:where(textarea){margin:0}:where(input[type=search i]){-webkit-appearance:textfield;outline-offset:-2px}::-webkit-inner-spin-button,::-webkit-outer-spin-button{height:auto}::-webkit-input-placeholder{color:inherit;opacity:.54}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}:where(button,input:is([type=button i],[type=color i],[type=reset i],[type=submit i]))::-moz-focus-inner{border-style:none;padding:0}:where(button,input:is([type=button i],[type=color i],[type=reset i],[type=submit i]))::-moz-focusring{outline:1px dotted ButtonText}:where(:-moz-ui-invalid){box-shadow:none}:where(dialog){background-color:#fff;border:solid;color:#000;height:-moz-fit-content;height:fit-content;left:0;margin:auto;padding:1em;position:absolute;right:0;width:-moz-fit-content;width:fit-content}:where(dialog:not([open])){display:none}:where(summary){display:list-item}@font-face{font-family:Outfit;font-style:normal;font-display:swap;font-weight:500;src:url(/static/vite/fonts/outfit-latin-500-normal.woff2) format("woff2"),url(/static/vite/fonts/outfit-all-500-normal.woff) format("woff");unicode-range:U+0000-00FF,U+0131,U+0152-0153,U+02BB-02BC,U+02C6,U+02DA,U+02DC,U+2000-206F,U+2074,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD}@font-face{font-family:Inter;font-style:normal;font-weight:100 900;font-display:swap;src:url(/static/vite/fonts/inter.woff2) format("woff2")}:root{--color-primary: #20a53a;--color-primary-1: #e4f4e7;--color-success: #20a53a;--color-warning: #ffae45;--color-error: #e73a33;--color-pro: #ff8f00;--primary-button-color-hover: #1d9534;--primary-button-color-pressed: #1a8a30;--primary-button-color-suppl: #1d9534;--color-text-base: #3a424d;--color-text-1: #131313;--color-text-2: #3a424d;--color-text-3: #999999;--color-text-4: #666666;--color-text-5: #333333;--color-text-desc: #999999;--color-bg-1: #f2f5f9;--color-bg-2: #ffffff;--color-bg-3: #f2f5f9;--color-bg-4: #f7f7f7;--layout-bg: url(/static/vite/images/bg.png);--color-border: #dcdfe6;--border-hover-focus-color: var(--color-primary);--color-sider-text: #3a424d;--color-sider: #f2f5f999;--color-sider-active: #20a53a;--color-sider-hover: #20a53a1a;--color-sider-hover-text: #20a53a;--color-sider-active-text: #ffffff;--router-menu-active-text: var(--color-primary);--router-menu-active-bg: rgba(32, 165, 58, .063);--color-table-td: var(--color-bg-2);--color-table-th: #f6f6f6;--color-table-border: var(--color-border);--color-table-td-hover: #f0f9f7;--color-modal: #fff;--modal-header-bg: #f6f8f8;--modal-header-bottom-border: #eee;--modal-action-bg: var(--modal-header-bg);--modal-action-top-border: #edf1f2;---card-bg-color-1: #f9fafb;---card-border-primary-color-1: #c6f6d1;---card-border-error-color-1: #ef080830;--color-tabs: #f5f5f5;--dialog-color-text: #333;--dialog-color-title-text: #333;--color-message: #ffffff;--color-message-border: #d3d4d3;--popover-color: #ffffff;--input-text-color: #333;--input-focus-bg-color: var(--color-bg-2);--input-disabled-color: #f5f5f5;--input-group-label-color: #f5f5f5;--input-disabled-border-color: 1px solid #d9d9d9;--select-box-shadow: 0 0 8px 0 rgba(32, 165, 58, .4);--button-text-color: var(--color-text-2);--button-bg-hover: #f1f9f3;--button-border-hover: 1px solid #bce4c4;--button-type-text-primary: var(--color-primary);--button-text-base-color: #fff;--button-gray-color: #eee;--radio-text-color: #333333;--radio-bg-color: var(--color-bg-2);--radio-active-dot-color: var(--color-primary);--radio-border-dot-color: inset 0 0 0 1px #d2ffdb;--check-color-checked: var(--color-primary);--check-border-checked: 1px solid #20a53a;--switch-active-color: var(--color-primary);--upload-dragger-color: #ffffff;--tooltip-color-text: #666;--alert-default-bg: #f0f0f1;--alert-warning-bg: #fdf6ec;--alert-error-bg: #fde6e6;--alert-success-bg: #f5faf2;--alert-success-text: #333;--alert-error-border: 1px solid #fde6e6;--alert-success-border: 1px solid #eaf1f2;--tag-primary-bg-color: #e4f4e7;--tag-primary-text-color: var(--color-primary);--collapse-color: #f2f5f9;--collapse-header-bg: #fafafa;--time-picker-separator-color: #ccc;--tabs-panel-color-text: #333333;--tabs-border-color: #cacad9;--tabs-bg: -webkit-gradient(linear, 0% 0, 0% 100%, from(#f6f6f6), to(#ddd));--tabs-active-bg: #ffffff;--tabs-active-text-color: #333333;--bt-tabs-modal-bg: #f0f0f1;--bt-tabs-modal-active-bg: var(--color-modal);--bt-tabs-modal-cancel-btn-bg: #cbcbcb;--bt-tabs-modal-header-close: brightness(1);--bt-tabs-modal-color: #f9fbfc;--bt-tabs-modal-left-active-bg: #4caf50;--bt-tabs-modal-left-shadow: 2px 0 3px #e4e3e3;--confirm-calc-bg: #f0f0f0;--progress-rail-color: #f2f5f9;--pagination-item-active-border: 1px solid var(--color-primary);--pagination-item-active-color: var(--color-primary);--ace-editor-tip-color: #555;--pre-color-text: #333;--pre-bg-color: #f5f5f5;--modal-boxshadow: 0 6px 16px -9px rgba(0, 0, 0, .08), 0 9px 28px 0 rgba(0, 0, 0, .05), 0 12px 48px 16px rgba(0, 0, 0, .03);--bt-input-path-hover-bg: #ececec;--flow-container-bg: #f3f4f6;--flow-config-title-color: #333333;--home-ad-bg-color: #fff;--home-ad-badge-bg-color: linear-gradient( 270deg, rgba(255, 255, 255, .2) 0%, rgba(255, 174, 69, .2) 100% );--home-overview-btn-color: #f2f5f9;--home-soft-bg-color: transparent;--home-soft-bg-hover-color: linear-gradient(244.14deg, #ffffff -1.23%, #e5f7ee 72.39%);--home-soft-border-color: #edf0f4;--home-soft-border-hover-color: var(--color-primary);--home-monitor-tabs-active-color: var(--color-primary);--home-risk-overview-circle-bg: #ffffff;--home-risk-security-list-hover-bg: #f5f7fa;--home-risk-security-list-spin-bg: #f2f2f2;--home-risk-security-list-collapse-item-color: #666;--home-risk-security-ignore-collapse-bg: #f8f8f8;--home-risk-file-info-title-color: #666;--home-risk-file-info-item-color: #333;--home-risk-server-list-bg: #f7f7f7;--home-risk-server-list-text: #555;--home-risk-server-list-hover: #efefef;--home-update-bg-url: url(/static/vite/images/update-bg.png);--home-update-title-color: #565656;--home-update-content-bg: #f6fbf7;--home-update-content-text: #666666;--home-update-detail-bg: #f7f7f7;--home-update-detail-date: #333;--home-pro-icon-color: #fff;--home-disk-color-warning: #ffefda;--home-disk-color-error: #fad8d6;--home-update-latest-bg: #f7fcf8;--home-update-latest-border: 1px solid #eeefec;--home-update-latest-text-color: #4f4f4f;--home-update-head-bg: #37bc51;--home-update-back-bg: linear-gradient(to top, rgb(255 255 255), #37bc51);--home-update-bt-link-color: var(--color-primary);--home-soft-install-bg-color: var(--color-table-td-hover);--home-soft-install-border-color: var(--color-primary);--home-success-bg-color: #37bc51;--home-success-text-color: #c7c7c7;--site-config-ssl-label: #666;--site-config-business-tips: #dff0d8;--site-ace-editor-border: #ccc;--site-confirm-calc-box-bg: #f0f0f0;--site-detele-content-item-hover-bg: #fcfcfc;--site-task-progress-border: #e5e7eb;--site-multi-service-rollback-bg: #f0f0f1;--site-global-ip-white-ips-bg: #f8f9fa;--site-global-ip-white-ips-border: #e4e8eb;--data-base-del-input-bg: #e6e6e6;--docker-type-list-bg: #e6e6e6;--docker-type-list-text: #555555;--docker-type-list-active-bg: #e8f6eb;--docker-type-list-active-text: var(--color-primary);--docker-plugin-list-tag-gb: #f4f4f5;--docker-plugin-list-tag-tips-bg: #fff;--docker-plugin-list-border: #ffffff;--app-soft-sort-bg: #e6e6e6;--app-soft-sort-active-bg: var(--color-primary);--app-soft-sort-hover-color: #ffffff;--app-soft-used-hover: #f5f5f5;--app-soft-pro-tips-text: #3c763d;--app-soft-pro-tips-bg: #dff0d8;--app-third-security-tip-bg: #f2dede;--app-plugin-dns-bg: #f7fffa;--app-third-install-tip-bg: #f5f6fa;--pay-color: #ff8f00;--pay-color-bg: #fff5e1;--pay-color-border: #ecb566;--coupon-bg: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAZIAAAHlCAMAAADoe4qxAAAATlBMVEVHcEz////////////////////////////////////////////////////////////////////////////////////z8/P8/Pz5+fn29vbA3pgqAAAAFXRSTlMAMOCg0M8QIECQ34+AcD/Ar79/sJ+9bwY+AAADsElEQVR42u3YyVLCUBBA0Y5AXgLOCuj//6jBocqBULrqxjp38dZUn3rpkIiptlltld5q0+K9jWlUafMm4oZUuikHkdEcKjVOe8QUatVcknrXxCYpt03MoFpIkAgJEiFBIiRIhERIkAgJEiFBIiRIhERIkAgJEiFBIiRCgkRIkAgJEiFBIiRCgkRIkAgJEiEREiRCgkRIkAgJEiEREiRCgkRIkAiJkCAREiRCgkRIkAiJkCAREiRCgkRIhASJkCAREiRCgkRIhASJkCAREiRCIiRIhASJkCAREiRCIiRIhASJkCAREiFBIiRIhASJkCAREiFBIiRIhASJkAgJEiFBIiRIhASJkAgJEiFBIiRIhASJESAREiRCgkRIkAiJkCAREiRCgkRIkAiJkCAREiRCgkRIhASJkCAREiRCgkRIhASJkCAREiRCIiRIhASJkCAREiRCIiRIhASJkCAREiFBIiRIhASJkCAREiFBIiRIhASJkAgJEiFBIiRIhASJkAgJEiFBIiRIhERIkAgJEiFBIiRIhERIkAgJEiFBIiRCgkRIkAgJEiFBIiRCgkRIkAgJEiEREiRCgkRIkAgJEiEREiRCgkRIkAgJEiEREiRCgkRIkAiJkCAREiRCgkRIkAiJkCARkv9FEt1wuTSHGi2vhi7eagvjyG/R4nPDhZHkdjHEt3pPr9Ru+vgZk0yROFbv2ZX31OqPksRgNFkNMdOD2SS9a82JRDOcnNosiQ2f9A9xXiQujSejqxMkFnyt5T7VGU9G3QkS34VTOiUSu912u9sdO/fb51+fT9P59IdzP53Pvz5nf+LZ/vRTIh2SjJ/eWe/ntN69BJd7CV4ZT0ar8EHlfD6o3BpOTgvL/VwWfL82mqzWvd1erbtjd4RIrsmPezJ4amU/u77uk+Zdq0CPH+/C3fW9Z1aV/4z3153P8fVCgkRIkAgJEiFBIiRCgkRIkAgJEiFBIiRCgkRIkAgJEiEREiRCgkRIkAgJEiEREiRCgkRIkAiJkCAREiRCgkRIkAiJkCAREiRCgkRIhASJkCAREiRCgkRIhASJkCAREiRCIiRIhASJkCAREiRCIiRIhASJkCAREiFBIiRIhASJkCAREiFBIiRIhASJkAgJEiFBIiRIhASJkAgJEiFBIiRIhERIkAgJEiFBIiRIhERIkAgJEiFBIiRIjACJkCAREiRCgkRI9I1kaQa1WsZoCLUaoxlCrVq4JtUuyZRtUmqTvOae1Lojh9roplS4IWM7aLwA+X5JA+6n7UAAAAAASUVORK5CYII=);--mailserver-overview-bg: #fafafa;--mailserver-domain-check-tips-bg: #f6f6f6;--mailserver-domain-check-box-bg: #edf7f2;--log-type-list-active-bg: #eef8f0;--log-type-list-hover-bg: #f5f7fa;--log-type-list-border: #e9e9e9;--security-brute-force-tips-bg: #f2dede;--security-server-safe-progress: #ebedf0;--domains-business-ssl-buy-bg: #f1f9f3;--domains-business-ssl-buy-bg-border: #ececec;--domains-business-ssl-count-disable: #efefef;--domains-lets-ssl-apply-bg: #f8f8f8;--domains-lets-ssl-apply-border: #dedede;--domains-lets-ssl-upload-border: #ccc;--domains-lets-ssl-upload-text: #e9f8ec;--setting-card-title-color: #666666;--setting-back-create-collapse-border: #f5f5f5;--setting-back-create-table-th-bg: var(--color-bg-2);--setting-back-create-collapse-title: #666;--setting-security-panel-port-tips: #f7f7f7;--setting-panel-bind-account-left-bg: linear-gradient(0deg, #d8efdb, #edf7ef);--setting-security-google-login-key-bg: #f8f8f8;--setting-security-google-login-key-text: #444;--setting-security-google-login-bind-title: #555;--setting-security-google-login-bind-text: #666;--install-box-bg: #fff5;--install-desc-bg: #fff;--install-box-text-color: #555;--file-choose-hover-color: #f5f7fa;--file-choose-hover-border-color: #e1e1e1;--file-card-hover-color: #f0f9f7;--terminal-head-bg: #f1f1f1;--terminal-head-item-close-hover: #f7f7f7;--terminal-head-item-hover: #dadada;--chart-tooltip-bg-color: #ffffff;--chart-tooltip-text-color: #333333;--chart-tooltip-header-bg-color: #f6f6f6;--waf-map-color: #e6e6e6;--waf-map-border-color: #ffffff;--waf-overview-text-color: #666666;--nps-box-hover-bg: var(--color-primary);--scrollbar-thumb-bg-color: #999;--scrollbar-track-bg-color: #ededed;--bt-error-modal-bg: #f5f5f5;--bt-error-modal-title-color: #333}:root[theme-mode=dark]{--color-primary: #20a53a;--color-primary-1: #e8f5e9;--color-success: #20a53a;--color-warning: #e67e22;--color-error: #f16575;--color-pro: #feaa04;--primary-button-color-hover: #267544;--primary-button-color-pressed: #20633a;--primary-button-color-suppl: #267544;--color-text-base: #c7c7c7;--color-text-1: #d8dce2;--color-text-2: #c7c7c7;--color-text-3: #919191;--color-text-4: #aaaaaa;--color-text-5: #e0e0e0;--color-text-desc: #777777;--color-bg-1: #18191c;--color-bg-2: #202020;--color-bg-3: #2e2e2e;--color-bg-4: #2e2e2e;--layout-bg: none;--color-border: #434343;--border-hover-focus-color: var(--color-text-base);--color-sider-text: #a1a1aa;--color-sider: #00000000;--color-sider-active: #353535;--color-sider-hover: #353535;--color-sider-hover-text: #ffffff;--color-sider-active-text: #ffffff;--router-menu-active-text: var(--color-text-base);--router-menu-active-bg: #353535;--color-table-td: var(--color-bg-2);--color-table-th: #232323;--color-table-border: var(--color-border);--color-table-td-hover: #353535;--color-modal: var(--color-bg-1);--modal-header-bg: var(--color-bg-2);--modal-header-bottom-border: var(--color-bg-3);--modal-action-bg: var(--modal-header-bg);--modal-action-top-border: var(--color-bg-3);---card-bg-color-1: #1a1a1a;---card-border-primary-color-1: #2a4d3a;---card-border-error-color-1: #ff646466;--color-tabs: #1e1e1e;--dialog-color-text: var(--color-text-base);--dialog-color-title-text: var(--color-text-base);--color-message: #48484e;--color-message-border: #48484e;--popover-color: var(--color-bg-1);--input-text-color: var(--color-text-base);--input-focus-bg-color: var(--color-bg-2);--input-disabled-color: var(--color-bg-1);--input-group-label-color: #333333;--input-disabled-border-color: 1px solid var(--color-border);--select-box-shadow: 0 0 8px 0 rgba(48, 53, 49, .4);--button-text-color: var(--color-text-base);--button-bg-hover: var(--color-bg-2);--button-border-hover: 1px solid var(--color-text-base);--button-type-text-primary: var(--color-text-base);--button-text-base-color: var(--color-text-base);--button-gray-color: #353535;--radio-text-color: var(--color-text-base);--radio-bg-color: var(--color-bg-2);--radio-active-dot-color: var(--color-text-base);--radio-border-dot-color: inset 0 0 0 1px var(--color-text-base);--check-color-checked: var(--color-text-base);--check-border-checked: 1px solid var(--color-text-base);--switch-active-color: var(--color-primary);--upload-dragger-color: var(--color-bg-2);--tooltip-color-text: var(--color-text-base);--alert-default-bg: var(--color-bg-1);--alert-warning-bg: #4a3c1a;--alert-error-bg: #4a1f1f;--alert-success-bg: var(--color-bg-2);--alert-success-text: var(--color-text-base);--alert-error-border: 1px solid var(--color-border);--alert-success-border: 1px solid var(--color-border);--tag-primary-bg-color: #464646;--tag-primary-text-color: var(--color-text-base);--collapse-color: #222222;--collapse-header-bg: var(--color-bg-2);--time-picker-separator-color: #434343;--tabs-panel-color-text: var(--color-text-base);--tabs-border-color: #555555;--tabs-bg: #353535;--tabs-active-bg: var(--color-bg-1);--tabs-active-text-color: var(--color-text-base);--bt-tabs-modal-bg: var(--color-bg-2);--bt-tabs-modal-active-bg: #353535;--bt-tabs-modal-cancel-btn-bg: #353535;--bt-tabs-modal-header-close: brightness(.7) contrast(1.1);--bt-tabs-modal-color: var(--bt-tabs-modal-bg);--bt-tabs-modal-left-active-bg: #353535;--bt-tabs-modal-left-shadow: 2px 0 3px #444444;--confirm-calc-bg: var(--color-bg-1);--progress-rail-color: #444444;--pagination-item-active-border: 1px solid var(--color-border);--pagination-item-active-color: var(--color-text-base);--ace-editor-tip-color: var(--color-text-base);--pre-color-text: var(--color-text-base);--pre-bg-color: var(--color-bg-3);--modal-boxshadow: 0 0 3px 1px rgba(255, 255, 255, .4);--bt-input-path-hover-bg: #353535;--flow-container-bg: var(--color-bg-2);--flow-config-title-color: var(--color-text-base);--home-ad-bg-color: linear-gradient(90deg, #333333 0%, rgba(63, 57, 49, .5) 100%);--home-ad-badge-bg-color: linear-gradient( 270deg, rgba(51, 51, 51, .2) 0%, rgba(236, 188, 152, .2) 100% );--home-overview-btn-color: #181818;--home-soft-bg-color: var(--color-bg-2);--home-soft-bg-hover-color: linear-gradient( 244.14deg, var(--color-bg-2) -1.23%, var(--color-bg-1) 72.39% );--home-soft-border-color: #333333;--home-soft-border-hover-color: var(--color-text-base);--home-monitor-tabs-active-color: var(--color-text-base);--home-risk-overview-circle-bg: var(--color-bg-1);--home-risk-security-list-hover-bg: #333333;--home-risk-security-list-spin-bg: var(--color-bg-3);--home-risk-security-list-collapse-item-color: #999;--home-risk-security-ignore-collapse-bg: var(--color-bg-1);--home-risk-file-info-title-color: var(--color-text-base);--home-risk-file-info-item-color: var(--color-text-base);--home-risk-server-list-bg: var(--color-bg-2);--home-risk-server-list-text: var(--color-text-base);--home-risk-server-list-hover: var(--color-bg-3);--home-update-bg-url: url(/static/vite/images/update-bg-dark.png);--home-update-title-color: var(--color-text-base);--home-update-content-bg: var(--color-bg-2);--home-update-content-text: #999999;--home-update-detail-bg: var(--color-bg-2);--home-update-detail-date: var(--color-text-base);--home-pro-icon-color: var(--color-text-base);--home-disk-color-warning: #d4941e;--home-disk-color-error: #ec7063;--home-update-latest-bg: var(--color-bg-1);--home-update-latest-border: 1px solid var(--color-border);--home-update-latest-text-color: #999999;--home-update-head-bg: var(--color-bg-1);--home-update-back-bg: none;--home-update-bt-link-color: var(--color-primary);--home-soft-install-bg-color: var(--color-bg-2);--home-soft-install-border-color: var(--color-text-base);--home-success-bg-color: var(--color-bg-1);--home-success-text-color: #333333;--site-config-ssl-label: var(--color-text-base);--site-config-business-tips: var(--color-bg-2);--site-ace-editor-border: var(--color-border);--site-confirm-calc-box-bg: #333333;--site-detele-content-item-hover-bg: #333333;--site-task-progress-border: var(--color-border);--site-multi-service-rollback-bg: var(--color-bg-2);--site-global-ip-white-ips-bg: var(--color-bg-2);--site-global-ip-white-ips-border: var(--color-bg-2);--data-base-del-input-bg: #353535;--docker-type-list-bg: var(--color-bg-1);--docker-type-list-text: var(--color-text-base);--docker-type-list-active-bg: var(--color-bg-3);--docker-type-list-active-text: var(--color-text-base);--docker-plugin-list-tag-gb: var(--color-bg-1);--docker-plugin-list-tag-tips-bg: var(--color-bg-1);--docker-plugin-list-border: var(--color-border);--app-soft-sort-bg: var(--color-bg-1);--app-soft-sort-active-bg: var(--color-bg-3);--app-soft-sort-hover-color: var(--color-text-base);--app-soft-used-hover: var(--color-bg-3);--app-soft-pro-tips-text: var(--color-text-base);--app-soft-pro-tips-bg: var(--color-bg-1);--app-third-security-tip-bg: var(--color-bg-1);--app-plugin-dns-bg: var(--color-bg-3);--app-third-install-tip-bg: var(--color-bg-3);--pay-color: #feaa04;--pay-color-bg: #292929;--pay-color-border: #ecb665;--coupon-bg: url(/static/vite/images/bg_dark.png);--mailserver-overview-bg: var(--color-bg-3);--mailserver-domain-check-tips-bg: var(--color-bg-2);--mailserver-domain-check-box-bg: var(--color-bg-2);--log-type-list-active-bg: var(--color-bg-3);--log-type-list-hover-bg: var(--color-bg-3);--log-type-list-border: var(--color-border);--security-brute-force-tips-bg: var(--color-bg-2);--security-server-safe-progress: var(--color-bg-1);--domains-business-ssl-buy-bg: var(--color-bg-2);--domains-business-ssl-buy-bg-border: #929292;--domains-business-ssl-count-disable: var(--color-bg-3);--domains-lets-ssl-apply-bg: var(--color-bg-2);--domains-lets-ssl-apply-border: var(--color-bg-3);--domains-lets-ssl-upload-border: var(--color-border);--domains-lets-ssl-upload-text: var(--color-bg-2);--setting-card-title-color: var(--color-text-base);--setting-back-create-collapse-border: var(--color-border);--setting-back-create-table-th-bg: #232323;--setting-back-create-collapse-title: var(--color-text-base);--setting-security-panel-port-tips: var(--color-bg-2);--setting-panel-bind-account-left-bg: linear-gradient(0deg, #404440, #202020);--setting-security-google-login-key-bg: var(--color-bg-2);--setting-security-google-login-key-text: var(--color-text-base);--setting-security-google-login-bind-title: var(--color-text-base);--setting-security-google-login-bind-text: var(--color-text-base);--install-box-bg: rgba(114, 114, 114, .333);--install-desc-bg: var(--color-bg-1);--install-box-text-color: var(--color-text-base);--file-choose-hover-color: #333;--file-choose-hover-border-color: #333;--file-card-hover-color: #333;--terminal-head-bg: #666666;--terminal-head-item-close-hover: #666666;--terminal-head-item-hover: #555555;--chart-tooltip-bg-color: #181818;--chart-tooltip-text-color: #c5c5c5;--chart-tooltip-header-bg-color: #121212;--waf-map-color: #353535;--waf-map-border-color: #aaa;--waf-overview-text-color: var(--color-text-3);--nps-box-hover-bg: #353535;--scrollbar-thumb-bg-color: rgba(255, 255, 255, .2);--scrollbar-track-bg-color: rgba(255, 255, 255, 0);--bt-error-modal-bg: var(--color-bg-2);--bt-error-modal-title-color: var(--color-text-base)}.modal-footer-btns{display:flex;align-items:center;flex-direction:row;justify-content:end;gap:10px;padding:10px}.single-line-ellipsis{white-space:nowrap;overflow:hidden;text-overflow:ellipsis}*,*:before{box-sizing:border-box}html,body,#app{width:100%;height:100%;margin:0;padding:0}body{line-height:normal;font-size:12px;font-family:PingFang SC,Inter,Microsoft YaHei,Segoe UI,sans-serif;font-weight:400;overflow:hidden}input[type=password]::-ms-reveal{display:none}input::-webkit-outer-spin-button,input::-webkit-inner-spin-button{-webkit-appearance:none;appearance:none}input[type=number]{-webkit-appearance:textfield;appearance:textfield;-moz-appearance:textfield}a{text-decoration:none;cursor:pointer}p,ul,li,pre{margin:0;padding:0}body,h1,h2,h3,h4,h5,h6,p,ul,ol,label,form{margin:0}ul,li{list-style:none}input{outline:none}code,kbd,pre,samp{font-family:Menlo,Monaco,Consolas,Courier New,monospace}.h1,.h2,.h3,.h4,.h5,.h6,h1,h2,h3,h4,h5,h6{font-family:inherit;font-weight:500;line-height:1.1;color:inherit}.h3,h3{font-size:24px}h4,h5,h6{font-size:1em}ul li::marker{display:block;height:100%}mark{padding:0;background:#ff0;color:inherit}::-webkit-scrollbar{width:8px;height:8px}::-webkit-scrollbar-thumb{border-radius:8px;box-shadow:inset 0 0 5px rgba(0,0,0,.2);background:var(--scrollbar-thumb-bg-color)}::-webkit-scrollbar-track{box-shadow:inset 0 0 5px rgba(0,0,0,.2);border-radius:8px;background:var(--scrollbar-track-bg-color)}iframe::-webkit-scrollbar{width:8px;height:8px}iframe::-webkit-scrollbar-thumb{border-radius:8px;box-shadow:inset 0 0 5px rgba(0,0,0,.2);background:var(--scrollbar-thumb-bg-color)}iframe::-webkit-scrollbar-track{box-shadow:inset 0 0 5px rgba(0,0,0,.2);border-radius:8px;background:var(--scrollbar-track-bg-color)}.leader-line{z-index:9999}@font-face{font-family:Glyphicons Halflings;src:url(/static/vite/fonts/glyphicons-halflings-regular.eot);src:url(/static/vite/fonts/glyphicons-halflings-regular.eot?#iefix) format("embedded-opentype"),url(/static/vite/fonts/glyphicons-halflings-regular.woff2) format("woff2"),url(/static/vite/fonts/glyphicons-halflings-regular.woff) format("woff"),url(/static/vite/fonts/glyphicons-halflings-regular.ttf) format("truetype"),url(/static/vite/images/glyphicons-halflings-regular.svg#glyphicons_halflingsregular) format("svg")}.glyphicon{position:relative;top:1px;display:inline-block;font-family:Glyphicons Halflings;font-style:normal;font-weight:400;line-height:1;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.glyphicon-vip:before{content:""}.glyphicon-ok:before{content:""}.n-layout .n-layout-scroll-container{overflow-x:auto}.n-dialog .n-dialog__title{position:relative}.n-form-item .n-form-item-label,.n-button{line-height:normal}.n-divider:not(.n-divider--vertical){margin:0}.n-ellipsis p{display:inline}.n-card{background-color:rgba(var(--n-color),var(--main-content-opacity));box-shadow:0 0 8px rgba(0,0,0,.06)}.n-card.n-card--bordered{border:none}.n-card .n-card-header{display:flex;align-items:center;min-height:48px;padding:0 20px;border-bottom:1px solid var(--color-border)}.n-card .n-card__content{padding:0}.n-alert .n-alert__icon{top:50%;transform:translateY(-50%)}.n-alert .n-alert-body{line-height:16px}.n-radio-group .n-radio{margin-right:16px}.n-radio-group .n-radio:last-of-type{margin-right:0}.n-radio-group .n-radio-button{font-weight:inherit}.n-data-table{font-family:PingFang SC,Microsoft YaHei,Segoe UI,sans-serif}.n-data-table .n-data-table-th{height:34px}.n-data-table .n-data-table-td{height:36px}.n-pagination .n-pagination-prefix{flex:1}.n-tabs.n-tabs--left>.n-tab-pane{padding:var(--n-pane-padding-top) var(--n-pane-padding-right) var(--n-pane-padding-bottom) var(--n-pane-padding-left)}.n-tabs.n-tabs--top>.n-tab-pane{padding:var(--n-pane-padding-top) var(--n-pane-padding-right) var(--n-pane-padding-bottom) var(--n-pane-padding-left)}.n-tabs.n-tabs--top .n-tabs-nav-scroll-content{flex-direction:row}.n-select .n-base-selection--multiple .n-tag{--n-height: 24px;--n-close-size: 14px;font-size:12px}.n-badge.n-badge--dot .n-badge-sup{width:6px;height:6px;min-width:6px;bottom:calc(100% - 3px)}.n-spin-container .n-spin-content{height:100%}.n-base-select-option .n-base-select-option__content{width:100%}.n-data-table .n-data-table-th.n-data-table-th--sortable.sort-center .n-data-table-th__title-wrapper{justify-content:center}.n-data-table .n-data-table-th.n-data-table-th--sortable .n-data-table-th__title-wrapper .n-data-table-th__title{flex:none;min-width:auto}:root{--el-font-size-base: 12px}.el-select .el-select__wrapper{gap:0;min-height:30px;font-size:12px;line-height:22px}.el-select .el-select__wrapper .el-select__selection{margin-right:4px}div.el-alert{--el-alert-padding: 12px;--el-alert-icon-large-size: 20px;--el-alert-description-font-size: 13px;border:1px solid #eee}div.el-alert .el-alert__icon.is-big{margin-right:8px}div.el-alert .el-alert__content{flex:1}.help-info-text{margin-top:15px}.help-info-text li{line-height:24px}#nprogress .bar{background-color:#20a53a}#nprogress .spinner-icon{border-top-color:#20a53a;border-left-color:#20a53a}.bt-message pre{display:block;padding:9.5px;margin:10px 0 0;font-size:13px;line-height:1.42857143;color:#333;word-break:break-all;word-wrap:break-word;background-color:#f5f5f5;border:1px solid #ccc;border-radius:4px;overflow:auto}.bt-error-modal pre{display:block;padding:9.5px;margin:0 0 10px;font-size:13px;line-height:1.42857143;color:var(--bt-error-modal-title-color);word-break:break-all;word-wrap:break-word;background-color:var(--bt-error-modal-bg);border:1px solid #ccc;border-radius:4px;overflow:auto}.bt-tips-ul li{list-style:disc;margin-left:1.5em}.bt-ask-ico{display:inline-flex;align-items:center;justify-content:center;width:16px;height:16px;border:1px solid #fb7d00;border-radius:8px;color:#fb7d00;font-family:arial;font-size:11px;font-style:normal;text-align:center;cursor:help}.bt-ask-ico:hover{background-color:#fb7d00;color:#fff}button.reset{display:inline-flex;background:none;border:none;padding:0;cursor:pointer;outline:inherit}.bt-link{color:#20a53a;cursor:pointer}.bt-link:hover{color:#1d9534}.bt-link.error{color:#ef0808}.bt-link.error:hover{color:#c81e1e}.btn-xs{padding:4px 8px;height:auto}.code-toolbar{height:100%}.pre-code[class*=language-]{border:none;margin:0;font-size:14px}.echarts-tooltip{display:flex;flex-direction:column;background-color:var(--chart-tooltip-bg-color);color:var(--chart-tooltip-text-color);border-radius:10px}.echarts-tooltip .formatter-header{display:flex;align-items:center;height:40px;padding:0 16px;background-color:var(--chart-tooltip-header-bg-color);border-top-left-radius:4px;border-top-right-radius:4px}.echarts-tooltip .formatter-header img{margin-right:6px;height:24px;width:24px}.echarts-tooltip .formatter-body{padding:16px 20px}.echarts-tooltip .formatter-body .select-data{display:flex;align-items:center;margin-bottom:8px;font-size:14px}.echarts-tooltip .process-top5{border:1px solid var(--color-border);border-radius:8px}.echarts-tooltip .process-top5 table{width:100%;table-layout:fixed;border-collapse:collapse;font-size:12px;border-radius:8px;overflow:hidden}.echarts-tooltip .process-top5 table thead{background-color:var(--chart-tooltip-header-bg-color)}.echarts-tooltip .process-top5 table thead th{height:24px;padding:5px 10px;border:0;border-bottom:1px solid var(--color-border);line-height:24px;text-align:left;color:var(--color-text-4)}.echarts-tooltip .process-top5 table tbody tr{height:22px;line-height:22px;text-align:left}.echarts-tooltip .process-top5 table tbody tr:last-child{border-bottom:none}.echarts-tooltip .process-top5 table tbody tr td{padding:4px 10px;border:0;white-space:normal}::view-transition-old(root),::view-transition-new(root){animation:none;mix-blend-mode:normal}::view-transition-old(root){z-index:1}::view-transition-new(root){z-index:9999999}.home-tooltip{min-width:220px;padding:12px;background-color:var(--chart-tooltip-bg-color);color:var(--chart-tooltip-text-color);border-radius:6px}.home-tooltip .time{display:flex;align-items:center;margin-bottom:10px}.home-tooltip .time .icon{width:20px;height:20px;margin-right:6px;background-image:url("data:image/svg+xml,%3csvg%20width='20'%20height='20'%20viewBox='0%200%2020%2020'%20fill='none'%20xmlns='http://www.w3.org/2000/svg'%3e%3cpath%20d='M2.99963%207.99994H15.9996'%20stroke='white'%20stroke-width='1.5'%20stroke-linecap='square'%20stroke-linejoin='round'/%3e%3cpath%20d='M12.9908%202.98676V3.98676'%20stroke='white'%20stroke-width='1.5'%20stroke-linecap='square'%20stroke-linejoin='round'/%3e%3cpath%20d='M5.99084%202.98676V3.98676'%20stroke='white'%20stroke-width='1.5'%20stroke-linecap='square'%20stroke-linejoin='round'/%3e%3crect%20x='2.75'%20y='4.75006'%20width='13.5'%20height='11.5'%20stroke='white'%20stroke-width='1.5'/%3e%3c/svg%3e")}.home-tooltip .home-tooltip-content{display:flex;flex-direction:column;gap:8px}.home-tooltip .home-tooltip-content .item{display:flex;align-items:center;white-space:pre}.home-tooltip .home-tooltip-content .item .icon{display:flex;justify-content:center;width:20px;margin-right:6px}.home-tooltip .home-tooltip-content .item .icon .circular{width:6px;height:6px;border-radius:50%}.home-tooltip .home-tooltip-content .item .text{line-height:20px;color:rgba(255,255,255,.8)} diff --git a/BTPanel/static/vite/css/index31.css b/BTPanel/static/vite/css/index31.css index f1255586..0cde4e94 100644 --- a/BTPanel/static/vite/css/index31.css +++ b/BTPanel/static/vite/css/index31.css @@ -1 +1 @@ -@charset "UTF-8";.files-icon[data-v-0a2d98fb]{display:inline-block;width:25px;height:25px;background-image:url(/static/vite/images/file_icon.png);background-repeat:no-repeat;background-size:25px;background-position:0px -375px}.files-icon.medium-icon.swf-icon[data-v-0a2d98fb]{background-position:0px 0px}.files-icon.medium-icon.webm-icon[data-v-0a2d98fb]{background-position:0px -25px}.files-icon.medium-icon.webp-icon[data-v-0a2d98fb]{background-position:0px -50px}.files-icon.medium-icon.wma-icon[data-v-0a2d98fb]{background-position:0px -75px}.files-icon.medium-icon.wmv-icon[data-v-0a2d98fb]{background-position:0px -100px}.files-icon.medium-icon.xls-icon[data-v-0a2d98fb]{background-position:0px -125px}.files-icon.medium-icon.xml-icon[data-v-0a2d98fb]{background-position:0px -150px}.files-icon.medium-icon.access-icon[data-v-0a2d98fb]{background-position:0px -175px}.files-icon.medium-icon.apk-icon[data-v-0a2d98fb]{background-position:0px -200px}.files-icon.medium-icon.avi-icon[data-v-0a2d98fb],.files-icon.medium-icon.bmp-icon[data-v-0a2d98fb]{background-position:0px -250px}.files-icon.medium-icon.cdr-icon[data-v-0a2d98fb]{background-position:0px -275px}.files-icon.medium-icon.compress-icon[data-v-0a2d98fb]{background-position:0px -300px}.files-icon.medium-icon.css-icon[data-v-0a2d98fb]{background-position:0px -325px}.files-icon.medium-icon.doc-icon[data-v-0a2d98fb]{background-position:0px -350px}.files-icon.medium-icon.file-icon[data-v-0a2d98fb]{background-position:0px -375px}.files-icon.medium-icon.folder-icon[data-v-0a2d98fb]{background-position:0px -400px}.files-icon.medium-icon.gif-icon[data-v-0a2d98fb]{background-position:0px -425px}.files-icon.medium-icon.html-icon[data-v-0a2d98fb]{background-position:0px -450px}.files-icon.medium-icon.ico-icon[data-v-0a2d98fb]{background-position:0px -475px}.files-icon.medium-icon.java-icon[data-v-0a2d98fb]{background-position:0px -500px}.files-icon.medium-icon.js-icon[data-v-0a2d98fb]{background-position:0px -525px}.files-icon.medium-icon.bt_split_json-icon[data-v-0a2d98fb]{background-position:0px -550px}.files-icon.medium-icon.jpeg-icon[data-v-0a2d98fb]{background-position:0px -575px}.files-icon.medium-icon.jpg-icon[data-v-0a2d98fb]{background-position:0px -600px}.files-icon.medium-icon.json-icon[data-v-0a2d98fb]{background-position:0px -625px}.files-icon.medium-icon.log-icon[data-v-0a2d98fb]{background-position:0px -650px}.files-icon.medium-icon.lua-icon[data-v-0a2d98fb]{background-position:0px -675px}.files-icon.medium-icon.mkv-icon[data-v-0a2d98fb]{background-position:0px -700px}.files-icon.medium-icon.mov-icon[data-v-0a2d98fb]{background-position:0px -725px}.files-icon.medium-icon.mp4-icon[data-v-0a2d98fb]{background-position:0px -750px}.files-icon.medium-icon.mpg-icon[data-v-0a2d98fb]{background-position:0px -775px}.files-icon.medium-icon.mpeg-icon[data-v-0a2d98fb]{background-position:0px -800px}.files-icon.medium-icon.pdf-icon[data-v-0a2d98fb]{background-position:0px -825px}.files-icon.medium-icon.php-icon[data-v-0a2d98fb]{background-position:0px -850px}.files-icon.medium-icon.png-icon[data-v-0a2d98fb]{background-position:0px -875px}.files-icon.medium-icon.ppt-icon[data-v-0a2d98fb]{background-position:0px -900px}.files-icon.medium-icon.py-icon[data-v-0a2d98fb]{background-position:0px -925px}.files-icon.medium-icon.rm-icon[data-v-0a2d98fb]{background-position:0px -950px}.files-icon.medium-icon.rmvb-icon[data-v-0a2d98fb]{background-position:0px -975px}.files-icon.medium-icon.sh-icon[data-v-0a2d98fb]{background-position:0px -1000px}.files-icon.medium-icon.bt_split-icon[data-v-0a2d98fb]{background-position:0px -1025px}.files-icon.medium-icon.sql-icon[data-v-0a2d98fb]{background-position:0px -1050px}.files-icon.large-icon[data-v-0a2d98fb]{width:50px;height:50px;background-size:50px;background-position:0px -750px}.files-icon.large-icon.swf-icon[data-v-0a2d98fb]{background-position:0px 0px}.files-icon.large-icon.webm-icon[data-v-0a2d98fb]{background-position:0px -50px}.files-icon.large-icon.webp-icon[data-v-0a2d98fb]{background-position:0px -100px}.files-icon.large-icon.wma-icon[data-v-0a2d98fb]{background-position:0px -150px}.files-icon.large-icon.wmv-icon[data-v-0a2d98fb]{background-position:0px -200px}.files-icon.large-icon.xls-icon[data-v-0a2d98fb]{background-position:0px -250px}.files-icon.large-icon.xml-icon[data-v-0a2d98fb]{background-position:0px -300px}.files-icon.large-icon.access-icon[data-v-0a2d98fb]{background-position:0px -350px}.files-icon.large-icon.apk-icon[data-v-0a2d98fb]{background-position:0px -400px}.files-icon.large-icon.avi-icon[data-v-0a2d98fb]{background-position:0px -450px}.files-icon.large-icon.bmp-icon[data-v-0a2d98fb]{background-position:0px -500px}.files-icon.large-icon.cdr-icon[data-v-0a2d98fb]{background-position:0px -550px}.files-icon.large-icon.compress-icon[data-v-0a2d98fb]{background-position:0px -600px}.files-icon.large-icon.css-icon[data-v-0a2d98fb]{background-position:0px -650px}.files-icon.large-icon.doc-icon[data-v-0a2d98fb]{background-position:0px -700px}.files-icon.large-icon.file-icon[data-v-0a2d98fb]{background-position:0px -750px}.files-icon.large-icon.folder-icon[data-v-0a2d98fb]{background-position:0px -800px}.files-icon.large-icon.gif-icon[data-v-0a2d98fb]{background-position:0px -850px}.files-icon.large-icon.html-icon[data-v-0a2d98fb]{background-position:0px -900px}.files-icon.large-icon.ico-icon[data-v-0a2d98fb]{background-position:0px -950px}.files-icon.large-icon.java-icon[data-v-0a2d98fb]{background-position:0px -1000px}.files-icon.large-icon.js-icon[data-v-0a2d98fb]{background-position:0px -1050px}.files-icon.large-icon.bt_split_json-icon[data-v-0a2d98fb]{background-position:0px -1100px}.files-icon.large-icon.jpeg-icon[data-v-0a2d98fb]{background-position:0px -1150px}.files-icon.large-icon.jpg-icon[data-v-0a2d98fb]{background-position:0px -1200px}.files-icon.large-icon.json-icon[data-v-0a2d98fb]{background-position:0px -1250px}.files-icon.large-icon.log-icon[data-v-0a2d98fb]{background-position:0px -1300px}.files-icon.large-icon.lua-icon[data-v-0a2d98fb]{background-position:0px -1350px}.files-icon.large-icon.mkv-icon[data-v-0a2d98fb]{background-position:0px -1400px}.files-icon.large-icon.mov-icon[data-v-0a2d98fb]{background-position:0px -1450px}.files-icon.large-icon.mp4-icon[data-v-0a2d98fb]{background-position:0px -1500px}.files-icon.large-icon.mpg-icon[data-v-0a2d98fb]{background-position:0px -1550px}.files-icon.large-icon.mpeg-icon[data-v-0a2d98fb]{background-position:0px -1600px}.files-icon.large-icon.pdf-icon[data-v-0a2d98fb]{background-position:0px -1650px}.files-icon.large-icon.php-icon[data-v-0a2d98fb]{background-position:0px -1700px}.files-icon.large-icon.png-icon[data-v-0a2d98fb]{background-position:0px -1750px}.files-icon.large-icon.ppt-icon[data-v-0a2d98fb]{background-position:0px -1800px}.files-icon.large-icon.py-icon[data-v-0a2d98fb]{background-position:0px -1850px}.files-icon.large-icon.rm-icon[data-v-0a2d98fb]{background-position:0px -1900px}.files-icon.large-icon.rmvb-icon[data-v-0a2d98fb]{background-position:0px -1950px}.files-icon.large-icon.sh-icon[data-v-0a2d98fb]{background-position:0px -2000px}.files-icon.large-icon.bt_split-icon[data-v-0a2d98fb]{background-position:0px -2050px}.files-icon.large-icon.sql-icon[data-v-0a2d98fb]{background-position:0px -2100px}.modal-footer-btns[data-v-6be9ab69]{display:flex;align-items:center;flex-direction:row;justify-content:end;gap:10px;padding:10px}.single-line-ellipsis[data-v-6be9ab69]{white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.video-container[data-v-6be9ab69]{display:grid;grid-template-columns:1fr 300px}.video-container .video-list[data-v-6be9ab69]{display:flex;align-items:center;flex-direction:column;justify-content:start;align-items:flex-start;padding:10px;box-sizing:border-box;background:var(--color-modal);width:100%;height:100%}.video-container .video-list .video-item[data-v-6be9ab69]{display:flex;align-items:center;flex-direction:row;justify-content:start;cursor:pointer;width:100%;padding:10px 10px 10px 0;border-radius:4px}.video-container .video-list .video-item[data-v-6be9ab69]:hover,.video-container .video-list .video-item.active[data-v-6be9ab69]{background:#5c5c5c;color:var(--color-text-1)}.modal-footer-btns[data-v-90e8c7cf]{display:flex;align-items:center;flex-direction:row;justify-content:end;gap:10px;padding:10px}.single-line-ellipsis[data-v-90e8c7cf]{white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.upload-area[data-v-90e8c7cf]{width:100%;height:100vh;background:rgba(225,255,255,.3);display:flex;align-items:center;flex-direction:row;justify-content:center}.upload-area .tip[data-v-90e8c7cf]{font-size:50px;color:#fff}.modal-footer-btns[data-v-7045f818]{display:flex;align-items:center;flex-direction:row;justify-content:end;gap:10px;padding:10px}.single-line-ellipsis[data-v-7045f818]{white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.img-wrapper[data-v-7045f818]{width:100%;height:100vh;position:relative}.img-wrapper img[data-v-7045f818]{width:60%;position:absolute;left:50%;top:50%;transition:all .2s ease-in-out;transform:translate(-50%,-50%)}.img-wrapper .tools[data-v-7045f818]{width:300px;padding:20px;display:flex;align-items:center;flex-direction:row;justify-content:space-between;position:absolute;left:50%;margin-left:-150px;bottom:130px;background:rgba(99,96,98,.6);border-radius:50px}.img-wrapper .close-icon[data-v-7045f818]{position:absolute;right:20px;top:20px}.modal-footer-btns[data-v-c747adc9]{display:flex;align-items:center;flex-direction:row;justify-content:end;gap:10px;padding:10px}.single-line-ellipsis[data-v-c747adc9]{white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.button-group[data-v-c747adc9]{display:flex;align-items:center;flex-direction:row;justify-content:space-between;flex-wrap:wrap}.button-group .group-left[data-v-c747adc9]{display:flex;align-items:center;flex-direction:row;justify-content:start;gap:8px}.button-group .group-left .divider[data-v-c747adc9]{height:24px;width:1px;background:var(--color-border)}.button-group .group-right[data-v-c747adc9]{display:flex;align-items:center;flex-direction:row;justify-content:start;gap:8px}.button-group .group-right .view-change[data-v-c747adc9]{display:flex;align-items:center;flex-direction:row;gap:0;color:var(--color-text-2)}.button-group .group-right .view-change .card[data-v-c747adc9],.button-group .group-right .view-change .list[data-v-c747adc9]{width:32px;height:32px;border:1px solid var(--color-border);cursor:pointer;display:flex;align-items:center;flex-direction:row;justify-content:center}.button-group .group-right .view-change .active[data-v-c747adc9]{box-shadow:inset 0 3px 5px rgba(0,0,0,.125);background:#e6e6e6;color:var(--color-text-3)}.button-group .group-right .view-change .card[data-v-c747adc9]{border-right:none;border-radius:4px 0 0 4px}.button-group .group-right .view-change .list[data-v-c747adc9]{border-radius:0 4px 4px 0}.button-group[data-v-c747adc9] .n-button .n-button__content~.n-button__icon{margin-left:0}.button-group .btn-behavior[data-v-c747adc9] .n-icon-slot{transition:.2s all ease-in-out;transform-origin:center center;transform:translateY(0);top:0}.button-group .btn-behavior[data-v-c747adc9]:hover .n-icon-slot{transform:rotate(90deg)}.path-list[data-v-ca757f3c]{flex:1;display:flex;border-top:1px solid var(--color-border);border-bottom:1px solid var(--color-border);overflow:hidden;cursor:text}.path-list .path-item[data-v-ca757f3c]{display:flex;align-items:center;height:100%;white-space:nowrap;cursor:pointer;transition:background-color .3s cubic-bezier(.4,0,.2,1);flex-shrink:0}.path-list .path-item .path-dir[data-v-ca757f3c]{display:flex;align-items:center;height:100%;padding:0 6px;color:var(--color-text-2)}.path-list .path-item .path-arrow[data-v-ca757f3c]{display:flex;align-items:center;height:100%;padding:0 2px;border-left:1px solid transparent;border-right:1px solid transparent;font-size:14px;transition:border-color .3s cubic-bezier(.4,0,.2,1)}.path-list .path-item .path-arrow.reversal .svg-icon[data-v-ca757f3c]{transform:rotate(180deg)}.path-list .path-item[data-v-ca757f3c]:hover{background-color:var(--file-choose-hover-color)}.path-list .path-item:hover .path-arrow[data-v-ca757f3c]{border-left-color:var(--file-choose-hover-border-color);border-right-color:var(--file-choose-hover-border-color)}.modal-footer-btns[data-v-7bef8870]{display:flex;align-items:center;flex-direction:row;justify-content:end;gap:10px;padding:10px}.single-line-ellipsis[data-v-7bef8870]{white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.filter-tools[data-v-7bef8870]{display:flex;align-items:center;flex-direction:row;justify-content:space-between;gap:10px}.filter-tools .dir-address[data-v-7bef8870]{min-width:150px;max-width:600px}.filter-tools .dir-search[data-v-7bef8870]{min-width:120px;max-width:300px}.filter-tools .dir-search .__input-1cpbmap-m[data-v-7bef8870]{--n-border: 1px solid #2e9a8c;border-right:none}.modal-footer-btns[data-v-8101ae96]{display:flex;align-items:center;flex-direction:row;justify-content:end;gap:10px;padding:10px}.single-line-ellipsis[data-v-8101ae96]{white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.operation-wrapper[data-v-8101ae96]{display:flex;align-items:center;flex-direction:row;justify-content:end;display:inline-flex;gap:8px}.operation-wrapper span[data-v-8101ae96]{color:#36ad6a}.n-data-table[data-v-14098e72]{--n-merged-td-color-hover: var(--color-table-td-hover)}.n-data-table[data-v-14098e72] .active-row{background-color:var(--n-merged-td-color-hover)}.n-data-table[data-v-14098e72] .active-row>.n-data-table-td{background-color:var(--n-merged-td-color-hover)}.n-data-table[data-v-14098e72] .n-data-table-td{height:42px}.file-nm[data-v-14098e72]{cursor:pointer}.modal-footer-btns[data-v-ae5d241c]{display:flex;align-items:center;flex-direction:row;justify-content:end;gap:10px;padding:10px}.single-line-ellipsis[data-v-ae5d241c]{white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.card-list[data-v-ae5d241c]{display:flex;align-content:flex-start;justify-content:flex-start;flex-wrap:wrap;gap:10px;height:100%}.card-list .file-item[data-v-ae5d241c]{width:100px;height:100px;display:flex;align-items:center;flex-direction:column;justify-content:center;gap:10px;padding:10px;margin:5px;cursor:pointer;transition:.2s all;border-radius:3px}.card-list .file-item span[data-v-ae5d241c]{text-align:center;display:block;width:100%}.card-list .file-item[data-v-ae5d241c]:hover{box-shadow:0 0 5px rgba(0,0,0,.2)}.card-list .file-item.active[data-v-ae5d241c]{background:var(--file-card-hover-color)}.modal-footer-btns[data-v-dbb99f65]{display:flex;align-items:center;flex-direction:row;justify-content:end;gap:10px;padding:10px}.single-line-ellipsis[data-v-dbb99f65]{white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.tabs[data-v-dbb99f65]{box-sizing:border-box;padding:16px 16px 0;overflow:hidden;width:100%}.tabs .tabs-scroll[data-v-dbb99f65]{width:100%;overflow:hidden;position:relative}.tabs .tabs-scroll.has-scroll[data-v-dbb99f65]{padding:0 40px;box-sizing:border-box}.tabs .tabs-scroll .left[data-v-dbb99f65],.tabs .tabs-scroll .right[data-v-dbb99f65]{height:28px;display:flex;align-items:center;flex-direction:row;justify-content:center;cursor:pointer;width:40px;background-color:var(--color-bg-3);position:absolute;top:1px}.tabs .tabs-scroll .left[data-v-dbb99f65]{left:0;box-shadow:2px 0 15px rgba(0,0,0,.6)}.tabs .tabs-scroll .right[data-v-dbb99f65]{right:0;box-shadow:-2px 0 15px rgba(0,0,0,.6)}.tabs .tabs-scroll .scroll-container[data-v-dbb99f65]{width:100%;overflow:hidden}.tabs .tabs-scroll .scroll-container .tabs-wrapper[data-v-dbb99f65]{height:100%;display:flex;align-items:center;flex-direction:row;justify-content:start;display:inline-flex}.tabs .tabs-scroll .scroll-container .tabs-wrapper .tab-item[data-v-dbb99f65]{width:150px;height:30px;padding:0 10px;background-color:var(--color-bg-3);box-sizing:border-box;border:1px solid var(--color-border);border-right:none;cursor:pointer;display:flex;flex-direction:row;justify-content:space-between;align-items:center;gap:5px}.tabs .tabs-scroll .scroll-container .tabs-wrapper .tab-item.active[data-v-dbb99f65]{background:var(--color-bg-2)}.tabs .tabs-scroll .scroll-container .tabs-wrapper .tab-item .tab-tit[data-v-dbb99f65]{display:block;max-width:80px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.tabs .tabs-scroll .scroll-container .tabs-wrapper .add[data-v-dbb99f65]{width:auto;border-right:1px solid var(--color-border)} +@charset "UTF-8";.modal-footer-btns[data-v-6be9ab69]{display:flex;align-items:center;flex-direction:row;justify-content:end;gap:10px;padding:10px}.single-line-ellipsis[data-v-6be9ab69]{white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.video-container[data-v-6be9ab69]{display:grid;grid-template-columns:1fr 300px}.video-container .video-list[data-v-6be9ab69]{display:flex;align-items:center;flex-direction:column;justify-content:start;align-items:flex-start;padding:10px;box-sizing:border-box;background:var(--color-modal);width:100%;height:100%}.video-container .video-list .video-item[data-v-6be9ab69]{display:flex;align-items:center;flex-direction:row;justify-content:start;cursor:pointer;width:100%;padding:10px 10px 10px 0;border-radius:4px}.video-container .video-list .video-item[data-v-6be9ab69]:hover,.video-container .video-list .video-item.active[data-v-6be9ab69]{background:#5c5c5c;color:var(--color-text-1)}.modal-footer-btns[data-v-90e8c7cf]{display:flex;align-items:center;flex-direction:row;justify-content:end;gap:10px;padding:10px}.single-line-ellipsis[data-v-90e8c7cf]{white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.upload-area[data-v-90e8c7cf]{width:100%;height:100vh;background:rgba(225,255,255,.3);display:flex;align-items:center;flex-direction:row;justify-content:center}.upload-area .tip[data-v-90e8c7cf]{font-size:50px;color:#fff}.modal-footer-btns[data-v-7045f818]{display:flex;align-items:center;flex-direction:row;justify-content:end;gap:10px;padding:10px}.single-line-ellipsis[data-v-7045f818]{white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.img-wrapper[data-v-7045f818]{width:100%;height:100vh;position:relative}.img-wrapper img[data-v-7045f818]{width:60%;position:absolute;left:50%;top:50%;transition:all .2s ease-in-out;transform:translate(-50%,-50%)}.img-wrapper .tools[data-v-7045f818]{width:300px;padding:20px;display:flex;align-items:center;flex-direction:row;justify-content:space-between;position:absolute;left:50%;margin-left:-150px;bottom:130px;background:rgba(99,96,98,.6);border-radius:50px}.img-wrapper .close-icon[data-v-7045f818]{position:absolute;right:20px;top:20px}.modal-footer-btns[data-v-c747adc9]{display:flex;align-items:center;flex-direction:row;justify-content:end;gap:10px;padding:10px}.single-line-ellipsis[data-v-c747adc9]{white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.button-group[data-v-c747adc9]{display:flex;align-items:center;flex-direction:row;justify-content:space-between;flex-wrap:wrap}.button-group .group-left[data-v-c747adc9]{display:flex;align-items:center;flex-direction:row;justify-content:start;gap:8px}.button-group .group-left .divider[data-v-c747adc9]{height:24px;width:1px;background:var(--color-border)}.button-group .group-right[data-v-c747adc9]{display:flex;align-items:center;flex-direction:row;justify-content:start;gap:8px}.button-group .group-right .view-change[data-v-c747adc9]{display:flex;align-items:center;flex-direction:row;gap:0;color:var(--color-text-2)}.button-group .group-right .view-change .card[data-v-c747adc9],.button-group .group-right .view-change .list[data-v-c747adc9]{width:32px;height:32px;border:1px solid var(--color-border);cursor:pointer;display:flex;align-items:center;flex-direction:row;justify-content:center}.button-group .group-right .view-change .active[data-v-c747adc9]{box-shadow:inset 0 3px 5px rgba(0,0,0,.125);background:#e6e6e6;color:var(--color-text-3)}.button-group .group-right .view-change .card[data-v-c747adc9]{border-right:none;border-radius:4px 0 0 4px}.button-group .group-right .view-change .list[data-v-c747adc9]{border-radius:0 4px 4px 0}.button-group[data-v-c747adc9] .n-button .n-button__content~.n-button__icon{margin-left:0}.button-group .btn-behavior[data-v-c747adc9] .n-icon-slot{transition:.2s all ease-in-out;transform-origin:center center;transform:translateY(0);top:0}.button-group .btn-behavior[data-v-c747adc9]:hover .n-icon-slot{transform:rotate(90deg)}.path-list[data-v-ca757f3c]{flex:1;display:flex;border-top:1px solid var(--color-border);border-bottom:1px solid var(--color-border);overflow:hidden;cursor:text}.path-list .path-item[data-v-ca757f3c]{display:flex;align-items:center;height:100%;white-space:nowrap;cursor:pointer;transition:background-color .3s cubic-bezier(.4,0,.2,1);flex-shrink:0}.path-list .path-item .path-dir[data-v-ca757f3c]{display:flex;align-items:center;height:100%;padding:0 6px;color:var(--color-text-2)}.path-list .path-item .path-arrow[data-v-ca757f3c]{display:flex;align-items:center;height:100%;padding:0 2px;border-left:1px solid transparent;border-right:1px solid transparent;font-size:14px;transition:border-color .3s cubic-bezier(.4,0,.2,1)}.path-list .path-item .path-arrow.reversal .svg-icon[data-v-ca757f3c]{transform:rotate(180deg)}.path-list .path-item[data-v-ca757f3c]:hover{background-color:var(--file-choose-hover-color)}.path-list .path-item:hover .path-arrow[data-v-ca757f3c]{border-left-color:var(--file-choose-hover-border-color);border-right-color:var(--file-choose-hover-border-color)}.modal-footer-btns[data-v-7bef8870]{display:flex;align-items:center;flex-direction:row;justify-content:end;gap:10px;padding:10px}.single-line-ellipsis[data-v-7bef8870]{white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.filter-tools[data-v-7bef8870]{display:flex;align-items:center;flex-direction:row;justify-content:space-between;gap:10px}.filter-tools .dir-address[data-v-7bef8870]{min-width:150px;max-width:600px}.filter-tools .dir-search[data-v-7bef8870]{min-width:120px;max-width:300px}.filter-tools .dir-search .__input-1cpbmap-m[data-v-7bef8870]{--n-border: 1px solid #2e9a8c;border-right:none}.modal-footer-btns[data-v-8101ae96]{display:flex;align-items:center;flex-direction:row;justify-content:end;gap:10px;padding:10px}.single-line-ellipsis[data-v-8101ae96]{white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.operation-wrapper[data-v-8101ae96]{display:flex;align-items:center;flex-direction:row;justify-content:end;display:inline-flex;gap:8px}.operation-wrapper span[data-v-8101ae96]{color:#36ad6a}.n-data-table[data-v-14098e72]{--n-merged-td-color-hover: var(--color-table-td-hover)}.n-data-table[data-v-14098e72] .active-row{background-color:var(--n-merged-td-color-hover)}.n-data-table[data-v-14098e72] .active-row>.n-data-table-td{background-color:var(--n-merged-td-color-hover)}.n-data-table[data-v-14098e72] .n-data-table-td{height:42px}.file-nm[data-v-14098e72]{cursor:pointer}.modal-footer-btns[data-v-ae5d241c]{display:flex;align-items:center;flex-direction:row;justify-content:end;gap:10px;padding:10px}.single-line-ellipsis[data-v-ae5d241c]{white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.card-list[data-v-ae5d241c]{display:flex;align-content:flex-start;justify-content:flex-start;flex-wrap:wrap;gap:10px;height:100%}.card-list .file-item[data-v-ae5d241c]{width:100px;height:100px;display:flex;align-items:center;flex-direction:column;justify-content:center;gap:10px;padding:10px;margin:5px;cursor:pointer;transition:.2s all;border-radius:3px}.card-list .file-item span[data-v-ae5d241c]{text-align:center;display:block;width:100%}.card-list .file-item[data-v-ae5d241c]:hover{box-shadow:0 0 5px rgba(0,0,0,.2)}.card-list .file-item.active[data-v-ae5d241c]{background:var(--file-card-hover-color)}.modal-footer-btns[data-v-dbb99f65]{display:flex;align-items:center;flex-direction:row;justify-content:end;gap:10px;padding:10px}.single-line-ellipsis[data-v-dbb99f65]{white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.tabs[data-v-dbb99f65]{box-sizing:border-box;padding:16px 16px 0;overflow:hidden;width:100%}.tabs .tabs-scroll[data-v-dbb99f65]{width:100%;overflow:hidden;position:relative}.tabs .tabs-scroll.has-scroll[data-v-dbb99f65]{padding:0 40px;box-sizing:border-box}.tabs .tabs-scroll .left[data-v-dbb99f65],.tabs .tabs-scroll .right[data-v-dbb99f65]{height:28px;display:flex;align-items:center;flex-direction:row;justify-content:center;cursor:pointer;width:40px;background-color:var(--color-bg-3);position:absolute;top:1px}.tabs .tabs-scroll .left[data-v-dbb99f65]{left:0;box-shadow:2px 0 15px rgba(0,0,0,.6)}.tabs .tabs-scroll .right[data-v-dbb99f65]{right:0;box-shadow:-2px 0 15px rgba(0,0,0,.6)}.tabs .tabs-scroll .scroll-container[data-v-dbb99f65]{width:100%;overflow:hidden}.tabs .tabs-scroll .scroll-container .tabs-wrapper[data-v-dbb99f65]{height:100%;display:flex;align-items:center;flex-direction:row;justify-content:start;display:inline-flex}.tabs .tabs-scroll .scroll-container .tabs-wrapper .tab-item[data-v-dbb99f65]{width:150px;height:30px;padding:0 10px;background-color:var(--color-bg-3);box-sizing:border-box;border:1px solid var(--color-border);border-right:none;cursor:pointer;display:flex;flex-direction:row;justify-content:space-between;align-items:center;gap:5px}.tabs .tabs-scroll .scroll-container .tabs-wrapper .tab-item.active[data-v-dbb99f65]{background:var(--color-bg-2)}.tabs .tabs-scroll .scroll-container .tabs-wrapper .tab-item .tab-tit[data-v-dbb99f65]{display:block;max-width:80px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.tabs .tabs-scroll .scroll-container .tabs-wrapper .add[data-v-dbb99f65]{width:auto;border-right:1px solid var(--color-border)} diff --git a/BTPanel/static/vite/css/index32.css b/BTPanel/static/vite/css/index32.css index 2d52d00a..2e612e16 100644 --- a/BTPanel/static/vite/css/index32.css +++ b/BTPanel/static/vite/css/index32.css @@ -1 +1 @@ -@charset "UTF-8";.header-left[data-v-fbf1502f]{display:flex;align-items:center;height:100%}.header-right[data-v-fbf1502f]{display:flex;align-items:center;justify-content:flex-end;height:100%}.header-item[data-v-fbf1502f]{display:flex;align-items:center;height:100%}.header-username[data-v-fbf1502f]{gap:10px;margin-right:16px}.header-username .username[data-v-fbf1502f]{line-height:20px;font-size:12px}.header-feedback[data-v-fbf1502f]{font-size:20px;cursor:pointer}.header-system[data-v-fbf1502f]{gap:8px}.header-system .name[data-v-fbf1502f]{margin-right:2px;line-height:18px;font-size:12px}.header-system .time[data-v-fbf1502f]{line-height:18px;font-size:12px}.header-tools[data-v-fbf1502f]{gap:4px;cursor:pointer;transition:color .3s cubic-bezier(.4,0,.2,1)}.header-tools[data-v-fbf1502f]:hover{color:#20a53a}.header-tools .icon[data-v-fbf1502f]{font-size:20px}.header-tools .text[data-v-fbf1502f]{line-height:18px}.header-tools .version[data-v-fbf1502f]{line-height:20px;font-size:13px}.n-card[data-v-932276b2]{--n-padding-top: 0;--n-padding-left: 0;--n-padding-right: 0;--n-padding-bottom: 0;--n-border-radius: 10px;min-height:44px}.card-title[data-v-932276b2]{position:absolute;display:flex;align-items:center;gap:16px;top:16px;left:16px;line-height:26px;z-index:100}@media (max-width: 1400px){.card-title[data-v-932276b2]{font-size:16px}}.badge[data-v-815892e5]{display:flex;align-items:center;gap:6px;width:84px;height:32px;margin-left:2px;padding-left:12px;border-radius:4px;background:var(--home-ad-badge-bg-color);color:var(--color-pro)}.badge .badge-text[data-v-815892e5]{font-size:14px;font-weight:700}.features[data-v-815892e5]{flex:1;display:flex;align-items:center;gap:24px;width:0;white-space:nowrap}.features .feature-item[data-v-815892e5]{display:flex;align-items:center;gap:6px}.features .feature-icon[data-v-815892e5]{color:#ffae45;font-size:14px}.features .feature-text[data-v-815892e5]{line-height:18px;font-size:13px}.n-progress[data-v-222077f4]{--n-font-size-circle: 24px}.n-progress[data-v-222077f4] .n-progress-text{font-family:Outfit}.status-card[data-v-2defdcfa]{display:flex;flex-direction:column;align-items:center;height:268px;padding-top:60px}.n-collapse[data-v-7402b5c2] .n-collapse-item:not(:first-child){border:none;margin:0}.n-collapse[data-v-7402b5c2] .n-collapse-item .n-collapse-item__header-main{display:flex;align-items:center;height:30px;padding:0 8px;background-color:var(--collapse-color);color:var(--color-text-base);border-radius:4px;font-size:12px}.n-collapse[data-v-7402b5c2] .n-collapse-item .n-collapse-item__content-wrapper .n-collapse-item__content-inner{padding-top:16px}.n-divider[data-v-6d1d43cd]{height:12px}.table[data-v-5ad01b61]{width:100%;max-width:100%;background-color:transparent;border-spacing:0;border-collapse:collapse;margin-bottom:0}.table tbody>tr>td[data-v-5ad01b61]{vertical-align:middle;line-height:1.42857143;padding:4px;text-overflow:ellipsis;word-break:break-all;overflow:hidden;border-top:none}.table[data-v-7565cd70]{width:100%;max-width:100%;background-color:transparent;border-spacing:0;border-collapse:collapse;margin-bottom:0}.table tbody>tr>td[data-v-7565cd70]{vertical-align:middle;line-height:1.42857143;padding:4px;text-overflow:ellipsis;word-break:break-all;overflow:hidden;border-top:none}.table[data-v-3d529c05]{width:100%;max-width:100%;background-color:transparent;border-spacing:0;border-collapse:collapse;margin-bottom:0}.table tbody>tr>td[data-v-3d529c05]{vertical-align:middle;line-height:1.42857143;padding:4px;text-overflow:ellipsis;word-break:break-all;overflow:hidden;border-top:none}.disk-item[data-v-1348bddf]{--text-color: var(--color-primary);cursor:pointer}.disk-item:hover .disk-size[data-v-1348bddf]{color:var(--text-color)}.disk-item .disk-usage[data-v-1348bddf]{line-height:28px;font-family:Outfit;font-size:22px;font-weight:500;color:var(--text-color);transition:color .3s}.disk-item .disk-size[data-v-1348bddf]{line-height:19px;font-size:13px;transition:color .3s}.disk-item .disk-path[data-v-1348bddf]{background-color:var(--color-bg-3);text-align:center;line-height:24px;padding:0 8px;font-size:13px;border-radius:2px}.n-progress[data-v-b9ec9612]{width:100%}.disk-item[data-v-f5a1d124]{--color: #20a53a;--bg-color: #20a53a1a;--shadow-color: #20a53a33;display:flex;align-items:center;justify-content:center;width:44px;height:44px;border:1px solid transparent;background-color:var(--bg-color);border-radius:4px;cursor:pointer;transition:border .3s cubic-bezier(.4,0,.2,1),box-shadow .3s cubic-bezier(.4,0,.2,1)}.disk-item[data-v-f5a1d124]:hover{border-color:var(--color);box-shadow:0 4px 10px 0 var(--shadow-color)}.disk-item .round[data-v-f5a1d124]{width:14px;height:14px;border-radius:50%;background-color:var(--color)}.disk-list[data-v-57688fa7]{display:grid;gap:16px;grid-template-columns:repeat(auto-fill,minmax(44px,1fr))}.plugin-card[data-v-77972135]{position:relative;display:flex;flex-direction:column;align-items:center;justify-content:center;gap:8px;height:138px;padding:10px;border:1px solid var(--home-soft-border-color);background:var(--home-soft-bg-color);border-radius:10px;cursor:pointer;transition:background .3s cubic-bezier(.4,0,.2,1),box-shadow .3s cubic-bezier(.4,0,.2,1),border-color .3s cubic-bezier(.4,0,.2,1)}.plugin-card[data-v-77972135]:hover{border-color:var(--home-soft-border-hover-color);background:var(--home-soft-bg-hover-color);box-shadow:0 4px 10px rgba(32,165,58,.13)}.plugin-card .move[data-v-43587c05]{position:absolute;top:16px;right:16px;display:none;cursor:move;font-size:16px}.plugin-card:hover .move[data-v-43587c05]{display:block}.plugin-card__content[data-v-43587c05]{display:flex;flex-direction:column;align-items:center;width:100%;gap:8px}.plugin-card__content .plugin-icon[data-v-43587c05]{height:44px}.plugin-card__content .plugin-title[data-v-43587c05]{width:100%;font-weight:400;line-height:14px;text-align:center}.plugin-card__ad[data-v-0a4318d4]{position:absolute;top:2px;left:6px;line-height:16px;font-weight:400;color:var(--color-text-2)}.plugin-card__content[data-v-0a4318d4]{display:flex;flex-direction:column;align-items:center;width:100%;gap:8px}.plugin-card__content .plugin-icon[data-v-0a4318d4]{height:44px}.plugin-card__content .plugin-title[data-v-0a4318d4]{width:100%;min-height:28px;font-weight:400;line-height:14px;text-align:center}.plugin-card__actions[data-v-0a4318d4]{display:flex;gap:8px}.plugin-card__actions .n-button[data-v-0a4318d4]{--n-height: 24px;--n-padding: 0 8px}.plugin-list[data-v-d53606f6]{display:grid;gap:8px;grid-template-columns:repeat(auto-fill,minmax(160px,1fr))}.monitor-stat[data-v-980bc7b7]{display:flex;height:80px;background-color:var(--color-bg-3);border-radius:10px}.monitor-stat .monitor-stat-item[data-v-980bc7b7]{flex:1;display:flex;flex-direction:column;justify-content:center;align-items:center;gap:8px;height:100%}.monitor-stat .monitor-stat-item:nth-of-type(1) .monitor-stat__value[data-v-980bc7b7],.monitor-stat .monitor-stat-item:nth-of-type(2) .monitor-stat__value[data-v-980bc7b7]{font-weight:500}.monitor-stat .monitor-stat-item .monitor-stat__title[data-v-980bc7b7]{display:flex;align-items:center;gap:6px;line-height:18px;font-size:14px;color:var(--color-text-2);font-weight:400}.monitor-stat .monitor-stat-item .monitor-stat__dot[data-v-980bc7b7]{position:relative;display:block;width:6px;height:6px;border-radius:3px;background-color:var(--dot-color)}.monitor-stat .monitor-stat-item .monitor-stat__dot[data-v-980bc7b7]:after{content:"";position:absolute;left:50%;top:50%;width:12px;height:12px;border-radius:6px;border:2px solid var(--dot-color);opacity:.6;transform:translate(-50%,-50%);animation:home-monitor-ripple-980bc7b7 2s infinite}@keyframes home-monitor-ripple-980bc7b7{0%{transform:translate(-50%,-50%) scale(.8);opacity:.8}50%{transform:translate(-50%,-50%) scale(1.2);opacity:.4}to{transform:translate(-50%,-50%) scale(1.6);opacity:0}}.monitor-stat .monitor-stat-item .monitor-stat__value[data-v-980bc7b7]{color:var(--color-text-base);line-height:22px;font-size:16px}.n-tabs[data-v-e0042a0d]{height:498px;--n-tab-text-color: var(--color-text-2);--n-tab-text-color-active: var(--home-monitor-tabs-active-color);--n-tab-text-color-hover: var(--border-hover-focus-color);--n-tab-gap: 40px;--n-tab-padding: 16px 0;--n-pane-padding-top: 0;--n-pane-padding-left: 16px;--n-pane-padding-right: 16px;--n-pane-padding-bottom: 16px}.n-tabs .n-tab-pane[data-v-e0042a0d]{flex:1}.n-tabs[data-v-e0042a0d] .n-tabs-tab{height:60px}.n-tabs[data-v-e0042a0d] .n-tabs-tab.n-tabs-tab--active{font-size:18px}.item-card-wrap[data-v-f2dc5355]{position:relative}.item-card-wrap .drag-icon[data-v-f2dc5355]{position:absolute;top:6px;left:50%;transform:translate(-50%);opacity:0;transition:opacity .2s;cursor:move}.item-card-wrap .drag-icon[data-v-f2dc5355]:active{cursor:grabbing}.item-card-wrap[data-v-f2dc5355]:hover{box-shadow:0 8px 16px rgba(0,0,0,.1);border-color:var(--border-hover-focus-color);cursor:pointer}.item-card-wrap:hover .drag-icon[data-v-f2dc5355]{opacity:1}.item-card-wrap[data-v-f2dc5355] .icon-container i{width:16px;height:16px;display:inline-block;vertical-align:middle}.module-card[data-v-88e1e6dd]{display:flex;flex-direction:column;overflow:hidden;border-radius:8px;padding:16px;border:1px solid var(--color-border);gap:10px}.module-card .card-icon-wrap[data-v-88e1e6dd]{width:36px;height:36px;display:flex;align-items:center;justify-content:center;border-radius:6px;background-color:var(--home-overview-btn-color);font-size:18px;color:var(--border-hover-focus-color)}.module-card .card-icon-wrap[data-v-88e1e6dd] i{width:18px;height:18px;display:inline-block}.overview-new[data-v-8958092b]{padding:52px 16px 16px;display:flex;justify-content:space-between}.overview-grid[data-v-8958092b]{flex:1;display:grid;grid-template-columns:repeat(auto-fit,minmax(250px,calc(16.7% - 16px)));gap:16px}.drag-ghost[data-v-8958092b]{opacity:.4;border:2px dashed var(--primary-color, #18a058);border-radius:8px;background:transparent!important}.drag-ghost[data-v-8958092b]>*{visibility:hidden}.home-container[data-v-5cd96a94]{padding:10px 20px 16px} +@charset "UTF-8";.logs-card[data-v-3d9d9bf9]{border:1px solid var(--color-border);border-radius:8px;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Noto Sans,Helvetica,Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji"}.logs-card .logs-card-header[data-v-3d9d9bf9]{padding:16px;border-bottom:1px solid var(--color-border)}.logs-card .logs-card-content[data-v-3d9d9bf9]{padding:16px}.logs-card .logs-version[data-v-3d9d9bf9]{font-size:17px;font-weight:700}.logs-card ul[data-v-3d9d9bf9]{padding-left:32px;color:var(--color-text-4);font-size:14px;line-height:1.4}.logs-card ul li[data-v-3d9d9bf9]{list-style-type:disc}.header-left[data-v-6926d996]{display:flex;align-items:center;height:100%}.header-right[data-v-6926d996]{display:flex;align-items:center;justify-content:flex-end;height:100%}.header-item[data-v-6926d996]{display:flex;align-items:center;height:100%}.header-username[data-v-6926d996]{gap:10px;margin-right:16px}.header-username .username[data-v-6926d996]{line-height:20px;font-size:12px}.header-feedback[data-v-6926d996]{font-size:20px;cursor:pointer}.header-system[data-v-6926d996]{gap:8px}.header-system .name[data-v-6926d996]{margin-right:2px;line-height:18px;font-size:12px}.header-system .time[data-v-6926d996]{line-height:18px;font-size:12px}.header-tools[data-v-6926d996]{gap:4px;cursor:pointer;transition:color .3s cubic-bezier(.4,0,.2,1)}.header-tools[data-v-6926d996]:hover{color:#20a53a}.header-tools .icon[data-v-6926d996]{font-size:20px}.header-tools .text[data-v-6926d996]{line-height:18px}.header-tools .version[data-v-6926d996]{line-height:20px;font-size:13px}.n-card[data-v-932276b2]{--n-padding-top: 0;--n-padding-left: 0;--n-padding-right: 0;--n-padding-bottom: 0;--n-border-radius: 10px;min-height:44px}.card-title[data-v-932276b2]{position:absolute;display:flex;align-items:center;gap:16px;top:16px;left:16px;line-height:26px;z-index:100}@media (max-width: 1400px){.card-title[data-v-932276b2]{font-size:16px}}.badge[data-v-815892e5]{display:flex;align-items:center;gap:6px;width:84px;height:32px;margin-left:2px;padding-left:12px;border-radius:4px;background:var(--home-ad-badge-bg-color);color:var(--color-pro)}.badge .badge-text[data-v-815892e5]{font-size:14px;font-weight:700}.features[data-v-815892e5]{flex:1;display:flex;align-items:center;gap:24px;width:0;white-space:nowrap}.features .feature-item[data-v-815892e5]{display:flex;align-items:center;gap:6px}.features .feature-icon[data-v-815892e5]{color:#ffae45;font-size:14px}.features .feature-text[data-v-815892e5]{line-height:18px;font-size:13px}.n-progress[data-v-222077f4]{--n-font-size-circle: 24px}.n-progress[data-v-222077f4] .n-progress-text{font-family:Outfit}.status-card[data-v-2defdcfa]{display:flex;flex-direction:column;align-items:center;height:268px;padding-top:60px}.n-collapse[data-v-7402b5c2] .n-collapse-item:not(:first-child){border:none;margin:0}.n-collapse[data-v-7402b5c2] .n-collapse-item .n-collapse-item__header-main{display:flex;align-items:center;height:30px;padding:0 8px;background-color:var(--collapse-color);color:var(--color-text-base);border-radius:4px;font-size:12px}.n-collapse[data-v-7402b5c2] .n-collapse-item .n-collapse-item__content-wrapper .n-collapse-item__content-inner{padding-top:16px}.n-divider[data-v-6d1d43cd]{height:12px}.table[data-v-5ad01b61]{width:100%;max-width:100%;background-color:transparent;border-spacing:0;border-collapse:collapse;margin-bottom:0}.table tbody>tr>td[data-v-5ad01b61]{vertical-align:middle;line-height:1.42857143;padding:4px;text-overflow:ellipsis;word-break:break-all;overflow:hidden;border-top:none}.table[data-v-7565cd70]{width:100%;max-width:100%;background-color:transparent;border-spacing:0;border-collapse:collapse;margin-bottom:0}.table tbody>tr>td[data-v-7565cd70]{vertical-align:middle;line-height:1.42857143;padding:4px;text-overflow:ellipsis;word-break:break-all;overflow:hidden;border-top:none}.table[data-v-3d529c05]{width:100%;max-width:100%;background-color:transparent;border-spacing:0;border-collapse:collapse;margin-bottom:0}.table tbody>tr>td[data-v-3d529c05]{vertical-align:middle;line-height:1.42857143;padding:4px;text-overflow:ellipsis;word-break:break-all;overflow:hidden;border-top:none}.disk-item[data-v-1348bddf]{--text-color: var(--color-primary);cursor:pointer}.disk-item:hover .disk-size[data-v-1348bddf]{color:var(--text-color)}.disk-item .disk-usage[data-v-1348bddf]{line-height:28px;font-family:Outfit;font-size:22px;font-weight:500;color:var(--text-color);transition:color .3s}.disk-item .disk-size[data-v-1348bddf]{line-height:19px;font-size:13px;transition:color .3s}.disk-item .disk-path[data-v-1348bddf]{background-color:var(--color-bg-3);text-align:center;line-height:24px;padding:0 8px;font-size:13px;border-radius:2px}.n-progress[data-v-b9ec9612]{width:100%}.disk-item[data-v-f5a1d124]{--color: #20a53a;--bg-color: #20a53a1a;--shadow-color: #20a53a33;display:flex;align-items:center;justify-content:center;width:44px;height:44px;border:1px solid transparent;background-color:var(--bg-color);border-radius:4px;cursor:pointer;transition:border .3s cubic-bezier(.4,0,.2,1),box-shadow .3s cubic-bezier(.4,0,.2,1)}.disk-item[data-v-f5a1d124]:hover{border-color:var(--color);box-shadow:0 4px 10px 0 var(--shadow-color)}.disk-item .round[data-v-f5a1d124]{width:14px;height:14px;border-radius:50%;background-color:var(--color)}.disk-list[data-v-57688fa7]{display:grid;gap:16px;grid-template-columns:repeat(auto-fill,minmax(44px,1fr))}.plugin-card[data-v-77972135]{position:relative;display:flex;flex-direction:column;align-items:center;justify-content:center;gap:8px;height:138px;padding:10px;border:1px solid var(--home-soft-border-color);background:var(--home-soft-bg-color);border-radius:10px;cursor:pointer;transition:background .3s cubic-bezier(.4,0,.2,1),box-shadow .3s cubic-bezier(.4,0,.2,1),border-color .3s cubic-bezier(.4,0,.2,1)}.plugin-card[data-v-77972135]:hover{border-color:var(--home-soft-border-hover-color);background:var(--home-soft-bg-hover-color);box-shadow:0 4px 10px rgba(32,165,58,.13)}.plugin-card .move[data-v-43587c05]{position:absolute;top:16px;right:16px;display:none;cursor:move;font-size:16px}.plugin-card:hover .move[data-v-43587c05]{display:block}.plugin-card__content[data-v-43587c05]{display:flex;flex-direction:column;align-items:center;width:100%;gap:8px}.plugin-card__content .plugin-icon[data-v-43587c05]{height:44px}.plugin-card__content .plugin-title[data-v-43587c05]{width:100%;font-weight:400;line-height:14px;text-align:center}.plugin-card__ad[data-v-0a4318d4]{position:absolute;top:2px;left:6px;line-height:16px;font-weight:400;color:var(--color-text-2)}.plugin-card__content[data-v-0a4318d4]{display:flex;flex-direction:column;align-items:center;width:100%;gap:8px}.plugin-card__content .plugin-icon[data-v-0a4318d4]{height:44px}.plugin-card__content .plugin-title[data-v-0a4318d4]{width:100%;min-height:28px;font-weight:400;line-height:14px;text-align:center}.plugin-card__actions[data-v-0a4318d4]{display:flex;gap:8px}.plugin-card__actions .n-button[data-v-0a4318d4]{--n-height: 24px;--n-padding: 0 8px}.plugin-list[data-v-d53606f6]{display:grid;gap:8px;grid-template-columns:repeat(auto-fill,minmax(160px,1fr))}.monitor-stat[data-v-980bc7b7]{display:flex;height:80px;background-color:var(--color-bg-3);border-radius:10px}.monitor-stat .monitor-stat-item[data-v-980bc7b7]{flex:1;display:flex;flex-direction:column;justify-content:center;align-items:center;gap:8px;height:100%}.monitor-stat .monitor-stat-item:nth-of-type(1) .monitor-stat__value[data-v-980bc7b7],.monitor-stat .monitor-stat-item:nth-of-type(2) .monitor-stat__value[data-v-980bc7b7]{font-weight:500}.monitor-stat .monitor-stat-item .monitor-stat__title[data-v-980bc7b7]{display:flex;align-items:center;gap:6px;line-height:18px;font-size:14px;color:var(--color-text-2);font-weight:400}.monitor-stat .monitor-stat-item .monitor-stat__dot[data-v-980bc7b7]{position:relative;display:block;width:6px;height:6px;border-radius:3px;background-color:var(--dot-color)}.monitor-stat .monitor-stat-item .monitor-stat__dot[data-v-980bc7b7]:after{content:"";position:absolute;left:50%;top:50%;width:12px;height:12px;border-radius:6px;border:2px solid var(--dot-color);opacity:.6;transform:translate(-50%,-50%);animation:home-monitor-ripple-980bc7b7 2s infinite}@keyframes home-monitor-ripple-980bc7b7{0%{transform:translate(-50%,-50%) scale(.8);opacity:.8}50%{transform:translate(-50%,-50%) scale(1.2);opacity:.4}to{transform:translate(-50%,-50%) scale(1.6);opacity:0}}.monitor-stat .monitor-stat-item .monitor-stat__value[data-v-980bc7b7]{color:var(--color-text-base);line-height:22px;font-size:16px}.n-tabs[data-v-e0042a0d]{height:498px;--n-tab-text-color: var(--color-text-2);--n-tab-text-color-active: var(--home-monitor-tabs-active-color);--n-tab-text-color-hover: var(--border-hover-focus-color);--n-tab-gap: 40px;--n-tab-padding: 16px 0;--n-pane-padding-top: 0;--n-pane-padding-left: 16px;--n-pane-padding-right: 16px;--n-pane-padding-bottom: 16px}.n-tabs .n-tab-pane[data-v-e0042a0d]{flex:1}.n-tabs[data-v-e0042a0d] .n-tabs-tab{height:60px}.n-tabs[data-v-e0042a0d] .n-tabs-tab.n-tabs-tab--active{font-size:18px}.item-card-wrap[data-v-f2dc5355]{position:relative}.item-card-wrap .drag-icon[data-v-f2dc5355]{position:absolute;top:6px;left:50%;transform:translate(-50%);opacity:0;transition:opacity .2s;cursor:move}.item-card-wrap .drag-icon[data-v-f2dc5355]:active{cursor:grabbing}.item-card-wrap[data-v-f2dc5355]:hover{box-shadow:0 8px 16px rgba(0,0,0,.1);border-color:var(--border-hover-focus-color);cursor:pointer}.item-card-wrap:hover .drag-icon[data-v-f2dc5355]{opacity:1}.item-card-wrap[data-v-f2dc5355] .icon-container i{width:16px;height:16px;display:inline-block;vertical-align:middle}.module-card[data-v-88e1e6dd]{display:flex;flex-direction:column;overflow:hidden;border-radius:8px;padding:16px;border:1px solid var(--color-border);gap:10px}.module-card .card-icon-wrap[data-v-88e1e6dd]{width:36px;height:36px;display:flex;align-items:center;justify-content:center;border-radius:6px;background-color:var(--home-overview-btn-color);font-size:18px;color:var(--border-hover-focus-color)}.module-card .card-icon-wrap[data-v-88e1e6dd] i{width:18px;height:18px;display:inline-block}.overview-new[data-v-8958092b]{padding:52px 16px 16px;display:flex;justify-content:space-between}.overview-grid[data-v-8958092b]{flex:1;display:grid;grid-template-columns:repeat(auto-fit,minmax(250px,calc(16.7% - 16px)));gap:16px}.drag-ghost[data-v-8958092b]{opacity:.4;border:2px dashed var(--primary-color, #18a058);border-radius:8px;background:transparent!important}.drag-ghost[data-v-8958092b]>*{visibility:hidden}.home-container[data-v-5cd96a94]{padding:10px 20px 16px} diff --git a/BTPanel/static/vite/css/index44.css b/BTPanel/static/vite/css/index44.css index 1bfc7b02..b494c7af 100644 --- a/BTPanel/static/vite/css/index44.css +++ b/BTPanel/static/vite/css/index44.css @@ -1 +1 @@ -.ul-style[data-v-c0b88226]{margin:0 auto;display:flex;align-items:center;justify-content:center;gap:48px;font-size:16px}.ul-style li[data-v-c0b88226]{display:flex;align-items:center} +.monitor-card[data-v-46d0d2ec]{border:1px solid var(--color-border)}[data-v-688bd5ac] .xterm{padding:12px!important} diff --git a/BTPanel/static/vite/css/index45.css b/BTPanel/static/vite/css/index45.css index 3dd8f4cc..a210c277 100644 --- a/BTPanel/static/vite/css/index45.css +++ b/BTPanel/static/vite/css/index45.css @@ -1 +1 @@ -.site-security-info .overview-title[data-v-41148346]{display:flex;align-items:center;justify-content:center;gap:10px;font-size:18px;font-weight:700;color:var(--color-text-base)}.site-security-info .overview-icon[data-v-41148346]{color:var(--color-text-base)}.site-security-info .feature-item[data-v-41148346]{display:flex;align-items:flex-start;gap:14px;min-width:0}.site-security-info .feature-icon[data-v-41148346]{flex:0 0 auto;font-size:38px;color:var(--color-primary)}.site-security-info .feature-title[data-v-41148346]{font-size:14px;font-weight:700;color:var(--color-text-base);line-height:1.4}.site-security-info .feature-desc[data-v-41148346]{margin-top:6px;font-size:12px;color:var(--color-text-3);line-height:1.4}.n-button[data-v-bb415a5d]{height:40px;padding:0 36px}.metric-item[data-v-0379de28]{position:relative;padding:24px;line-height:1}.metric-item .metric-label[data-v-0379de28]{margin-bottom:14px;font-weight:700;font-size:16px;color:var(--color-text-4)}.metric-item .metric-value[data-v-0379de28]{margin-bottom:14px;font-weight:700;font-size:20px}.metric-item .metric-value .metric-unit[data-v-0379de28]{font-size:14px}.metric-item .metric-desc[data-v-0379de28]{color:var(--color-text-3)}.metric-item .metric-icon[data-v-0379de28]{position:absolute;top:8px;right:12px;font-size:60px;color:#e9e9e9}.risk-list[data-v-59b580c0]{display:flex;flex-direction:column;gap:16px}.risk-card[data-v-59b580c0]{padding:16px;box-shadow:none}.risk-card__header[data-v-59b580c0]{display:flex;align-items:center;gap:12px}.risk-card__title[data-v-59b580c0]{line-height:1}.risk-card__title.is-low[data-v-59b580c0]{color:var(--color-warning)}.risk-card__title.is-warning[data-v-59b580c0]{color:#fc6d26}.risk-card__title.is-danger[data-v-59b580c0]{color:var(--color-error)}.risk-card__body[data-v-59b580c0]{margin-top:14px;padding:16px;background:var(--color-bg-4);border-radius:2px}.risk-row[data-v-59b580c0]{display:flex;gap:4px;line-height:1}.risk-row__label[data-v-59b580c0]{font-size:12px;font-weight:700;min-width:70px;text-align:right;white-space:nowrap;color:var(--color-text-base)}.risk-row__value[data-v-59b580c0]{font-size:12px;color:var(--color-text-3)}.risk-divider[data-v-59b580c0]{height:1px;margin:8px 0;background-color:var(--color-border)}.risk-empty[data-v-59b580c0]{display:flex;align-items:center;justify-content:center;padding-top:30px;padding-bottom:30px}.security-collapse[data-v-d4aef7d6]{--n-item-margin: 20px 0 0;--n-title-padding: 0;--n-arrow-color: var(--color-text-4)}.security-collapse[data-v-d4aef7d6] .n-collapse-item,.security-collapse[data-v-d4aef7d6] .n-collapse-item .n-collapse-item__header{border:none}.security-collapse[data-v-d4aef7d6] .n-collapse-item .n-collapse-item__header.n-collapse-item__header--active .n-collapse-item__header-main{border-bottom-left-radius:0;border-bottom-right-radius:0}.security-collapse[data-v-d4aef7d6] .n-collapse-item .n-collapse-item__header .n-collapse-item__header-main{width:100%;height:46px;padding:0 20px;background-color:var(--color-bg-4);border-radius:4px}.security-collapse[data-v-d4aef7d6] .n-collapse-item .n-collapse-item__header .n-collapse-item__header-main .n-collapse-item-arrow{margin-left:0}.security-collapse[data-v-d4aef7d6] .n-collapse-item .n-collapse-item__content-wrapper .n-collapse-item__content-inner{padding:10px 20px 20px;background-color:var(--color-bg-4);border-bottom-left-radius:4px;border-bottom-right-radius:4px}.security-collapse__header[data-v-d4aef7d6]{display:flex;align-items:center;width:100%}.security-collapse__left[data-v-d4aef7d6]{display:flex;align-items:center;gap:10px;width:60%;min-width:0}.security-collapse__left .security-collapse__icon[data-v-d4aef7d6]{flex:0 0 auto;font-size:20px;color:var(--color-text-3)}.security-collapse__left .security-collapse__title[data-v-d4aef7d6]{line-height:1;font-size:14px;font-weight:700;color:var(--color-text-base)}.security-collapse__status[data-v-d4aef7d6]{flex:1;font-size:14px}.security-collapse__expand[data-v-d4aef7d6]{margin-right:2px;color:var(--color-text-4)}.site-security-page[data-v-74f36d2b]{display:flex;flex-direction:column;gap:10px;max-width:1370px} +.bt-tabs-modal[data-v-9b556854]{--n-tab-gap-vertical: 0;--n-tab-border-color: var(--bt-tabs-modal-bg);--n-tab-color: var(--bt-tabs-modal-bg);--n-tab-border-radius: 0;--n-tab-text-color-active: var(--tabs-active-text-color);--n-tab-padding-vertical: 0 10px 0 20px;--n-tab-item-width: 170px;height:100%}.bt-tabs-modal[data-v-9b556854]>.n-tabs-nav{width:var(--n-tab-item-width);background-color:var(--bt-tabs-modal-bg)}.bt-tabs-modal[data-v-9b556854]>.n-tabs-nav .n-tabs-scroll-padding{border:none}.bt-tabs-modal[data-v-9b556854]>.n-tabs-nav .n-tabs-wrapper .n-tabs-tab-wrapper .n-tabs-tab{width:var(--n-tab-item-width);height:40px;border:none;justify-content:flex-start}.bt-tabs-modal[data-v-9b556854]>.n-tabs-nav .n-tabs-wrapper .n-tabs-tab-wrapper .n-tabs-tab.n-tabs-tab--active{background-color:var(--bt-tabs-modal-active-bg)}.bt-tabs-modal[data-v-9b556854]>.n-tabs-nav .n-tabs-wrapper .n-tabs-tab-wrapper .n-tabs-tab .n-tabs-tab__label{overflow:hidden}.bt-tabs-modal[data-v-9b556854]>.n-tab-pane{overflow:auto}.is-icon[data-v-9b556854]>.n-tabs-nav{width:81px}.is-icon[data-v-9b556854]>.n-tabs-nav .n-tabs-tab{width:81px!important;height:74px!important} diff --git a/BTPanel/static/vite/css/index46.css b/BTPanel/static/vite/css/index46.css index 98523775..519099b3 100644 --- a/BTPanel/static/vite/css/index46.css +++ b/BTPanel/static/vite/css/index46.css @@ -1 +1 @@ -h3[data-v-89ebe7d8]{font-size:14px}.n-alert[data-v-be40dd88]{--n-color: var(--security-brute-force-tips-bg);--n-icon-color: #ef0808;--n-content-text-color: #ef0808} +@charset "UTF-8";.path-list[data-v-cfc90488]{flex:1;display:flex;border-top:1px solid var(--color-border);border-bottom:1px solid var(--color-border);overflow:hidden;cursor:text}.path-list .path-item[data-v-cfc90488]{display:flex;align-items:center;height:100%;white-space:nowrap;cursor:pointer;transition:background-color .3s cubic-bezier(.4,0,.2,1);flex-shrink:0}.path-list .path-item .path-dir[data-v-cfc90488]{display:flex;align-items:center;height:100%;padding:0 6px;color:var(--color-text-2)}.path-list .path-item .path-arrow[data-v-cfc90488]{display:flex;align-items:center;height:100%;padding:0 2px;border-left:1px solid transparent;border-right:1px solid transparent;font-size:14px;transition:border-color .3s cubic-bezier(.4,0,.2,1)}.path-list .path-item .path-arrow.reversal .svg-icon[data-v-cfc90488]{transform:rotate(180deg)}.path-list .path-item[data-v-cfc90488]:hover{background-color:var(--file-choose-hover-color)}.path-list .path-item:hover .path-arrow[data-v-cfc90488]{border-left-color:var(--file-choose-hover-border-color);border-right-color:var(--file-choose-hover-border-color)}.box-view[data-v-97efdba0]{height:calc(100vh - 175px)} diff --git a/BTPanel/static/vite/css/index47.css b/BTPanel/static/vite/css/index47.css index a542dabf..e74792a4 100644 --- a/BTPanel/static/vite/css/index47.css +++ b/BTPanel/static/vite/css/index47.css @@ -1 +1 @@ -h3[data-v-6f78f08a]{font-size:14px} +.ul-style[data-v-9301cd3f]{margin:0 auto;display:flex;align-items:center;justify-content:center;gap:48px;font-size:16px}.ul-style li[data-v-9301cd3f]{display:flex;align-items:center}.item[data-v-9301cd3f]{border-left:3px solid #def2e2}.item li[data-v-9301cd3f]{width:180px;margin-left:-3px;font-size:14px;line-height:36px;padding:0 20px;cursor:pointer}.item .active[data-v-9301cd3f]{border-left:3px solid #20a53a;color:#20a53a;font-weight:700;font-size:16px} diff --git a/BTPanel/static/vite/css/index48.css b/BTPanel/static/vite/css/index48.css index ac6cfa40..1bfc7b02 100644 --- a/BTPanel/static/vite/css/index48.css +++ b/BTPanel/static/vite/css/index48.css @@ -1 +1 @@ -.ul-style[data-v-f9cef105]{margin:0 auto;display:flex;align-items:center;justify-content:center;gap:48px;font-size:16px}.ul-style li[data-v-f9cef105]{display:flex;align-items:center}.item[data-v-f9cef105]{border-left:3px solid #def2e2}.item li[data-v-f9cef105]{width:180px;margin-left:-3px;font-size:14px;line-height:36px;padding:0 20px;cursor:pointer}.item .active[data-v-f9cef105]{border-left:3px solid #20a53a;color:#20a53a;font-weight:700;font-size:16px} +.ul-style[data-v-c0b88226]{margin:0 auto;display:flex;align-items:center;justify-content:center;gap:48px;font-size:16px}.ul-style li[data-v-c0b88226]{display:flex;align-items:center} diff --git a/BTPanel/static/vite/css/index49.css b/BTPanel/static/vite/css/index49.css index ca7aa22f..62d09d90 100644 --- a/BTPanel/static/vite/css/index49.css +++ b/BTPanel/static/vite/css/index49.css @@ -1 +1 @@ -.form[data-v-201446e2] .n-form-item{margin-right:5px!important}.form[data-v-201446e2] .n-form-item-label{width:auto!important;padding:5px!important}.ul-style[data-v-f55518e2]{margin:0 auto;display:flex;align-items:center;justify-content:center;gap:48px;font-size:16px}.ul-style li[data-v-f55518e2]{display:flex;align-items:center}.item[data-v-f55518e2]{border-left:3px solid #def2e2}.item li[data-v-f55518e2]{width:180px;margin-left:-3px;font-size:14px;line-height:36px;padding:0 20px;cursor:pointer}.item .active[data-v-f55518e2]{border-left:3px solid #20a53a;color:#20a53a;font-weight:700;font-size:16px} +.stat-box[data-v-ebe32ed6]{cursor:pointer}.stat-box.primary[data-v-ebe32ed6]{background-color:rgba(24,160,88,.1);border:1px solid rgba(24,160,88,.2)}.stat-box.error[data-v-ebe32ed6]{background-color:rgba(208,48,80,.1);border:1px solid rgba(208,48,80,.2)}.stat-box[data-v-33de2b22]{align-items:center;border-radius:8px;padding:16px;border:1px solid var(--color-border)}.flash-border .stat-box[data-v-33de2b22]{animation:flash-green-33de2b22 .8s ease-in-out 3}@keyframes flash-green-33de2b22{0%,to{border-color:var(--color-border)}50%{border-color:#18a058;box-shadow:0 0 10px rgba(24,160,88,.3)}}.stat-box[data-v-c9229bb2]{margin-top:16px;width:100%;align-items:center;border-radius:8px;padding:16px;border:1px solid var(--color-border)}.stat-box[data-v-ea1dc392]{flex:1 1 0%;align-items:center;border-radius:8px;padding:20px;border:1px solid var(--color-border);background-color:var(--color-bg-1)} diff --git a/BTPanel/static/vite/css/index50.css b/BTPanel/static/vite/css/index50.css index f36a6055..3dd8f4cc 100644 --- a/BTPanel/static/vite/css/index50.css +++ b/BTPanel/static/vite/css/index50.css @@ -1 +1 @@ -.list[data-v-f20307d1]{cursor:pointer;padding:8px 16px;background:var(--app-soft-sort-bg)}.list[data-v-f20307d1]:hover{color:var(--app-soft-sort-hover-color);background:var(--app-soft-sort-active-bg)}.active[data-v-f20307d1]{--un-text-opacity:1;color:rgb(255 255 255 / var(--un-text-opacity));background:var(--app-soft-sort-active-bg)}.box[data-v-c3090a2b]{padding:16px;font-weight:600;color:var(--app-soft-pro-tips-text);background:var(--app-soft-pro-tips-bg);border:1px solid #d6e9c6;border-radius:4px} +.site-security-info .overview-title[data-v-41148346]{display:flex;align-items:center;justify-content:center;gap:10px;font-size:18px;font-weight:700;color:var(--color-text-base)}.site-security-info .overview-icon[data-v-41148346]{color:var(--color-text-base)}.site-security-info .feature-item[data-v-41148346]{display:flex;align-items:flex-start;gap:14px;min-width:0}.site-security-info .feature-icon[data-v-41148346]{flex:0 0 auto;font-size:38px;color:var(--color-primary)}.site-security-info .feature-title[data-v-41148346]{font-size:14px;font-weight:700;color:var(--color-text-base);line-height:1.4}.site-security-info .feature-desc[data-v-41148346]{margin-top:6px;font-size:12px;color:var(--color-text-3);line-height:1.4}.n-button[data-v-bb415a5d]{height:40px;padding:0 36px}.metric-item[data-v-0379de28]{position:relative;padding:24px;line-height:1}.metric-item .metric-label[data-v-0379de28]{margin-bottom:14px;font-weight:700;font-size:16px;color:var(--color-text-4)}.metric-item .metric-value[data-v-0379de28]{margin-bottom:14px;font-weight:700;font-size:20px}.metric-item .metric-value .metric-unit[data-v-0379de28]{font-size:14px}.metric-item .metric-desc[data-v-0379de28]{color:var(--color-text-3)}.metric-item .metric-icon[data-v-0379de28]{position:absolute;top:8px;right:12px;font-size:60px;color:#e9e9e9}.risk-list[data-v-59b580c0]{display:flex;flex-direction:column;gap:16px}.risk-card[data-v-59b580c0]{padding:16px;box-shadow:none}.risk-card__header[data-v-59b580c0]{display:flex;align-items:center;gap:12px}.risk-card__title[data-v-59b580c0]{line-height:1}.risk-card__title.is-low[data-v-59b580c0]{color:var(--color-warning)}.risk-card__title.is-warning[data-v-59b580c0]{color:#fc6d26}.risk-card__title.is-danger[data-v-59b580c0]{color:var(--color-error)}.risk-card__body[data-v-59b580c0]{margin-top:14px;padding:16px;background:var(--color-bg-4);border-radius:2px}.risk-row[data-v-59b580c0]{display:flex;gap:4px;line-height:1}.risk-row__label[data-v-59b580c0]{font-size:12px;font-weight:700;min-width:70px;text-align:right;white-space:nowrap;color:var(--color-text-base)}.risk-row__value[data-v-59b580c0]{font-size:12px;color:var(--color-text-3)}.risk-divider[data-v-59b580c0]{height:1px;margin:8px 0;background-color:var(--color-border)}.risk-empty[data-v-59b580c0]{display:flex;align-items:center;justify-content:center;padding-top:30px;padding-bottom:30px}.security-collapse[data-v-d4aef7d6]{--n-item-margin: 20px 0 0;--n-title-padding: 0;--n-arrow-color: var(--color-text-4)}.security-collapse[data-v-d4aef7d6] .n-collapse-item,.security-collapse[data-v-d4aef7d6] .n-collapse-item .n-collapse-item__header{border:none}.security-collapse[data-v-d4aef7d6] .n-collapse-item .n-collapse-item__header.n-collapse-item__header--active .n-collapse-item__header-main{border-bottom-left-radius:0;border-bottom-right-radius:0}.security-collapse[data-v-d4aef7d6] .n-collapse-item .n-collapse-item__header .n-collapse-item__header-main{width:100%;height:46px;padding:0 20px;background-color:var(--color-bg-4);border-radius:4px}.security-collapse[data-v-d4aef7d6] .n-collapse-item .n-collapse-item__header .n-collapse-item__header-main .n-collapse-item-arrow{margin-left:0}.security-collapse[data-v-d4aef7d6] .n-collapse-item .n-collapse-item__content-wrapper .n-collapse-item__content-inner{padding:10px 20px 20px;background-color:var(--color-bg-4);border-bottom-left-radius:4px;border-bottom-right-radius:4px}.security-collapse__header[data-v-d4aef7d6]{display:flex;align-items:center;width:100%}.security-collapse__left[data-v-d4aef7d6]{display:flex;align-items:center;gap:10px;width:60%;min-width:0}.security-collapse__left .security-collapse__icon[data-v-d4aef7d6]{flex:0 0 auto;font-size:20px;color:var(--color-text-3)}.security-collapse__left .security-collapse__title[data-v-d4aef7d6]{line-height:1;font-size:14px;font-weight:700;color:var(--color-text-base)}.security-collapse__status[data-v-d4aef7d6]{flex:1;font-size:14px}.security-collapse__expand[data-v-d4aef7d6]{margin-right:2px;color:var(--color-text-4)}.site-security-page[data-v-74f36d2b]{display:flex;flex-direction:column;gap:10px;max-width:1370px} diff --git a/BTPanel/static/vite/css/index51.css b/BTPanel/static/vite/css/index51.css index b74c4041..98523775 100644 --- a/BTPanel/static/vite/css/index51.css +++ b/BTPanel/static/vite/css/index51.css @@ -1 +1 @@ -.box[data-v-511c6003]{margin-top:16px;display:flex;align-items:center;padding:16px;--un-text-opacity:1;color:rgb(169 68 66 / var(--un-text-opacity));font-weight:600;background:var(--app-third-security-tip-bg);border:1px solid #ebccd1;border-radius:4px} +h3[data-v-89ebe7d8]{font-size:14px}.n-alert[data-v-be40dd88]{--n-color: var(--security-brute-force-tips-bg);--n-icon-color: #ef0808;--n-content-text-color: #ef0808} diff --git a/BTPanel/static/vite/css/index52.css b/BTPanel/static/vite/css/index52.css index 3fd1f77b..a542dabf 100644 --- a/BTPanel/static/vite/css/index52.css +++ b/BTPanel/static/vite/css/index52.css @@ -1 +1 @@ -.select-box[data-v-abfdb3c9]{margin-bottom:16px;padding:8px;flex-direction:column!important;border-radius:4px;border:1px solid #dddddd} +h3[data-v-6f78f08a]{font-size:14px} diff --git a/BTPanel/static/vite/css/index53.css b/BTPanel/static/vite/css/index53.css index 42327899..ac6cfa40 100644 --- a/BTPanel/static/vite/css/index53.css +++ b/BTPanel/static/vite/css/index53.css @@ -1 +1 @@ -.number-control[data-v-6756b8cd]{display:flex;align-items:center;flex-wrap:wrap}.number-control .minus[data-v-6756b8cd],.number-control .plus[data-v-6756b8cd]{width:35px;height:35px;border:2px solid var(--domains-business-ssl-buy-bg-border);border-radius:8px;position:relative;cursor:pointer}.number-control .minus.is-disable[data-v-6756b8cd],.number-control .plus.is-disable[data-v-6756b8cd]{background:var(--domains-business-ssl-count-disable);border-color:var(--domains-lets-ssl-upload-border);cursor:not-allowed}.number-control .minus[data-v-6756b8cd]:before,.number-control .minus[data-v-6756b8cd]:after,.number-control .plus[data-v-6756b8cd]:before,.number-control .plus[data-v-6756b8cd]:after{content:"";position:absolute;background:#555}.number-control .minus[data-v-6756b8cd]:hover,.number-control .plus[data-v-6756b8cd]:hover{--un-bg-opacity:1;background-color:rgb(32 165 58 / var(--un-bg-opacity));--un-text-opacity:1;color:rgb(255 255 255 / var(--un-text-opacity))}.number-control .minus[data-v-6756b8cd]:hover:before,.number-control .minus[data-v-6756b8cd]:hover:after,.number-control .plus[data-v-6756b8cd]:hover:before,.number-control .plus[data-v-6756b8cd]:hover:after{background:#fff}.number-control .minus[data-v-6756b8cd]:before{width:14px;height:2px;top:50%;left:50%;transform:translate(-50%,-50%)}.number-control .plus[data-v-6756b8cd]:before{width:14px;height:2px}.number-control .plus[data-v-6756b8cd]:after{width:2px;height:14px}.number-control .plus[data-v-6756b8cd]:before,.number-control .plus[data-v-6756b8cd]:after{position:absolute;top:50%;left:50%;transform:translate(-50%,-50%)}.number-control .number-input[data-v-6756b8cd]{background:var(--domains-business-ssl-buy-bg);margin-left:2px;margin-right:2px;width:50px;height:35px;text-align:center;--un-text-opacity:1;color:rgb(32 165 58 / var(--un-text-opacity));border:2px solid #20a53a;border-radius:8px}.total-price[data-v-a0b5b610]{height:110px;align-items:center;padding-left:20px;padding-right:20px;box-shadow:0 0 10px rgba(184,184,184,.25)}.option-item[data-v-9bf6398d]{position:relative;cursor:pointer;padding-left:20px;padding-right:20px;text-align:center;line-height:32px;border:2px solid var(--domains-business-ssl-buy-bg-border);border-radius:8px}.option-item.is-active[data-v-9bf6398d]{background:var(--domains-business-ssl-buy-bg);border-width:2px;--un-border-opacity:1;border-color:rgb(32 165 58 / var(--un-border-opacity))}.option-item.is-active[data-v-9bf6398d]:after{content:"";position:absolute;right:-2px;bottom:-1px;border-left:25px solid transparent;border-bottom:25px solid #20a53a;border-radius:8px}.option-item.is-active[data-v-9bf6398d]:before{content:"";position:absolute;right:0;bottom:5px;width:12px;height:6px;border-bottom:2px solid #fff;border-left:2px solid #fff;transform:rotate(-45deg);z-index:1}.option-item .item-title[data-v-9bf6398d]{margin:0 10px;font-weight:700;border-bottom:1px solid var(--domains-business-ssl-buy-bg-border)}.option-item .item-tag[data-v-9bf6398d]{position:absolute;right:-2px;top:-10px;--un-bg-opacity:1;background-color:rgb(255 96 0 / var(--un-bg-opacity));padding:2px 6px;--un-text-opacity:1;color:rgb(255 255 255 / var(--un-text-opacity));line-height:15px;border-radius:0 9px}.n-alert[data-v-9bf6398d]{--n-content-text-color: #db2828;--n-icon-color: #db2828;--n-color: #fbeaea} +.ul-style[data-v-f9cef105]{margin:0 auto;display:flex;align-items:center;justify-content:center;gap:48px;font-size:16px}.ul-style li[data-v-f9cef105]{display:flex;align-items:center}.item[data-v-f9cef105]{border-left:3px solid #def2e2}.item li[data-v-f9cef105]{width:180px;margin-left:-3px;font-size:14px;line-height:36px;padding:0 20px;cursor:pointer}.item .active[data-v-f9cef105]{border-left:3px solid #20a53a;color:#20a53a;font-weight:700;font-size:16px} diff --git a/BTPanel/static/vite/css/index54.css b/BTPanel/static/vite/css/index54.css index ac634cae..ca7aa22f 100644 --- a/BTPanel/static/vite/css/index54.css +++ b/BTPanel/static/vite/css/index54.css @@ -1 +1 @@ -.head[data-v-48cd70b1]{background:var(--terminal-head-bg);position:relative;height:40px;align-items:center}.head .item[data-v-48cd70b1]{width:160px;height:100%;display:flex;cursor:pointer;align-items:center;justify-content:space-between;padding-left:8px;padding-right:8px;border-right:1px solid rgb(231,225,225)}.head .item .close-terminal[data-v-48cd70b1]{--un-text-opacity:1;color:rgb(239 8 8 / var(--un-text-opacity))}.head .item .close-terminal[data-v-48cd70b1]:hover{background:var(--terminal-head-item-close-hover)}.head .item .text[data-v-48cd70b1]{overflow:hidden;white-space:nowrap;text-overflow:ellipsis}.head .item .icon[data-v-48cd70b1]{margin-right:5px;width:10px;height:10px;--un-bg-opacity:1;background-color:rgb(32 165 58 / var(--un-bg-opacity));display:inline-block;border-radius:50%}.head .item .icon-active[data-v-48cd70b1]{--un-bg-opacity:1;background-color:rgb(247 11 60 / var(--un-bg-opacity))}.head .item[data-v-48cd70b1]:hover{background:var(--terminal-head-item-hover)}.head .item-active[data-v-48cd70b1]{--un-text-opacity:1;color:rgb(255 255 255 / var(--un-text-opacity));background:#424242!important}.head .add-terminal[data-v-48cd70b1]{width:40px;height:40px;text-align:center;line-height:50px}.head .add-terminal[data-v-48cd70b1]:hover{--un-bg-opacity:1;background-color:rgb(204 204 204 / var(--un-bg-opacity))}.context-menu[data-v-48cd70b1]{position:fixed;z-index:9999;--un-bg-opacity:1;background-color:rgb(255 255 255 / var(--un-bg-opacity));--un-text-opacity:1;color:rgb(102 102 102 / var(--un-text-opacity));border-radius:5px;box-shadow:0 2px 12px rgba(0,0,0,.1)}.context-menu ul[data-v-48cd70b1]{width:150px;padding-top:5px;padding-bottom:5px;list-style:none}.context-menu ul li[data-v-48cd70b1]{cursor:pointer;padding:8px 10px}.context-menu ul li[data-v-48cd70b1]:hover{--un-bg-opacity:1;background-color:rgb(231 245 233 / var(--un-bg-opacity));--un-text-opacity:1;color:rgb(29 149 52 / var(--un-text-opacity))}.terminal[data-v-79cb6909]{position:relative;height:100%}.terminal-contract-tool[data-v-79cb6909]{position:absolute;right:0;top:50%;z-index:50;height:4rem;width:2rem;display:flex;cursor:pointer;align-items:center;justify-content:center;border-bottom-left-radius:9999px;border-top-left-radius:9999px;--un-bg-opacity:1;background-color:rgb(55 65 81 / var(--un-bg-opacity));background-color:#555;transform:translateY(-50%)}.terminal-contract-tool[data-v-79cb6909]:after{content:"";--un-border-opacity:1;border-color:rgb(255 255 255 / var(--un-border-opacity));border:2px solid rgb(255,255,255);transform:rotate(45deg);border-left-width:0;border-bottom-width:0;height:1rem;width:1rem}.terminal-contract-tool[data-v-79cb6909]:hover{--un-bg-opacity:1;background-color:rgb(107 114 128 / var(--un-bg-opacity))}.active[data-v-79cb6909]:after{transform:rotate(-135deg)!important}.box[data-v-57762b9d]{height:calc(100vh - 52px)} +.form[data-v-201446e2] .n-form-item{margin-right:5px!important}.form[data-v-201446e2] .n-form-item-label{width:auto!important;padding:5px!important}.ul-style[data-v-f55518e2]{margin:0 auto;display:flex;align-items:center;justify-content:center;gap:48px;font-size:16px}.ul-style li[data-v-f55518e2]{display:flex;align-items:center}.item[data-v-f55518e2]{border-left:3px solid #def2e2}.item li[data-v-f55518e2]{width:180px;margin-left:-3px;font-size:14px;line-height:36px;padding:0 20px;cursor:pointer}.item .active[data-v-f55518e2]{border-left:3px solid #20a53a;color:#20a53a;font-weight:700;font-size:16px} diff --git a/BTPanel/static/vite/css/index55.css b/BTPanel/static/vite/css/index55.css index 607e38b8..f36a6055 100644 --- a/BTPanel/static/vite/css/index55.css +++ b/BTPanel/static/vite/css/index55.css @@ -1 +1 @@ -.iframePage[data-v-dd081d53]{position:fixed;left:0;right:0;top:0;bottom:0;z-index:996;width:100%;height:100%;border-style:none} +.list[data-v-f20307d1]{cursor:pointer;padding:8px 16px;background:var(--app-soft-sort-bg)}.list[data-v-f20307d1]:hover{color:var(--app-soft-sort-hover-color);background:var(--app-soft-sort-active-bg)}.active[data-v-f20307d1]{--un-text-opacity:1;color:rgb(255 255 255 / var(--un-text-opacity));background:var(--app-soft-sort-active-bg)}.box[data-v-c3090a2b]{padding:16px;font-weight:600;color:var(--app-soft-pro-tips-text);background:var(--app-soft-pro-tips-bg);border:1px solid #d6e9c6;border-radius:4px} diff --git a/BTPanel/static/vite/css/index56.css b/BTPanel/static/vite/css/index56.css index 32f1313a..b74c4041 100644 --- a/BTPanel/static/vite/css/index56.css +++ b/BTPanel/static/vite/css/index56.css @@ -1 +1 @@ -.wap-card[data-v-ff288151]{--n-border-radius: 6px;--n-title-font-size: 14px;--n-title-text-color: var(--color-text-4);box-shadow:0 1px 3px 1px rgba(0,0,0,.05)}.wap-card[data-v-ff288151] .n-card-header{height:50px;padding:0 16px}.wap-card[data-v-ff288151] .n-card-header .n-card-header__main{display:flex;align-items:center;font-weight:700}.bt-radio[data-v-e100fb9e] .n-radio-button:last-child{border-right:none;border-top-right-radius:0;border-bottom-right-radius:0}.bt-date-picker[data-v-e100fb9e]{width:120px}.bt-date-picker[data-v-e100fb9e] .n-input{border-top-left-radius:0;border-bottom-left-radius:0}.refresh-progress[data-v-cdf03241]{width:28px;cursor:pointer}.wap-card[data-v-d7e87a24]{--wap-card-icon: url(/static/vite/images/today-new.svg);--wap-card-color: var(--color-primary);height:100%;padding:20px}.wap-card.request[data-v-d7e87a24]{--wap-card-color: var(--color-primary)}.wap-card.malicious-request[data-v-d7e87a24]{--wap-card-color: var(--color-error)}.wap-card .card-bg[data-v-d7e87a24]{position:absolute;right:0;bottom:0;display:flex;justify-content:flex-end;align-items:flex-end;height:80px;font-size:80px;color:var(--color-text-3);opacity:.3;z-index:0}.wap-card .card-title[data-v-d7e87a24]{display:flex;align-items:center;font-size:14px;color:var(--color-text-4)}.wap-card .card-title[data-v-d7e87a24]:before{content:"";display:block;width:4px;height:14px;border-radius:2px;margin-right:8px;background-color:var(--wap-card-color)}.wap-card .card-value[data-v-d7e87a24]{position:relative;margin-top:14px;margin-bottom:6px;font-size:28px;font-weight:700;color:var(--color-text-5);font-family:Microsoft YaHei,sans-serif;z-index:1}.wap-card .card-trend[data-v-d7e87a24]{position:relative;display:flex;align-items:center;color:var(--wap-card-color);font-family:Microsoft YaHei,sans-serif;z-index:1}.wap-card .card-yesterday[data-v-d7e87a24]{position:relative;margin-top:8px;color:var(--color-text-4);z-index:1}.rank-list[data-v-ba455d5c]{display:flex;flex-direction:column;gap:8px}.rank-item[data-v-ba455d5c]{display:flex;align-items:center}.rank-item .rank-num[data-v-ba455d5c]{width:24px;height:24px;line-height:24px;margin-right:16px;border-radius:50%;color:#fff;text-align:center;font-size:12px;font-weight:700}.rank-item .rank-title[data-v-ba455d5c]{width:110px;margin-right:20px;font-size:13px;color:var(--color-text-5)}.rank-item .rank-value[data-v-ba455d5c]{text-align:right;font-size:13px;color:var(--color-text-5)} +.box[data-v-511c6003]{margin-top:16px;display:flex;align-items:center;padding:16px;--un-text-opacity:1;color:rgb(169 68 66 / var(--un-text-opacity));font-weight:600;background:var(--app-third-security-tip-bg);border:1px solid #ebccd1;border-radius:4px} diff --git a/BTPanel/static/vite/css/index57.css b/BTPanel/static/vite/css/index57.css index 4dcd42cb..3fd1f77b 100644 --- a/BTPanel/static/vite/css/index57.css +++ b/BTPanel/static/vite/css/index57.css @@ -1 +1 @@ -.bt-radio[data-v-bf5d25af] .n-radio-button:last-child{border-right:none;border-top-right-radius:0;border-bottom-right-radius:0}.bt-date-picker[data-v-bf5d25af] .n-input{border-top-left-radius:0;border-bottom-left-radius:0} +.select-box[data-v-abfdb3c9]{margin-bottom:16px;padding:8px;flex-direction:column!important;border-radius:4px;border:1px solid #dddddd} diff --git a/BTPanel/static/vite/css/index58.css b/BTPanel/static/vite/css/index58.css index c70c4007..42327899 100644 --- a/BTPanel/static/vite/css/index58.css +++ b/BTPanel/static/vite/css/index58.css @@ -1 +1 @@ -.n-select[data-v-5842887f] .n-base-selection-tag-wrapper{padding:0 0 3px}.form-title[data-v-c86a897c]{margin-bottom:20px;font-size:16px} +.number-control[data-v-6756b8cd]{display:flex;align-items:center;flex-wrap:wrap}.number-control .minus[data-v-6756b8cd],.number-control .plus[data-v-6756b8cd]{width:35px;height:35px;border:2px solid var(--domains-business-ssl-buy-bg-border);border-radius:8px;position:relative;cursor:pointer}.number-control .minus.is-disable[data-v-6756b8cd],.number-control .plus.is-disable[data-v-6756b8cd]{background:var(--domains-business-ssl-count-disable);border-color:var(--domains-lets-ssl-upload-border);cursor:not-allowed}.number-control .minus[data-v-6756b8cd]:before,.number-control .minus[data-v-6756b8cd]:after,.number-control .plus[data-v-6756b8cd]:before,.number-control .plus[data-v-6756b8cd]:after{content:"";position:absolute;background:#555}.number-control .minus[data-v-6756b8cd]:hover,.number-control .plus[data-v-6756b8cd]:hover{--un-bg-opacity:1;background-color:rgb(32 165 58 / var(--un-bg-opacity));--un-text-opacity:1;color:rgb(255 255 255 / var(--un-text-opacity))}.number-control .minus[data-v-6756b8cd]:hover:before,.number-control .minus[data-v-6756b8cd]:hover:after,.number-control .plus[data-v-6756b8cd]:hover:before,.number-control .plus[data-v-6756b8cd]:hover:after{background:#fff}.number-control .minus[data-v-6756b8cd]:before{width:14px;height:2px;top:50%;left:50%;transform:translate(-50%,-50%)}.number-control .plus[data-v-6756b8cd]:before{width:14px;height:2px}.number-control .plus[data-v-6756b8cd]:after{width:2px;height:14px}.number-control .plus[data-v-6756b8cd]:before,.number-control .plus[data-v-6756b8cd]:after{position:absolute;top:50%;left:50%;transform:translate(-50%,-50%)}.number-control .number-input[data-v-6756b8cd]{background:var(--domains-business-ssl-buy-bg);margin-left:2px;margin-right:2px;width:50px;height:35px;text-align:center;--un-text-opacity:1;color:rgb(32 165 58 / var(--un-text-opacity));border:2px solid #20a53a;border-radius:8px}.total-price[data-v-a0b5b610]{height:110px;align-items:center;padding-left:20px;padding-right:20px;box-shadow:0 0 10px rgba(184,184,184,.25)}.option-item[data-v-9bf6398d]{position:relative;cursor:pointer;padding-left:20px;padding-right:20px;text-align:center;line-height:32px;border:2px solid var(--domains-business-ssl-buy-bg-border);border-radius:8px}.option-item.is-active[data-v-9bf6398d]{background:var(--domains-business-ssl-buy-bg);border-width:2px;--un-border-opacity:1;border-color:rgb(32 165 58 / var(--un-border-opacity))}.option-item.is-active[data-v-9bf6398d]:after{content:"";position:absolute;right:-2px;bottom:-1px;border-left:25px solid transparent;border-bottom:25px solid #20a53a;border-radius:8px}.option-item.is-active[data-v-9bf6398d]:before{content:"";position:absolute;right:0;bottom:5px;width:12px;height:6px;border-bottom:2px solid #fff;border-left:2px solid #fff;transform:rotate(-45deg);z-index:1}.option-item .item-title[data-v-9bf6398d]{margin:0 10px;font-weight:700;border-bottom:1px solid var(--domains-business-ssl-buy-bg-border)}.option-item .item-tag[data-v-9bf6398d]{position:absolute;right:-2px;top:-10px;--un-bg-opacity:1;background-color:rgb(255 96 0 / var(--un-bg-opacity));padding:2px 6px;--un-text-opacity:1;color:rgb(255 255 255 / var(--un-text-opacity));line-height:15px;border-radius:0 9px}.n-alert[data-v-9bf6398d]{--n-content-text-color: #db2828;--n-icon-color: #db2828;--n-color: #fbeaea} diff --git a/BTPanel/static/vite/css/index59.css b/BTPanel/static/vite/css/index59.css index 67d769ba..ac634cae 100644 --- a/BTPanel/static/vite/css/index59.css +++ b/BTPanel/static/vite/css/index59.css @@ -1 +1 @@ -.leaflet-pane,.leaflet-tile,.leaflet-marker-icon,.leaflet-marker-shadow,.leaflet-tile-container,.leaflet-pane>svg,.leaflet-pane>canvas,.leaflet-zoom-box,.leaflet-image-layer,.leaflet-layer{position:absolute;left:0;top:0}.leaflet-container{overflow:hidden}.leaflet-tile,.leaflet-marker-icon,.leaflet-marker-shadow{-webkit-user-select:none;-moz-user-select:none;user-select:none;-webkit-user-drag:none}.leaflet-tile::selection{background:transparent}.leaflet-safari .leaflet-tile{image-rendering:-webkit-optimize-contrast}.leaflet-safari .leaflet-tile-container{width:1600px;height:1600px;-webkit-transform-origin:0 0}.leaflet-marker-icon,.leaflet-marker-shadow{display:block}.leaflet-container .leaflet-overlay-pane svg{max-width:none!important;max-height:none!important}.leaflet-container .leaflet-marker-pane img,.leaflet-container .leaflet-shadow-pane img,.leaflet-container .leaflet-tile-pane img,.leaflet-container img.leaflet-image-layer,.leaflet-container .leaflet-tile{max-width:none!important;max-height:none!important;width:auto;padding:0}.leaflet-container img.leaflet-tile{mix-blend-mode:plus-lighter}.leaflet-container.leaflet-touch-zoom{-ms-touch-action:pan-x pan-y;touch-action:pan-x pan-y}.leaflet-container.leaflet-touch-drag{-ms-touch-action:pinch-zoom;touch-action:none;touch-action:pinch-zoom}.leaflet-container.leaflet-touch-drag.leaflet-touch-zoom{-ms-touch-action:none;touch-action:none}.leaflet-container{-webkit-tap-highlight-color:transparent}.leaflet-container a{-webkit-tap-highlight-color:rgba(51,181,229,.4)}.leaflet-tile{filter:inherit;visibility:hidden}.leaflet-tile-loaded{visibility:inherit}.leaflet-zoom-box{width:0;height:0;-moz-box-sizing:border-box;box-sizing:border-box;z-index:800}.leaflet-overlay-pane svg{-moz-user-select:none}.leaflet-pane{z-index:400}.leaflet-tile-pane{z-index:200}.leaflet-overlay-pane{z-index:400}.leaflet-shadow-pane{z-index:500}.leaflet-marker-pane{z-index:600}.leaflet-tooltip-pane{z-index:650}.leaflet-popup-pane{z-index:700}.leaflet-map-pane canvas{z-index:100}.leaflet-map-pane svg{z-index:200}.leaflet-vml-shape{width:1px;height:1px}.lvml{behavior:url(#default#VML);display:inline-block;position:absolute}.leaflet-control{position:relative;z-index:800;pointer-events:visiblePainted;pointer-events:auto}.leaflet-top,.leaflet-bottom{position:absolute;z-index:1000;pointer-events:none}.leaflet-top{top:0}.leaflet-right{right:0}.leaflet-bottom{bottom:0}.leaflet-left{left:0}.leaflet-control{float:left;clear:both}.leaflet-right .leaflet-control{float:right}.leaflet-top .leaflet-control{margin-top:10px}.leaflet-bottom .leaflet-control{margin-bottom:10px}.leaflet-left .leaflet-control{margin-left:10px}.leaflet-right .leaflet-control{margin-right:10px}.leaflet-fade-anim .leaflet-popup{opacity:0;-webkit-transition:opacity .2s linear;-moz-transition:opacity .2s linear;transition:opacity .2s linear}.leaflet-fade-anim .leaflet-map-pane .leaflet-popup{opacity:1}.leaflet-zoom-animated{-webkit-transform-origin:0 0;-ms-transform-origin:0 0;transform-origin:0 0}svg.leaflet-zoom-animated{will-change:transform}.leaflet-zoom-anim .leaflet-zoom-animated{-webkit-transition:-webkit-transform .25s cubic-bezier(0,0,.25,1);-moz-transition:-moz-transform .25s cubic-bezier(0,0,.25,1);transition:transform .25s cubic-bezier(0,0,.25,1)}.leaflet-zoom-anim .leaflet-tile,.leaflet-pan-anim .leaflet-tile{-webkit-transition:none;-moz-transition:none;transition:none}.leaflet-zoom-anim .leaflet-zoom-hide{visibility:hidden}.leaflet-interactive{cursor:pointer}.leaflet-grab{cursor:-webkit-grab;cursor:-moz-grab;cursor:grab}.leaflet-crosshair,.leaflet-crosshair .leaflet-interactive{cursor:crosshair}.leaflet-popup-pane,.leaflet-control{cursor:auto}.leaflet-dragging .leaflet-grab,.leaflet-dragging .leaflet-grab .leaflet-interactive,.leaflet-dragging .leaflet-marker-draggable{cursor:move;cursor:-webkit-grabbing;cursor:-moz-grabbing;cursor:grabbing}.leaflet-marker-icon,.leaflet-marker-shadow,.leaflet-image-layer,.leaflet-pane>svg path,.leaflet-tile-container{pointer-events:none}.leaflet-marker-icon.leaflet-interactive,.leaflet-image-layer.leaflet-interactive,.leaflet-pane>svg path.leaflet-interactive,svg.leaflet-image-layer.leaflet-interactive path{pointer-events:visiblePainted;pointer-events:auto}.leaflet-container{background:#ddd;outline-offset:1px}.leaflet-container a{color:#0078a8}.leaflet-zoom-box{border:2px dotted #38f;background:rgba(255,255,255,.5)}.leaflet-container{font-family:Helvetica Neue,Arial,Helvetica,sans-serif;font-size:12px;font-size:.75rem;line-height:1.5}.leaflet-bar{box-shadow:0 1px 5px rgba(0,0,0,.65);border-radius:4px}.leaflet-bar a{background-color:#fff;border-bottom:1px solid #ccc;width:26px;height:26px;line-height:26px;display:block;text-align:center;text-decoration:none;color:#000}.leaflet-bar a,.leaflet-control-layers-toggle{background-position:50% 50%;background-repeat:no-repeat;display:block}.leaflet-bar a:hover,.leaflet-bar a:focus{background-color:#f4f4f4}.leaflet-bar a:first-child{border-top-left-radius:4px;border-top-right-radius:4px}.leaflet-bar a:last-child{border-bottom-left-radius:4px;border-bottom-right-radius:4px;border-bottom:none}.leaflet-bar a.leaflet-disabled{cursor:default;background-color:#f4f4f4;color:#bbb}.leaflet-touch .leaflet-bar a{width:30px;height:30px;line-height:30px}.leaflet-touch .leaflet-bar a:first-child{border-top-left-radius:2px;border-top-right-radius:2px}.leaflet-touch .leaflet-bar a:last-child{border-bottom-left-radius:2px;border-bottom-right-radius:2px}.leaflet-control-zoom-in,.leaflet-control-zoom-out{font:700 18px Lucida Console,Monaco,monospace;text-indent:1px}.leaflet-touch .leaflet-control-zoom-in,.leaflet-touch .leaflet-control-zoom-out{font-size:22px}.leaflet-control-layers{box-shadow:0 1px 5px rgba(0,0,0,.4);background:#fff;border-radius:5px}.leaflet-control-layers-toggle{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABoAAAAaCAQAAAADQ4RFAAACf0lEQVR4AY1UM3gkARTePdvdoTxXKc+qTl3aU5U6b2Kbkz3Gtq3Zw6ziLGNPzrYx7946Tr6/ee/XeCQ4D3ykPtL5tHno4n0d/h3+xfuWHGLX81cn7r0iTNzjr7LrlxCqPtkbTQEHeqOrTy4Yyt3VCi/IOB0v7rVC7q45Q3Gr5K6jt+3Gl5nCoDD4MtO+j96Wu8atmhGqcNGHObuf8OM/x3AMx38+4Z2sPqzCxRFK2aF2e5Jol56XTLyggAMTL56XOMoS1W4pOyjUcGGQdZxU6qRh7B9Zp+PfpOFlqt0zyDZckPi1ttmIp03jX8gyJ8a/PG2yutpS/Vol7peZIbZcKBAEEheEIAgFbDkz5H6Zrkm2hVWGiXKiF4Ycw0RWKdtC16Q7qe3X4iOMxruonzegJzWaXFrU9utOSsLUmrc0YjeWYjCW4PDMADElpJSSQ0vQvA1Tm6/JlKnqFs1EGyZiFCqnRZTEJJJiKRYzVYzJck2Rm6P4iH+cmSY0YzimYa8l0EtTODFWhcMIMVqdsI2uiTvKmTisIDHJ3od5GILVhBCarCfVRmo4uTjkhrhzkiBV7SsaqS+TzrzM1qpGGUFt28pIySQHR6h7F6KSwGWm97ay+Z+ZqMcEjEWebE7wxCSQwpkhJqoZA5ivCdZDjJepuJ9IQjGGUmuXJdBFUygxVqVsxFsLMbDe8ZbDYVCGKxs+W080max1hFCarCfV+C1KATwcnvE9gRRuMP2prdbWGowm1KB1y+zwMMENkM755cJ2yPDtqhTI6ED1M/82yIDtC/4j4BijjeObflpO9I9MwXTCsSX8jWAFeHr05WoLTJ5G8IQVS/7vwR6ohirYM7f6HzYpogfS3R2OAAAAAElFTkSuQmCC);width:36px;height:36px}.leaflet-retina .leaflet-control-layers-toggle{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADQAAAA0CAQAAABvcdNgAAAEsklEQVR4AWL4TydIhpZK1kpWOlg0w3ZXP6D2soBtG42jeI6ZmQTHzAxiTbSJsYLjO9HhP+WOmcuhciVnmHVQcJnp7DFvScowZorad/+V/fVzMdMT2g9Cv9guXGv/7pYOrXh2U+RRR3dSd9JRx6bIFc/ekqHI29JC6pJ5ZEh1yWkhkbcFeSjxgx3L2m1cb1C7bceyxA+CNjT/Ifff+/kDk2u/w/33/IeCMOSaWZ4glosqT3DNnNZQ7Cs58/3Ce5HL78iZH/vKVIaYlqzfdLu8Vi7dnvUbEza5Idt36tquZFldl6N5Z/POLof0XLK61mZCmJSWjVF9tEjUluu74IUXvgttuVIHE7YxSkaYhJZam7yiM9Pv82JYfl9nptxZaxMJE4YSPty+vF0+Y2up9d3wwijfjZbabqm/3bZ9ecKHsiGmRflnn1MW4pjHf9oLufyn2z3y1D6n8g8TZhxyzipLNPnAUpsOiuWimg52psrTZYnOWYNDTMuWBWa0tJb4rgq1UvmutpaYEbZlwU3CLJm/ayYjHW5/h7xWLn9Hh1vepDkyf7dE7MtT5LR4e7yYpHrkhOUpEfssBLq2pPhAqoSWKUkk7EDqkmK6RrCEzqDjhNDWNE+XSMvkJRDWlZTmCW0l0PHQGRZY5t1L83kT0Y3l2SItk5JAWHl2dCOBm+fPu3fo5/3v61RMCO9Jx2EEYYhb0rmNQMX/vm7gqOEJLcXTGw3CAuRNeyaPWwjR8PRqKQ1PDA/dpv+on9Shox52WFnx0KY8onHayrJzm87i5h9xGw/tfkev0jGsQizqezUKjk12hBMKJ4kbCqGPVNXudyyrShovGw5CgxsRICxF6aRmSjlBnHRzg7Gx8fKqEubI2rahQYdR1YgDIRQO7JvQyD52hoIQx0mxa0ODtW2Iozn1le2iIRdzwWewedyZzewidueOGqlsn1MvcnQpuVwLGG3/IR1hIKxCjelIDZ8ldqWz25jWAsnldEnK0Zxro19TGVb2ffIZEsIO89EIEDvKMPrzmBOQcKQ+rroye6NgRRxqR4U8EAkz0CL6uSGOm6KQCdWjvjRiSP1BPalCRS5iQYiEIvxuBMJEWgzSoHADcVMuN7IuqqTeyUPq22qFimFtxDyBBJEwNyt6TM88blFHao/6tWWhuuOM4SAK4EI4QmFHA+SEyWlp4EQoJ13cYGzMu7yszEIBOm2rVmHUNqwAIQabISNMRstmdhNWcFLsSm+0tjJH1MdRxO5Nx0WDMhCtgD6OKgZeljJqJKc9po8juskR9XN0Y1lZ3mWjLR9JCO1jRDMd0fpYC2VnvjBSEFg7wBENc0R9HFlb0xvF1+TBEpF68d+DHR6IOWVv2BECtxo46hOFUBd/APU57WIoEwJhIi2CdpyZX0m93BZicktMj1AS9dClteUFAUNUIEygRZCtik5zSxI9MubTBH1GOiHsiLJ3OCoSZkILa9PxiN0EbvhsAo8tdAf9Seepd36lGWHmtNANTv5Jd0z4QYyeo/UEJqxKRpg5LZx6btLPsOaEmdMyxYdlc8LMaJnikDlhclqmPiQnTEpLUIZEwkRagjYkEibQErwhkTAKCLQEbUgkzJQWc/0PstHHcfEdQ+UAAAAASUVORK5CYII=);background-size:26px 26px}.leaflet-touch .leaflet-control-layers-toggle{width:44px;height:44px}.leaflet-control-layers .leaflet-control-layers-list,.leaflet-control-layers-expanded .leaflet-control-layers-toggle{display:none}.leaflet-control-layers-expanded .leaflet-control-layers-list{display:block;position:relative}.leaflet-control-layers-expanded{padding:6px 10px 6px 6px;color:#333;background:#fff}.leaflet-control-layers-scrollbar{overflow-y:scroll;overflow-x:hidden;padding-right:5px}.leaflet-control-layers-selector{margin-top:2px;position:relative;top:1px}.leaflet-control-layers label{display:block;font-size:13px;font-size:1.08333em}.leaflet-control-layers-separator{height:0;border-top:1px solid #ddd;margin:5px -10px 5px -6px}.leaflet-default-icon-path{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABkAAAApCAYAAADAk4LOAAAFgUlEQVR4Aa1XA5BjWRTN2oW17d3YaZtr2962HUzbDNpjszW24mRt28p47v7zq/bXZtrp/lWnXr337j3nPCe85NcypgSFdugCpW5YoDAMRaIMqRi6aKq5E3YqDQO3qAwjVWrD8Ncq/RBpykd8oZUb/kaJutow8r1aP9II0WmLKLIsJyv1w/kqw9Ch2MYdB++12Onxee/QMwvf4/Dk/Lfp/i4nxTXtOoQ4pW5Aj7wpici1A9erdAN2OH64x8OSP9j3Ft3b7aWkTg/Fm91siTra0f9on5sQr9INejH6CUUUpavjFNq1B+Oadhxmnfa8RfEmN8VNAsQhPqF55xHkMzz3jSmChWU6f7/XZKNH+9+hBLOHYozuKQPxyMPUKkrX/K0uWnfFaJGS1QPRtZsOPtr3NsW0uyh6NNCOkU3Yz+bXbT3I8G3xE5EXLXtCXbbqwCO9zPQYPRTZ5vIDXD7U+w7rFDEoUUf7ibHIR4y6bLVPXrz8JVZEql13trxwue/uDivd3fkWRbS6/IA2bID4uk0UpF1N8qLlbBlXs4Ee7HLTfV1j54APvODnSfOWBqtKVvjgLKzF5YdEk5ewRkGlK0i33Eofffc7HT56jD7/6U+qH3Cx7SBLNntH5YIPvODnyfIXZYRVDPqgHtLs5ABHD3YzLuespb7t79FY34DjMwrVrcTuwlT55YMPvOBnRrJ4VXTdNnYug5ucHLBjEpt30701A3Ts+HEa73u6dT3FNWwflY86eMHPk+Yu+i6pzUpRrW7SNDg5JHR4KapmM5Wv2E8Tfcb1HoqqHMHU+uWDD7zg54mz5/2BSnizi9T1Dg4QQXLToGNCkb6tb1NU+QAlGr1++eADrzhn/u8Q2YZhQVlZ5+CAOtqfbhmaUCS1ezNFVm2imDbPmPng5wmz+gwh+oHDce0eUtQ6OGDIyR0uUhUsoO3vfDmmgOezH0mZN59x7MBi++WDL1g/eEiU3avlidO671bkLfwbw5XV2P8Pzo0ydy4t2/0eu33xYSOMOD8hTf4CrBtGMSoXfPLchX+J0ruSePw3LZeK0juPJbYzrhkH0io7B3k164hiGvawhOKMLkrQLyVpZg8rHFW7E2uHOL888IBPlNZ1FPzstSJM694fWr6RwpvcJK60+0HCILTBzZLFNdtAzJaohze60T8qBzyh5ZuOg5e7uwQppofEmf2++DYvmySqGBuKaicF1blQjhuHdvCIMvp8whTTfZzI7RldpwtSzL+F1+wkdZ2TBOW2gIF88PBTzD/gpeREAMEbxnJcaJHNHrpzji0gQCS6hdkEeYt9DF/2qPcEC8RM28Hwmr3sdNyht00byAut2k3gufWNtgtOEOFGUwcXWNDbdNbpgBGxEvKkOQsxivJx33iow0Vw5S6SVTrpVq11ysA2Rp7gTfPfktc6zhtXBBC+adRLshf6sG2RfHPZ5EAc4sVZ83yCN00Fk/4kggu40ZTvIEm5g24qtU4KjBrx/BTTH8ifVASAG7gKrnWxJDcU7x8X6Ecczhm3o6YicvsLXWfh3Ch1W0k8x0nXF+0fFxgt4phz8QvypiwCCFKMqXCnqXExjq10beH+UUA7+nG6mdG/Pu0f3LgFcGrl2s0kNNjpmoJ9o4B29CMO8dMT4Q5ox8uitF6fqsrJOr8qnwNbRzv6hSnG5wP+64C7h9lp30hKNtKdWjtdkbuPA19nJ7Tz3zR/ibgARbhb4AlhavcBebmTHcFl2fvYEnW0ox9xMxKBS8btJ+KiEbq9zA4RthQXDhPa0T9TEe69gWupwc6uBUphquXgf+/FrIjweHQS4/pduMe5ERUMHUd9xv8ZR98CxkS4F2n3EUrUZ10EYNw7BWm9x1GiPssi3GgiGRDKWRYZfXlON+dfNbM+GgIwYdwAAAAASUVORK5CYII=)}.leaflet-container .leaflet-control-attribution{background:#fff;background:rgba(255,255,255,.8);margin:0}.leaflet-control-attribution,.leaflet-control-scale-line{padding:0 5px;color:#333;line-height:1.4}.leaflet-control-attribution a{text-decoration:none}.leaflet-control-attribution a:hover,.leaflet-control-attribution a:focus{text-decoration:underline}.leaflet-attribution-flag{display:inline!important;vertical-align:baseline!important;width:1em;height:.6669em}.leaflet-left .leaflet-control-scale{margin-left:5px}.leaflet-bottom .leaflet-control-scale{margin-bottom:5px}.leaflet-control-scale-line{border:2px solid #777;border-top:none;line-height:1.1;padding:2px 5px 1px;white-space:nowrap;-moz-box-sizing:border-box;box-sizing:border-box;background:rgba(255,255,255,.8);text-shadow:1px 1px #fff}.leaflet-control-scale-line:not(:first-child){border-top:2px solid #777;border-bottom:none;margin-top:-2px}.leaflet-control-scale-line:not(:first-child):not(:last-child){border-bottom:2px solid #777}.leaflet-touch .leaflet-control-attribution,.leaflet-touch .leaflet-control-layers,.leaflet-touch .leaflet-bar{box-shadow:none}.leaflet-touch .leaflet-control-layers,.leaflet-touch .leaflet-bar{border:2px solid rgba(0,0,0,.2);background-clip:padding-box}.leaflet-popup{position:absolute;text-align:center;margin-bottom:20px}.leaflet-popup-content-wrapper{padding:1px;text-align:left;border-radius:12px}.leaflet-popup-content{margin:13px 24px 13px 20px;line-height:1.3;font-size:13px;font-size:1.08333em;min-height:1px}.leaflet-popup-content p{margin:1.3em 0}.leaflet-popup-tip-container{width:40px;height:20px;position:absolute;left:50%;margin-top:-1px;margin-left:-20px;overflow:hidden;pointer-events:none}.leaflet-popup-tip{width:17px;height:17px;padding:1px;margin:-10px auto 0;pointer-events:auto;-webkit-transform:rotate(45deg);-moz-transform:rotate(45deg);-ms-transform:rotate(45deg);transform:rotate(45deg)}.leaflet-popup-content-wrapper,.leaflet-popup-tip{background:#fff;color:#333;box-shadow:0 3px 14px rgba(0,0,0,.4)}.leaflet-container a.leaflet-popup-close-button{position:absolute;top:0;right:0;border:none;text-align:center;width:24px;height:24px;font:16px/24px Tahoma,Verdana,sans-serif;color:#757575;text-decoration:none;background:transparent}.leaflet-container a.leaflet-popup-close-button:hover,.leaflet-container a.leaflet-popup-close-button:focus{color:#585858}.leaflet-popup-scrolled{overflow:auto}.leaflet-oldie .leaflet-popup-content-wrapper{-ms-zoom:1}.leaflet-oldie .leaflet-popup-tip{width:24px;margin:0 auto;-ms-filter:"progid:DXImageTransform.Microsoft.Matrix(M11=0.70710678, M12=0.70710678, M21=-0.70710678, M22=0.70710678)";filter:progid:DXImageTransform.Microsoft.Matrix(M11=.70710678,M12=.70710678,M21=-.70710678,M22=.70710678)}.leaflet-oldie .leaflet-control-zoom,.leaflet-oldie .leaflet-control-layers,.leaflet-oldie .leaflet-popup-content-wrapper,.leaflet-oldie .leaflet-popup-tip{border:1px solid #999}.leaflet-div-icon{background:#fff;border:1px solid #666}.leaflet-tooltip{position:absolute;padding:6px;background-color:#fff;border:1px solid #fff;border-radius:3px;color:#222;white-space:nowrap;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;pointer-events:none;box-shadow:0 1px 3px rgba(0,0,0,.4)}.leaflet-tooltip.leaflet-interactive{cursor:pointer;pointer-events:auto}.leaflet-tooltip-top:before,.leaflet-tooltip-bottom:before,.leaflet-tooltip-left:before,.leaflet-tooltip-right:before{position:absolute;pointer-events:none;border:6px solid transparent;background:transparent;content:""}.leaflet-tooltip-bottom{margin-top:6px}.leaflet-tooltip-top{margin-top:-6px}.leaflet-tooltip-bottom:before,.leaflet-tooltip-top:before{left:50%;margin-left:-6px}.leaflet-tooltip-top:before{bottom:0;margin-bottom:-12px;border-top-color:#fff}.leaflet-tooltip-bottom:before{top:0;margin-top:-12px;margin-left:-6px;border-bottom-color:#fff}.leaflet-tooltip-left{margin-left:-6px}.leaflet-tooltip-right{margin-left:6px}.leaflet-tooltip-left:before,.leaflet-tooltip-right:before{top:50%;margin-top:-6px}.leaflet-tooltip-left:before{right:0;margin-right:-12px;border-left-color:#fff}.leaflet-tooltip-right:before{left:0;margin-left:-12px;border-right-color:#fff}@media print{.leaflet-control{-webkit-print-color-adjust:exact;print-color-adjust:exact}}.map-head[data-v-7153ad62]{min-height:50px;display:flex;align-items:center;justify-content:space-between;padding-left:20px;padding-right:20px;font-size:14px;color:var(--color-text-2);background-color:var(--color-bg-2);border-top-left-radius:8px;border-top-right-radius:8px;box-shadow:0 1px 3px 1px rgba(0,0,0,.05)}.map-body[data-v-7153ad62]{position:relative} +.head[data-v-48cd70b1]{background:var(--terminal-head-bg);position:relative;height:40px;align-items:center}.head .item[data-v-48cd70b1]{width:160px;height:100%;display:flex;cursor:pointer;align-items:center;justify-content:space-between;padding-left:8px;padding-right:8px;border-right:1px solid rgb(231,225,225)}.head .item .close-terminal[data-v-48cd70b1]{--un-text-opacity:1;color:rgb(239 8 8 / var(--un-text-opacity))}.head .item .close-terminal[data-v-48cd70b1]:hover{background:var(--terminal-head-item-close-hover)}.head .item .text[data-v-48cd70b1]{overflow:hidden;white-space:nowrap;text-overflow:ellipsis}.head .item .icon[data-v-48cd70b1]{margin-right:5px;width:10px;height:10px;--un-bg-opacity:1;background-color:rgb(32 165 58 / var(--un-bg-opacity));display:inline-block;border-radius:50%}.head .item .icon-active[data-v-48cd70b1]{--un-bg-opacity:1;background-color:rgb(247 11 60 / var(--un-bg-opacity))}.head .item[data-v-48cd70b1]:hover{background:var(--terminal-head-item-hover)}.head .item-active[data-v-48cd70b1]{--un-text-opacity:1;color:rgb(255 255 255 / var(--un-text-opacity));background:#424242!important}.head .add-terminal[data-v-48cd70b1]{width:40px;height:40px;text-align:center;line-height:50px}.head .add-terminal[data-v-48cd70b1]:hover{--un-bg-opacity:1;background-color:rgb(204 204 204 / var(--un-bg-opacity))}.context-menu[data-v-48cd70b1]{position:fixed;z-index:9999;--un-bg-opacity:1;background-color:rgb(255 255 255 / var(--un-bg-opacity));--un-text-opacity:1;color:rgb(102 102 102 / var(--un-text-opacity));border-radius:5px;box-shadow:0 2px 12px rgba(0,0,0,.1)}.context-menu ul[data-v-48cd70b1]{width:150px;padding-top:5px;padding-bottom:5px;list-style:none}.context-menu ul li[data-v-48cd70b1]{cursor:pointer;padding:8px 10px}.context-menu ul li[data-v-48cd70b1]:hover{--un-bg-opacity:1;background-color:rgb(231 245 233 / var(--un-bg-opacity));--un-text-opacity:1;color:rgb(29 149 52 / var(--un-text-opacity))}.terminal[data-v-79cb6909]{position:relative;height:100%}.terminal-contract-tool[data-v-79cb6909]{position:absolute;right:0;top:50%;z-index:50;height:4rem;width:2rem;display:flex;cursor:pointer;align-items:center;justify-content:center;border-bottom-left-radius:9999px;border-top-left-radius:9999px;--un-bg-opacity:1;background-color:rgb(55 65 81 / var(--un-bg-opacity));background-color:#555;transform:translateY(-50%)}.terminal-contract-tool[data-v-79cb6909]:after{content:"";--un-border-opacity:1;border-color:rgb(255 255 255 / var(--un-border-opacity));border:2px solid rgb(255,255,255);transform:rotate(45deg);border-left-width:0;border-bottom-width:0;height:1rem;width:1rem}.terminal-contract-tool[data-v-79cb6909]:hover{--un-bg-opacity:1;background-color:rgb(107 114 128 / var(--un-bg-opacity))}.active[data-v-79cb6909]:after{transform:rotate(-135deg)!important}.box[data-v-57762b9d]{height:calc(100vh - 52px)} diff --git a/BTPanel/static/vite/css/index60.css b/BTPanel/static/vite/css/index60.css index d1431d1a..607e38b8 100644 --- a/BTPanel/static/vite/css/index60.css +++ b/BTPanel/static/vite/css/index60.css @@ -1 +1 @@ -.rank-table[data-v-9bacc249]{--n-merged-border-color: transparent;height:100%}.rank-table[data-v-9bacc249] .n-data-table-thead{display:none}.bt-radio[data-v-9ee89472] .n-radio-button:last-child{border-right:none;border-top-right-radius:0;border-bottom-right-radius:0}.bt-date-picker[data-v-9ee89472]{width:220px}.bt-date-picker[data-v-9ee89472] .n-input{border-top-left-radius:0;border-bottom-left-radius:0}.report-tabs[data-v-0329e270]{--n-tab-gap: 0;--n-tab-padding: 14px 24px;--n-tab-font-size: 14px;--n-pane-padding-top: 16px;--n-pane-padding-left: 16px;--n-pane-padding-right: 16px;--n-pane-padding-bottom: 16px}.report-card[data-v-0329e270]{--n-title-font-size: 14px}.report-card[data-v-0329e270] .n-card-header{min-height:50px} +.iframePage[data-v-dd081d53]{position:fixed;left:0;right:0;top:0;bottom:0;z-index:996;width:100%;height:100%;border-style:none} diff --git a/BTPanel/static/vite/css/index61.css b/BTPanel/static/vite/css/index61.css index 0d72ad3c..32f1313a 100644 --- a/BTPanel/static/vite/css/index61.css +++ b/BTPanel/static/vite/css/index61.css @@ -1 +1 @@ -.setting-card[data-v-7aad1169]{padding:20px;border-radius:4px;background-color:rgba(32,165,58,.1);transition:background-color .2s;cursor:pointer}.setting-card.error[data-v-7aad1169]{background-color:rgba(255,0,0,.1)}.setting-card .n-button+.n-button[data-v-7aad1169]{margin-left:12px}.setting-card[data-v-7a2d217e]{padding:20px;border:1px solid var(--n-border-color);transition:background-color .2s;cursor:pointer}.setting-card[data-v-7a2d217e]:hover{background-color:rgba(165,165,165,.08)}.setting-tabs[data-v-f0a6d691]{--n-tab-gap: 0;--n-tab-font-size: 14px;--n-tab-padding: 14px 20px 12px;--n-tab-font-weight-active: 700} +.wap-card[data-v-ff288151]{--n-border-radius: 6px;--n-title-font-size: 14px;--n-title-text-color: var(--color-text-4);box-shadow:0 1px 3px 1px rgba(0,0,0,.05)}.wap-card[data-v-ff288151] .n-card-header{height:50px;padding:0 16px}.wap-card[data-v-ff288151] .n-card-header .n-card-header__main{display:flex;align-items:center;font-weight:700}.bt-radio[data-v-e100fb9e] .n-radio-button:last-child{border-right:none;border-top-right-radius:0;border-bottom-right-radius:0}.bt-date-picker[data-v-e100fb9e]{width:120px}.bt-date-picker[data-v-e100fb9e] .n-input{border-top-left-radius:0;border-bottom-left-radius:0}.refresh-progress[data-v-cdf03241]{width:28px;cursor:pointer}.wap-card[data-v-d7e87a24]{--wap-card-icon: url(/static/vite/images/today-new.svg);--wap-card-color: var(--color-primary);height:100%;padding:20px}.wap-card.request[data-v-d7e87a24]{--wap-card-color: var(--color-primary)}.wap-card.malicious-request[data-v-d7e87a24]{--wap-card-color: var(--color-error)}.wap-card .card-bg[data-v-d7e87a24]{position:absolute;right:0;bottom:0;display:flex;justify-content:flex-end;align-items:flex-end;height:80px;font-size:80px;color:var(--color-text-3);opacity:.3;z-index:0}.wap-card .card-title[data-v-d7e87a24]{display:flex;align-items:center;font-size:14px;color:var(--color-text-4)}.wap-card .card-title[data-v-d7e87a24]:before{content:"";display:block;width:4px;height:14px;border-radius:2px;margin-right:8px;background-color:var(--wap-card-color)}.wap-card .card-value[data-v-d7e87a24]{position:relative;margin-top:14px;margin-bottom:6px;font-size:28px;font-weight:700;color:var(--color-text-5);font-family:Microsoft YaHei,sans-serif;z-index:1}.wap-card .card-trend[data-v-d7e87a24]{position:relative;display:flex;align-items:center;color:var(--wap-card-color);font-family:Microsoft YaHei,sans-serif;z-index:1}.wap-card .card-yesterday[data-v-d7e87a24]{position:relative;margin-top:8px;color:var(--color-text-4);z-index:1}.rank-list[data-v-ba455d5c]{display:flex;flex-direction:column;gap:8px}.rank-item[data-v-ba455d5c]{display:flex;align-items:center}.rank-item .rank-num[data-v-ba455d5c]{width:24px;height:24px;line-height:24px;margin-right:16px;border-radius:50%;color:#fff;text-align:center;font-size:12px;font-weight:700}.rank-item .rank-title[data-v-ba455d5c]{width:110px;margin-right:20px;font-size:13px;color:var(--color-text-5)}.rank-item .rank-value[data-v-ba455d5c]{text-align:right;font-size:13px;color:var(--color-text-5)} diff --git a/BTPanel/static/vite/css/index62.css b/BTPanel/static/vite/css/index62.css index 7c21319b..4dcd42cb 100644 --- a/BTPanel/static/vite/css/index62.css +++ b/BTPanel/static/vite/css/index62.css @@ -1 +1 @@ -.ul-style[data-v-73d2f93d]{margin:0 auto;display:flex;align-items:center;justify-content:center;gap:48px;font-size:16px;list-style:square}.ul-style li[data-v-73d2f93d]{list-style:square}.install-tabs[data-v-73d2f93d]{--n-tab-font-size: 14px;--n-pane-padding-top: 0;--n-pane-padding-left: 24px;--n-tab-font-weight-active: bold} +.bt-radio[data-v-bf5d25af] .n-radio-button:last-child{border-right:none;border-top-right-radius:0;border-bottom-right-radius:0}.bt-date-picker[data-v-bf5d25af] .n-input{border-top-left-radius:0;border-bottom-left-radius:0} diff --git a/BTPanel/static/vite/css/index63.css b/BTPanel/static/vite/css/index63.css index e3c59cfd..c70c4007 100644 --- a/BTPanel/static/vite/css/index63.css +++ b/BTPanel/static/vite/css/index63.css @@ -1 +1 @@ -.website-name[data-v-5103c19c]{display:flex;align-items:center;gap:8px;width:100%}.website-icon[data-v-5103c19c]{width:24px;flex-shrink:0;cursor:pointer}.website-info[data-v-5103c19c]{flex:1;min-width:0;overflow:hidden}.website-description[data-v-5103c19c]{margin-top:2px}.website-status[data-v-a66f2bce]{display:inline-flex;font-size:20px;cursor:pointer}.n-date-panel[data-v-4583ec55]{margin:0}.n-date-panel[data-v-4583ec55] .n-date-panel-calendar{padding:6px 0 12px}.n-date-panel[data-v-4583ec55] .n-date-panel--month .n-date-panel-footer{display:none}.n-date-panel[data-v-4583ec55] .n-date-panel-footer{padding:12px 0 6px}.n-data-table[data-v-fca1cf0d] .requests .n-data-table-th__title-wrapper{justify-content:center} +.n-select[data-v-5842887f] .n-base-selection-tag-wrapper{padding:0 0 3px}.form-title[data-v-c86a897c]{margin-bottom:20px;font-size:16px} diff --git a/BTPanel/static/vite/css/index64.css b/BTPanel/static/vite/css/index64.css index a210c277..67d769ba 100644 --- a/BTPanel/static/vite/css/index64.css +++ b/BTPanel/static/vite/css/index64.css @@ -1 +1 @@ -.bt-tabs-modal[data-v-9b556854]{--n-tab-gap-vertical: 0;--n-tab-border-color: var(--bt-tabs-modal-bg);--n-tab-color: var(--bt-tabs-modal-bg);--n-tab-border-radius: 0;--n-tab-text-color-active: var(--tabs-active-text-color);--n-tab-padding-vertical: 0 10px 0 20px;--n-tab-item-width: 170px;height:100%}.bt-tabs-modal[data-v-9b556854]>.n-tabs-nav{width:var(--n-tab-item-width);background-color:var(--bt-tabs-modal-bg)}.bt-tabs-modal[data-v-9b556854]>.n-tabs-nav .n-tabs-scroll-padding{border:none}.bt-tabs-modal[data-v-9b556854]>.n-tabs-nav .n-tabs-wrapper .n-tabs-tab-wrapper .n-tabs-tab{width:var(--n-tab-item-width);height:40px;border:none;justify-content:flex-start}.bt-tabs-modal[data-v-9b556854]>.n-tabs-nav .n-tabs-wrapper .n-tabs-tab-wrapper .n-tabs-tab.n-tabs-tab--active{background-color:var(--bt-tabs-modal-active-bg)}.bt-tabs-modal[data-v-9b556854]>.n-tabs-nav .n-tabs-wrapper .n-tabs-tab-wrapper .n-tabs-tab .n-tabs-tab__label{overflow:hidden}.bt-tabs-modal[data-v-9b556854]>.n-tab-pane{overflow:auto}.is-icon[data-v-9b556854]>.n-tabs-nav{width:81px}.is-icon[data-v-9b556854]>.n-tabs-nav .n-tabs-tab{width:81px!important;height:74px!important} +.leaflet-pane,.leaflet-tile,.leaflet-marker-icon,.leaflet-marker-shadow,.leaflet-tile-container,.leaflet-pane>svg,.leaflet-pane>canvas,.leaflet-zoom-box,.leaflet-image-layer,.leaflet-layer{position:absolute;left:0;top:0}.leaflet-container{overflow:hidden}.leaflet-tile,.leaflet-marker-icon,.leaflet-marker-shadow{-webkit-user-select:none;-moz-user-select:none;user-select:none;-webkit-user-drag:none}.leaflet-tile::selection{background:transparent}.leaflet-safari .leaflet-tile{image-rendering:-webkit-optimize-contrast}.leaflet-safari .leaflet-tile-container{width:1600px;height:1600px;-webkit-transform-origin:0 0}.leaflet-marker-icon,.leaflet-marker-shadow{display:block}.leaflet-container .leaflet-overlay-pane svg{max-width:none!important;max-height:none!important}.leaflet-container .leaflet-marker-pane img,.leaflet-container .leaflet-shadow-pane img,.leaflet-container .leaflet-tile-pane img,.leaflet-container img.leaflet-image-layer,.leaflet-container .leaflet-tile{max-width:none!important;max-height:none!important;width:auto;padding:0}.leaflet-container img.leaflet-tile{mix-blend-mode:plus-lighter}.leaflet-container.leaflet-touch-zoom{-ms-touch-action:pan-x pan-y;touch-action:pan-x pan-y}.leaflet-container.leaflet-touch-drag{-ms-touch-action:pinch-zoom;touch-action:none;touch-action:pinch-zoom}.leaflet-container.leaflet-touch-drag.leaflet-touch-zoom{-ms-touch-action:none;touch-action:none}.leaflet-container{-webkit-tap-highlight-color:transparent}.leaflet-container a{-webkit-tap-highlight-color:rgba(51,181,229,.4)}.leaflet-tile{filter:inherit;visibility:hidden}.leaflet-tile-loaded{visibility:inherit}.leaflet-zoom-box{width:0;height:0;-moz-box-sizing:border-box;box-sizing:border-box;z-index:800}.leaflet-overlay-pane svg{-moz-user-select:none}.leaflet-pane{z-index:400}.leaflet-tile-pane{z-index:200}.leaflet-overlay-pane{z-index:400}.leaflet-shadow-pane{z-index:500}.leaflet-marker-pane{z-index:600}.leaflet-tooltip-pane{z-index:650}.leaflet-popup-pane{z-index:700}.leaflet-map-pane canvas{z-index:100}.leaflet-map-pane svg{z-index:200}.leaflet-vml-shape{width:1px;height:1px}.lvml{behavior:url(#default#VML);display:inline-block;position:absolute}.leaflet-control{position:relative;z-index:800;pointer-events:visiblePainted;pointer-events:auto}.leaflet-top,.leaflet-bottom{position:absolute;z-index:1000;pointer-events:none}.leaflet-top{top:0}.leaflet-right{right:0}.leaflet-bottom{bottom:0}.leaflet-left{left:0}.leaflet-control{float:left;clear:both}.leaflet-right .leaflet-control{float:right}.leaflet-top .leaflet-control{margin-top:10px}.leaflet-bottom .leaflet-control{margin-bottom:10px}.leaflet-left .leaflet-control{margin-left:10px}.leaflet-right .leaflet-control{margin-right:10px}.leaflet-fade-anim .leaflet-popup{opacity:0;-webkit-transition:opacity .2s linear;-moz-transition:opacity .2s linear;transition:opacity .2s linear}.leaflet-fade-anim .leaflet-map-pane .leaflet-popup{opacity:1}.leaflet-zoom-animated{-webkit-transform-origin:0 0;-ms-transform-origin:0 0;transform-origin:0 0}svg.leaflet-zoom-animated{will-change:transform}.leaflet-zoom-anim .leaflet-zoom-animated{-webkit-transition:-webkit-transform .25s cubic-bezier(0,0,.25,1);-moz-transition:-moz-transform .25s cubic-bezier(0,0,.25,1);transition:transform .25s cubic-bezier(0,0,.25,1)}.leaflet-zoom-anim .leaflet-tile,.leaflet-pan-anim .leaflet-tile{-webkit-transition:none;-moz-transition:none;transition:none}.leaflet-zoom-anim .leaflet-zoom-hide{visibility:hidden}.leaflet-interactive{cursor:pointer}.leaflet-grab{cursor:-webkit-grab;cursor:-moz-grab;cursor:grab}.leaflet-crosshair,.leaflet-crosshair .leaflet-interactive{cursor:crosshair}.leaflet-popup-pane,.leaflet-control{cursor:auto}.leaflet-dragging .leaflet-grab,.leaflet-dragging .leaflet-grab .leaflet-interactive,.leaflet-dragging .leaflet-marker-draggable{cursor:move;cursor:-webkit-grabbing;cursor:-moz-grabbing;cursor:grabbing}.leaflet-marker-icon,.leaflet-marker-shadow,.leaflet-image-layer,.leaflet-pane>svg path,.leaflet-tile-container{pointer-events:none}.leaflet-marker-icon.leaflet-interactive,.leaflet-image-layer.leaflet-interactive,.leaflet-pane>svg path.leaflet-interactive,svg.leaflet-image-layer.leaflet-interactive path{pointer-events:visiblePainted;pointer-events:auto}.leaflet-container{background:#ddd;outline-offset:1px}.leaflet-container a{color:#0078a8}.leaflet-zoom-box{border:2px dotted #38f;background:rgba(255,255,255,.5)}.leaflet-container{font-family:Helvetica Neue,Arial,Helvetica,sans-serif;font-size:12px;font-size:.75rem;line-height:1.5}.leaflet-bar{box-shadow:0 1px 5px rgba(0,0,0,.65);border-radius:4px}.leaflet-bar a{background-color:#fff;border-bottom:1px solid #ccc;width:26px;height:26px;line-height:26px;display:block;text-align:center;text-decoration:none;color:#000}.leaflet-bar a,.leaflet-control-layers-toggle{background-position:50% 50%;background-repeat:no-repeat;display:block}.leaflet-bar a:hover,.leaflet-bar a:focus{background-color:#f4f4f4}.leaflet-bar a:first-child{border-top-left-radius:4px;border-top-right-radius:4px}.leaflet-bar a:last-child{border-bottom-left-radius:4px;border-bottom-right-radius:4px;border-bottom:none}.leaflet-bar a.leaflet-disabled{cursor:default;background-color:#f4f4f4;color:#bbb}.leaflet-touch .leaflet-bar a{width:30px;height:30px;line-height:30px}.leaflet-touch .leaflet-bar a:first-child{border-top-left-radius:2px;border-top-right-radius:2px}.leaflet-touch .leaflet-bar a:last-child{border-bottom-left-radius:2px;border-bottom-right-radius:2px}.leaflet-control-zoom-in,.leaflet-control-zoom-out{font:700 18px Lucida Console,Monaco,monospace;text-indent:1px}.leaflet-touch .leaflet-control-zoom-in,.leaflet-touch .leaflet-control-zoom-out{font-size:22px}.leaflet-control-layers{box-shadow:0 1px 5px rgba(0,0,0,.4);background:#fff;border-radius:5px}.leaflet-control-layers-toggle{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABoAAAAaCAQAAAADQ4RFAAACf0lEQVR4AY1UM3gkARTePdvdoTxXKc+qTl3aU5U6b2Kbkz3Gtq3Zw6ziLGNPzrYx7946Tr6/ee/XeCQ4D3ykPtL5tHno4n0d/h3+xfuWHGLX81cn7r0iTNzjr7LrlxCqPtkbTQEHeqOrTy4Yyt3VCi/IOB0v7rVC7q45Q3Gr5K6jt+3Gl5nCoDD4MtO+j96Wu8atmhGqcNGHObuf8OM/x3AMx38+4Z2sPqzCxRFK2aF2e5Jol56XTLyggAMTL56XOMoS1W4pOyjUcGGQdZxU6qRh7B9Zp+PfpOFlqt0zyDZckPi1ttmIp03jX8gyJ8a/PG2yutpS/Vol7peZIbZcKBAEEheEIAgFbDkz5H6Zrkm2hVWGiXKiF4Ycw0RWKdtC16Q7qe3X4iOMxruonzegJzWaXFrU9utOSsLUmrc0YjeWYjCW4PDMADElpJSSQ0vQvA1Tm6/JlKnqFs1EGyZiFCqnRZTEJJJiKRYzVYzJck2Rm6P4iH+cmSY0YzimYa8l0EtTODFWhcMIMVqdsI2uiTvKmTisIDHJ3od5GILVhBCarCfVRmo4uTjkhrhzkiBV7SsaqS+TzrzM1qpGGUFt28pIySQHR6h7F6KSwGWm97ay+Z+ZqMcEjEWebE7wxCSQwpkhJqoZA5ivCdZDjJepuJ9IQjGGUmuXJdBFUygxVqVsxFsLMbDe8ZbDYVCGKxs+W080max1hFCarCfV+C1KATwcnvE9gRRuMP2prdbWGowm1KB1y+zwMMENkM755cJ2yPDtqhTI6ED1M/82yIDtC/4j4BijjeObflpO9I9MwXTCsSX8jWAFeHr05WoLTJ5G8IQVS/7vwR6ohirYM7f6HzYpogfS3R2OAAAAAElFTkSuQmCC);width:36px;height:36px}.leaflet-retina .leaflet-control-layers-toggle{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADQAAAA0CAQAAABvcdNgAAAEsklEQVR4AWL4TydIhpZK1kpWOlg0w3ZXP6D2soBtG42jeI6ZmQTHzAxiTbSJsYLjO9HhP+WOmcuhciVnmHVQcJnp7DFvScowZorad/+V/fVzMdMT2g9Cv9guXGv/7pYOrXh2U+RRR3dSd9JRx6bIFc/ekqHI29JC6pJ5ZEh1yWkhkbcFeSjxgx3L2m1cb1C7bceyxA+CNjT/Ifff+/kDk2u/w/33/IeCMOSaWZ4glosqT3DNnNZQ7Cs58/3Ce5HL78iZH/vKVIaYlqzfdLu8Vi7dnvUbEza5Idt36tquZFldl6N5Z/POLof0XLK61mZCmJSWjVF9tEjUluu74IUXvgttuVIHE7YxSkaYhJZam7yiM9Pv82JYfl9nptxZaxMJE4YSPty+vF0+Y2up9d3wwijfjZbabqm/3bZ9ecKHsiGmRflnn1MW4pjHf9oLufyn2z3y1D6n8g8TZhxyzipLNPnAUpsOiuWimg52psrTZYnOWYNDTMuWBWa0tJb4rgq1UvmutpaYEbZlwU3CLJm/ayYjHW5/h7xWLn9Hh1vepDkyf7dE7MtT5LR4e7yYpHrkhOUpEfssBLq2pPhAqoSWKUkk7EDqkmK6RrCEzqDjhNDWNE+XSMvkJRDWlZTmCW0l0PHQGRZY5t1L83kT0Y3l2SItk5JAWHl2dCOBm+fPu3fo5/3v61RMCO9Jx2EEYYhb0rmNQMX/vm7gqOEJLcXTGw3CAuRNeyaPWwjR8PRqKQ1PDA/dpv+on9Shox52WFnx0KY8onHayrJzm87i5h9xGw/tfkev0jGsQizqezUKjk12hBMKJ4kbCqGPVNXudyyrShovGw5CgxsRICxF6aRmSjlBnHRzg7Gx8fKqEubI2rahQYdR1YgDIRQO7JvQyD52hoIQx0mxa0ODtW2Iozn1le2iIRdzwWewedyZzewidueOGqlsn1MvcnQpuVwLGG3/IR1hIKxCjelIDZ8ldqWz25jWAsnldEnK0Zxro19TGVb2ffIZEsIO89EIEDvKMPrzmBOQcKQ+rroye6NgRRxqR4U8EAkz0CL6uSGOm6KQCdWjvjRiSP1BPalCRS5iQYiEIvxuBMJEWgzSoHADcVMuN7IuqqTeyUPq22qFimFtxDyBBJEwNyt6TM88blFHao/6tWWhuuOM4SAK4EI4QmFHA+SEyWlp4EQoJ13cYGzMu7yszEIBOm2rVmHUNqwAIQabISNMRstmdhNWcFLsSm+0tjJH1MdRxO5Nx0WDMhCtgD6OKgZeljJqJKc9po8juskR9XN0Y1lZ3mWjLR9JCO1jRDMd0fpYC2VnvjBSEFg7wBENc0R9HFlb0xvF1+TBEpF68d+DHR6IOWVv2BECtxo46hOFUBd/APU57WIoEwJhIi2CdpyZX0m93BZicktMj1AS9dClteUFAUNUIEygRZCtik5zSxI9MubTBH1GOiHsiLJ3OCoSZkILa9PxiN0EbvhsAo8tdAf9Seepd36lGWHmtNANTv5Jd0z4QYyeo/UEJqxKRpg5LZx6btLPsOaEmdMyxYdlc8LMaJnikDlhclqmPiQnTEpLUIZEwkRagjYkEibQErwhkTAKCLQEbUgkzJQWc/0PstHHcfEdQ+UAAAAASUVORK5CYII=);background-size:26px 26px}.leaflet-touch .leaflet-control-layers-toggle{width:44px;height:44px}.leaflet-control-layers .leaflet-control-layers-list,.leaflet-control-layers-expanded .leaflet-control-layers-toggle{display:none}.leaflet-control-layers-expanded .leaflet-control-layers-list{display:block;position:relative}.leaflet-control-layers-expanded{padding:6px 10px 6px 6px;color:#333;background:#fff}.leaflet-control-layers-scrollbar{overflow-y:scroll;overflow-x:hidden;padding-right:5px}.leaflet-control-layers-selector{margin-top:2px;position:relative;top:1px}.leaflet-control-layers label{display:block;font-size:13px;font-size:1.08333em}.leaflet-control-layers-separator{height:0;border-top:1px solid #ddd;margin:5px -10px 5px -6px}.leaflet-default-icon-path{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABkAAAApCAYAAADAk4LOAAAFgUlEQVR4Aa1XA5BjWRTN2oW17d3YaZtr2962HUzbDNpjszW24mRt28p47v7zq/bXZtrp/lWnXr337j3nPCe85NcypgSFdugCpW5YoDAMRaIMqRi6aKq5E3YqDQO3qAwjVWrD8Ncq/RBpykd8oZUb/kaJutow8r1aP9II0WmLKLIsJyv1w/kqw9Ch2MYdB++12Onxee/QMwvf4/Dk/Lfp/i4nxTXtOoQ4pW5Aj7wpici1A9erdAN2OH64x8OSP9j3Ft3b7aWkTg/Fm91siTra0f9on5sQr9INejH6CUUUpavjFNq1B+Oadhxmnfa8RfEmN8VNAsQhPqF55xHkMzz3jSmChWU6f7/XZKNH+9+hBLOHYozuKQPxyMPUKkrX/K0uWnfFaJGS1QPRtZsOPtr3NsW0uyh6NNCOkU3Yz+bXbT3I8G3xE5EXLXtCXbbqwCO9zPQYPRTZ5vIDXD7U+w7rFDEoUUf7ibHIR4y6bLVPXrz8JVZEql13trxwue/uDivd3fkWRbS6/IA2bID4uk0UpF1N8qLlbBlXs4Ee7HLTfV1j54APvODnSfOWBqtKVvjgLKzF5YdEk5ewRkGlK0i33Eofffc7HT56jD7/6U+qH3Cx7SBLNntH5YIPvODnyfIXZYRVDPqgHtLs5ABHD3YzLuespb7t79FY34DjMwrVrcTuwlT55YMPvOBnRrJ4VXTdNnYug5ucHLBjEpt30701A3Ts+HEa73u6dT3FNWwflY86eMHPk+Yu+i6pzUpRrW7SNDg5JHR4KapmM5Wv2E8Tfcb1HoqqHMHU+uWDD7zg54mz5/2BSnizi9T1Dg4QQXLToGNCkb6tb1NU+QAlGr1++eADrzhn/u8Q2YZhQVlZ5+CAOtqfbhmaUCS1ezNFVm2imDbPmPng5wmz+gwh+oHDce0eUtQ6OGDIyR0uUhUsoO3vfDmmgOezH0mZN59x7MBi++WDL1g/eEiU3avlidO671bkLfwbw5XV2P8Pzo0ydy4t2/0eu33xYSOMOD8hTf4CrBtGMSoXfPLchX+J0ruSePw3LZeK0juPJbYzrhkH0io7B3k164hiGvawhOKMLkrQLyVpZg8rHFW7E2uHOL888IBPlNZ1FPzstSJM694fWr6RwpvcJK60+0HCILTBzZLFNdtAzJaohze60T8qBzyh5ZuOg5e7uwQppofEmf2++DYvmySqGBuKaicF1blQjhuHdvCIMvp8whTTfZzI7RldpwtSzL+F1+wkdZ2TBOW2gIF88PBTzD/gpeREAMEbxnJcaJHNHrpzji0gQCS6hdkEeYt9DF/2qPcEC8RM28Hwmr3sdNyht00byAut2k3gufWNtgtOEOFGUwcXWNDbdNbpgBGxEvKkOQsxivJx33iow0Vw5S6SVTrpVq11ysA2Rp7gTfPfktc6zhtXBBC+adRLshf6sG2RfHPZ5EAc4sVZ83yCN00Fk/4kggu40ZTvIEm5g24qtU4KjBrx/BTTH8ifVASAG7gKrnWxJDcU7x8X6Ecczhm3o6YicvsLXWfh3Ch1W0k8x0nXF+0fFxgt4phz8QvypiwCCFKMqXCnqXExjq10beH+UUA7+nG6mdG/Pu0f3LgFcGrl2s0kNNjpmoJ9o4B29CMO8dMT4Q5ox8uitF6fqsrJOr8qnwNbRzv6hSnG5wP+64C7h9lp30hKNtKdWjtdkbuPA19nJ7Tz3zR/ibgARbhb4AlhavcBebmTHcFl2fvYEnW0ox9xMxKBS8btJ+KiEbq9zA4RthQXDhPa0T9TEe69gWupwc6uBUphquXgf+/FrIjweHQS4/pduMe5ERUMHUd9xv8ZR98CxkS4F2n3EUrUZ10EYNw7BWm9x1GiPssi3GgiGRDKWRYZfXlON+dfNbM+GgIwYdwAAAAASUVORK5CYII=)}.leaflet-container .leaflet-control-attribution{background:#fff;background:rgba(255,255,255,.8);margin:0}.leaflet-control-attribution,.leaflet-control-scale-line{padding:0 5px;color:#333;line-height:1.4}.leaflet-control-attribution a{text-decoration:none}.leaflet-control-attribution a:hover,.leaflet-control-attribution a:focus{text-decoration:underline}.leaflet-attribution-flag{display:inline!important;vertical-align:baseline!important;width:1em;height:.6669em}.leaflet-left .leaflet-control-scale{margin-left:5px}.leaflet-bottom .leaflet-control-scale{margin-bottom:5px}.leaflet-control-scale-line{border:2px solid #777;border-top:none;line-height:1.1;padding:2px 5px 1px;white-space:nowrap;-moz-box-sizing:border-box;box-sizing:border-box;background:rgba(255,255,255,.8);text-shadow:1px 1px #fff}.leaflet-control-scale-line:not(:first-child){border-top:2px solid #777;border-bottom:none;margin-top:-2px}.leaflet-control-scale-line:not(:first-child):not(:last-child){border-bottom:2px solid #777}.leaflet-touch .leaflet-control-attribution,.leaflet-touch .leaflet-control-layers,.leaflet-touch .leaflet-bar{box-shadow:none}.leaflet-touch .leaflet-control-layers,.leaflet-touch .leaflet-bar{border:2px solid rgba(0,0,0,.2);background-clip:padding-box}.leaflet-popup{position:absolute;text-align:center;margin-bottom:20px}.leaflet-popup-content-wrapper{padding:1px;text-align:left;border-radius:12px}.leaflet-popup-content{margin:13px 24px 13px 20px;line-height:1.3;font-size:13px;font-size:1.08333em;min-height:1px}.leaflet-popup-content p{margin:1.3em 0}.leaflet-popup-tip-container{width:40px;height:20px;position:absolute;left:50%;margin-top:-1px;margin-left:-20px;overflow:hidden;pointer-events:none}.leaflet-popup-tip{width:17px;height:17px;padding:1px;margin:-10px auto 0;pointer-events:auto;-webkit-transform:rotate(45deg);-moz-transform:rotate(45deg);-ms-transform:rotate(45deg);transform:rotate(45deg)}.leaflet-popup-content-wrapper,.leaflet-popup-tip{background:#fff;color:#333;box-shadow:0 3px 14px rgba(0,0,0,.4)}.leaflet-container a.leaflet-popup-close-button{position:absolute;top:0;right:0;border:none;text-align:center;width:24px;height:24px;font:16px/24px Tahoma,Verdana,sans-serif;color:#757575;text-decoration:none;background:transparent}.leaflet-container a.leaflet-popup-close-button:hover,.leaflet-container a.leaflet-popup-close-button:focus{color:#585858}.leaflet-popup-scrolled{overflow:auto}.leaflet-oldie .leaflet-popup-content-wrapper{-ms-zoom:1}.leaflet-oldie .leaflet-popup-tip{width:24px;margin:0 auto;-ms-filter:"progid:DXImageTransform.Microsoft.Matrix(M11=0.70710678, M12=0.70710678, M21=-0.70710678, M22=0.70710678)";filter:progid:DXImageTransform.Microsoft.Matrix(M11=.70710678,M12=.70710678,M21=-.70710678,M22=.70710678)}.leaflet-oldie .leaflet-control-zoom,.leaflet-oldie .leaflet-control-layers,.leaflet-oldie .leaflet-popup-content-wrapper,.leaflet-oldie .leaflet-popup-tip{border:1px solid #999}.leaflet-div-icon{background:#fff;border:1px solid #666}.leaflet-tooltip{position:absolute;padding:6px;background-color:#fff;border:1px solid #fff;border-radius:3px;color:#222;white-space:nowrap;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;pointer-events:none;box-shadow:0 1px 3px rgba(0,0,0,.4)}.leaflet-tooltip.leaflet-interactive{cursor:pointer;pointer-events:auto}.leaflet-tooltip-top:before,.leaflet-tooltip-bottom:before,.leaflet-tooltip-left:before,.leaflet-tooltip-right:before{position:absolute;pointer-events:none;border:6px solid transparent;background:transparent;content:""}.leaflet-tooltip-bottom{margin-top:6px}.leaflet-tooltip-top{margin-top:-6px}.leaflet-tooltip-bottom:before,.leaflet-tooltip-top:before{left:50%;margin-left:-6px}.leaflet-tooltip-top:before{bottom:0;margin-bottom:-12px;border-top-color:#fff}.leaflet-tooltip-bottom:before{top:0;margin-top:-12px;margin-left:-6px;border-bottom-color:#fff}.leaflet-tooltip-left{margin-left:-6px}.leaflet-tooltip-right{margin-left:6px}.leaflet-tooltip-left:before,.leaflet-tooltip-right:before{top:50%;margin-top:-6px}.leaflet-tooltip-left:before{right:0;margin-right:-12px;border-left-color:#fff}.leaflet-tooltip-right:before{left:0;margin-left:-12px;border-right-color:#fff}@media print{.leaflet-control{-webkit-print-color-adjust:exact;print-color-adjust:exact}}.map-head[data-v-7153ad62]{min-height:50px;display:flex;align-items:center;justify-content:space-between;padding-left:20px;padding-right:20px;font-size:14px;color:var(--color-text-2);background-color:var(--color-bg-2);border-top-left-radius:8px;border-top-right-radius:8px;box-shadow:0 1px 3px 1px rgba(0,0,0,.05)}.map-body[data-v-7153ad62]{position:relative} diff --git a/BTPanel/static/vite/css/index65.css b/BTPanel/static/vite/css/index65.css index 02a62893..d1431d1a 100644 --- a/BTPanel/static/vite/css/index65.css +++ b/BTPanel/static/vite/css/index65.css @@ -1 +1 @@ -.website-status[data-v-dd29927d]{display:flex;padding-left:10px;font-size:20px;cursor:pointer}.website-name[data-v-35c01248]{display:flex;align-items:center;gap:8px;width:100%}.website-icon[data-v-35c01248]{width:24px;flex-shrink:0;cursor:pointer}.website-info[data-v-35c01248]{flex:1;min-width:0;overflow:hidden}.website-description[data-v-35c01248]{margin-top:2px}.warning[data-v-5757bceb]{padding:8px;border-radius:4px;background-color:#fdf6ec;color:#e6a23c}[data-v-e04ced1d] .row-padding>:last-child{padding-left:0!important}[data-v-86934d13] .row-padding>:last-child{padding-left:0!important}.tips[data-v-87e0a648]{margin-left:10px;--un-text-opacity:1;color:rgb(102 102 102 / var(--un-text-opacity))}.n-alert[data-v-1f152531]{--n-font-size: 12px}.cert-info[data-v-1f152531]{display:flex;align-items:center;height:24px}.cert-info .cert-label[data-v-1f152531]{color:var(--site-config-ssl-label);font-weight:700}.cert-info .cert-value[data-v-1f152531]{flex:1;width:0;margin-left:4px}.business-top-tips[data-v-c4bf96b6]{background:var(--site-config-business-tips)}.n-alert[data-v-31e23451]{--n-font-size: 12px}.cert-info[data-v-31e23451]{display:flex;align-items:center;height:24px}.cert-info .cert-label[data-v-31e23451]{color:var(--site-config-ssl-label);font-weight:700}.cert-info .cert-value[data-v-31e23451]{flex:1;width:0;margin-left:4px}.tips[data-v-80e183ea]{margin-left:10px;--un-text-opacity:1;color:rgb(102 102 102 / var(--un-text-opacity))}[data-v-7dd2155e] .n-alert .n-alert-body{--n-padding: 5px 8px}.ul-style[data-v-0744d9b2]{margin:0 auto;display:flex;align-items:center;justify-content:center;gap:20px;font-size:16px}.ul-style li[data-v-0744d9b2]{display:flex;align-items:center}.n-data-table[data-v-80fc5e14] .requests .n-data-table-th__title-wrapper{justify-content:center} +.rank-table[data-v-9bacc249]{--n-merged-border-color: transparent;height:100%}.rank-table[data-v-9bacc249] .n-data-table-thead{display:none}.bt-radio[data-v-9ee89472] .n-radio-button:last-child{border-right:none;border-top-right-radius:0;border-bottom-right-radius:0}.bt-date-picker[data-v-9ee89472]{width:220px}.bt-date-picker[data-v-9ee89472] .n-input{border-top-left-radius:0;border-bottom-left-radius:0}.report-tabs[data-v-0329e270]{--n-tab-gap: 0;--n-tab-padding: 14px 24px;--n-tab-font-size: 14px;--n-pane-padding-top: 16px;--n-pane-padding-left: 16px;--n-pane-padding-right: 16px;--n-pane-padding-bottom: 16px}.report-card[data-v-0329e270]{--n-title-font-size: 14px}.report-card[data-v-0329e270] .n-card-header{min-height:50px} diff --git a/BTPanel/static/vite/css/index66.css b/BTPanel/static/vite/css/index66.css index ad00bca2..0d72ad3c 100644 --- a/BTPanel/static/vite/css/index66.css +++ b/BTPanel/static/vite/css/index66.css @@ -1 +1 @@ -.text[data-v-2dca568f]{width:300px;cursor:default;--un-bg-opacity:1;background-color:rgb(247 247 247 / var(--un-bg-opacity));padding-left:10px;padding-right:10px;line-height:32px}.language[data-v-2dca568f]{width:300px}.language[data-v-2dca568f] .n-base-loading{display:none}.language[data-v-2dca568f] .n-base-selection--disabled{--n-border: none;--n-text-color-disabled: #333333}.language[data-v-2dca568f] .n-base-selection.n-base-selection--disabled .n-base-selection-label .n-base-selection-input,.language[data-v-2dca568f] .n-base-selection.n-base-selection--disabled .n-base-selection-label{cursor:default} +.setting-card[data-v-7aad1169]{padding:20px;border-radius:4px;background-color:rgba(32,165,58,.1);transition:background-color .2s;cursor:pointer}.setting-card.error[data-v-7aad1169]{background-color:rgba(255,0,0,.1)}.setting-card .n-button+.n-button[data-v-7aad1169]{margin-left:12px}.setting-card[data-v-7a2d217e]{padding:20px;border:1px solid var(--n-border-color);transition:background-color .2s;cursor:pointer}.setting-card[data-v-7a2d217e]:hover{background-color:rgba(165,165,165,.08)}.setting-tabs[data-v-f0a6d691]{--n-tab-gap: 0;--n-tab-font-size: 14px;--n-tab-padding: 14px 20px 12px;--n-tab-font-weight-active: 700} diff --git a/BTPanel/static/vite/css/index67.css b/BTPanel/static/vite/css/index67.css index 36ef4c98..7c21319b 100644 --- a/BTPanel/static/vite/css/index67.css +++ b/BTPanel/static/vite/css/index67.css @@ -1 +1 @@ -.feature-box[data-v-d809d67a]{background:var(--pay-color-bg)}.feature-box .feature-title[data-v-d809d67a]{color:var(--pay-color)}.feature-box .feature-text[data-v-d809d67a]{color:var(--color-text-1)}.feature-box .feature-desc[data-v-d809d67a]{color:var(--color-text-2)}.pay-info-bg[data-v-d809d67a]{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAI8AAABuCAYAAAAee0C0AAAABHNCSVQICAgIfAhkiAAAA+hJREFUeJzt3V1uozAYheHPzqyhUq7qnZCsJEvpWroSwk6YK9TuoXguQtJWk7TwBf/F73PVkVJA6ARMxwcbuYMfWiciTjb2Wby4e7aVDSO9fIx/RUTMdn9MfDRZM5pf8kPrZGObhwnMLePYEaDbFofHD+1OrG1CHEy2CNFVi8JTZXDOCNB/7LJPVxocERFrm2mMh8ns8Pih3QU8jjJsKv7yXDH/ylPzVefMi+Pq82lWeDhhuGbulceFPIjCuNQHkItlA2aIbOxz6kPIxbzwcMJwBVceqBEeqBEeqBEeqBEeqBEeqBEeqBEeqBEeqBEeqBEeqBEeqBEeqBEeqP1JuncjvYjIuWS3qkRFxEsRMn+92e77ezaQJjynVmZ378HP4d+7Q+QQuULmezf+rbs0ZDW1oiThMU/Na7SdfYydWOui7a80XpxY6/zQLq5Xxx/zjGMXc3dmu+8vt0fcZm3j37qXRb8S6liyEmJM9aD8e3eY+9n44WE+dN4WdNPihydycc4PbSkD2HxYO+vqk+a2Ze0hRn358ioYLDbnC57u7zynAVoTdDDrxYkPtvXqpf0joYg8/AuiSnW6Yvc/faSOpy0EQXigRnigRnigRnigRnigRnigRnigRnigRnigRnigRnigRnigRnigRnigRniglm4y2OdyjH2gPZS1fGXI9qxIkIVn0oQnzsJnvUghC8zFOR/Htc9FkttWzBXzzHZ/zLr0Z6SPdT7WPhcP3xjNXuxC4sd657+O0h+N0SDqeNrKuaUa/9jcWhtK1RjdRdvd0O6yfuKKvfRk6QPmaaXgXejdFPGkJRKlQeuH1i15icEc6RujOIlxPlZuz9Yx5kEQhAdqhAdqhAdqhAdqhAdqhAdqhAdqhAdqhAdqhAdqhAdqhAdqhAdqhAdqhAdqhAdqqRujwZaKvKz1WcI0VJHgxb8QU3IftjE6hbL3QxukaruqcXwNvd6q2e6Pfmj7ucshzRH/thWxISlSQGN0jLNQr8j6S2bGDw8FvLRojC5EYL9ya22ojqetnMc8ObdZf1FHYzRnEc/H2k9caZ62To3R87/6YPvZ2CbrqvHZufAX8g0iAV50lbQxOv0U7pZS2vqiIW+vAc5FHWMeBEF4oEZ4oEZ4oEZ4oEZ4oEZ4oEZ4oEZ4oEZ4oEZ4oEZ4lirhP1ojITwKP750u+D5OUsRHo0bk8izf9v8ytJNySicf+tevs2/KWlhuJUQnnt8nX9T2tyhFZjzD35onWxuTEaq7BuFybWazlQmMNv90YiI+PfuQECwyDh2ppiVYZAdS3CgxaM61GzWPW5kza7ZXUZdvj6qM3DG76Y7lXlqXv8BqzhKE51zypkAAAAASUVORK5CYII=);width:144px;height:110px;position:absolute;left:50%;bottom:30px;margin-left:-72px}.contrast[data-v-d809d67a]{position:absolute;left:50%;bottom:50px;display:flex;align-items:center;justify-content:center;width:156px;height:40px;margin-left:-78px;border-radius:10px;border:2px solid var(--pay-color-border);color:var(--pay-color);font-size:16px;text-align:center;z-index:1;cursor:pointer}.n-spin-container[data-v-b8f5f34f] .n-spin-body{--n-size: 40px;--n-color: var(--color-text-2);--n-text-color: var(--color-text-2)}.loading-icon[data-v-b8f5f34f]{animation:rotating-b8f5f34f 2s linear infinite}@keyframes rotating-b8f5f34f{0%{transform:rotate(0)}to{transform:rotate(360deg)}}.product-section[data-v-f226922f]{margin-bottom:24px}.product-section .section-title[data-v-f226922f]{font-size:16px;color:var(--color-text-2)}.product-section .section-body[data-v-f226922f]{margin-top:16px}.n-carousel[data-v-e3e62edc] .n-carousel__arrow-group{position:sticky;bottom:auto;right:auto}.n-carousel[data-v-e3e62edc] .n-carousel__arrow-group .n-carousel__arrow{position:absolute;bottom:0;width:30px;height:95px;display:flex;justify-content:center;align-items:center;background-color:var(--pay-color-bg);border:1px solid var(--pay-color-border);border-radius:4px;cursor:pointer;color:var(--color-text-3);z-index:9999}.n-carousel[data-v-e3e62edc] .n-carousel__arrow-group .n-carousel__arrow.n-carousel__arrow--disabled{display:none}.n-carousel[data-v-e3e62edc] .n-carousel__arrow-group .n-carousel__arrow:nth-of-type(2){right:0}.radio-item.pro[data-v-e3e62edc]{--text-color: var(--pay-color);--text-active-color: #ff4d00;--desc-color: var(--color-text-3);--desc-active-color: var(--color-text-3);--bg-active-color: var(--pay-color-bg);--border-active-color: var(--pay-color-border);--img-checked-url: url("data:image/svg+xml,%3c?xml%20version='1.0'%20encoding='iso-8859-1'?%3e%3c!--%20Generator:%20Adobe%20Illustrator%2025.2.0,%20SVG%20Export%20Plug-In%20.%20SVG%20Version:%206.00%20Build%200)%20--%3e%3csvg%20version='1.1'%20id='&%23x56FE;&%23x5C42;_1'%20xmlns='http://www.w3.org/2000/svg'%20xmlns:xlink='http://www.w3.org/1999/xlink'%20x='0px'%20y='0px'%20viewBox='0%200%2020%2020'%20style='enable-background:new%200%200%2020%2020;'%20xml:space='preserve'%3e%3cg%3e%3cpolygon%20style='fill:%23D98704;'%20points='20,20%200,20%2020,0%20'/%3e%3c/g%3e%3cg%3e%3cpath%20style='fill:%23FFFFFF;'%20d='M11.56,18.215l-3.189-3.189c-0.096-0.096-0.096-0.251,0-0.347l0.36-0.36%20c0.096-0.096,0.251-0.096,0.347,0l3.189,3.189c0.096,0.096,0.096,0.251,0,0.347l-0.36,0.36C11.811,18.31,11.656,18.31,11.56,18.215%20z'/%3e%3cpath%20style='fill:%23FFFFFF;'%20d='M18.274,10.787l0.354,0.354c0.098,0.098,0.098,0.256,0,0.354l-6.718,6.718%20c-0.098,0.098-0.256,0.098-0.354,0l-0.354-0.354c-0.098-0.098-0.098-0.256,0-0.354l6.718-6.718%20C18.018,10.689,18.176,10.689,18.274,10.787z'/%3e%3c/g%3e%3c/svg%3e")}.radio-item[data-v-e3e62edc]{position:relative;padding:20px 12px;border:1px solid var(--color-border);border-radius:4px;cursor:pointer}.radio-item .new-price[data-v-e3e62edc]{width:100%;margin-bottom:8px;padding-top:4px;font-size:14px;text-align:center;color:#999}.radio-item .new-price .number[data-v-e3e62edc]{font-size:18px;color:var(--text-color);font-weight:700}.radio-item .new-price .number .symbol[data-v-e3e62edc]{font-size:20px}.radio-item .old-price[data-v-e3e62edc]{width:100%;text-decoration:line-through;color:var(--color-text-3);text-align:center;font-size:13px}.radio-item .day-price[data-v-e3e62edc]{width:100%;padding-top:12px;text-align:center;color:var(--desc-color)}.radio-item .tips[data-v-e3e62edc]{position:absolute;left:-8px;top:-12px;background-image:linear-gradient(to bottom,#f8d68c,#ebb261);border-radius:5px;color:#7e4c0d;transform:scale(.9);font-style:normal;padding:5px}.radio-item .checked[data-v-e3e62edc]{display:none;position:absolute;right:0;bottom:0;width:36px;height:36px;background:var(--img-checked-url) no-repeat right bottom;background-size:cover}.radio-item.active[data-v-e3e62edc]{border:1px solid var(--border-active-color);background-color:var(--bg-active-color)}.radio-item.active .new-price .number[data-v-e3e62edc]{color:var(--text-active-color)}.radio-item.active .day-price[data-v-e3e62edc]{color:var(--desc-active-color)}.radio-item.active .checked[data-v-e3e62edc]{display:block}.product-selector[data-v-a92aa359]{display:flex;flex-wrap:wrap;gap:16px}.product-selector .product-option[data-v-a92aa359]{position:relative;min-width:92px;border:1px solid var(--color-border);border-radius:4px;padding:12px 16px;font-size:14px;color:var(--color-text-2);text-align:center;cursor:pointer}.product-selector .product-option[data-v-a92aa359]:after{content:"";position:absolute;right:0;bottom:0;display:none;width:22px;height:22px;border-bottom-right-radius:2px;background-position:right bottom;background-image:url("data:image/svg+xml,%3c?xml%20version='1.0'%20encoding='iso-8859-1'?%3e%3c!--%20Generator:%20Adobe%20Illustrator%2025.2.0,%20SVG%20Export%20Plug-In%20.%20SVG%20Version:%206.00%20Build%200)%20--%3e%3csvg%20version='1.1'%20id='&%23x56FE;&%23x5C42;_1'%20xmlns='http://www.w3.org/2000/svg'%20xmlns:xlink='http://www.w3.org/1999/xlink'%20x='0px'%20y='0px'%20viewBox='0%200%2020%2020'%20style='enable-background:new%200%200%2020%2020;'%20xml:space='preserve'%3e%3cg%3e%3cpolygon%20style='fill:%23D98704;'%20points='20,20%200,20%2020,0%20'/%3e%3c/g%3e%3cg%3e%3cpath%20style='fill:%23FFFFFF;'%20d='M11.56,18.215l-3.189-3.189c-0.096-0.096-0.096-0.251,0-0.347l0.36-0.36%20c0.096-0.096,0.251-0.096,0.347,0l3.189,3.189c0.096,0.096,0.096,0.251,0,0.347l-0.36,0.36C11.811,18.31,11.656,18.31,11.56,18.215%20z'/%3e%3cpath%20style='fill:%23FFFFFF;'%20d='M18.274,10.787l0.354,0.354c0.098,0.098,0.098,0.256,0,0.354l-6.718,6.718%20c-0.098,0.098-0.256,0.098-0.354,0l-0.354-0.354c-0.098-0.098-0.098-0.256,0-0.354l6.718-6.718%20C18.018,10.689,18.176,10.689,18.274,10.787z'/%3e%3c/g%3e%3c/svg%3e")}.product-selector .product-option.active[data-v-a92aa359]{border-color:var(--pay-color-border);background-color:var(--pay-color-bg)}.product-selector .product-option.active[data-v-a92aa359]:after{display:block}.product-selector .product-option .discount[data-v-a92aa359]{position:absolute;right:-4px;top:-13px;background-image:linear-gradient(to bottom,#f8d68c,#ebb261);border-radius:1px 11px;color:#7e4c0d;transform:scale(.9);font-style:normal;padding:2px 4px;font-size:11px}.coupon-box[data-v-8674d607]{--checked-color: var(--pay-color);height:36px;display:flex;align-items:center;border-radius:4px;padding-left:10px;color:var(--color-text-2);border:1px solid var(--color-border);cursor:pointer;transition:all .3s}.coupon-box.active[data-v-8674d607]{border-color:var(--pay-color-border);background-color:var(--pay-color-bg)}.coupon-box.active .n-checkbox[data-v-8674d607]{--n-text-color: var(--color-text-2)}.coupon-box .n-checkbox[data-v-8674d607]{--n-color-checked: var(--checked-color);--n-border-checked: 1px solid var(--checked-color);--n-border-focus: 1px solid var(--checked-color);--n-box-shadow-focus: 0 0 0 2px rgba(228, 169, 60, .3);--n-text-color: var(--color-text-2)}.coupon-box .n-select[data-v-8674d607] .n-base-selection{--n-color: transparent;--n-color-active: transparent;--n-color-disabled: transparent;--n-border: none;--n-border-active: none;--n-border-focus: none;--n-border-hover: none;--n-box-shadow-active: none;--n-box-shadow-focus: none;--n-caret-color: var(--checked-color);--n-loading-color: var(--checked-color);--n-text-color: var(--checked-color);--n-text-color-disabled: var(--checked-color)}.pay-text-color[data-v-5fc19cba],.pay-price-color[data-v-5fc19cba]{color:var(--pay-color)}.n-checkbox[data-v-5fc19cba]{--n-border-checked: 1px solid var(--pay-color);--n-border-focus: 1px solid var(--pay-color);--n-color-checked: var(--pay-color);--n-box-shadow-focus: 0 0 0 2px rgba(255, 143, 0, .3)}.buy-sub-box[data-v-5fc19cba]{display:flex;line-height:22px}.buy-sub-box+.buy-sub-box[data-v-5fc19cba]{margin-top:4px}.buy-sub-box.none[data-v-5fc19cba]{color:var(--color-text-3)}.buy-sub-box.none .n-checkbox[data-v-5fc19cba]{--n-text-color: var(--color-text-3)}.buy-sub-box .checkbox-box[data-v-5fc19cba]{width:124px}.pay-menu.pro[data-v-841898b5]{--text-active-color: var(--pay-color)}.pay-menu[data-v-841898b5]{--n-tab-gap-vertical: 0;--n-tab-font-size: 13px;--n-tab-text-color: var(--color-text-2);--n-tab-text-color-hover: var(--text-active-color);--n-tab-text-color-active: var(--text-active-color);--n-pane-padding-top: 0;--n-pane-padding-left: 0;--n-pane-padding-right: 0;--n-pane-padding-bottom: 0;--n-tab-border-color: var(--color-border);--n-tab-color: var(--color-modal);border:1px solid var(--color-border);border-radius:4px;overflow:hidden;height:200px}.pay-menu[data-v-841898b5]>.n-tabs-nav .n-tabs-scroll-padding{border:none}.pay-menu[data-v-841898b5]>.n-tabs-nav .n-tabs-tab-wrapper .n-tabs-tab{width:142px;height:40px;border-radius:0;border-left:none;border-top:none}.voucher-list[data-v-13e5d52c]{display:flex;flex-wrap:wrap;gap:16px 12px}.voucher-item[data-v-13e5d52c]{position:relative;display:flex;flex-direction:column;align-items:center;justify-content:center;width:160px;height:72px;border-radius:4px;border:2px solid var(--color-border);cursor:pointer;transition:all .3s ease}.voucher-item[data-v-13e5d52c]:before,.voucher-item[data-v-13e5d52c]:after{content:"";position:absolute;display:block;width:9px;height:18px;background-color:var(--color-modal);border:2px solid var(--color-border);transition:all .3s ease}.voucher-item[data-v-13e5d52c]:before{left:-2px;top:50%;margin-top:-9px;border-left:none;border-radius:0 1rem 1rem 0}.voucher-item[data-v-13e5d52c]:after{right:-2px;top:50%;margin-top:-9px;border-right:none;border-radius:1rem 0 0 1rem}.voucher-item.selected[data-v-13e5d52c]{border:2px solid var(--pay-color-border);background:var(--pay-color-bg)}.voucher-item.selected[data-v-13e5d52c]:before,.voucher-item.selected[data-v-13e5d52c]:after{border-color:var(--pay-color-border)}.voucher-item.selected .voucher-name[data-v-13e5d52c]{color:var(--pay-color-border)}.voucher-item .voucher-name[data-v-13e5d52c]{margin-bottom:12px;font-size:16px;color:var(--color-text-2);font-weight:600;transition:all .3s ease}.voucher-item .voucher-date[data-v-13e5d52c]{font-size:10px;color:var(--color-text-3)}.voucher-container[data-v-1b8f5a84]{height:100%}.pay-container[data-v-f0437695]{display:flex;width:100%;height:100%}.pay-container .pay-sidebar[data-v-f0437695]{width:230px}.pay-container .pay-body[data-v-f0437695]{flex:1;display:flex;flex-direction:column;overflow:hidden}.pay-container .pay-body .pay-main[data-v-f0437695]{position:relative;flex:1;padding:20px;overflow:hidden}.product-tabs[data-v-f0437695]{display:flex;background-color:var(--color-tabs);border-top-right-radius:4px}.product-tabs .tab-item[data-v-f0437695]{position:relative;display:flex;flex-direction:column;align-items:center;justify-content:center;min-width:160px;height:76px;padding:0 12px 2px;font-size:12px;text-align:center;cursor:pointer}.product-tabs .tab-item.active[data-v-f0437695]{background-color:var(--color-modal)}.product-tabs .tab-item.active.pro .tab-title[data-v-f0437695]{color:var(--pay-color)}.product-tabs .tab-item .tab-title[data-v-f0437695]{display:flex;align-items:center;justify-content:center;gap:8px;color:var(--color-text-2);font-size:16px}.product-tabs .tab-item .tab-title .text[data-v-f0437695]{padding-top:3px;font-weight:700}.product-tabs .tab-item .tab-desc[data-v-f0437695]{margin-top:8px;color:var(--color-text-3)} +.ul-style[data-v-73d2f93d]{margin:0 auto;display:flex;align-items:center;justify-content:center;gap:48px;font-size:16px;list-style:square}.ul-style li[data-v-73d2f93d]{list-style:square}.install-tabs[data-v-73d2f93d]{--n-tab-font-size: 14px;--n-pane-padding-top: 0;--n-pane-padding-left: 24px;--n-tab-font-weight-active: bold} diff --git a/BTPanel/static/vite/css/index68.css b/BTPanel/static/vite/css/index68.css index b7db7f30..e3c59cfd 100644 --- a/BTPanel/static/vite/css/index68.css +++ b/BTPanel/static/vite/css/index68.css @@ -1 +1 @@ -.login-container[data-v-ca907ead]{display:flex;width:100%;max-width:960px;height:480px;background-color:var(--color-bg-2);border-radius:10px;overflow:hidden}.left-panel[data-v-ca907ead]{width:50%;padding:32px;background:var(--setting-panel-bind-account-left-bg)}.right-panel[data-v-ca907ead]{width:50%;padding:24px 32px}h1[data-v-ca907ead]{margin-bottom:40px;font-size:32px;font-weight:700}.feature-list[data-v-ca907ead]{list-style:none;margin-top:20px}.feature-list li[data-v-ca907ead]{position:relative;font-size:14px;display:flex;gap:6px;line-height:22px}.feature-list li[data-v-ca907ead]:first-of-type{margin-bottom:16px}.feature-list li+li[data-v-ca907ead]{margin-top:10px}.feature-list li span[data-v-ca907ead]:first-of-type{display:flex;justify-content:center;width:20px;height:20px}.skip-link[data-v-ca907ead]{position:absolute;right:24px;bottom:16px;text-align:right;margin-top:30px}.skip-link a[data-v-ca907ead]{color:#999;text-decoration:none}.n-divider[data-v-ca907ead]{font-size:14px}.google-btn[data-v-ca907ead]{--n-text-color: var(--color-text-1)} +.website-name[data-v-5103c19c]{display:flex;align-items:center;gap:8px;width:100%}.website-icon[data-v-5103c19c]{width:24px;flex-shrink:0;cursor:pointer}.website-info[data-v-5103c19c]{flex:1;min-width:0;overflow:hidden}.website-description[data-v-5103c19c]{margin-top:2px}.website-status[data-v-a66f2bce]{display:inline-flex;font-size:20px;cursor:pointer}.n-date-panel[data-v-4583ec55]{margin:0}.n-date-panel[data-v-4583ec55] .n-date-panel-calendar{padding:6px 0 12px}.n-date-panel[data-v-4583ec55] .n-date-panel--month .n-date-panel-footer{display:none}.n-date-panel[data-v-4583ec55] .n-date-panel-footer{padding:12px 0 6px}.n-data-table[data-v-fca1cf0d] .requests .n-data-table-th__title-wrapper{justify-content:center} diff --git a/BTPanel/static/vite/css/index69.css b/BTPanel/static/vite/css/index69.css index cabaf9b5..88ff8b74 100644 --- a/BTPanel/static/vite/css/index69.css +++ b/BTPanel/static/vite/css/index69.css @@ -1 +1 @@ -.install[data-v-7b9da2ab]:before{content:"";margin-right:8px;display:inline-block;width:8px;height:8px;border-radius:50%;--un-bg-opacity:1;background-color:rgb(32 165 58 / var(--un-bg-opacity))}.cmd[data-v-7b9da2ab]{margin-top:10px;margin-bottom:10px;height:200px;overflow:auto;white-space:pre-line;--un-bg-opacity:1;background-color:rgb(66 66 81 / var(--un-bg-opacity));padding:5px;--un-text-opacity:1;color:rgb(255 255 255 / var(--un-text-opacity));line-height:22px}[data-v-8405edde] .bt-log .hljs{padding:5px 0 5px 5px!important} +.website-status[data-v-dd29927d]{display:flex;padding-left:10px;font-size:20px;cursor:pointer}.website-name[data-v-35c01248]{display:flex;align-items:center;gap:8px;width:100%}.website-icon[data-v-35c01248]{width:24px;flex-shrink:0;cursor:pointer}.website-info[data-v-35c01248]{flex:1;min-width:0;overflow:hidden}.website-description[data-v-35c01248]{margin-top:2px}.warning[data-v-5757bceb]{padding:8px;border-radius:4px;background-color:#fdf6ec;color:#e6a23c}[data-v-e04ced1d] .row-padding>:last-child{padding-left:0!important}[data-v-86934d13] .row-padding>:last-child{padding-left:0!important}.tips[data-v-87e0a648]{margin-left:10px;--un-text-opacity:1;color:rgb(102 102 102 / var(--un-text-opacity))}.n-alert[data-v-1f152531]{--n-font-size: 12px}.cert-info[data-v-1f152531]{display:flex;align-items:center;height:24px}.cert-info .cert-label[data-v-1f152531]{color:var(--site-config-ssl-label);font-weight:700}.cert-info .cert-value[data-v-1f152531]{flex:1;width:0;margin-left:4px}.business-top-tips[data-v-c4bf96b6]{background:var(--site-config-business-tips)}.n-alert[data-v-31e23451]{--n-font-size: 12px}.cert-info[data-v-31e23451]{display:flex;align-items:center;height:24px}.cert-info .cert-label[data-v-31e23451]{color:var(--site-config-ssl-label);font-weight:700}.cert-info .cert-value[data-v-31e23451]{flex:1;width:0;margin-left:4px}.tips[data-v-80e183ea]{margin-left:10px;--un-text-opacity:1;color:rgb(102 102 102 / var(--un-text-opacity))}[data-v-91452043] .n-alert .n-alert-body{--n-padding: 5px 8px}.ul-style[data-v-0744d9b2]{margin:0 auto;display:flex;align-items:center;justify-content:center;gap:20px;font-size:16px}.ul-style li[data-v-0744d9b2]{display:flex;align-items:center}.n-data-table[data-v-80fc5e14] .requests .n-data-table-th__title-wrapper{justify-content:center} diff --git a/BTPanel/static/vite/css/index70.css b/BTPanel/static/vite/css/index70.css index dae5e2fb..ad00bca2 100644 --- a/BTPanel/static/vite/css/index70.css +++ b/BTPanel/static/vite/css/index70.css @@ -1 +1 @@ -.border-view[data-v-4bcfd2a2]{width:90%;border-width:1px;border-color:var(--color-border);border-radius:4px;border-style:solid;padding:12px}[data-v-030ea397] .n-spin-description{color:#20a53a!important} +.text[data-v-2dca568f]{width:300px;cursor:default;--un-bg-opacity:1;background-color:rgb(247 247 247 / var(--un-bg-opacity));padding-left:10px;padding-right:10px;line-height:32px}.language[data-v-2dca568f]{width:300px}.language[data-v-2dca568f] .n-base-loading{display:none}.language[data-v-2dca568f] .n-base-selection--disabled{--n-border: none;--n-text-color-disabled: #333333}.language[data-v-2dca568f] .n-base-selection.n-base-selection--disabled .n-base-selection-label .n-base-selection-input,.language[data-v-2dca568f] .n-base-selection.n-base-selection--disabled .n-base-selection-label{cursor:default} diff --git a/BTPanel/static/vite/css/index71.css b/BTPanel/static/vite/css/index71.css index 7c9396e7..36ef4c98 100644 --- a/BTPanel/static/vite/css/index71.css +++ b/BTPanel/static/vite/css/index71.css @@ -1 +1 @@ -.n-card[data-v-bb5721bc]{--n-title-font-size: 12px;--n-title-font-weight: bold} +.feature-box[data-v-d809d67a]{background:var(--pay-color-bg)}.feature-box .feature-title[data-v-d809d67a]{color:var(--pay-color)}.feature-box .feature-text[data-v-d809d67a]{color:var(--color-text-1)}.feature-box .feature-desc[data-v-d809d67a]{color:var(--color-text-2)}.pay-info-bg[data-v-d809d67a]{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAI8AAABuCAYAAAAee0C0AAAABHNCSVQICAgIfAhkiAAAA+hJREFUeJzt3V1uozAYheHPzqyhUq7qnZCsJEvpWroSwk6YK9TuoXguQtJWk7TwBf/F73PVkVJA6ARMxwcbuYMfWiciTjb2Wby4e7aVDSO9fIx/RUTMdn9MfDRZM5pf8kPrZGObhwnMLePYEaDbFofHD+1OrG1CHEy2CNFVi8JTZXDOCNB/7LJPVxocERFrm2mMh8ns8Pih3QU8jjJsKv7yXDH/ylPzVefMi+Pq82lWeDhhuGbulceFPIjCuNQHkItlA2aIbOxz6kPIxbzwcMJwBVceqBEeqBEeqBEeqBEeqBEeqBEeqBEeqBEeqBEeqBEeqBEeqBEeqBEeqP1JuncjvYjIuWS3qkRFxEsRMn+92e77ezaQJjynVmZ378HP4d+7Q+QQuULmezf+rbs0ZDW1oiThMU/Na7SdfYydWOui7a80XpxY6/zQLq5Xxx/zjGMXc3dmu+8vt0fcZm3j37qXRb8S6liyEmJM9aD8e3eY+9n44WE+dN4WdNPihydycc4PbSkD2HxYO+vqk+a2Ze0hRn358ioYLDbnC57u7zynAVoTdDDrxYkPtvXqpf0joYg8/AuiSnW6Yvc/faSOpy0EQXigRnigRnigRnigRnigRnigRnigRnigRnigRnigRnigRnigRnigRnigRniglm4y2OdyjH2gPZS1fGXI9qxIkIVn0oQnzsJnvUghC8zFOR/Htc9FkttWzBXzzHZ/zLr0Z6SPdT7WPhcP3xjNXuxC4sd657+O0h+N0SDqeNrKuaUa/9jcWhtK1RjdRdvd0O6yfuKKvfRk6QPmaaXgXejdFPGkJRKlQeuH1i15icEc6RujOIlxPlZuz9Yx5kEQhAdqhAdqhAdqhAdqhAdqhAdqhAdqhAdqhAdqhAdqhAdqhAdqhAdqhAdqhAdqhAdqqRujwZaKvKz1WcI0VJHgxb8QU3IftjE6hbL3QxukaruqcXwNvd6q2e6Pfmj7ucshzRH/thWxISlSQGN0jLNQr8j6S2bGDw8FvLRojC5EYL9ya22ojqetnMc8ObdZf1FHYzRnEc/H2k9caZ62To3R87/6YPvZ2CbrqvHZufAX8g0iAV50lbQxOv0U7pZS2vqiIW+vAc5FHWMeBEF4oEZ4oEZ4oEZ4oEZ4oEZ4oEZ4oEZ4oEZ4oEZ4oEZ4lirhP1ojITwKP750u+D5OUsRHo0bk8izf9v8ytJNySicf+tevs2/KWlhuJUQnnt8nX9T2tyhFZjzD35onWxuTEaq7BuFybWazlQmMNv90YiI+PfuQECwyDh2ppiVYZAdS3CgxaM61GzWPW5kza7ZXUZdvj6qM3DG76Y7lXlqXv8BqzhKE51zypkAAAAASUVORK5CYII=);width:144px;height:110px;position:absolute;left:50%;bottom:30px;margin-left:-72px}.contrast[data-v-d809d67a]{position:absolute;left:50%;bottom:50px;display:flex;align-items:center;justify-content:center;width:156px;height:40px;margin-left:-78px;border-radius:10px;border:2px solid var(--pay-color-border);color:var(--pay-color);font-size:16px;text-align:center;z-index:1;cursor:pointer}.n-spin-container[data-v-b8f5f34f] .n-spin-body{--n-size: 40px;--n-color: var(--color-text-2);--n-text-color: var(--color-text-2)}.loading-icon[data-v-b8f5f34f]{animation:rotating-b8f5f34f 2s linear infinite}@keyframes rotating-b8f5f34f{0%{transform:rotate(0)}to{transform:rotate(360deg)}}.product-section[data-v-f226922f]{margin-bottom:24px}.product-section .section-title[data-v-f226922f]{font-size:16px;color:var(--color-text-2)}.product-section .section-body[data-v-f226922f]{margin-top:16px}.n-carousel[data-v-e3e62edc] .n-carousel__arrow-group{position:sticky;bottom:auto;right:auto}.n-carousel[data-v-e3e62edc] .n-carousel__arrow-group .n-carousel__arrow{position:absolute;bottom:0;width:30px;height:95px;display:flex;justify-content:center;align-items:center;background-color:var(--pay-color-bg);border:1px solid var(--pay-color-border);border-radius:4px;cursor:pointer;color:var(--color-text-3);z-index:9999}.n-carousel[data-v-e3e62edc] .n-carousel__arrow-group .n-carousel__arrow.n-carousel__arrow--disabled{display:none}.n-carousel[data-v-e3e62edc] .n-carousel__arrow-group .n-carousel__arrow:nth-of-type(2){right:0}.radio-item.pro[data-v-e3e62edc]{--text-color: var(--pay-color);--text-active-color: #ff4d00;--desc-color: var(--color-text-3);--desc-active-color: var(--color-text-3);--bg-active-color: var(--pay-color-bg);--border-active-color: var(--pay-color-border);--img-checked-url: url("data:image/svg+xml,%3c?xml%20version='1.0'%20encoding='iso-8859-1'?%3e%3c!--%20Generator:%20Adobe%20Illustrator%2025.2.0,%20SVG%20Export%20Plug-In%20.%20SVG%20Version:%206.00%20Build%200)%20--%3e%3csvg%20version='1.1'%20id='&%23x56FE;&%23x5C42;_1'%20xmlns='http://www.w3.org/2000/svg'%20xmlns:xlink='http://www.w3.org/1999/xlink'%20x='0px'%20y='0px'%20viewBox='0%200%2020%2020'%20style='enable-background:new%200%200%2020%2020;'%20xml:space='preserve'%3e%3cg%3e%3cpolygon%20style='fill:%23D98704;'%20points='20,20%200,20%2020,0%20'/%3e%3c/g%3e%3cg%3e%3cpath%20style='fill:%23FFFFFF;'%20d='M11.56,18.215l-3.189-3.189c-0.096-0.096-0.096-0.251,0-0.347l0.36-0.36%20c0.096-0.096,0.251-0.096,0.347,0l3.189,3.189c0.096,0.096,0.096,0.251,0,0.347l-0.36,0.36C11.811,18.31,11.656,18.31,11.56,18.215%20z'/%3e%3cpath%20style='fill:%23FFFFFF;'%20d='M18.274,10.787l0.354,0.354c0.098,0.098,0.098,0.256,0,0.354l-6.718,6.718%20c-0.098,0.098-0.256,0.098-0.354,0l-0.354-0.354c-0.098-0.098-0.098-0.256,0-0.354l6.718-6.718%20C18.018,10.689,18.176,10.689,18.274,10.787z'/%3e%3c/g%3e%3c/svg%3e")}.radio-item[data-v-e3e62edc]{position:relative;padding:20px 12px;border:1px solid var(--color-border);border-radius:4px;cursor:pointer}.radio-item .new-price[data-v-e3e62edc]{width:100%;margin-bottom:8px;padding-top:4px;font-size:14px;text-align:center;color:#999}.radio-item .new-price .number[data-v-e3e62edc]{font-size:18px;color:var(--text-color);font-weight:700}.radio-item .new-price .number .symbol[data-v-e3e62edc]{font-size:20px}.radio-item .old-price[data-v-e3e62edc]{width:100%;text-decoration:line-through;color:var(--color-text-3);text-align:center;font-size:13px}.radio-item .day-price[data-v-e3e62edc]{width:100%;padding-top:12px;text-align:center;color:var(--desc-color)}.radio-item .tips[data-v-e3e62edc]{position:absolute;left:-8px;top:-12px;background-image:linear-gradient(to bottom,#f8d68c,#ebb261);border-radius:5px;color:#7e4c0d;transform:scale(.9);font-style:normal;padding:5px}.radio-item .checked[data-v-e3e62edc]{display:none;position:absolute;right:0;bottom:0;width:36px;height:36px;background:var(--img-checked-url) no-repeat right bottom;background-size:cover}.radio-item.active[data-v-e3e62edc]{border:1px solid var(--border-active-color);background-color:var(--bg-active-color)}.radio-item.active .new-price .number[data-v-e3e62edc]{color:var(--text-active-color)}.radio-item.active .day-price[data-v-e3e62edc]{color:var(--desc-active-color)}.radio-item.active .checked[data-v-e3e62edc]{display:block}.product-selector[data-v-a92aa359]{display:flex;flex-wrap:wrap;gap:16px}.product-selector .product-option[data-v-a92aa359]{position:relative;min-width:92px;border:1px solid var(--color-border);border-radius:4px;padding:12px 16px;font-size:14px;color:var(--color-text-2);text-align:center;cursor:pointer}.product-selector .product-option[data-v-a92aa359]:after{content:"";position:absolute;right:0;bottom:0;display:none;width:22px;height:22px;border-bottom-right-radius:2px;background-position:right bottom;background-image:url("data:image/svg+xml,%3c?xml%20version='1.0'%20encoding='iso-8859-1'?%3e%3c!--%20Generator:%20Adobe%20Illustrator%2025.2.0,%20SVG%20Export%20Plug-In%20.%20SVG%20Version:%206.00%20Build%200)%20--%3e%3csvg%20version='1.1'%20id='&%23x56FE;&%23x5C42;_1'%20xmlns='http://www.w3.org/2000/svg'%20xmlns:xlink='http://www.w3.org/1999/xlink'%20x='0px'%20y='0px'%20viewBox='0%200%2020%2020'%20style='enable-background:new%200%200%2020%2020;'%20xml:space='preserve'%3e%3cg%3e%3cpolygon%20style='fill:%23D98704;'%20points='20,20%200,20%2020,0%20'/%3e%3c/g%3e%3cg%3e%3cpath%20style='fill:%23FFFFFF;'%20d='M11.56,18.215l-3.189-3.189c-0.096-0.096-0.096-0.251,0-0.347l0.36-0.36%20c0.096-0.096,0.251-0.096,0.347,0l3.189,3.189c0.096,0.096,0.096,0.251,0,0.347l-0.36,0.36C11.811,18.31,11.656,18.31,11.56,18.215%20z'/%3e%3cpath%20style='fill:%23FFFFFF;'%20d='M18.274,10.787l0.354,0.354c0.098,0.098,0.098,0.256,0,0.354l-6.718,6.718%20c-0.098,0.098-0.256,0.098-0.354,0l-0.354-0.354c-0.098-0.098-0.098-0.256,0-0.354l6.718-6.718%20C18.018,10.689,18.176,10.689,18.274,10.787z'/%3e%3c/g%3e%3c/svg%3e")}.product-selector .product-option.active[data-v-a92aa359]{border-color:var(--pay-color-border);background-color:var(--pay-color-bg)}.product-selector .product-option.active[data-v-a92aa359]:after{display:block}.product-selector .product-option .discount[data-v-a92aa359]{position:absolute;right:-4px;top:-13px;background-image:linear-gradient(to bottom,#f8d68c,#ebb261);border-radius:1px 11px;color:#7e4c0d;transform:scale(.9);font-style:normal;padding:2px 4px;font-size:11px}.coupon-box[data-v-8674d607]{--checked-color: var(--pay-color);height:36px;display:flex;align-items:center;border-radius:4px;padding-left:10px;color:var(--color-text-2);border:1px solid var(--color-border);cursor:pointer;transition:all .3s}.coupon-box.active[data-v-8674d607]{border-color:var(--pay-color-border);background-color:var(--pay-color-bg)}.coupon-box.active .n-checkbox[data-v-8674d607]{--n-text-color: var(--color-text-2)}.coupon-box .n-checkbox[data-v-8674d607]{--n-color-checked: var(--checked-color);--n-border-checked: 1px solid var(--checked-color);--n-border-focus: 1px solid var(--checked-color);--n-box-shadow-focus: 0 0 0 2px rgba(228, 169, 60, .3);--n-text-color: var(--color-text-2)}.coupon-box .n-select[data-v-8674d607] .n-base-selection{--n-color: transparent;--n-color-active: transparent;--n-color-disabled: transparent;--n-border: none;--n-border-active: none;--n-border-focus: none;--n-border-hover: none;--n-box-shadow-active: none;--n-box-shadow-focus: none;--n-caret-color: var(--checked-color);--n-loading-color: var(--checked-color);--n-text-color: var(--checked-color);--n-text-color-disabled: var(--checked-color)}.pay-text-color[data-v-5fc19cba],.pay-price-color[data-v-5fc19cba]{color:var(--pay-color)}.n-checkbox[data-v-5fc19cba]{--n-border-checked: 1px solid var(--pay-color);--n-border-focus: 1px solid var(--pay-color);--n-color-checked: var(--pay-color);--n-box-shadow-focus: 0 0 0 2px rgba(255, 143, 0, .3)}.buy-sub-box[data-v-5fc19cba]{display:flex;line-height:22px}.buy-sub-box+.buy-sub-box[data-v-5fc19cba]{margin-top:4px}.buy-sub-box.none[data-v-5fc19cba]{color:var(--color-text-3)}.buy-sub-box.none .n-checkbox[data-v-5fc19cba]{--n-text-color: var(--color-text-3)}.buy-sub-box .checkbox-box[data-v-5fc19cba]{width:124px}.pay-menu.pro[data-v-841898b5]{--text-active-color: var(--pay-color)}.pay-menu[data-v-841898b5]{--n-tab-gap-vertical: 0;--n-tab-font-size: 13px;--n-tab-text-color: var(--color-text-2);--n-tab-text-color-hover: var(--text-active-color);--n-tab-text-color-active: var(--text-active-color);--n-pane-padding-top: 0;--n-pane-padding-left: 0;--n-pane-padding-right: 0;--n-pane-padding-bottom: 0;--n-tab-border-color: var(--color-border);--n-tab-color: var(--color-modal);border:1px solid var(--color-border);border-radius:4px;overflow:hidden;height:200px}.pay-menu[data-v-841898b5]>.n-tabs-nav .n-tabs-scroll-padding{border:none}.pay-menu[data-v-841898b5]>.n-tabs-nav .n-tabs-tab-wrapper .n-tabs-tab{width:142px;height:40px;border-radius:0;border-left:none;border-top:none}.voucher-list[data-v-13e5d52c]{display:flex;flex-wrap:wrap;gap:16px 12px}.voucher-item[data-v-13e5d52c]{position:relative;display:flex;flex-direction:column;align-items:center;justify-content:center;width:160px;height:72px;border-radius:4px;border:2px solid var(--color-border);cursor:pointer;transition:all .3s ease}.voucher-item[data-v-13e5d52c]:before,.voucher-item[data-v-13e5d52c]:after{content:"";position:absolute;display:block;width:9px;height:18px;background-color:var(--color-modal);border:2px solid var(--color-border);transition:all .3s ease}.voucher-item[data-v-13e5d52c]:before{left:-2px;top:50%;margin-top:-9px;border-left:none;border-radius:0 1rem 1rem 0}.voucher-item[data-v-13e5d52c]:after{right:-2px;top:50%;margin-top:-9px;border-right:none;border-radius:1rem 0 0 1rem}.voucher-item.selected[data-v-13e5d52c]{border:2px solid var(--pay-color-border);background:var(--pay-color-bg)}.voucher-item.selected[data-v-13e5d52c]:before,.voucher-item.selected[data-v-13e5d52c]:after{border-color:var(--pay-color-border)}.voucher-item.selected .voucher-name[data-v-13e5d52c]{color:var(--pay-color-border)}.voucher-item .voucher-name[data-v-13e5d52c]{margin-bottom:12px;font-size:16px;color:var(--color-text-2);font-weight:600;transition:all .3s ease}.voucher-item .voucher-date[data-v-13e5d52c]{font-size:10px;color:var(--color-text-3)}.voucher-container[data-v-1b8f5a84]{height:100%}.pay-container[data-v-f0437695]{display:flex;width:100%;height:100%}.pay-container .pay-sidebar[data-v-f0437695]{width:230px}.pay-container .pay-body[data-v-f0437695]{flex:1;display:flex;flex-direction:column;overflow:hidden}.pay-container .pay-body .pay-main[data-v-f0437695]{position:relative;flex:1;padding:20px;overflow:hidden}.product-tabs[data-v-f0437695]{display:flex;background-color:var(--color-tabs);border-top-right-radius:4px}.product-tabs .tab-item[data-v-f0437695]{position:relative;display:flex;flex-direction:column;align-items:center;justify-content:center;min-width:160px;height:76px;padding:0 12px 2px;font-size:12px;text-align:center;cursor:pointer}.product-tabs .tab-item.active[data-v-f0437695]{background-color:var(--color-modal)}.product-tabs .tab-item.active.pro .tab-title[data-v-f0437695]{color:var(--pay-color)}.product-tabs .tab-item .tab-title[data-v-f0437695]{display:flex;align-items:center;justify-content:center;gap:8px;color:var(--color-text-2);font-size:16px}.product-tabs .tab-item .tab-title .text[data-v-f0437695]{padding-top:3px;font-weight:700}.product-tabs .tab-item .tab-desc[data-v-f0437695]{margin-top:8px;color:var(--color-text-3)} diff --git a/BTPanel/static/vite/css/index72.css b/BTPanel/static/vite/css/index72.css index 07e95254..b7db7f30 100644 --- a/BTPanel/static/vite/css/index72.css +++ b/BTPanel/static/vite/css/index72.css @@ -1 +1 @@ -.list_box[data-v-872a97b6]{margin-top:16px;margin-bottom:16px;flex-wrap:nowrap;align-items:center;padding-top:2px;padding-bottom:2px} +.login-container[data-v-ca907ead]{display:flex;width:100%;max-width:960px;height:480px;background-color:var(--color-bg-2);border-radius:10px;overflow:hidden}.left-panel[data-v-ca907ead]{width:50%;padding:32px;background:var(--setting-panel-bind-account-left-bg)}.right-panel[data-v-ca907ead]{width:50%;padding:24px 32px}h1[data-v-ca907ead]{margin-bottom:40px;font-size:32px;font-weight:700}.feature-list[data-v-ca907ead]{list-style:none;margin-top:20px}.feature-list li[data-v-ca907ead]{position:relative;font-size:14px;display:flex;gap:6px;line-height:22px}.feature-list li[data-v-ca907ead]:first-of-type{margin-bottom:16px}.feature-list li+li[data-v-ca907ead]{margin-top:10px}.feature-list li span[data-v-ca907ead]:first-of-type{display:flex;justify-content:center;width:20px;height:20px}.skip-link[data-v-ca907ead]{position:absolute;right:24px;bottom:16px;text-align:right;margin-top:30px}.skip-link a[data-v-ca907ead]{color:#999;text-decoration:none}.n-divider[data-v-ca907ead]{font-size:14px}.google-btn[data-v-ca907ead]{--n-text-color: var(--color-text-1)} diff --git a/BTPanel/static/vite/css/index73.css b/BTPanel/static/vite/css/index73.css index 9d11d79e..cabaf9b5 100644 --- a/BTPanel/static/vite/css/index73.css +++ b/BTPanel/static/vite/css/index73.css @@ -1 +1 @@ -.list_box[data-v-4193d178]{margin-top:16px;margin-bottom:16px;flex-wrap:nowrap;align-items:center;padding-top:2px;padding-bottom:2px} +.install[data-v-7b9da2ab]:before{content:"";margin-right:8px;display:inline-block;width:8px;height:8px;border-radius:50%;--un-bg-opacity:1;background-color:rgb(32 165 58 / var(--un-bg-opacity))}.cmd[data-v-7b9da2ab]{margin-top:10px;margin-bottom:10px;height:200px;overflow:auto;white-space:pre-line;--un-bg-opacity:1;background-color:rgb(66 66 81 / var(--un-bg-opacity));padding:5px;--un-text-opacity:1;color:rgb(255 255 255 / var(--un-text-opacity));line-height:22px}[data-v-8405edde] .bt-log .hljs{padding:5px 0 5px 5px!important} diff --git a/BTPanel/static/vite/css/index74.css b/BTPanel/static/vite/css/index74.css index 7cd0eacd..dae5e2fb 100644 --- a/BTPanel/static/vite/css/index74.css +++ b/BTPanel/static/vite/css/index74.css @@ -1 +1 @@ -.bt-tabs-modal[data-v-bde98ad3]{--n-tab-gap-vertical: 0;--n-tab-border-color: none;--n-tab-color: var(--bt-tabs-modal-color);--n-tab-border-radius: 0;--n-tab-text-color-active: #ffffff;--n-tab-padding-vertical: 0 10px;--n-tab-item-width: 200px;height:100%}.bt-tabs-modal[data-v-bde98ad3]>.n-tabs-nav{width:var(--n-tab-item-width);background-color:var(--color-bg-2)}.bt-tabs-modal[data-v-bde98ad3]>.n-tabs-nav .n-tabs-scroll-padding{border:none}.bt-tabs-modal[data-v-bde98ad3]>.n-tabs-nav .n-tabs-nav-scroll-wrapper{box-shadow:var(--bt-tabs-modal-left-shadow)}.bt-tabs-modal[data-v-bde98ad3]>.n-tabs-nav .n-tabs-wrapper{padding:0 10px}.bt-tabs-modal[data-v-bde98ad3]>.n-tabs-nav .n-tabs-wrapper .n-tabs-tab-wrapper{margin-top:10px}.bt-tabs-modal[data-v-bde98ad3]>.n-tabs-nav .n-tabs-wrapper .n-tabs-tab-wrapper .n-tabs-tab{height:40px;border:none;border-radius:10px;justify-content:flex-start}.bt-tabs-modal[data-v-bde98ad3]>.n-tabs-nav .n-tabs-wrapper .n-tabs-tab-wrapper .n-tabs-tab.n-tabs-tab--active{background-color:var(--bt-tabs-modal-left-active-bg)}.bt-tabs-modal[data-v-bde98ad3]>.n-tabs-nav .n-tabs-wrapper .n-tabs-tab-wrapper .n-tabs-tab .n-tabs-tab__label{overflow:hidden}.bt-tabs-modal[data-v-bde98ad3]>.n-tab-pane{overflow:auto}.is-icon[data-v-bde98ad3]>.n-tabs-nav{width:81px}.is-icon[data-v-bde98ad3]>.n-tabs-nav .n-tabs-tab{width:81px!important;height:74px!important}.n-card[data-v-ba9d66ec]{padding:16px}.n-card[data-v-ba9d66ec] .n-card-header{text-align:center}.section-box[data-v-ba9d66ec]{padding:16px;border-radius:10px;background:var(--app-plugin-dns-bg);border:1px solid var(--color-primary)}.icon-wrap[data-v-ba9d66ec]{width:56px;height:56px;display:flex;align-items:center;justify-content:center;border-radius:9999px;--un-bg-opacity:1;background-color:rgb(32 165 58 / var(--un-bg-opacity))}.icon-wrap.sm[data-v-ba9d66ec]{width:36px;height:36px;border-radius:8px}.desc[data-v-ba9d66ec]{font-size:14px;color:var(--color-text-4);max-width:680px}.kv[data-v-ba9d66ec]{margin-top:14px}.kv-title[data-v-ba9d66ec]{font-size:14px;font-weight:600;margin-bottom:6px}.kv-desc[data-v-ba9d66ec]{color:var(--color-text-4)}.kv-list[data-v-ba9d66ec]{color:var(--color-text-4);margin:6px 0 0 18px}.server-title[data-v-12f14b33]{height:50px;font-size:16px;font-weight:700;line-height:50px}.server-icon[data-v-12f14b33]{margin-top:20px;margin-bottom:20px;width:80px;height:80px;display:flex;align-items:center;justify-content:center;border-radius:9999px;--un-bg-opacity:1;background-color:rgb(200 230 201 / var(--un-bg-opacity))}.n-button__content i[data-v-12f14b33]{margin-right:4px} +.border-view[data-v-4bcfd2a2]{width:90%;border-width:1px;border-color:var(--color-border);border-radius:4px;border-style:solid;padding:12px}[data-v-030ea397] .n-spin-description{color:#20a53a!important} diff --git a/BTPanel/static/vite/css/index75.css b/BTPanel/static/vite/css/index75.css index 16be9645..7c9396e7 100644 --- a/BTPanel/static/vite/css/index75.css +++ b/BTPanel/static/vite/css/index75.css @@ -1 +1 @@ -.coupon-box[data-v-5b993027]{background:var(--coupon-bg) no-repeat;background-size:100%;background-position:left top 30px}.coupon-box .n-select[data-v-5b993027] .n-base-selection{--n-color: transparent;--n-color-active: transparent;--n-border: none;--n-border-active: none;--n-border-focus: none;--n-border-hover: none;--n-box-shadow-active: none;--n-box-shadow-focus: none}.coupon-box .n-select[data-v-5b993027] .n-base-selection .n-base-selection-placeholder{justify-content:center}.coupon-list[data-v-5b993027]{margin-top:24px}.coupon-list .coupon-item[data-v-5b993027]{position:relative;margin-bottom:24px;display:flex;align-items:center;border-radius:4px;padding-top:16px;padding-bottom:16px;background:var(--pay-color-bg);border:1px solid var(--pay-color-border)}.coupon-list .coupon-item .decoration[data-v-5b993027]{position:absolute;top:0;left:0;width:44px;height:44px;background:url("data:image/svg+xml,%3csvg%20width='44'%20height='43'%20viewBox='0%200%2044%2043'%20fill='none'%20xmlns='http://www.w3.org/2000/svg'%3e%3cpath%20d='M2.047%200H44L0%2043V2.047C0%20.917.916%200%202.047%200z'%20fill-rule='evenodd'%20fill='%23FFAC0A'/%3e%3c/svg%3e") no-repeat;padding-top:4px;padding-left:2px;font-size:14px;color:#fff}.coupon-list .coupon-item .coupon-amount[data-v-5b993027]{position:relative;width:120px;display:flex;flex-direction:column;align-items:center;padding-left:16px;padding-right:16px;background:linear-gradient(to bottom,#ffa700,#fdca44);-webkit-background-clip:text;background-clip:text;color:transparent}.coupon-list .coupon-item .coupon-amount[data-v-5b993027]:after{content:"";position:absolute;top:50%;right:0;display:block;width:1px;height:48px;margin-top:-24px;background:#fdca44}.coupon-list .coupon-item .coupon-amount .coupon-price[data-v-5b993027]{display:flex;align-items:baseline;font-weight:700}.coupon-list .coupon-item .coupon-amount .coupon-desc[data-v-5b993027]{margin-top:10px;color:var(--color-text-3)}.coupon-list .coupon-item .coupon-info[data-v-5b993027]{flex:1 1 0%;padding-left:16px;color:var(--color-text-2)}.coupon-list .coupon-item .coupon-info .coupon-name[data-v-5b993027]{margin-bottom:12px;font-size:14px}.coupon-number[data-v-5b993027]{margin-top:20px;text-align:center;font-size:14px;color:var(--color-text-2)}.coupon-btn[data-v-5b993027]{margin-top:20px;width:100%;height:42px;display:flex;align-items:center;justify-content:center;cursor:pointer;border-radius:20px;--un-bg-opacity:1;background-color:rgb(255 176 76 / var(--un-bg-opacity));text-align:center;font-size:16px;--un-text-opacity:1;color:rgb(255 255 255 / var(--un-text-opacity));box-shadow:0 2px 2px rgba(0,0,0,.2);transition:background-color .3s}.coupon-btn[data-v-5b993027]:hover{--un-bg-opacity:1;background-color:rgb(246 137 0 / var(--un-bg-opacity))} +.n-card[data-v-bb5721bc]{--n-title-font-size: 12px;--n-title-font-weight: bold} diff --git a/BTPanel/static/vite/css/index76.css b/BTPanel/static/vite/css/index76.css index cf1405ad..07e95254 100644 --- a/BTPanel/static/vite/css/index76.css +++ b/BTPanel/static/vite/css/index76.css @@ -1 +1 @@ -.info[data-v-186f04ad]{display:flex;align-items:center}.info:first-of-type .mark[data-v-186f04ad]:before{display:none}.info .mark[data-v-186f04ad]{position:relative;margin-right:16px;width:8px;height:8px;border-radius:50%;background-color:#c4c4c4}.info .mark[data-v-186f04ad]:before{content:"";position:absolute;left:50%;bottom:50%;width:1px;height:26px;background-color:#c4c4c4;transform:translate(-50%)}.info.load[data-v-186f04ad]{color:#999}.info.done[data-v-186f04ad]{color:#20a53a}.info.done .mark[data-v-186f04ad]{background-color:#20a53a}.info.done .mark[data-v-186f04ad]:before{background-color:#20a53a}.safe-restart[data-v-61b30d8c]{display:flex;flex-direction:column;line-height:26px;padding:16px 20px;border-radius:5px;background-color:rgba(241,249,243,.6)}.n-button[data-v-d341a5a3]{--n-width: 120px;--n-height: 42px;--n-border-radius: 2px;--n-color: #eee;--n-text-color: #333;--n-border: 1px solid #ddd;--n-color-hover: #20a53a;--n-border-hover: 1px solid #20a53a;--n-text-color-hover: #fff;--n-color-focus: #20a53a;--n-border-focus: 1px solid #20a53a} +.list_box[data-v-872a97b6]{margin-top:16px;margin-bottom:16px;flex-wrap:nowrap;align-items:center;padding-top:2px;padding-bottom:2px} diff --git a/BTPanel/static/vite/css/index77.css b/BTPanel/static/vite/css/index77.css index 5b714d64..9d11d79e 100644 --- a/BTPanel/static/vite/css/index77.css +++ b/BTPanel/static/vite/css/index77.css @@ -1 +1 @@ -.bt-tips-ul[data-v-6dc5521d]{margin-top:24px;padding:24px 0;border-top:1px solid #ececec;font-size:14px} +.list_box[data-v-4193d178]{margin-top:16px;margin-bottom:16px;flex-wrap:nowrap;align-items:center;padding-top:2px;padding-bottom:2px} diff --git a/BTPanel/static/vite/css/index78.css b/BTPanel/static/vite/css/index78.css index 2c13bf3e..7cd0eacd 100644 --- a/BTPanel/static/vite/css/index78.css +++ b/BTPanel/static/vite/css/index78.css @@ -1 +1 @@ -.n-upload-dragger[data-v-fd46742b]{height:360px;padding:10px}.n-upload-dragger[data-v-fd46742b]:hover{--n-dragger-border-hover: 1px dashed #20a53a}.drag-text[data-v-fd46742b]{margin-top:20px;font-size:16px}.drag-suffix[data-v-fd46742b]{margin-top:12px;color:#777;font-size:14px}.n-data-table[data-v-fd46742b]{--n-th-color-modal: transparent;--n-td-color-modal: transparent;--n-th-color-hover-modal: transparent;--n-td-color-hover-modal: transparent;--n-border-color-modal: transparent} +.bt-tabs-modal[data-v-bde98ad3]{--n-tab-gap-vertical: 0;--n-tab-border-color: none;--n-tab-color: var(--bt-tabs-modal-color);--n-tab-border-radius: 0;--n-tab-text-color-active: #ffffff;--n-tab-padding-vertical: 0 10px;--n-tab-item-width: 200px;height:100%}.bt-tabs-modal[data-v-bde98ad3]>.n-tabs-nav{width:var(--n-tab-item-width);background-color:var(--color-bg-2)}.bt-tabs-modal[data-v-bde98ad3]>.n-tabs-nav .n-tabs-scroll-padding{border:none}.bt-tabs-modal[data-v-bde98ad3]>.n-tabs-nav .n-tabs-nav-scroll-wrapper{box-shadow:var(--bt-tabs-modal-left-shadow)}.bt-tabs-modal[data-v-bde98ad3]>.n-tabs-nav .n-tabs-wrapper{padding:0 10px}.bt-tabs-modal[data-v-bde98ad3]>.n-tabs-nav .n-tabs-wrapper .n-tabs-tab-wrapper{margin-top:10px}.bt-tabs-modal[data-v-bde98ad3]>.n-tabs-nav .n-tabs-wrapper .n-tabs-tab-wrapper .n-tabs-tab{height:40px;border:none;border-radius:10px;justify-content:flex-start}.bt-tabs-modal[data-v-bde98ad3]>.n-tabs-nav .n-tabs-wrapper .n-tabs-tab-wrapper .n-tabs-tab.n-tabs-tab--active{background-color:var(--bt-tabs-modal-left-active-bg)}.bt-tabs-modal[data-v-bde98ad3]>.n-tabs-nav .n-tabs-wrapper .n-tabs-tab-wrapper .n-tabs-tab .n-tabs-tab__label{overflow:hidden}.bt-tabs-modal[data-v-bde98ad3]>.n-tab-pane{overflow:auto}.is-icon[data-v-bde98ad3]>.n-tabs-nav{width:81px}.is-icon[data-v-bde98ad3]>.n-tabs-nav .n-tabs-tab{width:81px!important;height:74px!important}.n-card[data-v-ba9d66ec]{padding:16px}.n-card[data-v-ba9d66ec] .n-card-header{text-align:center}.section-box[data-v-ba9d66ec]{padding:16px;border-radius:10px;background:var(--app-plugin-dns-bg);border:1px solid var(--color-primary)}.icon-wrap[data-v-ba9d66ec]{width:56px;height:56px;display:flex;align-items:center;justify-content:center;border-radius:9999px;--un-bg-opacity:1;background-color:rgb(32 165 58 / var(--un-bg-opacity))}.icon-wrap.sm[data-v-ba9d66ec]{width:36px;height:36px;border-radius:8px}.desc[data-v-ba9d66ec]{font-size:14px;color:var(--color-text-4);max-width:680px}.kv[data-v-ba9d66ec]{margin-top:14px}.kv-title[data-v-ba9d66ec]{font-size:14px;font-weight:600;margin-bottom:6px}.kv-desc[data-v-ba9d66ec]{color:var(--color-text-4)}.kv-list[data-v-ba9d66ec]{color:var(--color-text-4);margin:6px 0 0 18px}.server-title[data-v-12f14b33]{height:50px;font-size:16px;font-weight:700;line-height:50px}.server-icon[data-v-12f14b33]{margin-top:20px;margin-bottom:20px;width:80px;height:80px;display:flex;align-items:center;justify-content:center;border-radius:9999px;--un-bg-opacity:1;background-color:rgb(200 230 201 / var(--un-bg-opacity))}.n-button__content i[data-v-12f14b33]{margin-right:4px} diff --git a/BTPanel/static/vite/css/index79.css b/BTPanel/static/vite/css/index79.css index 59b8e483..16be9645 100644 --- a/BTPanel/static/vite/css/index79.css +++ b/BTPanel/static/vite/css/index79.css @@ -1 +1 @@ -.n-progress[data-v-a8de5712]{margin-right:10px;height:20px;width:20px;--n-fill-color: #20a53a} +.coupon-box[data-v-5b993027]{background:var(--coupon-bg) no-repeat;background-size:100%;background-position:left top 30px}.coupon-box .n-select[data-v-5b993027] .n-base-selection{--n-color: transparent;--n-color-active: transparent;--n-border: none;--n-border-active: none;--n-border-focus: none;--n-border-hover: none;--n-box-shadow-active: none;--n-box-shadow-focus: none}.coupon-box .n-select[data-v-5b993027] .n-base-selection .n-base-selection-placeholder{justify-content:center}.coupon-list[data-v-5b993027]{margin-top:24px}.coupon-list .coupon-item[data-v-5b993027]{position:relative;margin-bottom:24px;display:flex;align-items:center;border-radius:4px;padding-top:16px;padding-bottom:16px;background:var(--pay-color-bg);border:1px solid var(--pay-color-border)}.coupon-list .coupon-item .decoration[data-v-5b993027]{position:absolute;top:0;left:0;width:44px;height:44px;background:url("data:image/svg+xml,%3csvg%20width='44'%20height='43'%20viewBox='0%200%2044%2043'%20fill='none'%20xmlns='http://www.w3.org/2000/svg'%3e%3cpath%20d='M2.047%200H44L0%2043V2.047C0%20.917.916%200%202.047%200z'%20fill-rule='evenodd'%20fill='%23FFAC0A'/%3e%3c/svg%3e") no-repeat;padding-top:4px;padding-left:2px;font-size:14px;color:#fff}.coupon-list .coupon-item .coupon-amount[data-v-5b993027]{position:relative;width:120px;display:flex;flex-direction:column;align-items:center;padding-left:16px;padding-right:16px;background:linear-gradient(to bottom,#ffa700,#fdca44);-webkit-background-clip:text;background-clip:text;color:transparent}.coupon-list .coupon-item .coupon-amount[data-v-5b993027]:after{content:"";position:absolute;top:50%;right:0;display:block;width:1px;height:48px;margin-top:-24px;background:#fdca44}.coupon-list .coupon-item .coupon-amount .coupon-price[data-v-5b993027]{display:flex;align-items:baseline;font-weight:700}.coupon-list .coupon-item .coupon-amount .coupon-desc[data-v-5b993027]{margin-top:10px;color:var(--color-text-3)}.coupon-list .coupon-item .coupon-info[data-v-5b993027]{flex:1 1 0%;padding-left:16px;color:var(--color-text-2)}.coupon-list .coupon-item .coupon-info .coupon-name[data-v-5b993027]{margin-bottom:12px;font-size:14px}.coupon-number[data-v-5b993027]{margin-top:20px;text-align:center;font-size:14px;color:var(--color-text-2)}.coupon-btn[data-v-5b993027]{margin-top:20px;width:100%;height:42px;display:flex;align-items:center;justify-content:center;cursor:pointer;border-radius:20px;--un-bg-opacity:1;background-color:rgb(255 176 76 / var(--un-bg-opacity));text-align:center;font-size:16px;--un-text-opacity:1;color:rgb(255 255 255 / var(--un-text-opacity));box-shadow:0 2px 2px rgba(0,0,0,.2);transition:background-color .3s}.coupon-btn[data-v-5b993027]:hover{--un-bg-opacity:1;background-color:rgb(246 137 0 / var(--un-bg-opacity))} diff --git a/BTPanel/static/vite/css/index80.css b/BTPanel/static/vite/css/index80.css index 86873d34..cf1405ad 100644 --- a/BTPanel/static/vite/css/index80.css +++ b/BTPanel/static/vite/css/index80.css @@ -1 +1 @@ -.text[data-v-d5fa27f9]{--un-text-opacity:1;color:rgb(32 165 58 / var(--un-text-opacity))} +.info[data-v-186f04ad]{display:flex;align-items:center}.info:first-of-type .mark[data-v-186f04ad]:before{display:none}.info .mark[data-v-186f04ad]{position:relative;margin-right:16px;width:8px;height:8px;border-radius:50%;background-color:#c4c4c4}.info .mark[data-v-186f04ad]:before{content:"";position:absolute;left:50%;bottom:50%;width:1px;height:26px;background-color:#c4c4c4;transform:translate(-50%)}.info.load[data-v-186f04ad]{color:#999}.info.done[data-v-186f04ad]{color:#20a53a}.info.done .mark[data-v-186f04ad]{background-color:#20a53a}.info.done .mark[data-v-186f04ad]:before{background-color:#20a53a}.safe-restart[data-v-61b30d8c]{display:flex;flex-direction:column;line-height:26px;padding:16px 20px;border-radius:5px;background-color:rgba(241,249,243,.6)}.n-button[data-v-d341a5a3]{--n-width: 120px;--n-height: 42px;--n-border-radius: 2px;--n-color: #eee;--n-text-color: #333;--n-border: 1px solid #ddd;--n-color-hover: #20a53a;--n-border-hover: 1px solid #20a53a;--n-text-color-hover: #fff;--n-color-focus: #20a53a;--n-border-focus: 1px solid #20a53a} diff --git a/BTPanel/static/vite/css/index81.css b/BTPanel/static/vite/css/index81.css index dbfd5c3e..2c13bf3e 100644 --- a/BTPanel/static/vite/css/index81.css +++ b/BTPanel/static/vite/css/index81.css @@ -1 +1 @@ -.disk-item[data-v-b9968102]:hover{background-color:var(--bt-input-path-hover-bg)} +.n-upload-dragger[data-v-fd46742b]{height:360px;padding:10px}.n-upload-dragger[data-v-fd46742b]:hover{--n-dragger-border-hover: 1px dashed #20a53a}.drag-text[data-v-fd46742b]{margin-top:20px;font-size:16px}.drag-suffix[data-v-fd46742b]{margin-top:12px;color:#777;font-size:14px}.n-data-table[data-v-fd46742b]{--n-th-color-modal: transparent;--n-td-color-modal: transparent;--n-th-color-hover-modal: transparent;--n-td-color-hover-modal: transparent;--n-border-color-modal: transparent} diff --git a/BTPanel/static/vite/css/index82.css b/BTPanel/static/vite/css/index82.css index 5e9f64a4..59b8e483 100644 --- a/BTPanel/static/vite/css/index82.css +++ b/BTPanel/static/vite/css/index82.css @@ -1 +1 @@ -.n-button[data-v-70acc0cb]{padding:0 24px;--n-height: 40px;--n-border-radius: 4px;--n-color: var(--button-gray-color);--n-text-color: var(--color-text-2);--n-border: none;--n-color-hover: var(--color-primary);--n-border-hover: 1px solid var(--color-primary);--n-text-color-hover: #fff;--n-color-focus: var(--color-primary);--n-text-color-focus: #fff;--n-border-focus: 1px solid var(--color-primary)}.bg-recommend[data-v-70acc0cb]{position:absolute;width:32px;height:32px;top:-1px;left:-1px;background-image:url(/static/vite/images/recommend.svg);background-repeat:no-repeat;background-position:center;background-size:contain} +.n-progress[data-v-a8de5712]{margin-right:10px;height:20px;width:20px;--n-fill-color: #20a53a} diff --git a/BTPanel/static/vite/css/index83.css b/BTPanel/static/vite/css/index83.css index f829aa53..86873d34 100644 --- a/BTPanel/static/vite/css/index83.css +++ b/BTPanel/static/vite/css/index83.css @@ -1 +1 @@ -[data-v-c8948635] .n-result{--n-title-font-size: 18px} +.text[data-v-d5fa27f9]{--un-text-opacity:1;color:rgb(32 165 58 / var(--un-text-opacity))} diff --git a/BTPanel/static/vite/css/index84.css b/BTPanel/static/vite/css/index84.css index d388ea24..dbfd5c3e 100644 --- a/BTPanel/static/vite/css/index84.css +++ b/BTPanel/static/vite/css/index84.css @@ -1 +1 @@ -.access-btn[data-v-989f4d59]{padding:0 24px;--n-height: 40px;--n-border-radius: 4px;--n-color: var(--button-gray-color);--n-text-color: var(--color-text-2);--n-border: none;--n-color-hover: var(--color-primary);--n-border-hover: 1px solid var(--color-primary);--n-text-color-hover: #fff;--n-color-focus: var(--color-primary);--n-text-color-focus: #fff;--n-border-focus: 1px solid var(--color-primary)}.bg-recommend[data-v-989f4d59]{position:absolute;width:32px;height:32px;top:-1px;left:-1px;background-image:url(/static/vite/images/recommend.svg);background-repeat:no-repeat;background-position:center;background-size:contain} +.disk-item[data-v-b9968102]:hover{background-color:var(--bt-input-path-hover-bg)} diff --git a/BTPanel/static/vite/css/index85.css b/BTPanel/static/vite/css/index85.css index c58e9eab..5e9f64a4 100644 --- a/BTPanel/static/vite/css/index85.css +++ b/BTPanel/static/vite/css/index85.css @@ -1 +1 @@ -.n-transfer[data-v-52f8a71d]{height:200px}.n-transfer[data-v-52f8a71d] .n-transfer-list--target{display:none} +.n-button[data-v-70acc0cb]{padding:0 24px;--n-height: 40px;--n-border-radius: 4px;--n-color: var(--button-gray-color);--n-text-color: var(--color-text-2);--n-border: none;--n-color-hover: var(--color-primary);--n-border-hover: 1px solid var(--color-primary);--n-text-color-hover: #fff;--n-color-focus: var(--color-primary);--n-text-color-focus: #fff;--n-border-focus: 1px solid var(--color-primary)}.bg-recommend[data-v-70acc0cb]{position:absolute;width:32px;height:32px;top:-1px;left:-1px;background-image:url(/static/vite/images/recommend.svg);background-repeat:no-repeat;background-position:center;background-size:contain} diff --git a/BTPanel/static/vite/css/index86.css b/BTPanel/static/vite/css/index86.css index af9be680..f829aa53 100644 --- a/BTPanel/static/vite/css/index86.css +++ b/BTPanel/static/vite/css/index86.css @@ -1 +1 @@ -.n-button[data-v-a259b350]{--n-height: 24px} +[data-v-c8948635] .n-result{--n-title-font-size: 18px} diff --git a/BTPanel/static/vite/css/index87.css b/BTPanel/static/vite/css/index87.css index 0dfdc1ba..d388ea24 100644 --- a/BTPanel/static/vite/css/index87.css +++ b/BTPanel/static/vite/css/index87.css @@ -1 +1 @@ -.drawer{display:none}.xterm{height:100%;padding:12px}.xterm .xterm-viewport{overflow:auto!important} +.access-btn[data-v-989f4d59]{padding:0 24px;--n-height: 40px;--n-border-radius: 4px;--n-color: var(--button-gray-color);--n-text-color: var(--color-text-2);--n-border: none;--n-color-hover: var(--color-primary);--n-border-hover: 1px solid var(--color-primary);--n-text-color-hover: #fff;--n-color-focus: var(--color-primary);--n-text-color-focus: #fff;--n-border-focus: 1px solid var(--color-primary)}.bg-recommend[data-v-989f4d59]{position:absolute;width:32px;height:32px;top:-1px;left:-1px;background-image:url(/static/vite/images/recommend.svg);background-repeat:no-repeat;background-position:center;background-size:contain} diff --git a/BTPanel/static/vite/css/index88.css b/BTPanel/static/vite/css/index88.css index 9f015a15..c58e9eab 100644 --- a/BTPanel/static/vite/css/index88.css +++ b/BTPanel/static/vite/css/index88.css @@ -1 +1 @@ -.n-radio-group .n-radio[data-v-911e41e9]{margin-right:0} +.n-transfer[data-v-52f8a71d]{height:200px}.n-transfer[data-v-52f8a71d] .n-transfer-list--target{display:none} diff --git a/BTPanel/static/vite/css/index89.css b/BTPanel/static/vite/css/index89.css index a8c96b90..af9be680 100644 --- a/BTPanel/static/vite/css/index89.css +++ b/BTPanel/static/vite/css/index89.css @@ -1 +1 @@ -.card[data-v-3fbdb211]{border-width:1px;--un-border-opacity:1;border-color:rgb(235 238 245 / var(--un-border-opacity));border-radius:4px;border-style:solid}.card .card-title[data-v-3fbdb211]{border-bottom-width:1px;--un-border-opacity:1;--un-border-bottom-opacity:var(--un-border-opacity);border-bottom-color:rgb(235 238 245 / var(--un-border-bottom-opacity));border-bottom-style:solid;padding:10px}.info[data-v-3fbdb211]{padding:12px 16px;font-size:13px}.info .info-label[data-v-3fbdb211]{font-weight:700}.info .info-value[data-v-3fbdb211]{--un-text-opacity:1;color:rgb(145 145 145 / var(--un-text-opacity))} +.n-button[data-v-a259b350]{--n-height: 24px} diff --git a/BTPanel/static/vite/css/index90.css b/BTPanel/static/vite/css/index90.css index 85961823..0dfdc1ba 100644 --- a/BTPanel/static/vite/css/index90.css +++ b/BTPanel/static/vite/css/index90.css @@ -1 +1 @@ -.editor-toolbars[data-v-994bb124]{display:flex;align-items:center;height:32px;min-height:32px;background-color:#565656;color:#fff}.tools-btn[data-v-994bb124]{position:relative;display:flex;align-items:center;justify-content:center;height:32px;padding:0 16px;font-size:13px;border-right:1px solid #4c4c4c;cursor:pointer}.tools-btn[data-v-994bb124]:hover{background-color:#2f2f2f}.dir-path[data-v-1f4d4d59]{display:flex;align-items:center;justify-content:center;height:40px;font-size:12px;color:#fff}.tools[data-v-67b4eb87]{display:flex;align-items:center;width:100%;height:32px;min-height:32px;background-color:#565656;color:#fff}.tools-btn[data-v-67b4eb87]{position:relative;display:flex;align-items:center;justify-content:center;gap:6px;height:32px;padding:0 8px;font-size:12px;cursor:pointer}.tools-btn[data-v-67b4eb87]:hover{background-color:#2f2f2f}.editor-sidebar[data-v-5fb2d4d8]{display:flex;flex-direction:column;width:280px;height:100%;background-color:#292929;border-bottom-left-radius:8px} +.drawer{display:none}.xterm{height:100%;padding:12px}.xterm .xterm-viewport{overflow:auto!important} diff --git a/BTPanel/static/vite/css/index91.css b/BTPanel/static/vite/css/index91.css index e59861af..9f015a15 100644 --- a/BTPanel/static/vite/css/index91.css +++ b/BTPanel/static/vite/css/index91.css @@ -1 +1 @@ -.spanText[data-v-2eb7c01e]{border:1px solid #eeeef0;background-color:#f4f4f5;border-radius:5px;padding:5px 8px}.spanLength[data-v-2eb7c01e]{display:inline-block;max-width:160px!important;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.checkbox[data-v-2eb7c01e]{margin-top:-10px}.checkbox div[data-v-2eb7c01e]{margin-top:10px}.spanText[data-v-4270dc55]{border:1px solid #eeeef0;background-color:#f4f4f5;border-radius:5px;padding:5px 8px}.spanLength[data-v-4270dc55]{display:inline-block;max-width:80px!important;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.checkbox[data-v-4270dc55]{margin-top:-10px}.checkbox div[data-v-4270dc55]{margin-top:10px} +.n-radio-group .n-radio[data-v-911e41e9]{margin-right:0} diff --git a/BTPanel/static/vite/css/index92.css b/BTPanel/static/vite/css/index92.css index 23484504..a8c96b90 100644 --- a/BTPanel/static/vite/css/index92.css +++ b/BTPanel/static/vite/css/index92.css @@ -1 +1 @@ -@charset "UTF-8";@media (max-width: 1440px){.system-info[data-v-5c30d0df]{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;max-width:120px}}@media (max-width: 1320px){.run-time[data-v-5c30d0df]{display:none}}.advantage[data-v-bfb22274]{display:flex;align-items:center}.advantage[data-v-bfb22274]:before{content:"";width:12px;height:6px;margin-right:4px;border-left:2px solid #20a532;border-bottom:2px solid #20a532;transform:rotate(-45deg)}.n-collapse[data-v-f0e03c84] .n-collapse-item:not(:first-child){border:none;margin:0}.n-collapse[data-v-f0e03c84] .n-collapse-item .n-collapse-item__header-main{display:flex;align-items:center;height:30px;padding:0 8px;background-color:#f9f9f9;color:#555;font-size:13px}.n-collapse[data-v-f0e03c84] .n-collapse-item .n-collapse-item__content-wrapper .n-collapse-item__content-inner{padding-top:0}.table[data-v-d5229aa0]{width:100%;max-width:100%;background-color:transparent;border-spacing:0;border-collapse:collapse;margin-bottom:0}.table tbody>tr>td[data-v-d5229aa0]{vertical-align:middle;line-height:1.42857143;padding:4px;text-overflow:ellipsis;word-break:break-all;overflow:hidden;border-top:none}.home-security-file .lastScan-time[data-v-3b66d740],.home-security-file .info-title[data-v-3b66d740]{color:var(--home-risk-file-info-title-color)}.infoList[data-v-3b66d740]{margin-bottom:1.6rem;display:flex;border-radius:.4rem;padding:1.6rem;border:1px solid #efefef}.item-list[data-v-3b66d740]{border-right:1px solid #efefef}.item-list[data-v-3b66d740]:last-child{border-right:none}.loading-icon[data-v-a91fb030]{position:absolute;width:80px;height:80px;animation:spin 1s linear infinite;--un-bg-opacity:0;background-color:rgb(204 204 204 / var(--un-bg-opacity));border-radius:50%;border:2px solid #20a53a;clip-path:inset(0 20%)}@keyframes spin{0%{transform:rotate(0)}to{transform:rotate(360deg)}}[data-v-0e08d546] .n-collapse .n-collapse-item .n-collapse-item__header .n-collapse-item__header-main{justify-content:space-between!important}.scrollable[data-v-0e08d546]::-webkit-scrollbar{width:10px}.scrollable[data-v-0e08d546]::-webkit-scrollbar-track{background:#efefef}.scrollable[data-v-0e08d546]::-webkit-scrollbar-thumb{background:#bfbfbf;border-radius:10px}.scrollable[data-v-0e08d546]::-webkit-scrollbar-thumb:hover{background:#555}.risk-chart[data-v-56656608]{padding:2px}.risk-chart .circle-box[data-v-56656608]{position:relative;display:flex;width:110px;height:110px;justify-content:center;align-items:center}.risk-chart .circle-box[data-v-56656608]:before,.risk-chart .circle-box[data-v-56656608]:after,.risk-chart .circle-box .circle-box-bg[data-v-56656608]{position:absolute;top:0;left:0;display:block;width:100%;height:100%;content:""}.risk-chart .circle-box[data-v-56656608]:before{border-radius:56% 56% 52% 54%;opacity:.8;animation:wave-56656608 12s infinite linear}.risk-chart .circle-box[data-v-56656608]:after{border-radius:44% 44% 42% 46%;opacity:.6;animation:wave-56656608 10s infinite linear}.risk-chart .circle-box .circle-box-bg[data-v-56656608]{border-radius:46% 46% 42% 44%;opacity:.4;animation:wave-56656608 8s infinite linear}.risk-chart .circle-box .circle-box-inner[data-v-56656608]{z-index:1;display:flex;width:101px;height:101px;border-radius:70% 60% 60%;flex-direction:column;justify-content:center;align-items:center;background:var(--home-risk-overview-circle-bg)}.risk-chart .circle-box .circle-box-value[data-v-56656608]{display:inline-flex;font-size:32px;line-height:1;align-items:flex-end}.risk-chart .circle-box .circle-box-value .unit[data-v-56656608]{margin-left:4px;font-size:12px;color:#999;transform:translateY(-6px)}.risk-chart .circle-box .circle-box-desc[data-v-56656608]{margin-top:4px}.circle-danger .risk-chart .circle-box[data-v-56656608]:before,.circle-danger .risk-chart .circle-box[data-v-56656608]:after,.circle-danger .risk-chart .circle-box .circle-box-bg[data-v-56656608]{background-color:#ef0808}.circle-danger .risk-chart .circle-box .circle-box-inner[data-v-56656608]{color:#e01616}.circle-warn .risk-chart .circle-box[data-v-56656608]:before,.circle-warn .risk-chart .circle-box[data-v-56656608]:after,.circle-warn .risk-chart .circle-box .circle-box-bg[data-v-56656608]{background-color:#f0ad4e}.circle-warn .risk-chart .circle-box .circle-box-inner[data-v-56656608]{color:#f0ad4e}.circle-alert .risk-chart .circle-box[data-v-56656608]:before,.circle-alert .risk-chart .circle-box[data-v-56656608]:after,.circle-alert .risk-chart .circle-box .circle-box-bg[data-v-56656608]{background-color:#e8d544}.circle-alert .risk-chart .circle-box .circle-box-inner[data-v-56656608]{color:#e8d544}.circle-safe .risk-chart .circle-box[data-v-56656608]:before,.circle-safe .risk-chart .circle-box[data-v-56656608]:after,.circle-safe .risk-chart .circle-box .circle-box-bg[data-v-56656608]{background-color:#20a53a}.circle-safe .risk-chart .circle-box .circle-box-inner[data-v-56656608]{color:#20a53a}@keyframes wave-56656608{0%{transform:rotate(0)}50%{transform:rotate(180deg)}to{transform:rotate(360deg)}}@keyframes rotate-f660504b{0%{transform:rotate(0)}to{transform:rotate(360deg)}}.absolute-center[data-v-f660504b]{position:absolute;top:0;left:0;bottom:0;right:0;margin:auto}.scan-icon-img[data-v-f660504b]{position:absolute;left:0;right:0;top:0;bottom:0;z-index:99;margin:auto;width:58px;height:67px;background-position:100%}.icon-img-safe[data-v-f660504b]{background-image:url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iNTguMDAwMDAwIiBoZWlnaHQ9IjY3LjAwMDAwMCIgdmlld0JveD0iMCAwIDU4IDY3IiBmaWxsPSJub25lIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIj4KCTxkZXNjPgoJCQlDcmVhdGVkIHdpdGggUGl4c28uCgk8L2Rlc2M+Cgk8ZGVmcz4KCQk8bGluZWFyR3JhZGllbnQgaWQ9InBhaW50X2xpbmVhcl8zN182NDhfMCIgeDE9IjI5LjAwMDAwMCIgeTE9IjAuMDAwMDAwIiB4Mj0iMjkuMDAwMDAwIiB5Mj0iNjcuMDAwMDAwIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CgkJCTxzdG9wIHN0b3AtY29sb3I9IiNCMkVFQkQiLz4KCQkJPHN0b3Agb2Zmc2V0PSIwLjk5MDU5MCIgc3RvcC1jb2xvcj0iIzYyREI3QSIgc3RvcC1vcGFjaXR5PSIwLjE3NjQ3MSIvPgoJCTwvbGluZWFyR3JhZGllbnQ+CgkJPGxpbmVhckdyYWRpZW50IGlkPSJwYWludF9saW5lYXJfMzdfNjQ5XzAiIHgxPSIyOS4wMDQxOTgiIHkxPSI3LjczMDcxMyIgeDI9IjI5LjAwNDE5OCIgeTI9IjYwLjEyODE0NyIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPgoJCQk8c3RvcCBzdG9wLWNvbG9yPSIjOThFM0E3IiBzdG9wLW9wYWNpdHk9IjAuMjIzNTI5Ii8+CgkJCTxzdG9wIG9mZnNldD0iMS4wMDAwMDAiIHN0b3AtY29sb3I9IiM4N0UxOTgiIHN0b3Atb3BhY2l0eT0iMC45MTc2NDciLz4KCQk8L2xpbmVhckdyYWRpZW50PgoJPC9kZWZzPgoJPHBhdGggaWQ9InBhdGgiIGQ9Ik0yOS4xOTcgMEMyMi4zNjc3IDUuMzcyNDQgMTIuNTkyNyAxMC42MzQ5IDAgMTAuNjM0OUwwIDM1Ljg5ODFDMCA0Ny4xNDU4IDE2LjYwNDQgNjcgMjkuMjA0MyA2N0M0MS44MDQ0IDY3IDU4IDQ3LjEzODMgNTggMzUuODk4MUw1OCAxMC42MzQ5QzQ1LjM4NTMgMTAuNjM0OSAzNi4wMjY0IDUuMzcyNDQgMjkuMTk3IDBaTTUyLjAyOTQgMzUuNjQ3NUM1Mi4wMjk0IDQ1LjI4OTQgMzkuNjI1NCA2MC4yOTIyIDI4LjgyNjMgNjAuMjkyMkMxOC4wMiA2MC4yOTIyIDYuMjUzNzggNDUuNDEyNSA2LjI1Mzc4IDM1Ljc3MDVMNi4yNTM3OCAxNS41NTYyQzE3LjA1MjcgMTUuNTU2MiAyMy4zNDU1IDEyLjM1MjIgMjkuMjA0MyA3LjczNzU1QzM1LjA0ODYgMTIuMzM3MiA0MS4yMzA1IDE1LjQ2MTUgNTIuMDI5NCAxNS40NjE1TDUyLjAyOTQgMzUuNjQ3NVoiIGZpbGwtcnVsZT0ibm9uemVybyIgZmlsbD0idXJsKCNwYWludF9saW5lYXJfMzdfNjQ4XzApIiBmaWxsLW9wYWNpdHk9IjAuMzUwMDAwIi8+Cgk8cGF0aCBpZD0icGF0aCIgZD0iTTI5LjEzNDUgNy43MzA3MUMyMy40NTU5IDEyLjg4NDUgMTUuNjYzIDE1LjQ2MTQgNS45NzkgMTUuNDYxNEw2LjM5NzA5IDM2LjUwNjNDNi44MjM0OSA0My44MDc2IDE2LjA4NDQgNjAuMTI4MiAyOC44NDM5IDYwLjEyODJDMzguODA4OCA2MC4xMjgyIDUyLjQ1NTggNDYuMzg0NSA1MS45NzU4IDM0Ljk5MDFMNTIuMDI5NCAxNS40NjE0QzQwLjE0MTggMTUuNDYxNCAzNC4zODY1IDExLjY5NTggMjkuMTM0NSA3LjczMDcxWk00Ni43NzI2IDM0Ljk5QzQ2Ljc3MjYgNDIuMTA2MiAzNy4xNDg0IDUzLjA4ODEgMjguODQzOSA1My4wODgxQzIwLjUzMzcgNTMuMDg4MSAxMS40ODUyIDQyLjEwNjIgMTEuNDg1MiAzNC45OUwxMS40ODUyIDIwLjA3MDlDMTkuNzg5OCAyMC4wNzA5IDI0LjYyODkgMTcuNzA2MiAyOS4xMzQ1IDE0LjMwMDRDMzMuNjI4OSAxNy42OTUxIDM4LjQ3MzYgMjAuMDcwOSA0Ni43NzgzIDIwLjA3MDlMNDYuNzcyNiAzNC45OVoiIGZpbGwtcnVsZT0ibm9uemVybyIgZmlsbD0idXJsKCNwYWludF9saW5lYXJfMzdfNjQ5XzApIiBmaWxsLW9wYWNpdHk9IjAuNDAwMDAwIi8+Cjwvc3ZnPgo=)}.icon-img-danger[data-v-f660504b]{background-image:url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iNTguMDAwMDAwIiBoZWlnaHQ9IjY3LjAwMDAwMCIgdmlld0JveD0iMCAwIDU4IDY3IiBmaWxsPSJub25lIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIj4KCTxkZXNjPgoJCQlDcmVhdGVkIHdpdGggUGl4c28uCgk8L2Rlc2M+Cgk8ZGVmcz4KCQk8bGluZWFyR3JhZGllbnQgaWQ9InBhaW50X2xpbmVhcl82NF85M18wIiB4MT0iMjkuMDAwMDAwIiB5MT0iMC4wMDAwMDAiIHgyPSIyOS4wMDAwMDAiIHkyPSI2Ny4wMDAwMDAiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KCQkJPHN0b3Agc3RvcC1jb2xvcj0iI0ZGQjNCMyIgc3RvcC1vcGFjaXR5PSIwLjkxNzY0NyIvPgoJCQk8c3RvcCBvZmZzZXQ9IjEuMDAwMDAwIiBzdG9wLWNvbG9yPSIjRjc5Njk2IiBzdG9wLW9wYWNpdHk9IjAuMjMxMzczIi8+CgkJPC9saW5lYXJHcmFkaWVudD4KCQk8bGluZWFyR3JhZGllbnQgaWQ9InBhaW50X2xpbmVhcl82NF85NF8wIiB4MT0iMjkuMDA0MTk4IiB5MT0iNy43MzA3MTMiIHgyPSIyOS4wMDQxOTgiIHkyPSI2MC4xMjgxNDciIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KCQkJPHN0b3Agc3RvcC1jb2xvcj0iI0UzOTg5OCIgc3RvcC1vcGFjaXR5PSIwLjIyMzUyOSIvPgoJCQk8c3RvcCBvZmZzZXQ9IjEuMDAwMDAwIiBzdG9wLWNvbG9yPSIjRkZCM0IzIiBzdG9wLW9wYWNpdHk9IjAuOTE3NjQ3Ii8+CgkJPC9saW5lYXJHcmFkaWVudD4KCTwvZGVmcz4KCTxwYXRoIGlkPSJwYXRoIiBkPSJNMjkuMTk3IDBDMjIuMzY3NyA1LjM3MjQ0IDEyLjU5MjcgMTAuNjM0OSAwIDEwLjYzNDlMMCAzNS44OTgxQzAgNDcuMTQ1OCAxNi42MDQ0IDY3IDI5LjIwNDMgNjdDNDEuODA0NCA2NyA1OCA0Ny4xMzgzIDU4IDM1Ljg5ODFMNTggMTAuNjM0OUM0NS4zODUzIDEwLjYzNDkgMzYuMDI2NCA1LjM3MjQ0IDI5LjE5NyAwWk01Mi4wMjk0IDM1LjY0NzVDNTIuMDI5NCA0NS4yODk0IDM5LjYyNTQgNjAuMjkyMiAyOC44MjYzIDYwLjI5MjJDMTguMDIgNjAuMjkyMiA2IDQ1LjY0MiA2IDM2TDYgMTUuNUMxNi43OTkgMTUuNSAyMy4zNDU1IDEyLjM1MjIgMjkuMjA0MyA3LjczNzU1QzM1LjA0ODYgMTIuMzM3MiA0MS4yMzA1IDE1LjQ2MTUgNTIuMDI5NCAxNS40NjE1TDUyLjAyOTQgMzUuNjQ3NVoiIGZpbGwtcnVsZT0ibm9uemVybyIgZmlsbD0idXJsKCNwYWludF9saW5lYXJfNjRfOTNfMCkiIGZpbGwtb3BhY2l0eT0iMC4zNTAwMDAiLz4KCTxwYXRoIGlkPSJwYXRoIiBkPSJNMjkuMTM0NSA3LjczMDcxQzIzLjQ1NTkgMTIuODg0NSAxNS42NjMgMTUuNDYxNCA1Ljk3OSAxNS40NjE0TDUuOTc5IDM2LjVDNi40MDU1MiA0My44MDEzIDE2LjA4NDQgNjAuMTI4MiAyOC44NDM5IDYwLjEyODJDMzguODA4OCA2MC4xMjgyIDUyLjQ1NTggNDYuMzg0NSA1MS45NzU4IDM0Ljk5MDFMNTIuMDI5NCAxNS40NjE0QzQwLjE0MTggMTUuNDYxNCAzNC4zODY1IDExLjY5NTggMjkuMTM0NSA3LjczMDcxWk00Ni43NzI2IDM0Ljk5QzQ2Ljc3MjYgNDIuMTA2MiAzNy4xNDg0IDUzLjA4ODEgMjguODQzOSA1My4wODgxQzIwLjUzMzcgNTMuMDg4MSAxMS40ODUyIDQyLjEwNjIgMTEuNDg1MiAzNC45OUwxMS40ODUyIDIwLjA3MDlDMTkuNzg5OCAyMC4wNzA5IDI0LjYyODkgMTcuNzA2MiAyOS4xMzQ1IDE0LjMwMDRDMzMuNjI4OSAxNy42OTUxIDM4LjQ3MzYgMjAuMDcwOSA0Ni43NzgzIDIwLjA3MDlMNDYuNzcyNiAzNC45OVoiIGZpbGwtcnVsZT0ibm9uemVybyIgZmlsbD0idXJsKCNwYWludF9saW5lYXJfNjRfOTRfMCkiIGZpbGwtb3BhY2l0eT0iMC4zNDAwMDAiLz4KPC9zdmc+Cg==)}.icon-img-warn[data-v-f660504b]{background-image:url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iNTguMDAwMDAwIiBoZWlnaHQ9IjY3LjAwMDAwMCIgdmlld0JveD0iMCAwIDU4IDY3IiBmaWxsPSJub25lIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIj4KCTxkZXNjPgoJCQlDcmVhdGVkIHdpdGggUGl4c28uCgk8L2Rlc2M+Cgk8ZGVmcz4KCQk8bGluZWFyR3JhZGllbnQgaWQ9InBhaW50X2xpbmVhcl83Nl81Nl8wIiB4MT0iMjkuMDAwMDAwIiB5MT0iMC4wMDAwMDAiIHgyPSIyOS4wMDAwMDAiIHkyPSI2Ny4wMDAwMDAiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KCQkJPHN0b3Agc3RvcC1jb2xvcj0iI0YwQUQ0RSIvPgoJCQk8c3RvcCBvZmZzZXQ9IjEuMDAwMDAwIiBzdG9wLWNvbG9yPSIjRkNGMERGIi8+CgkJPC9saW5lYXJHcmFkaWVudD4KCQk8bGluZWFyR3JhZGllbnQgaWQ9InBhaW50X2xpbmVhcl83Nl81N18wIiB4MT0iMjkuMDA0NTcyIiB5MT0iNy41MDAwMDAiIHgyPSIyOS4wMDQ1NzIiIHkyPSI2MC4zOTc0MzQiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KCQkJPHN0b3Agc3RvcC1jb2xvcj0iI0ZDRjBERiIvPgoJCQk8c3RvcCBvZmZzZXQ9IjEuMDAwMDAwIiBzdG9wLWNvbG9yPSIjRjBBRDRFIi8+CgkJPC9saW5lYXJHcmFkaWVudD4KCTwvZGVmcz4KCTxwYXRoIGlkPSJwYXRoIiBkPSJNMjkuMTk3IDBDMjIuMzY3NyA1LjM3MjQ0IDEyLjU5MjcgMTAuNjM0OSAwIDEwLjYzNDlMMCAzNS44OTgxQzAgNDcuMTQ1OCAxNi42MDQ0IDY3IDI5LjIwNDMgNjdDNDEuODA0NCA2NyA1OCA0Ny4xMzgzIDU4IDM1Ljg5ODFMNTggMTAuNjM0OUM0NS4zODUzIDEwLjYzNDkgMzYuMDI2NCA1LjM3MjQ0IDI5LjE5NyAwWk01Mi4wMjk0IDM1LjY0NzVDNTIuMDI5NCA0NS4yODk0IDM5LjYyNTQgNjAuMjkyMiAyOC44MjYzIDYwLjI5MjJDMTguMDIgNjAuMjkyMiA2IDQ1LjY0MiA2IDM2TDYgMTUuNUMxNi43OTkgMTUuNSAyMy4zNDU1IDEyLjM1MjIgMjkuMjA0MyA3LjczNzU1QzM1LjA0ODYgMTIuMzM3MiA0MS4yMzA1IDE1LjQ2MTUgNTIuMDI5NCAxNS40NjE1TDUyLjAyOTQgMzUuNjQ3NVoiIGZpbGwtcnVsZT0ibm9uemVybyIgZmlsbD0idXJsKCNwYWludF9saW5lYXJfNzZfNTZfMCkiIGZpbGwtb3BhY2l0eT0iMC4zNTAwMDAiLz4KCTxwYXRoIGlkPSJwYXRoIiBkPSJNMjkuMTU1NSA3LjVDMjMuNDc2OSAxMi42NTM4IDE1LjY4NCAxNS41IDYgMTUuNUw2IDM2Ljc2OTNDNi40MjY1MSA0NC4wNzA2IDE2LjEwNTMgNjAuMzk3NSAyOC44NjQ5IDYwLjM5NzVDMzguODI5OCA2MC4zOTc1IDUyLjQ3NjggNDYuNjUzOCA1MS45OTY4IDM1LjI1OTRMNTEuOTk2OCAxNS41QzQwLjEwOTMgMTUuNSAzNC40MDc1IDExLjQ2NTEgMjkuMTU1NSA3LjVaTTQ2Ljc5MzYgMzUuMjU5M0M0Ni43OTM2IDQyLjM3NTUgMzcuMTY5NCA1My4zNTc0IDI4Ljg2NDkgNTMuMzU3NEMyMC41NTQ3IDUzLjM1NzQgMTEuNTA2MiA0Mi4zNzU1IDExLjUwNjIgMzUuMjU5M0wxMS41MDYyIDIwLjM0MDJDMTkuODEwOCAyMC4zNDAyIDI0LjY0OTkgMTcuOTc1NSAyOS4xNTU1IDE0LjU2OTdDMzMuNjQ5OSAxNy45NjQ0IDM4LjQ5NDYgMjAuMzQwMiA0Ni43OTkzIDIwLjM0MDJMNDYuNzkzNiAzNS4yNTkzWiIgZmlsbC1ydWxlPSJub256ZXJvIiBmaWxsPSJ1cmwoI3BhaW50X2xpbmVhcl83Nl81N18wKSIgZmlsbC1vcGFjaXR5PSIwLjM0MDAwMCIvPgo8L3N2Zz4K)}.icon-img-low-risk[data-v-f660504b]{background-image:url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iNTguMDAwMDAwIiBoZWlnaHQ9IjY3LjAwMDAwMCIgdmlld0JveD0iMCAwIDU4IDY3IiBmaWxsPSJub25lIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIj4KCTxkZXNjPgoJCQlDcmVhdGVkIHdpdGggUGl4c28uCgk8L2Rlc2M+Cgk8ZGVmcz4KCQk8bGluZWFyR3JhZGllbnQgaWQ9InBhaW50X2xpbmVhcl82NF8yNDNfMCIgeDE9IjI5LjAwMDAwMCIgeTE9IjAuMDAwMDAwIiB4Mj0iMjkuMDAwMDAwIiB5Mj0iNjcuMDAwMDAwIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CgkJCTxzdG9wIHN0b3AtY29sb3I9IiNFOEQ1NDQiLz4KCQkJPHN0b3Agb2Zmc2V0PSIxLjAwMDAwMCIgc3RvcC1jb2xvcj0iI0ZGRUY3OSIgc3RvcC1vcGFjaXR5PSIwLjI3MDU4OCIvPgoJCTwvbGluZWFyR3JhZGllbnQ+CgkJPGxpbmVhckdyYWRpZW50IGlkPSJwYWludF9saW5lYXJfNjRfMjQ0XzAiIHgxPSIyOS4wMDQ1NzIiIHkxPSI3LjUwMDAwMCIgeDI9IjI5LjAwNDU3MiIgeTI9IjYwLjM5NzQzNCIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPgoJCQk8c3RvcCBzdG9wLWNvbG9yPSIjRkZFRjc5IiBzdG9wLW9wYWNpdHk9IjAuMTA5ODA0Ii8+CgkJCTxzdG9wIG9mZnNldD0iMS4wMDAwMDAiIHN0b3AtY29sb3I9IiNFOEQ1NDQiLz4KCQk8L2xpbmVhckdyYWRpZW50PgoJPC9kZWZzPgoJPHBhdGggaWQ9InBhdGgiIGQ9Ik0yOS4xOTcgMEMyMi4zNjc3IDUuMzcyNDQgMTIuNTkyNyAxMC42MzQ5IDAgMTAuNjM0OUwwIDM1Ljg5ODFDMCA0Ny4xNDU4IDE2LjYwNDQgNjcgMjkuMjA0MyA2N0M0MS44MDQ0IDY3IDU4IDQ3LjEzODMgNTggMzUuODk4MUw1OCAxMC42MzQ5QzQ1LjM4NTMgMTAuNjM0OSAzNi4wMjY0IDUuMzcyNDQgMjkuMTk3IDBaTTUyLjAyOTQgMzUuNjQ3NUM1Mi4wMjk0IDQ1LjI4OTQgMzkuNjI1NCA2MC4yOTIyIDI4LjgyNjMgNjAuMjkyMkMxOC4wMiA2MC4yOTIyIDYgNDUuNjQyIDYgMzZMNiAxNS41QzE2Ljc5OSAxNS41IDIzLjM0NTUgMTIuMzUyMiAyOS4yMDQzIDcuNzM3NTVDMzUuMDQ4NiAxMi4zMzcyIDQxLjIzMDUgMTUuNDYxNSA1Mi4wMjk0IDE1LjQ2MTVMNTIuMDI5NCAzNS42NDc1WiIgZmlsbC1ydWxlPSJub256ZXJvIiBmaWxsPSJ1cmwoI3BhaW50X2xpbmVhcl82NF8yNDNfMCkiIGZpbGwtb3BhY2l0eT0iMC4zNTAwMDAiLz4KCTxwYXRoIGlkPSJwYXRoIiBkPSJNMjkuMTU1NSA3LjVDMjMuNDc2OSAxMi42NTM4IDE1LjY4NCAxNS41IDYgMTUuNUw2IDM2Ljc2OTNDNi40MjY1MSA0NC4wNzA2IDE2LjEwNTMgNjAuMzk3NSAyOC44NjQ5IDYwLjM5NzVDMzguODI5OCA2MC4zOTc1IDUyLjQ3NjggNDYuNjUzOCA1MS45OTY4IDM1LjI1OTRMNTEuOTk2OCAxNS41QzQwLjEwOTMgMTUuNSAzNC40MDc1IDExLjQ2NTEgMjkuMTU1NSA3LjVaTTQ2Ljc5MzYgMzUuMjU5M0M0Ni43OTM2IDQyLjM3NTUgMzcuMTY5NCA1My4zNTc0IDI4Ljg2NDkgNTMuMzU3NEMyMC41NTQ3IDUzLjM1NzQgMTEuNTA2MiA0Mi4zNzU1IDExLjUwNjIgMzUuMjU5M0wxMS41MDYyIDIwLjM0MDJDMTkuODEwOCAyMC4zNDAyIDI0LjY0OTkgMTcuOTc1NSAyOS4xNTU1IDE0LjU2OTdDMzMuNjQ5OSAxNy45NjQ0IDM4LjQ5NDYgMjAuMzQwMiA0Ni43OTkzIDIwLjM0MDJMNDYuNzkzNiAzNS4yNTkzWiIgZmlsbC1ydWxlPSJub256ZXJvIiBmaWxsPSJ1cmwoI3BhaW50X2xpbmVhcl82NF8yNDRfMCkiIGZpbGwtb3BhY2l0eT0iMC4zNDAwMDAiLz4KPC9zdmc+Cg==)}.scan-icon-img-bg[data-v-f660504b]{position:absolute;left:0;right:0;top:0;bottom:0;z-index:50;margin:auto;display:inline-block;width:100px;height:100px;border-radius:100%;background:radial-gradient(50% 50% at 50% 50%,rgba(255,255,255,.2) 54.962%,rgba(122,227,142,.2))}.animate-box[data-v-f660504b]{position:relative;width:100px;height:100px;animation:rotate-f660504b 3s linear infinite}.animate-box-left[data-v-f660504b]{z-index:55;width:50px;height:100px;border-radius:50px 0 0 50px}.animate-box-right[data-v-f660504b]{position:absolute;left:50%;z-index:55;height:100px;--un-bg-opacity:1;background-color:rgb(255 255 255 / var(--un-bg-opacity));border-radius:0 50px 50px 0}.animate-box-bottom[data-v-f660504b]{position:absolute;top:.4rem;left:.4rem;z-index:2;width:92px;height:92px;border-radius:50%;background:radial-gradient(50% 50% at 50% 50%,rgba(255,255,255,.2) 54.962%,rgba(122,227,142,.2))}.circle-inner[data-v-f660504b]{background:var(--color-bg-2);position:absolute;left:0;top:0;bottom:0;right:0;z-index:55;margin:auto;display:inline-block;width:96px;height:96px;border-radius:100%}.circle-outer[data-v-f660504b]{position:absolute;left:0;top:0;bottom:0;right:0;z-index:55;margin:auto;width:100px;height:100px;border-radius:100%}.linear-safe[data-v-f660504b]{background:linear-gradient(#20a53a,#fff)}.linear-danger[data-v-f660504b]{background:linear-gradient(#ef0808,#fff)}.linear-warn[data-v-f660504b]{background:linear-gradient(#f0ad4e,#fff)}.linear-risk[data-v-f660504b]{background:linear-gradient(#e8d544,#fff)}.safe[data-v-f660504b]{background:radial-gradient(50% 50% at 50% 50%,rgba(255,255,255,.2) 54.962%,rgba(122,227,142,.2))}.danger[data-v-f660504b]{background:radial-gradient(50% 50% at 50% 50%,rgba(255,255,255,.2) 54.962%,rgba(255,0,0,.2))}.risk[data-v-f660504b]{background:radial-gradient(50% 50% at 50% 50%,rgba(240,173,78,0) 58.015%,rgba(232,213,68,.2))}.warn[data-v-f660504b]{background:radial-gradient(50% 50% at 50% 50%,rgba(240,173,78,0) 58.015%,rgba(240,173,78,.2))}.box-text[data-v-f660504b]{position:absolute;left:0;right:0;top:0;bottom:0;z-index:99;margin:auto;width:78px;height:50px;display:flex;align-items:center;justify-content:center;font-size:3.2rem;font-weight:700;line-height:4.5rem}.box-text span[data-v-f660504b]{margin-top:16px;font-size:1.8rem}.risk-spin[data-v-a3822d9f]{background:var(--home-risk-security-list-spin-bg)}.module-list[data-v-a3822d9f]::-webkit-scrollbar{width:10px;height:5px}.module-list[data-v-a3822d9f]::-webkit-scrollbar-thumb{box-shadow:inset 0 0 .5rem rgba(0,0,0,.2);background-color:#999}.module-item[data-v-a3822d9f]{font-size:1.25rem}.module-head[data-v-a3822d9f]{border-bottom:1px solid #ececec;color:#555;transition:background .3s}.module-head[data-v-a3822d9f]:nth-child(1){border-top:1px solid #ececec}.module-head[data-v-a3822d9f]:hover{background-color:var(--home-risk-security-list-hover-bg)}.module-body[data-v-a3822d9f]{border-bottom-width:1px;--un-border-opacity:1;border-color:rgb(236 236 236 / var(--un-border-opacity));padding:1rem 1.5rem 1rem 2.5rem;color:var(--color-text-2)}.collapse-item[data-v-a3822d9f]{color:var(--home-risk-security-list-collapse-item-color);background:var(--color-bg-2);width:48rem;border-radius:2px;font-size:1.2rem;margin-left:1rem;border-width:1px;--un-border-opacity:1;border-color:rgb(235 238 245 / var(--un-border-opacity));padding:.6rem 1.6rem;display:flex;align-items:center;line-height:1.8rem}.n-progress.n-progress--circle[data-v-0a5f55f9],.n-progress.n-progress--dashboard[data-v-0a5f55f9]{width:100px!important}.progress-header[data-v-0a5f55f9]{display:flex;align-items:center;height:140px;padding:20px;text-align:center}.progresscircle[data-v-0a5f55f9]{position:absolute;top:8px;left:25px}.progresscircle p[data-v-0a5f55f9]{padding:5px 0;font-size:13px;font-weight:700}.progresscirclebar[data-v-0a5f55f9]{position:relative;width:100px;height:100px;line-height:100px;font-size:18px}.progresscirclebar span[data-v-0a5f55f9]:nth-child(1){font-size:24px}.progresscirclebar.active svg[data-v-0a5f55f9]{-webkit-animation:load8 1.1s infinite linear;animation:load8 1.1s infinite linear}.progress-header-cot[data-v-0a5f55f9]:nth-child(1),.progress-header-cot[data-v-0a5f55f9]:nth-child(3){min-width:100px;position:relative}.progress-header-cot[data-v-0a5f55f9]:nth-child(3){display:flex}.progress-header-cot[data-v-0a5f55f9]:nth-child(2){width:100%;padding:0 40px}.progress-header-cot button.cancel_detect[data-v-0a5f55f9]{border-color:#999;color:#666;background-color:#fff;font-size:15px}.progress-header-cot button.cancel_detect[data-v-0a5f55f9]:hover{color:#fc6d26;background:rgba(252,109,38,.1);border-color:rgba(252,109,38,.2)}.scanning-progress-title[data-v-0a5f55f9]{text-align:left;font-weight:700;margin:15px 0;font-size:20px}.scanning-progress-title img[data-v-0a5f55f9]{margin-right:10px;vertical-align:sub;width:24px}.scanning-progress-title span[data-v-0a5f55f9]{color:#fc6d26}.scanning-progress-cont[data-v-0a5f55f9]{text-align:left;margin:15px 0;font-size:14px}.progress_item[data-v-9466c95d]{margin:0 20px 6px;padding:0 20px;background-color:var(--home-risk-server-list-bg);border-radius:4px;border:1px solid transparent}.progress_item_header[data-v-9466c95d]{height:30px;line-height:30px;display:flex;justify-content:space-between;border-radius:4px;cursor:pointer;font-size:12px;color:var(--home-risk-server-list-text)}.progress_item_header .progress_type[data-v-9466c95d]{display:flex;align-items:center;width:59.5%;font-weight:700;line-height:22px}.progress_item_header .progress_type .title-icon[data-v-9466c95d]{width:14px;margin-right:6px}.progress_item_header .progress_status[data-v-9466c95d]{flex:1}.progress-cont-list[data-v-9466c95d]{overflow:auto;max-height:390px}.progress_item_body[data-v-9466c95d]{line-height:30px;display:none;font-size:12px}.progress_item.active .progress_item_body[data-v-9466c95d]{display:block}.progress_item_info[data-v-9466c95d]{margin-bottom:6px}.progress_item_info .info_cont[data-v-9466c95d]{display:flex;color:#666;padding:0 30px}.progress_item_info .info_cont div[data-v-9466c95d]:nth-child(1){width:60%}.progress_item_info .info_cont div[data-v-9466c95d]:nth-child(2){width:40%}.progress_item_info .info_cont div:nth-child(2) span[data-v-9466c95d]{font-weight:600}.progress_item_info.active[data-v-9466c95d]{background-color:rgba(252,109,38,.1);padding:0}.progress_item_info.active .info_cont[data-v-9466c95d]{margin:0 20px;padding:0 10px;border-bottom:1px dashed #d9d9d9}.progress_item_info.active .info_cont_desc[data-v-9466c95d]{color:#888;border-radius:4px;padding:0 30px}.progress_item_info.active[data-v-9466c95d]:hover{background-color:rgba(252,109,38,.2)}.progress_item_info[data-v-9466c95d]:hover{background-color:var(--home-risk-server-list-hover)}.btn_red[data-v-9466c95d]{font-weight:700;margin-left:5px;padding:1px 5px;text-align:center;border-radius:3px;color:#fff;background:red}[data-v-9466c95d] .n-progress__text{font-size:16px!important;font-weight:700}.scrollable[data-v-9466c95d]::-webkit-scrollbar{width:10px}.scrollable[data-v-9466c95d]::-webkit-scrollbar-track{background:#efefef}.scrollable[data-v-9466c95d]::-webkit-scrollbar-thumb{background:#bfbfbf;border-radius:10px}.scrollable[data-v-9466c95d]::-webkit-scrollbar-thumb:hover{background:#555}.overview-wrapper[data-v-94e97d0e]{display:grid;align-items:center;justify-content:center;gap:16px;padding:20px;vertical-align:middle;grid-template-columns:repeat(6,minmax(0,1fr))}.overview-wrapper .ghost[data-v-94e97d0e]{border:2px dashed #20a53a}.overview-box[data-v-94e97d0e]{position:relative;width:100%;height:120px;max-width:260px;display:flex;flex-direction:column;cursor:pointer;border-radius:2px;padding-top:22px;transition-property:all;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s;transition-duration:.1s;border:1px solid #efefef}.overview-box[data-v-94e97d0e]:hover{box-shadow:0 0 8px rgba(153,153,153,.42)}.overview-box:hover .move[data-v-94e97d0e]{display:block}.overview-box:hover .bottom-menu[data-v-94e97d0e]{display:block;opacity:1}.overview-box .move[data-v-94e97d0e]{position:absolute;top:12px;right:12px;display:none;cursor:move;font-size:16px}.overview-box .content[data-v-94e97d0e]{display:flex;flex-direction:column;align-items:center;justify-content:space-between;padding-left:24px;padding-right:24px}.overview-box .content .overview-title[data-v-94e97d0e]{width:100%;height:40px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;padding-bottom:10px;font-size:15px;--un-text-opacity:1;color:rgb(153 153 153 / var(--un-text-opacity));line-height:30px}.overview-box .content .href[data-v-94e97d0e]{width:100%;height:24px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;font-size:20px}.overview-box .bottom-menu[data-v-94e97d0e]{position:absolute;bottom:0;margin-top:4px;display:none;width:100%;--un-bg-opacity:1;background-color:rgb(241 249 243 / var(--un-bg-opacity));text-align:center;color:var(--color-primary);line-height:26px;opacity:0;transition-property:all;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s;transition-duration:.1s}.software-wrapper[data-v-f5b29127]{display:grid;align-items:center;justify-content:center;vertical-align:middle;grid-template-columns:repeat(4,1fr)}.software-box[data-v-f5b29127]{position:relative;height:144px;border-top:1px solid #ececfb;border-right:1px solid #ececfb}.software-box[data-v-f5b29127]:nth-child(-n+4){border-top:none}.software-box[data-v-f5b29127]:nth-child(4n){border-right:none}.software-box .content[data-v-f5b29127]{position:relative;width:100%;height:100%;cursor:pointer;transition:all .25s ease}.software-box .content[data-v-f5b29127]:hover{box-shadow:0 0 38px rgba(0,0,0,.08) inset}.software-box .content:hover .move[data-v-f5b29127]{display:block}.software-box .content .move[data-v-f5b29127]{position:absolute;top:16px;right:16px;display:none;cursor:move;font-size:16px}.software-box .content .recommend[data-v-f5b29127]{position:absolute;top:-1.5px;left:-4px;height:18px;display:flex;align-items:center;--un-bg-opacity:1;background-color:rgb(239 239 239 / var(--un-bg-opacity));padding-left:8px;padding-right:8px;opacity:.5;transform:scale(.8)}.software-box .content .software-img[data-v-f5b29127]{display:flex;align-items:center;justify-content:center;padding-top:12px}.software-box .content .software-img img[data-v-f5b29127]{width:48px;height:auto}.software-box .content .software-name[data-v-f5b29127]{min-height:24px;display:flex;align-items:center;justify-content:center;padding-left:4px;padding-right:4px}.software-box .content .software-name .text[data-v-f5b29127]{text-align:center;color:var(--color-text-desc);line-height:16px}.software-box .content .software-btn[data-v-f5b29127]{margin-top:5px;display:flex;justify-content:center}.software-box .content .software-btn .n-button[data-v-f5b29127]{--n-height: 24px;--n-padding: 0 6px}.software-box .content .software-btn .n-button+.n-button[data-v-f5b29127]{margin-left:8px}.software-box .content .software-btn .preview[data-v-f5b29127]{--n-text-color: #666}.software-box .content .software-btn .install[data-v-f5b29127],.software-box .content .software-btn .buy[data-v-f5b29127]{--n-border: 1px solid #20a53a;--n-text-color: #20a53a;--n-color-hover: #20a53a;--n-border-hover: 1px solid #20a53a;--n-text-color-hover: #fff}.home-reset-tab[data-v-35812b26]{--n-tab-gap: 0;--n-tab-padding: 0 20px;--n-tab-font-size: 16px;--n-tab-text-color: #666;--n-pane-padding-top: 0}.home-reset-tab[data-v-35812b26] .n-tabs-nav{border-bottom:.5px solid #ebeef5}.home-reset-tab[data-v-35812b26] .n-tabs-nav .n-tabs-tab{width:100px;height:47px;justify-content:center}.home-reset-tab[data-v-35812b26] .n-tabs-nav .n-tabs-tab--active{background:rgba(32,165,58,.03)} +.card[data-v-3fbdb211]{border-width:1px;--un-border-opacity:1;border-color:rgb(235 238 245 / var(--un-border-opacity));border-radius:4px;border-style:solid}.card .card-title[data-v-3fbdb211]{border-bottom-width:1px;--un-border-opacity:1;--un-border-bottom-opacity:var(--un-border-opacity);border-bottom-color:rgb(235 238 245 / var(--un-border-bottom-opacity));border-bottom-style:solid;padding:10px}.info[data-v-3fbdb211]{padding:12px 16px;font-size:13px}.info .info-label[data-v-3fbdb211]{font-weight:700}.info .info-value[data-v-3fbdb211]{--un-text-opacity:1;color:rgb(145 145 145 / var(--un-text-opacity))} diff --git a/BTPanel/static/vite/css/index93.css b/BTPanel/static/vite/css/index93.css index 8724f2e8..85961823 100644 --- a/BTPanel/static/vite/css/index93.css +++ b/BTPanel/static/vite/css/index93.css @@ -1 +1 @@ -.soft-list li{display:flex;align-items:center}.soft-list li+li[data-v-30465cc8]{margin-top:12px}.recommend-item[data-v-fc7446b1]{flex:1 1 0%}.recommend-item+.recommend-item[data-v-fc7446b1]{margin-left:24px}.recommend-item .recommend-title[data-v-fc7446b1]{margin-bottom:10px;padding-left:5px;font-size:20px}.recommend-item .content[data-v-fc7446b1]{border-radius:4px;padding:20px 16px;transition-property:all;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s;transition-duration:.2s;border:1px solid var(--color-border)}.recommend-item .content .border-view[data-v-fc7446b1]{border-width:1px;border-color:var(--color-border);border-radius:4px;border-style:solid;padding:12px}.recommend-item .active[data-v-fc7446b1]{background-color:var(--home-soft-install-bg-color);border:1px solid var(--home-soft-install-border-color)}.recommend-list[data-v-aa0864d2]{display:flex} +.editor-toolbars[data-v-994bb124]{display:flex;align-items:center;height:32px;min-height:32px;background-color:#565656;color:#fff}.tools-btn[data-v-994bb124]{position:relative;display:flex;align-items:center;justify-content:center;height:32px;padding:0 16px;font-size:13px;border-right:1px solid #4c4c4c;cursor:pointer}.tools-btn[data-v-994bb124]:hover{background-color:#2f2f2f}.dir-path[data-v-1f4d4d59]{display:flex;align-items:center;justify-content:center;height:40px;font-size:12px;color:#fff}.tools[data-v-67b4eb87]{display:flex;align-items:center;width:100%;height:32px;min-height:32px;background-color:#565656;color:#fff}.tools-btn[data-v-67b4eb87]{position:relative;display:flex;align-items:center;justify-content:center;gap:6px;height:32px;padding:0 8px;font-size:12px;cursor:pointer}.tools-btn[data-v-67b4eb87]:hover{background-color:#2f2f2f}.editor-sidebar[data-v-5fb2d4d8]{display:flex;flex-direction:column;width:280px;height:100%;background-color:#292929;border-bottom-left-radius:8px} diff --git a/BTPanel/static/vite/css/index94.css b/BTPanel/static/vite/css/index94.css index b922e4a1..e59861af 100644 --- a/BTPanel/static/vite/css/index94.css +++ b/BTPanel/static/vite/css/index94.css @@ -1 +1 @@ -.home-security-file .lastScan-time[data-v-76b5d51c],.home-security-file .info-title[data-v-76b5d51c]{color:var(--home-risk-file-info-title-color)}.infoList[data-v-76b5d51c]{margin-bottom:1.6rem;display:flex;border-radius:.4rem;padding:1.6rem;border:1px solid #efefef}.item-list[data-v-76b5d51c]{border-right:1px solid #efefef}.item-list[data-v-76b5d51c]:last-child{border-right:none}.loading-icon[data-v-1a12c317]{position:absolute;width:80px;height:80px;animation:spin 1s linear infinite;--un-bg-opacity:0;background-color:rgb(204 204 204 / var(--un-bg-opacity));border-radius:50%;border:2px solid #20a53a;clip-path:inset(0 20%)}@keyframes spin{0%{transform:rotate(0)}to{transform:rotate(360deg)}}[data-v-f7ca8e26] .n-collapse .n-collapse-item .n-collapse-item__header .n-collapse-item__header-main{justify-content:space-between!important}.scrollable[data-v-f7ca8e26]::-webkit-scrollbar{width:10px}.scrollable[data-v-f7ca8e26]::-webkit-scrollbar-track{background:#efefef}.scrollable[data-v-f7ca8e26]::-webkit-scrollbar-thumb{background:#bfbfbf;border-radius:10px}.scrollable[data-v-f7ca8e26]::-webkit-scrollbar-thumb:hover{background:#555}.risk-chart[data-v-efa973b1]{padding:2px}.risk-chart .circle-box[data-v-efa973b1]{position:relative;display:flex;width:110px;height:110px;justify-content:center;align-items:center}.risk-chart .circle-box[data-v-efa973b1]:before,.risk-chart .circle-box[data-v-efa973b1]:after,.risk-chart .circle-box .circle-box-bg[data-v-efa973b1]{position:absolute;top:0;left:0;display:block;width:100%;height:100%;content:""}.risk-chart .circle-box[data-v-efa973b1]:before{border-radius:56% 56% 52% 54%;opacity:.8;animation:wave-efa973b1 12s infinite linear}.risk-chart .circle-box[data-v-efa973b1]:after{border-radius:44% 44% 42% 46%;opacity:.6;animation:wave-efa973b1 10s infinite linear}.risk-chart .circle-box .circle-box-bg[data-v-efa973b1]{border-radius:46% 46% 42% 44%;opacity:.4;animation:wave-efa973b1 8s infinite linear}.risk-chart .circle-box .circle-box-inner[data-v-efa973b1]{z-index:1;display:flex;width:101px;height:101px;border-radius:70% 60% 60%;flex-direction:column;justify-content:center;align-items:center;background:var(--home-risk-overview-circle-bg)}.risk-chart .circle-box .circle-box-value[data-v-efa973b1]{display:inline-flex;font-size:32px;line-height:1;align-items:flex-end}.risk-chart .circle-box .circle-box-value .unit[data-v-efa973b1]{margin-left:4px;font-size:12px;color:#999;transform:translateY(-6px)}.risk-chart .circle-box .circle-box-desc[data-v-efa973b1]{margin-top:4px}.circle-danger .risk-chart .circle-box[data-v-efa973b1]:before,.circle-danger .risk-chart .circle-box[data-v-efa973b1]:after,.circle-danger .risk-chart .circle-box .circle-box-bg[data-v-efa973b1]{background-color:#ef0808}.circle-danger .risk-chart .circle-box .circle-box-inner[data-v-efa973b1]{color:#e01616}.circle-warn .risk-chart .circle-box[data-v-efa973b1]:before,.circle-warn .risk-chart .circle-box[data-v-efa973b1]:after,.circle-warn .risk-chart .circle-box .circle-box-bg[data-v-efa973b1]{background-color:#f0ad4e}.circle-warn .risk-chart .circle-box .circle-box-inner[data-v-efa973b1]{color:#f0ad4e}.circle-alert .risk-chart .circle-box[data-v-efa973b1]:before,.circle-alert .risk-chart .circle-box[data-v-efa973b1]:after,.circle-alert .risk-chart .circle-box .circle-box-bg[data-v-efa973b1]{background-color:#e8d544}.circle-alert .risk-chart .circle-box .circle-box-inner[data-v-efa973b1]{color:#e8d544}.circle-safe .risk-chart .circle-box[data-v-efa973b1]:before,.circle-safe .risk-chart .circle-box[data-v-efa973b1]:after,.circle-safe .risk-chart .circle-box .circle-box-bg[data-v-efa973b1]{background-color:#20a53a}.circle-safe .risk-chart .circle-box .circle-box-inner[data-v-efa973b1]{color:#20a53a}@keyframes wave-efa973b1{0%{transform:rotate(0)}50%{transform:rotate(180deg)}to{transform:rotate(360deg)}}@keyframes rotate-2e83464a{0%{transform:rotate(0)}to{transform:rotate(360deg)}}.absolute-center[data-v-2e83464a]{position:absolute;top:0;left:0;bottom:0;right:0;margin:auto}.scan-icon-img[data-v-2e83464a]{position:absolute;left:0;right:0;top:0;bottom:0;z-index:99;margin:auto;width:58px;height:67px;background-position:100%}.icon-img-safe[data-v-2e83464a]{background-image:url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iNTguMDAwMDAwIiBoZWlnaHQ9IjY3LjAwMDAwMCIgdmlld0JveD0iMCAwIDU4IDY3IiBmaWxsPSJub25lIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIj4KCTxkZXNjPgoJCQlDcmVhdGVkIHdpdGggUGl4c28uCgk8L2Rlc2M+Cgk8ZGVmcz4KCQk8bGluZWFyR3JhZGllbnQgaWQ9InBhaW50X2xpbmVhcl8zN182NDhfMCIgeDE9IjI5LjAwMDAwMCIgeTE9IjAuMDAwMDAwIiB4Mj0iMjkuMDAwMDAwIiB5Mj0iNjcuMDAwMDAwIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CgkJCTxzdG9wIHN0b3AtY29sb3I9IiNCMkVFQkQiLz4KCQkJPHN0b3Agb2Zmc2V0PSIwLjk5MDU5MCIgc3RvcC1jb2xvcj0iIzYyREI3QSIgc3RvcC1vcGFjaXR5PSIwLjE3NjQ3MSIvPgoJCTwvbGluZWFyR3JhZGllbnQ+CgkJPGxpbmVhckdyYWRpZW50IGlkPSJwYWludF9saW5lYXJfMzdfNjQ5XzAiIHgxPSIyOS4wMDQxOTgiIHkxPSI3LjczMDcxMyIgeDI9IjI5LjAwNDE5OCIgeTI9IjYwLjEyODE0NyIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPgoJCQk8c3RvcCBzdG9wLWNvbG9yPSIjOThFM0E3IiBzdG9wLW9wYWNpdHk9IjAuMjIzNTI5Ii8+CgkJCTxzdG9wIG9mZnNldD0iMS4wMDAwMDAiIHN0b3AtY29sb3I9IiM4N0UxOTgiIHN0b3Atb3BhY2l0eT0iMC45MTc2NDciLz4KCQk8L2xpbmVhckdyYWRpZW50PgoJPC9kZWZzPgoJPHBhdGggaWQ9InBhdGgiIGQ9Ik0yOS4xOTcgMEMyMi4zNjc3IDUuMzcyNDQgMTIuNTkyNyAxMC42MzQ5IDAgMTAuNjM0OUwwIDM1Ljg5ODFDMCA0Ny4xNDU4IDE2LjYwNDQgNjcgMjkuMjA0MyA2N0M0MS44MDQ0IDY3IDU4IDQ3LjEzODMgNTggMzUuODk4MUw1OCAxMC42MzQ5QzQ1LjM4NTMgMTAuNjM0OSAzNi4wMjY0IDUuMzcyNDQgMjkuMTk3IDBaTTUyLjAyOTQgMzUuNjQ3NUM1Mi4wMjk0IDQ1LjI4OTQgMzkuNjI1NCA2MC4yOTIyIDI4LjgyNjMgNjAuMjkyMkMxOC4wMiA2MC4yOTIyIDYuMjUzNzggNDUuNDEyNSA2LjI1Mzc4IDM1Ljc3MDVMNi4yNTM3OCAxNS41NTYyQzE3LjA1MjcgMTUuNTU2MiAyMy4zNDU1IDEyLjM1MjIgMjkuMjA0MyA3LjczNzU1QzM1LjA0ODYgMTIuMzM3MiA0MS4yMzA1IDE1LjQ2MTUgNTIuMDI5NCAxNS40NjE1TDUyLjAyOTQgMzUuNjQ3NVoiIGZpbGwtcnVsZT0ibm9uemVybyIgZmlsbD0idXJsKCNwYWludF9saW5lYXJfMzdfNjQ4XzApIiBmaWxsLW9wYWNpdHk9IjAuMzUwMDAwIi8+Cgk8cGF0aCBpZD0icGF0aCIgZD0iTTI5LjEzNDUgNy43MzA3MUMyMy40NTU5IDEyLjg4NDUgMTUuNjYzIDE1LjQ2MTQgNS45NzkgMTUuNDYxNEw2LjM5NzA5IDM2LjUwNjNDNi44MjM0OSA0My44MDc2IDE2LjA4NDQgNjAuMTI4MiAyOC44NDM5IDYwLjEyODJDMzguODA4OCA2MC4xMjgyIDUyLjQ1NTggNDYuMzg0NSA1MS45NzU4IDM0Ljk5MDFMNTIuMDI5NCAxNS40NjE0QzQwLjE0MTggMTUuNDYxNCAzNC4zODY1IDExLjY5NTggMjkuMTM0NSA3LjczMDcxWk00Ni43NzI2IDM0Ljk5QzQ2Ljc3MjYgNDIuMTA2MiAzNy4xNDg0IDUzLjA4ODEgMjguODQzOSA1My4wODgxQzIwLjUzMzcgNTMuMDg4MSAxMS40ODUyIDQyLjEwNjIgMTEuNDg1MiAzNC45OUwxMS40ODUyIDIwLjA3MDlDMTkuNzg5OCAyMC4wNzA5IDI0LjYyODkgMTcuNzA2MiAyOS4xMzQ1IDE0LjMwMDRDMzMuNjI4OSAxNy42OTUxIDM4LjQ3MzYgMjAuMDcwOSA0Ni43NzgzIDIwLjA3MDlMNDYuNzcyNiAzNC45OVoiIGZpbGwtcnVsZT0ibm9uemVybyIgZmlsbD0idXJsKCNwYWludF9saW5lYXJfMzdfNjQ5XzApIiBmaWxsLW9wYWNpdHk9IjAuNDAwMDAwIi8+Cjwvc3ZnPgo=)}.icon-img-danger[data-v-2e83464a]{background-image:url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iNTguMDAwMDAwIiBoZWlnaHQ9IjY3LjAwMDAwMCIgdmlld0JveD0iMCAwIDU4IDY3IiBmaWxsPSJub25lIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIj4KCTxkZXNjPgoJCQlDcmVhdGVkIHdpdGggUGl4c28uCgk8L2Rlc2M+Cgk8ZGVmcz4KCQk8bGluZWFyR3JhZGllbnQgaWQ9InBhaW50X2xpbmVhcl82NF85M18wIiB4MT0iMjkuMDAwMDAwIiB5MT0iMC4wMDAwMDAiIHgyPSIyOS4wMDAwMDAiIHkyPSI2Ny4wMDAwMDAiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KCQkJPHN0b3Agc3RvcC1jb2xvcj0iI0ZGQjNCMyIgc3RvcC1vcGFjaXR5PSIwLjkxNzY0NyIvPgoJCQk8c3RvcCBvZmZzZXQ9IjEuMDAwMDAwIiBzdG9wLWNvbG9yPSIjRjc5Njk2IiBzdG9wLW9wYWNpdHk9IjAuMjMxMzczIi8+CgkJPC9saW5lYXJHcmFkaWVudD4KCQk8bGluZWFyR3JhZGllbnQgaWQ9InBhaW50X2xpbmVhcl82NF85NF8wIiB4MT0iMjkuMDA0MTk4IiB5MT0iNy43MzA3MTMiIHgyPSIyOS4wMDQxOTgiIHkyPSI2MC4xMjgxNDciIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KCQkJPHN0b3Agc3RvcC1jb2xvcj0iI0UzOTg5OCIgc3RvcC1vcGFjaXR5PSIwLjIyMzUyOSIvPgoJCQk8c3RvcCBvZmZzZXQ9IjEuMDAwMDAwIiBzdG9wLWNvbG9yPSIjRkZCM0IzIiBzdG9wLW9wYWNpdHk9IjAuOTE3NjQ3Ii8+CgkJPC9saW5lYXJHcmFkaWVudD4KCTwvZGVmcz4KCTxwYXRoIGlkPSJwYXRoIiBkPSJNMjkuMTk3IDBDMjIuMzY3NyA1LjM3MjQ0IDEyLjU5MjcgMTAuNjM0OSAwIDEwLjYzNDlMMCAzNS44OTgxQzAgNDcuMTQ1OCAxNi42MDQ0IDY3IDI5LjIwNDMgNjdDNDEuODA0NCA2NyA1OCA0Ny4xMzgzIDU4IDM1Ljg5ODFMNTggMTAuNjM0OUM0NS4zODUzIDEwLjYzNDkgMzYuMDI2NCA1LjM3MjQ0IDI5LjE5NyAwWk01Mi4wMjk0IDM1LjY0NzVDNTIuMDI5NCA0NS4yODk0IDM5LjYyNTQgNjAuMjkyMiAyOC44MjYzIDYwLjI5MjJDMTguMDIgNjAuMjkyMiA2IDQ1LjY0MiA2IDM2TDYgMTUuNUMxNi43OTkgMTUuNSAyMy4zNDU1IDEyLjM1MjIgMjkuMjA0MyA3LjczNzU1QzM1LjA0ODYgMTIuMzM3MiA0MS4yMzA1IDE1LjQ2MTUgNTIuMDI5NCAxNS40NjE1TDUyLjAyOTQgMzUuNjQ3NVoiIGZpbGwtcnVsZT0ibm9uemVybyIgZmlsbD0idXJsKCNwYWludF9saW5lYXJfNjRfOTNfMCkiIGZpbGwtb3BhY2l0eT0iMC4zNTAwMDAiLz4KCTxwYXRoIGlkPSJwYXRoIiBkPSJNMjkuMTM0NSA3LjczMDcxQzIzLjQ1NTkgMTIuODg0NSAxNS42NjMgMTUuNDYxNCA1Ljk3OSAxNS40NjE0TDUuOTc5IDM2LjVDNi40MDU1MiA0My44MDEzIDE2LjA4NDQgNjAuMTI4MiAyOC44NDM5IDYwLjEyODJDMzguODA4OCA2MC4xMjgyIDUyLjQ1NTggNDYuMzg0NSA1MS45NzU4IDM0Ljk5MDFMNTIuMDI5NCAxNS40NjE0QzQwLjE0MTggMTUuNDYxNCAzNC4zODY1IDExLjY5NTggMjkuMTM0NSA3LjczMDcxWk00Ni43NzI2IDM0Ljk5QzQ2Ljc3MjYgNDIuMTA2MiAzNy4xNDg0IDUzLjA4ODEgMjguODQzOSA1My4wODgxQzIwLjUzMzcgNTMuMDg4MSAxMS40ODUyIDQyLjEwNjIgMTEuNDg1MiAzNC45OUwxMS40ODUyIDIwLjA3MDlDMTkuNzg5OCAyMC4wNzA5IDI0LjYyODkgMTcuNzA2MiAyOS4xMzQ1IDE0LjMwMDRDMzMuNjI4OSAxNy42OTUxIDM4LjQ3MzYgMjAuMDcwOSA0Ni43NzgzIDIwLjA3MDlMNDYuNzcyNiAzNC45OVoiIGZpbGwtcnVsZT0ibm9uemVybyIgZmlsbD0idXJsKCNwYWludF9saW5lYXJfNjRfOTRfMCkiIGZpbGwtb3BhY2l0eT0iMC4zNDAwMDAiLz4KPC9zdmc+Cg==)}.icon-img-warn[data-v-2e83464a]{background-image:url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iNTguMDAwMDAwIiBoZWlnaHQ9IjY3LjAwMDAwMCIgdmlld0JveD0iMCAwIDU4IDY3IiBmaWxsPSJub25lIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIj4KCTxkZXNjPgoJCQlDcmVhdGVkIHdpdGggUGl4c28uCgk8L2Rlc2M+Cgk8ZGVmcz4KCQk8bGluZWFyR3JhZGllbnQgaWQ9InBhaW50X2xpbmVhcl83Nl81Nl8wIiB4MT0iMjkuMDAwMDAwIiB5MT0iMC4wMDAwMDAiIHgyPSIyOS4wMDAwMDAiIHkyPSI2Ny4wMDAwMDAiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KCQkJPHN0b3Agc3RvcC1jb2xvcj0iI0YwQUQ0RSIvPgoJCQk8c3RvcCBvZmZzZXQ9IjEuMDAwMDAwIiBzdG9wLWNvbG9yPSIjRkNGMERGIi8+CgkJPC9saW5lYXJHcmFkaWVudD4KCQk8bGluZWFyR3JhZGllbnQgaWQ9InBhaW50X2xpbmVhcl83Nl81N18wIiB4MT0iMjkuMDA0NTcyIiB5MT0iNy41MDAwMDAiIHgyPSIyOS4wMDQ1NzIiIHkyPSI2MC4zOTc0MzQiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KCQkJPHN0b3Agc3RvcC1jb2xvcj0iI0ZDRjBERiIvPgoJCQk8c3RvcCBvZmZzZXQ9IjEuMDAwMDAwIiBzdG9wLWNvbG9yPSIjRjBBRDRFIi8+CgkJPC9saW5lYXJHcmFkaWVudD4KCTwvZGVmcz4KCTxwYXRoIGlkPSJwYXRoIiBkPSJNMjkuMTk3IDBDMjIuMzY3NyA1LjM3MjQ0IDEyLjU5MjcgMTAuNjM0OSAwIDEwLjYzNDlMMCAzNS44OTgxQzAgNDcuMTQ1OCAxNi42MDQ0IDY3IDI5LjIwNDMgNjdDNDEuODA0NCA2NyA1OCA0Ny4xMzgzIDU4IDM1Ljg5ODFMNTggMTAuNjM0OUM0NS4zODUzIDEwLjYzNDkgMzYuMDI2NCA1LjM3MjQ0IDI5LjE5NyAwWk01Mi4wMjk0IDM1LjY0NzVDNTIuMDI5NCA0NS4yODk0IDM5LjYyNTQgNjAuMjkyMiAyOC44MjYzIDYwLjI5MjJDMTguMDIgNjAuMjkyMiA2IDQ1LjY0MiA2IDM2TDYgMTUuNUMxNi43OTkgMTUuNSAyMy4zNDU1IDEyLjM1MjIgMjkuMjA0MyA3LjczNzU1QzM1LjA0ODYgMTIuMzM3MiA0MS4yMzA1IDE1LjQ2MTUgNTIuMDI5NCAxNS40NjE1TDUyLjAyOTQgMzUuNjQ3NVoiIGZpbGwtcnVsZT0ibm9uemVybyIgZmlsbD0idXJsKCNwYWludF9saW5lYXJfNzZfNTZfMCkiIGZpbGwtb3BhY2l0eT0iMC4zNTAwMDAiLz4KCTxwYXRoIGlkPSJwYXRoIiBkPSJNMjkuMTU1NSA3LjVDMjMuNDc2OSAxMi42NTM4IDE1LjY4NCAxNS41IDYgMTUuNUw2IDM2Ljc2OTNDNi40MjY1MSA0NC4wNzA2IDE2LjEwNTMgNjAuMzk3NSAyOC44NjQ5IDYwLjM5NzVDMzguODI5OCA2MC4zOTc1IDUyLjQ3NjggNDYuNjUzOCA1MS45OTY4IDM1LjI1OTRMNTEuOTk2OCAxNS41QzQwLjEwOTMgMTUuNSAzNC40MDc1IDExLjQ2NTEgMjkuMTU1NSA3LjVaTTQ2Ljc5MzYgMzUuMjU5M0M0Ni43OTM2IDQyLjM3NTUgMzcuMTY5NCA1My4zNTc0IDI4Ljg2NDkgNTMuMzU3NEMyMC41NTQ3IDUzLjM1NzQgMTEuNTA2MiA0Mi4zNzU1IDExLjUwNjIgMzUuMjU5M0wxMS41MDYyIDIwLjM0MDJDMTkuODEwOCAyMC4zNDAyIDI0LjY0OTkgMTcuOTc1NSAyOS4xNTU1IDE0LjU2OTdDMzMuNjQ5OSAxNy45NjQ0IDM4LjQ5NDYgMjAuMzQwMiA0Ni43OTkzIDIwLjM0MDJMNDYuNzkzNiAzNS4yNTkzWiIgZmlsbC1ydWxlPSJub256ZXJvIiBmaWxsPSJ1cmwoI3BhaW50X2xpbmVhcl83Nl81N18wKSIgZmlsbC1vcGFjaXR5PSIwLjM0MDAwMCIvPgo8L3N2Zz4K)}.icon-img-low-risk[data-v-2e83464a]{background-image:url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iNTguMDAwMDAwIiBoZWlnaHQ9IjY3LjAwMDAwMCIgdmlld0JveD0iMCAwIDU4IDY3IiBmaWxsPSJub25lIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIj4KCTxkZXNjPgoJCQlDcmVhdGVkIHdpdGggUGl4c28uCgk8L2Rlc2M+Cgk8ZGVmcz4KCQk8bGluZWFyR3JhZGllbnQgaWQ9InBhaW50X2xpbmVhcl82NF8yNDNfMCIgeDE9IjI5LjAwMDAwMCIgeTE9IjAuMDAwMDAwIiB4Mj0iMjkuMDAwMDAwIiB5Mj0iNjcuMDAwMDAwIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CgkJCTxzdG9wIHN0b3AtY29sb3I9IiNFOEQ1NDQiLz4KCQkJPHN0b3Agb2Zmc2V0PSIxLjAwMDAwMCIgc3RvcC1jb2xvcj0iI0ZGRUY3OSIgc3RvcC1vcGFjaXR5PSIwLjI3MDU4OCIvPgoJCTwvbGluZWFyR3JhZGllbnQ+CgkJPGxpbmVhckdyYWRpZW50IGlkPSJwYWludF9saW5lYXJfNjRfMjQ0XzAiIHgxPSIyOS4wMDQ1NzIiIHkxPSI3LjUwMDAwMCIgeDI9IjI5LjAwNDU3MiIgeTI9IjYwLjM5NzQzNCIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPgoJCQk8c3RvcCBzdG9wLWNvbG9yPSIjRkZFRjc5IiBzdG9wLW9wYWNpdHk9IjAuMTA5ODA0Ii8+CgkJCTxzdG9wIG9mZnNldD0iMS4wMDAwMDAiIHN0b3AtY29sb3I9IiNFOEQ1NDQiLz4KCQk8L2xpbmVhckdyYWRpZW50PgoJPC9kZWZzPgoJPHBhdGggaWQ9InBhdGgiIGQ9Ik0yOS4xOTcgMEMyMi4zNjc3IDUuMzcyNDQgMTIuNTkyNyAxMC42MzQ5IDAgMTAuNjM0OUwwIDM1Ljg5ODFDMCA0Ny4xNDU4IDE2LjYwNDQgNjcgMjkuMjA0MyA2N0M0MS44MDQ0IDY3IDU4IDQ3LjEzODMgNTggMzUuODk4MUw1OCAxMC42MzQ5QzQ1LjM4NTMgMTAuNjM0OSAzNi4wMjY0IDUuMzcyNDQgMjkuMTk3IDBaTTUyLjAyOTQgMzUuNjQ3NUM1Mi4wMjk0IDQ1LjI4OTQgMzkuNjI1NCA2MC4yOTIyIDI4LjgyNjMgNjAuMjkyMkMxOC4wMiA2MC4yOTIyIDYgNDUuNjQyIDYgMzZMNiAxNS41QzE2Ljc5OSAxNS41IDIzLjM0NTUgMTIuMzUyMiAyOS4yMDQzIDcuNzM3NTVDMzUuMDQ4NiAxMi4zMzcyIDQxLjIzMDUgMTUuNDYxNSA1Mi4wMjk0IDE1LjQ2MTVMNTIuMDI5NCAzNS42NDc1WiIgZmlsbC1ydWxlPSJub256ZXJvIiBmaWxsPSJ1cmwoI3BhaW50X2xpbmVhcl82NF8yNDNfMCkiIGZpbGwtb3BhY2l0eT0iMC4zNTAwMDAiLz4KCTxwYXRoIGlkPSJwYXRoIiBkPSJNMjkuMTU1NSA3LjVDMjMuNDc2OSAxMi42NTM4IDE1LjY4NCAxNS41IDYgMTUuNUw2IDM2Ljc2OTNDNi40MjY1MSA0NC4wNzA2IDE2LjEwNTMgNjAuMzk3NSAyOC44NjQ5IDYwLjM5NzVDMzguODI5OCA2MC4zOTc1IDUyLjQ3NjggNDYuNjUzOCA1MS45OTY4IDM1LjI1OTRMNTEuOTk2OCAxNS41QzQwLjEwOTMgMTUuNSAzNC40MDc1IDExLjQ2NTEgMjkuMTU1NSA3LjVaTTQ2Ljc5MzYgMzUuMjU5M0M0Ni43OTM2IDQyLjM3NTUgMzcuMTY5NCA1My4zNTc0IDI4Ljg2NDkgNTMuMzU3NEMyMC41NTQ3IDUzLjM1NzQgMTEuNTA2MiA0Mi4zNzU1IDExLjUwNjIgMzUuMjU5M0wxMS41MDYyIDIwLjM0MDJDMTkuODEwOCAyMC4zNDAyIDI0LjY0OTkgMTcuOTc1NSAyOS4xNTU1IDE0LjU2OTdDMzMuNjQ5OSAxNy45NjQ0IDM4LjQ5NDYgMjAuMzQwMiA0Ni43OTkzIDIwLjM0MDJMNDYuNzkzNiAzNS4yNTkzWiIgZmlsbC1ydWxlPSJub256ZXJvIiBmaWxsPSJ1cmwoI3BhaW50X2xpbmVhcl82NF8yNDRfMCkiIGZpbGwtb3BhY2l0eT0iMC4zNDAwMDAiLz4KPC9zdmc+Cg==)}.scan-icon-img-bg[data-v-2e83464a]{position:absolute;left:0;right:0;top:0;bottom:0;z-index:50;margin:auto;display:inline-block;width:100px;height:100px;border-radius:100%;background:radial-gradient(50% 50% at 50% 50%,rgba(255,255,255,.2) 54.962%,rgba(122,227,142,.2))}.animate-box[data-v-2e83464a]{position:relative;width:100px;height:100px;animation:rotate-2e83464a 3s linear infinite}.animate-box-left[data-v-2e83464a]{z-index:55;width:50px;height:100px;border-radius:50px 0 0 50px}.animate-box-right[data-v-2e83464a]{position:absolute;left:50%;z-index:55;height:100px;--un-bg-opacity:1;background-color:rgb(255 255 255 / var(--un-bg-opacity));border-radius:0 50px 50px 0}.animate-box-bottom[data-v-2e83464a]{position:absolute;top:.4rem;left:.4rem;z-index:2;width:92px;height:92px;border-radius:50%;background:radial-gradient(50% 50% at 50% 50%,rgba(255,255,255,.2) 54.962%,rgba(122,227,142,.2))}.circle-inner[data-v-2e83464a]{background:var(--color-bg-2);position:absolute;left:0;top:0;bottom:0;right:0;z-index:55;margin:auto;display:inline-block;width:96px;height:96px;border-radius:100%}.circle-outer[data-v-2e83464a]{position:absolute;left:0;top:0;bottom:0;right:0;z-index:55;margin:auto;width:100px;height:100px;border-radius:100%}.linear-safe[data-v-2e83464a]{background:linear-gradient(#20a53a,#fff)}.linear-danger[data-v-2e83464a]{background:linear-gradient(#ef0808,#fff)}.linear-warn[data-v-2e83464a]{background:linear-gradient(#f0ad4e,#fff)}.linear-risk[data-v-2e83464a]{background:linear-gradient(#e8d544,#fff)}.safe[data-v-2e83464a]{background:radial-gradient(50% 50% at 50% 50%,rgba(255,255,255,.2) 54.962%,rgba(122,227,142,.2))}.danger[data-v-2e83464a]{background:radial-gradient(50% 50% at 50% 50%,rgba(255,255,255,.2) 54.962%,rgba(255,0,0,.2))}.risk[data-v-2e83464a]{background:radial-gradient(50% 50% at 50% 50%,rgba(240,173,78,0) 58.015%,rgba(232,213,68,.2))}.warn[data-v-2e83464a]{background:radial-gradient(50% 50% at 50% 50%,rgba(240,173,78,0) 58.015%,rgba(240,173,78,.2))}.box-text[data-v-2e83464a]{position:absolute;left:0;right:0;top:0;bottom:0;z-index:99;margin:auto;width:78px;height:50px;display:flex;align-items:center;justify-content:center;font-size:3.2rem;font-weight:700;line-height:4.5rem}.box-text span[data-v-2e83464a]{margin-top:16px;font-size:1.8rem}.risk-spin[data-v-8c801650]{background:var(--home-risk-security-list-spin-bg)}.module-list[data-v-8c801650]::-webkit-scrollbar{width:10px;height:5px}.module-list[data-v-8c801650]::-webkit-scrollbar-thumb{box-shadow:inset 0 0 .5rem rgba(0,0,0,.2);background-color:#999}.module-item[data-v-8c801650]{font-size:1.25rem}.module-head[data-v-8c801650]{border-bottom:1px solid #ececec;color:#555;transition:background .3s}.module-head[data-v-8c801650]:nth-child(1){border-top:1px solid #ececec}.module-head[data-v-8c801650]:hover{background-color:var(--home-risk-security-list-hover-bg)}.module-body[data-v-8c801650]{border-bottom-width:1px;--un-border-opacity:1;border-color:rgb(236 236 236 / var(--un-border-opacity));padding:1rem 1.5rem 1rem 2.5rem;color:var(--color-text-2)}.collapse-item[data-v-8c801650]{color:var(--home-risk-security-list-collapse-item-color);background:var(--color-bg-2);width:48rem;border-radius:2px;font-size:1.2rem;margin-left:1rem;border-width:1px;--un-border-opacity:1;border-color:rgb(235 238 245 / var(--un-border-opacity));padding:.6rem 1.6rem;display:flex;align-items:center;line-height:1.8rem}.n-progress.n-progress--circle[data-v-420a884f],.n-progress.n-progress--dashboard[data-v-420a884f]{width:100px!important}.progress-header[data-v-420a884f]{display:flex;align-items:center;height:140px;padding:20px;text-align:center}.progresscircle[data-v-420a884f]{position:absolute;top:8px;left:25px}.progresscircle p[data-v-420a884f]{padding:5px 0;font-size:13px;font-weight:700}.progresscirclebar[data-v-420a884f]{position:relative;width:100px;height:100px;line-height:100px;font-size:18px}.progresscirclebar span[data-v-420a884f]:nth-child(1){font-size:24px}.progresscirclebar.active svg[data-v-420a884f]{-webkit-animation:load8 1.1s infinite linear;animation:load8 1.1s infinite linear}.progress-header-cot[data-v-420a884f]:nth-child(1),.progress-header-cot[data-v-420a884f]:nth-child(3){min-width:100px;position:relative}.progress-header-cot[data-v-420a884f]:nth-child(3){display:flex}.progress-header-cot[data-v-420a884f]:nth-child(2){width:100%;padding:0 40px}.progress-header-cot button.cancel_detect[data-v-420a884f]{border-color:#999;color:#666;background-color:#fff;font-size:15px}.progress-header-cot button.cancel_detect[data-v-420a884f]:hover{color:#fc6d26;background:rgba(252,109,38,.1);border-color:rgba(252,109,38,.2)}.scanning-progress-title[data-v-420a884f]{text-align:left;font-weight:700;margin:15px 0;font-size:20px}.scanning-progress-title img[data-v-420a884f]{margin-right:10px;vertical-align:sub;width:24px}.scanning-progress-title span[data-v-420a884f]{color:#fc6d26}.scanning-progress-cont[data-v-420a884f]{text-align:left;margin:15px 0;font-size:14px}.progress_item[data-v-8e84f2b9]{margin:0 20px 6px;padding:0 20px;background-color:var(--home-risk-server-list-bg);border-radius:4px;border:1px solid transparent}.progress_item_header[data-v-8e84f2b9]{height:30px;line-height:30px;display:flex;justify-content:space-between;border-radius:4px;cursor:pointer;font-size:12px;color:var(--home-risk-server-list-text)}.progress_item_header .progress_type[data-v-8e84f2b9]{display:flex;align-items:center;width:59.5%;font-weight:700;line-height:22px}.progress_item_header .progress_type .title-icon[data-v-8e84f2b9]{width:14px;margin-right:6px}.progress_item_header .progress_status[data-v-8e84f2b9]{flex:1}.progress-cont-list[data-v-8e84f2b9]{overflow:auto;max-height:390px}.progress_item_body[data-v-8e84f2b9]{line-height:30px;display:none;font-size:12px}.progress_item.active .progress_item_body[data-v-8e84f2b9]{display:block}.progress_item_info[data-v-8e84f2b9]{margin-bottom:6px}.progress_item_info .info_cont[data-v-8e84f2b9]{display:flex;color:#666;padding:0 30px}.progress_item_info .info_cont div[data-v-8e84f2b9]:nth-child(1){width:60%}.progress_item_info .info_cont div[data-v-8e84f2b9]:nth-child(2){width:40%}.progress_item_info .info_cont div:nth-child(2) span[data-v-8e84f2b9]{font-weight:600}.progress_item_info.active[data-v-8e84f2b9]{background-color:rgba(252,109,38,.1);padding:0}.progress_item_info.active .info_cont[data-v-8e84f2b9]{margin:0 20px;padding:0 10px;border-bottom:1px dashed #d9d9d9}.progress_item_info.active .info_cont_desc[data-v-8e84f2b9]{color:#888;border-radius:4px;padding:0 30px}.progress_item_info.active[data-v-8e84f2b9]:hover{background-color:rgba(252,109,38,.2)}.progress_item_info[data-v-8e84f2b9]:hover{background-color:var(--home-risk-server-list-hover)}.btn_red[data-v-8e84f2b9]{font-weight:700;margin-left:5px;padding:1px 5px;text-align:center;border-radius:3px;color:#fff;background:red}[data-v-8e84f2b9] .n-progress__text{font-size:16px!important;font-weight:700}.scrollable[data-v-8e84f2b9]::-webkit-scrollbar{width:10px}.scrollable[data-v-8e84f2b9]::-webkit-scrollbar-track{background:#efefef}.scrollable[data-v-8e84f2b9]::-webkit-scrollbar-thumb{background:#bfbfbf;border-radius:10px}.scrollable[data-v-8e84f2b9]::-webkit-scrollbar-thumb:hover{background:#555} +.spanText[data-v-2eb7c01e]{border:1px solid #eeeef0;background-color:#f4f4f5;border-radius:5px;padding:5px 8px}.spanLength[data-v-2eb7c01e]{display:inline-block;max-width:160px!important;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.checkbox[data-v-2eb7c01e]{margin-top:-10px}.checkbox div[data-v-2eb7c01e]{margin-top:10px}.spanText[data-v-4270dc55]{border:1px solid #eeeef0;background-color:#f4f4f5;border-radius:5px;padding:5px 8px}.spanLength[data-v-4270dc55]{display:inline-block;max-width:80px!important;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.checkbox[data-v-4270dc55]{margin-top:-10px}.checkbox div[data-v-4270dc55]{margin-top:10px} diff --git a/BTPanel/static/vite/css/index95.css b/BTPanel/static/vite/css/index95.css index 92e8ca70..23484504 100644 --- a/BTPanel/static/vite/css/index95.css +++ b/BTPanel/static/vite/css/index95.css @@ -1 +1 @@ -.item-list[data-v-44d19ba5]{align-items:center;padding:16px;border-bottom:1px solid var(--color-border)} +@charset "UTF-8";@media (max-width: 1440px){.system-info[data-v-5c30d0df]{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;max-width:120px}}@media (max-width: 1320px){.run-time[data-v-5c30d0df]{display:none}}.advantage[data-v-bfb22274]{display:flex;align-items:center}.advantage[data-v-bfb22274]:before{content:"";width:12px;height:6px;margin-right:4px;border-left:2px solid #20a532;border-bottom:2px solid #20a532;transform:rotate(-45deg)}.n-collapse[data-v-f0e03c84] .n-collapse-item:not(:first-child){border:none;margin:0}.n-collapse[data-v-f0e03c84] .n-collapse-item .n-collapse-item__header-main{display:flex;align-items:center;height:30px;padding:0 8px;background-color:#f9f9f9;color:#555;font-size:13px}.n-collapse[data-v-f0e03c84] .n-collapse-item .n-collapse-item__content-wrapper .n-collapse-item__content-inner{padding-top:0}.table[data-v-d5229aa0]{width:100%;max-width:100%;background-color:transparent;border-spacing:0;border-collapse:collapse;margin-bottom:0}.table tbody>tr>td[data-v-d5229aa0]{vertical-align:middle;line-height:1.42857143;padding:4px;text-overflow:ellipsis;word-break:break-all;overflow:hidden;border-top:none}.home-security-file .lastScan-time[data-v-3b66d740],.home-security-file .info-title[data-v-3b66d740]{color:var(--home-risk-file-info-title-color)}.infoList[data-v-3b66d740]{margin-bottom:1.6rem;display:flex;border-radius:.4rem;padding:1.6rem;border:1px solid #efefef}.item-list[data-v-3b66d740]{border-right:1px solid #efefef}.item-list[data-v-3b66d740]:last-child{border-right:none}.loading-icon[data-v-a91fb030]{position:absolute;width:80px;height:80px;animation:spin 1s linear infinite;--un-bg-opacity:0;background-color:rgb(204 204 204 / var(--un-bg-opacity));border-radius:50%;border:2px solid #20a53a;clip-path:inset(0 20%)}@keyframes spin{0%{transform:rotate(0)}to{transform:rotate(360deg)}}[data-v-0e08d546] .n-collapse .n-collapse-item .n-collapse-item__header .n-collapse-item__header-main{justify-content:space-between!important}.scrollable[data-v-0e08d546]::-webkit-scrollbar{width:10px}.scrollable[data-v-0e08d546]::-webkit-scrollbar-track{background:#efefef}.scrollable[data-v-0e08d546]::-webkit-scrollbar-thumb{background:#bfbfbf;border-radius:10px}.scrollable[data-v-0e08d546]::-webkit-scrollbar-thumb:hover{background:#555}.risk-chart[data-v-56656608]{padding:2px}.risk-chart .circle-box[data-v-56656608]{position:relative;display:flex;width:110px;height:110px;justify-content:center;align-items:center}.risk-chart .circle-box[data-v-56656608]:before,.risk-chart .circle-box[data-v-56656608]:after,.risk-chart .circle-box .circle-box-bg[data-v-56656608]{position:absolute;top:0;left:0;display:block;width:100%;height:100%;content:""}.risk-chart .circle-box[data-v-56656608]:before{border-radius:56% 56% 52% 54%;opacity:.8;animation:wave-56656608 12s infinite linear}.risk-chart .circle-box[data-v-56656608]:after{border-radius:44% 44% 42% 46%;opacity:.6;animation:wave-56656608 10s infinite linear}.risk-chart .circle-box .circle-box-bg[data-v-56656608]{border-radius:46% 46% 42% 44%;opacity:.4;animation:wave-56656608 8s infinite linear}.risk-chart .circle-box .circle-box-inner[data-v-56656608]{z-index:1;display:flex;width:101px;height:101px;border-radius:70% 60% 60%;flex-direction:column;justify-content:center;align-items:center;background:var(--home-risk-overview-circle-bg)}.risk-chart .circle-box .circle-box-value[data-v-56656608]{display:inline-flex;font-size:32px;line-height:1;align-items:flex-end}.risk-chart .circle-box .circle-box-value .unit[data-v-56656608]{margin-left:4px;font-size:12px;color:#999;transform:translateY(-6px)}.risk-chart .circle-box .circle-box-desc[data-v-56656608]{margin-top:4px}.circle-danger .risk-chart .circle-box[data-v-56656608]:before,.circle-danger .risk-chart .circle-box[data-v-56656608]:after,.circle-danger .risk-chart .circle-box .circle-box-bg[data-v-56656608]{background-color:#ef0808}.circle-danger .risk-chart .circle-box .circle-box-inner[data-v-56656608]{color:#e01616}.circle-warn .risk-chart .circle-box[data-v-56656608]:before,.circle-warn .risk-chart .circle-box[data-v-56656608]:after,.circle-warn .risk-chart .circle-box .circle-box-bg[data-v-56656608]{background-color:#f0ad4e}.circle-warn .risk-chart .circle-box .circle-box-inner[data-v-56656608]{color:#f0ad4e}.circle-alert .risk-chart .circle-box[data-v-56656608]:before,.circle-alert .risk-chart .circle-box[data-v-56656608]:after,.circle-alert .risk-chart .circle-box .circle-box-bg[data-v-56656608]{background-color:#e8d544}.circle-alert .risk-chart .circle-box .circle-box-inner[data-v-56656608]{color:#e8d544}.circle-safe .risk-chart .circle-box[data-v-56656608]:before,.circle-safe .risk-chart .circle-box[data-v-56656608]:after,.circle-safe .risk-chart .circle-box .circle-box-bg[data-v-56656608]{background-color:#20a53a}.circle-safe .risk-chart .circle-box .circle-box-inner[data-v-56656608]{color:#20a53a}@keyframes wave-56656608{0%{transform:rotate(0)}50%{transform:rotate(180deg)}to{transform:rotate(360deg)}}@keyframes rotate-f660504b{0%{transform:rotate(0)}to{transform:rotate(360deg)}}.absolute-center[data-v-f660504b]{position:absolute;top:0;left:0;bottom:0;right:0;margin:auto}.scan-icon-img[data-v-f660504b]{position:absolute;left:0;right:0;top:0;bottom:0;z-index:99;margin:auto;width:58px;height:67px;background-position:100%}.icon-img-safe[data-v-f660504b]{background-image:url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iNTguMDAwMDAwIiBoZWlnaHQ9IjY3LjAwMDAwMCIgdmlld0JveD0iMCAwIDU4IDY3IiBmaWxsPSJub25lIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIj4KCTxkZXNjPgoJCQlDcmVhdGVkIHdpdGggUGl4c28uCgk8L2Rlc2M+Cgk8ZGVmcz4KCQk8bGluZWFyR3JhZGllbnQgaWQ9InBhaW50X2xpbmVhcl8zN182NDhfMCIgeDE9IjI5LjAwMDAwMCIgeTE9IjAuMDAwMDAwIiB4Mj0iMjkuMDAwMDAwIiB5Mj0iNjcuMDAwMDAwIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CgkJCTxzdG9wIHN0b3AtY29sb3I9IiNCMkVFQkQiLz4KCQkJPHN0b3Agb2Zmc2V0PSIwLjk5MDU5MCIgc3RvcC1jb2xvcj0iIzYyREI3QSIgc3RvcC1vcGFjaXR5PSIwLjE3NjQ3MSIvPgoJCTwvbGluZWFyR3JhZGllbnQ+CgkJPGxpbmVhckdyYWRpZW50IGlkPSJwYWludF9saW5lYXJfMzdfNjQ5XzAiIHgxPSIyOS4wMDQxOTgiIHkxPSI3LjczMDcxMyIgeDI9IjI5LjAwNDE5OCIgeTI9IjYwLjEyODE0NyIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPgoJCQk8c3RvcCBzdG9wLWNvbG9yPSIjOThFM0E3IiBzdG9wLW9wYWNpdHk9IjAuMjIzNTI5Ii8+CgkJCTxzdG9wIG9mZnNldD0iMS4wMDAwMDAiIHN0b3AtY29sb3I9IiM4N0UxOTgiIHN0b3Atb3BhY2l0eT0iMC45MTc2NDciLz4KCQk8L2xpbmVhckdyYWRpZW50PgoJPC9kZWZzPgoJPHBhdGggaWQ9InBhdGgiIGQ9Ik0yOS4xOTcgMEMyMi4zNjc3IDUuMzcyNDQgMTIuNTkyNyAxMC42MzQ5IDAgMTAuNjM0OUwwIDM1Ljg5ODFDMCA0Ny4xNDU4IDE2LjYwNDQgNjcgMjkuMjA0MyA2N0M0MS44MDQ0IDY3IDU4IDQ3LjEzODMgNTggMzUuODk4MUw1OCAxMC42MzQ5QzQ1LjM4NTMgMTAuNjM0OSAzNi4wMjY0IDUuMzcyNDQgMjkuMTk3IDBaTTUyLjAyOTQgMzUuNjQ3NUM1Mi4wMjk0IDQ1LjI4OTQgMzkuNjI1NCA2MC4yOTIyIDI4LjgyNjMgNjAuMjkyMkMxOC4wMiA2MC4yOTIyIDYuMjUzNzggNDUuNDEyNSA2LjI1Mzc4IDM1Ljc3MDVMNi4yNTM3OCAxNS41NTYyQzE3LjA1MjcgMTUuNTU2MiAyMy4zNDU1IDEyLjM1MjIgMjkuMjA0MyA3LjczNzU1QzM1LjA0ODYgMTIuMzM3MiA0MS4yMzA1IDE1LjQ2MTUgNTIuMDI5NCAxNS40NjE1TDUyLjAyOTQgMzUuNjQ3NVoiIGZpbGwtcnVsZT0ibm9uemVybyIgZmlsbD0idXJsKCNwYWludF9saW5lYXJfMzdfNjQ4XzApIiBmaWxsLW9wYWNpdHk9IjAuMzUwMDAwIi8+Cgk8cGF0aCBpZD0icGF0aCIgZD0iTTI5LjEzNDUgNy43MzA3MUMyMy40NTU5IDEyLjg4NDUgMTUuNjYzIDE1LjQ2MTQgNS45NzkgMTUuNDYxNEw2LjM5NzA5IDM2LjUwNjNDNi44MjM0OSA0My44MDc2IDE2LjA4NDQgNjAuMTI4MiAyOC44NDM5IDYwLjEyODJDMzguODA4OCA2MC4xMjgyIDUyLjQ1NTggNDYuMzg0NSA1MS45NzU4IDM0Ljk5MDFMNTIuMDI5NCAxNS40NjE0QzQwLjE0MTggMTUuNDYxNCAzNC4zODY1IDExLjY5NTggMjkuMTM0NSA3LjczMDcxWk00Ni43NzI2IDM0Ljk5QzQ2Ljc3MjYgNDIuMTA2MiAzNy4xNDg0IDUzLjA4ODEgMjguODQzOSA1My4wODgxQzIwLjUzMzcgNTMuMDg4MSAxMS40ODUyIDQyLjEwNjIgMTEuNDg1MiAzNC45OUwxMS40ODUyIDIwLjA3MDlDMTkuNzg5OCAyMC4wNzA5IDI0LjYyODkgMTcuNzA2MiAyOS4xMzQ1IDE0LjMwMDRDMzMuNjI4OSAxNy42OTUxIDM4LjQ3MzYgMjAuMDcwOSA0Ni43NzgzIDIwLjA3MDlMNDYuNzcyNiAzNC45OVoiIGZpbGwtcnVsZT0ibm9uemVybyIgZmlsbD0idXJsKCNwYWludF9saW5lYXJfMzdfNjQ5XzApIiBmaWxsLW9wYWNpdHk9IjAuNDAwMDAwIi8+Cjwvc3ZnPgo=)}.icon-img-danger[data-v-f660504b]{background-image:url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iNTguMDAwMDAwIiBoZWlnaHQ9IjY3LjAwMDAwMCIgdmlld0JveD0iMCAwIDU4IDY3IiBmaWxsPSJub25lIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIj4KCTxkZXNjPgoJCQlDcmVhdGVkIHdpdGggUGl4c28uCgk8L2Rlc2M+Cgk8ZGVmcz4KCQk8bGluZWFyR3JhZGllbnQgaWQ9InBhaW50X2xpbmVhcl82NF85M18wIiB4MT0iMjkuMDAwMDAwIiB5MT0iMC4wMDAwMDAiIHgyPSIyOS4wMDAwMDAiIHkyPSI2Ny4wMDAwMDAiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KCQkJPHN0b3Agc3RvcC1jb2xvcj0iI0ZGQjNCMyIgc3RvcC1vcGFjaXR5PSIwLjkxNzY0NyIvPgoJCQk8c3RvcCBvZmZzZXQ9IjEuMDAwMDAwIiBzdG9wLWNvbG9yPSIjRjc5Njk2IiBzdG9wLW9wYWNpdHk9IjAuMjMxMzczIi8+CgkJPC9saW5lYXJHcmFkaWVudD4KCQk8bGluZWFyR3JhZGllbnQgaWQ9InBhaW50X2xpbmVhcl82NF85NF8wIiB4MT0iMjkuMDA0MTk4IiB5MT0iNy43MzA3MTMiIHgyPSIyOS4wMDQxOTgiIHkyPSI2MC4xMjgxNDciIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KCQkJPHN0b3Agc3RvcC1jb2xvcj0iI0UzOTg5OCIgc3RvcC1vcGFjaXR5PSIwLjIyMzUyOSIvPgoJCQk8c3RvcCBvZmZzZXQ9IjEuMDAwMDAwIiBzdG9wLWNvbG9yPSIjRkZCM0IzIiBzdG9wLW9wYWNpdHk9IjAuOTE3NjQ3Ii8+CgkJPC9saW5lYXJHcmFkaWVudD4KCTwvZGVmcz4KCTxwYXRoIGlkPSJwYXRoIiBkPSJNMjkuMTk3IDBDMjIuMzY3NyA1LjM3MjQ0IDEyLjU5MjcgMTAuNjM0OSAwIDEwLjYzNDlMMCAzNS44OTgxQzAgNDcuMTQ1OCAxNi42MDQ0IDY3IDI5LjIwNDMgNjdDNDEuODA0NCA2NyA1OCA0Ny4xMzgzIDU4IDM1Ljg5ODFMNTggMTAuNjM0OUM0NS4zODUzIDEwLjYzNDkgMzYuMDI2NCA1LjM3MjQ0IDI5LjE5NyAwWk01Mi4wMjk0IDM1LjY0NzVDNTIuMDI5NCA0NS4yODk0IDM5LjYyNTQgNjAuMjkyMiAyOC44MjYzIDYwLjI5MjJDMTguMDIgNjAuMjkyMiA2IDQ1LjY0MiA2IDM2TDYgMTUuNUMxNi43OTkgMTUuNSAyMy4zNDU1IDEyLjM1MjIgMjkuMjA0MyA3LjczNzU1QzM1LjA0ODYgMTIuMzM3MiA0MS4yMzA1IDE1LjQ2MTUgNTIuMDI5NCAxNS40NjE1TDUyLjAyOTQgMzUuNjQ3NVoiIGZpbGwtcnVsZT0ibm9uemVybyIgZmlsbD0idXJsKCNwYWludF9saW5lYXJfNjRfOTNfMCkiIGZpbGwtb3BhY2l0eT0iMC4zNTAwMDAiLz4KCTxwYXRoIGlkPSJwYXRoIiBkPSJNMjkuMTM0NSA3LjczMDcxQzIzLjQ1NTkgMTIuODg0NSAxNS42NjMgMTUuNDYxNCA1Ljk3OSAxNS40NjE0TDUuOTc5IDM2LjVDNi40MDU1MiA0My44MDEzIDE2LjA4NDQgNjAuMTI4MiAyOC44NDM5IDYwLjEyODJDMzguODA4OCA2MC4xMjgyIDUyLjQ1NTggNDYuMzg0NSA1MS45NzU4IDM0Ljk5MDFMNTIuMDI5NCAxNS40NjE0QzQwLjE0MTggMTUuNDYxNCAzNC4zODY1IDExLjY5NTggMjkuMTM0NSA3LjczMDcxWk00Ni43NzI2IDM0Ljk5QzQ2Ljc3MjYgNDIuMTA2MiAzNy4xNDg0IDUzLjA4ODEgMjguODQzOSA1My4wODgxQzIwLjUzMzcgNTMuMDg4MSAxMS40ODUyIDQyLjEwNjIgMTEuNDg1MiAzNC45OUwxMS40ODUyIDIwLjA3MDlDMTkuNzg5OCAyMC4wNzA5IDI0LjYyODkgMTcuNzA2MiAyOS4xMzQ1IDE0LjMwMDRDMzMuNjI4OSAxNy42OTUxIDM4LjQ3MzYgMjAuMDcwOSA0Ni43NzgzIDIwLjA3MDlMNDYuNzcyNiAzNC45OVoiIGZpbGwtcnVsZT0ibm9uemVybyIgZmlsbD0idXJsKCNwYWludF9saW5lYXJfNjRfOTRfMCkiIGZpbGwtb3BhY2l0eT0iMC4zNDAwMDAiLz4KPC9zdmc+Cg==)}.icon-img-warn[data-v-f660504b]{background-image:url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iNTguMDAwMDAwIiBoZWlnaHQ9IjY3LjAwMDAwMCIgdmlld0JveD0iMCAwIDU4IDY3IiBmaWxsPSJub25lIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIj4KCTxkZXNjPgoJCQlDcmVhdGVkIHdpdGggUGl4c28uCgk8L2Rlc2M+Cgk8ZGVmcz4KCQk8bGluZWFyR3JhZGllbnQgaWQ9InBhaW50X2xpbmVhcl83Nl81Nl8wIiB4MT0iMjkuMDAwMDAwIiB5MT0iMC4wMDAwMDAiIHgyPSIyOS4wMDAwMDAiIHkyPSI2Ny4wMDAwMDAiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KCQkJPHN0b3Agc3RvcC1jb2xvcj0iI0YwQUQ0RSIvPgoJCQk8c3RvcCBvZmZzZXQ9IjEuMDAwMDAwIiBzdG9wLWNvbG9yPSIjRkNGMERGIi8+CgkJPC9saW5lYXJHcmFkaWVudD4KCQk8bGluZWFyR3JhZGllbnQgaWQ9InBhaW50X2xpbmVhcl83Nl81N18wIiB4MT0iMjkuMDA0NTcyIiB5MT0iNy41MDAwMDAiIHgyPSIyOS4wMDQ1NzIiIHkyPSI2MC4zOTc0MzQiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KCQkJPHN0b3Agc3RvcC1jb2xvcj0iI0ZDRjBERiIvPgoJCQk8c3RvcCBvZmZzZXQ9IjEuMDAwMDAwIiBzdG9wLWNvbG9yPSIjRjBBRDRFIi8+CgkJPC9saW5lYXJHcmFkaWVudD4KCTwvZGVmcz4KCTxwYXRoIGlkPSJwYXRoIiBkPSJNMjkuMTk3IDBDMjIuMzY3NyA1LjM3MjQ0IDEyLjU5MjcgMTAuNjM0OSAwIDEwLjYzNDlMMCAzNS44OTgxQzAgNDcuMTQ1OCAxNi42MDQ0IDY3IDI5LjIwNDMgNjdDNDEuODA0NCA2NyA1OCA0Ny4xMzgzIDU4IDM1Ljg5ODFMNTggMTAuNjM0OUM0NS4zODUzIDEwLjYzNDkgMzYuMDI2NCA1LjM3MjQ0IDI5LjE5NyAwWk01Mi4wMjk0IDM1LjY0NzVDNTIuMDI5NCA0NS4yODk0IDM5LjYyNTQgNjAuMjkyMiAyOC44MjYzIDYwLjI5MjJDMTguMDIgNjAuMjkyMiA2IDQ1LjY0MiA2IDM2TDYgMTUuNUMxNi43OTkgMTUuNSAyMy4zNDU1IDEyLjM1MjIgMjkuMjA0MyA3LjczNzU1QzM1LjA0ODYgMTIuMzM3MiA0MS4yMzA1IDE1LjQ2MTUgNTIuMDI5NCAxNS40NjE1TDUyLjAyOTQgMzUuNjQ3NVoiIGZpbGwtcnVsZT0ibm9uemVybyIgZmlsbD0idXJsKCNwYWludF9saW5lYXJfNzZfNTZfMCkiIGZpbGwtb3BhY2l0eT0iMC4zNTAwMDAiLz4KCTxwYXRoIGlkPSJwYXRoIiBkPSJNMjkuMTU1NSA3LjVDMjMuNDc2OSAxMi42NTM4IDE1LjY4NCAxNS41IDYgMTUuNUw2IDM2Ljc2OTNDNi40MjY1MSA0NC4wNzA2IDE2LjEwNTMgNjAuMzk3NSAyOC44NjQ5IDYwLjM5NzVDMzguODI5OCA2MC4zOTc1IDUyLjQ3NjggNDYuNjUzOCA1MS45OTY4IDM1LjI1OTRMNTEuOTk2OCAxNS41QzQwLjEwOTMgMTUuNSAzNC40MDc1IDExLjQ2NTEgMjkuMTU1NSA3LjVaTTQ2Ljc5MzYgMzUuMjU5M0M0Ni43OTM2IDQyLjM3NTUgMzcuMTY5NCA1My4zNTc0IDI4Ljg2NDkgNTMuMzU3NEMyMC41NTQ3IDUzLjM1NzQgMTEuNTA2MiA0Mi4zNzU1IDExLjUwNjIgMzUuMjU5M0wxMS41MDYyIDIwLjM0MDJDMTkuODEwOCAyMC4zNDAyIDI0LjY0OTkgMTcuOTc1NSAyOS4xNTU1IDE0LjU2OTdDMzMuNjQ5OSAxNy45NjQ0IDM4LjQ5NDYgMjAuMzQwMiA0Ni43OTkzIDIwLjM0MDJMNDYuNzkzNiAzNS4yNTkzWiIgZmlsbC1ydWxlPSJub256ZXJvIiBmaWxsPSJ1cmwoI3BhaW50X2xpbmVhcl83Nl81N18wKSIgZmlsbC1vcGFjaXR5PSIwLjM0MDAwMCIvPgo8L3N2Zz4K)}.icon-img-low-risk[data-v-f660504b]{background-image:url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iNTguMDAwMDAwIiBoZWlnaHQ9IjY3LjAwMDAwMCIgdmlld0JveD0iMCAwIDU4IDY3IiBmaWxsPSJub25lIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIj4KCTxkZXNjPgoJCQlDcmVhdGVkIHdpdGggUGl4c28uCgk8L2Rlc2M+Cgk8ZGVmcz4KCQk8bGluZWFyR3JhZGllbnQgaWQ9InBhaW50X2xpbmVhcl82NF8yNDNfMCIgeDE9IjI5LjAwMDAwMCIgeTE9IjAuMDAwMDAwIiB4Mj0iMjkuMDAwMDAwIiB5Mj0iNjcuMDAwMDAwIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CgkJCTxzdG9wIHN0b3AtY29sb3I9IiNFOEQ1NDQiLz4KCQkJPHN0b3Agb2Zmc2V0PSIxLjAwMDAwMCIgc3RvcC1jb2xvcj0iI0ZGRUY3OSIgc3RvcC1vcGFjaXR5PSIwLjI3MDU4OCIvPgoJCTwvbGluZWFyR3JhZGllbnQ+CgkJPGxpbmVhckdyYWRpZW50IGlkPSJwYWludF9saW5lYXJfNjRfMjQ0XzAiIHgxPSIyOS4wMDQ1NzIiIHkxPSI3LjUwMDAwMCIgeDI9IjI5LjAwNDU3MiIgeTI9IjYwLjM5NzQzNCIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPgoJCQk8c3RvcCBzdG9wLWNvbG9yPSIjRkZFRjc5IiBzdG9wLW9wYWNpdHk9IjAuMTA5ODA0Ii8+CgkJCTxzdG9wIG9mZnNldD0iMS4wMDAwMDAiIHN0b3AtY29sb3I9IiNFOEQ1NDQiLz4KCQk8L2xpbmVhckdyYWRpZW50PgoJPC9kZWZzPgoJPHBhdGggaWQ9InBhdGgiIGQ9Ik0yOS4xOTcgMEMyMi4zNjc3IDUuMzcyNDQgMTIuNTkyNyAxMC42MzQ5IDAgMTAuNjM0OUwwIDM1Ljg5ODFDMCA0Ny4xNDU4IDE2LjYwNDQgNjcgMjkuMjA0MyA2N0M0MS44MDQ0IDY3IDU4IDQ3LjEzODMgNTggMzUuODk4MUw1OCAxMC42MzQ5QzQ1LjM4NTMgMTAuNjM0OSAzNi4wMjY0IDUuMzcyNDQgMjkuMTk3IDBaTTUyLjAyOTQgMzUuNjQ3NUM1Mi4wMjk0IDQ1LjI4OTQgMzkuNjI1NCA2MC4yOTIyIDI4LjgyNjMgNjAuMjkyMkMxOC4wMiA2MC4yOTIyIDYgNDUuNjQyIDYgMzZMNiAxNS41QzE2Ljc5OSAxNS41IDIzLjM0NTUgMTIuMzUyMiAyOS4yMDQzIDcuNzM3NTVDMzUuMDQ4NiAxMi4zMzcyIDQxLjIzMDUgMTUuNDYxNSA1Mi4wMjk0IDE1LjQ2MTVMNTIuMDI5NCAzNS42NDc1WiIgZmlsbC1ydWxlPSJub256ZXJvIiBmaWxsPSJ1cmwoI3BhaW50X2xpbmVhcl82NF8yNDNfMCkiIGZpbGwtb3BhY2l0eT0iMC4zNTAwMDAiLz4KCTxwYXRoIGlkPSJwYXRoIiBkPSJNMjkuMTU1NSA3LjVDMjMuNDc2OSAxMi42NTM4IDE1LjY4NCAxNS41IDYgMTUuNUw2IDM2Ljc2OTNDNi40MjY1MSA0NC4wNzA2IDE2LjEwNTMgNjAuMzk3NSAyOC44NjQ5IDYwLjM5NzVDMzguODI5OCA2MC4zOTc1IDUyLjQ3NjggNDYuNjUzOCA1MS45OTY4IDM1LjI1OTRMNTEuOTk2OCAxNS41QzQwLjEwOTMgMTUuNSAzNC40MDc1IDExLjQ2NTEgMjkuMTU1NSA3LjVaTTQ2Ljc5MzYgMzUuMjU5M0M0Ni43OTM2IDQyLjM3NTUgMzcuMTY5NCA1My4zNTc0IDI4Ljg2NDkgNTMuMzU3NEMyMC41NTQ3IDUzLjM1NzQgMTEuNTA2MiA0Mi4zNzU1IDExLjUwNjIgMzUuMjU5M0wxMS41MDYyIDIwLjM0MDJDMTkuODEwOCAyMC4zNDAyIDI0LjY0OTkgMTcuOTc1NSAyOS4xNTU1IDE0LjU2OTdDMzMuNjQ5OSAxNy45NjQ0IDM4LjQ5NDYgMjAuMzQwMiA0Ni43OTkzIDIwLjM0MDJMNDYuNzkzNiAzNS4yNTkzWiIgZmlsbC1ydWxlPSJub256ZXJvIiBmaWxsPSJ1cmwoI3BhaW50X2xpbmVhcl82NF8yNDRfMCkiIGZpbGwtb3BhY2l0eT0iMC4zNDAwMDAiLz4KPC9zdmc+Cg==)}.scan-icon-img-bg[data-v-f660504b]{position:absolute;left:0;right:0;top:0;bottom:0;z-index:50;margin:auto;display:inline-block;width:100px;height:100px;border-radius:100%;background:radial-gradient(50% 50% at 50% 50%,rgba(255,255,255,.2) 54.962%,rgba(122,227,142,.2))}.animate-box[data-v-f660504b]{position:relative;width:100px;height:100px;animation:rotate-f660504b 3s linear infinite}.animate-box-left[data-v-f660504b]{z-index:55;width:50px;height:100px;border-radius:50px 0 0 50px}.animate-box-right[data-v-f660504b]{position:absolute;left:50%;z-index:55;height:100px;--un-bg-opacity:1;background-color:rgb(255 255 255 / var(--un-bg-opacity));border-radius:0 50px 50px 0}.animate-box-bottom[data-v-f660504b]{position:absolute;top:.4rem;left:.4rem;z-index:2;width:92px;height:92px;border-radius:50%;background:radial-gradient(50% 50% at 50% 50%,rgba(255,255,255,.2) 54.962%,rgba(122,227,142,.2))}.circle-inner[data-v-f660504b]{background:var(--color-bg-2);position:absolute;left:0;top:0;bottom:0;right:0;z-index:55;margin:auto;display:inline-block;width:96px;height:96px;border-radius:100%}.circle-outer[data-v-f660504b]{position:absolute;left:0;top:0;bottom:0;right:0;z-index:55;margin:auto;width:100px;height:100px;border-radius:100%}.linear-safe[data-v-f660504b]{background:linear-gradient(#20a53a,#fff)}.linear-danger[data-v-f660504b]{background:linear-gradient(#ef0808,#fff)}.linear-warn[data-v-f660504b]{background:linear-gradient(#f0ad4e,#fff)}.linear-risk[data-v-f660504b]{background:linear-gradient(#e8d544,#fff)}.safe[data-v-f660504b]{background:radial-gradient(50% 50% at 50% 50%,rgba(255,255,255,.2) 54.962%,rgba(122,227,142,.2))}.danger[data-v-f660504b]{background:radial-gradient(50% 50% at 50% 50%,rgba(255,255,255,.2) 54.962%,rgba(255,0,0,.2))}.risk[data-v-f660504b]{background:radial-gradient(50% 50% at 50% 50%,rgba(240,173,78,0) 58.015%,rgba(232,213,68,.2))}.warn[data-v-f660504b]{background:radial-gradient(50% 50% at 50% 50%,rgba(240,173,78,0) 58.015%,rgba(240,173,78,.2))}.box-text[data-v-f660504b]{position:absolute;left:0;right:0;top:0;bottom:0;z-index:99;margin:auto;width:78px;height:50px;display:flex;align-items:center;justify-content:center;font-size:3.2rem;font-weight:700;line-height:4.5rem}.box-text span[data-v-f660504b]{margin-top:16px;font-size:1.8rem}.risk-spin[data-v-a3822d9f]{background:var(--home-risk-security-list-spin-bg)}.module-list[data-v-a3822d9f]::-webkit-scrollbar{width:10px;height:5px}.module-list[data-v-a3822d9f]::-webkit-scrollbar-thumb{box-shadow:inset 0 0 .5rem rgba(0,0,0,.2);background-color:#999}.module-item[data-v-a3822d9f]{font-size:1.25rem}.module-head[data-v-a3822d9f]{border-bottom:1px solid #ececec;color:#555;transition:background .3s}.module-head[data-v-a3822d9f]:nth-child(1){border-top:1px solid #ececec}.module-head[data-v-a3822d9f]:hover{background-color:var(--home-risk-security-list-hover-bg)}.module-body[data-v-a3822d9f]{border-bottom-width:1px;--un-border-opacity:1;border-color:rgb(236 236 236 / var(--un-border-opacity));padding:1rem 1.5rem 1rem 2.5rem;color:var(--color-text-2)}.collapse-item[data-v-a3822d9f]{color:var(--home-risk-security-list-collapse-item-color);background:var(--color-bg-2);width:48rem;border-radius:2px;font-size:1.2rem;margin-left:1rem;border-width:1px;--un-border-opacity:1;border-color:rgb(235 238 245 / var(--un-border-opacity));padding:.6rem 1.6rem;display:flex;align-items:center;line-height:1.8rem}.n-progress.n-progress--circle[data-v-0a5f55f9],.n-progress.n-progress--dashboard[data-v-0a5f55f9]{width:100px!important}.progress-header[data-v-0a5f55f9]{display:flex;align-items:center;height:140px;padding:20px;text-align:center}.progresscircle[data-v-0a5f55f9]{position:absolute;top:8px;left:25px}.progresscircle p[data-v-0a5f55f9]{padding:5px 0;font-size:13px;font-weight:700}.progresscirclebar[data-v-0a5f55f9]{position:relative;width:100px;height:100px;line-height:100px;font-size:18px}.progresscirclebar span[data-v-0a5f55f9]:nth-child(1){font-size:24px}.progresscirclebar.active svg[data-v-0a5f55f9]{-webkit-animation:load8 1.1s infinite linear;animation:load8 1.1s infinite linear}.progress-header-cot[data-v-0a5f55f9]:nth-child(1),.progress-header-cot[data-v-0a5f55f9]:nth-child(3){min-width:100px;position:relative}.progress-header-cot[data-v-0a5f55f9]:nth-child(3){display:flex}.progress-header-cot[data-v-0a5f55f9]:nth-child(2){width:100%;padding:0 40px}.progress-header-cot button.cancel_detect[data-v-0a5f55f9]{border-color:#999;color:#666;background-color:#fff;font-size:15px}.progress-header-cot button.cancel_detect[data-v-0a5f55f9]:hover{color:#fc6d26;background:rgba(252,109,38,.1);border-color:rgba(252,109,38,.2)}.scanning-progress-title[data-v-0a5f55f9]{text-align:left;font-weight:700;margin:15px 0;font-size:20px}.scanning-progress-title img[data-v-0a5f55f9]{margin-right:10px;vertical-align:sub;width:24px}.scanning-progress-title span[data-v-0a5f55f9]{color:#fc6d26}.scanning-progress-cont[data-v-0a5f55f9]{text-align:left;margin:15px 0;font-size:14px}.progress_item[data-v-9466c95d]{margin:0 20px 6px;padding:0 20px;background-color:var(--home-risk-server-list-bg);border-radius:4px;border:1px solid transparent}.progress_item_header[data-v-9466c95d]{height:30px;line-height:30px;display:flex;justify-content:space-between;border-radius:4px;cursor:pointer;font-size:12px;color:var(--home-risk-server-list-text)}.progress_item_header .progress_type[data-v-9466c95d]{display:flex;align-items:center;width:59.5%;font-weight:700;line-height:22px}.progress_item_header .progress_type .title-icon[data-v-9466c95d]{width:14px;margin-right:6px}.progress_item_header .progress_status[data-v-9466c95d]{flex:1}.progress-cont-list[data-v-9466c95d]{overflow:auto;max-height:390px}.progress_item_body[data-v-9466c95d]{line-height:30px;display:none;font-size:12px}.progress_item.active .progress_item_body[data-v-9466c95d]{display:block}.progress_item_info[data-v-9466c95d]{margin-bottom:6px}.progress_item_info .info_cont[data-v-9466c95d]{display:flex;color:#666;padding:0 30px}.progress_item_info .info_cont div[data-v-9466c95d]:nth-child(1){width:60%}.progress_item_info .info_cont div[data-v-9466c95d]:nth-child(2){width:40%}.progress_item_info .info_cont div:nth-child(2) span[data-v-9466c95d]{font-weight:600}.progress_item_info.active[data-v-9466c95d]{background-color:rgba(252,109,38,.1);padding:0}.progress_item_info.active .info_cont[data-v-9466c95d]{margin:0 20px;padding:0 10px;border-bottom:1px dashed #d9d9d9}.progress_item_info.active .info_cont_desc[data-v-9466c95d]{color:#888;border-radius:4px;padding:0 30px}.progress_item_info.active[data-v-9466c95d]:hover{background-color:rgba(252,109,38,.2)}.progress_item_info[data-v-9466c95d]:hover{background-color:var(--home-risk-server-list-hover)}.btn_red[data-v-9466c95d]{font-weight:700;margin-left:5px;padding:1px 5px;text-align:center;border-radius:3px;color:#fff;background:red}[data-v-9466c95d] .n-progress__text{font-size:16px!important;font-weight:700}.scrollable[data-v-9466c95d]::-webkit-scrollbar{width:10px}.scrollable[data-v-9466c95d]::-webkit-scrollbar-track{background:#efefef}.scrollable[data-v-9466c95d]::-webkit-scrollbar-thumb{background:#bfbfbf;border-radius:10px}.scrollable[data-v-9466c95d]::-webkit-scrollbar-thumb:hover{background:#555}.overview-wrapper[data-v-94e97d0e]{display:grid;align-items:center;justify-content:center;gap:16px;padding:20px;vertical-align:middle;grid-template-columns:repeat(6,minmax(0,1fr))}.overview-wrapper .ghost[data-v-94e97d0e]{border:2px dashed #20a53a}.overview-box[data-v-94e97d0e]{position:relative;width:100%;height:120px;max-width:260px;display:flex;flex-direction:column;cursor:pointer;border-radius:2px;padding-top:22px;transition-property:all;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s;transition-duration:.1s;border:1px solid #efefef}.overview-box[data-v-94e97d0e]:hover{box-shadow:0 0 8px rgba(153,153,153,.42)}.overview-box:hover .move[data-v-94e97d0e]{display:block}.overview-box:hover .bottom-menu[data-v-94e97d0e]{display:block;opacity:1}.overview-box .move[data-v-94e97d0e]{position:absolute;top:12px;right:12px;display:none;cursor:move;font-size:16px}.overview-box .content[data-v-94e97d0e]{display:flex;flex-direction:column;align-items:center;justify-content:space-between;padding-left:24px;padding-right:24px}.overview-box .content .overview-title[data-v-94e97d0e]{width:100%;height:40px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;padding-bottom:10px;font-size:15px;--un-text-opacity:1;color:rgb(153 153 153 / var(--un-text-opacity));line-height:30px}.overview-box .content .href[data-v-94e97d0e]{width:100%;height:24px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;font-size:20px}.overview-box .bottom-menu[data-v-94e97d0e]{position:absolute;bottom:0;margin-top:4px;display:none;width:100%;--un-bg-opacity:1;background-color:rgb(241 249 243 / var(--un-bg-opacity));text-align:center;color:var(--color-primary);line-height:26px;opacity:0;transition-property:all;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s;transition-duration:.1s}.software-wrapper[data-v-f5b29127]{display:grid;align-items:center;justify-content:center;vertical-align:middle;grid-template-columns:repeat(4,1fr)}.software-box[data-v-f5b29127]{position:relative;height:144px;border-top:1px solid #ececfb;border-right:1px solid #ececfb}.software-box[data-v-f5b29127]:nth-child(-n+4){border-top:none}.software-box[data-v-f5b29127]:nth-child(4n){border-right:none}.software-box .content[data-v-f5b29127]{position:relative;width:100%;height:100%;cursor:pointer;transition:all .25s ease}.software-box .content[data-v-f5b29127]:hover{box-shadow:0 0 38px rgba(0,0,0,.08) inset}.software-box .content:hover .move[data-v-f5b29127]{display:block}.software-box .content .move[data-v-f5b29127]{position:absolute;top:16px;right:16px;display:none;cursor:move;font-size:16px}.software-box .content .recommend[data-v-f5b29127]{position:absolute;top:-1.5px;left:-4px;height:18px;display:flex;align-items:center;--un-bg-opacity:1;background-color:rgb(239 239 239 / var(--un-bg-opacity));padding-left:8px;padding-right:8px;opacity:.5;transform:scale(.8)}.software-box .content .software-img[data-v-f5b29127]{display:flex;align-items:center;justify-content:center;padding-top:12px}.software-box .content .software-img img[data-v-f5b29127]{width:48px;height:auto}.software-box .content .software-name[data-v-f5b29127]{min-height:24px;display:flex;align-items:center;justify-content:center;padding-left:4px;padding-right:4px}.software-box .content .software-name .text[data-v-f5b29127]{text-align:center;color:var(--color-text-desc);line-height:16px}.software-box .content .software-btn[data-v-f5b29127]{margin-top:5px;display:flex;justify-content:center}.software-box .content .software-btn .n-button[data-v-f5b29127]{--n-height: 24px;--n-padding: 0 6px}.software-box .content .software-btn .n-button+.n-button[data-v-f5b29127]{margin-left:8px}.software-box .content .software-btn .preview[data-v-f5b29127]{--n-text-color: #666}.software-box .content .software-btn .install[data-v-f5b29127],.software-box .content .software-btn .buy[data-v-f5b29127]{--n-border: 1px solid #20a53a;--n-text-color: #20a53a;--n-color-hover: #20a53a;--n-border-hover: 1px solid #20a53a;--n-text-color-hover: #fff}.home-reset-tab[data-v-35812b26]{--n-tab-gap: 0;--n-tab-padding: 0 20px;--n-tab-font-size: 16px;--n-tab-text-color: #666;--n-pane-padding-top: 0}.home-reset-tab[data-v-35812b26] .n-tabs-nav{border-bottom:.5px solid #ebeef5}.home-reset-tab[data-v-35812b26] .n-tabs-nav .n-tabs-tab{width:100px;height:47px;justify-content:center}.home-reset-tab[data-v-35812b26] .n-tabs-nav .n-tabs-tab--active{background:rgba(32,165,58,.03)} diff --git a/BTPanel/static/vite/css/index96.css b/BTPanel/static/vite/css/index96.css index f50d5022..8724f2e8 100644 --- a/BTPanel/static/vite/css/index96.css +++ b/BTPanel/static/vite/css/index96.css @@ -1 +1 @@ -.item-list[data-v-8f541c35]{align-items:center;padding:16px;border-bottom:1px solid var(--color-border)} +.soft-list li{display:flex;align-items:center}.soft-list li+li[data-v-30465cc8]{margin-top:12px}.recommend-item[data-v-fc7446b1]{flex:1 1 0%}.recommend-item+.recommend-item[data-v-fc7446b1]{margin-left:24px}.recommend-item .recommend-title[data-v-fc7446b1]{margin-bottom:10px;padding-left:5px;font-size:20px}.recommend-item .content[data-v-fc7446b1]{border-radius:4px;padding:20px 16px;transition-property:all;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s;transition-duration:.2s;border:1px solid var(--color-border)}.recommend-item .content .border-view[data-v-fc7446b1]{border-width:1px;border-color:var(--color-border);border-radius:4px;border-style:solid;padding:12px}.recommend-item .active[data-v-fc7446b1]{background-color:var(--home-soft-install-bg-color);border:1px solid var(--home-soft-install-border-color)}.recommend-list[data-v-aa0864d2]{display:flex} diff --git a/BTPanel/static/vite/css/index97.css b/BTPanel/static/vite/css/index97.css index 9f406487..b922e4a1 100644 --- a/BTPanel/static/vite/css/index97.css +++ b/BTPanel/static/vite/css/index97.css @@ -1 +1 @@ -.n-alert[data-v-ec749ad6]{--n-color: #dff0d8;--n-border: 1px solid #d6e9c6;--n-font-size: 12px}.cert-info[data-v-ec749ad6]{color:#3c763d}.cert-info+.cert-info[data-v-ec749ad6]{margin-top:2px}.cert-info .cert-label[data-v-ec749ad6]{font-weight:700}.cert-info .cert-value[data-v-ec749ad6]{flex:1;width:0} +.home-security-file .lastScan-time[data-v-76b5d51c],.home-security-file .info-title[data-v-76b5d51c]{color:var(--home-risk-file-info-title-color)}.infoList[data-v-76b5d51c]{margin-bottom:1.6rem;display:flex;border-radius:.4rem;padding:1.6rem;border:1px solid #efefef}.item-list[data-v-76b5d51c]{border-right:1px solid #efefef}.item-list[data-v-76b5d51c]:last-child{border-right:none}.loading-icon[data-v-1a12c317]{position:absolute;width:80px;height:80px;animation:spin 1s linear infinite;--un-bg-opacity:0;background-color:rgb(204 204 204 / var(--un-bg-opacity));border-radius:50%;border:2px solid #20a53a;clip-path:inset(0 20%)}@keyframes spin{0%{transform:rotate(0)}to{transform:rotate(360deg)}}[data-v-f7ca8e26] .n-collapse .n-collapse-item .n-collapse-item__header .n-collapse-item__header-main{justify-content:space-between!important}.scrollable[data-v-f7ca8e26]::-webkit-scrollbar{width:10px}.scrollable[data-v-f7ca8e26]::-webkit-scrollbar-track{background:#efefef}.scrollable[data-v-f7ca8e26]::-webkit-scrollbar-thumb{background:#bfbfbf;border-radius:10px}.scrollable[data-v-f7ca8e26]::-webkit-scrollbar-thumb:hover{background:#555}.risk-chart[data-v-efa973b1]{padding:2px}.risk-chart .circle-box[data-v-efa973b1]{position:relative;display:flex;width:110px;height:110px;justify-content:center;align-items:center}.risk-chart .circle-box[data-v-efa973b1]:before,.risk-chart .circle-box[data-v-efa973b1]:after,.risk-chart .circle-box .circle-box-bg[data-v-efa973b1]{position:absolute;top:0;left:0;display:block;width:100%;height:100%;content:""}.risk-chart .circle-box[data-v-efa973b1]:before{border-radius:56% 56% 52% 54%;opacity:.8;animation:wave-efa973b1 12s infinite linear}.risk-chart .circle-box[data-v-efa973b1]:after{border-radius:44% 44% 42% 46%;opacity:.6;animation:wave-efa973b1 10s infinite linear}.risk-chart .circle-box .circle-box-bg[data-v-efa973b1]{border-radius:46% 46% 42% 44%;opacity:.4;animation:wave-efa973b1 8s infinite linear}.risk-chart .circle-box .circle-box-inner[data-v-efa973b1]{z-index:1;display:flex;width:101px;height:101px;border-radius:70% 60% 60%;flex-direction:column;justify-content:center;align-items:center;background:var(--home-risk-overview-circle-bg)}.risk-chart .circle-box .circle-box-value[data-v-efa973b1]{display:inline-flex;font-size:32px;line-height:1;align-items:flex-end}.risk-chart .circle-box .circle-box-value .unit[data-v-efa973b1]{margin-left:4px;font-size:12px;color:#999;transform:translateY(-6px)}.risk-chart .circle-box .circle-box-desc[data-v-efa973b1]{margin-top:4px}.circle-danger .risk-chart .circle-box[data-v-efa973b1]:before,.circle-danger .risk-chart .circle-box[data-v-efa973b1]:after,.circle-danger .risk-chart .circle-box .circle-box-bg[data-v-efa973b1]{background-color:#ef0808}.circle-danger .risk-chart .circle-box .circle-box-inner[data-v-efa973b1]{color:#e01616}.circle-warn .risk-chart .circle-box[data-v-efa973b1]:before,.circle-warn .risk-chart .circle-box[data-v-efa973b1]:after,.circle-warn .risk-chart .circle-box .circle-box-bg[data-v-efa973b1]{background-color:#f0ad4e}.circle-warn .risk-chart .circle-box .circle-box-inner[data-v-efa973b1]{color:#f0ad4e}.circle-alert .risk-chart .circle-box[data-v-efa973b1]:before,.circle-alert .risk-chart .circle-box[data-v-efa973b1]:after,.circle-alert .risk-chart .circle-box .circle-box-bg[data-v-efa973b1]{background-color:#e8d544}.circle-alert .risk-chart .circle-box .circle-box-inner[data-v-efa973b1]{color:#e8d544}.circle-safe .risk-chart .circle-box[data-v-efa973b1]:before,.circle-safe .risk-chart .circle-box[data-v-efa973b1]:after,.circle-safe .risk-chart .circle-box .circle-box-bg[data-v-efa973b1]{background-color:#20a53a}.circle-safe .risk-chart .circle-box .circle-box-inner[data-v-efa973b1]{color:#20a53a}@keyframes wave-efa973b1{0%{transform:rotate(0)}50%{transform:rotate(180deg)}to{transform:rotate(360deg)}}@keyframes rotate-2e83464a{0%{transform:rotate(0)}to{transform:rotate(360deg)}}.absolute-center[data-v-2e83464a]{position:absolute;top:0;left:0;bottom:0;right:0;margin:auto}.scan-icon-img[data-v-2e83464a]{position:absolute;left:0;right:0;top:0;bottom:0;z-index:99;margin:auto;width:58px;height:67px;background-position:100%}.icon-img-safe[data-v-2e83464a]{background-image:url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iNTguMDAwMDAwIiBoZWlnaHQ9IjY3LjAwMDAwMCIgdmlld0JveD0iMCAwIDU4IDY3IiBmaWxsPSJub25lIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIj4KCTxkZXNjPgoJCQlDcmVhdGVkIHdpdGggUGl4c28uCgk8L2Rlc2M+Cgk8ZGVmcz4KCQk8bGluZWFyR3JhZGllbnQgaWQ9InBhaW50X2xpbmVhcl8zN182NDhfMCIgeDE9IjI5LjAwMDAwMCIgeTE9IjAuMDAwMDAwIiB4Mj0iMjkuMDAwMDAwIiB5Mj0iNjcuMDAwMDAwIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CgkJCTxzdG9wIHN0b3AtY29sb3I9IiNCMkVFQkQiLz4KCQkJPHN0b3Agb2Zmc2V0PSIwLjk5MDU5MCIgc3RvcC1jb2xvcj0iIzYyREI3QSIgc3RvcC1vcGFjaXR5PSIwLjE3NjQ3MSIvPgoJCTwvbGluZWFyR3JhZGllbnQ+CgkJPGxpbmVhckdyYWRpZW50IGlkPSJwYWludF9saW5lYXJfMzdfNjQ5XzAiIHgxPSIyOS4wMDQxOTgiIHkxPSI3LjczMDcxMyIgeDI9IjI5LjAwNDE5OCIgeTI9IjYwLjEyODE0NyIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPgoJCQk8c3RvcCBzdG9wLWNvbG9yPSIjOThFM0E3IiBzdG9wLW9wYWNpdHk9IjAuMjIzNTI5Ii8+CgkJCTxzdG9wIG9mZnNldD0iMS4wMDAwMDAiIHN0b3AtY29sb3I9IiM4N0UxOTgiIHN0b3Atb3BhY2l0eT0iMC45MTc2NDciLz4KCQk8L2xpbmVhckdyYWRpZW50PgoJPC9kZWZzPgoJPHBhdGggaWQ9InBhdGgiIGQ9Ik0yOS4xOTcgMEMyMi4zNjc3IDUuMzcyNDQgMTIuNTkyNyAxMC42MzQ5IDAgMTAuNjM0OUwwIDM1Ljg5ODFDMCA0Ny4xNDU4IDE2LjYwNDQgNjcgMjkuMjA0MyA2N0M0MS44MDQ0IDY3IDU4IDQ3LjEzODMgNTggMzUuODk4MUw1OCAxMC42MzQ5QzQ1LjM4NTMgMTAuNjM0OSAzNi4wMjY0IDUuMzcyNDQgMjkuMTk3IDBaTTUyLjAyOTQgMzUuNjQ3NUM1Mi4wMjk0IDQ1LjI4OTQgMzkuNjI1NCA2MC4yOTIyIDI4LjgyNjMgNjAuMjkyMkMxOC4wMiA2MC4yOTIyIDYuMjUzNzggNDUuNDEyNSA2LjI1Mzc4IDM1Ljc3MDVMNi4yNTM3OCAxNS41NTYyQzE3LjA1MjcgMTUuNTU2MiAyMy4zNDU1IDEyLjM1MjIgMjkuMjA0MyA3LjczNzU1QzM1LjA0ODYgMTIuMzM3MiA0MS4yMzA1IDE1LjQ2MTUgNTIuMDI5NCAxNS40NjE1TDUyLjAyOTQgMzUuNjQ3NVoiIGZpbGwtcnVsZT0ibm9uemVybyIgZmlsbD0idXJsKCNwYWludF9saW5lYXJfMzdfNjQ4XzApIiBmaWxsLW9wYWNpdHk9IjAuMzUwMDAwIi8+Cgk8cGF0aCBpZD0icGF0aCIgZD0iTTI5LjEzNDUgNy43MzA3MUMyMy40NTU5IDEyLjg4NDUgMTUuNjYzIDE1LjQ2MTQgNS45NzkgMTUuNDYxNEw2LjM5NzA5IDM2LjUwNjNDNi44MjM0OSA0My44MDc2IDE2LjA4NDQgNjAuMTI4MiAyOC44NDM5IDYwLjEyODJDMzguODA4OCA2MC4xMjgyIDUyLjQ1NTggNDYuMzg0NSA1MS45NzU4IDM0Ljk5MDFMNTIuMDI5NCAxNS40NjE0QzQwLjE0MTggMTUuNDYxNCAzNC4zODY1IDExLjY5NTggMjkuMTM0NSA3LjczMDcxWk00Ni43NzI2IDM0Ljk5QzQ2Ljc3MjYgNDIuMTA2MiAzNy4xNDg0IDUzLjA4ODEgMjguODQzOSA1My4wODgxQzIwLjUzMzcgNTMuMDg4MSAxMS40ODUyIDQyLjEwNjIgMTEuNDg1MiAzNC45OUwxMS40ODUyIDIwLjA3MDlDMTkuNzg5OCAyMC4wNzA5IDI0LjYyODkgMTcuNzA2MiAyOS4xMzQ1IDE0LjMwMDRDMzMuNjI4OSAxNy42OTUxIDM4LjQ3MzYgMjAuMDcwOSA0Ni43NzgzIDIwLjA3MDlMNDYuNzcyNiAzNC45OVoiIGZpbGwtcnVsZT0ibm9uemVybyIgZmlsbD0idXJsKCNwYWludF9saW5lYXJfMzdfNjQ5XzApIiBmaWxsLW9wYWNpdHk9IjAuNDAwMDAwIi8+Cjwvc3ZnPgo=)}.icon-img-danger[data-v-2e83464a]{background-image:url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iNTguMDAwMDAwIiBoZWlnaHQ9IjY3LjAwMDAwMCIgdmlld0JveD0iMCAwIDU4IDY3IiBmaWxsPSJub25lIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIj4KCTxkZXNjPgoJCQlDcmVhdGVkIHdpdGggUGl4c28uCgk8L2Rlc2M+Cgk8ZGVmcz4KCQk8bGluZWFyR3JhZGllbnQgaWQ9InBhaW50X2xpbmVhcl82NF85M18wIiB4MT0iMjkuMDAwMDAwIiB5MT0iMC4wMDAwMDAiIHgyPSIyOS4wMDAwMDAiIHkyPSI2Ny4wMDAwMDAiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KCQkJPHN0b3Agc3RvcC1jb2xvcj0iI0ZGQjNCMyIgc3RvcC1vcGFjaXR5PSIwLjkxNzY0NyIvPgoJCQk8c3RvcCBvZmZzZXQ9IjEuMDAwMDAwIiBzdG9wLWNvbG9yPSIjRjc5Njk2IiBzdG9wLW9wYWNpdHk9IjAuMjMxMzczIi8+CgkJPC9saW5lYXJHcmFkaWVudD4KCQk8bGluZWFyR3JhZGllbnQgaWQ9InBhaW50X2xpbmVhcl82NF85NF8wIiB4MT0iMjkuMDA0MTk4IiB5MT0iNy43MzA3MTMiIHgyPSIyOS4wMDQxOTgiIHkyPSI2MC4xMjgxNDciIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KCQkJPHN0b3Agc3RvcC1jb2xvcj0iI0UzOTg5OCIgc3RvcC1vcGFjaXR5PSIwLjIyMzUyOSIvPgoJCQk8c3RvcCBvZmZzZXQ9IjEuMDAwMDAwIiBzdG9wLWNvbG9yPSIjRkZCM0IzIiBzdG9wLW9wYWNpdHk9IjAuOTE3NjQ3Ii8+CgkJPC9saW5lYXJHcmFkaWVudD4KCTwvZGVmcz4KCTxwYXRoIGlkPSJwYXRoIiBkPSJNMjkuMTk3IDBDMjIuMzY3NyA1LjM3MjQ0IDEyLjU5MjcgMTAuNjM0OSAwIDEwLjYzNDlMMCAzNS44OTgxQzAgNDcuMTQ1OCAxNi42MDQ0IDY3IDI5LjIwNDMgNjdDNDEuODA0NCA2NyA1OCA0Ny4xMzgzIDU4IDM1Ljg5ODFMNTggMTAuNjM0OUM0NS4zODUzIDEwLjYzNDkgMzYuMDI2NCA1LjM3MjQ0IDI5LjE5NyAwWk01Mi4wMjk0IDM1LjY0NzVDNTIuMDI5NCA0NS4yODk0IDM5LjYyNTQgNjAuMjkyMiAyOC44MjYzIDYwLjI5MjJDMTguMDIgNjAuMjkyMiA2IDQ1LjY0MiA2IDM2TDYgMTUuNUMxNi43OTkgMTUuNSAyMy4zNDU1IDEyLjM1MjIgMjkuMjA0MyA3LjczNzU1QzM1LjA0ODYgMTIuMzM3MiA0MS4yMzA1IDE1LjQ2MTUgNTIuMDI5NCAxNS40NjE1TDUyLjAyOTQgMzUuNjQ3NVoiIGZpbGwtcnVsZT0ibm9uemVybyIgZmlsbD0idXJsKCNwYWludF9saW5lYXJfNjRfOTNfMCkiIGZpbGwtb3BhY2l0eT0iMC4zNTAwMDAiLz4KCTxwYXRoIGlkPSJwYXRoIiBkPSJNMjkuMTM0NSA3LjczMDcxQzIzLjQ1NTkgMTIuODg0NSAxNS42NjMgMTUuNDYxNCA1Ljk3OSAxNS40NjE0TDUuOTc5IDM2LjVDNi40MDU1MiA0My44MDEzIDE2LjA4NDQgNjAuMTI4MiAyOC44NDM5IDYwLjEyODJDMzguODA4OCA2MC4xMjgyIDUyLjQ1NTggNDYuMzg0NSA1MS45NzU4IDM0Ljk5MDFMNTIuMDI5NCAxNS40NjE0QzQwLjE0MTggMTUuNDYxNCAzNC4zODY1IDExLjY5NTggMjkuMTM0NSA3LjczMDcxWk00Ni43NzI2IDM0Ljk5QzQ2Ljc3MjYgNDIuMTA2MiAzNy4xNDg0IDUzLjA4ODEgMjguODQzOSA1My4wODgxQzIwLjUzMzcgNTMuMDg4MSAxMS40ODUyIDQyLjEwNjIgMTEuNDg1MiAzNC45OUwxMS40ODUyIDIwLjA3MDlDMTkuNzg5OCAyMC4wNzA5IDI0LjYyODkgMTcuNzA2MiAyOS4xMzQ1IDE0LjMwMDRDMzMuNjI4OSAxNy42OTUxIDM4LjQ3MzYgMjAuMDcwOSA0Ni43NzgzIDIwLjA3MDlMNDYuNzcyNiAzNC45OVoiIGZpbGwtcnVsZT0ibm9uemVybyIgZmlsbD0idXJsKCNwYWludF9saW5lYXJfNjRfOTRfMCkiIGZpbGwtb3BhY2l0eT0iMC4zNDAwMDAiLz4KPC9zdmc+Cg==)}.icon-img-warn[data-v-2e83464a]{background-image:url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iNTguMDAwMDAwIiBoZWlnaHQ9IjY3LjAwMDAwMCIgdmlld0JveD0iMCAwIDU4IDY3IiBmaWxsPSJub25lIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIj4KCTxkZXNjPgoJCQlDcmVhdGVkIHdpdGggUGl4c28uCgk8L2Rlc2M+Cgk8ZGVmcz4KCQk8bGluZWFyR3JhZGllbnQgaWQ9InBhaW50X2xpbmVhcl83Nl81Nl8wIiB4MT0iMjkuMDAwMDAwIiB5MT0iMC4wMDAwMDAiIHgyPSIyOS4wMDAwMDAiIHkyPSI2Ny4wMDAwMDAiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KCQkJPHN0b3Agc3RvcC1jb2xvcj0iI0YwQUQ0RSIvPgoJCQk8c3RvcCBvZmZzZXQ9IjEuMDAwMDAwIiBzdG9wLWNvbG9yPSIjRkNGMERGIi8+CgkJPC9saW5lYXJHcmFkaWVudD4KCQk8bGluZWFyR3JhZGllbnQgaWQ9InBhaW50X2xpbmVhcl83Nl81N18wIiB4MT0iMjkuMDA0NTcyIiB5MT0iNy41MDAwMDAiIHgyPSIyOS4wMDQ1NzIiIHkyPSI2MC4zOTc0MzQiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KCQkJPHN0b3Agc3RvcC1jb2xvcj0iI0ZDRjBERiIvPgoJCQk8c3RvcCBvZmZzZXQ9IjEuMDAwMDAwIiBzdG9wLWNvbG9yPSIjRjBBRDRFIi8+CgkJPC9saW5lYXJHcmFkaWVudD4KCTwvZGVmcz4KCTxwYXRoIGlkPSJwYXRoIiBkPSJNMjkuMTk3IDBDMjIuMzY3NyA1LjM3MjQ0IDEyLjU5MjcgMTAuNjM0OSAwIDEwLjYzNDlMMCAzNS44OTgxQzAgNDcuMTQ1OCAxNi42MDQ0IDY3IDI5LjIwNDMgNjdDNDEuODA0NCA2NyA1OCA0Ny4xMzgzIDU4IDM1Ljg5ODFMNTggMTAuNjM0OUM0NS4zODUzIDEwLjYzNDkgMzYuMDI2NCA1LjM3MjQ0IDI5LjE5NyAwWk01Mi4wMjk0IDM1LjY0NzVDNTIuMDI5NCA0NS4yODk0IDM5LjYyNTQgNjAuMjkyMiAyOC44MjYzIDYwLjI5MjJDMTguMDIgNjAuMjkyMiA2IDQ1LjY0MiA2IDM2TDYgMTUuNUMxNi43OTkgMTUuNSAyMy4zNDU1IDEyLjM1MjIgMjkuMjA0MyA3LjczNzU1QzM1LjA0ODYgMTIuMzM3MiA0MS4yMzA1IDE1LjQ2MTUgNTIuMDI5NCAxNS40NjE1TDUyLjAyOTQgMzUuNjQ3NVoiIGZpbGwtcnVsZT0ibm9uemVybyIgZmlsbD0idXJsKCNwYWludF9saW5lYXJfNzZfNTZfMCkiIGZpbGwtb3BhY2l0eT0iMC4zNTAwMDAiLz4KCTxwYXRoIGlkPSJwYXRoIiBkPSJNMjkuMTU1NSA3LjVDMjMuNDc2OSAxMi42NTM4IDE1LjY4NCAxNS41IDYgMTUuNUw2IDM2Ljc2OTNDNi40MjY1MSA0NC4wNzA2IDE2LjEwNTMgNjAuMzk3NSAyOC44NjQ5IDYwLjM5NzVDMzguODI5OCA2MC4zOTc1IDUyLjQ3NjggNDYuNjUzOCA1MS45OTY4IDM1LjI1OTRMNTEuOTk2OCAxNS41QzQwLjEwOTMgMTUuNSAzNC40MDc1IDExLjQ2NTEgMjkuMTU1NSA3LjVaTTQ2Ljc5MzYgMzUuMjU5M0M0Ni43OTM2IDQyLjM3NTUgMzcuMTY5NCA1My4zNTc0IDI4Ljg2NDkgNTMuMzU3NEMyMC41NTQ3IDUzLjM1NzQgMTEuNTA2MiA0Mi4zNzU1IDExLjUwNjIgMzUuMjU5M0wxMS41MDYyIDIwLjM0MDJDMTkuODEwOCAyMC4zNDAyIDI0LjY0OTkgMTcuOTc1NSAyOS4xNTU1IDE0LjU2OTdDMzMuNjQ5OSAxNy45NjQ0IDM4LjQ5NDYgMjAuMzQwMiA0Ni43OTkzIDIwLjM0MDJMNDYuNzkzNiAzNS4yNTkzWiIgZmlsbC1ydWxlPSJub256ZXJvIiBmaWxsPSJ1cmwoI3BhaW50X2xpbmVhcl83Nl81N18wKSIgZmlsbC1vcGFjaXR5PSIwLjM0MDAwMCIvPgo8L3N2Zz4K)}.icon-img-low-risk[data-v-2e83464a]{background-image:url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iNTguMDAwMDAwIiBoZWlnaHQ9IjY3LjAwMDAwMCIgdmlld0JveD0iMCAwIDU4IDY3IiBmaWxsPSJub25lIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIj4KCTxkZXNjPgoJCQlDcmVhdGVkIHdpdGggUGl4c28uCgk8L2Rlc2M+Cgk8ZGVmcz4KCQk8bGluZWFyR3JhZGllbnQgaWQ9InBhaW50X2xpbmVhcl82NF8yNDNfMCIgeDE9IjI5LjAwMDAwMCIgeTE9IjAuMDAwMDAwIiB4Mj0iMjkuMDAwMDAwIiB5Mj0iNjcuMDAwMDAwIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CgkJCTxzdG9wIHN0b3AtY29sb3I9IiNFOEQ1NDQiLz4KCQkJPHN0b3Agb2Zmc2V0PSIxLjAwMDAwMCIgc3RvcC1jb2xvcj0iI0ZGRUY3OSIgc3RvcC1vcGFjaXR5PSIwLjI3MDU4OCIvPgoJCTwvbGluZWFyR3JhZGllbnQ+CgkJPGxpbmVhckdyYWRpZW50IGlkPSJwYWludF9saW5lYXJfNjRfMjQ0XzAiIHgxPSIyOS4wMDQ1NzIiIHkxPSI3LjUwMDAwMCIgeDI9IjI5LjAwNDU3MiIgeTI9IjYwLjM5NzQzNCIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPgoJCQk8c3RvcCBzdG9wLWNvbG9yPSIjRkZFRjc5IiBzdG9wLW9wYWNpdHk9IjAuMTA5ODA0Ii8+CgkJCTxzdG9wIG9mZnNldD0iMS4wMDAwMDAiIHN0b3AtY29sb3I9IiNFOEQ1NDQiLz4KCQk8L2xpbmVhckdyYWRpZW50PgoJPC9kZWZzPgoJPHBhdGggaWQ9InBhdGgiIGQ9Ik0yOS4xOTcgMEMyMi4zNjc3IDUuMzcyNDQgMTIuNTkyNyAxMC42MzQ5IDAgMTAuNjM0OUwwIDM1Ljg5ODFDMCA0Ny4xNDU4IDE2LjYwNDQgNjcgMjkuMjA0MyA2N0M0MS44MDQ0IDY3IDU4IDQ3LjEzODMgNTggMzUuODk4MUw1OCAxMC42MzQ5QzQ1LjM4NTMgMTAuNjM0OSAzNi4wMjY0IDUuMzcyNDQgMjkuMTk3IDBaTTUyLjAyOTQgMzUuNjQ3NUM1Mi4wMjk0IDQ1LjI4OTQgMzkuNjI1NCA2MC4yOTIyIDI4LjgyNjMgNjAuMjkyMkMxOC4wMiA2MC4yOTIyIDYgNDUuNjQyIDYgMzZMNiAxNS41QzE2Ljc5OSAxNS41IDIzLjM0NTUgMTIuMzUyMiAyOS4yMDQzIDcuNzM3NTVDMzUuMDQ4NiAxMi4zMzcyIDQxLjIzMDUgMTUuNDYxNSA1Mi4wMjk0IDE1LjQ2MTVMNTIuMDI5NCAzNS42NDc1WiIgZmlsbC1ydWxlPSJub256ZXJvIiBmaWxsPSJ1cmwoI3BhaW50X2xpbmVhcl82NF8yNDNfMCkiIGZpbGwtb3BhY2l0eT0iMC4zNTAwMDAiLz4KCTxwYXRoIGlkPSJwYXRoIiBkPSJNMjkuMTU1NSA3LjVDMjMuNDc2OSAxMi42NTM4IDE1LjY4NCAxNS41IDYgMTUuNUw2IDM2Ljc2OTNDNi40MjY1MSA0NC4wNzA2IDE2LjEwNTMgNjAuMzk3NSAyOC44NjQ5IDYwLjM5NzVDMzguODI5OCA2MC4zOTc1IDUyLjQ3NjggNDYuNjUzOCA1MS45OTY4IDM1LjI1OTRMNTEuOTk2OCAxNS41QzQwLjEwOTMgMTUuNSAzNC40MDc1IDExLjQ2NTEgMjkuMTU1NSA3LjVaTTQ2Ljc5MzYgMzUuMjU5M0M0Ni43OTM2IDQyLjM3NTUgMzcuMTY5NCA1My4zNTc0IDI4Ljg2NDkgNTMuMzU3NEMyMC41NTQ3IDUzLjM1NzQgMTEuNTA2MiA0Mi4zNzU1IDExLjUwNjIgMzUuMjU5M0wxMS41MDYyIDIwLjM0MDJDMTkuODEwOCAyMC4zNDAyIDI0LjY0OTkgMTcuOTc1NSAyOS4xNTU1IDE0LjU2OTdDMzMuNjQ5OSAxNy45NjQ0IDM4LjQ5NDYgMjAuMzQwMiA0Ni43OTkzIDIwLjM0MDJMNDYuNzkzNiAzNS4yNTkzWiIgZmlsbC1ydWxlPSJub256ZXJvIiBmaWxsPSJ1cmwoI3BhaW50X2xpbmVhcl82NF8yNDRfMCkiIGZpbGwtb3BhY2l0eT0iMC4zNDAwMDAiLz4KPC9zdmc+Cg==)}.scan-icon-img-bg[data-v-2e83464a]{position:absolute;left:0;right:0;top:0;bottom:0;z-index:50;margin:auto;display:inline-block;width:100px;height:100px;border-radius:100%;background:radial-gradient(50% 50% at 50% 50%,rgba(255,255,255,.2) 54.962%,rgba(122,227,142,.2))}.animate-box[data-v-2e83464a]{position:relative;width:100px;height:100px;animation:rotate-2e83464a 3s linear infinite}.animate-box-left[data-v-2e83464a]{z-index:55;width:50px;height:100px;border-radius:50px 0 0 50px}.animate-box-right[data-v-2e83464a]{position:absolute;left:50%;z-index:55;height:100px;--un-bg-opacity:1;background-color:rgb(255 255 255 / var(--un-bg-opacity));border-radius:0 50px 50px 0}.animate-box-bottom[data-v-2e83464a]{position:absolute;top:.4rem;left:.4rem;z-index:2;width:92px;height:92px;border-radius:50%;background:radial-gradient(50% 50% at 50% 50%,rgba(255,255,255,.2) 54.962%,rgba(122,227,142,.2))}.circle-inner[data-v-2e83464a]{background:var(--color-bg-2);position:absolute;left:0;top:0;bottom:0;right:0;z-index:55;margin:auto;display:inline-block;width:96px;height:96px;border-radius:100%}.circle-outer[data-v-2e83464a]{position:absolute;left:0;top:0;bottom:0;right:0;z-index:55;margin:auto;width:100px;height:100px;border-radius:100%}.linear-safe[data-v-2e83464a]{background:linear-gradient(#20a53a,#fff)}.linear-danger[data-v-2e83464a]{background:linear-gradient(#ef0808,#fff)}.linear-warn[data-v-2e83464a]{background:linear-gradient(#f0ad4e,#fff)}.linear-risk[data-v-2e83464a]{background:linear-gradient(#e8d544,#fff)}.safe[data-v-2e83464a]{background:radial-gradient(50% 50% at 50% 50%,rgba(255,255,255,.2) 54.962%,rgba(122,227,142,.2))}.danger[data-v-2e83464a]{background:radial-gradient(50% 50% at 50% 50%,rgba(255,255,255,.2) 54.962%,rgba(255,0,0,.2))}.risk[data-v-2e83464a]{background:radial-gradient(50% 50% at 50% 50%,rgba(240,173,78,0) 58.015%,rgba(232,213,68,.2))}.warn[data-v-2e83464a]{background:radial-gradient(50% 50% at 50% 50%,rgba(240,173,78,0) 58.015%,rgba(240,173,78,.2))}.box-text[data-v-2e83464a]{position:absolute;left:0;right:0;top:0;bottom:0;z-index:99;margin:auto;width:78px;height:50px;display:flex;align-items:center;justify-content:center;font-size:3.2rem;font-weight:700;line-height:4.5rem}.box-text span[data-v-2e83464a]{margin-top:16px;font-size:1.8rem}.risk-spin[data-v-8c801650]{background:var(--home-risk-security-list-spin-bg)}.module-list[data-v-8c801650]::-webkit-scrollbar{width:10px;height:5px}.module-list[data-v-8c801650]::-webkit-scrollbar-thumb{box-shadow:inset 0 0 .5rem rgba(0,0,0,.2);background-color:#999}.module-item[data-v-8c801650]{font-size:1.25rem}.module-head[data-v-8c801650]{border-bottom:1px solid #ececec;color:#555;transition:background .3s}.module-head[data-v-8c801650]:nth-child(1){border-top:1px solid #ececec}.module-head[data-v-8c801650]:hover{background-color:var(--home-risk-security-list-hover-bg)}.module-body[data-v-8c801650]{border-bottom-width:1px;--un-border-opacity:1;border-color:rgb(236 236 236 / var(--un-border-opacity));padding:1rem 1.5rem 1rem 2.5rem;color:var(--color-text-2)}.collapse-item[data-v-8c801650]{color:var(--home-risk-security-list-collapse-item-color);background:var(--color-bg-2);width:48rem;border-radius:2px;font-size:1.2rem;margin-left:1rem;border-width:1px;--un-border-opacity:1;border-color:rgb(235 238 245 / var(--un-border-opacity));padding:.6rem 1.6rem;display:flex;align-items:center;line-height:1.8rem}.n-progress.n-progress--circle[data-v-420a884f],.n-progress.n-progress--dashboard[data-v-420a884f]{width:100px!important}.progress-header[data-v-420a884f]{display:flex;align-items:center;height:140px;padding:20px;text-align:center}.progresscircle[data-v-420a884f]{position:absolute;top:8px;left:25px}.progresscircle p[data-v-420a884f]{padding:5px 0;font-size:13px;font-weight:700}.progresscirclebar[data-v-420a884f]{position:relative;width:100px;height:100px;line-height:100px;font-size:18px}.progresscirclebar span[data-v-420a884f]:nth-child(1){font-size:24px}.progresscirclebar.active svg[data-v-420a884f]{-webkit-animation:load8 1.1s infinite linear;animation:load8 1.1s infinite linear}.progress-header-cot[data-v-420a884f]:nth-child(1),.progress-header-cot[data-v-420a884f]:nth-child(3){min-width:100px;position:relative}.progress-header-cot[data-v-420a884f]:nth-child(3){display:flex}.progress-header-cot[data-v-420a884f]:nth-child(2){width:100%;padding:0 40px}.progress-header-cot button.cancel_detect[data-v-420a884f]{border-color:#999;color:#666;background-color:#fff;font-size:15px}.progress-header-cot button.cancel_detect[data-v-420a884f]:hover{color:#fc6d26;background:rgba(252,109,38,.1);border-color:rgba(252,109,38,.2)}.scanning-progress-title[data-v-420a884f]{text-align:left;font-weight:700;margin:15px 0;font-size:20px}.scanning-progress-title img[data-v-420a884f]{margin-right:10px;vertical-align:sub;width:24px}.scanning-progress-title span[data-v-420a884f]{color:#fc6d26}.scanning-progress-cont[data-v-420a884f]{text-align:left;margin:15px 0;font-size:14px}.progress_item[data-v-8e84f2b9]{margin:0 20px 6px;padding:0 20px;background-color:var(--home-risk-server-list-bg);border-radius:4px;border:1px solid transparent}.progress_item_header[data-v-8e84f2b9]{height:30px;line-height:30px;display:flex;justify-content:space-between;border-radius:4px;cursor:pointer;font-size:12px;color:var(--home-risk-server-list-text)}.progress_item_header .progress_type[data-v-8e84f2b9]{display:flex;align-items:center;width:59.5%;font-weight:700;line-height:22px}.progress_item_header .progress_type .title-icon[data-v-8e84f2b9]{width:14px;margin-right:6px}.progress_item_header .progress_status[data-v-8e84f2b9]{flex:1}.progress-cont-list[data-v-8e84f2b9]{overflow:auto;max-height:390px}.progress_item_body[data-v-8e84f2b9]{line-height:30px;display:none;font-size:12px}.progress_item.active .progress_item_body[data-v-8e84f2b9]{display:block}.progress_item_info[data-v-8e84f2b9]{margin-bottom:6px}.progress_item_info .info_cont[data-v-8e84f2b9]{display:flex;color:#666;padding:0 30px}.progress_item_info .info_cont div[data-v-8e84f2b9]:nth-child(1){width:60%}.progress_item_info .info_cont div[data-v-8e84f2b9]:nth-child(2){width:40%}.progress_item_info .info_cont div:nth-child(2) span[data-v-8e84f2b9]{font-weight:600}.progress_item_info.active[data-v-8e84f2b9]{background-color:rgba(252,109,38,.1);padding:0}.progress_item_info.active .info_cont[data-v-8e84f2b9]{margin:0 20px;padding:0 10px;border-bottom:1px dashed #d9d9d9}.progress_item_info.active .info_cont_desc[data-v-8e84f2b9]{color:#888;border-radius:4px;padding:0 30px}.progress_item_info.active[data-v-8e84f2b9]:hover{background-color:rgba(252,109,38,.2)}.progress_item_info[data-v-8e84f2b9]:hover{background-color:var(--home-risk-server-list-hover)}.btn_red[data-v-8e84f2b9]{font-weight:700;margin-left:5px;padding:1px 5px;text-align:center;border-radius:3px;color:#fff;background:red}[data-v-8e84f2b9] .n-progress__text{font-size:16px!important;font-weight:700}.scrollable[data-v-8e84f2b9]::-webkit-scrollbar{width:10px}.scrollable[data-v-8e84f2b9]::-webkit-scrollbar-track{background:#efefef}.scrollable[data-v-8e84f2b9]::-webkit-scrollbar-thumb{background:#bfbfbf;border-radius:10px}.scrollable[data-v-8e84f2b9]::-webkit-scrollbar-thumb:hover{background:#555} diff --git a/BTPanel/static/vite/css/index98.css b/BTPanel/static/vite/css/index98.css index 8cab4ef2..92e8ca70 100644 --- a/BTPanel/static/vite/css/index98.css +++ b/BTPanel/static/vite/css/index98.css @@ -1 +1 @@ -.record-title[data-v-c4a364ba]{font-size:16px;color:var(--n-color-text-1);font-weight:600;margin-bottom:10px}.record-desc[data-v-c4a364ba]{font-size:14px;color:var(--n-color-text-2);margin-bottom:10px}.bt-link[data-v-c4a364ba]{border:none;outline:none;background:none;padding:0} +.item-list[data-v-44d19ba5]{align-items:center;padding:16px;border-bottom:1px solid var(--color-border)} diff --git a/BTPanel/static/vite/css/index99.css b/BTPanel/static/vite/css/index99.css index d64e5c8f..f50d5022 100644 --- a/BTPanel/static/vite/css/index99.css +++ b/BTPanel/static/vite/css/index99.css @@ -1 +1 @@ -.title-top[data-v-de5ccbe2]{background:var(--mailserver-domain-check-tips-bg);border-radius:.25rem;padding:10px;text-align:center;border:1px solid #dddddd}.box[data-v-de5ccbe2]{background:var(--mailserver-domain-check-box-bg);align-items:center;border-radius:.25rem;padding:10px;border:1px solid var(--border-hover-focus-color)} +.item-list[data-v-8f541c35]{align-items:center;padding:16px;border-bottom:1px solid var(--color-border)} diff --git a/BTPanel/static/vite/css/page_layout.css b/BTPanel/static/vite/css/page_layout.css index 24c28cb8..4ca4df60 100644 --- a/BTPanel/static/vite/css/page_layout.css +++ b/BTPanel/static/vite/css/page_layout.css @@ -1 +1 @@ -.svg-icon[data-v-8667fe91]{width:1em;height:1em;fill:currentColor;vertical-align:-.15em}@keyframes bounce-in{0%{opacity:0;transform:scale(.5)}to{opacity:1;transform:scale(1)}}@keyframes bounce-out{0%{transform:scale(1)}30%{transform:scale(1.05)}to{opacity:0;transform:scale(.7)}}.bounce-enter-active{animation:bounce-in .3s;animation-fill-mode:both}.bounce-leave-active{animation-name:bounce-out;animation-duration:.2s;animation-fill-mode:both}.n-layout-sider[data-v-b7f5d871]{background-color:#3c444d}.sider-header[data-v-b7f5d871]{position:relative;height:52px;display:flex;align-items:center;justify-content:center;cursor:pointer;padding-left:8px;padding-right:8px;--un-text-opacity:1;color:rgb(255 255 255 / var(--un-text-opacity));transition-property:color,background-color,border-color,text-decoration-color,fill,stroke;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.sider-header[data-v-b7f5d871]:hover{background-color:var(--color-primary)}.sider-header .text[data-v-b7f5d871]{margin-right:22px;width:110px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;font-size:14px}.sider-header .message[data-v-b7f5d871]{position:absolute;top:16px;right:8px;width:20px;height:20px;display:flex;cursor:pointer;align-items:center;justify-content:center;border-radius:4px;--un-bg-opacity:1;background-color:rgb(252 109 38 / var(--un-bg-opacity));font-size:14px;font-weight:700}.n-menu[data-v-b7f5d871]{--n-color: #353d44;--n-item-height: 40px;--n-font-size: 14px;--n-border-radius: 0;--n-item-text-color: #d6d7d9;--n-item-color-hover: #2c3138;--n-item-color-active: #2c3138;--n-item-color-active-hover: #2c3138;--n-item-text-color-hover: #fff;--n-item-text-color-active: #fff;--n-item-text-color-active-hover: #fff;padding-bottom:0}.n-menu[data-v-b7f5d871] .n-menu-item{margin-top:1px}.n-menu[data-v-b7f5d871] .n-menu-item .n-menu-item-content{padding-right:0}.n-menu[data-v-b7f5d871] .n-menu-item .n-menu-item-content:before{left:0;right:0;border-left:4px solid #2c3138;transition:background-color .3s var(--n-bezier),border-color .3s var(--n-bezier)}.n-menu[data-v-b7f5d871] .n-menu-item .n-menu-item-content .n-menu-item-content-header{width:100%;height:100%}.n-menu[data-v-b7f5d871] .n-menu-item .n-menu-item-content .n-menu-item-content-header .n-menu-item-link{display:flex;align-items:center;width:100%;height:100%;padding-left:52px;padding-right:18px;background-repeat:no-repeat;background-size:16px auto;background-position:25px 11px}.n-menu[data-v-b7f5d871] .n-menu-item .n-menu-item-content--selected:before,.n-menu[data-v-b7f5d871] .n-menu-item .n-menu-item-content:hover:before{border-left-color:#20a53a}.n-menu[data-v-b7f5d871] .n-menu-item .n-menu-item-content .home{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAKwwAACsMBNCkkqwAAABx0RVh0U29mdHdhcmUAQWRvYmUgRmlyZXdvcmtzIENTNui8sowAAAFZSURBVDiNpdO9a1VBEAXw3zOioIUQEdFGkQdWVtr6D1ikERtRppLU6awUsUkh2CgoBNwhoPhsLESxERR7wcI2XSBNMAHRNFmLbB6Xa64RXFjYOXvmzMfOjmqt/mcd2I+QmUuZOcgbDWWQmTN4iFms4wGu4jC+RMT7wQwy8xBe4FtE3MBXPMdqE5sfLCEzj+Il3kXEE4iIJTzFFbzB9z0FMvMYJphExLPuXUQs4y1eYfmPHmTmbHN+FBGv92zMDm+ulXAzItZHtVaZeRH3sBgRn4ecOyKXcRt3dkuYwyJOZeaJfZyP42TjX1Nrne5SyqSUMu5ho559tpQy2bUP9gL8wHYnzbtYzczTuB8RHzs8/H0Sz+ETbuEDxg3f7pL6AhW/2vknNiNiCxvY6uDT8e2XMINLmbmC89js3I0z8wLOdP36Aht43KIcwULD1+w82/WGT+dk8DP96/oNlqecb6uu8YEAAAAASUVORK5CYII=)}.n-menu[data-v-b7f5d871] .n-menu-item .n-menu-item-content--selected .home{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAKTQAACk0BtZPkxgAAABx0RVh0U29mdHdhcmUAQWRvYmUgRmlyZXdvcmtzIENTNui8sowAAAFVSURBVDiNpdO9atVBFATw3/UjBEGidkJSRFFIiKJBsAmaBxDFQptUIoJPYCc2Wmpjo4haRUFMnsEmnXUIKQXFRlEvaiIxY/HfheXCNUUWht2dM+fsYXe2l8Ruxp4d4jN4gDNlvw/70dMQw8ZRXMdFbOAvpjGJ93iHrWEdHMdDfMMcPuMpjiC4hYPDOpjCPazgceGeYS8m8BYj2AZJWpxOspTk9gBfcTPJSpJrlRtMXk5yY0hyxUKSF0lOtQWuJHmV5NIOyRWXk7xOcrVe4iSW8BXj/3mZ+jpfiv5ErThS5udJzjcnHUgyXubKnU3yUrcerR38wSH0sVm4C3iDO+Xm5wu/hX44jI3WB4OePoaPeIIPOm9U3XYVtQV6JfC77PtYxyrW8KPwP9vDWiNFZ5BzOtvO4Fejm8ZJzGqM1BbYLHiE77pPc7fEPuE+FjCGxaLV2+13/gdXJgTGYi2BZQAAAABJRU5ErkJggg==)}.n-menu[data-v-b7f5d871] .n-menu-item .n-menu-item-content:hover .home{background-image:url(data:image/gif;base64,R0lGODlhEAAQANUAAPPz8+np6d3d3c/Pz8vLy8XFxb+/v729vbu7u7e3t7W1tbGxsa+vr62traurq6mpqaenp6WlpaOjo6GhoZ2dnZubmwrPOpmZmQzLPJeXl5WVlRLFPhLDPhy5RI+Pjx63RImJiYeHhyypSiirSIODgzKfToGBgTabUDibUDiZUH5+fj6TUnx8fECRVEKPVHp6ekSNVkCPVESLVnZ2dnR0dEyDWnBwcFR4XlZ2Xlh2XlpyYGZmZgAAAAAAAAAAAAAAACH/C05FVFNDQVBFMi4wAwEAAAAh+QQJHgA7ACwAAAEAEAAOAAAGhsCdcLgzJUjE5HCmECxMFYZHuWMRHDuJINIg2JIqAmQYOS6SpEEkORFciOkJlVIwCTUEDfVOyOweFyAzVDMgFw1DBSFDOkMkBUQ2B0g1HyIdNUUGX0OTOy0jNyMrRQecOzYIKjsyKDspMDsvpkQGFDklJzsoJTgVBkkIAAEYLjsuGAEACEJBACH5BAkeADsALAAAAQAQAA4AAAZxwJ1wuDMlSMTkcKYQLEwVhke5YxEcO4kg0iDYkioCZBg5LpKkQSQ5EVyI6QmVUjAJNQQN9U7I7B4XIDNUMyAXDUMFIVQkBUQ2B0hKJgZfQ5FUJgeWOzYIKlQvm0QGFEM6QxUGSQgAARYcIhsWAQAIQkEAIfkECR4AOwAsAAABABAADgAABnfAnXC4MyVIxORwphAsTBWGR7ljERw7iSDSINiSKgJkGDkukqRBJDkRXIjpCZVSMAk1BA31TsjsHhcgM1QzIBcNQwUhVCQFRDYHSEomBl9DkVQmB5Y7NggqQzpDL5tEBhQ5NR8iHTU4FQZJCAABGC47LhgBAAhCQQAh+QQJHgA7ACwAAAEAEAAOAAAGfcCdcLgzJUjE5HCmECxMFYZHuWMRHDuJINIg2JIqAmQYOS6SpEEkORFciOkJlVIwCTUEDfVOyOweFyAzVDMgFw1DBSFUJAVENgdISiYGX0ORQzpDJgeWOzYIKjs1HyIdNTsvnUQGFDklJzsoJTgVBkkIAAEYLjsuGAEACEJBACH5BAUeADsALAAAAQAQAA4AAAaCwJ1wuDMlSMTkcKYQLEwVhke5YxEcO4kg0iDYkioCZBg5LpKkQSQ5EVyI6QmVUjAJNQQN9U7I7B4XIDNUMyAXDUMFIVQkBUQ2B0hCOkMmBl9DkTs1HyIdNUUHmDs2CCo7Mig7KTA7L6JEBhQ5JSc7KCU4FQZJCAABGC47LhgBAAhCQQAh+QQFHgA7ACwGAAkABQADAAAGDsDdTiesfUSdWmt0G62CACH5BAkyADsALAAAAQAQAA4AAAYVwJ1wSCwaj8ikcslsOp/QqHRKdQYBADs=)}.n-menu[data-v-b7f5d871] .n-menu-item .n-menu-item-content .website{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAABx0RVh0U29mdHdhcmUAQWRvYmUgRmlyZXdvcmtzIENTNui8sowAAAHuSURBVDiNpZO/S9ZRGMU/5xZl0NJQDf2ybAgrGgylGloiCR0jDAO3+4WQlqA/oiHkpUGvgYtFRENL5g+CCEIiqSjMoFKsaJFqScMXfU9DV3vVluiZDs997odzuM+Vbf6n1v+tmVJqA9okHba9CXgF9McY+1fPqtpBSmkH0Al8B45Iema7DDRlyHagK8b4ZQ2gp6dnn6QB2+2SdgFvJW2xPQeUbdcCM5L6gNYY4/QyIKW0AbgGPAb2AueALuAQMA9MApeAu7YnJZ0ALscYyyE7aZf0JsZ4R1I/MAKMAwFYl+0/AW4URXFb0gTQTh4AOGP7Xta7gbEY43NJw8BA1hPAHoA821wdYUxSCZi13QhslPTI9kmgLGkUOG37m6QXwGbbF2OMTUvPuGD7JzCbM2N7FigD87bnJC3r7HyhOsK0pNEY46CkoRxhRNJDYDjGOGz7fdYPsqNP1YBB2y0Ai4uLH4GjKaUG281AS0qpAThQqVSmsrsWYAj+bOIt4Gpvb+/ZEMJ+4BTwLp8ZaASOhRA6UkofgHrgyupFqpN0H7gA7ATGJW21/SNvY10IYcZ2n+3WoiimVgAAuru7a0MIncBXoF7SU9sLwHHgJbDN9vWiKD4v3VkBACiVSqqpqekAzgMHc/s1vz/TTVbVGsC/1i9dw/hm1FHr2QAAAABJRU5ErkJggg==)}.n-menu[data-v-b7f5d871] .n-menu-item .n-menu-item-content--selected .website{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAKnAAACpwB9NLfEgAAABx0RVh0U29mdHdhcmUAQWRvYmUgRmlyZXdvcmtzIENTNui8sowAAAGCSURBVDiNpdLPaw9wGAfw13fExWVq1IzYJEkc5kezgws5zM2S+irOWi7KH+EgB0e1m9ZycMGWm0jLRYqUWNNyIDkw2lq9Hb7P5rsfDvKpT717Pp/n/byf53k3kvif0/GX+AXcx3t8wgQurvexsUrBDozgGw7jBRZwHK+wHbeKdA1BLx6iiZ14i078LJLd+IJRnMVMO8Em3MQT7MH5qnQQ8/iAq7hXeBDXsLCxqjfxBuPVRide4xA2lPxnuIPP2Fo5o5JIMp6ku/BAkuHCp5MMFr6S5Gjh7iRjSSwp6MUpzOEYNmMRJ6v/rmqnG7uwpVpdJljEryKYr9hcJc+3DXIJd1TOMsEMnmMW36vSYzQq4Sn21Vqn0INz/DHSBIYKf8QR9ONMxfuxH9P1ZwiT7Qru4gaGsbfm8a7eUnMZwCUtdx7AdVYaqQ8PtCzbo7XGLvyo/vusNNL0agJabhvB16oyVcM6gZfYhts1q9LX2mv7bSS5nGQyyWzdR0ma6/xdo+Cfz28JnsxkWP6vVAAAAABJRU5ErkJggg==)}.n-menu[data-v-b7f5d871] .n-menu-item .n-menu-item-content:hover .website{background-image:url(data:image/gif;base64,R0lGODlhEAAQAOYAAPHx8e/v7+vr6+np6efn5+Xl5eHh4d/f393d3dXV1dHR0c3NzcvLy8nJycfHx7+/v729vbu7u7m5ube3t6+vr62traurq6mpqaenp6WlpaGhoZ+fn52dnZubm5mZmZeXlxTDPpOTkyqrSiqpSoeHhy6nSiynSoWFhS6lTDCjTDKhTjSfTjadTjadUDSdTjabUDyXUjqXUjyVUj6TUkCRVHp6ekSNVkaLVkSLVnh4eEqHWHZ2dkiHWEqFWE6BWlB+XFJ8XFJ6XFR6XFZ4XlZ2XlpyYFxwYmZmZgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH/C05FVFNDQVBFMi4wAwEAAAAh+QQFDgBHACwAAAEADwAOAAAHbYBHgoIdCgIACRyDizsTFQ0XGA4WEjuLNQMnH4shJwU1gw8di4sdD4IaGKSkGBpHC5argzsMRwYbsoMbB0cHHrmCHghHDDnARzm1GhnHGa5HEL+yHxCDmJqcJASg1hEUDRgZkxLGqxoJAQGJi4EAIfkEBQ4ARwAsBAADAAgAAgAABxGAR0dDPkBDgi0gNCgqNCAsgQAh+QQFDgBHACwEAAUACAACAAAHEYBFKUAogyNGPjZHPT5HMD+BACH5BAUOAEcALAMABwAKAAIAAAcWgDcoJjclKDciKTc6Kig9KCo6Jis6gQAh+QQFDgBHACwEAAkACAABAAAHCoA+Nkc6PkcwP4EAIfkEBQ4ARwAsBAAKAAgAAQAABwqARShAJSlAI0aBACH5BAUOAEcALAQACwAIAAIAAAcRgCwgMyUpMiAvR0dDPkJDioEAIfkECTIARwAsAAABAA8ADgAABxaAR4KDhIWGh4iJiouMjY6PkJGSk5SBADs=)}.n-menu[data-v-b7f5d871] .n-menu-item .n-menu-item-content .ftp{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAABx0RVh0U29mdHdhcmUAQWRvYmUgRmlyZXdvcmtzIENTNui8sowAAAH6SURBVDiNpdM/qJZlGAbw3/1+n31o/0BJrMFaGmoRRBsM14M4iINLixBxHs6pxSxBmhpCqEk5CL2Pp5ZAdBD/UIJNhdBQzTqJYKkoB8HEY+r53rvB99hnuXlNNzfXfT3X9dzPE5npWTB8WrPWuhvvYwvGOI+vSykn/8uNSQfz8/MvdV33DRaxBlMInMZ9LI7H449mZ2cfLM80y0Xbtiu7rjsZEecz8ws8xBEc7l3swfXBYHB8bm6u+Z9A0zSfYmtmXoyIg/gKV3AJLQ7hV+wcjUYzT0Sota7C2Yg4kJm7sQM/YQOWcAFb+ygn8HHXdVMzMzMPlx1swML09PSPEXEIpzCNc/gBH+D7zPyylHIGt5umeWsywou4B5n5BhZKKTdwFddKKTdxJyLe7PmLWD0pcB2v9PVlvN627WZsxKZa6ya8hj96zsuZuUD/DobD4YWlpaUVtdbP8A62RcRNrO+38SG2I2qtv2AUERcfXyLUWnfhu8zcGBEFv+PVPtp9vI2j+A3vlVKOPSHQi+zHrcz8NiLebZrmr3yE1ePx+OfBYLAfK0opnz9eY9u2WzJzHRJ/Yy3uRsTePnfgSmYexAu4gZX9/NUh9kXElH8xxgjPTfTWR8RmPMBg+XCcGOKTiHh+gtxFxKqu685gXd/7MyJ29g6bCe7teNbv/A8ZE8Q3GMBOFwAAAABJRU5ErkJggg==)}.n-menu[data-v-b7f5d871] .n-menu-item .n-menu-item-content--selected .ftp{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAKnAAACpwB9NLfEgAAABx0RVh0U29mdHdhcmUAQWRvYmUgRmlyZXdvcmtzIENTNui8sowAAAGVSURBVDiNpdLdaw9wFAbwzw+jzVspIxdIuXHhQqbGHVmSRLlx4w9YKbkhpVz4A6SkKOWlldA0uXA1Um645motL7NImsnYNI+LnZ9+W63IqW+dzvc8zznPOaeRxP/YgnnixzCISUzgEQ7/DcEK3MEefEMDbfiKI7iKxfMRtKMfT3EePwtwCdM4gVHcnoVL0nxnk0wl2ZvkYZLuJKeSHE+yO0lfkgOZsd4mrgnuSPI4SU+SW0nGkwwkeZ1kKMmDJGNJric5mGQwSVsrQXeSu+V3JbmRZE2SK0kuJuks4i2Vcz/J1iR/tCzH9/I34hM+YATv8bEGublyJrCqdYijWF3+MDagC9uwvd46vK2clVXEogq8rHWdwQ7sq6rraxu92F9rfYYleNVKMI3LuFlVh/ECQyVtEmPow3McLYzGnFM+jc+4hl0YR0rvk/pvw7kmoJFkJ9ZW4g90mrnCk6W7gTe4gGU13PbCjzSS9KOnpYvp0jjrZEvGFBY2i+NeI8kmLG1J/IUODFRn8A6HqsPW8/8ydwb/bL8B1eb4OuOuSusAAAAASUVORK5CYII=)}.n-menu[data-v-b7f5d871] .n-menu-item .n-menu-item-content:hover .ftp{background-image:url(data:image/gif;base64,R0lGODlhEAAQAOYAAP////39/fv7+/f39+3t7evr6+Pj49/f39nZ2dfX19XV1dPT09HR0c/Pz83NzcvLy8nJycfHx8XFxcPDw8HBwb+/v729vbu7u7W1tbOzs7Gxsa+vr62trampqaenp6OjowDZNp+fnwLXNp2dnQTVOATTOJubmwrPOpmZmQrNOgzLPJeXl5WVlRi/QBa/QJGRkY+PjyC1RI2NjSSxRomJiYeHh4WFhYODg4GBgX5+fnx8fECRVESNVkSLVkaLVkiHWHR0dE6BWnJyclB+XFJ8XFR6XlR4Xlp0YFh0YGZmZgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH/C05FVFNDQVBFMi4wAwEAAAAh+QQJMgBJACwAAAEAEAAOAAAHvYBJgoIhCAICCiuDi4IOEQsBAQ4QE4yCCR06DRUWD0AYDYwaATALNBweMA8sAB6LCC8QAwwEBQwDESwIgzQOSTURQBMVQBA5SQw3grFJKBdJGRtJFCxJDzKCOApJNg01DA42DDZJCziDCRsMAhQGBxIBDBsJiygCORYjqB8XNgAmjDZ8SCLjxg0YSTRkGBSkh48fO3i0UKGiRY8dP3z4GBKDhMcSIkCIBCGihEcSM5AUWVlkyAmRKYiwLHIkEAAh+QQFDgBJACwAAAEADwALAAAHj4BJgoIhCAICCiuDi0kOEQsBAQ4QE4xJCR06DRUWD0AYDYsaATALNBweMA8sAB6DCC8QAwwEBQwDESwIgjQOSTURQBMVQBA5SQw3SbFJKBdJGRtJFCxJDzJJOApJNg01DA42DDZJCziCCRsMAhQGBxIBDBsJgygCORYjqB8XNgAmizZ8SCLjxg0YSTRkEBQIACH5BAUOAEkALAAADAACAAMAAAcIgEE9MSRIRYEAIfkEBQ4ASQAsAgAMAAEAAwAABwWAPiRFgQAh+QQJDgBJACwAAAEADwAOAAAHIIBJgoOEhYaHiImKi4yNjo+QkY8/OzyMJCUijEVFQ4mBACH5BAkOAEkALAAAAQAPAA4AAAepgEmCgiEIAgIKK4OLSQ4RCwEBDhATjEkJHToNFRYPQBgNixoBMAs0HB4wDywAHoMILxADDAQFDAMRLAiCNA5JNRFAExVAEDlJDDdJsUkoF0kZG0kULEkPMkk4Ckk2DTUMDjYMNkkLOIIJGwwCFAYHEgEMGwmDKAI5FiOoHxc2ACaLNnxIIuPGDRhJNGQQFKSHjx87eFgaFIOExRIiQGgEwQhJkY9FJg4KBAAh+QQFDgBJACwAAAEADwAOAAAHsYBJgoIhCAICCiuDi0kOEQsBAQ4QE4xJCR06DRUWD0AYDYsaATALNBweMA8sAB6DCC8QAwwEBQwDESwIgjQOSTURQBMVQBA5SQw3SbFJKBdJGRtJFCxJDzJJOApJNg01DA42DDZJCziCCRsMAhQGBxIBDBsJgygCORYjqB8XNgAmizZ8SCLjxg0YSTRkEBSkh48fO3gs6rHjh6AYJDKWEAGiIwgRJUgIQlKkpKUkJpMEAgAh+QQFDgBJACwNAAwAAwADAAAHC4A+PkMkJDNFRUeBACH5BAUOAEkALAQADAAGAAMAAAcOgElJLSoqLYKISUVDiYEAIfkECTIASQAsAAABABAADgAABx2ASYKDhIWGh4iJiouMjY6PkJGSk5SEJyAgKUSFgQA7)}.n-menu[data-v-b7f5d871] .n-menu-item .n-menu-item-content .database{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAK6wAACusBgosNWgAAABx0RVh0U29mdHdhcmUAQWRvYmUgRmlyZXdvcmtzIENTNui8sowAAAHISURBVDiNpZPPi81RGMY/z+3mpmasGBOZEgthQ5SFTDM2svMjOyt9X1eUEhshRbGx1e1cO5M/YVIzSWbjx4RidTeKbl3XgoyYW5rHwvlO35TZzFtn8fac5znPc855ZZvVVL3apJR2AGeAw5JGbI9m6Iukvu0ZIEVEp+TINimlOnANGAc6wCvbHUm/AAHrgZ3AHmA7MC3pVlEUS6WDWaALHIuIb/9xOw3QarVGa7XafduzwGQtg+PA+xXIy9VsNnvAHDBRvYMBcDyldEDSvO1nkj7lCNhea3uLpEO29wOjmbMsUAfOAYu2C+CC7XW2hzL+A1iw3QWu5/0vqgIAD4A7EXFxpQgppRPA1bIvBX4Dt4GJlNIV4DPQlTTIERrApryeA3eBh1WBBkBEnM+n7AO22R7O+ALwISJeZvxkySn/wQD4CDyV9Nj2XET0/7G+ATgIHAEmgbGIaJQO1gCngF22A7iRUloCfgLOpwnoA4+AFvC6GmEGOA1ciogpgHa7vRkYygLfi6LoVdzcI79CGUHAZf5+jh4wb/udpK/5EoclbQX2AruBt8DNiFhUdRpTSmPAWeCopI22R7KDfh6mJ8BURLwpOVrtOP8BlJPKP95zNKgAAAAASUVORK5CYII=)}.n-menu[data-v-b7f5d871] .n-menu-item .n-menu-item-content--selected .database{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAKdQAACnUBSiXd/QAAABx0RVh0U29mdHdhcmUAQWRvYmUgRmlyZXdvcmtzIENTNui8sowAAAF3SURBVDiNpdI5a5VhEAXg58qFRDBi4RIiBkSJoiIoihZi0EpsFWy0FAtbSwvB0uUn2LiUliIWMWgT90i0sRFcYxqFiCYQcizufHK9hUQcGIZh3jnvOYdpJfE/sayn34pLeI4PWKj8jJe4jJHuhVYxaOM8RvEGT6r+RAursQ27sBl3cBGLkkgynuRmklXV/y0Hk9xOMpbkt4RRvMK3JciexkMc6pYwhyl8wlM8wPuSAMuxAQexF4PYif4GYAH7C+g0hrASKwrgO2bxEdfKs0doN7oWkkwmObEED44leVY7f0g4Wbr24Uv9Nl8M+orVECZwH9fR3+56AGer7sEmDFQ/i7d4XP3xZqdhMI93GMfdcnmmx/01OIAjOIxh9DUAwW5sx6lyeRE/atanc1AzuIXXOtfaaoy5l+Rqj1nrk2xJMlLH0z27kmSi28QWzpWJ0zq3MIWvRX8AG4vlDkziAuYagCaGcQZHsQ5rS8JM5Rhu4EWz0Avwz/ELJiL9PSckq44AAAAASUVORK5CYII=)}.n-menu[data-v-b7f5d871] .n-menu-item .n-menu-item-content:hover .database{background-image:url(data:image/gif;base64,R0lGODlhEAAQAOYAAP////39/fv7+/Hx8e/v7+np6ePj4+Hh4d/f393d3dfX19XV1dPT08XFxcPDw8HBwb+/v7u7u7m5ube3t62traenp6OjowDZNgLXNp2dnZubmwrPOpmZmQrNOpeXlxLFPhTDQBTDPhbBQBTBQBa/QBq9Qhi9Qh63RBy5QiC1RCC1RiKzRiSxRouLi4mJiYeHhyirSCynSoWFhS6lTIODgzKhTjSfTjadTjKfToGBgTibUDiZUHx8fD6TUnh4eHZ2dkiHWHR0dEyDWnJyclB+XFZ4XlZ2Xlh0YFxwYGZmZgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH/C05FVFNDQVBFMi4wAwEAAAAh+QQFMgBJACwAAAEADwAOAAAHr4BJgkUzIB0XFxsfM0WCgjUlMD1CRERAOiwiNoIlLEiOoElIKSVJFzehoTsXSRggJzZCR0hIR0I2JyIYSQEyOTErKCQkKCoxNDIBvAYaqYIcB8oCHBAHDA4QEA4MBg8cAkkAHIIyGhYWGi/PAEkCBQ4cQaBBHg4F4AA0GQsGBgkJB6xloMFOQQRHP3jwkCcoAgJBFBg0qNAiRw4XGSIskADKxwQDAwIEIGAgAg1BgQAAIfkECQ8ASQAsAAABAA8ADgAABxaASYKDhIWGh4iJiouMjY6PkJGSk5SBACH5BAkPAEkALAAAAAAPAA8AAAe0gEmCRTMgHRcXGx8zRYKCNSUwPUJEREA6LCI2giUsSI6gSUgpJUkXN6GhOxdJGCAnNkJHSEhHQjYnIhigMSsoJCQoKjGgATI5qYI0MgFJAQYayUkcB80CHBAHDA4QEA4MBg8cAkkAHIIyGhYWGi+CHABJAgUOHEGgQR4OBeQANBkLDBhIkOCAtgw04imI4OgHDx73BEVAIIgCgwYVWuTI4SJDhAUSQPmYYGBAgAAEDESgISgQACH5BAkPAEkALAAAAQAPAA4AAAevgEmCRTMgHRcXGx8zRYKCNSUwPUJEREA6LCI2giUsSI6gSUgpJUkXN6GhOxdJGCAnNkJHSEhHQjYnIhhJATI5MSsoJCQoKjE0MgG8BhqpghwHygIcEAcMDhAQDgwGDxwCSQAcgjIaFhYaL88ASQIFDhxBoEEeDgXgADQZCwYGCQkHrGWgwU5BBEc/ePCQJygCAkEUGDSo0CJHDhcZIiyQAMrHBAMDAgQgYCACDUGBAAAh+QQJDwBJACwAAAAADwAPAAAHtIBJgkUzIB0XFxsfM0WCgjUlMD1CRERAOiwiNoIlLEiOoElIKSVJFzehoTsXSRggJzZCR0hIR0I2JyIYoDErKCQkKCoxoAEyOamCNDIBSQEGGslJHAfNAhwQBwwOEBAODAYPHAJJAByCMhoWFhovghwASQIFDhxBoEEeDgXkADQZCwwYSJDggLYMNOIpiODoBw8e9wRFQCCIAoMGFVrkyOEiQ4QFEkD5mGBgQIAABAxEoCEoEAA7)}.n-menu[data-v-b7f5d871] .n-menu-item .n-menu-item-content .docker{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyZpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuNi1jMTQ1IDc5LjE2MzQ5OSwgMjAxOC8wOC8xMy0xNjo0MDoyMiAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENDIDIwMTkgKFdpbmRvd3MpIiB4bXBNTTpJbnN0YW5jZUlEPSJ4bXAuaWlkOjQ2OUMyQTlEQzA3RjExRUNBRjc0QjI4QkM0QUMxRDBBIiB4bXBNTTpEb2N1bWVudElEPSJ4bXAuZGlkOjQ2OUMyQTlFQzA3RjExRUNBRjc0QjI4QkM0QUMxRDBBIj4gPHhtcE1NOkRlcml2ZWRGcm9tIHN0UmVmOmluc3RhbmNlSUQ9InhtcC5paWQ6NDY5QzJBOUJDMDdGMTFFQ0FGNzRCMjhCQzRBQzFEMEEiIHN0UmVmOmRvY3VtZW50SUQ9InhtcC5kaWQ6NDY5QzJBOUNDMDdGMTFFQ0FGNzRCMjhCQzRBQzFEMEEiLz4gPC9yZGY6RGVzY3JpcHRpb24+IDwvcmRmOlJERj4gPC94OnhtcG1ldGE+IDw/eHBhY2tldCBlbmQ9InIiPz606BQhAAAAn0lEQVR42mL8//8/AyWAiYFCQB8DZs2a9R+EsckxUhoGLPhshVkCxGB2WloaI4ZCZBeA2LgwMpg5c+Z/rF7AZisyOz09nXH69OkNTExM9f/+/QtiZGQ0BQcikAHGxIDMzMwGcOgzMa0D6qkEuwBXCOMDINeQnQ5gmskyAOj3GIx0API/csjiAkB1ZsCoPI3VAPTowedsqqZEijMTQIABAO7NWyhHRpXVAAAAAElFTkSuQmCC)}.n-menu[data-v-b7f5d871] .n-menu-item .n-menu-item-content--selected .docker{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyZpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuNi1jMTQ1IDc5LjE2MzQ5OSwgMjAxOC8wOC8xMy0xNjo0MDoyMiAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENDIDIwMTkgKFdpbmRvd3MpIiB4bXBNTTpJbnN0YW5jZUlEPSJ4bXAuaWlkOjQ2OUMyQTlEQzA3RjExRUNBRjc0QjI4QkM0QUMxRDBBIiB4bXBNTTpEb2N1bWVudElEPSJ4bXAuZGlkOjQ2OUMyQTlFQzA3RjExRUNBRjc0QjI4QkM0QUMxRDBBIj4gPHhtcE1NOkRlcml2ZWRGcm9tIHN0UmVmOmluc3RhbmNlSUQ9InhtcC5paWQ6NDY5QzJBOUJDMDdGMTFFQ0FGNzRCMjhCQzRBQzFEMEEiIHN0UmVmOmRvY3VtZW50SUQ9InhtcC5kaWQ6NDY5QzJBOUNDMDdGMTFFQ0FGNzRCMjhCQzRBQzFEMEEiLz4gPC9yZGY6RGVzY3JpcHRpb24+IDwvcmRmOlJERj4gPC94OnhtcG1ldGE+IDw/eHBhY2tldCBlbmQ9InIiPz606BQhAAAAn0lEQVR42mL8//8/AyWAiYFCQB8DZs2a9R+EsckxUhoGLPhshVkCxGB2WloaI4ZCZBeA2LgwMpg5c+Z/rF7AZisyOz09nXH69OkNTExM9f/+/QtiZGQ0BQcikAHGxIDMzMwGcOgzMa0D6qkEuwBXCOMDINeQnQ5gmskyAOj3GIx0API/csjiAkB1ZsCoPI3VAPTowedsqqZEijMTQIABAO7NWyhHRpXVAAAAAElFTkSuQmCC)}.n-menu[data-v-b7f5d871] .n-menu-item .n-menu-item-content:hover .docker{background-image:url(data:image/gif;base64,R0lGODlhEAAQAJEDAJmZmSClOpiYmJmZmSH/C05FVFNDQVBFMi4wAwEAAAAh/wtYTVAgRGF0YVhNUDw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuNi1jMTQ1IDc5LjE2MzQ5OSwgMjAxOC8wOC8xMy0xNjo0MDoyMiAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENDIDIwMTkgKFdpbmRvd3MpIiB4bXBNTTpJbnN0YW5jZUlEPSJ4bXAuaWlkOkIzQURGQkRFQzA3RTExRUNBNUIyOUQ0OTNDNTk5MjFEIiB4bXBNTTpEb2N1bWVudElEPSJ4bXAuZGlkOkIzQURGQkRGQzA3RTExRUNBNUIyOUQ0OTNDNTk5MjFEIj4gPHhtcE1NOkRlcml2ZWRGcm9tIHN0UmVmOmluc3RhbmNlSUQ9InhtcC5paWQ6QjNBREZCRENDMDdFMTFFQ0E1QjI5RDQ5M0M1OTkyMUQiIHN0UmVmOmRvY3VtZW50SUQ9InhtcC5kaWQ6QjNBREZCRERDMDdFMTFFQ0E1QjI5RDQ5M0M1OTkyMUQiLz4gPC9yZGY6RGVzY3JpcHRpb24+IDwvcmRmOlJERj4gPC94OnhtcG1ldGE+IDw/eHBhY2tldCBlbmQ9InIiPz4B//79/Pv6+fj39vX08/Lx8O/u7ezr6uno5+bl5OPi4eDf3t3c29rZ2NfW1dTT0tHQz87NzMvKycjHxsXEw8LBwL++vby7urm4t7a1tLOysbCvrq2sq6qpqKempaSjoqGgn56dnJuamZiXlpWUk5KRkI+OjYyLiomIh4aFhIOCgYB/fn18e3p5eHd2dXRzcnFwb25tbGtqaWhnZmVkY2JhYF9eXVxbWllYV1ZVVFNSUVBPTk1MS0pJSEdGRURDQkFAPz49PDs6OTg3NjU0MzIxMC8uLSwrKikoJyYlJCMiISAfHh0cGxoZGBcWFRQTEhEQDw4NDAsKCQgHBgUEAwIBAAAh+QQFHgADACwAAAAAEAAQAAACHZyPqcvtFsKbtII6rgWX+/8d4KgZZJicZTpi7lIAACH5BAUeAAMALAYABQAFAAEAAAIDTGYFACH5BAUeAAMALAMABwAIAAIAAAIFTGZol1YAOw==)}.n-menu[data-v-b7f5d871] .n-menu-item .n-menu-item-content .wp{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAMgAAADIBAMAAABfdrOtAAAAJ1BMVEVHcEyZmZmcnJyZmZmampqZmZmampqfn5+ZmZmZmZmampqZmZmZmZke99ZiAAAADHRSTlMAhSjFRtpoEKDvsPCFVtuwAAAMRklEQVR42r1cS28b1xUmh8OHHguydtLU4YKBnaKuuJDDPtJ2Fkytwi3KBZMWTVFwwQQI2qazYKA4sGstlAdSBOUiqYPYCy4UFG0X5SJxi7gIuDBJURLF+VEVqZk753XvzNCy7kqPmXvuOec7r3vPnVQq/rBfeqbmeCdjXHv3Yj31BMbbzyzmD8f43RtnTOLb//CE8bvXz5JE39OM47MiYz/lGcbLZ6Kc51qecUy+8dgkrKe8yPFy5TFF1fdijOPHEtk7LS/WmPz+MdTR82KO6dKKecuLP6bfXJJGz3viVNISjdq10sm4UJOoFJfAFdP5r57+afjvK699n2k/McYs4g5nnzN3+PalAXGZSe3lW/j9f4rvW2/ipz5JRuMyevl/WkHYf0UPvpBI6UhSH5ge/TmSWXFJhYzb5odzznJq+SMUVeRrFhTZZ3FpFKCH7UQ/n38WvLCbXFi/iffKG4kF9ovwja/iMg94+TTO87nw+S87cYnky+Fb7RjPh48fJ7BgK4xuw+inby3pi4Cvi9R93lnGsHD0GUdJeVs9+gr/55XS3+drmNZ+DB1yMJ5Xr/4wLiNMsvYl5JjH3GcqbU468RiZEYXYF3iYukafGcRiJWTkVfz3N8VQPCWu82YsrWzLwtJnX/frssBMrDiiQZkyI5wLKUOexPCMD+Bfr5vTFCSyjWhbCbidVGTnJ48fQMNvRZl9TtL6G9Ep168l3es8WEOA+fU4iR0I7fmAlX2Nj+txRr4TL318j7Mylb1rhiMjHTNTnbY5K5sikS5jhGZ4+gHiYcDKkUntQCPl+Pn2Z5wVSfVXGSPbSbL6Fxgrf9Nb+0wxbicrHZSDsXw/OdYnjaNlhDUfB+rFqjbqVakkb3kJxy7V7ogRaRF3kHeSEgn9e1njJQNpNXkwjVkAX7yhiGQ18vKxNetQ84/LBgws+YGML4d4nKsJGWlLXpDgyyYMJmXkU1n4OG5miaqSMlKXYdSUwtVoSUaGGoNAf8/3sLS2EzLS1IB12uF/m7CEYim1Ay8JQXwbY6uQkMZMG2XvcZXs+b+6CYkIoWOVKcXCDthO6lCEeG4xpaQx2ZtnQCQQTpGq5KH/az8pkZFA5A5VioswsvDU/6nVPi9d3Kr7BdT38ltbpVKtttiDmtRq10pPb91QJdyhflPjgNinnL/eMRQcGVOORSa1KVEGk6E55RSJuNjhrGrMNpKIbUp817BZVE2F6G1NTgDFNTbsNI0Q2mYdwx7Ie+L/gnTQk171I9cQqYib7VbpktrRvHuttAWnuvJaqdaTfZdVgRnpBBknB3vf4AZdgxfeRVqoQOFt6vChBnxix2DyI6SxIoyKbZ3Rioa9itMI9N6LCOBN4JVn5s01itScIaA4Faj5EQCXr3dLMAOppM3jf6Gy39mFmh8CcPlivQmfHhjShb4+yDv3YOCaAHB94Su7LpRFUt1MUAGLN2eIbL4SStefwNkTKtVg3ONeQ0KeM0E6bYc4qfs2c6ifCLnQgv5fjj+ZHXqv9dMfg1cNEyGkElTA5McJxHL6r0fKMI8DdzjmgVqW/ECrLyeQa19h2IXsungieoZS1KMCGD2czZ+6D625iycqGzLFhlaUyuhCIbUgglvqJ1TjST5qTWdEJ0KewkcmynT3lBL2ebIvZnFpnfu0FcVMEG1sKO1cCAFxIoghS8dlTk2XDnhMQ2YzJMxZpsy6pVFKWinPDl4qwAC6HjERMuyyBt8Z3zaUKnZ9uU0AYpqGuDUyoCKA5Xoou4G/snXIazlqoqEBFU3wzhDWOY98IkNgYKaJJgZUjAD3cNEnRBrQ4BeUp/oAiEKKpeGyHy7G9XHXgPiLnAiFFIKKAPu90N8Gk5cBqxbOLCV43dOjYgrXVQcqHSqxAVwfGuB1YEAFzLDaoUmcEOkCImk+0Y4hpGRFfWUAngMiDjCyNIfQqiGk5ER3UAVEMv7CIJFM9ETQH1iiNbpAryYiRW1+hf1BXyLCJxynPMad531syLpHelQUAXubIEmYikT2DfA60qOiCPTahEoWiRwbAuBQj4oieP6Rlsi6UDkVDOLKCUTc2ETa+qy7qc+620CHMYg09flVUV+L1QHdGERG+vyqktKmRSCzjkNkqJ1oItXqYNcrE0kkSxyqAK+hvhYbQ6cZDWEUUtKGDSGb0Xc9bowz0a2gkGKZtjQHNPHCh00m34VDSouAy9Kg4hFckd5BpsXYVCYI+q4GFZtwBuzqhaBFQFQl4HIrctxqw99x0BLCLzGHLIm+TltGRQVyVheIjCiRojzRaC72poiKCdIRTiSElAjUKxRezTnNkYiKI5UO8ZQIJXctsdxpIblnUUgpozdsotMguUNpap9laiRuVeYimIqo+AIGmGOcpvKEm4WUKpJ7GUWCLMotd4j3CRJuXjqwkJJF4Gohf5BGL7hE2j3fgFARtCP6jxx0BDZ2YBZive8hJ6yKIFTOZUVPaEGXViD+oAW0YJGKTJVzqDBNyz4dNoGsEH/gAknmiJkpBlCJbcsHLy4QSYP4gypwqRkxLZ6/1YL5nFzu7ACR9EmVkgUCqpIVrihQoW0PkBns8fzqINDlxxwVbWgBaNvjiG7gAAwf8okOgx8PeFpUga5hn27goK2oNbHcyYfMrTJ/0FcysTyMYCAksqkmhpS+EkmVRQJXgTFNK0vmb+osM6jQADhjh0YhKkZIDGx7EG90tsSQsqY06DB/sKr+0CBCABudFqpJXDGkFAJ1Wtwf5NQau0SdK0AiaPP5jriDZgdU07xKyQcCyvcIMMHmM95GL3hiSBn4q80KKWbXV1eO6h1uozd4qc9CStdfbVWIBA1/QasEMj5nI+FooyuGlIa/2rLgD9Z8LewQe88JWfEmy7Ka2EMdQfCNMCoOIWakQxp83FQQQ0r6FAi25A9sf4UOUQm2W3RwZokhxTplrCD6g8FCsurFmXRw5gs62CktiyGlteB7RfQH3cVvObI2X+9D8TDzphhSyouJGuLGV2Ox3Cw5FSKHmfhY1hZDShXEHhpSsovlVsnSVvAc5IDZkULKYqK8vPF1mriWiQ2TA2Zyqr2hnSjnif7gNAUP0P0Q9XtMaKJQpGnWhEyU0dTarV0g5bbm0J+0GvTFiYpkPxD4g3I9RPex3BLBGjHuSCFlXl+5mhJ1I9SzOnFkjRh+K96UtZQACD1PG3OgPwARq4K7VDrRzTEwpNBi+0g88j7QNscEAmJtPsdi1xYPKSG6d3FZ/FBoWOrQ2qqT0m/RtoWejLGhYSlokisau37JZvOe0C7xKl41bomgTWQDaZejbOi7qSIHHKznwNgOtyFNNNDvqPtYeUCaKJvmxr4BR4fpeP5Ui4oRubGPtShucAgVDDvqFmJE06KoJu0QVsBaVgxnKWnESJCBPdC0jW6SttE9/TY0DikeaBnOaNpGeQNsi4YU1vZ1gMEVtk51PU2bVZVaxi0yETsagP5gPu1folt5eVOyi1eT4x1qoeZ78ZqSA3mB9uoBmihjaH+04YWVoB1U6pXaYC0ol9FyqoZGzgK8DBL4pAeGtjNwQcWFEHINDX23oe4cXZsnTLXDNc3vYOzrDgNhSHHBPY9tfQcm8OSAldxAQcgSWhOVP/h3mzMid9cp1wsag/6sQkra0Pia/1eKMTKryC10Dc5K6nowUVYisseb4BxTRyG0BHht6GebWnBJ5rbtmdQOoxK6rvO63Ecgt05GX9cJnblwF2IgEWHe6ap02i1bvcCspr23ohG44QpVmEAMo1rjZM2Xxc41io2WpHsxYi1g+kFH1rr5hp5iJdYFPSKs8MKKiRHICr9qiD+JMfmQWlt4zzTiqiGoGIV71VdK7/9k/i/50uRlLx4jkBUv4dX98PpnFCOoVK8noZHkIuv5XMmFsfyTTlwaSS8Xp34JqMSlAT4M8N94nIMYmPzC9ySmjKELiSMxyEfcq+up1J/AS/cjV2Z9BB7/Kj5UYNIQ9TmBd6AjSPKVBxTQp+YPI/S0fQdRA18Fu681S/sj9OAryZzEs9jhxvtYxZfJaLBLmVPhsxsXeqRjqpKQiPABkbv4AyI/YgG/nko80lLqUHtx/imU96VPocyKqSXGWwMvwZgt++mYwZOnkUo9N3jyNM7nk0Hn8/Gj8/mMU+pcPkgVycwZsHE69B8J+/pMv0Umfu7st2dJYuEO/0Bc5vjDs/5w2ymeXyrVFmnq3VrpYhLU/h/p5IdM9pDyYQAAAABJRU5ErkJggg==)}.n-menu[data-v-b7f5d871] .n-menu-item .n-menu-item-content--selected .wp{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAMgAAADICAYAAACtWK6eAAAACXBIWXMAAAsTAAALEwEAmpwYAAAF8WlUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4gPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iQWRvYmUgWE1QIENvcmUgNi4wLWMwMDIgNzkuMTY0NDYwLCAyMDIwLzA1LzEyLTE2OjA0OjE3ICAgICAgICAiPiA8cmRmOlJERiB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiPiA8cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91dD0iIiB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iIHhtbG5zOmRjPSJodHRwOi8vcHVybC5vcmcvZGMvZWxlbWVudHMvMS4xLyIgeG1sbnM6cGhvdG9zaG9wPSJodHRwOi8vbnMuYWRvYmUuY29tL3Bob3Rvc2hvcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RFdnQ9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZUV2ZW50IyIgeG1wOkNyZWF0b3JUb29sPSJBZG9iZSBQaG90b3Nob3AgMjEuMiAoV2luZG93cykiIHhtcDpDcmVhdGVEYXRlPSIyMDI0LTA2LTIxVDE1OjU5OjIwKzA4OjAwIiB4bXA6TW9kaWZ5RGF0ZT0iMjAyNC0wNi0yMVQxNjowNDo1MSswODowMCIgeG1wOk1ldGFkYXRhRGF0ZT0iMjAyNC0wNi0yMVQxNjowNDo1MSswODowMCIgZGM6Zm9ybWF0PSJpbWFnZS9wbmciIHBob3Rvc2hvcDpDb2xvck1vZGU9IjMiIHBob3Rvc2hvcDpJQ0NQcm9maWxlPSJzUkdCIElFQzYxOTY2LTIuMSIgeG1wTU06SW5zdGFuY2VJRD0ieG1wLmlpZDo0ZTZkM2Q0NS05MWE4LWUyNDgtYjM5OC03MjNkMDFmMmVhZjYiIHhtcE1NOkRvY3VtZW50SUQ9ImFkb2JlOmRvY2lkOnBob3Rvc2hvcDphNjQ4NWZiMC0wMTY0LWIxNGUtYmVkYS04MDU3ZjNhN2NiMDYiIHhtcE1NOk9yaWdpbmFsRG9jdW1lbnRJRD0ieG1wLmRpZDozMjRlMWUxMy02ZjcxLTQ1NDEtYWU5My01YTBjODM1ODhkZmQiPiA8eG1wTU06SGlzdG9yeT4gPHJkZjpTZXE+IDxyZGY6bGkgc3RFdnQ6YWN0aW9uPSJjcmVhdGVkIiBzdEV2dDppbnN0YW5jZUlEPSJ4bXAuaWlkOjMyNGUxZTEzLTZmNzEtNDU0MS1hZTkzLTVhMGM4MzU4OGRmZCIgc3RFdnQ6d2hlbj0iMjAyNC0wNi0yMVQxNTo1OToyMCswODowMCIgc3RFdnQ6c29mdHdhcmVBZ2VudD0iQWRvYmUgUGhvdG9zaG9wIDIxLjIgKFdpbmRvd3MpIi8+IDxyZGY6bGkgc3RFdnQ6YWN0aW9uPSJzYXZlZCIgc3RFdnQ6aW5zdGFuY2VJRD0ieG1wLmlpZDo0ZTZkM2Q0NS05MWE4LWUyNDgtYjM5OC03MjNkMDFmMmVhZjYiIHN0RXZ0OndoZW49IjIwMjQtMDYtMjFUMTY6MDQ6NTErMDg6MDAiIHN0RXZ0OnNvZnR3YXJlQWdlbnQ9IkFkb2JlIFBob3Rvc2hvcCAyMS4yIChXaW5kb3dzKSIgc3RFdnQ6Y2hhbmdlZD0iLyIvPiA8L3JkZjpTZXE+IDwveG1wTU06SGlzdG9yeT4gPC9yZGY6RGVzY3JpcHRpb24+IDwvcmRmOlJERj4gPC94OnhtcG1ldGE+IDw/eHBhY2tldCBlbmQ9InIiPz6wXLUsAAAPdElEQVR4nO2d627duA6FuZsBkvd/sb5OgkGS+ZFR4zq+iVwkF2V9QIEzB2gtS1y8SdZ+/P79WyZufAY95xH0nNvxK3sAA/AqX0LY+hPF3vNfA8cwJP9kD6Ag71LHsTzL30L9EJGnpLGUZArknEqCOOOXTMF0MQWyTWR6lMlaMLOWWTGKZ0TwLvG1Axvt/d+zB8LC3SPISOkTkmVkuXUadleB3DlK9LIUy+1SsDt5z2U7dqLjdu3jO0SQmUbhae3j4dOvkQ2nRYyR3zGbln4NG1FGNJ4mjOfsgdyIFlGGE8poKdasL3JpQhmmmB9FIOzC8MjVmWurYbperBN8lba5x8KbfBnF+o9HIfu086w3h2dpKb/pWDmCZAuDtYPzsvH/ZUabVsiXjCYVBZK52CUXWX4KOcO5lGwLVxNIxsJWFcURy3eKnNNy0aRKDRJdayxz+tHJeNcytUkFgURt9n3IfUSxR3v/j4BnrY/aU8IukIgJbJ2nUrmxM61DFtERoxYJaw0SUYjfOVJcZdkR8zRk2gKeUSDeHmUKQ0ebN6/1oSzg2VIsT3G0VGpiwzv1okq5mCKI18RQhu7itNTLKxWmiSQMEaSdvvVgFt++tGLeA4pIki2QV/E5ln73dm00XmlX+hH6zBTLQxyM6ZRnR47pfb3Srmf5spWtM2buZAnEQxwMESM6LdjabMsWTXs2ci7SRJKRYo0kjqy7eI9ooskeF3pNmkhCiRYIWhzRrdv1RdVVyBozujYJF0lkioUWR/ThulGIvmq0pUWoOQxNtyIjSDVx3OEq0sirRpFrFnYhR5RAUEbWTtx60owmuwUeybJu8QR5UjjEcUUYAVIcnt2Z0aPFVbzn4UkKicRbIKgXeBM/cUxhbOM5L0+CK95d185TIEhxeBRkUxjX8KpRXqSASLwEgppQD3GwXRVUgVajoIWCFIlLo8GrzYsQnkcxPoVhw+ObjRfBbAG4OHuvo8pW0AffZtTAgo4mqEgCX2O0QFDiQKZVd2vZRoG+dIFSJEjDQXgUpDg8vzOZfIOMJiiRwKIbsgaxiu1DcOKYwogFWZu8iP3IPMzxo/4hq0EiNwGnOPJAzT1iMxEyFoRAEOEMIY6ZUnGAFIkVs20iBGL9NxBh2evT3YkO1KeyVtsw27e1BrF6C4Q4mH9I5q4g2/QPsdmZqTayCMQavlDdiimOfLxPWL+JLUN4F2XKltkpsHaspjjyibo9xmorajvR/sXs1GqKI5/oewCsz1PZbIaRTXHUJ+uSjPDnagzNEj2sve0pjnyyr1ey2FC37fYam7V1Z+ltv8oURzbZ4hCx74902XCvwVk6CdbJnfsck4alA9plRz0Cybwjde6Q58MQPRrWrtZlW+4RSFb0mOKYbGGxqcu2fFUglk3B0KJqcisstnUpilwViKU41hZVqdfeT0pgKdgvRZErhm8x1LBiauJKxM9Ca7HY2KltXxGIxVC1xVTEDX/WojPqZ5I1tEu9UYb9L+jf8cBSsJ/atufl1RYDjOqYPKT/qPzys+CUH3XpAPVbHezR3Hrid5ezCHKHIrnXyNlFMenj0Ma9dqaZeuaTe+Bic0cCibgSn4HZLZvs2vqRQLTRhbVw3eJd+vPrqN/TQIC8MK+CI9Ha3q6texTpLDm6Z/105dI0r0u3G9EnmyML9eaAevc5XiTo4jith2Tul0fjbVAjn2x+Ev37aW1w0+b3BqEdHMtvdt+BjFQ2uqupcdRaG9y0+ZG9EEMt5FmrsKSynqTb59YAtF6CrbXLYEDpC+xAhSiidY4/npW9gFW6QaxkRcnIjpbGRrXO8cezMgUS8QktQ1Tz9LhZUTL66Elai3ltoFqPrjHENsl3OM4yIpHRXyNIrXP8673WAslOuUbF0wNmRclRbeXX7n8EsvY+IxrQEvbTsFoio39KppH1Y5vr545qQHeA+QiK2TkuDTUqp8yYUIYdfs/5zYySkc4tynb+rNVSIFHp1t6EehoQww7/qDm7SFz6EyXGXz/+hxKkZx7ZgCZ5mGzUapQMnvkqDGmWp6fNbkYg3w2ZTZhstAkkPLfbwdOAKon57hw57qh07nU5kPDc7sZ4OqPsKDnSpu+zCKfBjmxAIr7OaEZJMBaBeB2UmwZUG8YDqGpbtQik96DcSOHXiqcRZUfJiKyk15bUhzoZUyyRsQ1IxHfeq0dJqgjEKpBpQLWxGDmVTV65nWPig+e8Z0dJKiM38Mn8IiMbkDczSoKIulqFKq8UHgNiPgmbQY+d9DpQlVOMut5H+5zRDcizpZ0dJTVOka72ZE6xRHwNiOFaIE+yoyS7bV1iiJdQwnAtkAhf+pkF5TxUEAjlxAHxXIPsNKsHSlukHNQKzzHONGtySAWBeDLTLA5o37+KQEbfzLx7lKS1Q9qBBZL9JZ43LFGyJJUEMvKeSKViGg11dlBJICPfneVdTFdIsyipJBBPZpqVA31WUE0gtN0OA6OmV1feiz4rqCaQauO9QtReRXSUHGIPZkSD0zJ6msVGiWygokCoux6djJpeXaGE7ZUYZCDRBhudhswo2UlVgXh1P1jy5hLpxwFnQizzflUFQt/9uMBetHqXuutylTLvV2aggUSlWXvRqq2Jl5edaVYHlQXiZUAsaVbVtTlzMKWaLNpFYMghqxqQyHF6lfl8BCwOZo1qbrVG1vv3qoV17zTrLL1qjB4lLfTalMrWK3thEb9wzWJA1ddnTan0SuRrAap59+pkp1cNjyg5mi09RvBQXnsiXmnW1fSqMUqUpD+5u8UIAvHaE2FJs0ah5N6VRSC9HmF+tLM/B2dRwiv9QkbJyPXtTeXU0csikF6P4PnRTgUDEtHPgVekR0bJo3fL3hZQR68RUiyRGgZ0Z8raWRv4TH/80aZXDeYoOaL9vIl8CyTqm2XPNqBXtwe1+NY5Zo6SkelVVCv5RcQ+6dm5ZQSezqNk67OT7PTKZKPWwWe//BpWg9uLQr3FI2OUZP8q0mSjy78c9aKeIdKr125Ns1iv3WlYxneUolVNr/5oYSmQ2bHZx8PAtcZTKa1lyzCu8kcLiBdgO4DGZkB7Xi/qJPVVNFGSPb0y22aWwj1Dpdc7jXYQb40mSh5lHWjHmTL/a2Ni9wijYI1ybFFyJP7SwFog2jpE4y08N5dY0j50eoX6+3ug1gTdTdSMS2sDf2kgs4hi7+xsMdOsb47mAt1NTLOV7C6DZ0rHuieCSo9YoqQ3GhvRrv2PZ20JROslNQvm2VrO/v7AK73yxhol0Y5JYyPatf/xLIbFqtYYYEqzsor1o5oA6ZjSbWNPINqBaRbMM4qwdXvQaVGWg4uqCTS2oV3zTZvfm2Ct0WoXzMtTeBnQ2XiZoowG7fiRDklrE9o137R5DwPS5KDVjrkwjZfpNhSkPWnmGN6YOXohrYK1OajXvkh0t2dv3rzGEZ1mRTgHrS1obW/X1o8mN9pLVtsX2ZtUpuhioTfNQkayaFvYXTMv76P1ll65u8eeSI8QvPdkoqJkRHoVuc1wytlLZRSbHgV71J7I3tiz92S0rN+H9ffcLQ7o0MY981fIWRhyog3oCI9i/er7oLy3NrVyc0BXBGIpnrXK9ohcWQYU1WVi2PS1oF1zS/Q4te0rk2opmCzKRne1vA1oL72qbrjtvTzTbctaW2zs1LavLp6lLtB60CpdrTY3DKlhRpS0plcfol9ry/teEuVVgVgW3+JB0V7Lo9MReWnBGRW/psyyrUui7HmAJQxaDLPCsY2qJ3etWNvXlrW12NRlW+5ZQGvK49aK64T1OxEUkScHLPm/ZU2ta3jZlns9XFYxZX32kqg9CbaTxExY1zKs+dMrEGsUsRjNixB8H9BBZnoVIU7LsXKLHVnfrevZmkW0hEar0TwJRiSje/cIcWqe8SG2ovxV+dxGt+1meDlrjowQifd73+V78R6s4hBJOLKjNRRr0cwgktHxjJK9/zZCHFabUdmsxZNaDdTaibCKZHQv7xkle/5thDistqK2E8skMoRLxkgyuvB6QIhDxG4r6jFYvUx2qiXy9fIZx6Qr4CHWq+nVm2DEkZJaNRBh2OrBEYv4IjqRoIu+0QUncv0EOOIsHeKcl4l/rP+AfHkJ64u8i93btAXJTHEYP4xCzG0PqFMPiCaD+b2zP5Ns/BJc1yXzW2pGkMX6mfNBiiM7/RcBDGIJYm8ClaI85Pp4UHMwutCOeBOcOKybgSLAxk32PUZrngUnkieJPQnMfHIXId69dXkI7tudV8F1NyGgFxVhkEiRiFyLJqO3ZhHrvDbcD8GfskaIA+oUPbweo0i8o8nd0quHYAt/SnGI5N1dewW0SES+JnCvHWx5FnN61bBEyTY3yFpj+W8jxOGyYey1sCjv4iGSF9leZMYWLQttztD3BKDEIeLUyvb0fChP4yESka/xIcZYKb1iGitSHG7ps3dqgBSJ1+IuhaJ5RoX0qsEy1ncpIA6RmAlDvQByM3ELdOE52QaxCdhwb+NHeRSkSJhaskxjuUpmmvUphcQhEhtykTclVjRMFrLSLOSaef2WzA8iJ0t74naPT7nH6Vk0Ycb1P6+CF0fYrZuI07w9vAi2e/EsX5Nf4XK5LFAfLWlAR/pQcYjkhFt0JBHJS7keqz8MtCMg7U+GONBRQyRBHCK5PyPsIZLsPv9aMD2nijWsxcDQiUO2cBsp4hCJT7GWoNMtke8uV9qEbpBtsFGg17KRupaZAhHx+wpw1iaxeKW46evHsrPqNREMadfIvMvA4hDhEYiI34S0tGu2hHG0Irzi75F0wSQQEd+JaWnXRE8ThufJZxpxiOTXIFs8BHteZ00TCdVCFMDbuWTu1+zCFkEaEd+Tf8pMvc5oEcNbHAzt6U0YI8iSh/gvTku9KD1YEp4RfA11JGeNIEu8N9sarZi/a52yjBYRdoG+9MEF9gjSaJ49yniXz6FfRCMZDqHMnFaIIEuiosmSTxkvsmS9U4mosaRKBFkSHU2WLJ9ZqWaJrCn2KCWMRvakWciIJkuWNQtTR2xZS0TWFHuUixpLKkaQJZnRZIu9zUiPaMMQFc4oK4xGdYE02kKwCGUN27f03pQXRoPdA/VydHPixB+PmxdTGU0gIt+3AE6hxNGEwfINDowRBdJoQmH7kc+RGFYYjZEF0mjnumZEwTG8MBqjFOlXWC7mnQpmJEPVF1e4QwTZIuJChVFYXgxxO+4UQbZY7k1U2FeIotIpAVfuLpAldxfLFMUGUyDb3EUsUxQnTIGcszagyoKZguik6kJn0trG7Q9z+7i1Y1luXSzHjCB2jvYCotrJt+wwRfAfh0sXFwlSq58AAAAASUVORK5CYII=)}.n-menu[data-v-b7f5d871] .n-menu-item .n-menu-item-content:hover .wp{background-image:url(data:image/gif;base64,R0lGODlhKAAoAPYUAP///15eXmxsbJaWlnV1dYCAgIeHh5CQkJWVlZaXl5iZmZmampqbm5ydnZ2enqWmptDQ0NHR0dzc3Pj4+BEREaWlpTZGOpmZmXl5eRUpGSCGNCCKNXJycp2dnbGxsSKUOCGcOV9fX56eno+PjyKTOCCiOZubm6KiotTU1P7+/qmpqSCjOZqamjlsQ3Z2diY2KS2CPYSEhIiIiCCkOiCjOiRQLSKSOCGfOiiQPC2GPmBgYGZmZnFxcaysrAEBARsrHiJiLiGVNyGiOiOcOyaVPE9fUmFhYWlpaaCgoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH/C05FVFNDQVBFMi4wAwEAAAAh+QQFCgAUACwAAAAAKAAoAAAF/yAljmSJAGiKImXrvhSkzjME3+NEA9LzSLsJ7jUbFoc5FXKkEhpTr0Yi0SBCb0rSdMvdlrIuHUrbLXNJKWfrKjK7vczxWk4hvO9fukg8CtzfLihqFGx/bgWBdBF6JVMwWwtWESJsZGeWcCMClHJ0BpiZFAddmyMJcRQDdKegrKZdWnGqclKNXQetVW0MnFmhZiQCZa+9KBJtjq22l8KsQCkPyK7SWw7KFHAPKtHYv7DLydkqx93Jr6HUpw5wz1dcn+eO0+/lrDQiDJfUFOvL0ropZsXzNwXXOQoKMqEYQAhAvHkJPnmzpq+TnGbmEJ5KmBGbtFJXFjncF+tbm3pxJl31GjiCQL155eKM3EPHT8dhtgLEGdRwpp2IrSC6XDlnZregsWS+EGPUlRuDOmXyRFPpoT6ZRhMxGrGOipWtYcAgabKkWFatYIcwHeejHdmyLUTumKESLoxZNBguCQEAIfkEBQoAAQAsAAAAACgAKAAABdlgII5kCZTjia6s2bpvrJpAvc5xru8kzsO/1WV4CfKIyKTRJ0o6lShm60klGpvVrM6X1bKko251GxtOrS0wyVlir3PFsBsLbUbb7Todbe/l83pPci98AYJydWZ3hoqIhYxIdCI4Ko+He4polHtrepiSAZuQcY6kpaOTQpGnpkqrLIFWjaCvqZ2zkLmIqH6As7K/ZrWwtcKWnIuOeIG8KWe/o626X76+uNO2zxbb204V3BaPRxfgT+U8UuTd5tw3RhThVBZXOsP0auj0+j9SNTbJV/D12ufM3Y4QACH5BAUKAAAALAsAGwASAAcAAAUk4CaKwAac5WhunUqiqRqLGDxv2m0DnHz6NuBo9xuiMiZiCRUCACH5BAUKAAAALAoAGQAUAAkAAAYyQJBQCAAQi8MjyDhELp1NYnL5hEqLnmnVemQOA8WwVpwMh0Nlc9rs3XrZ5G6Y4jZ/zEEAIfkEBQoAAAAsCgARABwAEQAABlVAgHBILBqNqaNyOUQxn8YTdCqUUqHO6zNV6paIXYA3LCQXx9+ySDwelkxHdDnN9paXbba7bTbK6XVhgEYjaIOGT4hgckyMi3ZQeWeQiX2Pg41LJFBBACH5BAUKAAEALAkAEQAdABEAAAZbwIBwSCwaj4CjcklMMp9GJ3QaAKyu1yIWq20VrVvilbVdiaNk7jBbXpuPbeHKE4jXVcp4Vh6uM/t7dWGBcINihkwuZW9ufX92fI5LkJGEj5aVVGpGklCMRh9QQQAh+QQFCgAAACwIABIAGQALAAAGMcCVUAgoGodEY1H4Qq6US2QMSnRCAc6nMnntegGwr1IlNorK6LJMPEi73/A4VCA3BgEAIfkEBQoAAAAsBgAPABsAEwAABmtA2mw4BBiPxOLRmAQkZ0tjrhm9EZ1JVhR7jXafW7B3VmNSl0/dGJkdn83oN7eLxMXp2J6YGa28i3tKd4IzPHNQTBhhVISMW2ZKjVeCboCDUIiPO0+ZkHiLcpyPbJ+Ho4OPcqmUqKdopzaPQQAh+QQFMgAAACwGAAkAGwAZAAAHX4AAgoOEhYYARTM+h4yNM4+NkYSPlIKUlQCXmkWCNJqZl4WaM6KjlEiFFZ+Tq5Kur0OXLKKNKq+3uIRAuYJCuCK8wY1EuCO4HrLCrkeRzMrP0NEARtLV1tfYhz+RQYeBADs=)}.n-menu[data-v-b7f5d871] .n-menu-item .n-menu-item-content .monitor{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAK6wAACusBgosNWgAAABx0RVh0U29mdHdhcmUAQWRvYmUgRmlyZXdvcmtzIENTNui8sowAAAF5SURBVDiNpdM9ixNRFMbx3yRZ3/ANbCxEcBubpNJSLIQFaxs7D4JfQSz9CpYWItyPYCOIFtqvhQxopSyCb1gpEuNukrHImewQY7UHLsOce85z/vPMvVXTNA4SAyilfMI2Zpn/n2rV6RtGxOYgE9sITLK5Qa8jVGGezwpH8VgWwRTjiJigj6vYwrVcW5nrZ824pW0Jeh0xSVJhr4M86ez32/qBf6OH04nZCmzk1HbI0qN1AhO8zuYfOJ5i8xWKZq1AREzxpZRyAlfwJiI+r5RVrUCLNOvgtnER93FpDeV0laBnYcwMSimHcQpP7Z+V2xZelA7FkuA8opRyK9/P4gIeYq+Ucj2/fwM3Lc7Mua7AVzzH91LKHZxBExE/s/EudiwOz0u8wLeuwDgidvAMf3APr3LvHR7gfUT8joiPw+HwQwqrmqZRSnmSWL9wEpt4a/Hr5qPRaLeu60OdgcfwKCJutCZeTnNmuXZxpDWqruvG/j1o0vDhkuAg8RdE7nuSY6nc+gAAAABJRU5ErkJggg==)}.n-menu[data-v-b7f5d871] .n-menu-item .n-menu-item-content--selected .monitor{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAKwwAACsMBNCkkqwAAABx0RVh0U29mdHdhcmUAQWRvYmUgRmlyZXdvcmtzIENTNui8sowAAAFaSURBVDiNpdM7a5RREAbg59uLJOgSkRQhfYSIhWWsQgj+gfgLTJEmBJLa0tZW0MbawtbaUkQEQ8Q/YCWIIAqb7G1S7JzNYdlUOfAxlzPznndevmkiwk1OJ+03nGKMBpNr6lsIdLGBrQJwimP05wCatFEBTHAHL2sGY/zHEMt4jBWMKqZ/8RkXVc8MoJX+MF8bJJth3nczV5i0s2cGUJ82eslgkLlbOU57vngRwAA/sqmftp35AhiFzSKAIX6mv4+3C2pa887YlTjlPMAJtjNeMtVC1k5qgA5Wa2Q8xQvsZnyI51jD3cK+jLCOA/xLyn1TET/m3U4+0M+xRpmfAfzGBzzBM/zB17Rf8B57+ISHpsI+AhEhIt6kbSLiKCLOImIzc72IOIyIbsblex0RMwZLuGf6t73Dd/zK/AVepYDLKV4v7zS5jfUyjXCO25Wok/TLnnRwH1vNTdf5EpkVg1v2kuagAAAAAElFTkSuQmCC)}.n-menu[data-v-b7f5d871] .n-menu-item .n-menu-item-content:hover .monitor{background-image:url(data:image/gif;base64,R0lGODlhEAAQAPcAAOTk5N/f38bUxsnQycTTxMfOx8XLxcPKw8bKxsfHx8TIxMbGxsXGxcXFxcfFx8PGw8TExMXExcbCxsfCx8PDw8PEw8PCw8PBw8HBwcW/xcHAwb7AvsK/whzVHBzTHCDOICLLIjC2MDO0MzOzMzKzMjWxNTOyMzWvNTavNjirOE2hTTqpOjunOzylPEmhSUqgSjqlOoaGhj+iPz6iPoSEhD6hPj6fPj+fP4ODg0CfQDqhOoKCgkGcQUObQ4CAgEWXRUaWRkWWRUqQSkiSSEiRSEyNTFuHW3p6eluGW3l5eU6KTliFWE6JTk2JTVaFVlWFVWB/YFGGUXV1dVGEUVWAVVSAVHRzdHNzc3FxcVV9VXZvdlp4Wm9vb2hyaGF0YVt2W1x1XFx0XGFyYWNwY15yXl1zXWtra15xXmNtY2FuYWpqamBvYG1obWJtYmlpaWJsYmhpaGNqY2hoaGJrYmRqZGRpZGdnZ2VpZWVoZWRoZGZmZmVnZWdlZ2VlZWdkZ2djZ2hjaGxdbG9ab2ZmZgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH/C05FVFNDQVBFMi4wAwEAAAAh+QQFCACDACwAAAEADwAOAAAIhgAHAUgAYcGCBggbGISQIMCgBlwG9dFjp6IdPX0GYaEwCMKgQWqO4NixA8cRNR89LvjoJglJkkncpBy0EqSPGDRoxPCBsiPNj3KwSLlyRQoWOTNrflzK1GeDplAHcWQQtWmFQQOqMi0wCIHWpQoGWfj6cSzEQXC63IG6UWCCBhA2KDS4sGFAACH5BAUIAIMALAIACQACAAMAAAgJAMUMcsHjSZSAACH5BAUIAIMALAMACgADAAQAAAgQAGGUGbSCxaBBJ4IM8gIlIAAh+QQFCACDACwEAAoAAwAEAAAIEAAHhTkzKAeVFiCoDDIyKCAAIfkEBQgAgwAsBQAIAAMABAAACBAABzFJM6jElj0pwAwaMiggACH5BAUIAIMALAYABwADAAUAAAgSAAfpGFSlQ5FBQEIMGpRiYZiAACH5BAUIAIMALAgACQADAAQAAAgQAAcN2jJIiIwpHogMujEoIAAh+QQFCACDACwJAAcABQAFAAAIGQAHCRw4kI2gHiK+iBlEwoQNFYOaBMqyJCAAIfkECTIAgwAsAAABAA8ADgAACBkABwkcSLCgwYMIEypcyLChw4cQI0qcSDEgADs=)}.n-menu[data-v-b7f5d871] .n-menu-item .n-menu-item-content .security{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAK6wAACusBgosNWgAAABx0RVh0U29mdHdhcmUAQWRvYmUgRmlyZXdvcmtzIENTNui8sowAAAG0SURBVDiNhdNPiI5RFAbw352ZsGBDMhkpYyE12cxOyYIFayW7SY2zkCxIlkrZKIrJjPe+X1FksrQQo/xp2IhZiPXUxIoaGxa+mGsx78dn+vDUvXVu53l6znO6qZSig6mpqbX9/f37cRB7sDOl1C6lzOIZHkXEK11IpRR1Xe8upRzFKNqYxzt8xGpsxy6swwCeYjIi5gcaoTt4i8BcRBQ90Gq11i8tLY3gCjZibABKKUu4FxGvexE7GB8fX8RsVVVPUkqDGjtQGqv/RM75CJ6nlH6gT+dCwvf/kE9hGlvwrZfAqrqu+3LOQz3Ix3EJpyPipeUwdQt8RbuUshkLjdUOeQzXcD4iLnfptvmdwXtsjYgPOefrmM45f0Y/buJiRJzrIm+wvOJfDl5gBCLiBFp4iPuYiIizK6YaSim96Ra4jeGc86ZG5BhyQz65Io9hDJZSZkApRSlFVVUTVVXd7dR/O1VVPaiq6mqn7jiQUjqD0Zxzd1B/IOc8iW1N7zKv+zM1I8zgE8YjYqF534EbTegHImKxp0DTnHABh3ALa3AY0ys20Vugg7qu95ZSHuML9kXEXK++ny1tzgEddf2OAAAAAElFTkSuQmCC)}.n-menu[data-v-b7f5d871] .n-menu-item .n-menu-item-content--selected .security{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAKdQAACnUBSiXd/QAAABx0RVh0U29mdHdhcmUAQWRvYmUgRmlyZXdvcmtzIENTNui8sowAAAFrSURBVDiNhdMvaJZRGAXw36viFrRoENxw4IJYLDMJalkxC8OkrC5qNAwEi+CC4lAsikGMY0FQmGIQ/AMKyjDIUGYyqMXgmB7Dd9/P63j37cAN73OfczjPc+7bJFFhFyZxCsdxGGt4hqd4hFc1oSkCxzCNiUJYwXt8xRDGcQS7sQNPMI8VSST5lGQxydEkTal1nT1JTiR5k+RuEtuKkz9YwGv8N9MGfCvjLBUnfYEUq1vhDEbwu+W2Ag3WtyCfx32M4leXwM7yPdJBnsFVXMALvWWqBX7qbX8/PherLc7hBi5hrqqvURaBVRzAF9wsVr9jO+7gCmYr8l69iLXxXEyyUMV1O/9wrSPOpSRnk/QFxpK8S7Kvarq1CflgkuW2t764nuTBgEfUnoe1cH0xnORjkrkB5PkkH5IMdQkott4meVzGauuHkjxP8rI85z6n/ZlqNLiM07iHYUyVZGY3Ng+a9WSS9SQ/kkxs1vcXeVqZSyUF+yoAAAAASUVORK5CYII=)}.n-menu[data-v-b7f5d871] .n-menu-item .n-menu-item-content:hover .security{background-image:url(data:image/gif;base64,R0lGODlhEAAQANUAAP////39/fv7+/f39+3t7evr6+np6efn5+Xl5ePj4+Hh4d/f393d3dnZ2dfX19XV1dHR0cvLy8nJycfHx8PDw8HBwb+/v729vbu7u7m5ube3t7W1tbOzs7Gxsa+vr6enp6WlpaOjo5+fnwDZNpeXl42NjYuLi4mJiSitSCqpSiypSoeHhyirSC6lTIWFhTKhTjiZUDyXUnx8fECRVEKPVHp6enh4eEqHWEiHWHR0dFB+XHBwcFpyYGZmZgAAAAAAACH/C05FVFNDQVBFMi4wAwEAAAAh+QQFAwA9ACwAAAAADwAQAAAGdMCesEeiHAACR2c17J0oiUXEE/pgHAsFptYjQFzN4c6UmPQKoXAYIzl/1M1M5AyCDzdzwtveu8wRdXwXbQ8afD0SGD0dEIcNIj01CDl2NQeUPRZzcA8WTQWKYRUGYTkJDlw9MgwLO3AaBh0bBhyHJQEDYE1BACH5BAUEAD0ALAMABgACAAMAAAYHwB6PN+qlggAh+QQFBAA9ACwFAAcAAQADAAAGBUDaCBUEACH5BAUIAD0ALAYACAACAAMAAAYHwBtuNGKpggAh+QQFCAA9ACwIAAcAAQADAAAGBcDZSBUEACH5BAUIAD0ALAkABgABAAMAAAYFwNioFQQAIfkEBQgAPQAsCgAFAAEAAwAABgVA2OgVBAAh+QQFBgA9ACwLAAQAAgADAAAGB0Aab6SD9YIAIfkECTIAPQAsAAAAAA8AEAAABhXAnnBILBqPyKRyyWw6n9CodEqtJoMAOw==)}.n-menu[data-v-b7f5d871] .n-menu-item .n-menu-item-content .waf{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAABx0RVh0U29mdHdhcmUAQWRvYmUgRmlyZXdvcmtzIENTNui8sowAAAGTSURBVDiNpZNBaxNBGIaf3RkSSEkJLmYIybYyETRG6CEwELAevAheBH9CKRVksHdPgRxzacBDwT/hT8hBydEK0aqHXFI9BCKBaEJSttuDadjgtpj63uab733ebz4YJwxD4tRsNm+k0+nXWmuRSqVeGGMGcX2iVqstDkopx/O8Xcdxbna73Tuu675SSt0NguBjq9XamEwmj3zf/wAsUp0wDGk0GjvFYvFeoVB42263D33fT/b7/RNgu1wuI6VsD4fDnOd5p51O53kul3uazWa/VCqVNxIgkUgcDAYDORqNHgMbvV4vLYS4LaW8CHqQyWQAfmutD4Fbs9nsDPgDEEL8nE6nm+Px+L4QInYnAEEQrCWTydLc8wPAnd+58+Kl5hjJvwArSkSNK0VHQ/9ngiXA2jUA61HAp2sAOlHAM+DzCuZj4MkCYK39DuwBo38w/wL2jDEn0Qmw1r4HHgJfrzB/E0JsV6vVdxeFpe1ba4+ALcCy/KRj4CWwZYw5inqcy75zvV5fz+fzB1proZTaL5VKw7i+cyFObUDzXeUJAAAAAElFTkSuQmCC)}.n-menu[data-v-b7f5d871] .n-menu-item .n-menu-item-content--selected .waf{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAABx0RVh0U29mdHdhcmUAQWRvYmUgRmlyZXdvcmtzIENTNui8sowAAAGTSURBVDiNpZNBaxNBGIaf3RkSSEkJLmYIybYyETRG6CEwELAevAheBH9CKRVksHdPgRxzacBDwT/hT8hBydEK0aqHXFI9BCKBaEJSttuDadjgtpj63uab733ebz4YJwxD4tRsNm+k0+nXWmuRSqVeGGMGcX2iVqstDkopx/O8Xcdxbna73Tuu675SSt0NguBjq9XamEwmj3zf/wAsUp0wDGk0GjvFYvFeoVB42263D33fT/b7/RNgu1wuI6VsD4fDnOd5p51O53kul3uazWa/VCqVNxIgkUgcDAYDORqNHgMbvV4vLYS4LaW8CHqQyWQAfmutD4Fbs9nsDPgDEEL8nE6nm+Px+L4QInYnAEEQrCWTydLc8wPAnd+58+Kl5hjJvwArSkSNK0VHQ/9ngiXA2jUA61HAp2sAOlHAM+DzCuZj4MkCYK39DuwBo38w/wL2jDEn0Qmw1r4HHgJfrzB/E0JsV6vVdxeFpe1ba4+ALcCy/KRj4CWwZYw5inqcy75zvV5fz+fzB1proZTaL5VKw7i+cyFObUDzXeUJAAAAAElFTkSuQmCC)}.n-menu[data-v-b7f5d871] .n-menu-item .n-menu-item-content:hover .waf{background-image:url(data:image/gif;base64,R0lGODlhEAAQAPcAAMbGxsLCwrLGsr6+vrLCsrq6uq6+rqLCop7Cnqq6qqa6pp68npq+mrKysqq2qpq6mo6+joq+ipq2mq6urqKyooq6ipa2loa6hqKuonm+eYq2ip6unnW+dZKyknm6eZKukoa0hqampnW6dZqqmoKygnm2eXW1daKiooauhnG2cY6qjoKugmW6ZZamlmm2aWG6YYqmimW2ZXWudWG2YWmyaXGucVG6UX2ofZqamlW2VXGqcXmmeWWvZVG2UY6ejk22TVmyWVWyVWWqZZaWloKeglGyUXGmcVmuWUW2RW2mbWGqYVWuVUmySUG2QV2qXT22PVmqWYqWipKSkkWyRUmuSYaWhnGecWWiZVGqUT2yPY6Ojk2oTYaShnmWeVmiWYKSgkGqQWmaaX2SfXGWcW2WbYqKioKOgnmSeXWSdWmWaX2OfUGmQVmcWWGYYXGScU2eTX2KfYaGhmmSaV2WXWWSZXGOcXGKcVGWUYKCgl2SXXmGeWWOZU2WTVmSWW2KbUGaQVWSVUmWST2aPWWKZXWCdU2STW2GbWGKYVmOWUGWQVWOVX19fUmSST2WPTGaMW2CbVmKWWGGYU2OTWWEZUmOSUGSQXV9dVGKUUWORXl5eTGWMT2SPU2KTTmSOS2WLWGCYUGOQVWGVV2CXTWSNUmKSWl9aUWKRTGSMVGGUXF5cT2OPVmCWUGKQXV1dS2SLTmOOWF9YW15bUmGSVGCUWV5ZVWAVVl9WWl1aXFxcW1zbV15XWV1ZWF1YVl5WWlxaW1tbWVxZU11TVltWVFwUVVtVWVlZV1pXUFxQU1tTWFlYVVpVUVvRUltSVllWU1pTVFnUV1hXVVhVUllSV1dXVlfWT1pPU1hTUVlRUlhSUFlQUVhRVFdUU1dTUldSVVZVUFfQVFYUUVdRVVVVU1ZTUlZSU1VTUFYQVFRUUVXRUlVSU1RTT1VPU1NTUVRRUFRQUlOST1RPUFNQUlJSUVJRUFJQUVFRTlHOT1FPUFBQT1BPTlBOT09PTk9OTU9NTk5OTMzMyH/C05FVFNDQVBFMi4wAwEAAAAh+QQFCgD/ACwAAAAADwAQAAAIigD/CRzoL5OUfQMTCpw27ZyUAcXO/UoorpU4PDgWDQlwIkQDdotw/SszREsZKVI2AgAQIESBAP/ioJypcuXKAiNnoqxpc0BOnTxX+jwJNIBNoT9pGj0KU4vOlEuP/lv0NCiACf/24Sl6dEI9gfKc7ow6QFzCejKhrmxwTuFCPBsniHSbsFUZhAkDAgAh+QQFCgD/ACwAAAAAAQABAAAIBAD/BQQAIfkEBQoA/wAsAAAAAA8AEAAACHUA/wkc+C8VF4IICVYxkJAgIR+EFrZoQeGfJYFqophR84VLFAMCBBAYkYAhHC4duXgEGTJkgn8nVar82NIlTJkzWbY0iXNlTQE8cdKsydBMz6E1/xE6qjMkBoF6hDZ9OtBozp0Jo/oUULHhPz0fqXoVGMtMwoAAIfkEBQoA/wAsAAAAAA8AEAAACHQA/wkc+K+UGIIICXZhkFBgqX+GiDxaCANGh3+PBNbpgqYOGjQLEYhUYYGhnY8oQ4oU+eDfSZQgGaxk+c8jTJUrGdpMKXPmgpowY85E8DOo0JkHMAbFKfKDQEM3ezYluBMnQ4R+Pqq82BDiQqddBfqjdSZhQAAh+QQFCgD/ACwAAAAADwAQAAAIeAD/CRz479MYgggJprmQUOCnf5GsRFp4YweJf5ME7iEjZw8dOQsjiLxxIcK/QXI+ygFZUqRIDf/2rJwZ0mWECjFnrqzpEqdMnTxF+tTJ0qbIfypptnQJASLRoBEu/jsEdGmEFQST8sSJEGXRqA0FHlqINSxBNwkDAgAh+QQFCgD/ACwAAAAADwAQAAAIcAD/CRz4b1UYgggJzhGRkGCoK5AW6kgiQ6Cuf4jmzEEEqM8cDhlC1kjBEFGfjn08ggwZsgTGlDA/sgzp4SVMlTMz1DR5U+bMnTdx/vwXVOjMf5CC+mRZEWnPlSGbCnzKsibCpEKlJozIQWvDgmkSBgQAIfkEBQoA/wAsAAAAAA8AEAAACHEA/wkc+A9VG4IICfJ5kVBgqH+cvFxaKMQJjX+QBFLic4cSI0YLWYhUMoPFP0kfU4YUKdLFyZQfV7KM8RKmTJY1Vb5giROlzZ08TRaCCRIoT4hEb7K4mLMoTx4Eh8Y0ahKhz5VQG55cyMOW1oGzDiIMCAAh+QQFCgD/ACwAAAAADwAQAAAIdAD/CRz4jxQbgggJNuqRkCCrLZga2YCCBQhBVX8Cqeq0qdEPGyCX9GAIahPHTR0/ggSZ418llDA9rmTpEiZKmTNb2rypcmXLlzZxzvy3M+VMkP8w7RQK0uK/kjF72nAqMGhPhgih4gzSUCAoj1S7/pN1EGFAACH5BAUKAP8ALAAAAAAPABAAAAhvAP8JHPgP1BuCCAlqepJQIKV/r9ao8vRkCxgm/woJPOVI0ClXrig+edJkCsl/o0CqFDlyJBKUKkGybPkyZcyZLmHebNmyyb+PO3meBLpS6EiIMUMaxYi0KE+mG52O9InQJkuoCV9RxNrwH6uDCAMCACH5BAUKAP8ALAAAAAABAAEAAAgEAP8FBAAh+QQFCgD/ACwAAAAADwAQAAAIeQD/CRz4jxQbgggJNuqRUOClf6y2YGpkAwoWIP8UCVT1J5CqTpsa/bBBckkPhqA2gdwUciRJkjn+VWJJU+RLmDJpsrR5M6bOnS5fxpypk+fNfz9b3iT5D9NPoyQx/ktZM6gNqQKLBmWIkCrPIA0FghKJNew/WQcRBgQAIfkEBQoA/wAsAAAAAA8AEAAACGwA/wkc+A9VG4IICfJ5kZAgJy+XFgpxQoMgJT53KDFitJCFRyUzWPyTtLFkR48eXYwsufEkyhgrWbpEGdPkC5Q0Scq8iVNkIZYceeL8xwnoTBYVawbFyYPgz5ZCRSLUebJpw5ELrV4VOOsgwoAAIfkEBQoA/wAsAAAAAA8AEAAACHcA/wkc+G9VGIIICc4RkVCgqH+hrkBaqCOJjH+HBCKaMwcRoD5zOGQYWSMFQ0R9PvYBKXLkyBL/UK5cGdLlSA8xZ9Js6RKnzJk1bfrUydJmBpxEixr9B4loUJcXmep8miGqwKk8cSJsqtRqwokcZMBqSHBVmoQBAQAh+QQFCgD/ACwAAAAADwAQAAAIcwD/CRz479MYgggJprmQkGAkK5EW3thBQiCtf3vIyNlDR87CCCBvXIjwb5CcjnI8jgQJUgPGlDA/soxQ4SVMlTNp2oy5kmXNPTdx5vyHkmdOCP8iBZXJsuK/QzeZRlhBsCjTmghNCnXa8NBCqg0JwnKTMCAAIfkECQoA/wAsAAAAAA8AEAAACHIA/wkc+K+UGIIICXZhkFBgqX+GiDxaCANGh3+PBNbpgqYOGjQLEYhUYYGhnY8oQ4oU+eDfSZQgGaxk+c8jTJUrGdpMKXPmgpowY85E8DOo0JkHMAbFKfKDQEM3ezYluBMnQ4R+Pqq82BDiQqddCZ5JGBAAIfkEBQoA/wAsAAAAAA8AEAAACIsA/wkcyC8Vl3wDEwqkBq1cFQPJwPlKCC6VN0I+CD1s0YLCO0u5/qmJYkbNFy5RDAgQQGBEAgP/4HA5yQWlypUrE8SsyTMlzpw7edr8KQCmTKE+fxoVOlTpPzNMk/78RyjqTZwY/uXTg/SqAAz1BL6DWlOqAW8J53FtSkGdwoV6UmII+TZhLDP7FAYEACH5BAkKAP8ALAAAAAAPABAAAAh1AP8JHPgvkxSCCAlKGZCQIB4ci4YEOBGiwb9FAssM0VJGihSJAAAECFEgwL84HlOCDBmywL+OKT8GYBmSIUyVM2najCmTJoCdMVeyNKmFp1CWF43mZDlBIJ6gSwE0HVjUo1CGCFH2BGCx4T88Eqd6FdiqTMKAADs=)}.n-menu[data-v-b7f5d871] .n-menu-item .n-menu-item-content .mail{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAYAAACqaXHeAAAAAXNSR0IArs4c6QAAAt9JREFUeF7tm21yqyAUQMVsJF1J25W0+RPjKpquwtE/7VtJ81bSdiFIvY5mCAMKeImAOJPpZFTCOV6Qj1uSbfwgG+fPkoAUARs3kJrAxgMgdYKpCaQmIDHQNM1rTGIopT9ZlsEnK8uy/zse1yZQVdXTbrd7Y4w9xQQvsjDGPhlj76OIXgA8ccbYR8zgAttP27bPIIFUVbXP8/ybvwAsxSYjz/M9H92EkMvxeHwmdV2/dbBnAfhcFMV7TBKapvkSmzdEAZGdGMCjkaBiJIQcIALYAAy9I4Q+Hw3BS5DAA1/PCE39RkBRFA+SJhGsBBEeQh7A8zz/UgqAEzFIkMGXZXmB1/2sgNAlqOCBS1tAqBKm4I0FhCZhDt5KQCgSdOCtBfguQRd+kQBfJZjALxbgmwRTeBQBvkiwgUcTsLYEW3hUAWtJWAKPLuDeEpbCOxFwLwkY8M4EuJaABe9UgCsJmPDOBWBLwIa/iwDF8pPxogpWOQDNH0bTYfHmue8T64twq7YErHJk9XUmQBau3crLI4BzFZmVgFWO6mE5ETDVVk2W17DKmYpUdAE6HZVMQtu2//h9OttyTPcvUAXoVHp8GqIE2JnpNirgsyeE3GzGDttWF9mTNIkop32ACbxKgqyCU/AT5cz2LeO9KBFgAy9UADZi97wAiAhK6UHcvla1Z9tIWCxgCbzkffzYbU/9UkovuuB8GTYSFgnAgp8bT5icN5VgLcBHeJs+wUqAz/CmEowFhABvIsFIQEjwuhK0BYQIryNBS0DI8HMSZgXEAD8loRtp/hfzAyBDrB+VDePza56gzrDU5J29xrWKOcjIeFYmScUArzEHOUvT5GKCn5LQTckf+kzRuq6vzYAL05uc2jXCF/k3byZfXdn9DLIXMGSLQuaUeBFyHfwoDtLjTqfToe/3+CoNWeIvsEgRo4whURpWoq6LLekfJvwIyvVqkSJgPfd+/HKKAD+ew3q12HwE/AEtrqA+boGrjQAAAABJRU5ErkJggg==)}.n-menu[data-v-b7f5d871] .n-menu-item .n-menu-item-content--selected .mail{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAYAAACqaXHeAAAAAXNSR0IArs4c6QAAArZJREFUeF7tmwFy2yAQRXdv0pwk8UkanyTOSeqepO5J0p6E+GtEBhMECwIJEMx4PB5LMu+xgLRgpoMXPjg/DQEjAg5uYHSBgwfAGARHFxhdwGFAKfXamZh/RIQXMfP0rstXF1BKvRDRGxHhvedyvXt41yImAXOL/+qZ2mJDFJwggZVSP4jowzoAlnor4DSj+8bMJwhA2F8s2gszv/dkQCn1x9G9JwGuL8DejQQP4xkC1NzS6BcIfTMampfggAefZrw+CGDmJ0eXaFaCA/40NzaiHuW7gHlWsMeF5iS44Jn5Nk/3fgGtS1iCn7kwE4QFtCrBBx8toDUJIfgkAa1IkMAnC6hdghR+lYBaJcTArxZQm4RY+CwCapGQAp9NwN4SUuGzCthLwhr47AK2lrAWvoiArSTkgC8moLSEXPBFBZSSkBO+uIDcEnLDbyXAlWKLzicspLGirwNos4jzAfaJks+e3BtOF1c+13VcdS4mYCH99AxwoyJBCbmus9RgRQQEMjDi9Fqu6/iiNbsAyUDlSrQS0W9znS71OrHrF1kFSCqtW8Mh4XZfqMALKzb2YiyWrfDdt7I2a51NQAy8R4KLcRHec53g2GKcK0+KegYSe6oLVtqqABZi0fJmQYuf7eVrTx3EY0vWaTCl5T3TEWaJ/+gKUnALJlrCqi6QC15yTyE9JnZMSBZQI3zKmJAkoGb4WAnRAlqAj5EQJaAleKkEsYAW4SUSRAJahg9JCAroAd4n4b477K+9PI4dYvquDHdj5k4q8R2edN7e+riFZxDNePFtkmoeXvAMMglwbZPrBj4g4UnvFDW7gT7nYU/t1qFb4Pfsh6/pCVILwJd4wrMPKlCPKi55ZeYzavLwf4F5z/DPWUSPMrAPEpmor2TL+MNEFQG5YyVGBOwov4qfHhFQRTPsWInDR8AnmhspcVE9oYEAAAAASUVORK5CYII=)}.n-menu[data-v-b7f5d871] .n-menu-item .n-menu-item-content:hover .mail{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAYAAACqaXHeAAAAAXNSR0IArs4c6QAAAutJREFUeF7tm21S3CAYgAF7kHiL6nSm5hh1p1P3JK4naRxHewzTmc62tyjeQ4lLPtyEAAECGyDkz/4wsu/z8ELCCwvByi+4cn6QBKQMWLmBNARWngBpEkxDIA0BjoHs8fImKjEEYfDpFVMm/O1f/dldH0Mge/hyBc7ebkEFr6KCH8MUAJG7TkQtoO3xn5GD9/EwQCSnEmD263MGCPrPwBfRyYBVNshuWJX4+m8Os8fL2wPsjgHe4c3+LiYJ2dPF82h4E5RD7h8a8mgkSBi3NAOqtqfp7EhTv58NwUvgwFO+jrEYCMCb/TlnSAQrYQRPUF53NiLPbaePBbRPBXZeCE4CDx5//1PWj/spAaFLEMHXXKoCQpUgg9cWEJqEKXgjAaFIUIE3FuC7BFX4WQJ8laADP1uAbxJ04a0I8EWCCbw1AUtLMIW3KmApCXPgrQs4tYS58E4EnEqCDXhnAlxLsAXvVIArCTbhnQuwLcE2/GkE8GpvBuU1QRlrdl1CazncVk2UPyS1N9qGcvC22uEF7kwAt/yEyFcK3gtkUoKtdkS95kSAtAIzLrsLJdhqR5ay1gWoTFS8QitA5L6/T2faju7+hVUBKkF3vTGSAKvysFFR0jLdYc9yuBlLUE4LmNwxrJFRTucAHXihBF6EEnhJO5Nzy8f/6hRFhRMJ+6hTCJoJgG7E0p4/XjQjYLVlt6+FMRhmwuwhYNLzklSkT4kXgEipCt5vy2QTZ5YAW/DKLxYKN+pKMBbgI7zJnGAkwGd4XQnaAkKA15GgJSAkeFUJygJChFeRoCQgZPgpCZMCYoCXSQAE/WbPB9ATYs1bWfN+fjwnqPGGp/DIXuQWwRqkY9yJD0lFAK+wBtnxj8lFBC+VgMh5d1L0OAyOiTo4U7tI/tr90uHiqy3RNQKa06L05BR7k90Q/GmtwJv9tp72mNXVDYDVD1BBKiJGGQUg6L5fbEk/mPAnK5eJJGXAMt79+daUAf70xTKRrD4D3gFsnG7BkkfmVAAAAABJRU5ErkJggg==)}.n-menu[data-v-b7f5d871] .n-menu-item .n-menu-item-content .files{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAABx0RVh0U29mdHdhcmUAQWRvYmUgRmlyZXdvcmtzIENTNui8sowAAAE3SURBVDiNpZO9SgNBFIW/OySiaBCtbCwE8ReUgGDpE9gExNJmd6O+hM8gmGJn3yKxt7WyEARBUUSbIPhTGFAwxyarSwoZ2AO3mjkf98y9Y5IoI1fKDVQA0jRtOOd2B8BRST5Jkk4IwCSRZVkbOAYeACdpD3iX9DrUpQO+gHaz2XwuRnCSLuM4vpU0AnSAvplNmdlkocbNbN3MTrz3de/9WKVA/07TdN85twbcA5/A8AsLuAO6wI6k2UrhoGZmy3EcH4Zk995vAAd5hA9gBXgJMQ+0ZWanOaAH1IGrEGer1TJgxszOckAFWATOQwDVanUO6EVR9JYD5oGJJEmeAtvfBG7gb4xLwEWgGWA1v59PoQs8Zlm2ANg/RgETwLRz7voXIOnIzBrAdgCgBvgoivowWOUyKv0bfwCvBmEVd9ynHgAAAABJRU5ErkJggg==)}.n-menu[data-v-b7f5d871] .n-menu-item .n-menu-item-content--selected .files{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAKnAAACpwB9NLfEgAAABx0RVh0U29mdHdhcmUAQWRvYmUgRmlyZXdvcmtzIENTNui8sowAAADuSURBVDiNpdO9SkQxEIbh56ynUHQbQbCxEMR/BEGw9B4s1m6t9W5svQgL3d7Wyk4QLES0EcGfQkGbsTgJuywIwTMQEsh8b+ZLJlVEaBOdVmrUad7HQQJO4hQXJYAqWTjHCR4S5BAfeBursoOflP8CIkJEDCJiLq03ozymcgUD9NHDFu7xjfEbjmR7Oo2FemSjizUcl3jHDo6yv0+s47VQDHsYZMAXtnFTKK4wj8sMqLGCq0LAYjr0PQOWMIOnQsAu7hi+8SquC8WwkfPzKzzjEcsaf39FpEpnccuwE3uadp4oAHQ1rX42Cvh3tP6Nv5Cebn/RRiyLAAAAAElFTkSuQmCC)}.n-menu[data-v-b7f5d871] .n-menu-item .n-menu-item-content:hover .files{background-image:url(data:image/gif;base64,R0lGODlhEAAQANUAAPX19efn593d3dXV1dPT09HR0c/Pz83NzcvLy8nJycfHx8XFxcHBwb29vbm5ube3t7W1tbOzs7Gxsa+vr62traurq6mpqaenp6WlpaOjo6GhoQDZNp+fn52dnZubm5mZmZeXl5WVlZOTk4+Pj4WFhX5+fnx8fHp6enh4eHZ2dnJycnBwcGZmZgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH/C05FVFNDQVBFMi4wAwEAAAAh+QQFDgAsACwAAAIAEAAMAAAGYEAWCHEohFjIpJJVGJlKD0oGQ8VoVEkCdslFajEMiuVCJlskjwTz1OgmSQsWQhRxIysg1mLysbMcKywKCih2J3UsAgZ+Hh1IABJ+ECVIARwlmJmZJAxJHkQHoaKhA3ksQQAh+QQJDgAsACwAAAAAEAAOAAAGGUCWULgpGo/DpHLJbDqf0Kh0Sq1ar9isMAgAIfkECQ4ALAAsAAABABAADQAABmZAllC4KRqPQhDiUAgNn8/CyFR6UDKYLEajGhK60LDwi2FQLJd02iJ5JFiFU0M8JC1YCFGELqyAWAsTH3wsDissCgoofCd7LAIGhB4dQgAShBAlQgEcJZ6fnyQMQx5LB6eopwN/LEEAIfkECQ4ALAAsAAACABAADAAABmNAFghxKGyOyCSLVRiZSg9KBkPFaFRLFgGb7Xq1KgyDYrmYzRbJI8E8Nb5d0oKFEEXg2QqItZh88EsOKywKCiiAJ3csAgaALB4dSwASjhAlSwEcJZucnCQMWR5EB6SlpAN7LEEAIfkECQ4ALAAsAAACABAADAAABlxAFghxKIRYyKSSVRiZSpuodIokqJbYpBXDoFguYLBF8kgwT41skrRgIUQRNbICYi0mHznLsWIpFChyJ3EsAgZ6Hh1IABJ6ECVIARwllJWVJAxJHkQHnZ6dA3UsQQAh+QQFDgAsACwAAAIAEAAMAAAGZUAWCHEohFjIpJJVGJlKD0oGQ8VoVEkClrXper9ILYZBsVzOZ4vkkWCeGsslacFCiCJxZQXEWkw+eUkOKywKCiiBLCd4LAIGiSweHUgAEpAQJUgBHCWdnp4kDEkeRAemp6YDfCxBACH5BAkOACwALAAAAgAQAAwAAAYUQJZwSCwaj8ikcslsOp/QqHQqDAIAIfkECQ4ALAAsAAACABAADAAABlxAFghxKIRYyKSSVRiZSpuodIokqJbYpBXDoFguYLBF8kgwT41skrRgIUQRNbICYi0mHznLsWIpFChyJ3EsAgZ6Hh1IABJ6ECVIARwllJWVJAxJHkQHnZ6dA3UsQQAh+QQJDgAsACwAAAIAEAAMAAAGY0AWCHEobI7IJItVGJlKD0oGQ8VoVEsWAZvterUqDINiuZjNFskjwTw1vl3SgoUQReDZCoi1mHzwSw4rLAoKKIAndywCBoAsHh1LABKOECVLARwlm5ycJAxZHkQHpKWkA3ssQQAh+QQJDgAsACwAAAEAEAANAAAGZkCWULgpGo9CEOJQCA2fz8LIVHpQMpgsRqMaErrQsPCLYVAsl3TaInkkWIVTQzwkLVgIUYQurIBYCxMffCwOKywKCih8J3ssAgaEHh1CABKEECVCARwlnp+fJAxDHksHp6inA38sQQAh+QQJDgAsACwAAAAAEAAOAAAGZkCWULgpGo/DpHIJQhwKoaWyMDKVHpQMZovRqIaEr3QZxjAolotabZE8EqzCqTEWkhYshChSZ1VALAsTH30OKywKCih1J3wsAgZ9Hh1CABJ9ECVCARwlnp+fJAxDHk4Hp6inA4AsQQA7)}.n-menu[data-v-b7f5d871] .n-menu-item .n-menu-item-content .logs{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADAAAAAwCAYAAABXAvmHAAAABHNCSVQICAgIfAhkiAAAAf9JREFUaIHtmUFOwzAQRccWmyaN2HIEOAXpIag4BnsWcRfsOQZSD9EgNhyBI3SLnMnSw6IpciI7iUMdB8lv0zTxKDPyOF/6AxCJ/AnW9xARCyLKGWP5TPm0IKKSMVamabqzrbEWgIgFAAgfibmilNpkWVaanl31xInzBREZg30zZuf7CgCAU/Lr9XpzkYwckFL+ti7n/B4AStM6PmNOXogFhCYWEJrBr5AOEV0j4idj7PbCeezTNN1OCXTagbqunzwkDwDwUNf145RApwKSJHkloq8pLxpgnyTJ25RApxZijH0DwN2UF/ni3x/iWEBoYgGhiUJ2IaKQjSIK2ZwgIiEiVVV1CJhDMfn9SyhgDItsISll3vhSxv86TofYN10zDRFBdwYRUQCA0J26PmeOANq+0B+E7Mg5365Wqw/bAillzjkf1a66UzeXkN0opZ4nxA0yl5AdOecvvYmc3LcWRFQO2ZrBhayxEAsAyPX7XUO3qqqDZjUemvMQ/hAzxgqDiSu6bjQR7TrrBMBCP6OmeUCWZcZ2WmQBNkx2+yILMImWTciCF9BojOjcFl0l7q4holIptXESMp+4CBloahx8B87YZmBDLKYAF5RS7+drawvpwnHpIZ9tdGoY6wr9t1Hmnb5bIceswjb/bQ5tq62klLmpzQYH3eChiDED7EhkJn4A1qwofp3F9mcAAAAASUVORK5CYII=)}.n-menu[data-v-b7f5d871] .n-menu-item .n-menu-item-content--selected .logs{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADAAAAAwCAYAAABXAvmHAAAABHNCSVQICAgIfAhkiAAAAf9JREFUaIHtmUFOwzAQRccWmyaN2HIEOAXpIag4BnsWcRfsOQZSD9EgNhyBI3SLnMnSw6IpciI7iUMdB8lv0zTxKDPyOF/6AxCJ/AnW9xARCyLKGWP5TPm0IKKSMVamabqzrbEWgIgFAAgfibmilNpkWVaanl31xInzBREZg30zZuf7CgCAU/Lr9XpzkYwckFL+ti7n/B4AStM6PmNOXogFhCYWEJrBr5AOEV0j4idj7PbCeezTNN1OCXTagbqunzwkDwDwUNf145RApwKSJHkloq8pLxpgnyTJ25RApxZijH0DwN2UF/ni3x/iWEBoYgGhiUJ2IaKQjSIK2ZwgIiEiVVV1CJhDMfn9SyhgDItsISll3vhSxv86TofYN10zDRFBdwYRUQCA0J26PmeOANq+0B+E7Mg5365Wqw/bAillzjkf1a66UzeXkN0opZ4nxA0yl5AdOecvvYmc3LcWRFQO2ZrBhayxEAsAyPX7XUO3qqqDZjUemvMQ/hAzxgqDiSu6bjQR7TrrBMBCP6OmeUCWZcZ2WmQBNkx2+yILMImWTciCF9BojOjcFl0l7q4holIptXESMp+4CBloahx8B87YZmBDLKYAF5RS7+drawvpwnHpIZ9tdGoY6wr9t1Hmnb5bIceswjb/bQ5tq62klLmpzQYH3eChiDED7EhkJn4A1qwofp3F9mcAAAAASUVORK5CYII=)}.n-menu[data-v-b7f5d871] .n-menu-item .n-menu-item-content:hover .logs{background-image:url(data:image/gif;base64,R0lGODlhEAAQAPcAACszOzM7Q9vb2+Pj49PT0ztDQzMzOwPDM+vr6/Pz8wuzM5ubm2Nja3uDgys7O2tzc0NDS8vLy4ODi2trc7Ozs7u7u1NTWzs7Q3t7g8PLy0tTU0tTW8PDywPLMwurOyNbOyNLOwujMx9XLx9fNwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH/C05FVFNDQVBFMi4wAwEAAAAh+QQEBAD/ACwAAAAAEAAQAAAIcgABADBAsKBBggIFVhBAoKFDAgIELDCQcEDCiwINELhoEWNCjRw9ftxYUWRGkgI7igRZ0iTLlCYHUgi5EgODCS09SkiAIMEFmB41IFgAgIMAoBg1DJgYoaNKjBgQ9NQg0GjEqxEgXGhw82OACwG+hvUYEAAh+QQEBAD/ACwAAAAAAQABAAAIBAABBAQAIfkEBAQA/wAsAAAAAAEAAQAACAQAAQQEACH5BAQEAP8ALAAAAAABAAEAAAgEAAEEBAAh+QQEBAD/ACwAAAAAAQABAAAIBAABBAQAIfkEBAQA/wAsAAAAAAEAAQAACAQAAQQEACH5BAQEAP8ALAQAAQAIAAQAAAgUAAkIHCgQgMGDCBMCCOHBgwOEAQEAIfkEBAQA/wAsBgAAAAgABQAACB8ALxgIQDDAhQAEEioUsACAw4cIH0KM4CFERQ8OEAYEACH5BAQEAP8ALAAAAAABAAEAAAgEAAEEBAAh+QQEBAD/ACwAAAAAAQABAAAIBAABBAQAIfkEBAQA/wAsAAAAAAEAAQAACAQAAQQEACH5BAQEAP8ALAQAAAAKAAgAAAgyAC8YCBBgIMELAQgoXKhQwAIAECNCNEBAosSEIRQcUMBRAYiEFiNSDDmRQIiTDiRSDAgAIfkEBAQA/wAsBwAAAAYACAAACCYALxgIYODCBQIIEQoAwJBhgIYOFSg4oEDEQ4gXGwYIwTGEgwABAQAh+QQEBAD/ACwAAAAAAQABAAAIBAABBAQAIfkEBAQA/wAsAAAAAAEAAQAACAQAAQQEACH5BAQEAP8ALAAAAAABAAEAAAgEAAEEBAAh+QQEBAD/ACwEAAAABwALAAAIJgANCBR4IQCBgwgJAFjIsGHDEAcURIzosCLDEBgzhrBoMYQIhwEBACH5BAQEAP8ALAUAAAAJAAsAAAhDAA0YuDDQQIALAQgoXCiAwAIAECMCuEBAYsSEBxRkPHBAxIUIFiEmDAkgYQgPIVKGcDAypAEKLjEw4HggBEQJCRAEBAAh+QQEBAD/ACwAAAAAAQABAAAIBAABBAQAIfkEBAQA/wAsAAAAAAEAAQAACAQAAQQEACH5BAQEAP8ALAAAAAABAAEAAAgEAAEEBAAh+QQEBAD/ACwAAAAAAQABAAAIBAABBAQAIfkEBAQA/wAsAAAAAAEAAQAACAQAAQQEACH5BAQEAP8ALAAAAAABAAEAAAgEAAEEBAAh+QQEBAD/ACwAAAAAAQABAAAIBAABBAQAIf8LWE1QIERhdGFYTVA8P3hwYWNrZXQgYmVnaW49Iu+7vyIgaWQ9Ilc1TTBNcENlaGlIenJlU3pOVGN6a2M5ZCI/Pgo8eDp4bXBtZXRhIHhtbG5zOng9ImFkb2JlOm5zOm1ldGEvIiB4OnhtcHRrPSJBZG9iZSBYTVAgQ29yZSA2LjAtYzAwMyA3OS4xNjQ1MjcsIDIwMjAvMTAvMTUtMTc6NDg6MzIgICAgICAgICI+CiA8cmRmOlJERiB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiPgogIDxyZGY6RGVzY3JpcHRpb24gcmRmOmFib3V0PSIiCiAgICB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIKICAgIHhtbG5zOnN0RXZ0PSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvc1R5cGUvUmVzb3VyY2VFdmVudCMiCiAgICB4bWxuczpzdFJlZj0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL3NUeXBlL1Jlc291cmNlUmVmIyIKICAgIHhtbG5zOmRjPSJodHRwOi8vcHVybC5vcmcvZGMvZWxlbWVudHMvMS4xLyIKICAgIHhtbG5zOnhtcD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wLyIKICAgIHhtbG5zOnhtcERNPSJodHRwOi8vbnMuYWRvYmUuY29tL3htcC8xLjAvRHluYW1pY01lZGlhLyIKICAgIHhtbG5zOnN0RGltPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvc1R5cGUvRGltZW5zaW9ucyMiCiAgIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6ZmYyZWY0OTItM2JkZC05OTQ3LTk5YWMtMmQzMzI3MDVhMzIzIgogICB4bXBNTTpEb2N1bWVudElEPSJmZWI4MmYyNS1mZmZiLTNkYjgtY2EzMC0wNjE4MDAwMDAwM2YiCiAgIHhtcE1NOk9yaWdpbmFsRG9jdW1lbnRJRD0ieG1wLmRpZDoxYTVlZTUyOS03NWE4LTg0NDctODMzMi01NDRiZTAyMTFlYzUiCiAgIHhtcDpNZXRhZGF0YURhdGU9IjIwMjItMTItMTVUMTc6Mzc6NTErMDg6MDAiCiAgIHhtcDpNb2RpZnlEYXRlPSIyMDIyLTEyLTE1VDE3OjM3OjUxKzA4OjAwIgogICB4bXA6Q3JlYXRlRGF0ZT0iMjAyMi0xMi0xNVQxNzozNzoyMSswODowMCIKICAgZGM6Zm9ybWF0PSLliqjnlLsgR0lGIgogICB4bXBETTp2aWRlb0ZyYW1lUmF0ZT0iMjUuMDAwMDAwIgogICB4bXBETTp2aWRlb0ZpZWxkT3JkZXI9IlByb2dyZXNzaXZlIgogICB4bXBETTp2aWRlb1BpeGVsQXNwZWN0UmF0aW89IjEvMSIKICAgeG1wRE06c3RhcnRUaW1lU2NhbGU9IjI1IgogICB4bXBETTpzdGFydFRpbWVTYW1wbGVTaXplPSIxIj4KICAgPHhtcE1NOkhpc3Rvcnk+CiAgICA8cmRmOlNlcT4KICAgICA8cmRmOmxpCiAgICAgIHN0RXZ0OmFjdGlvbj0ic2F2ZWQiCiAgICAgIHN0RXZ0Omluc3RhbmNlSUQ9IjlkMWU4YTJjLWE4NGUtM2U1Ni04ZDI0LWRjZjEwMDAwMDA2YyIKICAgICAgc3RFdnQ6d2hlbj0iMjAyMi0xMi0xNVQxNzozNzo1MSswODowMCIKICAgICAgc3RFdnQ6c29mdHdhcmVBZ2VudD0iQWRvYmUgQWRvYmUgTWVkaWEgRW5jb2RlciAyMDIwLjAgKFdpbmRvd3MpIgogICAgICBzdEV2dDpjaGFuZ2VkPSIvIi8+CiAgICAgPHJkZjpsaQogICAgICBzdEV2dDphY3Rpb249ImNyZWF0ZWQiCiAgICAgIHN0RXZ0Omluc3RhbmNlSUQ9InhtcC5paWQ6MTJjMmZmZmItZGM3NC02ODQyLWIxOTEtMDhhMzgzM2RhMDgyIgogICAgICBzdEV2dDp3aGVuPSIyMDIyLTEyLTE1VDE0OjUwOjAyKzA4OjAwIi8+CiAgICAgPHJkZjpsaQogICAgICBzdEV2dDphY3Rpb249InNhdmVkIgogICAgICBzdEV2dDppbnN0YW5jZUlEPSJ4bXAuaWlkOmYxNDI3ZWYyLTQ1ZjEtMmY0Zi1hNDY0LTU4MzgyOGMxNjJlNyIKICAgICAgc3RFdnQ6d2hlbj0iMjAyMi0xMi0xNVQxNDo1MjoxNCswODowMCIKICAgICAgc3RFdnQ6Y2hhbmdlZD0iL2NvbnRlbnQiLz4KICAgICA8cmRmOmxpCiAgICAgIHN0RXZ0OmFjdGlvbj0ic2F2ZWQiCiAgICAgIHN0RXZ0Omluc3RhbmNlSUQ9InhtcC5paWQ6NTZjODkxYmQtMzQ4YS01OTQ3LTk2MDItMjFkM2JlZmRiZjAwIgogICAgICBzdEV2dDp3aGVuPSIyMDIyLTEyLTE1VDE1OjQwOjE5KzA4OjAwIgogICAgICBzdEV2dDpjaGFuZ2VkPSIvY29udGVudCIvPgogICAgIDxyZGY6bGkKICAgICAgc3RFdnQ6YWN0aW9uPSJkZXJpdmVkIgogICAgICBzdEV2dDpwYXJhbWV0ZXJzPSJzYXZlZCB0byBuZXcgbG9jYXRpb24iLz4KICAgICA8cmRmOmxpCiAgICAgIHN0RXZ0OmFjdGlvbj0ic2F2ZWQiCiAgICAgIHN0RXZ0Omluc3RhbmNlSUQ9InhtcC5paWQ6NThkMTQ4M2QtZjAyMy02ZTQ4LWE0NTYtZDg3YTA1YWEzMWQ1IgogICAgICBzdEV2dDp3aGVuPSIyMDIyLTEyLTE1VDE1OjQwOjI2KzA4OjAwIgogICAgICBzdEV2dDpjaGFuZ2VkPSIvIi8+CiAgICAgPHJkZjpsaQogICAgICBzdEV2dDphY3Rpb249InNhdmVkIgogICAgICBzdEV2dDppbnN0YW5jZUlEPSJ4bXAuaWlkOmRmMzhmYzNiLTE5ZGEtNGY0MC1iMjU2LWVhYzIxOWFjZGNmMiIKICAgICAgc3RFdnQ6d2hlbj0iMjAyMi0xMi0xNVQxNjowMzo0NiswODowMCIKICAgICAgc3RFdnQ6Y2hhbmdlZD0iL2NvbnRlbnQiLz4KICAgICA8cmRmOmxpCiAgICAgIHN0RXZ0OmFjdGlvbj0ic2F2ZWQiCiAgICAgIHN0RXZ0Omluc3RhbmNlSUQ9InhtcC5paWQ6NzZjOTFlOGYtZTkyZC1iMjQ1LWJkYWItODdiYThmMDU5ZjkwIgogICAgICBzdEV2dDp3aGVuPSIyMDIyLTEyLTE1VDE3OjM3OjQ4KzA4OjAwIgogICAgICBzdEV2dDpjaGFuZ2VkPSIvY29udGVudCIvPgogICAgIDxyZGY6bGkKICAgICAgc3RFdnQ6YWN0aW9uPSJzYXZlZCIKICAgICAgc3RFdnQ6aW5zdGFuY2VJRD0ieG1wLmlpZDpiNDJmZDUyMi00NGM4LTdmNDUtYTJjNS1iMjU0ZDdiNDdjMDciCiAgICAgIHN0RXZ0OndoZW49IjIwMjItMTItMTVUMTc6Mzc6NDgrMDg6MDAiCiAgICAgIHN0RXZ0OmNoYW5nZWQ9Ii8iLz4KICAgICA8cmRmOmxpCiAgICAgIHN0RXZ0OmFjdGlvbj0ic2F2ZWQiCiAgICAgIHN0RXZ0Omluc3RhbmNlSUQ9InhtcC5paWQ6MThjMjc4NjktMDAyMS04YzRmLThjMDMtMzVlZTU3MzAwZGQ5IgogICAgICBzdEV2dDp3aGVuPSIyMDIyLTEyLTE1VDE3OjM3OjUxKzA4OjAwIgogICAgICBzdEV2dDpzb2Z0d2FyZUFnZW50PSJBZG9iZSBBZG9iZSBNZWRpYSBFbmNvZGVyIDIwMjAuMCAoV2luZG93cykiCiAgICAgIHN0RXZ0OmNoYW5nZWQ9Ii8iLz4KICAgICA8cmRmOmxpCiAgICAgIHN0RXZ0OmFjdGlvbj0ic2F2ZWQiCiAgICAgIHN0RXZ0Omluc3RhbmNlSUQ9InhtcC5paWQ6ZmYyZWY0OTItM2JkZC05OTQ3LTk5YWMtMmQzMzI3MDVhMzIzIgogICAgICBzdEV2dDp3aGVuPSIyMDIyLTEyLTE1VDE3OjM3OjUxKzA4OjAwIgogICAgICBzdEV2dDpzb2Z0d2FyZUFnZW50PSJBZG9iZSBBZG9iZSBNZWRpYSBFbmNvZGVyIDIwMjAuMCAoV2luZG93cykiCiAgICAgIHN0RXZ0OmNoYW5nZWQ9Ii9tZXRhZGF0YSIvPgogICAgPC9yZGY6U2VxPgogICA8L3htcE1NOkhpc3Rvcnk+CiAgIDx4bXBNTTpEZXJpdmVkRnJvbQogICAgc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDo2ZGUxZmEzNC0wNzNlLTJiNDgtYTNmYi0yY2Y3ZjFhMzczNjAiCiAgICBzdFJlZjpkb2N1bWVudElEPSJ4bXAuZGlkOjZkZTFmYTM0LTA3M2UtMmI0OC1hM2ZiLTJjZjdmMWEzNzM2MCIKICAgIHN0UmVmOm9yaWdpbmFsRG9jdW1lbnRJRD0ieG1wLmRpZDoxMmMyZmZmYi1kYzc0LTY4NDItYjE5MS0wOGEzODMzZGEwODIiLz4KICAgPHhtcE1NOkluZ3JlZGllbnRzPgogICAgPHJkZjpCYWc+CiAgICAgPHJkZjpsaQogICAgICBzdFJlZjppbnN0YW5jZUlEPSJ4bXAuaWlkOjg1NmYwYzA0LWU0MzUtNzk0Ny1iMmQwLTkwMDliMjlhYzdmNiIKICAgICAgc3RSZWY6ZnJvbVBhcnQ9InRpbWU6MGQ3NjgwMDBmMjU2MDAiCiAgICAgIHN0UmVmOnRvUGFydD0idGltZTowZDc2ODAwMGYyNTYwMCIKICAgICAgc3RSZWY6bWFza01hcmtlcnM9Ik5vbmUiLz4KICAgIDwvcmRmOkJhZz4KICAgPC94bXBNTTpJbmdyZWRpZW50cz4KICAgPHhtcE1NOlBhbnRyeT4KICAgIDxyZGY6QmFnPgogICAgIDxyZGY6bGk+CiAgICAgIDxyZGY6RGVzY3JpcHRpb24KICAgICAgIGRjOmZvcm1hdD0iYXBwbGljYXRpb24vdm5kLmFkb2JlLmFmdGVyZWZmZWN0cy5sYXllciIKICAgICAgIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6NWI1MGU1ZTktMTRlMy0zZDQyLWEyMmMtMDY5NjNjNGY3ZWJjIj4KICAgICAgPGRjOnRpdGxlPgogICAgICAgPHJkZjpBbHQ+CiAgICAgICAgPHJkZjpsaSB4bWw6bGFuZz0ieC1kZWZhdWx0Ij7mt7HoibIg5ZOB6JOd6ImyIOe6r+iJsiAxPC9yZGY6bGk+CiAgICAgICA8L3JkZjpBbHQ+CiAgICAgIDwvZGM6dGl0bGU+CiAgICAgIDwvcmRmOkRlc2NyaXB0aW9uPgogICAgIDwvcmRmOmxpPgogICAgIDxyZGY6bGk+CiAgICAgIDxyZGY6RGVzY3JpcHRpb24KICAgICAgIGRjOmZvcm1hdD0iYXBwbGljYXRpb24vdm5kLmFkb2JlLmFmdGVyZWZmZWN0cy5sYXllciIKICAgICAgIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6N2U1M2FmMjctYzQzNS1iNjQ5LTk4MTAtNTYzYjE4ZmI5ZDI1Ij4KICAgICAgPGRjOnRpdGxlPgogICAgICAgPHJkZjpBbHQ+CiAgICAgICAgPHJkZjpsaSB4bWw6bGFuZz0ieC1kZWZhdWx0Ij7nn6nlvaIgODEucG5nPC9yZGY6bGk+CiAgICAgICA8L3JkZjpBbHQ+CiAgICAgIDwvZGM6dGl0bGU+CiAgICAgIDwvcmRmOkRlc2NyaXB0aW9uPgogICAgIDwvcmRmOmxpPgogICAgIDxyZGY6bGk+CiAgICAgIDxyZGY6RGVzY3JpcHRpb24KICAgICAgIGRjOmZvcm1hdD0iYXBwbGljYXRpb24vdm5kLmFkb2JlLmFmdGVyZWZmZWN0cy5jb21wIgogICAgICAgeG1wTU06SW5zdGFuY2VJRD0ieG1wLmlpZDo4NTZmMGMwNC1lNDM1LTc5NDctYjJkMC05MDA5YjI5YWM3ZjYiPgogICAgICA8ZGM6dGl0bGU+CiAgICAgICA8cmRmOkFsdD4KICAgICAgICA8cmRmOmxpIHhtbDpsYW5nPSJ4LWRlZmF1bHQiPuWQiOaIkCAxPC9yZGY6bGk+CiAgICAgICA8L3JkZjpBbHQ+CiAgICAgIDwvZGM6dGl0bGU+CiAgICAgIDx4bXBNTTpJbmdyZWRpZW50cz4KICAgICAgIDxyZGY6QmFnPgogICAgICAgIDxyZGY6bGkKICAgICAgICAgc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDo1YjUwZTVlOS0xNGUzLTNkNDItYTIyYy0wNjk2M2M0ZjdlYmMiCiAgICAgICAgIHN0UmVmOmZyb21QYXJ0PSJ0aW1lOjBkNzY4MDAwZjI1NjAwIgogICAgICAgICBzdFJlZjp0b1BhcnQ9InRpbWU6MGQ3NjgwMDBmMjU2MDAiCiAgICAgICAgIHN0UmVmOm1hc2tNYXJrZXJzPSJOb25lIi8+CiAgICAgICAgPHJkZjpsaQogICAgICAgICBzdFJlZjppbnN0YW5jZUlEPSJ4bXAuaWlkOjdlNTNhZjI3LWM0MzUtYjY0OS05ODEwLTU2M2IxOGZiOWQyNSIKICAgICAgICAgc3RSZWY6ZnJvbVBhcnQ9InRpbWU6MGQ3NjgwMDBmMjU2MDAiCiAgICAgICAgIHN0UmVmOnRvUGFydD0idGltZTowZDc2ODAwMGYyNTYwMCIKICAgICAgICAgc3RSZWY6bWFza01hcmtlcnM9Ik5vbmUiLz4KICAgICAgICA8cmRmOmxpCiAgICAgICAgIHN0UmVmOmluc3RhbmNlSUQ9InhtcC5paWQ6YWM5NGVmNzAtMmVkNC03YjQzLTg5YTktNzU0NTkwMjExOGVmIgogICAgICAgICBzdFJlZjpmcm9tUGFydD0idGltZTowZDc2ODAwMGYyNTYwMCIKICAgICAgICAgc3RSZWY6dG9QYXJ0PSJ0aW1lOjBkNzY4MDAwZjI1NjAwIgogICAgICAgICBzdFJlZjptYXNrTWFya2Vycz0iTm9uZSIvPgogICAgICAgIDxyZGY6bGkKICAgICAgICAgc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDpiMjY3NDgyNS05MjE4LTQ1NDYtYjA4ZS01ZTI3M2QyNDAyMjgiCiAgICAgICAgIHN0UmVmOmZyb21QYXJ0PSJ0aW1lOjBkNzY4MDAwZjI1NjAwIgogICAgICAgICBzdFJlZjp0b1BhcnQ9InRpbWU6MGQ3NjgwMDBmMjU2MDAiCiAgICAgICAgIHN0UmVmOm1hc2tNYXJrZXJzPSJOb25lIi8+CiAgICAgICAgPHJkZjpsaQogICAgICAgICBzdFJlZjppbnN0YW5jZUlEPSJ4bXAuaWlkOmNiYmJlOTY0LTM0MmYtYTM0ZC1iM2Q2LTI3ZGUyOTE3MWFhYSIKICAgICAgICAgc3RSZWY6ZnJvbVBhcnQ9InRpbWU6MGQ3NjgwMDBmMjU2MDAiCiAgICAgICAgIHN0UmVmOnRvUGFydD0idGltZTowZDc2ODAwMGYyNTYwMCIKICAgICAgICAgc3RSZWY6bWFza01hcmtlcnM9Ik5vbmUiLz4KICAgICAgIDwvcmRmOkJhZz4KICAgICAgPC94bXBNTTpJbmdyZWRpZW50cz4KICAgICAgPC9yZGY6RGVzY3JpcHRpb24+CiAgICAgPC9yZGY6bGk+CiAgICAgPHJkZjpsaT4KICAgICAgPHJkZjpEZXNjcmlwdGlvbgogICAgICAgZGM6Zm9ybWF0PSJhcHBsaWNhdGlvbi92bmQuYWRvYmUuYWZ0ZXJlZmZlY3RzLmxheWVyIgogICAgICAgeG1wTU06SW5zdGFuY2VJRD0ieG1wLmlpZDphYzk0ZWY3MC0yZWQ0LTdiNDMtODlhOS03NTQ1OTAyMTE4ZWYiPgogICAgICA8ZGM6dGl0bGU+CiAgICAgICA8cmRmOkFsdD4KICAgICAgICA8cmRmOmxpIHhtbDpsYW5nPSJ4LWRlZmF1bHQiPue7hOWQiCAxNS5wbmc8L3JkZjpsaT4KICAgICAgIDwvcmRmOkFsdD4KICAgICAgPC9kYzp0aXRsZT4KICAgICAgPC9yZGY6RGVzY3JpcHRpb24+CiAgICAgPC9yZGY6bGk+CiAgICAgPHJkZjpsaT4KICAgICAgPHJkZjpEZXNjcmlwdGlvbgogICAgICAgZGM6Zm9ybWF0PSJhcHBsaWNhdGlvbi92bmQuYWRvYmUuYWZ0ZXJlZmZlY3RzLmxheWVyIgogICAgICAgeG1wTU06SW5zdGFuY2VJRD0ieG1wLmlpZDpiMjY3NDgyNS05MjE4LTQ1NDYtYjA4ZS01ZTI3M2QyNDAyMjgiPgogICAgICA8ZGM6dGl0bGU+CiAgICAgICA8cmRmOkFsdD4KICAgICAgICA8cmRmOmxpIHhtbDpsYW5nPSJ4LWRlZmF1bHQiPuefqeW9oiA2NS5wbmc8L3JkZjpsaT4KICAgICAgIDwvcmRmOkFsdD4KICAgICAgPC9kYzp0aXRsZT4KICAgICAgPC9yZGY6RGVzY3JpcHRpb24+CiAgICAgPC9yZGY6bGk+CiAgICAgPHJkZjpsaT4KICAgICAgPHJkZjpEZXNjcmlwdGlvbgogICAgICAgZGM6Zm9ybWF0PSJhcHBsaWNhdGlvbi92bmQuYWRvYmUuYWZ0ZXJlZmZlY3RzLmxheWVyIgogICAgICAgeG1wTU06SW5zdGFuY2VJRD0ieG1wLmlpZDpjYmJiZTk2NC0zNDJmLWEzNGQtYjNkNi0yN2RlMjkxNzFhYWEiPgogICAgICA8ZGM6dGl0bGU+CiAgICAgICA8cmRmOkFsdD4KICAgICAgICA8cmRmOmxpIHhtbDpsYW5nPSJ4LWRlZmF1bHQiPuefqeW9oiA4MC5wbmc8L3JkZjpsaT4KICAgICAgIDwvcmRmOkFsdD4KICAgICAgPC9kYzp0aXRsZT4KICAgICAgPC9yZGY6RGVzY3JpcHRpb24+CiAgICAgPC9yZGY6bGk+CiAgICA8L3JkZjpCYWc+CiAgIDwveG1wTU06UGFudHJ5PgogICA8eG1wRE06dmlkZW9GcmFtZVNpemUKICAgIHN0RGltOnc9IjE2IgogICAgc3REaW06aD0iMTYiCiAgICBzdERpbTp1bml0PSJwaXhlbCIvPgogICA8eG1wRE06ZHVyYXRpb24KICAgIHhtcERNOnZhbHVlPSIyNSIKICAgIHhtcERNOnNjYWxlPSIxLzI1Ii8+CiAgIDx4bXBETTpzdGFydFRpbWVjb2RlCiAgICB4bXBETTp0aW1lRm9ybWF0PSIyNVRpbWVjb2RlIgogICAgeG1wRE06dGltZVZhbHVlPSIwMDowMDowMDowMCIvPgogICA8eG1wRE06YWx0VGltZWNvZGUKICAgIHhtcERNOnRpbWVWYWx1ZT0iMDA6MDA6MDA6MDAiCiAgICB4bXBETTp0aW1lRm9ybWF0PSIyNVRpbWVjb2RlIi8+CiAgPC9yZGY6RGVzY3JpcHRpb24+CiA8L3JkZjpSREY+CjwveDp4bXBtZXRhPgo8P3hwYWNrZXQgZW5kPSJyIj8+Af/+/fz7+vn49/b19PPy8fDv7u3s6+rp6Ofm5eTj4uHg397d3Nva2djX1tXU09LR0M/OzczLysnIx8bFxMPCwcC/vr28u7q5uLe2tbSzsrGwr66trKuqqainpqWko6KhoJ+enZybmpmYl5aVlJOSkZCPjo2Mi4qJiIeGhYSDgoGAf359fHt6eXh3dnV0c3JxcG9ubWxramloZ2ZlZGNiYWBfXl1cW1pZWFdWVVRTUlFQT05NTEtKSUhHRkVEQ0JBQD8+PTw7Ojk4NzY1NDMyMTAvLi0sKyopKCcmJSQjIiEgHx4dHBsaGRgXFhUUExIREA8ODQwLCgkIBwYFBAMCAQAAOw==)}.n-menu[data-v-b7f5d871] .n-menu-item .n-menu-item-content .account{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAABjElEQVR4nKWRzW3CQBBGZ7nBKXTgEswROMR0AB2QCoAK4hI2FbAd4A7iCyBxMakAl8AJhEBs3lgYYhQlSHzSejx/b9ZjI3daLBYjzFBEQk4qIh+dTidZLpdBu93O5U4VwHw+nxpjmpyxFq9Wq/B4PDoRSTiice/9rNFoTFqt1pbQDcCEiGTMtEh+KMuyl/1+n9McKpQbOhHZUjfG3gBMjynShMWt6NKUkEsUuNvtNt1ut0nsYYAlt+YGThC+p67oLR4qgn3MiEQPe5VO5BMyAD0AxV5Op1NCXSDIcK4CkrKHTbkk9hLgT0Xkq16vx4fD4fV8Plv8CYAEWwUona1/Mu0Ft9Qaf0DjEKt/wddqtQG3SQVdAUx7996/8Wop1O9NiUU0RvhDTkzMaYw6V/qGBr26xYRcs69X570imgJACZOtNl32kgMJjSYhpjSHvzWXuq/DH+JHhukOUqpk+UfUWkzOAi2AAMBMARnUnlJJ/imaIprGAPq4CnQKUGIgDwhAAMBRH8lFxRKf0dOAb1+0+Iv8rQDnAAAAAElFTkSuQmCC)}.n-menu[data-v-b7f5d871] .n-menu-item .n-menu-item-content--selected .account{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAABTklEQVR4nKWSgVGDQBRE9zrADq4EOvDSAekAKwhWICWcFeQ6kA6kA7ECKYEO8H0gKOhoZrIzm/3/77+dA+K0wziOJ6SUlMNW0rNzrmHu0V47bAJYOiN3sLJlegtJkhpoqOALfMQf0K8AloOkGiPoG5hnSC9uhNfTJ0kDdYVuAmrNRkQ3wEviFnj2KBn1B7Xd9OoAm3V4SYB+pJ7OTj8GZgVyYn5AVzDPkDd4cPMj5NQNtRdwcAVmK64Hp5dE7yWd4TusJd3DCM1v0B8BOfIKM3hBB4+w1PwVRngkoBVYAzj8hDzACDtbYBYkBc2H7QulZZa09I5CDO1QDguGA7oBvhfPDSN+os+oe3HG0XjN/7gcc0B/xX6PvhS3s4AkDIZJ/4DdiPTsRmov/pUWcPlEA/on2A3iRbJboNYnC7BEryvArhcvkP2gBQ7ehJsDPgGuzbA0XPT67wAAAABJRU5ErkJggg==)}.n-menu[data-v-b7f5d871] .n-menu-item .n-menu-item-content:hover .account{background-image:url(data:image/gif;base64,R0lGODlhQABAAPYAAAAAAB4zIxEREQzBOWt3biGbPyx4QDZtRJCQkKCgoFBQUGBgYE9PT7+/v4CAgHBwcNDQ0BAQELCwsK+vr/Dw8P///x8fH8DAwN/f30BAQOHh4TAwMAEEAhk5ITpkRBZKI3qBfBRYJQICAgaxMYuLixqnPZWVlaSkpDeLTERJRR4eHiEuJA2HLALVNg7GPA/QPxJvKQLYNwvUPQTYOAqfL56eniiQQmhoaAPLNADYNhYwHExRTqqqqhyiPRYnGj9URM7OzkZTShO6PENPRhNkJxB5KnaUfnmLfgi/NczMzLm5uQsWDpCYknCpfwmuMgfVOnOgfoWdi36gh+zs7IGBgRa1Pnd3dw7XQBjCQoaGhg0VDxohHEFPRDtaQv39/cnJycTExBwiHS6EQ9TU1EFORNjY2Ghza9HR0c/PzzGuUF9+Z1GRYT17TZmZmSS5STumVliIZB4uIu/v7+Dg4BwgHVyxcWCocmWXcerq6maNcGuieB+tQkRERBwhHra2trOzsyH/C05FVFNDQVBFMi4wAwEAAAAh+QQFDwAAACwAAAAAQABAAAAF/yAgjmRZRsvUYFXVNM9mznRt31nT7nyLLbeg8GbR9Y47jGLIZCooSMoFgqwgTqqEg9FkPnoahIxkeVB5k8hI0qM41N3agueG0xQa9OgSXcZNGzwQYzcRCTwOIht5SFd/IxEsLRB2Qoc7GSQbKT0JjyIOOxSVQ2wtDTMZZy1AfxFQLZlxrzt+WDwWf3Onn7sVEjWrnnGmFbKPsBWkIxbJuU0RSZ8ilxW2JqEtjkwZO8OfCjuJNBY7EF3dLeOfgdo2q13Z1tMiOxc2CJhN8sef9jb8mvha96gcrxoBue3Y9iidFYD6mESbRC8fKxvFnjFhVEHjH0kdbYiKY7HCtzgOz//J8RbHYAuPTVa1ogHyGpNqKuOJWjaipIaCyU4K8VXhwcpan7544zmD6D0a8n7Rq1YBQr8ZFiYIWoYCZFWmTYq1mMAFEIJkFSgQivDgxRFK9EZQbSFlggMEK95WmmsO7J8nVaowFMGnSoOrnzJoDYwEw4NKgAOnmYaHsWUrlTJkeOBglSjEQopEuYDAgQPNpiV4FjWzhAUHaCu0FqKURxhC5MwcacDUUI/ZNuZqAE5EbFXcJTagJX7CMwWjDQvTRU7GM3USETxf8Dskqtoa2XfWoCp02oJkFGCSSTZYLg/m7JLBvYPLRDhxcWcoZzl+BzDsIJWXnwgOGVODSyH11NeZgDT4FBx+IiB4HYMicESQa9JQsxCFNTiEwTs75EJLC9wxKJ1NJJQERG0CcjiCQ6jQ4NAVq0zoYoU7MOXSdubciA9SNNhz30M+yrhhkD6UhGKRI/RIQ2FS5MgkDfDQsEtbO0xJQzE2WCCDJE9pWYI8NjZ5kJgkJGQDLGGiKUJtZYowx3duQsJHe3XmqeeefPbp55+ABipoXCEAACH5BAUPAAEALAAAAABAADkAAAf/gAGCg4SFhmqGiYqLjI2OjYiPkpOUhkGVmIuXi2eVNQGbmaKGnaOmgmaVoZOrp4OlrrGNsLGphZ+yuYW0trqirbq9psKcvsbHusDIo8qMaMu5tL/Q1NWYxNbZ2o7Pstjb4NrShd/g3QHllqfn4Zm4k+nkhM2Y747x2eyS46i7yPSi+G0TSMoXwHbUDrpSOIqgNYGRJOHz5fDRxEH2+q2jdFHfQEoezUnKmOsiJXsmAzI6yBChS10VX8rE5AaLzZn+CAmwiYVHO4ap0vBsg5MRTzhFF+20icAlQxQ8QSRV9IZny2MhDQm1KSBczF5bsUylynNsojU8RZgthKDsWkJsDGyieFuIQwQAdAcFAgAh+QQFDwAGACwAAAAAQAA5AAAG/0CDcEgsGhdG4SrJbDqfxhTUgJxar0QV1qDYepvdLzPBFX+XWbO6WL2GsW81ejg/r+9WKb09JOP/UWx4empxTVpefGaKgGCNSYhKj2KGf4R3lZBml2t1k0WZn0ScbqJOpE6MZpGlrYNeqKZMqppirHKymFa0Vqy3X7ygucNQrH5XwUR8oV7HUMnEZU6/s9EMtUWe0du6srGwr96PKd/SW9RR5UK01NC9T+hb7gYizuvn2Eae0AIDgKTa6GRz0s+frIBbOAxYOElRvHhDRCxkOO8KwiRxfhWYaHDSRSwBOCIwdembr4gcT3DzEmIigo/cqIkkpk5Ty4UgVgphpszATDZrUzhxhKmT1YeJBHQO4TmkBNKVNYtw9KAUC8eqz4ZcxQpvyVasRL9WrSlWKVEUE7laDKHWShAAIfkEBQ8ACAAsCQAeAAYACgAABBgQSQkmOkOGwUHhYCgOHyggHFGhhkVYSAQAIfkEBQ8AAgAsAAAAAEAAOQAAB/+AAoKDhIWGh4JxiIuMjY4CfI+Sk5SDfZUMlZqLmZuINZ6hioSXoaamnZSppqOWrKewkpGuhqCxt4azuIK6oauLpbvCu73DAsHHxpq/t8Woj8iYuK3KhMzVg86y2Ija3InLqrjejOTfmtGU6Z7r59vfyO3G1+7uyLbc9Jr49afmyf3YHaIWUACFMX8QkLjhwE/BcklIVEFCsWLFKs9iHZhosWPFRvpu2fBI8qMjPub+IfoghCQIhSAg8bHyIGYleZQ4drQSoBHOYRxadjRwcyAwTR1IAvDkjCCpQk4JsezYU1jUShE8VpP3U1BHG1YnrUonlOINY1crhbDooFovcvFNCLF9OInFxbQB11l0p9LQJRh7C4YsZBFBvb7F7tI9OmityYeDvQY+XMnigcWSFGN2NHnzQEWdH+KVTHGzSp2bRwvo8dgzoxAwRLhuFAgAIfkEBQ8AAgAsAAAAAEAAOQAAB/+AAoKDhIWGg3OENwGHjY6PkIZDkYmRlpeNdJgCcwqbn5AKcoejEKBUoJdmhYmMhHRmpphyqKmWtKGVl3Ketq+EEK6ftQG6vo66sraTg8LHhbUCo8+HQ8rP0wLMoNm9kJrU4Y7Xz9up2Y502eCpxuWO0aDm74Lxhezkkdv2oM6P+ZeieRNnaR4kgQQPDjIY8Bk7hYIYOpKYiiK0hbYAJjz00JKujp8+3tqIaZvGcA9BXjrJCuMxlvAGoXvkDpM6casK+spJchA/ghAsCuh40hjMjYzQyXF2o9FRW3Mk6KlD1c6Emk8FZC05AUuLr2DDujDSAE/FcCJsiF3Lts6dMITvRPUc1IOt3btERCwcYoZKPl6piNjFQvUIlSFD8tghfLcDRyozP4lw0TZSnDte1/aMwLbHpw+ZwQZLFxnSB7Z6QQEQQ/mrNH+vrsEmJFis42McMgta+k+mow5rUz8DUFemSkE3H3EQ6zlhkWwsB4LEEdZOzwClPxWpPldb3HS/BE0GW6e7oZqNotX9imX2Rl0/kSMaFNaIeZecesvfzv5+o4GQhEWCf/g9Mk9Y7s2F3j20gYUFgf9ZQl1/EEa0yRxhVXjIUXIgqKEgW5mR4Yc2MTLih9EkSB9YJAqAUIAsksiTioLsEWOLmxDBAo6fBAIAIfkEBQ8AAAAsAAAAAEAAOQAAB/+AAIKDhIWFAoaCDx2JjY6PkIZkkZSVlolhl5qbnJuIgg4KnZAPiYyEYaWGn40OrKOOrrCzj6eDto+vAA6CuLSHwJ2Tt7+FvIO6v8O0r8uXyauFmcXU1YXOsNAA04LcldrWhMec2MXjhtxAmsvnnL7h7eGQ5Y/j9PL2nfGa3vWD940AbhIo7t+zQerkPep3iWEnhwrJRURFkVPCiYYuXjoH7hdETqomhhTUkdO+YkAIMkwGraQwUzBJLngh40qMK4RcWjRh80WVKicavRpws2gMZNZ4Gl1a1ESZRj2NEiJoqccMpliXVsHlgmm0UVWyisVKQxCHEAd+PADBIxHVRDDRxlaxEorMg7BRmcLAdPISTaYD3knDq1foqA5YN8VlysKRYEghEneyurRxo36PBbFgGmJWhLwx9hrO2Sjy0mIiiBrN/JGQVms0rhbVuc1QzaJV5C2+OfLSZtwRxRgF6M3bUtqTi4KoNG7EaowiovZ1aJQKRkEeelrK9Psm8llWbmqSev2fzXmFnpdXdBSANm/dca5nP/7mgPmCyLSvZFQMfkHtaeSIevjJR8kD5P3nAiVhMJIgfj0QA8mD81lh0IRF/aeIhI8QpqF7mrBQ1oeaBAIAIfkEBQ8AAgAsAAAAAEAAOQAAB/+AAoKDhIWFWoaDOomMjY6PhlyQk5SViVuWmZqbmogCCZyhi4SYl4+eoaepq46jipOoha6shrECtpaSr4agtLe+hLqsscKWuLWywMrLg8Wpx7+7ldDMtM7VyYIQmdei2N/cnN3gAuPk0bnpvuaN7Mja5++bpcPxoe6+9OiZ2/aD/c/A6evlb1UCagUpQXCnTxCuYwiXzZKmpcSVGTkygvHisNoXBxcH1WAU60XGkydrRNSUBSPKlzEufmEE86UHX1Vi1twZQ9AHQi14nlzpCIvQoydHcBDQgYUNDw+sILj4El8iFjprVonKhcuNnC5rsrh0g2rGTWFfQgpgtCYNkji6Tmb6kDVpJqwwRzACAAOjpb4wl2oSARalXkYdrpB6BJNV4pdjSR5q1NhXXJQ/JUNSu2zES6L7BAWVW40GZ02mT2L5ZvHkTc0dB30GZ5K0JRcoJzLjENZKo4aiTzqIZ0A4JUypM4JmZXaHJeP2uuik0q5Q7oJmoTW07a/wa8aqE0rPeIMSd38oJ6VPKCAsgM3n7dXOIfjSovUJC2d2hLK+vweuwXcWe+1lpFsi8cWjBQk5PEDgYB+8B0kgACH5BAUtAAEALAAAAABAADkAAAf/gAGCg4SFhUuGiYqLjI2MP46RkpOJPpQBO5eai5maTIeCNSCdm5efhZaJiIsgq6WNrY+apK+vroIgjqe2oKWQjTW1uYO3tYS/xgG3yJTLqqjJ0dKOzLXFg6mC2ZLX0bSFwwG7ktW1pOGG2UCXyOjG49Ph39OGu+WM8vT4g/eR7prb9gnqpwgZvFmDDhLKN8nVuloKGwWkNLFUxWgR2elTtO2io4eU5l0CSQldt1DJtgXbaEjkphonX/2bBoSgNkPXusU0pyijMidPYuQYKoUYywZNZCh1ISSKoltKh0olunNWk0ZSlYij9MRGNA5IpoodO9UFEUJkx3ao5SKt27SI/0I46WHgxpGkYw2UyqFIRtNRP6C0ZUSjElCxPThMUmwohwtHHdqSRcIxqlQhjBuFmHyJhtCxizyXzayoyDSwYymXnjHVCYDQY2Ek+3x5UeSpZxPJLkT6FQfWuG1bfpJT7GN6qo0WtMyicVmWh6UywjuUdHTHLAUJmaq3stQPg35PrWps+PTagnBk9ydcuiEo6wnZmHp+qKXr5KVZDrKIenqpV8V3DH3LESUgVlKd5ENUPIiG3YGEbDdUd4ngxUML6EFoyHGJRDFUEvJpmIgMi1wowxQi9uVeXwGm6NxQMemwlosbSpUbNzRCIZUHjsRAYyFBPRGJhHzRuERSQkhCgwlrPwbAgWmRBAIAOw==)}.n-menu[data-v-b7f5d871] .n-menu-item .n-menu-item-content .domain{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADYAAAA2BAMAAAB+a3fuAAAABGdBTUEAALGPC/xhBQAAAAFzUkdCAK7OHOkAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAAnUExURUdwTLCwsKGhoebm5s/Pz7u7u+bm5u/v7/n5+dnZ2eDg4MbGxpmZmRaeVDkAAAAMdFJOUwDD6T95qkAoEGBQkAHyQfIAAAHQSURBVDjLtdS9S/NQFAbw05iYNDpEcBE6iAjKS4YXivt1EFQyZNBFMnTq1OHi3KGK29uhr3MHFVzEoYsg4tBckn75/FHexNR+3UgXn+mSX2nOOb09RMvFKpfLDaWYhy4AsckX6SaRJOJ4nv6NSeLrLOkTktiaqaKE6YTTFV1iNnsTKmI+k29tL9jwuzMsZtzltcL2MwsUFmf2f2MxW/RrMcuqpE1YqjJloY2c7sYdBjkWqwc2HttKrv2lVYhHhIeIH06AF4j7PwE2XbwBFWmRhZ6NwRoFMblDk9XB20KWkZh8sk1w9IY3oqBv+ZqgZkjvqcnP+BR0jLvagJ67tlP4oEJEpdTAvRb3mMaaDjUdfaCPLH1EX+9Dq9bo1Ct1R2NPhl/o2V3D7K9m1rmivkbtrsHPdbYemX6Tb+uZOUU7KsoyirRjVmohsTZrGZl1yQgtKkVyRpw8UFKblllPnrgle1kDk31xcgdUz+yDamC27KUAh9zkOEyubGo4cbF7D1wEiA+A3VuIUzcxcnNGLeTv5+VYJM3IMT+9ukr6xcv7YzxlA+pVML0MzPnZCL7UDpn/v8zsHrLzd9bUGlQtwptSLslij9LdesbVM6hWq8uO6xPhZCDIp3zh1AAAAABJRU5ErkJggg==)}.n-menu[data-v-b7f5d871] .n-menu-item .n-menu-item-content--selected .domain{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADMAAAA0BAMAAADVih2hAAAABGdBTUEAALGPC/xhBQAAAAFzUkdCAK7OHOkAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAAwUExURUdwTP////////////////////////7+/v////////////7+/v////////7+/v///9/Gv7EAAAAPdFJOUwA/w4UQ8GDgMFBwsCCgr3PLWGMAAAHaSURBVDjLtdS/i9NgGAfwby655K5pbQOOwhUVbkwG5cZGV9E7KIjokGyOF3S6W+zi4tIiiINgRPA4RdBNHUQPNx3s6tQT/AM0MbXUnl/TNHf9kTfd7ss7JPkMeZ6X932AcS4YxkmI8nmVcW69zICyxjS37Rk5z6PUp+0ZJ3J1Ui5yKmfHsuRMU9Q4ok3OpHsoKjNxU2pmqZcW7mQpGjWgU5DXo1+dFsTFsWTPEOTUUK5QmB/irtLOTjAn+/iaRz+xMo+2Ojxj8lt9k2GHW6uPGKwx9BOy1lnxaVs62xrdT0UOVG6UEtrXIpQDnJPZKrFxGY6nsCon5OkH0EO8k2gvE/dhWvFaSGggd4uFPupKgHjV7ForXuWEutJvufhrKcD2cus9zIqPdvPjSkKhUi03PJV4W2q/AK0vykDDq4QCuL7lxhW4mrcnsVpQ+yo+jFoGOlV7gU/Q7KEQf9L/As6IKnAGWI+PQy2MD0oPi7SL6UZZEkP49GAG0JJHV02pf5PRc5P/HpPfO4x2HF5/OKTFvO3dgJxHVlydWA6GJ9QUSXBMZ3ROZGHlwls+ec/vztK18XC4My1/xsMBl3JHCvAgdxDNG19Qnh7Ktp3p7t6bIdzYFbYuGUZl4vU/Sd6bbwAFS00AAAAASUVORK5CYII=)}.n-menu[data-v-b7f5d871] .n-menu-item .n-menu-item-content:hover .domain{background-image:url(data:image/gif;base64,R0lGODlhIAAgAPcBAAHUNiu7TwLUNxtUKbPBt4qylLfEusfHxy24T/f39xtHJv7+/oODg0pdTg6cMgLNNQuqM4zBmZO/ngXTOHNzcxhzL4qylY/CnIqpkou3lwLUNt/f3/X19aKqpIeQiYiYjIaLh9HR0SDHSgHTNRPNQRPMQbjIvOLi4kVpTjiWTwSyLwnROwPTNzrKXh7OSgSpLhjPRUVzUeDm4hPQQtri3N3m39zk3uXn5gO5Mdnd2rXIutjb2dvj3QjROjWhUAkPCvv7+w7QPwYLB4qnkQEDAR0dHRzIR37DjwyoMwPJNYarkAQJBhgaGSLDSoTDlFBQUBN3LBVvLAwSDh0yIhxBJQ4UEAACAR1kLxtOKBtaKyu8Tx0mIAXTOZi4oLC0scnJyQa+NIK3j4DEkd3d3bzFvrG6s7nJvSjATX7AjjOwUktcT5G9nA6eMmdnZ+rq6i61UCLGSwrQPBnKRc3NzRxoLyi/TcbGxhR+L19fX0F2TkCAUDuMTwbSOUtjUVJSUlhYWAIGA9ra2gABACXNTxk8Ijq6WgWiLBlGJCvNVDzGXgLKNBlnLRgmGxhgKhk1IBUbFxgtHgsRDAHNNDXMWg2ILECCUQO+MjjLXQLGMzzCXTm1V4u+mDvIXk9bUjajUQuQLIu7mHl5eR05JObm5omkkAECAQPUN8DEwR0qIBw6JL7Fv3JycrrEvU9UULbLvLTGuATTOC3CUiTITbC3sjiYUBSALyrFUDC5UjG1UmlpaTSpUYLEk////8XFxaurq1FRURYZFx8qIvn5+f39/U5UTwsRDQIFA/Hx8aWpphxfLe7u7vz8/BwcHL/DwNzc3BIXExOJMLG4s1NTU4WFhQ4UDwbANNTU1H9/f9fX1x8fH62trYqNim9vb5qun9PT01tbW1paWhQYFWNjY1lZWbXDuKysrGpqarG1shsbG7zDvq+vr3x8fIuYjpavnOHh4YqQjJiunuPj43Z2dkJwTszMzMrKyp2toSuzTdnZ2TuFTWVlZWxsbDCnTc7Ozii5TGFhYSH/C05FVFNDQVBFMi4wAwEAAAAh+QQFCgABACwAAAAAIAAgAAAI/wADCBxIMMAPUQqSVaAzb4ACZqUKSpxokN8KPqYEANiYMU6TBhEpSgwHLQ7HkyhX1EkmcqAxUSRSyjx571nLfBhn6hTQRNTEUnc67tTZpIhEmEOTEihWUJyFp1CjSp0a1WfLq1izah15zZfXr2DDihX7x1gxZ7zSql3Ltq3bYW3GDXtLt67aUGnPHeOlDFvaOcqaqbX2d1QzN4V5hQiUFm8BCOR4/cmW9oe8Utp4rQuAOJhnbprPCnvmpzEveAAKKGMSoF6zANOC/eFltAOvJdJkDyOG2Vmxb6ZPABDR7yCebsbole1l9l+0AMhyjxZFrJmxbaYXlNDQDfpvYPHeGajTl61bMAoBliHXJiTQD3bQsxMAkM0cvlLPgnGIhp/YMWDMiMJXALp5xll2x/CRHG0B/DJgfH8EYE5awcAmGYF3qTXEPgkoVl1joCkmih15+edhOmoJaNeKbYVgIYswulEhgb/UaOONOOaYIzpb9ejjjwMNcFFSMxWwBEUVjEBkSkWJBEhJS3LkDzVYJVNNlHRsVYqQDwiFUhN0hNQjfggl01BDDxnTUkAAIfkEBQoAAwAsAwAAABkAIAAAB2qAA4KDhIR5hYiIPj0TE4SNAwGJk5QDPZQllYlvho6amgKflJJxoqanqKmqq6ytrq+CbnV3rQFzExW1BQC5k3iVcpEPe4htpwAIdq2MB68UsNDR0tOrpdSmApKuCK7Bn5CDjRNwqnQDh5SBACH5BAUKAA8ALAcADgADAAcAAAQO0K0HCEUsiFGAMl5yNBEAIfkEBQoAAgAsBwAOAAUABwAABhpAgcAEEQkLgIIw8AgJSaXTMzUEjFBCAVYQBAAh+QQFCgAFACwCAAcAHAAUAAAGTMBCIUIsGo9Io3DJbDqf0Kh0Sq1ar9hsNhKFBLCSIZObEUw4Wm4zIAhXPdKLplLoMO3Mz1MtJAAGWk8bD4BQIGAUgYqLjI2Oj5AWQkEAIfkEBQoAAgAsDgAOAAMABwAACBkABbz5MUrDjwgARJHoQQoAnIIBBIRyIyAgACH5BAUKAAIALAAAAAAgACAAAAiNAAUIHEhQYKqCCBMqJBhngqmHAEwtnEix4sSDFgdKzMhRoESMCTd2pAhypEaTHEuiXMmypcuXMDueUjgTJgQTAlDp7CjS40YAEQaicvkzAMGhOQXUnNhzoJEJq2IOlAAgqcGrLOOUEloQqUlVKgmy4iq1LEKkXs2qXRuzKUy3bFvC5QgxIkSXYVOlTRgQACH5BAUKAAEALAAAAAAgACAAAAfxgAGCg4QBQlNUV1BRAVhURVaFkpODPVxchJgBWmqRlJ+gg2dXoYZUJKWSVaGaqYRnU5NEUK6UWpNTPbWfUpJOv8DBwsPBVLvHyLtLyaBEvczQ0YJe0pNiSIJNbAFm2Ei3AUhm4Sqrgs++AUeE62EBrUdjAEax5/bWokmb6tlHAOtbBNVbNslIkltBUK15J+jSCCCGIgqZ9kmMIB+vurxLM6heQFBmDBTSB+6fwEIfCymhNISQmi+UyHSsRjOVxyc4c+rcyXNnACY1g+7CoouZO0q0kq0Teg9UFjC1SLmy8jRJq0qbrnhSJgWRIkZUHoUKBAAh+QQFCgABACwCAAAAHgAgAAAIwwADCBxIsGCMgggTEtS1gg8sDQI1PAwSq49ChUEuDlxhS+NGjwU14NLIByRCkRhNKox1UiXGVy5jypxJs6bNmwRz4dxpclcAmLIEugogh2iAkUMFIokF5IhHWD83Qi0oR9aKBCxTCryV1dZUo1sBuEoSoFXLoLEgEiTBsaRAJQCsKoR5dCCtqGAJqgAA4GJJV0ktDmSZcWCtuCoPJhT8M8YGnpBltppMubLly5cjayZZUy3kr5BvfS4xc2LEiUF3KgYZEAAh+QQFCgABACwAAAAAIAAgAAAI/wADCBxIMMAPR4cWDRxwiBGRghAjGvQkkAWAinwCrGjRSZDEiIwofSyIqNFIgYAIwThZEEChk5VYRmSBiNBHFjIlJnoE0VHOmwYLVopAtKjRo0iN2vzJtKlTIU6jSiXY5s/Uq1cjGBLoYmuAF10TBSjk9cXXTAG0XogoYaxGgRHSWnzbgusggZcAuAgKEUbcAINaKAJMEy+ntC81AgAAaqZeRZNwrryw+C0MSWkBE/40UtNfkm01fxUYAgZnlhkrul2ReSAiIC0+QYo4RCIGloH6EFyKtbfM2QEg+RlOvLjx48d5+l7OHLWF5hp3jhTZNPHJRpZk6lWY06MlSRYvKg7mushj04cITQps6HBkQAAh+QQFHgABACwBAAsAHgAKAAAGOMBcYEgsGo/IpHLJbN6Su6aU+MLVpDIiD7qCDbNTZYTVWs7AxVnSBZCEmTMAgOacAlRv5ZUW0w2DADs=)}.n-menu[data-v-b7f5d871] .n-menu-item .n-menu-item-content .terminal{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAMBJREFUeNpiYKAQMM6cOVMASBuQozk9Pf0AC5AuAOJ6cgwAWt7IhMQvRKIfAPEEYgxhQWL3o9EFpBgwAeifQhKdD7YI5oWPUMEEmAQR4COyATBwAIgdgIacB2IFYkxhQouWB0BsCA3E86QGIsxvDSBXgGIDSxr5ALTgAk4XADWAQt4fiB2BChcAaQVoGoHheLwuAGqagBz/UNsciQ4DEgE/zAUfQM4DOt+eRANAYTMRZADIrxfIdMUFSnMzA0CAAQD0hjqnYxWD2gAAAABJRU5ErkJggg==)}.n-menu[data-v-b7f5d871] .n-menu-item .n-menu-item-content--selected .terminal{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAALhJREFUeNpiYKAQMH78+FEASBuQo5mfn/8AC5AuAOJ6cgwAWt7IhMQvRKIfAPEEYgxhQWL3o9EFpBgwAeifQhKdD7YI5oWPUMEEmAQxZiAbAAMHgNgBaMh5IFYgxhQmtGh5AMSG0EA8T2ogwvzWAHIFKDawpJEPQAsu4DQAqAEU8v5A7AhSCOQboKWRC1CM3QCgpgnI8Q+1zZHoMCA1JcNc8AHkTKBz7Uk0AOS9iRRlJvTwIAsABBgAqiNCt+zqQrsAAAAASUVORK5CYII=)}.n-menu[data-v-b7f5d871] .n-menu-item .n-menu-item-content:hover .terminal{background-image:url(data:image/gif;base64,R0lGODlhEAAQAMQXAJ6ipUFITySRPIiMkDFRQuXm5jJKQy1kQCGeOzBXQSl3PiWLPVhfZSxrQCpxP9na2yeEPTREQ8LExmRqb5OXm/Hx8TU9RAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH/C05FVFNDQVBFMi4wAwEAAAAh/wtYTVAgRGF0YVhNUDw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuNi1jMTQ1IDc5LjE2MzQ5OSwgMjAxOC8wOC8xMy0xNjo0MDoyMiAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENDIDIwMTkgKFdpbmRvd3MpIiB4bXBNTTpJbnN0YW5jZUlEPSJ4bXAuaWlkOjMyQjYwMTU3OTA2QTExRUJCN0NFQUUwQjRDMzM4RDJDIiB4bXBNTTpEb2N1bWVudElEPSJ4bXAuZGlkOjMyQjYwMTU4OTA2QTExRUJCN0NFQUUwQjRDMzM4RDJDIj4gPHhtcE1NOkRlcml2ZWRGcm9tIHN0UmVmOmluc3RhbmNlSUQ9InhtcC5paWQ6MzJCNjAxNTU5MDZBMTFFQkI3Q0VBRTBCNEMzMzhEMkMiIHN0UmVmOmRvY3VtZW50SUQ9InhtcC5kaWQ6MzJCNjAxNTY5MDZBMTFFQkI3Q0VBRTBCNEMzMzhEMkMiLz4gPC9yZGY6RGVzY3JpcHRpb24+IDwvcmRmOlJERj4gPC94OnhtcG1ldGE+IDw/eHBhY2tldCBlbmQ9InIiPz4B//79/Pv6+fj39vX08/Lx8O/u7ezr6uno5+bl5OPi4eDf3t3c29rZ2NfW1dTT0tHQz87NzMvKycjHxsXEw8LBwL++vby7urm4t7a1tLOysbCvrq2sq6qpqKempaSjoqGgn56dnJuamZiXlpWUk5KRkI+OjYyLiomIh4aFhIOCgYB/fn18e3p5eHd2dXRzcnFwb25tbGtqaWhnZmVkY2JhYF9eXVxbWllYV1ZVVFNSUVBPTk1MS0pJSEdGRURDQkFAPz49PDs6OTg3NjU0MzIxMC8uLSwrKikoJyYlJCMiISAfHh0cGxoZGBcWFRQTEhEQDw4NDAsKCQgHBgUEAwIBAAAh+QQFMgAXACwAAAAAEAAQAAAFU6AljmRpBVOqrqtFVXAsy9Q7VMMDzHHN/5UawGQC1CiWg4IoOiINAoGB6BxBENSjyIE4oFKMprYhIFgYkvTQpWWOqm6RcVBI2+/2AuXL6k8CcSYhACH5BAUyABcALAcACQAFAAIAAAUIYJSMBLGcSggAIfkEBTIAFwAsBwAJAAUAAgAABQhgMI0MI51ACAAh+QQFMgAXACwHAAkABQACAAAFCGCUjASxnEoIADs=)}.n-menu[data-v-b7f5d871] .n-menu-item .n-menu-item-content .cron{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAKwwAACsMBNCkkqwAAABx0RVh0U29mdHdhcmUAQWRvYmUgRmlyZXdvcmtzIENTNui8sowAAAFrSURBVDiNpZMxSFxBEIa/ed49tQsBQdEqgrVgithFW1sr62PhKttXpjy0vWb2WjkQrk6rjWUgjY3ICorYGCFV9C7vxuJ24fE4Y8SBZf/9d3b2n/1ZMTPeE1l10ev1Frz3Wy8lq+pXVf1Y5cTM6Ha7jTzPd4BtYBUYAHO184/ALnAJnJRl+b3dbo8aAM1m8xB4AO6BT2b2C5ivFxCRv8AtsJ5l2SZQYGao6kBVFyNeNjOmDVVdifOSqh6Z2aQF7/0xcGNmF4BMkV9tw0RkDfjgnGs14kYJXInIOTALjGOhukUZ8AQ0gc+JIJI/nHNnIYRWCME5505CCC7i04hbzrkz4Gc8Q1IwEwedTmcvXfcSruZnNZKiKPpFUfT/hZnYX1YVyGu31hRk6X2SgnEi/lPBb6JTSUFuZsM3KPiTWk4FbkXki/d+CORMbK3aKEzsTXhDRK6rBb4B+2bWAkbVN5kSDRG5E5EDiJ/pPfEM08DH4VH64rEAAAAASUVORK5CYII=)}.n-menu[data-v-b7f5d871] .n-menu-item .n-menu-item-content--selected .cron{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAKnAAACpwB9NLfEgAAABx0RVh0U29mdHdhcmUAQWRvYmUgRmlyZXdvcmtzIENTNui8sowAAAEPSURBVDiNpdO9SkNBEIbh58RoFKwEwT8QFOwEQQvt1NbW+7Cx8B7svAZLa1tbG0sbEQQh2KigjcZoxsI9YT2EGMnCMt8us+98s8sWEWGYUausp7HTJ38bU/lGPYt72MUyFjFeOfyOfdziAudol4BjPOMRS3jCRA/AJ5pYwxaORISIOIuImaTnU+w1F1KcjYjTiOi28IVD3KDoYT93EVhJ+hfgDtdooJNA1SeqoYVRbOSAFq5wmR0q+mhYzQEjaeYJ/XQ3v1bZlCrFH7rw03bXwSBVc10rYaWDzgBVc/0ivVTpYAwf/3DwJrVcAprYTJCx1F/15huZXsc9FOk3TuIAc2hXqlVHHQ84wWsx7Hf+BgvadUGnT3fcAAAAAElFTkSuQmCC)}.n-menu[data-v-b7f5d871] .n-menu-item .n-menu-item-content:hover .cron{background-image:url(data:image/gif;base64,R0lGODlhEAAQANUAANPT09HR0c3NzcvLy8nJycfHx8XFxcPDw8HBwb+/v729vbu7u7m5ubW1tbOzs7Gxsa2trampqaenp6WlpaOjo6GhoQDZNpubm5WVlY+Pj42NjYuLi4mJiYeHh4WFhYODg35+fnZ2dnR0dHJycnBwcGZmZgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH/C05FVFNDQVBFMi4wAwEAAAAh+QQFCgAlACwAAAEADwAOAAAGesCSUKQRGkua0RGjAFQm0EkFoMAIFY9HAHPpXjABiINREohKoaMwHSKUBgvKJEKvTygLw1vCyWj+gBkcEnoGHCUWFmpCHAglBYeLRhsHjxuSRhqOBJeYSI4FnZgeegMdniUgBSULER8dHrCxG7QRDUIPCQq7vLsJDyVBACH5BAUKACUALAcABwACAAEAAAYEQIslCAAh+QQFCgAlACwKAAcAAgABAAAGBECLJQgAIfkEBQoAJQAsBAAJAAIAAQAABgRAiyUIACH5BAUKACUALAcACQACAAEAAAYEQIslCAAh+QQFCgAlACwKAAkAAgABAAAGBECLJQgAIfkEBQoAJQAsBAALAAIAAQAABgRAiyUIACH5BAUKACUALAcACwACAAEAAAYEQIslCAAh+QQFCgAlACwKAAsAAgABAAAGBECLJQgAIfkECTIAJQAsAAABAA8ADgAABhTAknBILBqPyKRyyWw6n9CodEoNAgA7)}.n-menu[data-v-b7f5d871] .n-menu-item .n-menu-item-content .app{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAABx0RVh0U29mdHdhcmUAQWRvYmUgRmlyZXdvcmtzIENTNui8sowAAAF7SURBVDiNrdPPi41hFAfwz72uoVsUWZOFJbKThYkVe1mpx13YjcmU/NwrZCKRLNRZsrSZErvJ1h+glFgiYxC6Pyze8zSvOwsLzuZ5T9/n/T7n+z3ndCaTiX+JHkTELlzHHozQxQrOl1JeRcReLGIbxtiAN7jcS6JrCT5OcIx9mMcAZ/EBz5N8hCO4UQl240kp5XYtLSJmsZDpdjwspTxr4V9xppv5EP0peVuzEnlumcL7GFaCDn5OXfj+l/wHulXCBIci4rXG2BFmMZP4RhyLiBmNR0McxqgSLGBOY1iNIW7l96LGyNMtfBXznf81B/vzhR0pB37hbillOSIO4hw2JdbBJ9yrEu7gIx7504OLWMYFvMcLax6cwv1K0MPLUsrTWlr2eS7TEZZKKUstfCcGtY3jVnk1+i05E+vnZDPGlaBnfZ+/aMZWnqtT+Df0qoR3ON7qc92FlcQ/YxARB6ztwlG8rQRXNdt4Mn/u5AuXEn+AmziRcroaU6/8BgTXdRpxDzi5AAAAAElFTkSuQmCC)}.n-menu[data-v-b7f5d871] .n-menu-item .n-menu-item-content--selected .app{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAKnAAACpwB9NLfEgAAABx0RVh0U29mdHdhcmUAQWRvYmUgRmlyZXdvcmtzIENTNui8sowAAAFsSURBVDiNrdO/jw1RFAfwz4xnVzYIydZeY0tEKETChkIoNGrNtkKyhQL/gUg0YgudQiciGpVEIRsdPdlkQ0usH4vNvHcUc27e9bbkm9zMmfnOPfP9nvneJiL8CwZ5PYS72I8xdmANN/EeQ9zGAkZosYHrTSp4gD14m+QIZ/ATl/AI83iRzcc4jC0RISIeR8S5rMu6EhFvsl6NiOUpfjEinrZpYZwKasyhy7rL+xp7MW6rB5tTL/xKO9Dg9xS/WQ9xJ85jJj12OJ2zgMBJvMs9IyxipgzxFK5lo4JvWMFrHMNV7Kv4DivN/8rBkVQwn3JhC/fwCiewjNnkGnzG/aLgJT7h4ZTHBVzEE3w0yUGHyxgWBQOs4lml7rvet2z4PFfBASzVOZj1N+YqO2F7DnapcjCwPQdfTXLQ6v9KjR8YFAsfcMEkByXrG8l/wRKOmpyVs1gvQzyoP23D3NzkF27oc3Acd7A77bT6od76A2AskgeNVoIQAAAAAElFTkSuQmCC)}.n-menu[data-v-b7f5d871] .n-menu-item .n-menu-item-content:hover .app{background-image:url(data:image/gif;base64,R0lGODlhEAAQAOYAAOPj4+Hh4d/f393d3dvb29nZ2dfX19XV1dPT09HR0c/Pz83NzcvLy8nJycfHx8XFxcPDw7+/v729vbu7u6+vr62traurq6mpqaenp6WlpZmZmZeXl5WVlRTDQBTDPpOTkxLDPhbBQBi/QBTBQBq9Qha/QJGRkRi9Qhi9QI+Pjxq7Qhy5RB63RBy5QiC1RiC1RI2NjSKzRiSxRouLiyKxRiavSCitSCSvSImJiSatSCypSiirSCynSoWFhYODg4GBgTadUDadTjabUDSdTjibUDiZUDyXUn5+fjqXUjyVUnx8fHh4eESLVkaLVkaJWEaJVkqHWEiHWEqFWE6DWkyDWk6BWlB+WlB8XFJ8XFJ6XFR6XlR4Xlh2Xlp0YGZmZgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH/C05FVFNDQVBFMi4wAwEAAAAh+QQFHgBeACwAAAEAEAAPAAAHtoBeXTEdIR0qWF4/BgECAQtKXjIrQkBAMjVeEAwVFBUHCl4iRV6lUy5eCyalXhgAXidArE6oCxqsFQGiRKxStR+sGLonLk5MTTwsXgoSHBscCwJeWDUu1jFUXjMLCt0OOKzh4uI+DwndDDNeOAzdCQ89XgUKzhwTCcsR9dFeAxasKUItAFZKmBcCFFhxEHirVK5+F1jBwKeKVYZXDA50qtDAgZcHnDwdwKdEQaMABcD1KHAywZFAACH5BAUeAF4ALAAAAQAQAAcAAAdhgF5LDAECAQY+XloqHSEdMVxeDQcVFBUND147MkBAQisuXgMXXqUwCV4uUKVeRh1eBBSsHApeMUysRK8EFqwptTGrpa6wChwbHBMIqTxNTE4xIV49DwrWCzBeUzEu3TVWgQAh+QQFHgBeACwJAAEABwAPAAAHWIA/BgECAQtKEAwVFBUHCgsmXpIYAAsakl4Vhh+YGAEKEhwbHAsCMwsKqQ44mK1WMS6xNlguOk1MTjEhMVCYRh0xTJhEHS69kkkdNjJAQEIrLlckHSHFWoEAIfkECR4AXgAsAAABABAADwAAB3CAXoKDhIWGh4iJiouMjY6PiVg2LpQxVV44DAoKCQ89XiQuTkxNPCxeChEcGxwLAl4iRINSLl4LH4MYAV4nQINOtQsagxW7IkWDU8EmgxkAXjErQkBAMjVeDwwVFBUHCV5cLh0hHSRWXj0FAQIBCUeBADs=)}.n-menu[data-v-b7f5d871] .n-menu-item .n-menu-item-content .settings{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAABx0RVh0U29mdHdhcmUAQWRvYmUgRmlyZXdvcmtzIENTNui8sowAAAH3SURBVDiNpZI/SJZhFMV/90kicsv+EdEQRUNQYC1S0R+ag2hxMKPgvc/r0Ba2FFEpJARhiF/P9QsaGippimgoG4QgI6egICcJEkoIEyI/9L0NvV98llLQmS6c5x7OPc8Rd+d/0LQcUa1W1xZFcR9ocvfOGOPkXwXMbDvQoqov3b0NuA00i8gBYNLM9gBfVXWiviP1E8xsB3AZmANmgHVAt4jMu/sl4DuwFfgI9KvqO4DQYKAFmFXVU8Bj4JqqfsiybAroBZ6r6jFglbtv+MNB6aIHeKKqL4aGhra4eycQRORelmXvU0pHgPYYoy4SSCltFJGDwEngCjANXHT3WyGEeXfvAq4Dze7eKyJ3i6IYyfN8KgCIyAjQDFxQ1VfAaaA/xjiWZdm4iPQBHao6LiLdwJoQwsiiX3D3z0VR1NNd4e5zDfnUACnnWeATsNB4wjYR2Q8cdfcbIYSau58D+kRkwd273X1QRGaAAWC4KIrRPM8nfg/xqrs/jTGOmtlOoKN08zDGOGZm+0SkPcuys7+W3J3Sxd6U0s1ybk0ptda5SqWyOqW0u+QepJTa6lxjD2rASjO7A5wBBszsEEAI4TzQZWaDwBfg23I92AWsV9VnZnYC2OTur0Vks6oOm9lhYFpV3ywp0IiySI/42bzjMca3S71bVuBf8QODpRL9eTmkdgAAAABJRU5ErkJggg==)}.n-menu[data-v-b7f5d871] .n-menu-item .n-menu-item-content--selected .settings{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAKnAAACpwB9NLfEgAAABx0RVh0U29mdHdhcmUAQWRvYmUgRmlyZXdvcmtzIENTNui8sowAAAF0SURBVDiNpdJNiM5RGAXw38ukkJVvMYqZRsqYZmyYDTZWbCxsKLG3pCSaWNmNJU2NmhU7pQjFRhYsJCTWykfJRz5eH8fmefn39lLy1FPn3nPv7Zzz3FYS/1Oz/sItwg3cwuo/HWp1KRjEQtzBTizAfHzCDMbwDk97PTCECXzBWyzGYXzDCXzGGjzHJB6DJJ3ekuRc4R1JNja4VUl2FZ5OsrXDNTO4jRcYx1W8wTEcx1xcwna0cbM7xGXYgxF8LakTuIbLZWVdWevHXixvWniY5ECSkVqfbGBJBpOcKjyc5FCSR90WXjXSnV1hdqqNVuH3eInvTQUDSfYnmUkylmRDkvNJ1icZSjJV+wNJriQ5WKr01avPqtfW3O/hNPaVmrO1N14qp35pa/jclORM4dHqDjevMdYLSTZ3uD6/q405mMYHjOJojewIluJHjfdj51L3Vx7GElzHbqzAXazERWzDazzoZaG7+5PcT/Kkwux5rlvBP9dPgIpDWf6ENxgAAAAASUVORK5CYII=)}.n-menu[data-v-b7f5d871] .n-menu-item .n-menu-item-content:hover .settings{background-image:url(data:image/gif;base64,R0lGODlhEAAQAOYAAMfHx8XFxbm5ube3t7W1tbOzs7GxsQbROGqpeg7JPBDHPpWVlRLFPmylemCnchTDQBbBQFqnbBTBQFSpaBi/QEqrYpGRkRq9QlinbBa/QI+RkRi9QBi9Qh65RI+Pjxq7QkqpYhy5RIuPjRy5Qh63RCC1RIePiSKzRiSxRn6Rg4uLiyKxRiavSCitSCSvSImJiSqrSiatSIeHhyypSiirSCqpSiynSoWFhS6lTHyJfjCjTHyHfjKhTDKhToODgzSfTmaNcIGBgTadTjKfTjabUDSdTjqZUDiZUH5+fjyXUjqXUDqXUj6VUjyVUj6TVHx8fD6TUkCRVEKPVHp6ekKNVnJ8dECPVESNVkaLVkSLVnh4eEiJWEaJVkaJWEiHWEqHWHZ2dkyFWkqFWE6DWkyDWk6BWlB+XFB+WlB8XFJ8XFR6XlR6XFJ6XGR0aFR4XlZ4Xlp0YFh2XlZ2XlxyYFh0YFpyYFxwYlxwYF5uYmZmZgAAAAAAAAAAAAAAAAAAAAAAACH/C05FVFNDQVBFMi4wAwEAAAAh+QQJDwB5ACwAAAEADwAOAAAHpoB5goN4Hxdwg4l5b2Z5W1JMUnlpb4lvJywzKHBzMDYkMJWCZS15Fj6CWgt5LGSJOi95WgYFSHkeNINzVCQyUwEyNwFINyFSc3kKTml5BKh5TwR5akYKyVuCA7Z5UwN5cFIMeXFRKDdBAEhIATdPIU6ieTwqeUEDAjJ5LzOJZvw3NwahOlFmkBoYmSi46gGjITODYfJgUVLmSh4yahQNgsMgQcZEgQAAIfkECQ8AeQAsAAABAA8ADgAAB7CAeYJ5c15pgjo2eIODeEIXLExJQh1mjIM/aXhGUXlRW4xzZVcsGj6CWggwMEeLJxdMGHlaBgVIeSJfJGR5NUp5MlMBMjcBSDdwLId5QlJ5BKd5TwR5PE6DUUx5A7d5UwPMRIJpNnk3QQBISAE3T3MwOHlbJWMmeUEDAjJ5E1IbM3nsCNHRocKNQTtKYBmzKM8iL+LGJJmzJd6lPGQeMHESpUWJIxcdtgCYx0yYhnkCAQAh+QQJDwB5ACwAAAAADwAPAAAHqoB5goN5c4SHhEIoUYiDb3lvNk4wW2UoSYQlEEYhZXlqLFg2KIQtWGkNPoJVC2SMg2FOL3laBgVIeQ4zhFI2MlMBMjcBSDdOJFh5RD+CBKp5TwSCNUlwM06CA7h5UwN5Ui1feU41RjdBAEhIATdAEHCEFBF5QQMCMnkpRPCDRmo3OQS1AZEGgo5BaQ4YoQIjTZ4eLZpQ8DRISY85ZWjAqCEITyNBTpKMORQIACH5BAkPAHkALAAAAQAPAA4AAAemgHmCg3gfF3CDiXlvZnlbUkxSeWlviW8nLDMocHMwNiQwlYJlLXkWPoJaC3ksZIk6L3laBgVIeR40g3NUJDJTATI3AUg3IVJzeQpOaXkEqHlPBHlqRgrJW4IDtnlTA3lwUgx5cVEoN0EASEgBN08hTqJ5PCp5QQMCMnkvM4lm/Dc3BqE6UWaQGhiZKLjqAaMhM4Nh8mBRUuZKHjJqFA2CwyBBxkSBAAAh+QQJDwB5ACwAAAEADwAOAAAHsIB5gnlzXmmCOjZ4g4N4QhcsTElCHWaMgz9peEZReVFbjHNlVywaPoJaCDAwR4snF0wYeVoGBUh5Il8kZHk1SnkyUwEyNwFIN3Ash3lCUnkEp3lPBHk8ToNRTHkDt3lTA8xEgmk2eTdBAEhIATdPczA4eVslYyZ5QQMCMnkTUhszeewI0dGhwo1BO0pgGbMozyIv4sYkmbMl3qU8ZB4wcRKlRYkjFx22AJjHTJiGeQIBACH5BAkPAHkALAAAAAAPAA8AAAeqgHmCg3lzhIeEQihRiINveW82TjBbZShJhCUQRiFleWosWDYohC1YaQ0+glULZIyDYU4veVoGBUh5DjOEUjYyUwEyNwFIN04kWHlEP4IEqnlPBII1SXAzToIDuHlTA3lSLV95TjVGN0EASEgBN0AQcIQUEXlBAwIyeSlE8INGajc5BLUBkQaCjkFpDhihAiNNnh4tmlDwNEhJjzllaMCoIQhPI0FOkow5FAgAIfkECQ8AeQAsAAABAA8ADgAAB6aAeYKDeB8XcIOJeW9meVtSTFJ5aW+JbycsMyhwczA2JDCVgmUteRY+gloLeSxkiToveVoGBUh5HjSDc1QkMlMBMjcBSDchUnN5Ck5peQSoeU8EeWpGCslbggO2eVMDeXBSDHlxUSg3QQBISAE3TyFOonk8KnlBAwIyeS8ziWb8NzcGoTpRZpAaGJkouOoBoyEzg2HyYFFS5koeMmoUDYLDIEHGRIEAACH5BAkPAHkALAAAAQAPAA4AAAewgHmCeXNeaYI6NniDg3hCFyxMSUIdZoyDP2l4RlF5UVuMc2VXLBo+gloIMDBHiycXTBh5WgYFSHkiXyRkeTVKeTJTATI3AUg3cCyHeUJSeQSneU8EeTxOg1FMeQO3eVMDzESCaTZ5N0EASEgBN09zMDh5WyVjJnlBAwIyeRNSGzN57AjR0aHCjUE7SmAZsyjPIi/ixiSZsyXepTxkHjBxEqVFiSMXHbYAmMdMmIZ5AgEAOw==)}.n-menu[data-v-b7f5d871] .n-menu-item .n-menu-item-content .logout{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAK6wAACusBgosNWgAAABx0RVh0U29mdHdhcmUAQWRvYmUgRmlyZXdvcmtzIENTNui8sowAAAEYSURBVDiNpZOtTkNBEEbPFCQIUHgEBoJAYFDgERgSCBjSvU9Q0/AkX5+ApB6PI6lAYPhJUCgEgkApkHyI/nBpb28DPWozu3MyuzsTtpmG2f5CUs32BlABouBsAK8RUU8pPY4IImIfOLd9k4/n+IyII2AZGBUAM8BZlmXX48qVtAksFl6hx/y45B5N4C4fqExI+EVK6QJYkLT9L0GPJ+BU0hYUP9YAScfACtDh52c6wAPQlHRQKoiIN+B5WGC7DXzYfi8VVKvV5nCs0WgsRcSh7b0sy1qlgiJszwG1lFIL/viIknaAdkrpsh8bruBlgmOXbq8UduIXcCLpvkDc31+j20wDBgdty/Y6sMroMJnuda+A2/xGTDvO32OQXrvPg7l3AAAAAElFTkSuQmCC)}.n-menu[data-v-b7f5d871] .n-menu-item .n-menu-item-content--selected .logout{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAKdQAACnUBSiXd/QAAABx0RVh0U29mdHdhcmUAQWRvYmUgRmlyZXdvcmtzIENTNui8sowAAADvSURBVDiNpdO7LkRRFAbg7wwlBZVeoSEKEtHSayUSGs+g8RwqbyDR6ycaiYRC45KoVAqFuAySpdhzODn2mWMyf7KSvdflz7oWEWEUjFfee1hCB0XGt8AL9vGQI9jECa5r+hKf2MZsE8EYjnA1IOMVTDeVAJMDguEYt1VFpyWgji6msNaUwX/wiAN84LSNYAdz6PmdTA/3UjlbbQSveMoQvPUzeBcRpVxExGrl3yQzEdGNiOWIGLqJMCEt3TnDT2G9n/5Zqaj34LmFYEPalewmfmEXdxni0r4gdf8HVcdDLGLe32MKqdxL3FQNxajn/A0ZS19hUhhlTwAAAABJRU5ErkJggg==)}.n-menu[data-v-b7f5d871] .n-menu-item .n-menu-item-content:hover .logout{background-image:url(data:image/gif;base64,R0lGODlhEAAQANUAAOPj4+Hh4dnZ2dXV1c3NzcvLy8fHx8PDw8HBwb+/v729vbu7u7W1ta2trampqaenp6Ojo6GhoZ2dnQzNOgjPOpeXlxq9Qhi9QI+Pj4uLi4mJiSatSCqpSjCjTDSfToGBgTadTjKfTjibUDqZUDqXUDyVUkCRVESNVnZ2dkyFWnR0dE6BWlB+XFB8XFR4Xlh2XlxwYF5uYmZmZgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH/C05FVFNDQVBFMi4wAwEAAAAh+QQFCAAyACwCAAEACwAOAAAGQMBGgUAsEgyoAEMSaTYlgwzgI6taZYkKQHO1ZlDb7jUsrpLLZ3G6ux5zxRgwVayoBBQPh17/EGQgCQiCgwcLKkEAIfkEBQgAMgAsBwAHAAEAAgAABgRA0ykIACH5BAUIADIALAgABwABAAIAAAYEwI4oCAAh+QQFCAAyACwJAAcAAgACAAAGBkCPhzQKAgAh+QQFCAAyACwLAAcAAQACAAAGBEDPKAgAIfkEBQgAMgAsDAAHAAIAAgAABgZA0KbECQIAIfkEBQgAMgAsDAAFAAIAAgAABgZAVypmCQIAIfkEBQgAMgAsDgAGAAIAAwAABgfAlYySmqyCACH5BAUIADIALAwACQADAAEAAAYFQNiFFQQAIfkEBQgAMgAsDAAKAAIAAQAABgTAFysIACH5BAkyADIALAIAAQAOAA4AAAYUQJlwSCwaj8ikcslsOp/QqHRqDAIAOw==)}.nps-container[data-v-5249d570]{color:var(--border-hover-focus-color);position:absolute;bottom:10em;right:1px;cursor:pointer;box-shadow:0 0 10px rgba(0,0,0,.1)}.nps-container[data-v-5249d570]:hover{color:#fff}.nps-container:hover .nps-box[data-v-5249d570]{background:var(--nps-box-hover-bg)}.nps-container:hover .nps-box span[data-v-5249d570]{color:#fff}.nps-box[data-v-5249d570]{background:var(--color-bg-2);display:flex;flex-direction:column;align-items:center;justify-content:center;border-radius:4px;padding:15px 10px}.nps-box span[data-v-5249d570]{color:var(--border-hover-focus-color)}.n-button[data-v-76a25600]{user-select:auto;line-height:inherit;font-size:inherit;text-align:left}.bt-layout[data-v-422be52e]{--n-color: #f2f2f2}.bt-layout[data-v-422be52e]>.n-layout-scroll-container{overflow-x:auto}.n-tag[data-v-a19063b0]{--n-height: 24px;--n-border-radius: 6px;min-width:24px;justify-content:center;font-weight:700;cursor:pointer}.n-layout-sider[data-v-0b6e4e36]{background:none}.n-layout-sider[data-v-0b6e4e36]:after{content:"";position:absolute;top:0;left:0;width:100%;height:100%;background-color:var(--n-color);opacity:var(--menu-bg-opacity);z-index:-1}.n-menu[data-v-0b6e4e36]{--n-font-size: 14px;--n-item-height: 38px;--n-border-radius: 6px;--n-item-text-color: var(--color-sider-text);--n-item-color-hover: var(--color-sider-hover);--n-item-color-active: var(--color-sider-active);--n-item-text-color-hover: var(--color-sider-hover-text);--n-item-text-color-active: var(--color-sider-active-text);--n-item-text-color-active-hover: var(--color-sider-active-text)}.n-menu[data-v-0b6e4e36] .n-menu-item:first-of-type{margin-top:0}.n-menu[data-v-0b6e4e36] .n-menu-item .n-menu-item-content:before{left:16px;right:16px;background-color:var(--color-sider);opacity:var(--menu-bg-opacity)}.n-menu[data-v-0b6e4e36] .n-menu-item .n-menu-item-content:not(.n-menu-item-content--disabled):hover:before{background-color:var(--n-item-color-hover);opacity:1}.n-menu[data-v-0b6e4e36] .n-menu-item .n-menu-item-content:not(.n-menu-item-content--disabled).n-menu-item-content--selected:before{background-color:var(--n-item-color-active);opacity:1}.n-layout-footer[data-v-81702d69]{border-top-left-radius:10px;border-top-right-radius:10px}.layout-container[data-v-19d95428]:before{content:"";position:absolute;top:0;left:0;width:100%;height:100%;background-image:var(--main-bg-image);background-size:cover;background-position:top right;background-color:var(--color-bg-1);opacity:var(--main-bg-opacity)}.bt-layout[data-v-19d95428]{--n-color: transparent}.bt-layout[data-v-19d95428]>.n-layout-scroll-container{overflow-x:auto} +.svg-icon[data-v-8667fe91]{width:1em;height:1em;fill:currentColor;vertical-align:-.15em}@keyframes bounce-in{0%{opacity:0;transform:scale(.5)}to{opacity:1;transform:scale(1)}}@keyframes bounce-out{0%{transform:scale(1)}30%{transform:scale(1.05)}to{opacity:0;transform:scale(.7)}}.bounce-enter-active{animation:bounce-in .3s;animation-fill-mode:both}.bounce-leave-active{animation-name:bounce-out;animation-duration:.2s;animation-fill-mode:both}.n-layout-sider[data-v-3daab35e]{background-color:#3c444d}.sider-header[data-v-3daab35e]{position:relative;height:52px;display:flex;align-items:center;justify-content:center;cursor:pointer;padding-left:8px;padding-right:8px;--un-text-opacity:1;color:rgb(255 255 255 / var(--un-text-opacity));transition-property:color,background-color,border-color,text-decoration-color,fill,stroke;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.sider-header[data-v-3daab35e]:hover{background-color:var(--color-primary)}.sider-header .text[data-v-3daab35e]{margin-right:22px;width:110px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;font-size:14px}.sider-header .message[data-v-3daab35e]{position:absolute;top:16px;right:8px;width:20px;height:20px;display:flex;cursor:pointer;align-items:center;justify-content:center;border-radius:4px;--un-bg-opacity:1;background-color:rgb(252 109 38 / var(--un-bg-opacity));font-size:14px;font-weight:700}.n-menu[data-v-3daab35e]{--n-color: #353d44;--n-item-height: 40px;--n-font-size: 14px;--n-border-radius: 0;--n-item-text-color: #d6d7d9;--n-item-color-hover: #2c3138;--n-item-color-active: #2c3138;--n-item-color-active-hover: #2c3138;--n-item-text-color-hover: #fff;--n-item-text-color-active: #fff;--n-item-text-color-active-hover: #fff;padding-bottom:0}.n-menu[data-v-3daab35e] .n-menu-item{margin-top:1px}.n-menu[data-v-3daab35e] .n-menu-item .n-menu-item-content{padding-right:0}.n-menu[data-v-3daab35e] .n-menu-item .n-menu-item-content:before{left:0;right:0;border-left:4px solid #2c3138;transition:background-color .3s var(--n-bezier),border-color .3s var(--n-bezier)}.n-menu[data-v-3daab35e] .n-menu-item .n-menu-item-content .n-menu-item-content-header{width:100%;height:100%}.n-menu[data-v-3daab35e] .n-menu-item .n-menu-item-content .n-menu-item-content-header .n-menu-item-link{display:flex;align-items:center;width:100%;height:100%;padding-left:52px;padding-right:18px;background-repeat:no-repeat;background-size:16px auto;background-position:25px 11px}.n-menu[data-v-3daab35e] .n-menu-item .n-menu-item-content--selected:before,.n-menu[data-v-3daab35e] .n-menu-item .n-menu-item-content:hover:before{border-left-color:#20a53a}.n-menu[data-v-3daab35e] .n-menu-item .n-menu-item-content .home{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAKwwAACsMBNCkkqwAAABx0RVh0U29mdHdhcmUAQWRvYmUgRmlyZXdvcmtzIENTNui8sowAAAFZSURBVDiNpdO9a1VBEAXw3zOioIUQEdFGkQdWVtr6D1ikERtRppLU6awUsUkh2CgoBNwhoPhsLESxERR7wcI2XSBNMAHRNFmLbB6Xa64RXFjYOXvmzMfOjmqt/mcd2I+QmUuZOcgbDWWQmTN4iFms4wGu4jC+RMT7wQwy8xBe4FtE3MBXPMdqE5sfLCEzj+Il3kXEE4iIJTzFFbzB9z0FMvMYJphExLPuXUQs4y1eYfmPHmTmbHN+FBGv92zMDm+ulXAzItZHtVaZeRH3sBgRn4ecOyKXcRt3dkuYwyJOZeaJfZyP42TjX1Nrne5SyqSUMu5ho559tpQy2bUP9gL8wHYnzbtYzczTuB8RHzs8/H0Sz+ETbuEDxg3f7pL6AhW/2vknNiNiCxvY6uDT8e2XMINLmbmC89js3I0z8wLOdP36Aht43KIcwULD1+w82/WGT+dk8DP96/oNlqecb6uu8YEAAAAASUVORK5CYII=)}.n-menu[data-v-3daab35e] .n-menu-item .n-menu-item-content--selected .home{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAKTQAACk0BtZPkxgAAABx0RVh0U29mdHdhcmUAQWRvYmUgRmlyZXdvcmtzIENTNui8sowAAAFVSURBVDiNpdO9atVBFATw3/UjBEGidkJSRFFIiKJBsAmaBxDFQptUIoJPYCc2Wmpjo4haRUFMnsEmnXUIKQXFRlEvaiIxY/HfheXCNUUWht2dM+fsYXe2l8Ruxp4d4jN4gDNlvw/70dMQw8ZRXMdFbOAvpjGJ93iHrWEdHMdDfMMcPuMpjiC4hYPDOpjCPazgceGeYS8m8BYj2AZJWpxOspTk9gBfcTPJSpJrlRtMXk5yY0hyxUKSF0lOtQWuJHmV5NIOyRWXk7xOcrVe4iSW8BXj/3mZ+jpfiv5ErThS5udJzjcnHUgyXubKnU3yUrcerR38wSH0sVm4C3iDO+Xm5wu/hX44jI3WB4OePoaPeIIPOm9U3XYVtQV6JfC77PtYxyrW8KPwP9vDWiNFZ5BzOtvO4Fejm8ZJzGqM1BbYLHiE77pPc7fEPuE+FjCGxaLV2+13/gdXJgTGYi2BZQAAAABJRU5ErkJggg==)}.n-menu[data-v-3daab35e] .n-menu-item .n-menu-item-content:hover .home{background-image:url(data:image/gif;base64,R0lGODlhEAAQANUAAPPz8+np6d3d3c/Pz8vLy8XFxb+/v729vbu7u7e3t7W1tbGxsa+vr62traurq6mpqaenp6WlpaOjo6GhoZ2dnZubmwrPOpmZmQzLPJeXl5WVlRLFPhLDPhy5RI+Pjx63RImJiYeHhyypSiirSIODgzKfToGBgTabUDibUDiZUH5+fj6TUnx8fECRVEKPVHp6ekSNVkCPVESLVnZ2dnR0dEyDWnBwcFR4XlZ2Xlh2XlpyYGZmZgAAAAAAAAAAAAAAACH/C05FVFNDQVBFMi4wAwEAAAAh+QQJHgA7ACwAAAEAEAAOAAAGhsCdcLgzJUjE5HCmECxMFYZHuWMRHDuJINIg2JIqAmQYOS6SpEEkORFciOkJlVIwCTUEDfVOyOweFyAzVDMgFw1DBSFDOkMkBUQ2B0g1HyIdNUUGX0OTOy0jNyMrRQecOzYIKjsyKDspMDsvpkQGFDklJzsoJTgVBkkIAAEYLjsuGAEACEJBACH5BAkeADsALAAAAQAQAA4AAAZxwJ1wuDMlSMTkcKYQLEwVhke5YxEcO4kg0iDYkioCZBg5LpKkQSQ5EVyI6QmVUjAJNQQN9U7I7B4XIDNUMyAXDUMFIVQkBUQ2B0hKJgZfQ5FUJgeWOzYIKlQvm0QGFEM6QxUGSQgAARYcIhsWAQAIQkEAIfkECR4AOwAsAAABABAADgAABnfAnXC4MyVIxORwphAsTBWGR7ljERw7iSDSINiSKgJkGDkukqRBJDkRXIjpCZVSMAk1BA31TsjsHhcgM1QzIBcNQwUhVCQFRDYHSEomBl9DkVQmB5Y7NggqQzpDL5tEBhQ5NR8iHTU4FQZJCAABGC47LhgBAAhCQQAh+QQJHgA7ACwAAAEAEAAOAAAGfcCdcLgzJUjE5HCmECxMFYZHuWMRHDuJINIg2JIqAmQYOS6SpEEkORFciOkJlVIwCTUEDfVOyOweFyAzVDMgFw1DBSFUJAVENgdISiYGX0ORQzpDJgeWOzYIKjs1HyIdNTsvnUQGFDklJzsoJTgVBkkIAAEYLjsuGAEACEJBACH5BAUeADsALAAAAQAQAA4AAAaCwJ1wuDMlSMTkcKYQLEwVhke5YxEcO4kg0iDYkioCZBg5LpKkQSQ5EVyI6QmVUjAJNQQN9U7I7B4XIDNUMyAXDUMFIVQkBUQ2B0hCOkMmBl9DkTs1HyIdNUUHmDs2CCo7Mig7KTA7L6JEBhQ5JSc7KCU4FQZJCAABGC47LhgBAAhCQQAh+QQFHgA7ACwGAAkABQADAAAGDsDdTiesfUSdWmt0G62CACH5BAkyADsALAAAAQAQAA4AAAYVwJ1wSCwaj8ikcslsOp/QqHRKdQYBADs=)}.n-menu[data-v-3daab35e] .n-menu-item .n-menu-item-content .website{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAABx0RVh0U29mdHdhcmUAQWRvYmUgRmlyZXdvcmtzIENTNui8sowAAAHuSURBVDiNpZO/S9ZRGMU/5xZl0NJQDf2ybAgrGgylGloiCR0jDAO3+4WQlqA/oiHkpUGvgYtFRENL5g+CCEIiqSjMoFKsaJFqScMXfU9DV3vVluiZDs997odzuM+Vbf6n1v+tmVJqA9okHba9CXgF9McY+1fPqtpBSmkH0Al8B45Iema7DDRlyHagK8b4ZQ2gp6dnn6QB2+2SdgFvJW2xPQeUbdcCM5L6gNYY4/QyIKW0AbgGPAb2AueALuAQMA9MApeAu7YnJZ0ALscYyyE7aZf0JsZ4R1I/MAKMAwFYl+0/AW4URXFb0gTQTh4AOGP7Xta7gbEY43NJw8BA1hPAHoA821wdYUxSCZi13QhslPTI9kmgLGkUOG37m6QXwGbbF2OMTUvPuGD7JzCbM2N7FigD87bnJC3r7HyhOsK0pNEY46CkoRxhRNJDYDjGOGz7fdYPsqNP1YBB2y0Ai4uLH4GjKaUG281AS0qpAThQqVSmsrsWYAj+bOIt4Gpvb+/ZEMJ+4BTwLp8ZaASOhRA6UkofgHrgyupFqpN0H7gA7ATGJW21/SNvY10IYcZ2n+3WoiimVgAAuru7a0MIncBXoF7SU9sLwHHgJbDN9vWiKD4v3VkBACiVSqqpqekAzgMHc/s1vz/TTVbVGsC/1i9dw/hm1FHr2QAAAABJRU5ErkJggg==)}.n-menu[data-v-3daab35e] .n-menu-item .n-menu-item-content--selected .website{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAKnAAACpwB9NLfEgAAABx0RVh0U29mdHdhcmUAQWRvYmUgRmlyZXdvcmtzIENTNui8sowAAAGCSURBVDiNpdLPaw9wGAfw13fExWVq1IzYJEkc5kezgws5zM2S+irOWi7KH+EgB0e1m9ZycMGWm0jLRYqUWNNyIDkw2lq9Hb7P5rsfDvKpT717Pp/n/byf53k3kvif0/GX+AXcx3t8wgQurvexsUrBDozgGw7jBRZwHK+wHbeKdA1BLx6iiZ14i078LJLd+IJRnMVMO8Em3MQT7MH5qnQQ8/iAq7hXeBDXsLCxqjfxBuPVRide4xA2lPxnuIPP2Fo5o5JIMp6ku/BAkuHCp5MMFr6S5Gjh7iRjSSwp6MUpzOEYNmMRJ6v/rmqnG7uwpVpdJljEryKYr9hcJc+3DXIJd1TOMsEMnmMW36vSYzQq4Sn21Vqn0INz/DHSBIYKf8QR9ONMxfuxH9P1ZwiT7Qru4gaGsbfm8a7eUnMZwCUtdx7AdVYaqQ8PtCzbo7XGLvyo/vusNNL0agJabhvB16oyVcM6gZfYhts1q9LX2mv7bSS5nGQyyWzdR0ma6/xdo+Cfz28JnsxkWP6vVAAAAABJRU5ErkJggg==)}.n-menu[data-v-3daab35e] .n-menu-item .n-menu-item-content:hover .website{background-image:url(data:image/gif;base64,R0lGODlhEAAQAOYAAPHx8e/v7+vr6+np6efn5+Xl5eHh4d/f393d3dXV1dHR0c3NzcvLy8nJycfHx7+/v729vbu7u7m5ube3t6+vr62traurq6mpqaenp6WlpaGhoZ+fn52dnZubm5mZmZeXlxTDPpOTkyqrSiqpSoeHhy6nSiynSoWFhS6lTDCjTDKhTjSfTjadTjadUDSdTjabUDyXUjqXUjyVUj6TUkCRVHp6ekSNVkaLVkSLVnh4eEqHWHZ2dkiHWEqFWE6BWlB+XFJ8XFJ6XFR6XFZ4XlZ2XlpyYFxwYmZmZgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH/C05FVFNDQVBFMi4wAwEAAAAh+QQFDgBHACwAAAEADwAOAAAHbYBHgoIdCgIACRyDizsTFQ0XGA4WEjuLNQMnH4shJwU1gw8di4sdD4IaGKSkGBpHC5argzsMRwYbsoMbB0cHHrmCHghHDDnARzm1GhnHGa5HEL+yHxCDmJqcJASg1hEUDRgZkxLGqxoJAQGJi4EAIfkEBQ4ARwAsBAADAAgAAgAABxGAR0dDPkBDgi0gNCgqNCAsgQAh+QQFDgBHACwEAAUACAACAAAHEYBFKUAogyNGPjZHPT5HMD+BACH5BAUOAEcALAMABwAKAAIAAAcWgDcoJjclKDciKTc6Kig9KCo6Jis6gQAh+QQFDgBHACwEAAkACAABAAAHCoA+Nkc6PkcwP4EAIfkEBQ4ARwAsBAAKAAgAAQAABwqARShAJSlAI0aBACH5BAUOAEcALAQACwAIAAIAAAcRgCwgMyUpMiAvR0dDPkJDioEAIfkECTIARwAsAAABAA8ADgAABxaAR4KDhIWGh4iJiouMjY6PkJGSk5SBADs=)}.n-menu[data-v-3daab35e] .n-menu-item .n-menu-item-content .ftp{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAABx0RVh0U29mdHdhcmUAQWRvYmUgRmlyZXdvcmtzIENTNui8sowAAAH6SURBVDiNpdM/qJZlGAbw3/1+n31o/0BJrMFaGmoRRBsM14M4iINLixBxHs6pxSxBmhpCqEk5CL2Pp5ZAdBD/UIJNhdBQzTqJYKkoB8HEY+r53rvB99hnuXlNNzfXfT3X9dzPE5npWTB8WrPWuhvvYwvGOI+vSykn/8uNSQfz8/MvdV33DRaxBlMInMZ9LI7H449mZ2cfLM80y0Xbtiu7rjsZEecz8ws8xBEc7l3swfXBYHB8bm6u+Z9A0zSfYmtmXoyIg/gKV3AJLQ7hV+wcjUYzT0Sota7C2Yg4kJm7sQM/YQOWcAFb+ygn8HHXdVMzMzMPlx1swML09PSPEXEIpzCNc/gBH+D7zPyylHIGt5umeWsywou4B5n5BhZKKTdwFddKKTdxJyLe7PmLWD0pcB2v9PVlvN627WZsxKZa6ya8hj96zsuZuUD/DobD4YWlpaUVtdbP8A62RcRNrO+38SG2I2qtv2AUERcfXyLUWnfhu8zcGBEFv+PVPtp9vI2j+A3vlVKOPSHQi+zHrcz8NiLebZrmr3yE1ePx+OfBYLAfK0opnz9eY9u2WzJzHRJ/Yy3uRsTePnfgSmYexAu4gZX9/NUh9kXElH8xxgjPTfTWR8RmPMBg+XCcGOKTiHh+gtxFxKqu685gXd/7MyJ29g6bCe7teNbv/A8ZE8Q3GMBOFwAAAABJRU5ErkJggg==)}.n-menu[data-v-3daab35e] .n-menu-item .n-menu-item-content--selected .ftp{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAKnAAACpwB9NLfEgAAABx0RVh0U29mdHdhcmUAQWRvYmUgRmlyZXdvcmtzIENTNui8sowAAAGVSURBVDiNpdLdaw9wFAbwzw+jzVspIxdIuXHhQqbGHVmSRLlx4w9YKbkhpVz4A6SkKOWlldA0uXA1Um645motL7NImsnYNI+LnZ9+W63IqW+dzvc8zznPOaeRxP/YgnnixzCISUzgEQ7/DcEK3MEefEMDbfiKI7iKxfMRtKMfT3EePwtwCdM4gVHcnoVL0nxnk0wl2ZvkYZLuJKeSHE+yO0lfkgOZsd4mrgnuSPI4SU+SW0nGkwwkeZ1kKMmDJGNJric5mGQwSVsrQXeSu+V3JbmRZE2SK0kuJuks4i2Vcz/J1iR/tCzH9/I34hM+YATv8bEGublyJrCqdYijWF3+MDagC9uwvd46vK2clVXEogq8rHWdwQ7sq6rraxu92F9rfYYleNVKMI3LuFlVh/ECQyVtEmPow3McLYzGnFM+jc+4hl0YR0rvk/pvw7kmoJFkJ9ZW4g90mrnCk6W7gTe4gGU13PbCjzSS9KOnpYvp0jjrZEvGFBY2i+NeI8kmLG1J/IUODFRn8A6HqsPW8/8ydwb/bL8B1eb4OuOuSusAAAAASUVORK5CYII=)}.n-menu[data-v-3daab35e] .n-menu-item .n-menu-item-content:hover .ftp{background-image:url(data:image/gif;base64,R0lGODlhEAAQAOYAAP////39/fv7+/f39+3t7evr6+Pj49/f39nZ2dfX19XV1dPT09HR0c/Pz83NzcvLy8nJycfHx8XFxcPDw8HBwb+/v729vbu7u7W1tbOzs7Gxsa+vr62trampqaenp6OjowDZNp+fnwLXNp2dnQTVOATTOJubmwrPOpmZmQrNOgzLPJeXl5WVlRi/QBa/QJGRkY+PjyC1RI2NjSSxRomJiYeHh4WFhYODg4GBgX5+fnx8fECRVESNVkSLVkaLVkiHWHR0dE6BWnJyclB+XFJ8XFR6XlR4Xlp0YFh0YGZmZgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH/C05FVFNDQVBFMi4wAwEAAAAh+QQJMgBJACwAAAEAEAAOAAAHvYBJgoIhCAICCiuDi4IOEQsBAQ4QE4yCCR06DRUWD0AYDYwaATALNBweMA8sAB6LCC8QAwwEBQwDESwIgzQOSTURQBMVQBA5SQw3grFJKBdJGRtJFCxJDzKCOApJNg01DA42DDZJCziDCRsMAhQGBxIBDBsJiygCORYjqB8XNgAmjDZ8SCLjxg0YSTRkGBSkh48fO3i0UKGiRY8dP3z4GBKDhMcSIkCIBCGihEcSM5AUWVlkyAmRKYiwLHIkEAAh+QQFDgBJACwAAAEADwALAAAHj4BJgoIhCAICCiuDi0kOEQsBAQ4QE4xJCR06DRUWD0AYDYsaATALNBweMA8sAB6DCC8QAwwEBQwDESwIgjQOSTURQBMVQBA5SQw3SbFJKBdJGRtJFCxJDzJJOApJNg01DA42DDZJCziCCRsMAhQGBxIBDBsJgygCORYjqB8XNgAmizZ8SCLjxg0YSTRkEBQIACH5BAUOAEkALAAADAACAAMAAAcIgEE9MSRIRYEAIfkEBQ4ASQAsAgAMAAEAAwAABwWAPiRFgQAh+QQJDgBJACwAAAEADwAOAAAHIIBJgoOEhYaHiImKi4yNjo+QkY8/OzyMJCUijEVFQ4mBACH5BAkOAEkALAAAAQAPAA4AAAepgEmCgiEIAgIKK4OLSQ4RCwEBDhATjEkJHToNFRYPQBgNixoBMAs0HB4wDywAHoMILxADDAQFDAMRLAiCNA5JNRFAExVAEDlJDDdJsUkoF0kZG0kULEkPMkk4Ckk2DTUMDjYMNkkLOIIJGwwCFAYHEgEMGwmDKAI5FiOoHxc2ACaLNnxIIuPGDRhJNGQQFKSHjx87eFgaFIOExRIiQGgEwQhJkY9FJg4KBAAh+QQFDgBJACwAAAEADwAOAAAHsYBJgoIhCAICCiuDi0kOEQsBAQ4QE4xJCR06DRUWD0AYDYsaATALNBweMA8sAB6DCC8QAwwEBQwDESwIgjQOSTURQBMVQBA5SQw3SbFJKBdJGRtJFCxJDzJJOApJNg01DA42DDZJCziCCRsMAhQGBxIBDBsJgygCORYjqB8XNgAmizZ8SCLjxg0YSTRkEBSkh48fO3gs6rHjh6AYJDKWEAGiIwgRJUgIQlKkpKUkJpMEAgAh+QQFDgBJACwNAAwAAwADAAAHC4A+PkMkJDNFRUeBACH5BAUOAEkALAQADAAGAAMAAAcOgElJLSoqLYKISUVDiYEAIfkECTIASQAsAAABABAADgAABx2ASYKDhIWGh4iJiouMjY6PkJGSk5SEJyAgKUSFgQA7)}.n-menu[data-v-3daab35e] .n-menu-item .n-menu-item-content .database{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAK6wAACusBgosNWgAAABx0RVh0U29mdHdhcmUAQWRvYmUgRmlyZXdvcmtzIENTNui8sowAAAHISURBVDiNpZPPi81RGMY/z+3mpmasGBOZEgthQ5SFTDM2svMjOyt9X1eUEhshRbGx1e1cO5M/YVIzSWbjx4RidTeKbl3XgoyYW5rHwvlO35TZzFtn8fac5znPc855ZZvVVL3apJR2AGeAw5JGbI9m6Iukvu0ZIEVEp+TINimlOnANGAc6wCvbHUm/AAHrgZ3AHmA7MC3pVlEUS6WDWaALHIuIb/9xOw3QarVGa7XafduzwGQtg+PA+xXIy9VsNnvAHDBRvYMBcDyldEDSvO1nkj7lCNhea3uLpEO29wOjmbMsUAfOAYu2C+CC7XW2hzL+A1iw3QWu5/0vqgIAD4A7EXFxpQgppRPA1bIvBX4Dt4GJlNIV4DPQlTTIERrApryeA3eBh1WBBkBEnM+n7AO22R7O+ALwISJeZvxkySn/wQD4CDyV9Nj2XET0/7G+ATgIHAEmgbGIaJQO1gCngF22A7iRUloCfgLOpwnoA4+AFvC6GmEGOA1ciogpgHa7vRkYygLfi6LoVdzcI79CGUHAZf5+jh4wb/udpK/5EoclbQX2AruBt8DNiFhUdRpTSmPAWeCopI22R7KDfh6mJ8BURLwpOVrtOP8BlJPKP95zNKgAAAAASUVORK5CYII=)}.n-menu[data-v-3daab35e] .n-menu-item .n-menu-item-content--selected .database{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAKdQAACnUBSiXd/QAAABx0RVh0U29mdHdhcmUAQWRvYmUgRmlyZXdvcmtzIENTNui8sowAAAF3SURBVDiNpdI5a5VhEAXg58qFRDBi4RIiBkSJoiIoihZi0EpsFWy0FAtbSwvB0uUn2LiUliIWMWgT90i0sRFcYxqFiCYQcizufHK9hUQcGIZh3jnvOYdpJfE/sayn34pLeI4PWKj8jJe4jJHuhVYxaOM8RvEGT6r+RAursQ27sBl3cBGLkkgynuRmklXV/y0Hk9xOMpbkt4RRvMK3JciexkMc6pYwhyl8wlM8wPuSAMuxAQexF4PYif4GYAH7C+g0hrASKwrgO2bxEdfKs0doN7oWkkwmObEED44leVY7f0g4Wbr24Uv9Nl8M+orVECZwH9fR3+56AGer7sEmDFQ/i7d4XP3xZqdhMI93GMfdcnmmx/01OIAjOIxh9DUAwW5sx6lyeRE/atanc1AzuIXXOtfaaoy5l+Rqj1nrk2xJMlLH0z27kmSi28QWzpWJ0zq3MIWvRX8AG4vlDkziAuYagCaGcQZHsQ5rS8JM5Rhu4EWz0Avwz/ELJiL9PSckq44AAAAASUVORK5CYII=)}.n-menu[data-v-3daab35e] .n-menu-item .n-menu-item-content:hover .database{background-image:url(data:image/gif;base64,R0lGODlhEAAQAOYAAP////39/fv7+/Hx8e/v7+np6ePj4+Hh4d/f393d3dfX19XV1dPT08XFxcPDw8HBwb+/v7u7u7m5ube3t62traenp6OjowDZNgLXNp2dnZubmwrPOpmZmQrNOpeXlxLFPhTDQBTDPhbBQBTBQBa/QBq9Qhi9Qh63RBy5QiC1RCC1RiKzRiSxRouLi4mJiYeHhyirSCynSoWFhS6lTIODgzKhTjSfTjadTjKfToGBgTibUDiZUHx8fD6TUnh4eHZ2dkiHWHR0dEyDWnJyclB+XFZ4XlZ2Xlh0YFxwYGZmZgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH/C05FVFNDQVBFMi4wAwEAAAAh+QQFMgBJACwAAAEADwAOAAAHr4BJgkUzIB0XFxsfM0WCgjUlMD1CRERAOiwiNoIlLEiOoElIKSVJFzehoTsXSRggJzZCR0hIR0I2JyIYSQEyOTErKCQkKCoxNDIBvAYaqYIcB8oCHBAHDA4QEA4MBg8cAkkAHIIyGhYWGi/PAEkCBQ4cQaBBHg4F4AA0GQsGBgkJB6xloMFOQQRHP3jwkCcoAgJBFBg0qNAiRw4XGSIskADKxwQDAwIEIGAgAg1BgQAAIfkECQ8ASQAsAAABAA8ADgAABxaASYKDhIWGh4iJiouMjY6PkJGSk5SBACH5BAkPAEkALAAAAAAPAA8AAAe0gEmCRTMgHRcXGx8zRYKCNSUwPUJEREA6LCI2giUsSI6gSUgpJUkXN6GhOxdJGCAnNkJHSEhHQjYnIhigMSsoJCQoKjGgATI5qYI0MgFJAQYayUkcB80CHBAHDA4QEA4MBg8cAkkAHIIyGhYWGi+CHABJAgUOHEGgQR4OBeQANBkLDBhIkOCAtgw04imI4OgHDx73BEVAIIgCgwYVWuTI4SJDhAUSQPmYYGBAgAAEDESgISgQACH5BAkPAEkALAAAAQAPAA4AAAevgEmCRTMgHRcXGx8zRYKCNSUwPUJEREA6LCI2giUsSI6gSUgpJUkXN6GhOxdJGCAnNkJHSEhHQjYnIhhJATI5MSsoJCQoKjE0MgG8BhqpghwHygIcEAcMDhAQDgwGDxwCSQAcgjIaFhYaL88ASQIFDhxBoEEeDgXgADQZCwYGCQkHrGWgwU5BBEc/ePCQJygCAkEUGDSo0CJHDhcZIiyQAMrHBAMDAgQgYCACDUGBAAAh+QQJDwBJACwAAAAADwAPAAAHtIBJgkUzIB0XFxsfM0WCgjUlMD1CRERAOiwiNoIlLEiOoElIKSVJFzehoTsXSRggJzZCR0hIR0I2JyIYoDErKCQkKCoxoAEyOamCNDIBSQEGGslJHAfNAhwQBwwOEBAODAYPHAJJAByCMhoWFhovghwASQIFDhxBoEEeDgXkADQZCwwYSJDggLYMNOIpiODoBw8e9wRFQCCIAoMGFVrkyOEiQ4QFEkD5mGBgQIAABAxEoCEoEAA7)}.n-menu[data-v-3daab35e] .n-menu-item .n-menu-item-content .docker{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyZpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuNi1jMTQ1IDc5LjE2MzQ5OSwgMjAxOC8wOC8xMy0xNjo0MDoyMiAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENDIDIwMTkgKFdpbmRvd3MpIiB4bXBNTTpJbnN0YW5jZUlEPSJ4bXAuaWlkOjQ2OUMyQTlEQzA3RjExRUNBRjc0QjI4QkM0QUMxRDBBIiB4bXBNTTpEb2N1bWVudElEPSJ4bXAuZGlkOjQ2OUMyQTlFQzA3RjExRUNBRjc0QjI4QkM0QUMxRDBBIj4gPHhtcE1NOkRlcml2ZWRGcm9tIHN0UmVmOmluc3RhbmNlSUQ9InhtcC5paWQ6NDY5QzJBOUJDMDdGMTFFQ0FGNzRCMjhCQzRBQzFEMEEiIHN0UmVmOmRvY3VtZW50SUQ9InhtcC5kaWQ6NDY5QzJBOUNDMDdGMTFFQ0FGNzRCMjhCQzRBQzFEMEEiLz4gPC9yZGY6RGVzY3JpcHRpb24+IDwvcmRmOlJERj4gPC94OnhtcG1ldGE+IDw/eHBhY2tldCBlbmQ9InIiPz606BQhAAAAn0lEQVR42mL8//8/AyWAiYFCQB8DZs2a9R+EsckxUhoGLPhshVkCxGB2WloaI4ZCZBeA2LgwMpg5c+Z/rF7AZisyOz09nXH69OkNTExM9f/+/QtiZGQ0BQcikAHGxIDMzMwGcOgzMa0D6qkEuwBXCOMDINeQnQ5gmskyAOj3GIx0API/csjiAkB1ZsCoPI3VAPTowedsqqZEijMTQIABAO7NWyhHRpXVAAAAAElFTkSuQmCC)}.n-menu[data-v-3daab35e] .n-menu-item .n-menu-item-content--selected .docker{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyZpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuNi1jMTQ1IDc5LjE2MzQ5OSwgMjAxOC8wOC8xMy0xNjo0MDoyMiAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENDIDIwMTkgKFdpbmRvd3MpIiB4bXBNTTpJbnN0YW5jZUlEPSJ4bXAuaWlkOjQ2OUMyQTlEQzA3RjExRUNBRjc0QjI4QkM0QUMxRDBBIiB4bXBNTTpEb2N1bWVudElEPSJ4bXAuZGlkOjQ2OUMyQTlFQzA3RjExRUNBRjc0QjI4QkM0QUMxRDBBIj4gPHhtcE1NOkRlcml2ZWRGcm9tIHN0UmVmOmluc3RhbmNlSUQ9InhtcC5paWQ6NDY5QzJBOUJDMDdGMTFFQ0FGNzRCMjhCQzRBQzFEMEEiIHN0UmVmOmRvY3VtZW50SUQ9InhtcC5kaWQ6NDY5QzJBOUNDMDdGMTFFQ0FGNzRCMjhCQzRBQzFEMEEiLz4gPC9yZGY6RGVzY3JpcHRpb24+IDwvcmRmOlJERj4gPC94OnhtcG1ldGE+IDw/eHBhY2tldCBlbmQ9InIiPz606BQhAAAAn0lEQVR42mL8//8/AyWAiYFCQB8DZs2a9R+EsckxUhoGLPhshVkCxGB2WloaI4ZCZBeA2LgwMpg5c+Z/rF7AZisyOz09nXH69OkNTExM9f/+/QtiZGQ0BQcikAHGxIDMzMwGcOgzMa0D6qkEuwBXCOMDINeQnQ5gmskyAOj3GIx0API/csjiAkB1ZsCoPI3VAPTowedsqqZEijMTQIABAO7NWyhHRpXVAAAAAElFTkSuQmCC)}.n-menu[data-v-3daab35e] .n-menu-item .n-menu-item-content:hover .docker{background-image:url(data:image/gif;base64,R0lGODlhEAAQAJEDAJmZmSClOpiYmJmZmSH/C05FVFNDQVBFMi4wAwEAAAAh/wtYTVAgRGF0YVhNUDw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuNi1jMTQ1IDc5LjE2MzQ5OSwgMjAxOC8wOC8xMy0xNjo0MDoyMiAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENDIDIwMTkgKFdpbmRvd3MpIiB4bXBNTTpJbnN0YW5jZUlEPSJ4bXAuaWlkOkIzQURGQkRFQzA3RTExRUNBNUIyOUQ0OTNDNTk5MjFEIiB4bXBNTTpEb2N1bWVudElEPSJ4bXAuZGlkOkIzQURGQkRGQzA3RTExRUNBNUIyOUQ0OTNDNTk5MjFEIj4gPHhtcE1NOkRlcml2ZWRGcm9tIHN0UmVmOmluc3RhbmNlSUQ9InhtcC5paWQ6QjNBREZCRENDMDdFMTFFQ0E1QjI5RDQ5M0M1OTkyMUQiIHN0UmVmOmRvY3VtZW50SUQ9InhtcC5kaWQ6QjNBREZCRERDMDdFMTFFQ0E1QjI5RDQ5M0M1OTkyMUQiLz4gPC9yZGY6RGVzY3JpcHRpb24+IDwvcmRmOlJERj4gPC94OnhtcG1ldGE+IDw/eHBhY2tldCBlbmQ9InIiPz4B//79/Pv6+fj39vX08/Lx8O/u7ezr6uno5+bl5OPi4eDf3t3c29rZ2NfW1dTT0tHQz87NzMvKycjHxsXEw8LBwL++vby7urm4t7a1tLOysbCvrq2sq6qpqKempaSjoqGgn56dnJuamZiXlpWUk5KRkI+OjYyLiomIh4aFhIOCgYB/fn18e3p5eHd2dXRzcnFwb25tbGtqaWhnZmVkY2JhYF9eXVxbWllYV1ZVVFNSUVBPTk1MS0pJSEdGRURDQkFAPz49PDs6OTg3NjU0MzIxMC8uLSwrKikoJyYlJCMiISAfHh0cGxoZGBcWFRQTEhEQDw4NDAsKCQgHBgUEAwIBAAAh+QQFHgADACwAAAAAEAAQAAACHZyPqcvtFsKbtII6rgWX+/8d4KgZZJicZTpi7lIAACH5BAUeAAMALAYABQAFAAEAAAIDTGYFACH5BAUeAAMALAMABwAIAAIAAAIFTGZol1YAOw==)}.n-menu[data-v-3daab35e] .n-menu-item .n-menu-item-content .wp{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAMgAAADIBAMAAABfdrOtAAAAJ1BMVEVHcEyZmZmcnJyZmZmampqZmZmampqfn5+ZmZmZmZmampqZmZmZmZke99ZiAAAADHRSTlMAhSjFRtpoEKDvsPCFVtuwAAAMRklEQVR42r1cS28b1xUmh8OHHguydtLU4YKBnaKuuJDDPtJ2Fkytwi3KBZMWTVFwwQQI2qazYKA4sGstlAdSBOUiqYPYCy4UFG0X5SJxi7gIuDBJURLF+VEVqZk753XvzNCy7kqPmXvuOec7r3vPnVQq/rBfeqbmeCdjXHv3Yj31BMbbzyzmD8f43RtnTOLb//CE8bvXz5JE39OM47MiYz/lGcbLZ6Kc51qecUy+8dgkrKe8yPFy5TFF1fdijOPHEtk7LS/WmPz+MdTR82KO6dKKecuLP6bfXJJGz3viVNISjdq10sm4UJOoFJfAFdP5r57+afjvK699n2k/McYs4g5nnzN3+PalAXGZSe3lW/j9f4rvW2/ipz5JRuMyevl/WkHYf0UPvpBI6UhSH5ge/TmSWXFJhYzb5odzznJq+SMUVeRrFhTZZ3FpFKCH7UQ/n38WvLCbXFi/iffKG4kF9ovwja/iMg94+TTO87nw+S87cYnky+Fb7RjPh48fJ7BgK4xuw+inby3pi4Cvi9R93lnGsHD0GUdJeVs9+gr/55XS3+drmNZ+DB1yMJ5Xr/4wLiNMsvYl5JjH3GcqbU468RiZEYXYF3iYukafGcRiJWTkVfz3N8VQPCWu82YsrWzLwtJnX/frssBMrDiiQZkyI5wLKUOexPCMD+Bfr5vTFCSyjWhbCbidVGTnJ48fQMNvRZl9TtL6G9Ep168l3es8WEOA+fU4iR0I7fmAlX2Nj+txRr4TL318j7Mylb1rhiMjHTNTnbY5K5sikS5jhGZ4+gHiYcDKkUntQCPl+Pn2Z5wVSfVXGSPbSbL6Fxgrf9Nb+0wxbicrHZSDsXw/OdYnjaNlhDUfB+rFqjbqVakkb3kJxy7V7ogRaRF3kHeSEgn9e1njJQNpNXkwjVkAX7yhiGQ18vKxNetQ84/LBgws+YGML4d4nKsJGWlLXpDgyyYMJmXkU1n4OG5miaqSMlKXYdSUwtVoSUaGGoNAf8/3sLS2EzLS1IB12uF/m7CEYim1Ay8JQXwbY6uQkMZMG2XvcZXs+b+6CYkIoWOVKcXCDthO6lCEeG4xpaQx2ZtnQCQQTpGq5KH/az8pkZFA5A5VioswsvDU/6nVPi9d3Kr7BdT38ltbpVKtttiDmtRq10pPb91QJdyhflPjgNinnL/eMRQcGVOORSa1KVEGk6E55RSJuNjhrGrMNpKIbUp817BZVE2F6G1NTgDFNTbsNI0Q2mYdwx7Ie+L/gnTQk171I9cQqYib7VbpktrRvHuttAWnuvJaqdaTfZdVgRnpBBknB3vf4AZdgxfeRVqoQOFt6vChBnxix2DyI6SxIoyKbZ3Rioa9itMI9N6LCOBN4JVn5s01itScIaA4Faj5EQCXr3dLMAOppM3jf6Gy39mFmh8CcPlivQmfHhjShb4+yDv3YOCaAHB94Su7LpRFUt1MUAGLN2eIbL4SStefwNkTKtVg3ONeQ0KeM0E6bYc4qfs2c6ifCLnQgv5fjj+ZHXqv9dMfg1cNEyGkElTA5McJxHL6r0fKMI8DdzjmgVqW/ECrLyeQa19h2IXsungieoZS1KMCGD2czZ+6D625iycqGzLFhlaUyuhCIbUgglvqJ1TjST5qTWdEJ0KewkcmynT3lBL2ebIvZnFpnfu0FcVMEG1sKO1cCAFxIoghS8dlTk2XDnhMQ2YzJMxZpsy6pVFKWinPDl4qwAC6HjERMuyyBt8Z3zaUKnZ9uU0AYpqGuDUyoCKA5Xoou4G/snXIazlqoqEBFU3wzhDWOY98IkNgYKaJJgZUjAD3cNEnRBrQ4BeUp/oAiEKKpeGyHy7G9XHXgPiLnAiFFIKKAPu90N8Gk5cBqxbOLCV43dOjYgrXVQcqHSqxAVwfGuB1YEAFzLDaoUmcEOkCImk+0Y4hpGRFfWUAngMiDjCyNIfQqiGk5ER3UAVEMv7CIJFM9ETQH1iiNbpAryYiRW1+hf1BXyLCJxynPMad531syLpHelQUAXubIEmYikT2DfA60qOiCPTahEoWiRwbAuBQj4oieP6Rlsi6UDkVDOLKCUTc2ETa+qy7qc+620CHMYg09flVUV+L1QHdGERG+vyqktKmRSCzjkNkqJ1oItXqYNcrE0kkSxyqAK+hvhYbQ6cZDWEUUtKGDSGb0Xc9bowz0a2gkGKZtjQHNPHCh00m34VDSouAy9Kg4hFckd5BpsXYVCYI+q4GFZtwBuzqhaBFQFQl4HIrctxqw99x0BLCLzGHLIm+TltGRQVyVheIjCiRojzRaC72poiKCdIRTiSElAjUKxRezTnNkYiKI5UO8ZQIJXctsdxpIblnUUgpozdsotMguUNpap9laiRuVeYimIqo+AIGmGOcpvKEm4WUKpJ7GUWCLMotd4j3CRJuXjqwkJJF4Gohf5BGL7hE2j3fgFARtCP6jxx0BDZ2YBZive8hJ6yKIFTOZUVPaEGXViD+oAW0YJGKTJVzqDBNyz4dNoGsEH/gAknmiJkpBlCJbcsHLy4QSYP4gypwqRkxLZ6/1YL5nFzu7ACR9EmVkgUCqpIVrihQoW0PkBns8fzqINDlxxwVbWgBaNvjiG7gAAwf8okOgx8PeFpUga5hn27goK2oNbHcyYfMrTJ/0FcysTyMYCAksqkmhpS+EkmVRQJXgTFNK0vmb+osM6jQADhjh0YhKkZIDGx7EG90tsSQsqY06DB/sKr+0CBCABudFqpJXDGkFAJ1Wtwf5NQau0SdK0AiaPP5jriDZgdU07xKyQcCyvcIMMHmM95GL3hiSBn4q80KKWbXV1eO6h1uozd4qc9CStdfbVWIBA1/QasEMj5nI+FooyuGlIa/2rLgD9Z8LewQe88JWfEmy7Ka2EMdQfCNMCoOIWakQxp83FQQQ0r6FAi25A9sf4UOUQm2W3RwZokhxTplrCD6g8FCsurFmXRw5gs62CktiyGlteB7RfQH3cVvObI2X+9D8TDzphhSyouJGuLGV2Ox3Cw5FSKHmfhY1hZDShXEHhpSsovlVsnSVvAc5IDZkULKYqK8vPF1mriWiQ2TA2Zyqr2hnSjnif7gNAUP0P0Q9XtMaKJQpGnWhEyU0dTarV0g5bbm0J+0GvTFiYpkPxD4g3I9RPex3BLBGjHuSCFlXl+5mhJ1I9SzOnFkjRh+K96UtZQACD1PG3OgPwARq4K7VDrRzTEwpNBi+0g88j7QNscEAmJtPsdi1xYPKSG6d3FZ/FBoWOrQ2qqT0m/RtoWejLGhYSlokisau37JZvOe0C7xKl41bomgTWQDaZejbOi7qSIHHKznwNgOtyFNNNDvqPtYeUCaKJvmxr4BR4fpeP5Ui4oRubGPtShucAgVDDvqFmJE06KoJu0QVsBaVgxnKWnESJCBPdC0jW6SttE9/TY0DikeaBnOaNpGeQNsi4YU1vZ1gMEVtk51PU2bVZVaxi0yETsagP5gPu1folt5eVOyi1eT4x1qoeZ78ZqSA3mB9uoBmihjaH+04YWVoB1U6pXaYC0ol9FyqoZGzgK8DBL4pAeGtjNwQcWFEHINDX23oe4cXZsnTLXDNc3vYOzrDgNhSHHBPY9tfQcm8OSAldxAQcgSWhOVP/h3mzMid9cp1wsag/6sQkra0Pia/1eKMTKryC10Dc5K6nowUVYisseb4BxTRyG0BHht6GebWnBJ5rbtmdQOoxK6rvO63Ecgt05GX9cJnblwF2IgEWHe6ap02i1bvcCspr23ohG44QpVmEAMo1rjZM2Xxc41io2WpHsxYi1g+kFH1rr5hp5iJdYFPSKs8MKKiRHICr9qiD+JMfmQWlt4zzTiqiGoGIV71VdK7/9k/i/50uRlLx4jkBUv4dX98PpnFCOoVK8noZHkIuv5XMmFsfyTTlwaSS8Xp34JqMSlAT4M8N94nIMYmPzC9ySmjKELiSMxyEfcq+up1J/AS/cjV2Z9BB7/Kj5UYNIQ9TmBd6AjSPKVBxTQp+YPI/S0fQdRA18Fu681S/sj9OAryZzEs9jhxvtYxZfJaLBLmVPhsxsXeqRjqpKQiPABkbv4AyI/YgG/nko80lLqUHtx/imU96VPocyKqSXGWwMvwZgt++mYwZOnkUo9N3jyNM7nk0Hn8/Gj8/mMU+pcPkgVycwZsHE69B8J+/pMv0Umfu7st2dJYuEO/0Bc5vjDs/5w2ymeXyrVFmnq3VrpYhLU/h/p5IdM9pDyYQAAAABJRU5ErkJggg==)}.n-menu[data-v-3daab35e] .n-menu-item .n-menu-item-content--selected .wp{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAMgAAADICAYAAACtWK6eAAAACXBIWXMAAAsTAAALEwEAmpwYAAAF8WlUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4gPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iQWRvYmUgWE1QIENvcmUgNi4wLWMwMDIgNzkuMTY0NDYwLCAyMDIwLzA1LzEyLTE2OjA0OjE3ICAgICAgICAiPiA8cmRmOlJERiB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiPiA8cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91dD0iIiB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iIHhtbG5zOmRjPSJodHRwOi8vcHVybC5vcmcvZGMvZWxlbWVudHMvMS4xLyIgeG1sbnM6cGhvdG9zaG9wPSJodHRwOi8vbnMuYWRvYmUuY29tL3Bob3Rvc2hvcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RFdnQ9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZUV2ZW50IyIgeG1wOkNyZWF0b3JUb29sPSJBZG9iZSBQaG90b3Nob3AgMjEuMiAoV2luZG93cykiIHhtcDpDcmVhdGVEYXRlPSIyMDI0LTA2LTIxVDE1OjU5OjIwKzA4OjAwIiB4bXA6TW9kaWZ5RGF0ZT0iMjAyNC0wNi0yMVQxNjowNDo1MSswODowMCIgeG1wOk1ldGFkYXRhRGF0ZT0iMjAyNC0wNi0yMVQxNjowNDo1MSswODowMCIgZGM6Zm9ybWF0PSJpbWFnZS9wbmciIHBob3Rvc2hvcDpDb2xvck1vZGU9IjMiIHBob3Rvc2hvcDpJQ0NQcm9maWxlPSJzUkdCIElFQzYxOTY2LTIuMSIgeG1wTU06SW5zdGFuY2VJRD0ieG1wLmlpZDo0ZTZkM2Q0NS05MWE4LWUyNDgtYjM5OC03MjNkMDFmMmVhZjYiIHhtcE1NOkRvY3VtZW50SUQ9ImFkb2JlOmRvY2lkOnBob3Rvc2hvcDphNjQ4NWZiMC0wMTY0LWIxNGUtYmVkYS04MDU3ZjNhN2NiMDYiIHhtcE1NOk9yaWdpbmFsRG9jdW1lbnRJRD0ieG1wLmRpZDozMjRlMWUxMy02ZjcxLTQ1NDEtYWU5My01YTBjODM1ODhkZmQiPiA8eG1wTU06SGlzdG9yeT4gPHJkZjpTZXE+IDxyZGY6bGkgc3RFdnQ6YWN0aW9uPSJjcmVhdGVkIiBzdEV2dDppbnN0YW5jZUlEPSJ4bXAuaWlkOjMyNGUxZTEzLTZmNzEtNDU0MS1hZTkzLTVhMGM4MzU4OGRmZCIgc3RFdnQ6d2hlbj0iMjAyNC0wNi0yMVQxNTo1OToyMCswODowMCIgc3RFdnQ6c29mdHdhcmVBZ2VudD0iQWRvYmUgUGhvdG9zaG9wIDIxLjIgKFdpbmRvd3MpIi8+IDxyZGY6bGkgc3RFdnQ6YWN0aW9uPSJzYXZlZCIgc3RFdnQ6aW5zdGFuY2VJRD0ieG1wLmlpZDo0ZTZkM2Q0NS05MWE4LWUyNDgtYjM5OC03MjNkMDFmMmVhZjYiIHN0RXZ0OndoZW49IjIwMjQtMDYtMjFUMTY6MDQ6NTErMDg6MDAiIHN0RXZ0OnNvZnR3YXJlQWdlbnQ9IkFkb2JlIFBob3Rvc2hvcCAyMS4yIChXaW5kb3dzKSIgc3RFdnQ6Y2hhbmdlZD0iLyIvPiA8L3JkZjpTZXE+IDwveG1wTU06SGlzdG9yeT4gPC9yZGY6RGVzY3JpcHRpb24+IDwvcmRmOlJERj4gPC94OnhtcG1ldGE+IDw/eHBhY2tldCBlbmQ9InIiPz6wXLUsAAAPdElEQVR4nO2d627duA6FuZsBkvd/sb5OgkGS+ZFR4zq+iVwkF2V9QIEzB2gtS1y8SdZ+/P79WyZufAY95xH0nNvxK3sAA/AqX0LY+hPF3vNfA8cwJP9kD6Ag71LHsTzL30L9EJGnpLGUZArknEqCOOOXTMF0MQWyTWR6lMlaMLOWWTGKZ0TwLvG1Axvt/d+zB8LC3SPISOkTkmVkuXUadleB3DlK9LIUy+1SsDt5z2U7dqLjdu3jO0SQmUbhae3j4dOvkQ2nRYyR3zGbln4NG1FGNJ4mjOfsgdyIFlGGE8poKdasL3JpQhmmmB9FIOzC8MjVmWurYbperBN8lba5x8KbfBnF+o9HIfu086w3h2dpKb/pWDmCZAuDtYPzsvH/ZUabVsiXjCYVBZK52CUXWX4KOcO5lGwLVxNIxsJWFcURy3eKnNNy0aRKDRJdayxz+tHJeNcytUkFgURt9n3IfUSxR3v/j4BnrY/aU8IukIgJbJ2nUrmxM61DFtERoxYJaw0SUYjfOVJcZdkR8zRk2gKeUSDeHmUKQ0ebN6/1oSzg2VIsT3G0VGpiwzv1okq5mCKI18RQhu7itNTLKxWmiSQMEaSdvvVgFt++tGLeA4pIki2QV/E5ln73dm00XmlX+hH6zBTLQxyM6ZRnR47pfb3Srmf5spWtM2buZAnEQxwMESM6LdjabMsWTXs2ci7SRJKRYo0kjqy7eI9ooskeF3pNmkhCiRYIWhzRrdv1RdVVyBozujYJF0lkioUWR/ThulGIvmq0pUWoOQxNtyIjSDVx3OEq0sirRpFrFnYhR5RAUEbWTtx60owmuwUeybJu8QR5UjjEcUUYAVIcnt2Z0aPFVbzn4UkKicRbIKgXeBM/cUxhbOM5L0+CK95d185TIEhxeBRkUxjX8KpRXqSASLwEgppQD3GwXRVUgVajoIWCFIlLo8GrzYsQnkcxPoVhw+ObjRfBbAG4OHuvo8pW0AffZtTAgo4mqEgCX2O0QFDiQKZVd2vZRoG+dIFSJEjDQXgUpDg8vzOZfIOMJiiRwKIbsgaxiu1DcOKYwogFWZu8iP3IPMzxo/4hq0EiNwGnOPJAzT1iMxEyFoRAEOEMIY6ZUnGAFIkVs20iBGL9NxBh2evT3YkO1KeyVtsw27e1BrF6C4Q4mH9I5q4g2/QPsdmZqTayCMQavlDdiimOfLxPWL+JLUN4F2XKltkpsHaspjjyibo9xmorajvR/sXs1GqKI5/oewCsz1PZbIaRTXHUJ+uSjPDnagzNEj2sve0pjnyyr1ey2FC37fYam7V1Z+ltv8oURzbZ4hCx74902XCvwVk6CdbJnfsck4alA9plRz0Cybwjde6Q58MQPRrWrtZlW+4RSFb0mOKYbGGxqcu2fFUglk3B0KJqcisstnUpilwViKU41hZVqdfeT0pgKdgvRZErhm8x1LBiauJKxM9Ca7HY2KltXxGIxVC1xVTEDX/WojPqZ5I1tEu9UYb9L+jf8cBSsJ/atufl1RYDjOqYPKT/qPzys+CUH3XpAPVbHezR3Hrid5ezCHKHIrnXyNlFMenj0Ma9dqaZeuaTe+Bic0cCibgSn4HZLZvs2vqRQLTRhbVw3eJd+vPrqN/TQIC8MK+CI9Ha3q6texTpLDm6Z/105dI0r0u3G9EnmyML9eaAevc5XiTo4jith2Tul0fjbVAjn2x+Ev37aW1w0+b3BqEdHMtvdt+BjFQ2uqupcdRaG9y0+ZG9EEMt5FmrsKSynqTb59YAtF6CrbXLYEDpC+xAhSiidY4/npW9gFW6QaxkRcnIjpbGRrXO8cezMgUS8QktQ1Tz9LhZUTL66Elai3ltoFqPrjHENsl3OM4yIpHRXyNIrXP8673WAslOuUbF0wNmRclRbeXX7n8EsvY+IxrQEvbTsFoio39KppH1Y5vr545qQHeA+QiK2TkuDTUqp8yYUIYdfs/5zYySkc4tynb+rNVSIFHp1t6EehoQww7/qDm7SFz6EyXGXz/+hxKkZx7ZgCZ5mGzUapQMnvkqDGmWp6fNbkYg3w2ZTZhstAkkPLfbwdOAKon57hw57qh07nU5kPDc7sZ4OqPsKDnSpu+zCKfBjmxAIr7OaEZJMBaBeB2UmwZUG8YDqGpbtQik96DcSOHXiqcRZUfJiKyk15bUhzoZUyyRsQ1IxHfeq0dJqgjEKpBpQLWxGDmVTV65nWPig+e8Z0dJKiM38Mn8IiMbkDczSoKIulqFKq8UHgNiPgmbQY+d9DpQlVOMut5H+5zRDcizpZ0dJTVOka72ZE6xRHwNiOFaIE+yoyS7bV1iiJdQwnAtkAhf+pkF5TxUEAjlxAHxXIPsNKsHSlukHNQKzzHONGtySAWBeDLTLA5o37+KQEbfzLx7lKS1Q9qBBZL9JZ43LFGyJJUEMvKeSKViGg11dlBJICPfneVdTFdIsyipJBBPZpqVA31WUE0gtN0OA6OmV1feiz4rqCaQauO9QtReRXSUHGIPZkSD0zJ6msVGiWygokCoux6djJpeXaGE7ZUYZCDRBhudhswo2UlVgXh1P1jy5hLpxwFnQizzflUFQt/9uMBetHqXuutylTLvV2aggUSlWXvRqq2Jl5edaVYHlQXiZUAsaVbVtTlzMKWaLNpFYMghqxqQyHF6lfl8BCwOZo1qbrVG1vv3qoV17zTrLL1qjB4lLfTalMrWK3thEb9wzWJA1ddnTan0SuRrAap59+pkp1cNjyg5mi09RvBQXnsiXmnW1fSqMUqUpD+5u8UIAvHaE2FJs0ah5N6VRSC9HmF+tLM/B2dRwiv9QkbJyPXtTeXU0csikF6P4PnRTgUDEtHPgVekR0bJo3fL3hZQR68RUiyRGgZ0Z8raWRv4TH/80aZXDeYoOaL9vIl8CyTqm2XPNqBXtwe1+NY5Zo6SkelVVCv5RcQ+6dm5ZQSezqNk67OT7PTKZKPWwWe//BpWg9uLQr3FI2OUZP8q0mSjy78c9aKeIdKr125Ns1iv3WlYxneUolVNr/5oYSmQ2bHZx8PAtcZTKa1lyzCu8kcLiBdgO4DGZkB7Xi/qJPVVNFGSPb0y22aWwj1Dpdc7jXYQb40mSh5lHWjHmTL/a2Ni9wijYI1ybFFyJP7SwFog2jpE4y08N5dY0j50eoX6+3ug1gTdTdSMS2sDf2kgs4hi7+xsMdOsb47mAt1NTLOV7C6DZ0rHuieCSo9YoqQ3GhvRrv2PZ20JROslNQvm2VrO/v7AK73yxhol0Y5JYyPatf/xLIbFqtYYYEqzsor1o5oA6ZjSbWNPINqBaRbMM4qwdXvQaVGWg4uqCTS2oV3zTZvfm2Ct0WoXzMtTeBnQ2XiZoowG7fiRDklrE9o137R5DwPS5KDVjrkwjZfpNhSkPWnmGN6YOXohrYK1OajXvkh0t2dv3rzGEZ1mRTgHrS1obW/X1o8mN9pLVtsX2ZtUpuhioTfNQkayaFvYXTMv76P1ll65u8eeSI8QvPdkoqJkRHoVuc1wytlLZRSbHgV71J7I3tiz92S0rN+H9ffcLQ7o0MY981fIWRhyog3oCI9i/er7oLy3NrVyc0BXBGIpnrXK9ohcWQYU1WVi2PS1oF1zS/Q4te0rk2opmCzKRne1vA1oL72qbrjtvTzTbctaW2zs1LavLp6lLtB60CpdrTY3DKlhRpS0plcfol9ry/teEuVVgVgW3+JB0V7Lo9MReWnBGRW/psyyrUui7HmAJQxaDLPCsY2qJ3etWNvXlrW12NRlW+5ZQGvK49aK64T1OxEUkScHLPm/ZU2ta3jZlns9XFYxZX32kqg9CbaTxExY1zKs+dMrEGsUsRjNixB8H9BBZnoVIU7LsXKLHVnfrevZmkW0hEar0TwJRiSje/cIcWqe8SG2ovxV+dxGt+1meDlrjowQifd73+V78R6s4hBJOLKjNRRr0cwgktHxjJK9/zZCHFabUdmsxZNaDdTaibCKZHQv7xkle/5thDistqK2E8skMoRLxkgyuvB6QIhDxG4r6jFYvUx2qiXy9fIZx6Qr4CHWq+nVm2DEkZJaNRBh2OrBEYv4IjqRoIu+0QUncv0EOOIsHeKcl4l/rP+AfHkJ64u8i93btAXJTHEYP4xCzG0PqFMPiCaD+b2zP5Ns/BJc1yXzW2pGkMX6mfNBiiM7/RcBDGIJYm8ClaI85Pp4UHMwutCOeBOcOKybgSLAxk32PUZrngUnkieJPQnMfHIXId69dXkI7tudV8F1NyGgFxVhkEiRiFyLJqO3ZhHrvDbcD8GfskaIA+oUPbweo0i8o8nd0quHYAt/SnGI5N1dewW0SES+JnCvHWx5FnN61bBEyTY3yFpj+W8jxOGyYey1sCjv4iGSF9leZMYWLQttztD3BKDEIeLUyvb0fChP4yESka/xIcZYKb1iGitSHG7ps3dqgBSJ1+IuhaJ5RoX0qsEy1ncpIA6RmAlDvQByM3ELdOE52QaxCdhwb+NHeRSkSJhaskxjuUpmmvUphcQhEhtykTclVjRMFrLSLOSaef2WzA8iJ0t74naPT7nH6Vk0Ycb1P6+CF0fYrZuI07w9vAi2e/EsX5Nf4XK5LFAfLWlAR/pQcYjkhFt0JBHJS7keqz8MtCMg7U+GONBRQyRBHCK5PyPsIZLsPv9aMD2nijWsxcDQiUO2cBsp4hCJT7GWoNMtke8uV9qEbpBtsFGg17KRupaZAhHx+wpw1iaxeKW46evHsrPqNREMadfIvMvA4hDhEYiI34S0tGu2hHG0Irzi75F0wSQQEd+JaWnXRE8ThufJZxpxiOTXIFs8BHteZ00TCdVCFMDbuWTu1+zCFkEaEd+Tf8pMvc5oEcNbHAzt6U0YI8iSh/gvTku9KD1YEp4RfA11JGeNIEu8N9sarZi/a52yjBYRdoG+9MEF9gjSaJ49yniXz6FfRCMZDqHMnFaIIEuiosmSTxkvsmS9U4mosaRKBFkSHU2WLJ9ZqWaJrCn2KCWMRvakWciIJkuWNQtTR2xZS0TWFHuUixpLKkaQJZnRZIu9zUiPaMMQFc4oK4xGdYE02kKwCGUN27f03pQXRoPdA/VydHPixB+PmxdTGU0gIt+3AE6hxNGEwfINDowRBdJoQmH7kc+RGFYYjZEF0mjnumZEwTG8MBqjFOlXWC7mnQpmJEPVF1e4QwTZIuJChVFYXgxxO+4UQbZY7k1U2FeIotIpAVfuLpAldxfLFMUGUyDb3EUsUxQnTIGcszagyoKZguik6kJn0trG7Q9z+7i1Y1luXSzHjCB2jvYCotrJt+wwRfAfh0sXFwlSq58AAAAASUVORK5CYII=)}.n-menu[data-v-3daab35e] .n-menu-item .n-menu-item-content:hover .wp{background-image:url(data:image/gif;base64,R0lGODlhKAAoAPYUAP///15eXmxsbJaWlnV1dYCAgIeHh5CQkJWVlZaXl5iZmZmampqbm5ydnZ2enqWmptDQ0NHR0dzc3Pj4+BEREaWlpTZGOpmZmXl5eRUpGSCGNCCKNXJycp2dnbGxsSKUOCGcOV9fX56eno+PjyKTOCCiOZubm6KiotTU1P7+/qmpqSCjOZqamjlsQ3Z2diY2KS2CPYSEhIiIiCCkOiCjOiRQLSKSOCGfOiiQPC2GPmBgYGZmZnFxcaysrAEBARsrHiJiLiGVNyGiOiOcOyaVPE9fUmFhYWlpaaCgoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH/C05FVFNDQVBFMi4wAwEAAAAh+QQFCgAUACwAAAAAKAAoAAAF/yAljmSJAGiKImXrvhSkzjME3+NEA9LzSLsJ7jUbFoc5FXKkEhpTr0Yi0SBCb0rSdMvdlrIuHUrbLXNJKWfrKjK7vczxWk4hvO9fukg8CtzfLihqFGx/bgWBdBF6JVMwWwtWESJsZGeWcCMClHJ0BpiZFAddmyMJcRQDdKegrKZdWnGqclKNXQetVW0MnFmhZiQCZa+9KBJtjq22l8KsQCkPyK7SWw7KFHAPKtHYv7DLydkqx93Jr6HUpw5wz1dcn+eO0+/lrDQiDJfUFOvL0ropZsXzNwXXOQoKMqEYQAhAvHkJPnmzpq+TnGbmEJ5KmBGbtFJXFjncF+tbm3pxJl31GjiCQL155eKM3EPHT8dhtgLEGdRwpp2IrSC6XDlnZregsWS+EGPUlRuDOmXyRFPpoT6ZRhMxGrGOipWtYcAgabKkWFatYIcwHeejHdmyLUTumKESLoxZNBguCQEAIfkEBQoAAQAsAAAAACgAKAAABdlgII5kCZTjia6s2bpvrJpAvc5xru8kzsO/1WV4CfKIyKTRJ0o6lShm60klGpvVrM6X1bKko251GxtOrS0wyVlir3PFsBsLbUbb7Todbe/l83pPci98AYJydWZ3hoqIhYxIdCI4Ko+He4polHtrepiSAZuQcY6kpaOTQpGnpkqrLIFWjaCvqZ2zkLmIqH6As7K/ZrWwtcKWnIuOeIG8KWe/o626X76+uNO2zxbb204V3BaPRxfgT+U8UuTd5tw3RhThVBZXOsP0auj0+j9SNTbJV/D12ufM3Y4QACH5BAUKAAAALAsAGwASAAcAAAUk4CaKwAac5WhunUqiqRqLGDxv2m0DnHz6NuBo9xuiMiZiCRUCACH5BAUKAAAALAoAGQAUAAkAAAYyQJBQCAAQi8MjyDhELp1NYnL5hEqLnmnVemQOA8WwVpwMh0Nlc9rs3XrZ5G6Y4jZ/zEEAIfkEBQoAAAAsCgARABwAEQAABlVAgHBILBqNqaNyOUQxn8YTdCqUUqHO6zNV6paIXYA3LCQXx9+ySDwelkxHdDnN9paXbba7bTbK6XVhgEYjaIOGT4hgckyMi3ZQeWeQiX2Pg41LJFBBACH5BAUKAAEALAkAEQAdABEAAAZbwIBwSCwaj4CjcklMMp9GJ3QaAKyu1yIWq20VrVvilbVdiaNk7jBbXpuPbeHKE4jXVcp4Vh6uM/t7dWGBcINihkwuZW9ufX92fI5LkJGEj5aVVGpGklCMRh9QQQAh+QQFCgAAACwIABIAGQALAAAGMcCVUAgoGodEY1H4Qq6US2QMSnRCAc6nMnntegGwr1IlNorK6LJMPEi73/A4VCA3BgEAIfkEBQoAAAAsBgAPABsAEwAABmtA2mw4BBiPxOLRmAQkZ0tjrhm9EZ1JVhR7jXafW7B3VmNSl0/dGJkdn83oN7eLxMXp2J6YGa28i3tKd4IzPHNQTBhhVISMW2ZKjVeCboCDUIiPO0+ZkHiLcpyPbJ+Ho4OPcqmUqKdopzaPQQAh+QQFMgAAACwGAAkAGwAZAAAHX4AAgoOEhYYARTM+h4yNM4+NkYSPlIKUlQCXmkWCNJqZl4WaM6KjlEiFFZ+Tq5Kur0OXLKKNKq+3uIRAuYJCuCK8wY1EuCO4HrLCrkeRzMrP0NEARtLV1tfYhz+RQYeBADs=)}.n-menu[data-v-3daab35e] .n-menu-item .n-menu-item-content .monitor{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAK6wAACusBgosNWgAAABx0RVh0U29mdHdhcmUAQWRvYmUgRmlyZXdvcmtzIENTNui8sowAAAF5SURBVDiNpdM9ixNRFMbx3yRZ3/ANbCxEcBubpNJSLIQFaxs7D4JfQSz9CpYWItyPYCOIFtqvhQxopSyCb1gpEuNukrHImewQY7UHLsOce85z/vPMvVXTNA4SAyilfMI2Zpn/n2rV6RtGxOYgE9sITLK5Qa8jVGGezwpH8VgWwRTjiJigj6vYwrVcW5nrZ824pW0Jeh0xSVJhr4M86ez32/qBf6OH04nZCmzk1HbI0qN1AhO8zuYfOJ5i8xWKZq1AREzxpZRyAlfwJiI+r5RVrUCLNOvgtnER93FpDeV0laBnYcwMSimHcQpP7Z+V2xZelA7FkuA8opRyK9/P4gIeYq+Ucj2/fwM3Lc7Mua7AVzzH91LKHZxBExE/s/EudiwOz0u8wLeuwDgidvAMf3APr3LvHR7gfUT8joiPw+HwQwqrmqZRSnmSWL9wEpt4a/Hr5qPRaLeu60OdgcfwKCJutCZeTnNmuXZxpDWqruvG/j1o0vDhkuAg8RdE7nuSY6nc+gAAAABJRU5ErkJggg==)}.n-menu[data-v-3daab35e] .n-menu-item .n-menu-item-content--selected .monitor{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAKwwAACsMBNCkkqwAAABx0RVh0U29mdHdhcmUAQWRvYmUgRmlyZXdvcmtzIENTNui8sowAAAFaSURBVDiNpdM7a5RREAbg59uLJOgSkRQhfYSIhWWsQgj+gfgLTJEmBJLa0tZW0MbawtbaUkQEQ8Q/YCWIIAqb7G1S7JzNYdlUOfAxlzPznndevmkiwk1OJ+03nGKMBpNr6lsIdLGBrQJwimP05wCatFEBTHAHL2sGY/zHEMt4jBWMKqZ/8RkXVc8MoJX+MF8bJJth3nczV5i0s2cGUJ82eslgkLlbOU57vngRwAA/sqmftp35AhiFzSKAIX6mv4+3C2pa887YlTjlPMAJtjNeMtVC1k5qgA5Wa2Q8xQvsZnyI51jD3cK+jLCOA/xLyn1TET/m3U4+0M+xRpmfAfzGBzzBM/zB17Rf8B57+ISHpsI+AhEhIt6kbSLiKCLOImIzc72IOIyIbsblex0RMwZLuGf6t73Dd/zK/AVepYDLKV4v7zS5jfUyjXCO25Wok/TLnnRwH1vNTdf5EpkVg1v2kuagAAAAAElFTkSuQmCC)}.n-menu[data-v-3daab35e] .n-menu-item .n-menu-item-content:hover .monitor{background-image:url(data:image/gif;base64,R0lGODlhEAAQAPcAAOTk5N/f38bUxsnQycTTxMfOx8XLxcPKw8bKxsfHx8TIxMbGxsXGxcXFxcfFx8PGw8TExMXExcbCxsfCx8PDw8PEw8PCw8PBw8HBwcW/xcHAwb7AvsK/whzVHBzTHCDOICLLIjC2MDO0MzOzMzKzMjWxNTOyMzWvNTavNjirOE2hTTqpOjunOzylPEmhSUqgSjqlOoaGhj+iPz6iPoSEhD6hPj6fPj+fP4ODg0CfQDqhOoKCgkGcQUObQ4CAgEWXRUaWRkWWRUqQSkiSSEiRSEyNTFuHW3p6eluGW3l5eU6KTliFWE6JTk2JTVaFVlWFVWB/YFGGUXV1dVGEUVWAVVSAVHRzdHNzc3FxcVV9VXZvdlp4Wm9vb2hyaGF0YVt2W1x1XFx0XGFyYWNwY15yXl1zXWtra15xXmNtY2FuYWpqamBvYG1obWJtYmlpaWJsYmhpaGNqY2hoaGJrYmRqZGRpZGdnZ2VpZWVoZWRoZGZmZmVnZWdlZ2VlZWdkZ2djZ2hjaGxdbG9ab2ZmZgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH/C05FVFNDQVBFMi4wAwEAAAAh+QQFCACDACwAAAEADwAOAAAIhgAHAUgAYcGCBggbGISQIMCgBlwG9dFjp6IdPX0GYaEwCMKgQWqO4NixA8cRNR89LvjoJglJkkncpBy0EqSPGDRoxPCBsiPNj3KwSLlyRQoWOTNrflzK1GeDplAHcWQQtWmFQQOqMi0wCIHWpQoGWfj6cSzEQXC63IG6UWCCBhA2KDS4sGFAACH5BAUIAIMALAIACQACAAMAAAgJAMUMcsHjSZSAACH5BAUIAIMALAMACgADAAQAAAgQAGGUGbSCxaBBJ4IM8gIlIAAh+QQFCACDACwEAAoAAwAEAAAIEAAHhTkzKAeVFiCoDDIyKCAAIfkEBQgAgwAsBQAIAAMABAAACBAABzFJM6jElj0pwAwaMiggACH5BAUIAIMALAYABwADAAUAAAgSAAfpGFSlQ5FBQEIMGpRiYZiAACH5BAUIAIMALAgACQADAAQAAAgQAAcN2jJIiIwpHogMujEoIAAh+QQFCACDACwJAAcABQAFAAAIGQAHCRw4kI2gHiK+iBlEwoQNFYOaBMqyJCAAIfkECTIAgwAsAAABAA8ADgAACBkABwkcSLCgwYMIEypcyLChw4cQI0qcSDEgADs=)}.n-menu[data-v-3daab35e] .n-menu-item .n-menu-item-content .security{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAK6wAACusBgosNWgAAABx0RVh0U29mdHdhcmUAQWRvYmUgRmlyZXdvcmtzIENTNui8sowAAAG0SURBVDiNhdNPiI5RFAbw352ZsGBDMhkpYyE12cxOyYIFayW7SY2zkCxIlkrZKIrJjPe+X1FksrQQo/xp2IhZiPXUxIoaGxa+mGsx78dn+vDUvXVu53l6znO6qZSig6mpqbX9/f37cRB7sDOl1C6lzOIZHkXEK11IpRR1Xe8upRzFKNqYxzt8xGpsxy6swwCeYjIi5gcaoTt4i8BcRBQ90Gq11i8tLY3gCjZibABKKUu4FxGvexE7GB8fX8RsVVVPUkqDGjtQGqv/RM75CJ6nlH6gT+dCwvf/kE9hGlvwrZfAqrqu+3LOQz3Ix3EJpyPipeUwdQt8RbuUshkLjdUOeQzXcD4iLnfptvmdwXtsjYgPOefrmM45f0Y/buJiRJzrIm+wvOJfDl5gBCLiBFp4iPuYiIizK6YaSim96Ra4jeGc86ZG5BhyQz65Io9hDJZSZkApRSlFVVUTVVXd7dR/O1VVPaiq6mqn7jiQUjqD0Zxzd1B/IOc8iW1N7zKv+zM1I8zgE8YjYqF534EbTegHImKxp0DTnHABh3ALa3AY0ys20Vugg7qu95ZSHuML9kXEXK++ny1tzgEddf2OAAAAAElFTkSuQmCC)}.n-menu[data-v-3daab35e] .n-menu-item .n-menu-item-content--selected .security{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAKdQAACnUBSiXd/QAAABx0RVh0U29mdHdhcmUAQWRvYmUgRmlyZXdvcmtzIENTNui8sowAAAFrSURBVDiNhdMvaJZRGAXw36viFrRoENxw4IJYLDMJalkxC8OkrC5qNAwEi+CC4lAsikGMY0FQmGIQ/AMKyjDIUGYyqMXgmB7Dd9/P63j37cAN73OfczjPc+7bJFFhFyZxCsdxGGt4hqd4hFc1oSkCxzCNiUJYwXt8xRDGcQS7sQNPMI8VSST5lGQxydEkTal1nT1JTiR5k+RuEtuKkz9YwGv8N9MGfCvjLBUnfYEUq1vhDEbwu+W2Ag3WtyCfx32M4leXwM7yPdJBnsFVXMALvWWqBX7qbX8/PherLc7hBi5hrqqvURaBVRzAF9wsVr9jO+7gCmYr8l69iLXxXEyyUMV1O/9wrSPOpSRnk/QFxpK8S7Kvarq1CflgkuW2t764nuTBgEfUnoe1cH0xnORjkrkB5PkkH5IMdQkott4meVzGauuHkjxP8rI85z6n/ZlqNLiM07iHYUyVZGY3Ng+a9WSS9SQ/kkxs1vcXeVqZSyUF+yoAAAAASUVORK5CYII=)}.n-menu[data-v-3daab35e] .n-menu-item .n-menu-item-content:hover .security{background-image:url(data:image/gif;base64,R0lGODlhEAAQANUAAP////39/fv7+/f39+3t7evr6+np6efn5+Xl5ePj4+Hh4d/f393d3dnZ2dfX19XV1dHR0cvLy8nJycfHx8PDw8HBwb+/v729vbu7u7m5ube3t7W1tbOzs7Gxsa+vr6enp6WlpaOjo5+fnwDZNpeXl42NjYuLi4mJiSitSCqpSiypSoeHhyirSC6lTIWFhTKhTjiZUDyXUnx8fECRVEKPVHp6enh4eEqHWEiHWHR0dFB+XHBwcFpyYGZmZgAAAAAAACH/C05FVFNDQVBFMi4wAwEAAAAh+QQFAwA9ACwAAAAADwAQAAAGdMCesEeiHAACR2c17J0oiUXEE/pgHAsFptYjQFzN4c6UmPQKoXAYIzl/1M1M5AyCDzdzwtveu8wRdXwXbQ8afD0SGD0dEIcNIj01CDl2NQeUPRZzcA8WTQWKYRUGYTkJDlw9MgwLO3AaBh0bBhyHJQEDYE1BACH5BAUEAD0ALAMABgACAAMAAAYHwB6PN+qlggAh+QQFBAA9ACwFAAcAAQADAAAGBUDaCBUEACH5BAUIAD0ALAYACAACAAMAAAYHwBtuNGKpggAh+QQFCAA9ACwIAAcAAQADAAAGBcDZSBUEACH5BAUIAD0ALAkABgABAAMAAAYFwNioFQQAIfkEBQgAPQAsCgAFAAEAAwAABgVA2OgVBAAh+QQFBgA9ACwLAAQAAgADAAAGB0Aab6SD9YIAIfkECTIAPQAsAAAAAA8AEAAABhXAnnBILBqPyKRyyWw6n9CodEqtJoMAOw==)}.n-menu[data-v-3daab35e] .n-menu-item .n-menu-item-content .waf{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAABx0RVh0U29mdHdhcmUAQWRvYmUgRmlyZXdvcmtzIENTNui8sowAAAGTSURBVDiNpZNBaxNBGIaf3RkSSEkJLmYIybYyETRG6CEwELAevAheBH9CKRVksHdPgRxzacBDwT/hT8hBydEK0aqHXFI9BCKBaEJSttuDadjgtpj63uab733ebz4YJwxD4tRsNm+k0+nXWmuRSqVeGGMGcX2iVqstDkopx/O8Xcdxbna73Tuu675SSt0NguBjq9XamEwmj3zf/wAsUp0wDGk0GjvFYvFeoVB42263D33fT/b7/RNgu1wuI6VsD4fDnOd5p51O53kul3uazWa/VCqVNxIgkUgcDAYDORqNHgMbvV4vLYS4LaW8CHqQyWQAfmutD4Fbs9nsDPgDEEL8nE6nm+Px+L4QInYnAEEQrCWTydLc8wPAnd+58+Kl5hjJvwArSkSNK0VHQ/9ngiXA2jUA61HAp2sAOlHAM+DzCuZj4MkCYK39DuwBo38w/wL2jDEn0Qmw1r4HHgJfrzB/E0JsV6vVdxeFpe1ba4+ALcCy/KRj4CWwZYw5inqcy75zvV5fz+fzB1proZTaL5VKw7i+cyFObUDzXeUJAAAAAElFTkSuQmCC)}.n-menu[data-v-3daab35e] .n-menu-item .n-menu-item-content--selected .waf{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAABx0RVh0U29mdHdhcmUAQWRvYmUgRmlyZXdvcmtzIENTNui8sowAAAGTSURBVDiNpZNBaxNBGIaf3RkSSEkJLmYIybYyETRG6CEwELAevAheBH9CKRVksHdPgRxzacBDwT/hT8hBydEK0aqHXFI9BCKBaEJSttuDadjgtpj63uab733ebz4YJwxD4tRsNm+k0+nXWmuRSqVeGGMGcX2iVqstDkopx/O8Xcdxbna73Tuu675SSt0NguBjq9XamEwmj3zf/wAsUp0wDGk0GjvFYvFeoVB42263D33fT/b7/RNgu1wuI6VsD4fDnOd5p51O53kul3uazWa/VCqVNxIgkUgcDAYDORqNHgMbvV4vLYS4LaW8CHqQyWQAfmutD4Fbs9nsDPgDEEL8nE6nm+Px+L4QInYnAEEQrCWTydLc8wPAnd+58+Kl5hjJvwArSkSNK0VHQ/9ngiXA2jUA61HAp2sAOlHAM+DzCuZj4MkCYK39DuwBo38w/wL2jDEn0Qmw1r4HHgJfrzB/E0JsV6vVdxeFpe1ba4+ALcCy/KRj4CWwZYw5inqcy75zvV5fz+fzB1proZTaL5VKw7i+cyFObUDzXeUJAAAAAElFTkSuQmCC)}.n-menu[data-v-3daab35e] .n-menu-item .n-menu-item-content:hover .waf{background-image:url(data:image/gif;base64,R0lGODlhEAAQAPcAAMbGxsLCwrLGsr6+vrLCsrq6uq6+rqLCop7Cnqq6qqa6pp68npq+mrKysqq2qpq6mo6+joq+ipq2mq6urqKyooq6ipa2loa6hqKuonm+eYq2ip6unnW+dZKyknm6eZKukoa0hqampnW6dZqqmoKygnm2eXW1daKiooauhnG2cY6qjoKugmW6ZZamlmm2aWG6YYqmimW2ZXWudWG2YWmyaXGucVG6UX2ofZqamlW2VXGqcXmmeWWvZVG2UY6ejk22TVmyWVWyVWWqZZaWloKeglGyUXGmcVmuWUW2RW2mbWGqYVWuVUmySUG2QV2qXT22PVmqWYqWipKSkkWyRUmuSYaWhnGecWWiZVGqUT2yPY6Ojk2oTYaShnmWeVmiWYKSgkGqQWmaaX2SfXGWcW2WbYqKioKOgnmSeXWSdWmWaX2OfUGmQVmcWWGYYXGScU2eTX2KfYaGhmmSaV2WXWWSZXGOcXGKcVGWUYKCgl2SXXmGeWWOZU2WTVmSWW2KbUGaQVWSVUmWST2aPWWKZXWCdU2STW2GbWGKYVmOWUGWQVWOVX19fUmSST2WPTGaMW2CbVmKWWGGYU2OTWWEZUmOSUGSQXV9dVGKUUWORXl5eTGWMT2SPU2KTTmSOS2WLWGCYUGOQVWGVV2CXTWSNUmKSWl9aUWKRTGSMVGGUXF5cT2OPVmCWUGKQXV1dS2SLTmOOWF9YW15bUmGSVGCUWV5ZVWAVVl9WWl1aXFxcW1zbV15XWV1ZWF1YVl5WWlxaW1tbWVxZU11TVltWVFwUVVtVWVlZV1pXUFxQU1tTWFlYVVpVUVvRUltSVllWU1pTVFnUV1hXVVhVUllSV1dXVlfWT1pPU1hTUVlRUlhSUFlQUVhRVFdUU1dTUldSVVZVUFfQVFYUUVdRVVVVU1ZTUlZSU1VTUFYQVFRUUVXRUlVSU1RTT1VPU1NTUVRRUFRQUlOST1RPUFNQUlJSUVJRUFJQUVFRTlHOT1FPUFBQT1BPTlBOT09PTk9OTU9NTk5OTMzMyH/C05FVFNDQVBFMi4wAwEAAAAh+QQFCgD/ACwAAAAADwAQAAAIigD/CRzoL5OUfQMTCpw27ZyUAcXO/UoorpU4PDgWDQlwIkQDdotw/SszREsZKVI2AgAQIESBAP/ioJypcuXKAiNnoqxpc0BOnTxX+jwJNIBNoT9pGj0KU4vOlEuP/lv0NCiACf/24Sl6dEI9gfKc7ow6QFzCejKhrmxwTuFCPBsniHSbsFUZhAkDAgAh+QQFCgD/ACwAAAAAAQABAAAIBAD/BQQAIfkEBQoA/wAsAAAAAA8AEAAACHUA/wkc+C8VF4IICVYxkJAgIR+EFrZoQeGfJYFqophR84VLFAMCBBAYkYAhHC4duXgEGTJkgn8nVar82NIlTJkzWbY0iXNlTQE8cdKsydBMz6E1/xE6qjMkBoF6hDZ9OtBozp0Jo/oUULHhPz0fqXoVGMtMwoAAIfkEBQoA/wAsAAAAAA8AEAAACHQA/wkc+K+UGIIICXZhkFBgqX+GiDxaCANGh3+PBNbpgqYOGjQLEYhUYYGhnY8oQ4oU+eDfSZQgGaxk+c8jTJUrGdpMKXPmgpowY85E8DOo0JkHMAbFKfKDQEM3ezYluBMnQ4R+Pqq82BDiQqddBfqjdSZhQAAh+QQFCgD/ACwAAAAADwAQAAAIeAD/CRz479MYgggJprmQUOCnf5GsRFp4YweJf5ME7iEjZw8dOQsjiLxxIcK/QXI+ygFZUqRIDf/2rJwZ0mWECjFnrqzpEqdMnTxF+tTJ0qbIfypptnQJASLRoBEu/jsEdGmEFQST8sSJEGXRqA0FHlqINSxBNwkDAgAh+QQFCgD/ACwAAAAADwAQAAAIcAD/CRz4b1UYgggJzhGRkGCoK5AW6kgiQ6Cuf4jmzEEEqM8cDhlC1kjBEFGfjn08ggwZsgTGlDA/sgzp4SVMlTMz1DR5U+bMnTdx/vwXVOjMf5CC+mRZEWnPlSGbCnzKsibCpEKlJozIQWvDgmkSBgQAIfkEBQoA/wAsAAAAAA8AEAAACHEA/wkc+A9VG4IICfJ5kVBgqH+cvFxaKMQJjX+QBFLic4cSI0YLWYhUMoPFP0kfU4YUKdLFyZQfV7KM8RKmTJY1Vb5giROlzZ08TRaCCRIoT4hEb7K4mLMoTx4Eh8Y0ahKhz5VQG55cyMOW1oGzDiIMCAAh+QQFCgD/ACwAAAAADwAQAAAIdAD/CRz4jxQbgggJNuqRkCCrLZga2YCCBQhBVX8Cqeq0qdEPGyCX9GAIahPHTR0/ggSZ418llDA9rmTpEiZKmTNb2rypcmXLlzZxzvy3M+VMkP8w7RQK0uK/kjF72nAqMGhPhgih4gzSUCAoj1S7/pN1EGFAACH5BAUKAP8ALAAAAAAPABAAAAhvAP8JHPgP1BuCCAlqepJQIKV/r9ao8vRkCxgm/woJPOVI0ClXrig+edJkCsl/o0CqFDlyJBKUKkGybPkyZcyZLmHebNmyyb+PO3meBLpS6EiIMUMaxYi0KE+mG52O9InQJkuoCV9RxNrwH6uDCAMCACH5BAUKAP8ALAAAAAABAAEAAAgEAP8FBAAh+QQFCgD/ACwAAAAADwAQAAAIeQD/CRz4jxQbgggJNuqRUOClf6y2YGpkAwoWIP8UCVT1J5CqTpsa/bBBckkPhqA2gdwUciRJkjn+VWJJU+RLmDJpsrR5M6bOnS5fxpypk+fNfz9b3iT5D9NPoyQx/ktZM6gNqQKLBmWIkCrPIA0FghKJNew/WQcRBgQAIfkEBQoA/wAsAAAAAA8AEAAACGwA/wkc+A9VG4IICfJ5kZAgJy+XFgpxQoMgJT53KDFitJCFRyUzWPyTtLFkR48eXYwsufEkyhgrWbpEGdPkC5Q0Scq8iVNkIZYceeL8xwnoTBYVawbFyYPgz5ZCRSLUebJpw5ELrV4VOOsgwoAAIfkEBQoA/wAsAAAAAA8AEAAACHcA/wkc+G9VGIIICc4RkVCgqH+hrkBaqCOJjH+HBCKaMwcRoD5zOGQYWSMFQ0R9PvYBKXLkyBL/UK5cGdLlSA8xZ9Js6RKnzJk1bfrUydJmBpxEixr9B4loUJcXmep8miGqwKk8cSJsqtRqwokcZMBqSHBVmoQBAQAh+QQFCgD/ACwAAAAADwAQAAAIcwD/CRz479MYgggJprmQkGAkK5EW3thBQiCtf3vIyNlDR87CCCBvXIjwb5CcjnI8jgQJUgPGlDA/soxQ4SVMlTNp2oy5kmXNPTdx5vyHkmdOCP8iBZXJsuK/QzeZRlhBsCjTmghNCnXa8NBCqg0JwnKTMCAAIfkECQoA/wAsAAAAAA8AEAAACHIA/wkc+K+UGIIICXZhkFBgqX+GiDxaCANGh3+PBNbpgqYOGjQLEYhUYYGhnY8oQ4oU+eDfSZQgGaxk+c8jTJUrGdpMKXPmgpowY85E8DOo0JkHMAbFKfKDQEM3ezYluBMnQ4R+Pqq82BDiQqddCZ5JGBAAIfkEBQoA/wAsAAAAAA8AEAAACIsA/wkcyC8Vl3wDEwqkBq1cFQPJwPlKCC6VN0I+CD1s0YLCO0u5/qmJYkbNFy5RDAgQQGBEAgP/4HA5yQWlypUrE8SsyTMlzpw7edr8KQCmTKE+fxoVOlTpPzNMk/78RyjqTZwY/uXTg/SqAAz1BL6DWlOqAW8J53FtSkGdwoV6UmII+TZhLDP7FAYEACH5BAkKAP8ALAAAAAAPABAAAAh1AP8JHPgvkxSCCAlKGZCQIB4ci4YEOBGiwb9FAssM0VJGihSJAAAECFEgwL84HlOCDBmywL+OKT8GYBmSIUyVM2najCmTJoCdMVeyNKmFp1CWF43mZDlBIJ6gSwE0HVjUo1CGCFH2BGCx4T88Eqd6FdiqTMKAADs=)}.n-menu[data-v-3daab35e] .n-menu-item .n-menu-item-content .mail{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAYAAACqaXHeAAAAAXNSR0IArs4c6QAAAt9JREFUeF7tm21yqyAUQMVsJF1J25W0+RPjKpquwtE/7VtJ81bSdiFIvY5mCAMKeImAOJPpZFTCOV6Qj1uSbfwgG+fPkoAUARs3kJrAxgMgdYKpCaQmIDHQNM1rTGIopT9ZlsEnK8uy/zse1yZQVdXTbrd7Y4w9xQQvsjDGPhlj76OIXgA8ccbYR8zgAttP27bPIIFUVbXP8/ybvwAsxSYjz/M9H92EkMvxeHwmdV2/dbBnAfhcFMV7TBKapvkSmzdEAZGdGMCjkaBiJIQcIALYAAy9I4Q+Hw3BS5DAA1/PCE39RkBRFA+SJhGsBBEeQh7A8zz/UgqAEzFIkMGXZXmB1/2sgNAlqOCBS1tAqBKm4I0FhCZhDt5KQCgSdOCtBfguQRd+kQBfJZjALxbgmwRTeBQBvkiwgUcTsLYEW3hUAWtJWAKPLuDeEpbCOxFwLwkY8M4EuJaABe9UgCsJmPDOBWBLwIa/iwDF8pPxogpWOQDNH0bTYfHmue8T64twq7YErHJk9XUmQBau3crLI4BzFZmVgFWO6mE5ETDVVk2W17DKmYpUdAE6HZVMQtu2//h9OttyTPcvUAXoVHp8GqIE2JnpNirgsyeE3GzGDttWF9mTNIkop32ACbxKgqyCU/AT5cz2LeO9KBFgAy9UADZi97wAiAhK6UHcvla1Z9tIWCxgCbzkffzYbU/9UkovuuB8GTYSFgnAgp8bT5icN5VgLcBHeJs+wUqAz/CmEowFhABvIsFIQEjwuhK0BYQIryNBS0DI8HMSZgXEAD8loRtp/hfzAyBDrB+VDePza56gzrDU5J29xrWKOcjIeFYmScUArzEHOUvT5GKCn5LQTckf+kzRuq6vzYAL05uc2jXCF/k3byZfXdn9DLIXMGSLQuaUeBFyHfwoDtLjTqfToe/3+CoNWeIvsEgRo4whURpWoq6LLekfJvwIyvVqkSJgPfd+/HKKAD+ew3q12HwE/AEtrqA+boGrjQAAAABJRU5ErkJggg==)}.n-menu[data-v-3daab35e] .n-menu-item .n-menu-item-content--selected .mail{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAYAAACqaXHeAAAAAXNSR0IArs4c6QAAArZJREFUeF7tmwFy2yAQRXdv0pwk8UkanyTOSeqepO5J0p6E+GtEBhMECwIJEMx4PB5LMu+xgLRgpoMXPjg/DQEjAg5uYHSBgwfAGARHFxhdwGFAKfXamZh/RIQXMfP0rstXF1BKvRDRGxHhvedyvXt41yImAXOL/+qZ2mJDFJwggZVSP4jowzoAlnor4DSj+8bMJwhA2F8s2gszv/dkQCn1x9G9JwGuL8DejQQP4xkC1NzS6BcIfTMampfggAefZrw+CGDmJ0eXaFaCA/40NzaiHuW7gHlWsMeF5iS44Jn5Nk/3fgGtS1iCn7kwE4QFtCrBBx8toDUJIfgkAa1IkMAnC6hdghR+lYBaJcTArxZQm4RY+CwCapGQAp9NwN4SUuGzCthLwhr47AK2lrAWvoiArSTkgC8moLSEXPBFBZSSkBO+uIDcEnLDbyXAlWKLzicspLGirwNos4jzAfaJks+e3BtOF1c+13VcdS4mYCH99AxwoyJBCbmus9RgRQQEMjDi9Fqu6/iiNbsAyUDlSrQS0W9znS71OrHrF1kFSCqtW8Mh4XZfqMALKzb2YiyWrfDdt7I2a51NQAy8R4KLcRHec53g2GKcK0+KegYSe6oLVtqqABZi0fJmQYuf7eVrTx3EY0vWaTCl5T3TEWaJ/+gKUnALJlrCqi6QC15yTyE9JnZMSBZQI3zKmJAkoGb4WAnRAlqAj5EQJaAleKkEsYAW4SUSRAJahg9JCAroAd4n4b477K+9PI4dYvquDHdj5k4q8R2edN7e+riFZxDNePFtkmoeXvAMMglwbZPrBj4g4UnvFDW7gT7nYU/t1qFb4Pfsh6/pCVILwJd4wrMPKlCPKi55ZeYzavLwf4F5z/DPWUSPMrAPEpmor2TL+MNEFQG5YyVGBOwov4qfHhFQRTPsWInDR8AnmhspcVE9oYEAAAAASUVORK5CYII=)}.n-menu[data-v-3daab35e] .n-menu-item .n-menu-item-content:hover .mail{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAYAAACqaXHeAAAAAXNSR0IArs4c6QAAAutJREFUeF7tm21S3CAYgAF7kHiL6nSm5hh1p1P3JK4naRxHewzTmc62tyjeQ4lLPtyEAAECGyDkz/4wsu/z8ELCCwvByi+4cn6QBKQMWLmBNARWngBpEkxDIA0BjoHs8fImKjEEYfDpFVMm/O1f/dldH0Mge/hyBc7ebkEFr6KCH8MUAJG7TkQtoO3xn5GD9/EwQCSnEmD263MGCPrPwBfRyYBVNshuWJX4+m8Os8fL2wPsjgHe4c3+LiYJ2dPF82h4E5RD7h8a8mgkSBi3NAOqtqfp7EhTv58NwUvgwFO+jrEYCMCb/TlnSAQrYQRPUF53NiLPbaePBbRPBXZeCE4CDx5//1PWj/spAaFLEMHXXKoCQpUgg9cWEJqEKXgjAaFIUIE3FuC7BFX4WQJ8laADP1uAbxJ04a0I8EWCCbw1AUtLMIW3KmApCXPgrQs4tYS58E4EnEqCDXhnAlxLsAXvVIArCTbhnQuwLcE2/GkE8GpvBuU1QRlrdl1CazncVk2UPyS1N9qGcvC22uEF7kwAt/yEyFcK3gtkUoKtdkS95kSAtAIzLrsLJdhqR5ay1gWoTFS8QitA5L6/T2faju7+hVUBKkF3vTGSAKvysFFR0jLdYc9yuBlLUE4LmNwxrJFRTucAHXihBF6EEnhJO5Nzy8f/6hRFhRMJ+6hTCJoJgG7E0p4/XjQjYLVlt6+FMRhmwuwhYNLzklSkT4kXgEipCt5vy2QTZ5YAW/DKLxYKN+pKMBbgI7zJnGAkwGd4XQnaAkKA15GgJSAkeFUJygJChFeRoCQgZPgpCZMCYoCXSQAE/WbPB9ATYs1bWfN+fjwnqPGGp/DIXuQWwRqkY9yJD0lFAK+wBtnxj8lFBC+VgMh5d1L0OAyOiTo4U7tI/tr90uHiqy3RNQKa06L05BR7k90Q/GmtwJv9tp72mNXVDYDVD1BBKiJGGQUg6L5fbEk/mPAnK5eJJGXAMt79+daUAf70xTKRrD4D3gFsnG7BkkfmVAAAAABJRU5ErkJggg==)}.n-menu[data-v-3daab35e] .n-menu-item .n-menu-item-content .files{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAABx0RVh0U29mdHdhcmUAQWRvYmUgRmlyZXdvcmtzIENTNui8sowAAAE3SURBVDiNpZO9SgNBFIW/OySiaBCtbCwE8ReUgGDpE9gExNJmd6O+hM8gmGJn3yKxt7WyEARBUUSbIPhTGFAwxyarSwoZ2AO3mjkf98y9Y5IoI1fKDVQA0jRtOOd2B8BRST5Jkk4IwCSRZVkbOAYeACdpD3iX9DrUpQO+gHaz2XwuRnCSLuM4vpU0AnSAvplNmdlkocbNbN3MTrz3de/9WKVA/07TdN85twbcA5/A8AsLuAO6wI6k2UrhoGZmy3EcH4Zk995vAAd5hA9gBXgJMQ+0ZWanOaAH1IGrEGer1TJgxszOckAFWATOQwDVanUO6EVR9JYD5oGJJEmeAtvfBG7gb4xLwEWgGWA1v59PoQs8Zlm2ANg/RgETwLRz7voXIOnIzBrAdgCgBvgoivowWOUyKv0bfwCvBmEVd9ynHgAAAABJRU5ErkJggg==)}.n-menu[data-v-3daab35e] .n-menu-item .n-menu-item-content--selected .files{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAKnAAACpwB9NLfEgAAABx0RVh0U29mdHdhcmUAQWRvYmUgRmlyZXdvcmtzIENTNui8sowAAADuSURBVDiNpdO9SkQxEIbh56ynUHQbQbCxEMR/BEGw9B4s1m6t9W5svQgL3d7Wyk4QLES0EcGfQkGbsTgJuywIwTMQEsh8b+ZLJlVEaBOdVmrUad7HQQJO4hQXJYAqWTjHCR4S5BAfeBursoOflP8CIkJEDCJiLq03ozymcgUD9NHDFu7xjfEbjmR7Oo2FemSjizUcl3jHDo6yv0+s47VQDHsYZMAXtnFTKK4wj8sMqLGCq0LAYjr0PQOWMIOnQsAu7hi+8SquC8WwkfPzKzzjEcsaf39FpEpnccuwE3uadp4oAHQ1rX42Cvh3tP6Nv5Cebn/RRiyLAAAAAElFTkSuQmCC)}.n-menu[data-v-3daab35e] .n-menu-item .n-menu-item-content:hover .files{background-image:url(data:image/gif;base64,R0lGODlhEAAQANUAAPX19efn593d3dXV1dPT09HR0c/Pz83NzcvLy8nJycfHx8XFxcHBwb29vbm5ube3t7W1tbOzs7Gxsa+vr62traurq6mpqaenp6WlpaOjo6GhoQDZNp+fn52dnZubm5mZmZeXl5WVlZOTk4+Pj4WFhX5+fnx8fHp6enh4eHZ2dnJycnBwcGZmZgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH/C05FVFNDQVBFMi4wAwEAAAAh+QQFDgAsACwAAAIAEAAMAAAGYEAWCHEohFjIpJJVGJlKD0oGQ8VoVEkCdslFajEMiuVCJlskjwTz1OgmSQsWQhRxIysg1mLysbMcKywKCih2J3UsAgZ+Hh1IABJ+ECVIARwlmJmZJAxJHkQHoaKhA3ksQQAh+QQJDgAsACwAAAAAEAAOAAAGGUCWULgpGo/DpHLJbDqf0Kh0Sq1ar9isMAgAIfkECQ4ALAAsAAABABAADQAABmZAllC4KRqPQhDiUAgNn8/CyFR6UDKYLEajGhK60LDwi2FQLJd02iJ5JFiFU0M8JC1YCFGELqyAWAsTH3wsDissCgoofCd7LAIGhB4dQgAShBAlQgEcJZ6fnyQMQx5LB6eopwN/LEEAIfkECQ4ALAAsAAACABAADAAABmNAFghxKGyOyCSLVRiZSg9KBkPFaFRLFgGb7Xq1KgyDYrmYzRbJI8E8Nb5d0oKFEEXg2QqItZh88EsOKywKCiiAJ3csAgaALB4dSwASjhAlSwEcJZucnCQMWR5EB6SlpAN7LEEAIfkECQ4ALAAsAAACABAADAAABlxAFghxKIRYyKSSVRiZSpuodIokqJbYpBXDoFguYLBF8kgwT41skrRgIUQRNbICYi0mHznLsWIpFChyJ3EsAgZ6Hh1IABJ6ECVIARwllJWVJAxJHkQHnZ6dA3UsQQAh+QQFDgAsACwAAAIAEAAMAAAGZUAWCHEohFjIpJJVGJlKD0oGQ8VoVEkClrXper9ILYZBsVzOZ4vkkWCeGsslacFCiCJxZQXEWkw+eUkOKywKCiiBLCd4LAIGiSweHUgAEpAQJUgBHCWdnp4kDEkeRAemp6YDfCxBACH5BAkOACwALAAAAgAQAAwAAAYUQJZwSCwaj8ikcslsOp/QqHQqDAIAIfkECQ4ALAAsAAACABAADAAABlxAFghxKIRYyKSSVRiZSpuodIokqJbYpBXDoFguYLBF8kgwT41skrRgIUQRNbICYi0mHznLsWIpFChyJ3EsAgZ6Hh1IABJ6ECVIARwllJWVJAxJHkQHnZ6dA3UsQQAh+QQJDgAsACwAAAIAEAAMAAAGY0AWCHEobI7IJItVGJlKD0oGQ8VoVEsWAZvterUqDINiuZjNFskjwTw1vl3SgoUQReDZCoi1mHzwSw4rLAoKKIAndywCBoAsHh1LABKOECVLARwlm5ycJAxZHkQHpKWkA3ssQQAh+QQJDgAsACwAAAEAEAANAAAGZkCWULgpGo9CEOJQCA2fz8LIVHpQMpgsRqMaErrQsPCLYVAsl3TaInkkWIVTQzwkLVgIUYQurIBYCxMffCwOKywKCih8J3ssAgaEHh1CABKEECVCARwlnp+fJAxDHksHp6inA38sQQAh+QQJDgAsACwAAAAAEAAOAAAGZkCWULgpGo/DpHIJQhwKoaWyMDKVHpQMZovRqIaEr3QZxjAolotabZE8EqzCqTEWkhYshChSZ1VALAsTH30OKywKCih1J3wsAgZ9Hh1CABJ9ECVCARwlnp+fJAxDHk4Hp6inA4AsQQA7)}.n-menu[data-v-3daab35e] .n-menu-item .n-menu-item-content .logs{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADAAAAAwCAYAAABXAvmHAAAABHNCSVQICAgIfAhkiAAAAf9JREFUaIHtmUFOwzAQRccWmyaN2HIEOAXpIag4BnsWcRfsOQZSD9EgNhyBI3SLnMnSw6IpciI7iUMdB8lv0zTxKDPyOF/6AxCJ/AnW9xARCyLKGWP5TPm0IKKSMVamabqzrbEWgIgFAAgfibmilNpkWVaanl31xInzBREZg30zZuf7CgCAU/Lr9XpzkYwckFL+ti7n/B4AStM6PmNOXogFhCYWEJrBr5AOEV0j4idj7PbCeezTNN1OCXTagbqunzwkDwDwUNf145RApwKSJHkloq8pLxpgnyTJ25RApxZijH0DwN2UF/ni3x/iWEBoYgGhiUJ2IaKQjSIK2ZwgIiEiVVV1CJhDMfn9SyhgDItsISll3vhSxv86TofYN10zDRFBdwYRUQCA0J26PmeOANq+0B+E7Mg5365Wqw/bAillzjkf1a66UzeXkN0opZ4nxA0yl5AdOecvvYmc3LcWRFQO2ZrBhayxEAsAyPX7XUO3qqqDZjUemvMQ/hAzxgqDiSu6bjQR7TrrBMBCP6OmeUCWZcZ2WmQBNkx2+yILMImWTciCF9BojOjcFl0l7q4holIptXESMp+4CBloahx8B87YZmBDLKYAF5RS7+drawvpwnHpIZ9tdGoY6wr9t1Hmnb5bIceswjb/bQ5tq62klLmpzQYH3eChiDED7EhkJn4A1qwofp3F9mcAAAAASUVORK5CYII=)}.n-menu[data-v-3daab35e] .n-menu-item .n-menu-item-content--selected .logs{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADAAAAAwCAYAAABXAvmHAAAABHNCSVQICAgIfAhkiAAAAf9JREFUaIHtmUFOwzAQRccWmyaN2HIEOAXpIag4BnsWcRfsOQZSD9EgNhyBI3SLnMnSw6IpciI7iUMdB8lv0zTxKDPyOF/6AxCJ/AnW9xARCyLKGWP5TPm0IKKSMVamabqzrbEWgIgFAAgfibmilNpkWVaanl31xInzBREZg30zZuf7CgCAU/Lr9XpzkYwckFL+ti7n/B4AStM6PmNOXogFhCYWEJrBr5AOEV0j4idj7PbCeezTNN1OCXTagbqunzwkDwDwUNf145RApwKSJHkloq8pLxpgnyTJ25RApxZijH0DwN2UF/ni3x/iWEBoYgGhiUJ2IaKQjSIK2ZwgIiEiVVV1CJhDMfn9SyhgDItsISll3vhSxv86TofYN10zDRFBdwYRUQCA0J26PmeOANq+0B+E7Mg5365Wqw/bAillzjkf1a66UzeXkN0opZ4nxA0yl5AdOecvvYmc3LcWRFQO2ZrBhayxEAsAyPX7XUO3qqqDZjUemvMQ/hAzxgqDiSu6bjQR7TrrBMBCP6OmeUCWZcZ2WmQBNkx2+yILMImWTciCF9BojOjcFl0l7q4holIptXESMp+4CBloahx8B87YZmBDLKYAF5RS7+drawvpwnHpIZ9tdGoY6wr9t1Hmnb5bIceswjb/bQ5tq62klLmpzQYH3eChiDED7EhkJn4A1qwofp3F9mcAAAAASUVORK5CYII=)}.n-menu[data-v-3daab35e] .n-menu-item .n-menu-item-content:hover .logs{background-image:url(data:image/gif;base64,R0lGODlhEAAQAPcAACszOzM7Q9vb2+Pj49PT0ztDQzMzOwPDM+vr6/Pz8wuzM5ubm2Nja3uDgys7O2tzc0NDS8vLy4ODi2trc7Ozs7u7u1NTWzs7Q3t7g8PLy0tTU0tTW8PDywPLMwurOyNbOyNLOwujMx9XLx9fNwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH/C05FVFNDQVBFMi4wAwEAAAAh+QQEBAD/ACwAAAAAEAAQAAAIcgABADBAsKBBggIFVhBAoKFDAgIELDCQcEDCiwINELhoEWNCjRw9ftxYUWRGkgI7igRZ0iTLlCYHUgi5EgODCS09SkiAIMEFmB41IFgAgIMAoBg1DJgYoaNKjBgQ9NQg0GjEqxEgXGhw82OACwG+hvUYEAAh+QQEBAD/ACwAAAAAAQABAAAIBAABBAQAIfkEBAQA/wAsAAAAAAEAAQAACAQAAQQEACH5BAQEAP8ALAAAAAABAAEAAAgEAAEEBAAh+QQEBAD/ACwAAAAAAQABAAAIBAABBAQAIfkEBAQA/wAsAAAAAAEAAQAACAQAAQQEACH5BAQEAP8ALAQAAQAIAAQAAAgUAAkIHCgQgMGDCBMCCOHBgwOEAQEAIfkEBAQA/wAsBgAAAAgABQAACB8ALxgIQDDAhQAEEioUsACAw4cIH0KM4CFERQ8OEAYEACH5BAQEAP8ALAAAAAABAAEAAAgEAAEEBAAh+QQEBAD/ACwAAAAAAQABAAAIBAABBAQAIfkEBAQA/wAsAAAAAAEAAQAACAQAAQQEACH5BAQEAP8ALAQAAAAKAAgAAAgyAC8YCBBgIMELAQgoXKhQwAIAECNCNEBAosSEIRQcUMBRAYiEFiNSDDmRQIiTDiRSDAgAIfkEBAQA/wAsBwAAAAYACAAACCYALxgIYODCBQIIEQoAwJBhgIYOFSg4oEDEQ4gXGwYIwTGEgwABAQAh+QQEBAD/ACwAAAAAAQABAAAIBAABBAQAIfkEBAQA/wAsAAAAAAEAAQAACAQAAQQEACH5BAQEAP8ALAAAAAABAAEAAAgEAAEEBAAh+QQEBAD/ACwEAAAABwALAAAIJgANCBR4IQCBgwgJAFjIsGHDEAcURIzosCLDEBgzhrBoMYQIhwEBACH5BAQEAP8ALAUAAAAJAAsAAAhDAA0YuDDQQIALAQgoXCiAwAIAECMCuEBAYsSEBxRkPHBAxIUIFiEmDAkgYQgPIVKGcDAypAEKLjEw4HggBEQJCRAEBAAh+QQEBAD/ACwAAAAAAQABAAAIBAABBAQAIfkEBAQA/wAsAAAAAAEAAQAACAQAAQQEACH5BAQEAP8ALAAAAAABAAEAAAgEAAEEBAAh+QQEBAD/ACwAAAAAAQABAAAIBAABBAQAIfkEBAQA/wAsAAAAAAEAAQAACAQAAQQEACH5BAQEAP8ALAAAAAABAAEAAAgEAAEEBAAh+QQEBAD/ACwAAAAAAQABAAAIBAABBAQAIf8LWE1QIERhdGFYTVA8P3hwYWNrZXQgYmVnaW49Iu+7vyIgaWQ9Ilc1TTBNcENlaGlIenJlU3pOVGN6a2M5ZCI/Pgo8eDp4bXBtZXRhIHhtbG5zOng9ImFkb2JlOm5zOm1ldGEvIiB4OnhtcHRrPSJBZG9iZSBYTVAgQ29yZSA2LjAtYzAwMyA3OS4xNjQ1MjcsIDIwMjAvMTAvMTUtMTc6NDg6MzIgICAgICAgICI+CiA8cmRmOlJERiB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiPgogIDxyZGY6RGVzY3JpcHRpb24gcmRmOmFib3V0PSIiCiAgICB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIKICAgIHhtbG5zOnN0RXZ0PSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvc1R5cGUvUmVzb3VyY2VFdmVudCMiCiAgICB4bWxuczpzdFJlZj0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL3NUeXBlL1Jlc291cmNlUmVmIyIKICAgIHhtbG5zOmRjPSJodHRwOi8vcHVybC5vcmcvZGMvZWxlbWVudHMvMS4xLyIKICAgIHhtbG5zOnhtcD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wLyIKICAgIHhtbG5zOnhtcERNPSJodHRwOi8vbnMuYWRvYmUuY29tL3htcC8xLjAvRHluYW1pY01lZGlhLyIKICAgIHhtbG5zOnN0RGltPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvc1R5cGUvRGltZW5zaW9ucyMiCiAgIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6ZmYyZWY0OTItM2JkZC05OTQ3LTk5YWMtMmQzMzI3MDVhMzIzIgogICB4bXBNTTpEb2N1bWVudElEPSJmZWI4MmYyNS1mZmZiLTNkYjgtY2EzMC0wNjE4MDAwMDAwM2YiCiAgIHhtcE1NOk9yaWdpbmFsRG9jdW1lbnRJRD0ieG1wLmRpZDoxYTVlZTUyOS03NWE4LTg0NDctODMzMi01NDRiZTAyMTFlYzUiCiAgIHhtcDpNZXRhZGF0YURhdGU9IjIwMjItMTItMTVUMTc6Mzc6NTErMDg6MDAiCiAgIHhtcDpNb2RpZnlEYXRlPSIyMDIyLTEyLTE1VDE3OjM3OjUxKzA4OjAwIgogICB4bXA6Q3JlYXRlRGF0ZT0iMjAyMi0xMi0xNVQxNzozNzoyMSswODowMCIKICAgZGM6Zm9ybWF0PSLliqjnlLsgR0lGIgogICB4bXBETTp2aWRlb0ZyYW1lUmF0ZT0iMjUuMDAwMDAwIgogICB4bXBETTp2aWRlb0ZpZWxkT3JkZXI9IlByb2dyZXNzaXZlIgogICB4bXBETTp2aWRlb1BpeGVsQXNwZWN0UmF0aW89IjEvMSIKICAgeG1wRE06c3RhcnRUaW1lU2NhbGU9IjI1IgogICB4bXBETTpzdGFydFRpbWVTYW1wbGVTaXplPSIxIj4KICAgPHhtcE1NOkhpc3Rvcnk+CiAgICA8cmRmOlNlcT4KICAgICA8cmRmOmxpCiAgICAgIHN0RXZ0OmFjdGlvbj0ic2F2ZWQiCiAgICAgIHN0RXZ0Omluc3RhbmNlSUQ9IjlkMWU4YTJjLWE4NGUtM2U1Ni04ZDI0LWRjZjEwMDAwMDA2YyIKICAgICAgc3RFdnQ6d2hlbj0iMjAyMi0xMi0xNVQxNzozNzo1MSswODowMCIKICAgICAgc3RFdnQ6c29mdHdhcmVBZ2VudD0iQWRvYmUgQWRvYmUgTWVkaWEgRW5jb2RlciAyMDIwLjAgKFdpbmRvd3MpIgogICAgICBzdEV2dDpjaGFuZ2VkPSIvIi8+CiAgICAgPHJkZjpsaQogICAgICBzdEV2dDphY3Rpb249ImNyZWF0ZWQiCiAgICAgIHN0RXZ0Omluc3RhbmNlSUQ9InhtcC5paWQ6MTJjMmZmZmItZGM3NC02ODQyLWIxOTEtMDhhMzgzM2RhMDgyIgogICAgICBzdEV2dDp3aGVuPSIyMDIyLTEyLTE1VDE0OjUwOjAyKzA4OjAwIi8+CiAgICAgPHJkZjpsaQogICAgICBzdEV2dDphY3Rpb249InNhdmVkIgogICAgICBzdEV2dDppbnN0YW5jZUlEPSJ4bXAuaWlkOmYxNDI3ZWYyLTQ1ZjEtMmY0Zi1hNDY0LTU4MzgyOGMxNjJlNyIKICAgICAgc3RFdnQ6d2hlbj0iMjAyMi0xMi0xNVQxNDo1MjoxNCswODowMCIKICAgICAgc3RFdnQ6Y2hhbmdlZD0iL2NvbnRlbnQiLz4KICAgICA8cmRmOmxpCiAgICAgIHN0RXZ0OmFjdGlvbj0ic2F2ZWQiCiAgICAgIHN0RXZ0Omluc3RhbmNlSUQ9InhtcC5paWQ6NTZjODkxYmQtMzQ4YS01OTQ3LTk2MDItMjFkM2JlZmRiZjAwIgogICAgICBzdEV2dDp3aGVuPSIyMDIyLTEyLTE1VDE1OjQwOjE5KzA4OjAwIgogICAgICBzdEV2dDpjaGFuZ2VkPSIvY29udGVudCIvPgogICAgIDxyZGY6bGkKICAgICAgc3RFdnQ6YWN0aW9uPSJkZXJpdmVkIgogICAgICBzdEV2dDpwYXJhbWV0ZXJzPSJzYXZlZCB0byBuZXcgbG9jYXRpb24iLz4KICAgICA8cmRmOmxpCiAgICAgIHN0RXZ0OmFjdGlvbj0ic2F2ZWQiCiAgICAgIHN0RXZ0Omluc3RhbmNlSUQ9InhtcC5paWQ6NThkMTQ4M2QtZjAyMy02ZTQ4LWE0NTYtZDg3YTA1YWEzMWQ1IgogICAgICBzdEV2dDp3aGVuPSIyMDIyLTEyLTE1VDE1OjQwOjI2KzA4OjAwIgogICAgICBzdEV2dDpjaGFuZ2VkPSIvIi8+CiAgICAgPHJkZjpsaQogICAgICBzdEV2dDphY3Rpb249InNhdmVkIgogICAgICBzdEV2dDppbnN0YW5jZUlEPSJ4bXAuaWlkOmRmMzhmYzNiLTE5ZGEtNGY0MC1iMjU2LWVhYzIxOWFjZGNmMiIKICAgICAgc3RFdnQ6d2hlbj0iMjAyMi0xMi0xNVQxNjowMzo0NiswODowMCIKICAgICAgc3RFdnQ6Y2hhbmdlZD0iL2NvbnRlbnQiLz4KICAgICA8cmRmOmxpCiAgICAgIHN0RXZ0OmFjdGlvbj0ic2F2ZWQiCiAgICAgIHN0RXZ0Omluc3RhbmNlSUQ9InhtcC5paWQ6NzZjOTFlOGYtZTkyZC1iMjQ1LWJkYWItODdiYThmMDU5ZjkwIgogICAgICBzdEV2dDp3aGVuPSIyMDIyLTEyLTE1VDE3OjM3OjQ4KzA4OjAwIgogICAgICBzdEV2dDpjaGFuZ2VkPSIvY29udGVudCIvPgogICAgIDxyZGY6bGkKICAgICAgc3RFdnQ6YWN0aW9uPSJzYXZlZCIKICAgICAgc3RFdnQ6aW5zdGFuY2VJRD0ieG1wLmlpZDpiNDJmZDUyMi00NGM4LTdmNDUtYTJjNS1iMjU0ZDdiNDdjMDciCiAgICAgIHN0RXZ0OndoZW49IjIwMjItMTItMTVUMTc6Mzc6NDgrMDg6MDAiCiAgICAgIHN0RXZ0OmNoYW5nZWQ9Ii8iLz4KICAgICA8cmRmOmxpCiAgICAgIHN0RXZ0OmFjdGlvbj0ic2F2ZWQiCiAgICAgIHN0RXZ0Omluc3RhbmNlSUQ9InhtcC5paWQ6MThjMjc4NjktMDAyMS04YzRmLThjMDMtMzVlZTU3MzAwZGQ5IgogICAgICBzdEV2dDp3aGVuPSIyMDIyLTEyLTE1VDE3OjM3OjUxKzA4OjAwIgogICAgICBzdEV2dDpzb2Z0d2FyZUFnZW50PSJBZG9iZSBBZG9iZSBNZWRpYSBFbmNvZGVyIDIwMjAuMCAoV2luZG93cykiCiAgICAgIHN0RXZ0OmNoYW5nZWQ9Ii8iLz4KICAgICA8cmRmOmxpCiAgICAgIHN0RXZ0OmFjdGlvbj0ic2F2ZWQiCiAgICAgIHN0RXZ0Omluc3RhbmNlSUQ9InhtcC5paWQ6ZmYyZWY0OTItM2JkZC05OTQ3LTk5YWMtMmQzMzI3MDVhMzIzIgogICAgICBzdEV2dDp3aGVuPSIyMDIyLTEyLTE1VDE3OjM3OjUxKzA4OjAwIgogICAgICBzdEV2dDpzb2Z0d2FyZUFnZW50PSJBZG9iZSBBZG9iZSBNZWRpYSBFbmNvZGVyIDIwMjAuMCAoV2luZG93cykiCiAgICAgIHN0RXZ0OmNoYW5nZWQ9Ii9tZXRhZGF0YSIvPgogICAgPC9yZGY6U2VxPgogICA8L3htcE1NOkhpc3Rvcnk+CiAgIDx4bXBNTTpEZXJpdmVkRnJvbQogICAgc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDo2ZGUxZmEzNC0wNzNlLTJiNDgtYTNmYi0yY2Y3ZjFhMzczNjAiCiAgICBzdFJlZjpkb2N1bWVudElEPSJ4bXAuZGlkOjZkZTFmYTM0LTA3M2UtMmI0OC1hM2ZiLTJjZjdmMWEzNzM2MCIKICAgIHN0UmVmOm9yaWdpbmFsRG9jdW1lbnRJRD0ieG1wLmRpZDoxMmMyZmZmYi1kYzc0LTY4NDItYjE5MS0wOGEzODMzZGEwODIiLz4KICAgPHhtcE1NOkluZ3JlZGllbnRzPgogICAgPHJkZjpCYWc+CiAgICAgPHJkZjpsaQogICAgICBzdFJlZjppbnN0YW5jZUlEPSJ4bXAuaWlkOjg1NmYwYzA0LWU0MzUtNzk0Ny1iMmQwLTkwMDliMjlhYzdmNiIKICAgICAgc3RSZWY6ZnJvbVBhcnQ9InRpbWU6MGQ3NjgwMDBmMjU2MDAiCiAgICAgIHN0UmVmOnRvUGFydD0idGltZTowZDc2ODAwMGYyNTYwMCIKICAgICAgc3RSZWY6bWFza01hcmtlcnM9Ik5vbmUiLz4KICAgIDwvcmRmOkJhZz4KICAgPC94bXBNTTpJbmdyZWRpZW50cz4KICAgPHhtcE1NOlBhbnRyeT4KICAgIDxyZGY6QmFnPgogICAgIDxyZGY6bGk+CiAgICAgIDxyZGY6RGVzY3JpcHRpb24KICAgICAgIGRjOmZvcm1hdD0iYXBwbGljYXRpb24vdm5kLmFkb2JlLmFmdGVyZWZmZWN0cy5sYXllciIKICAgICAgIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6NWI1MGU1ZTktMTRlMy0zZDQyLWEyMmMtMDY5NjNjNGY3ZWJjIj4KICAgICAgPGRjOnRpdGxlPgogICAgICAgPHJkZjpBbHQ+CiAgICAgICAgPHJkZjpsaSB4bWw6bGFuZz0ieC1kZWZhdWx0Ij7mt7HoibIg5ZOB6JOd6ImyIOe6r+iJsiAxPC9yZGY6bGk+CiAgICAgICA8L3JkZjpBbHQ+CiAgICAgIDwvZGM6dGl0bGU+CiAgICAgIDwvcmRmOkRlc2NyaXB0aW9uPgogICAgIDwvcmRmOmxpPgogICAgIDxyZGY6bGk+CiAgICAgIDxyZGY6RGVzY3JpcHRpb24KICAgICAgIGRjOmZvcm1hdD0iYXBwbGljYXRpb24vdm5kLmFkb2JlLmFmdGVyZWZmZWN0cy5sYXllciIKICAgICAgIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6N2U1M2FmMjctYzQzNS1iNjQ5LTk4MTAtNTYzYjE4ZmI5ZDI1Ij4KICAgICAgPGRjOnRpdGxlPgogICAgICAgPHJkZjpBbHQ+CiAgICAgICAgPHJkZjpsaSB4bWw6bGFuZz0ieC1kZWZhdWx0Ij7nn6nlvaIgODEucG5nPC9yZGY6bGk+CiAgICAgICA8L3JkZjpBbHQ+CiAgICAgIDwvZGM6dGl0bGU+CiAgICAgIDwvcmRmOkRlc2NyaXB0aW9uPgogICAgIDwvcmRmOmxpPgogICAgIDxyZGY6bGk+CiAgICAgIDxyZGY6RGVzY3JpcHRpb24KICAgICAgIGRjOmZvcm1hdD0iYXBwbGljYXRpb24vdm5kLmFkb2JlLmFmdGVyZWZmZWN0cy5jb21wIgogICAgICAgeG1wTU06SW5zdGFuY2VJRD0ieG1wLmlpZDo4NTZmMGMwNC1lNDM1LTc5NDctYjJkMC05MDA5YjI5YWM3ZjYiPgogICAgICA8ZGM6dGl0bGU+CiAgICAgICA8cmRmOkFsdD4KICAgICAgICA8cmRmOmxpIHhtbDpsYW5nPSJ4LWRlZmF1bHQiPuWQiOaIkCAxPC9yZGY6bGk+CiAgICAgICA8L3JkZjpBbHQ+CiAgICAgIDwvZGM6dGl0bGU+CiAgICAgIDx4bXBNTTpJbmdyZWRpZW50cz4KICAgICAgIDxyZGY6QmFnPgogICAgICAgIDxyZGY6bGkKICAgICAgICAgc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDo1YjUwZTVlOS0xNGUzLTNkNDItYTIyYy0wNjk2M2M0ZjdlYmMiCiAgICAgICAgIHN0UmVmOmZyb21QYXJ0PSJ0aW1lOjBkNzY4MDAwZjI1NjAwIgogICAgICAgICBzdFJlZjp0b1BhcnQ9InRpbWU6MGQ3NjgwMDBmMjU2MDAiCiAgICAgICAgIHN0UmVmOm1hc2tNYXJrZXJzPSJOb25lIi8+CiAgICAgICAgPHJkZjpsaQogICAgICAgICBzdFJlZjppbnN0YW5jZUlEPSJ4bXAuaWlkOjdlNTNhZjI3LWM0MzUtYjY0OS05ODEwLTU2M2IxOGZiOWQyNSIKICAgICAgICAgc3RSZWY6ZnJvbVBhcnQ9InRpbWU6MGQ3NjgwMDBmMjU2MDAiCiAgICAgICAgIHN0UmVmOnRvUGFydD0idGltZTowZDc2ODAwMGYyNTYwMCIKICAgICAgICAgc3RSZWY6bWFza01hcmtlcnM9Ik5vbmUiLz4KICAgICAgICA8cmRmOmxpCiAgICAgICAgIHN0UmVmOmluc3RhbmNlSUQ9InhtcC5paWQ6YWM5NGVmNzAtMmVkNC03YjQzLTg5YTktNzU0NTkwMjExOGVmIgogICAgICAgICBzdFJlZjpmcm9tUGFydD0idGltZTowZDc2ODAwMGYyNTYwMCIKICAgICAgICAgc3RSZWY6dG9QYXJ0PSJ0aW1lOjBkNzY4MDAwZjI1NjAwIgogICAgICAgICBzdFJlZjptYXNrTWFya2Vycz0iTm9uZSIvPgogICAgICAgIDxyZGY6bGkKICAgICAgICAgc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDpiMjY3NDgyNS05MjE4LTQ1NDYtYjA4ZS01ZTI3M2QyNDAyMjgiCiAgICAgICAgIHN0UmVmOmZyb21QYXJ0PSJ0aW1lOjBkNzY4MDAwZjI1NjAwIgogICAgICAgICBzdFJlZjp0b1BhcnQ9InRpbWU6MGQ3NjgwMDBmMjU2MDAiCiAgICAgICAgIHN0UmVmOm1hc2tNYXJrZXJzPSJOb25lIi8+CiAgICAgICAgPHJkZjpsaQogICAgICAgICBzdFJlZjppbnN0YW5jZUlEPSJ4bXAuaWlkOmNiYmJlOTY0LTM0MmYtYTM0ZC1iM2Q2LTI3ZGUyOTE3MWFhYSIKICAgICAgICAgc3RSZWY6ZnJvbVBhcnQ9InRpbWU6MGQ3NjgwMDBmMjU2MDAiCiAgICAgICAgIHN0UmVmOnRvUGFydD0idGltZTowZDc2ODAwMGYyNTYwMCIKICAgICAgICAgc3RSZWY6bWFza01hcmtlcnM9Ik5vbmUiLz4KICAgICAgIDwvcmRmOkJhZz4KICAgICAgPC94bXBNTTpJbmdyZWRpZW50cz4KICAgICAgPC9yZGY6RGVzY3JpcHRpb24+CiAgICAgPC9yZGY6bGk+CiAgICAgPHJkZjpsaT4KICAgICAgPHJkZjpEZXNjcmlwdGlvbgogICAgICAgZGM6Zm9ybWF0PSJhcHBsaWNhdGlvbi92bmQuYWRvYmUuYWZ0ZXJlZmZlY3RzLmxheWVyIgogICAgICAgeG1wTU06SW5zdGFuY2VJRD0ieG1wLmlpZDphYzk0ZWY3MC0yZWQ0LTdiNDMtODlhOS03NTQ1OTAyMTE4ZWYiPgogICAgICA8ZGM6dGl0bGU+CiAgICAgICA8cmRmOkFsdD4KICAgICAgICA8cmRmOmxpIHhtbDpsYW5nPSJ4LWRlZmF1bHQiPue7hOWQiCAxNS5wbmc8L3JkZjpsaT4KICAgICAgIDwvcmRmOkFsdD4KICAgICAgPC9kYzp0aXRsZT4KICAgICAgPC9yZGY6RGVzY3JpcHRpb24+CiAgICAgPC9yZGY6bGk+CiAgICAgPHJkZjpsaT4KICAgICAgPHJkZjpEZXNjcmlwdGlvbgogICAgICAgZGM6Zm9ybWF0PSJhcHBsaWNhdGlvbi92bmQuYWRvYmUuYWZ0ZXJlZmZlY3RzLmxheWVyIgogICAgICAgeG1wTU06SW5zdGFuY2VJRD0ieG1wLmlpZDpiMjY3NDgyNS05MjE4LTQ1NDYtYjA4ZS01ZTI3M2QyNDAyMjgiPgogICAgICA8ZGM6dGl0bGU+CiAgICAgICA8cmRmOkFsdD4KICAgICAgICA8cmRmOmxpIHhtbDpsYW5nPSJ4LWRlZmF1bHQiPuefqeW9oiA2NS5wbmc8L3JkZjpsaT4KICAgICAgIDwvcmRmOkFsdD4KICAgICAgPC9kYzp0aXRsZT4KICAgICAgPC9yZGY6RGVzY3JpcHRpb24+CiAgICAgPC9yZGY6bGk+CiAgICAgPHJkZjpsaT4KICAgICAgPHJkZjpEZXNjcmlwdGlvbgogICAgICAgZGM6Zm9ybWF0PSJhcHBsaWNhdGlvbi92bmQuYWRvYmUuYWZ0ZXJlZmZlY3RzLmxheWVyIgogICAgICAgeG1wTU06SW5zdGFuY2VJRD0ieG1wLmlpZDpjYmJiZTk2NC0zNDJmLWEzNGQtYjNkNi0yN2RlMjkxNzFhYWEiPgogICAgICA8ZGM6dGl0bGU+CiAgICAgICA8cmRmOkFsdD4KICAgICAgICA8cmRmOmxpIHhtbDpsYW5nPSJ4LWRlZmF1bHQiPuefqeW9oiA4MC5wbmc8L3JkZjpsaT4KICAgICAgIDwvcmRmOkFsdD4KICAgICAgPC9kYzp0aXRsZT4KICAgICAgPC9yZGY6RGVzY3JpcHRpb24+CiAgICAgPC9yZGY6bGk+CiAgICA8L3JkZjpCYWc+CiAgIDwveG1wTU06UGFudHJ5PgogICA8eG1wRE06dmlkZW9GcmFtZVNpemUKICAgIHN0RGltOnc9IjE2IgogICAgc3REaW06aD0iMTYiCiAgICBzdERpbTp1bml0PSJwaXhlbCIvPgogICA8eG1wRE06ZHVyYXRpb24KICAgIHhtcERNOnZhbHVlPSIyNSIKICAgIHhtcERNOnNjYWxlPSIxLzI1Ii8+CiAgIDx4bXBETTpzdGFydFRpbWVjb2RlCiAgICB4bXBETTp0aW1lRm9ybWF0PSIyNVRpbWVjb2RlIgogICAgeG1wRE06dGltZVZhbHVlPSIwMDowMDowMDowMCIvPgogICA8eG1wRE06YWx0VGltZWNvZGUKICAgIHhtcERNOnRpbWVWYWx1ZT0iMDA6MDA6MDA6MDAiCiAgICB4bXBETTp0aW1lRm9ybWF0PSIyNVRpbWVjb2RlIi8+CiAgPC9yZGY6RGVzY3JpcHRpb24+CiA8L3JkZjpSREY+CjwveDp4bXBtZXRhPgo8P3hwYWNrZXQgZW5kPSJyIj8+Af/+/fz7+vn49/b19PPy8fDv7u3s6+rp6Ofm5eTj4uHg397d3Nva2djX1tXU09LR0M/OzczLysnIx8bFxMPCwcC/vr28u7q5uLe2tbSzsrGwr66trKuqqainpqWko6KhoJ+enZybmpmYl5aVlJOSkZCPjo2Mi4qJiIeGhYSDgoGAf359fHt6eXh3dnV0c3JxcG9ubWxramloZ2ZlZGNiYWBfXl1cW1pZWFdWVVRTUlFQT05NTEtKSUhHRkVEQ0JBQD8+PTw7Ojk4NzY1NDMyMTAvLi0sKyopKCcmJSQjIiEgHx4dHBsaGRgXFhUUExIREA8ODQwLCgkIBwYFBAMCAQAAOw==)}.n-menu[data-v-3daab35e] .n-menu-item .n-menu-item-content .node{background-size:18px!important;background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAC7klEQVR4nO2W31HbQBCH94SdVzsV4FSQdBCnglCCqQBdjJ1HxGNsHIkKcAmkgogOQgUxFcS8BkfKt5KMLSHbsmGGYYZvZoc9vLf3O92/NfLMvFwBvu+37v5FJ7hS33NOrbUT2YGtBTBwczaLjmIRl2YTU6YkCmo159xaO6VdGfpV5+zMP4gk8iWWlqTcYMo+ptkmjjj2+Nhe0qqEwTYy8P0PMot9kbgtGbHI6ZuaE+DK31nkksjFbWBgQqkZ27f2F4210G81+rlZZ51xRxb8qNccl089kSWIbd3NogD3M5ZiZMz+IHT1sqwUMByOTpili9vENPBaxHF7PRvKGoZDvy0SBfR9LylT+ga9XvcU/wEGy6EJYhNdMOuWpNyKI26/2x3LFgxGo45EEuA2MB1pYmLnsDgBg+UYDEeIzzDmvL5nvHWfcB0sSzPbHyc0E/q9Ls0FuYaSF5CsYekZT76U6MbUMGOLM1MQkN4VS3uokgD+eY0KnfVHbEr7/oxnSXVjHvDbAiOXiCUkFVvYQ1dYSziulQTw54rAdnLu42Rn7xPJGsolP3YkTVoKCQNmcIDAlnBPOMZx9V4gbyhMiLyGv/fkGgqBjJEKkIxvw5FHoIvbwKpwS5Lga6/rSQZ5Q9lVgJKuefQTdyNGnE/FPUHeUF4FvAp4jAAlEzEWPZbl3DB4pzi4Qt5QHitgDpeMS5Ani2N5SyKPByfAL4W8oTyVAIUbscnz+wdXeJ7fWm5J3JWQN5QtBMDmomIeW0y6TLGYKcbmGkr2jHoyX+f0QWKCD2e4ToB+IWrH+XuglD7rDzoq2rnwjE55mr3+8Zdz/HtWCRicfT+SOPYkezMISsq3sknkOhZBSL7MSh6kRVFRFJCcknwxU1q+LWOwjWhiyZVZJqzXzCHiftMQBnl3N4svmGtbgKTXVco3hdjqZPtDv0gDK2PjcSxC/HawLFTKrG8cH9FcsGP5trWAOQjR/TEWYAk6DDyRHdhZwFPx7AL+A2XBxTB9HMhUAAAAAElFTkSuQmCC)}.n-menu[data-v-3daab35e] .n-menu-item .n-menu-item-content--selected .node{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAACpElEQVR4nO2Xi1HbQBRF71ZgpQKUCqCDKBXgEpQKEBVYrgC5AlwCVJClA1xBRAWRK1DOY+XP+oMlwwyTGc7MmWtZ7719xJ+A0yfz/y7Qtm0qaYLG1DlX6wwGL8DBCXGDBSZoNFjhjEUasjeDFuDwMXGHqQIvaFygUUu6ZYkHshcOT8LBV4QdnGnDFCs0is4RGl5hkWfyTRwehYMT4g5zbXjEguG1tqA2VVjoGlfMFRZpyIMcXYCBE6LABI0F2sFeb0BfprDIJRoNVvRNyT0cRnQD7jFVYIkFA+YaAHNycTCO0Kgl/XI7P4DDCBpbYsUMS5oacjCMSogCJ/gKs6IzowuDppZYMRdvNrfzehuUZQrvD8NeZ68dqEkVDs/VQV10ZnRh0NQSC2zwB1pWOKO34XaqcPAYt3nAW2pqAXUTosAEnzAVH1fuO3JNdGHQ2BJPzrmMh2MeV3iBtcIhucLQY1Q4xlThe8LePw/M8uIH4rEj10QXBoUt8eRYQB08VYpBOMI+LLFiRqkOZnidu4DB05mk39iHn27nPUG/19cCXwu8ZwGDW5nCl9MFHuIFc3q9dqDX670LrKDEPpKlNh9L+9iV9FTkQejx+qgFDMoS4i8a36hvyKNQ7zVgAcMrfLU+kweh9LWWmr05Kyi5Iu4wE1Aa1UYXBg25+OfU5nWeKyzSkBHUtsTeUINbCTHBAg17mQpK59pir9Homgu0AUaDJc0zcg11LSGej+bw9A1RavN/xhQryhoywuFRGJSKRrxGo9bWLxXcjxbgMlP8y8wjFtyudQSHJ+kG2yKXaHixCP5B4zveY6bAAu1grxM47A2L5AqLjPAQSyw52Gp6MWgBgyUSolT442SbGdrhDdmbwQusYJFU4RNi5Bxc6wzOXuCj+PQF/gGjJ1cw9OUM3wAAAABJRU5ErkJggg==)}.n-menu[data-v-3daab35e] .n-menu-item .n-menu-item-content:hover .node{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAACpElEQVR4nO2Xi1HbQBRF71ZgpQKUCqCDKBXgEpQKEBVYrgC5AlwCVJClA1xBRAWRK1DOY+XP+oMlwwyTGc7MmWtZ7719xJ+A0yfz/y7Qtm0qaYLG1DlX6wwGL8DBCXGDBSZoNFjhjEUasjeDFuDwMXGHqQIvaFygUUu6ZYkHshcOT8LBV4QdnGnDFCs0is4RGl5hkWfyTRwehYMT4g5zbXjEguG1tqA2VVjoGlfMFRZpyIMcXYCBE6LABI0F2sFeb0BfprDIJRoNVvRNyT0cRnQD7jFVYIkFA+YaAHNycTCO0Kgl/XI7P4DDCBpbYsUMS5oacjCMSogCJ/gKs6IzowuDppZYMRdvNrfzehuUZQrvD8NeZ68dqEkVDs/VQV10ZnRh0NQSC2zwB1pWOKO34XaqcPAYt3nAW2pqAXUTosAEnzAVH1fuO3JNdGHQ2BJPzrmMh2MeV3iBtcIhucLQY1Q4xlThe8LePw/M8uIH4rEj10QXBoUt8eRYQB08VYpBOMI+LLFiRqkOZnidu4DB05mk39iHn27nPUG/19cCXwu8ZwGDW5nCl9MFHuIFc3q9dqDX670LrKDEPpKlNh9L+9iV9FTkQejx+qgFDMoS4i8a36hvyKNQ7zVgAcMrfLU+kweh9LWWmr05Kyi5Iu4wE1Aa1UYXBg25+OfU5nWeKyzSkBHUtsTeUINbCTHBAg17mQpK59pir9Homgu0AUaDJc0zcg11LSGej+bw9A1RavN/xhQryhoywuFRGJSKRrxGo9bWLxXcjxbgMlP8y8wjFtyudQSHJ+kG2yKXaHixCP5B4zveY6bAAu1grxM47A2L5AqLjPAQSyw52Gp6MWgBgyUSolT442SbGdrhDdmbwQusYJFU4RNi5Bxc6wzOXuCj+PQF/gGjJ1cw9OUM3wAAAABJRU5ErkJggg==)}.n-menu[data-v-3daab35e] .n-menu-item .n-menu-item-content .account{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAABjElEQVR4nKWRzW3CQBBGZ7nBKXTgEswROMR0AB2QCoAK4hI2FbAd4A7iCyBxMakAl8AJhEBs3lgYYhQlSHzSejx/b9ZjI3daLBYjzFBEQk4qIh+dTidZLpdBu93O5U4VwHw+nxpjmpyxFq9Wq/B4PDoRSTiice/9rNFoTFqt1pbQDcCEiGTMtEh+KMuyl/1+n9McKpQbOhHZUjfG3gBMjynShMWt6NKUkEsUuNvtNt1ut0nsYYAlt+YGThC+p67oLR4qgn3MiEQPe5VO5BMyAD0AxV5Op1NCXSDIcK4CkrKHTbkk9hLgT0Xkq16vx4fD4fV8Plv8CYAEWwUona1/Mu0Ft9Qaf0DjEKt/wddqtQG3SQVdAUx7996/8Wop1O9NiUU0RvhDTkzMaYw6V/qGBr26xYRcs69X570imgJACZOtNl32kgMJjSYhpjSHvzWXuq/DH+JHhukOUqpk+UfUWkzOAi2AAMBMARnUnlJJ/imaIprGAPq4CnQKUGIgDwhAAMBRH8lFxRKf0dOAb1+0+Iv8rQDnAAAAAElFTkSuQmCC)}.n-menu[data-v-3daab35e] .n-menu-item .n-menu-item-content--selected .account{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAABTklEQVR4nKWSgVGDQBRE9zrADq4EOvDSAekAKwhWICWcFeQ6kA6kA7ECKYEO8H0gKOhoZrIzm/3/77+dA+K0wziOJ6SUlMNW0rNzrmHu0V47bAJYOiN3sLJlegtJkhpoqOALfMQf0K8AloOkGiPoG5hnSC9uhNfTJ0kDdYVuAmrNRkQ3wEviFnj2KBn1B7Xd9OoAm3V4SYB+pJ7OTj8GZgVyYn5AVzDPkDd4cPMj5NQNtRdwcAVmK64Hp5dE7yWd4TusJd3DCM1v0B8BOfIKM3hBB4+w1PwVRngkoBVYAzj8hDzACDtbYBYkBc2H7QulZZa09I5CDO1QDguGA7oBvhfPDSN+os+oe3HG0XjN/7gcc0B/xX6PvhS3s4AkDIZJ/4DdiPTsRmov/pUWcPlEA/on2A3iRbJboNYnC7BEryvArhcvkP2gBQ7ehJsDPgGuzbA0XPT67wAAAABJRU5ErkJggg==)}.n-menu[data-v-3daab35e] .n-menu-item .n-menu-item-content:hover .account{background-image:url(data:image/gif;base64,R0lGODlhQABAAPYAAAAAAB4zIxEREQzBOWt3biGbPyx4QDZtRJCQkKCgoFBQUGBgYE9PT7+/v4CAgHBwcNDQ0BAQELCwsK+vr/Dw8P///x8fH8DAwN/f30BAQOHh4TAwMAEEAhk5ITpkRBZKI3qBfBRYJQICAgaxMYuLixqnPZWVlaSkpDeLTERJRR4eHiEuJA2HLALVNg7GPA/QPxJvKQLYNwvUPQTYOAqfL56eniiQQmhoaAPLNADYNhYwHExRTqqqqhyiPRYnGj9URM7OzkZTShO6PENPRhNkJxB5KnaUfnmLfgi/NczMzLm5uQsWDpCYknCpfwmuMgfVOnOgfoWdi36gh+zs7IGBgRa1Pnd3dw7XQBjCQoaGhg0VDxohHEFPRDtaQv39/cnJycTExBwiHS6EQ9TU1EFORNjY2Ghza9HR0c/PzzGuUF9+Z1GRYT17TZmZmSS5STumVliIZB4uIu/v7+Dg4BwgHVyxcWCocmWXcerq6maNcGuieB+tQkRERBwhHra2trOzsyH/C05FVFNDQVBFMi4wAwEAAAAh+QQFDwAAACwAAAAAQABAAAAF/yAgjmRZRsvUYFXVNM9mznRt31nT7nyLLbeg8GbR9Y47jGLIZCooSMoFgqwgTqqEg9FkPnoahIxkeVB5k8hI0qM41N3agueG0xQa9OgSXcZNGzwQYzcRCTwOIht5SFd/IxEsLRB2Qoc7GSQbKT0JjyIOOxSVQ2wtDTMZZy1AfxFQLZlxrzt+WDwWf3Onn7sVEjWrnnGmFbKPsBWkIxbJuU0RSZ8ilxW2JqEtjkwZO8OfCjuJNBY7EF3dLeOfgdo2q13Z1tMiOxc2CJhN8sef9jb8mvha96gcrxoBue3Y9iidFYD6mESbRC8fKxvFnjFhVEHjH0kdbYiKY7HCtzgOz//J8RbHYAuPTVa1ogHyGpNqKuOJWjaipIaCyU4K8VXhwcpan7544zmD6D0a8n7Rq1YBQr8ZFiYIWoYCZFWmTYq1mMAFEIJkFSgQivDgxRFK9EZQbSFlggMEK95WmmsO7J8nVaowFMGnSoOrnzJoDYwEw4NKgAOnmYaHsWUrlTJkeOBglSjEQopEuYDAgQPNpiV4FjWzhAUHaCu0FqKURxhC5MwcacDUUI/ZNuZqAE5EbFXcJTagJX7CMwWjDQvTRU7GM3USETxf8Dskqtoa2XfWoCp02oJkFGCSSTZYLg/m7JLBvYPLRDhxcWcoZzl+BzDsIJWXnwgOGVODSyH11NeZgDT4FBx+IiB4HYMicESQa9JQsxCFNTiEwTs75EJLC9wxKJ1NJJQERG0CcjiCQ6jQ4NAVq0zoYoU7MOXSdubciA9SNNhz30M+yrhhkD6UhGKRI/RIQ2FS5MgkDfDQsEtbO0xJQzE2WCCDJE9pWYI8NjZ5kJgkJGQDLGGiKUJtZYowx3duQsJHe3XmqeeefPbp55+ABipoXCEAACH5BAUPAAEALAAAAABAADkAAAf/gAGCg4SFhmqGiYqLjI2OjYiPkpOUhkGVmIuXi2eVNQGbmaKGnaOmgmaVoZOrp4OlrrGNsLGphZ+yuYW0trqirbq9psKcvsbHusDIo8qMaMu5tL/Q1NWYxNbZ2o7Pstjb4NrShd/g3QHllqfn4Zm4k+nkhM2Y747x2eyS46i7yPSi+G0TSMoXwHbUDrpSOIqgNYGRJOHz5fDRxEH2+q2jdFHfQEoezUnKmOsiJXsmAzI6yBChS10VX8rE5AaLzZn+CAmwiYVHO4ap0vBsg5MRTzhFF+20icAlQxQ8QSRV9IZny2MhDQm1KSBczF5bsUylynNsojU8RZgthKDsWkJsDGyieFuIQwQAdAcFAgAh+QQFDwAGACwAAAAAQAA5AAAG/0CDcEgsGhdG4SrJbDqfxhTUgJxar0QV1qDYepvdLzPBFX+XWbO6WL2GsW81ejg/r+9WKb09JOP/UWx4empxTVpefGaKgGCNSYhKj2KGf4R3lZBml2t1k0WZn0ScbqJOpE6MZpGlrYNeqKZMqppirHKymFa0Vqy3X7ygucNQrH5XwUR8oV7HUMnEZU6/s9EMtUWe0du6srGwr96PKd/SW9RR5UK01NC9T+hb7gYizuvn2Eae0AIDgKTa6GRz0s+frIBbOAxYOElRvHhDRCxkOO8KwiRxfhWYaHDSRSwBOCIwdembr4gcT3DzEmIigo/cqIkkpk5Ty4UgVgphpszATDZrUzhxhKmT1YeJBHQO4TmkBNKVNYtw9KAUC8eqz4ZcxQpvyVasRL9WrSlWKVEUE7laDKHWShAAIfkEBQ8ACAAsCQAeAAYACgAABBgQSQkmOkOGwUHhYCgOHyggHFGhhkVYSAQAIfkEBQ8AAgAsAAAAAEAAOQAAB/+AAoKDhIWGh4JxiIuMjY4CfI+Sk5SDfZUMlZqLmZuINZ6hioSXoaamnZSppqOWrKewkpGuhqCxt4azuIK6oauLpbvCu73DAsHHxpq/t8Woj8iYuK3KhMzVg86y2Ija3InLqrjejOTfmtGU6Z7r59vfyO3G1+7uyLbc9Jr49afmyf3YHaIWUACFMX8QkLjhwE/BcklIVEFCsWLFKs9iHZhosWPFRvpu2fBI8qMjPub+IfoghCQIhSAg8bHyIGYleZQ4drQSoBHOYRxadjRwcyAwTR1IAvDkjCCpQk4JsezYU1jUShE8VpP3U1BHG1YnrUonlOINY1crhbDooFovcvFNCLF9OInFxbQB11l0p9LQJRh7C4YsZBFBvb7F7tI9OmityYeDvQY+XMnigcWSFGN2NHnzQEWdH+KVTHGzSp2bRwvo8dgzoxAwRLhuFAgAIfkEBQ8AAgAsAAAAAEAAOQAAB/+AAoKDhIWGg3OENwGHjY6PkIZDkYmRlpeNdJgCcwqbn5AKcoejEKBUoJdmhYmMhHRmpphyqKmWtKGVl3Ketq+EEK6ftQG6vo66sraTg8LHhbUCo8+HQ8rP0wLMoNm9kJrU4Y7Xz9up2Y502eCpxuWO0aDm74Lxhezkkdv2oM6P+ZeieRNnaR4kgQQPDjIY8Bk7hYIYOpKYiiK0hbYAJjz00JKujp8+3tqIaZvGcA9BXjrJCuMxlvAGoXvkDpM6casK+spJchA/ghAsCuh40hjMjYzQyXF2o9FRW3Mk6KlD1c6Emk8FZC05AUuLr2DDujDSAE/FcCJsiF3Lts6dMITvRPUc1IOt3btERCwcYoZKPl6piNjFQvUIlSFD8tghfLcDRyozP4lw0TZSnDte1/aMwLbHpw+ZwQZLFxnSB7Z6QQEQQ/mrNH+vrsEmJFis42McMgta+k+mow5rUz8DUFemSkE3H3EQ6zlhkWwsB4LEEdZOzwClPxWpPldb3HS/BE0GW6e7oZqNotX9imX2Rl0/kSMaFNaIeZecesvfzv5+o4GQhEWCf/g9Mk9Y7s2F3j20gYUFgf9ZQl1/EEa0yRxhVXjIUXIgqKEgW5mR4Yc2MTLih9EkSB9YJAqAUIAsksiTioLsEWOLmxDBAo6fBAIAIfkEBQ8AAAAsAAAAAEAAOQAAB/+AAIKDhIWFAoaCDx2JjY6PkIZkkZSVlolhl5qbnJuIgg4KnZAPiYyEYaWGn40OrKOOrrCzj6eDto+vAA6CuLSHwJ2Tt7+FvIO6v8O0r8uXyauFmcXU1YXOsNAA04LcldrWhMec2MXjhtxAmsvnnL7h7eGQ5Y/j9PL2nfGa3vWD940AbhIo7t+zQerkPep3iWEnhwrJRURFkVPCiYYuXjoH7hdETqomhhTUkdO+YkAIMkwGraQwUzBJLngh40qMK4RcWjRh80WVKicavRpws2gMZNZ4Gl1a1ESZRj2NEiJoqccMpliXVsHlgmm0UVWyisVKQxCHEAd+PADBIxHVRDDRxlaxEorMg7BRmcLAdPISTaYD3knDq1foqA5YN8VlysKRYEghEneyurRxo36PBbFgGmJWhLwx9hrO2Sjy0mIiiBrN/JGQVms0rhbVuc1QzaJV5C2+OfLSZtwRxRgF6M3bUtqTi4KoNG7EaowiovZ1aJQKRkEeelrK9Psm8llWbmqSev2fzXmFnpdXdBSANm/dca5nP/7mgPmCyLSvZFQMfkHtaeSIevjJR8kD5P3nAiVhMJIgfj0QA8mD81lh0IRF/aeIhI8QpqF7mrBQ1oeaBAIAIfkEBQ8AAgAsAAAAAEAAOQAAB/+AAoKDhIWFWoaDOomMjY6PhlyQk5SViVuWmZqbmogCCZyhi4SYl4+eoaepq46jipOoha6shrECtpaSr4agtLe+hLqsscKWuLWywMrLg8Wpx7+7ldDMtM7VyYIQmdei2N/cnN3gAuPk0bnpvuaN7Mja5++bpcPxoe6+9OiZ2/aD/c/A6evlb1UCagUpQXCnTxCuYwiXzZKmpcSVGTkygvHisNoXBxcH1WAU60XGkydrRNSUBSPKlzEufmEE86UHX1Vi1twZQ9AHQi14nlzpCIvQoydHcBDQgYUNDw+sILj4El8iFjprVonKhcuNnC5rsrh0g2rGTWFfQgpgtCYNkji6Tmb6kDVpJqwwRzACAAOjpb4wl2oSARalXkYdrpB6BJNV4pdjSR5q1NhXXJQ/JUNSu2zES6L7BAWVW40GZ02mT2L5ZvHkTc0dB30GZ5K0JRcoJzLjENZKo4aiTzqIZ0A4JUypM4JmZXaHJeP2uuik0q5Q7oJmoTW07a/wa8aqE0rPeIMSd38oJ6VPKCAsgM3n7dXOIfjSovUJC2d2hLK+vweuwXcWe+1lpFsi8cWjBQk5PEDgYB+8B0kgACH5BAUtAAEALAAAAABAADkAAAf/gAGCg4SFhUuGiYqLjI2MP46RkpOJPpQBO5eai5maTIeCNSCdm5efhZaJiIsgq6WNrY+apK+vroIgjqe2oKWQjTW1uYO3tYS/xgG3yJTLqqjJ0dKOzLXFg6mC2ZLX0bSFwwG7ktW1pOGG2UCXyOjG49Ph39OGu+WM8vT4g/eR7prb9gnqpwgZvFmDDhLKN8nVuloKGwWkNLFUxWgR2elTtO2io4eU5l0CSQldt1DJtgXbaEjkphonX/2bBoSgNkPXusU0pyijMidPYuQYKoUYywZNZCh1ISSKoltKh0olunNWk0ZSlYij9MRGNA5IpoodO9UFEUJkx3ao5SKt27SI/0I46WHgxpGkYw2UyqFIRtNRP6C0ZUSjElCxPThMUmwohwtHHdqSRcIxqlQhjBuFmHyJhtCxizyXzayoyDSwYymXnjHVCYDQY2Ek+3x5UeSpZxPJLkT6FQfWuG1bfpJT7GN6qo0WtMyicVmWh6UywjuUdHTHLAUJmaq3stQPg35PrWps+PTagnBk9ydcuiEo6wnZmHp+qKXr5KVZDrKIenqpV8V3DH3LESUgVlKd5ENUPIiG3YGEbDdUd4ngxUML6EFoyHGJRDFUEvJpmIgMi1wowxQi9uVeXwGm6NxQMemwlosbSpUbNzRCIZUHjsRAYyFBPRGJhHzRuERSQkhCgwlrPwbAgWmRBAIAOw==)}.n-menu[data-v-3daab35e] .n-menu-item .n-menu-item-content .domain{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADYAAAA2BAMAAAB+a3fuAAAABGdBTUEAALGPC/xhBQAAAAFzUkdCAK7OHOkAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAAnUExURUdwTLCwsKGhoebm5s/Pz7u7u+bm5u/v7/n5+dnZ2eDg4MbGxpmZmRaeVDkAAAAMdFJOUwDD6T95qkAoEGBQkAHyQfIAAAHQSURBVDjLtdS9S/NQFAbw05iYNDpEcBE6iAjKS4YXivt1EFQyZNBFMnTq1OHi3KGK29uhr3MHFVzEoYsg4tBckn75/FHexNR+3UgXn+mSX2nOOb09RMvFKpfLDaWYhy4AsckX6SaRJOJ4nv6NSeLrLOkTktiaqaKE6YTTFV1iNnsTKmI+k29tL9jwuzMsZtzltcL2MwsUFmf2f2MxW/RrMcuqpE1YqjJloY2c7sYdBjkWqwc2HttKrv2lVYhHhIeIH06AF4j7PwE2XbwBFWmRhZ6NwRoFMblDk9XB20KWkZh8sk1w9IY3oqBv+ZqgZkjvqcnP+BR0jLvagJ67tlP4oEJEpdTAvRb3mMaaDjUdfaCPLH1EX+9Dq9bo1Ct1R2NPhl/o2V3D7K9m1rmivkbtrsHPdbYemX6Tb+uZOUU7KsoyirRjVmohsTZrGZl1yQgtKkVyRpw8UFKblllPnrgle1kDk31xcgdUz+yDamC27KUAh9zkOEyubGo4cbF7D1wEiA+A3VuIUzcxcnNGLeTv5+VYJM3IMT+9ukr6xcv7YzxlA+pVML0MzPnZCL7UDpn/v8zsHrLzd9bUGlQtwptSLslij9LdesbVM6hWq8uO6xPhZCDIp3zh1AAAAABJRU5ErkJggg==)}.n-menu[data-v-3daab35e] .n-menu-item .n-menu-item-content--selected .domain{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADMAAAA0BAMAAADVih2hAAAABGdBTUEAALGPC/xhBQAAAAFzUkdCAK7OHOkAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAAwUExURUdwTP////////////////////////7+/v////////////7+/v////////7+/v///9/Gv7EAAAAPdFJOUwA/w4UQ8GDgMFBwsCCgr3PLWGMAAAHaSURBVDjLtdS/i9NgGAfwby655K5pbQOOwhUVbkwG5cZGV9E7KIjokGyOF3S6W+zi4tIiiINgRPA4RdBNHUQPNx3s6tQT/AM0MbXUnl/TNHf9kTfd7ss7JPkMeZ6X932AcS4YxkmI8nmVcW69zICyxjS37Rk5z6PUp+0ZJ3J1Ui5yKmfHsuRMU9Q4ok3OpHsoKjNxU2pmqZcW7mQpGjWgU5DXo1+dFsTFsWTPEOTUUK5QmB/irtLOTjAn+/iaRz+xMo+2Ojxj8lt9k2GHW6uPGKwx9BOy1lnxaVs62xrdT0UOVG6UEtrXIpQDnJPZKrFxGY6nsCon5OkH0EO8k2gvE/dhWvFaSGggd4uFPupKgHjV7ForXuWEutJvufhrKcD2cus9zIqPdvPjSkKhUi03PJV4W2q/AK0vykDDq4QCuL7lxhW4mrcnsVpQ+yo+jFoGOlV7gU/Q7KEQf9L/As6IKnAGWI+PQy2MD0oPi7SL6UZZEkP49GAG0JJHV02pf5PRc5P/HpPfO4x2HF5/OKTFvO3dgJxHVlydWA6GJ9QUSXBMZ3ROZGHlwls+ec/vztK18XC4My1/xsMBl3JHCvAgdxDNG19Qnh7Ktp3p7t6bIdzYFbYuGUZl4vU/Sd6bbwAFS00AAAAASUVORK5CYII=)}.n-menu[data-v-3daab35e] .n-menu-item .n-menu-item-content:hover .domain{background-image:url(data:image/gif;base64,R0lGODlhIAAgAPcBAAHUNiu7TwLUNxtUKbPBt4qylLfEusfHxy24T/f39xtHJv7+/oODg0pdTg6cMgLNNQuqM4zBmZO/ngXTOHNzcxhzL4qylY/CnIqpkou3lwLUNt/f3/X19aKqpIeQiYiYjIaLh9HR0SDHSgHTNRPNQRPMQbjIvOLi4kVpTjiWTwSyLwnROwPTNzrKXh7OSgSpLhjPRUVzUeDm4hPQQtri3N3m39zk3uXn5gO5Mdnd2rXIutjb2dvj3QjROjWhUAkPCvv7+w7QPwYLB4qnkQEDAR0dHRzIR37DjwyoMwPJNYarkAQJBhgaGSLDSoTDlFBQUBN3LBVvLAwSDh0yIhxBJQ4UEAACAR1kLxtOKBtaKyu8Tx0mIAXTOZi4oLC0scnJyQa+NIK3j4DEkd3d3bzFvrG6s7nJvSjATX7AjjOwUktcT5G9nA6eMmdnZ+rq6i61UCLGSwrQPBnKRc3NzRxoLyi/TcbGxhR+L19fX0F2TkCAUDuMTwbSOUtjUVJSUlhYWAIGA9ra2gABACXNTxk8Ijq6WgWiLBlGJCvNVDzGXgLKNBlnLRgmGxhgKhk1IBUbFxgtHgsRDAHNNDXMWg2ILECCUQO+MjjLXQLGMzzCXTm1V4u+mDvIXk9bUjajUQuQLIu7mHl5eR05JObm5omkkAECAQPUN8DEwR0qIBw6JL7Fv3JycrrEvU9UULbLvLTGuATTOC3CUiTITbC3sjiYUBSALyrFUDC5UjG1UmlpaTSpUYLEk////8XFxaurq1FRURYZFx8qIvn5+f39/U5UTwsRDQIFA/Hx8aWpphxfLe7u7vz8/BwcHL/DwNzc3BIXExOJMLG4s1NTU4WFhQ4UDwbANNTU1H9/f9fX1x8fH62trYqNim9vb5qun9PT01tbW1paWhQYFWNjY1lZWbXDuKysrGpqarG1shsbG7zDvq+vr3x8fIuYjpavnOHh4YqQjJiunuPj43Z2dkJwTszMzMrKyp2toSuzTdnZ2TuFTWVlZWxsbDCnTc7Ozii5TGFhYSH/C05FVFNDQVBFMi4wAwEAAAAh+QQFCgABACwAAAAAIAAgAAAI/wADCBxIMMAPUQqSVaAzb4ACZqUKSpxokN8KPqYEANiYMU6TBhEpSgwHLQ7HkyhX1EkmcqAxUSRSyjx571nLfBhn6hTQRNTEUnc67tTZpIhEmEOTEihWUJyFp1CjSp0a1WfLq1izah15zZfXr2DDihX7x1gxZ7zSql3Ltq3bYW3GDXtLt67aUGnPHeOlDFvaOcqaqbX2d1QzN4V5hQiUFm8BCOR4/cmW9oe8Utp4rQuAOJhnbprPCnvmpzEveAAKKGMSoF6zANOC/eFltAOvJdJkDyOG2Vmxb6ZPABDR7yCebsbole1l9l+0AMhyjxZFrJmxbaYXlNDQDfpvYPHeGajTl61bMAoBliHXJiTQD3bQsxMAkM0cvlLPgnGIhp/YMWDMiMJXALp5xll2x/CRHG0B/DJgfH8EYE5awcAmGYF3qTXEPgkoVl1joCkmih15+edhOmoJaNeKbYVgIYswulEhgb/UaOONOOaYIzpb9ejjjwMNcFFSMxWwBEUVjEBkSkWJBEhJS3LkDzVYJVNNlHRsVYqQDwiFUhN0hNQjfggl01BDDxnTUkAAIfkEBQoAAwAsAwAAABkAIAAAB2qAA4KDhIR5hYiIPj0TE4SNAwGJk5QDPZQllYlvho6amgKflJJxoqanqKmqq6ytrq+CbnV3rQFzExW1BQC5k3iVcpEPe4htpwAIdq2MB68UsNDR0tOrpdSmApKuCK7Bn5CDjRNwqnQDh5SBACH5BAUKAA8ALAcADgADAAcAAAQO0K0HCEUsiFGAMl5yNBEAIfkEBQoAAgAsBwAOAAUABwAABhpAgcAEEQkLgIIw8AgJSaXTMzUEjFBCAVYQBAAh+QQFCgAFACwCAAcAHAAUAAAGTMBCIUIsGo9Io3DJbDqf0Kh0Sq1ar9hsNhKFBLCSIZObEUw4Wm4zIAhXPdKLplLoMO3Mz1MtJAAGWk8bD4BQIGAUgYqLjI2Oj5AWQkEAIfkEBQoAAgAsDgAOAAMABwAACBkABbz5MUrDjwgARJHoQQoAnIIBBIRyIyAgACH5BAUKAAIALAAAAAAgACAAAAiNAAUIHEhQYKqCCBMqJBhngqmHAEwtnEix4sSDFgdKzMhRoESMCTd2pAhypEaTHEuiXMmypcuXMDueUjgTJgQTAlDp7CjS40YAEQaicvkzAMGhOQXUnNhzoJEJq2IOlAAgqcGrLOOUEloQqUlVKgmy4iq1LEKkXs2qXRuzKUy3bFvC5QgxIkSXYVOlTRgQACH5BAUKAAEALAAAAAAgACAAAAfxgAGCg4QBQlNUV1BRAVhURVaFkpODPVxchJgBWmqRlJ+gg2dXoYZUJKWSVaGaqYRnU5NEUK6UWpNTPbWfUpJOv8DBwsPBVLvHyLtLyaBEvczQ0YJe0pNiSIJNbAFm2Ei3AUhm4Sqrgs++AUeE62EBrUdjAEax5/bWokmb6tlHAOtbBNVbNslIkltBUK15J+jSCCCGIgqZ9kmMIB+vurxLM6heQFBmDBTSB+6fwEIfCymhNISQmi+UyHSsRjOVxyc4c+rcyXNnACY1g+7CoouZO0q0kq0Teg9UFjC1SLmy8jRJq0qbrnhSJgWRIkZUHoUKBAAh+QQFCgABACwCAAAAHgAgAAAIwwADCBxIsGCMgggTEtS1gg8sDQI1PAwSq49ChUEuDlxhS+NGjwU14NLIByRCkRhNKox1UiXGVy5jypxJs6bNmwRz4dxpclcAmLIEugogh2iAkUMFIokF5IhHWD83Qi0oR9aKBCxTCryV1dZUo1sBuEoSoFXLoLEgEiTBsaRAJQCsKoR5dCCtqGAJqgAA4GJJV0ktDmSZcWCtuCoPJhT8M8YGnpBltppMubLly5cjayZZUy3kr5BvfS4xc2LEiUF3KgYZEAAh+QQFCgABACwAAAAAIAAgAAAI/wADCBxIMMAPR4cWDRxwiBGRghAjGvQkkAWAinwCrGjRSZDEiIwofSyIqNFIgYAIwThZEEChk5VYRmSBiNBHFjIlJnoE0VHOmwYLVopAtKjRo0iN2vzJtKlTIU6jSiXY5s/Uq1cjGBLoYmuAF10TBSjk9cXXTAG0XogoYaxGgRHSWnzbgusggZcAuAgKEUbcAINaKAJMEy+ntC81AgAAaqZeRZNwrryw+C0MSWkBE/40UtNfkm01fxUYAgZnlhkrul2ReSAiIC0+QYo4RCIGloH6EFyKtbfM2QEg+RlOvLjx48d5+l7OHLWF5hp3jhTZNPHJRpZk6lWY06MlSRYvKg7mushj04cITQps6HBkQAAh+QQFHgABACwBAAsAHgAKAAAGOMBcYEgsGo/IpHLJbN6Su6aU+MLVpDIiD7qCDbNTZYTVWs7AxVnSBZCEmTMAgOacAlRv5ZUW0w2DADs=)}.n-menu[data-v-3daab35e] .n-menu-item .n-menu-item-content .terminal{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAMBJREFUeNpiYKAQMM6cOVMASBuQozk9Pf0AC5AuAOJ6cgwAWt7IhMQvRKIfAPEEYgxhQWL3o9EFpBgwAeifQhKdD7YI5oWPUMEEmAQR4COyATBwAIgdgIacB2IFYkxhQouWB0BsCA3E86QGIsxvDSBXgGIDSxr5ALTgAk4XADWAQt4fiB2BChcAaQVoGoHheLwuAGqagBz/UNsciQ4DEgE/zAUfQM4DOt+eRANAYTMRZADIrxfIdMUFSnMzA0CAAQD0hjqnYxWD2gAAAABJRU5ErkJggg==)}.n-menu[data-v-3daab35e] .n-menu-item .n-menu-item-content--selected .terminal{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAALhJREFUeNpiYKAQMH78+FEASBuQo5mfn/8AC5AuAOJ6cgwAWt7IhMQvRKIfAPEEYgxhQWL3o9EFpBgwAeifQhKdD7YI5oWPUMEEmAQxZiAbAAMHgNgBaMh5IFYgxhQmtGh5AMSG0EA8T2ogwvzWAHIFKDawpJEPQAsu4DQAqAEU8v5A7AhSCOQboKWRC1CM3QCgpgnI8Q+1zZHoMCA1JcNc8AHkTKBz7Uk0AOS9iRRlJvTwIAsABBgAqiNCt+zqQrsAAAAASUVORK5CYII=)}.n-menu[data-v-3daab35e] .n-menu-item .n-menu-item-content:hover .terminal{background-image:url(data:image/gif;base64,R0lGODlhEAAQAMQXAJ6ipUFITySRPIiMkDFRQuXm5jJKQy1kQCGeOzBXQSl3PiWLPVhfZSxrQCpxP9na2yeEPTREQ8LExmRqb5OXm/Hx8TU9RAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH/C05FVFNDQVBFMi4wAwEAAAAh/wtYTVAgRGF0YVhNUDw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuNi1jMTQ1IDc5LjE2MzQ5OSwgMjAxOC8wOC8xMy0xNjo0MDoyMiAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENDIDIwMTkgKFdpbmRvd3MpIiB4bXBNTTpJbnN0YW5jZUlEPSJ4bXAuaWlkOjMyQjYwMTU3OTA2QTExRUJCN0NFQUUwQjRDMzM4RDJDIiB4bXBNTTpEb2N1bWVudElEPSJ4bXAuZGlkOjMyQjYwMTU4OTA2QTExRUJCN0NFQUUwQjRDMzM4RDJDIj4gPHhtcE1NOkRlcml2ZWRGcm9tIHN0UmVmOmluc3RhbmNlSUQ9InhtcC5paWQ6MzJCNjAxNTU5MDZBMTFFQkI3Q0VBRTBCNEMzMzhEMkMiIHN0UmVmOmRvY3VtZW50SUQ9InhtcC5kaWQ6MzJCNjAxNTY5MDZBMTFFQkI3Q0VBRTBCNEMzMzhEMkMiLz4gPC9yZGY6RGVzY3JpcHRpb24+IDwvcmRmOlJERj4gPC94OnhtcG1ldGE+IDw/eHBhY2tldCBlbmQ9InIiPz4B//79/Pv6+fj39vX08/Lx8O/u7ezr6uno5+bl5OPi4eDf3t3c29rZ2NfW1dTT0tHQz87NzMvKycjHxsXEw8LBwL++vby7urm4t7a1tLOysbCvrq2sq6qpqKempaSjoqGgn56dnJuamZiXlpWUk5KRkI+OjYyLiomIh4aFhIOCgYB/fn18e3p5eHd2dXRzcnFwb25tbGtqaWhnZmVkY2JhYF9eXVxbWllYV1ZVVFNSUVBPTk1MS0pJSEdGRURDQkFAPz49PDs6OTg3NjU0MzIxMC8uLSwrKikoJyYlJCMiISAfHh0cGxoZGBcWFRQTEhEQDw4NDAsKCQgHBgUEAwIBAAAh+QQFMgAXACwAAAAAEAAQAAAFU6AljmRpBVOqrqtFVXAsy9Q7VMMDzHHN/5UawGQC1CiWg4IoOiINAoGB6BxBENSjyIE4oFKMprYhIFgYkvTQpWWOqm6RcVBI2+/2AuXL6k8CcSYhACH5BAUyABcALAcACQAFAAIAAAUIYJSMBLGcSggAIfkEBTIAFwAsBwAJAAUAAgAABQhgMI0MI51ACAAh+QQFMgAXACwHAAkABQACAAAFCGCUjASxnEoIADs=)}.n-menu[data-v-3daab35e] .n-menu-item .n-menu-item-content .cron{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAKwwAACsMBNCkkqwAAABx0RVh0U29mdHdhcmUAQWRvYmUgRmlyZXdvcmtzIENTNui8sowAAAFrSURBVDiNpZMxSFxBEIa/ed49tQsBQdEqgrVgithFW1sr62PhKttXpjy0vWb2WjkQrk6rjWUgjY3ICorYGCFV9C7vxuJ24fE4Y8SBZf/9d3b2n/1ZMTPeE1l10ev1Frz3Wy8lq+pXVf1Y5cTM6Ha7jTzPd4BtYBUYAHO184/ALnAJnJRl+b3dbo8aAM1m8xB4AO6BT2b2C5ivFxCRv8AtsJ5l2SZQYGao6kBVFyNeNjOmDVVdifOSqh6Z2aQF7/0xcGNmF4BMkV9tw0RkDfjgnGs14kYJXInIOTALjGOhukUZ8AQ0gc+JIJI/nHNnIYRWCME5505CCC7i04hbzrkz4Gc8Q1IwEwedTmcvXfcSruZnNZKiKPpFUfT/hZnYX1YVyGu31hRk6X2SgnEi/lPBb6JTSUFuZsM3KPiTWk4FbkXki/d+CORMbK3aKEzsTXhDRK6rBb4B+2bWAkbVN5kSDRG5E5EDiJ/pPfEM08DH4VH64rEAAAAASUVORK5CYII=)}.n-menu[data-v-3daab35e] .n-menu-item .n-menu-item-content--selected .cron{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAKnAAACpwB9NLfEgAAABx0RVh0U29mdHdhcmUAQWRvYmUgRmlyZXdvcmtzIENTNui8sowAAAEPSURBVDiNpdO9SkNBEIbh58RoFKwEwT8QFOwEQQvt1NbW+7Cx8B7svAZLa1tbG0sbEQQh2KigjcZoxsI9YT2EGMnCMt8us+98s8sWEWGYUausp7HTJ38bU/lGPYt72MUyFjFeOfyOfdziAudol4BjPOMRS3jCRA/AJ5pYwxaORISIOIuImaTnU+w1F1KcjYjTiOi28IVD3KDoYT93EVhJ+hfgDtdooJNA1SeqoYVRbOSAFq5wmR0q+mhYzQEjaeYJ/XQ3v1bZlCrFH7rw03bXwSBVc10rYaWDzgBVc/0ivVTpYAwf/3DwJrVcAprYTJCx1F/15huZXsc9FOk3TuIAc2hXqlVHHQ84wWsx7Hf+BgvadUGnT3fcAAAAAElFTkSuQmCC)}.n-menu[data-v-3daab35e] .n-menu-item .n-menu-item-content:hover .cron{background-image:url(data:image/gif;base64,R0lGODlhEAAQANUAANPT09HR0c3NzcvLy8nJycfHx8XFxcPDw8HBwb+/v729vbu7u7m5ubW1tbOzs7Gxsa2trampqaenp6WlpaOjo6GhoQDZNpubm5WVlY+Pj42NjYuLi4mJiYeHh4WFhYODg35+fnZ2dnR0dHJycnBwcGZmZgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH/C05FVFNDQVBFMi4wAwEAAAAh+QQFCgAlACwAAAEADwAOAAAGesCSUKQRGkua0RGjAFQm0EkFoMAIFY9HAHPpXjABiINREohKoaMwHSKUBgvKJEKvTygLw1vCyWj+gBkcEnoGHCUWFmpCHAglBYeLRhsHjxuSRhqOBJeYSI4FnZgeegMdniUgBSULER8dHrCxG7QRDUIPCQq7vLsJDyVBACH5BAUKACUALAcABwACAAEAAAYEQIslCAAh+QQFCgAlACwKAAcAAgABAAAGBECLJQgAIfkEBQoAJQAsBAAJAAIAAQAABgRAiyUIACH5BAUKACUALAcACQACAAEAAAYEQIslCAAh+QQFCgAlACwKAAkAAgABAAAGBECLJQgAIfkEBQoAJQAsBAALAAIAAQAABgRAiyUIACH5BAUKACUALAcACwACAAEAAAYEQIslCAAh+QQFCgAlACwKAAsAAgABAAAGBECLJQgAIfkECTIAJQAsAAABAA8ADgAABhTAknBILBqPyKRyyWw6n9CodEoNAgA7)}.n-menu[data-v-3daab35e] .n-menu-item .n-menu-item-content .app{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAABx0RVh0U29mdHdhcmUAQWRvYmUgRmlyZXdvcmtzIENTNui8sowAAAF7SURBVDiNrdPPi41hFAfwz72uoVsUWZOFJbKThYkVe1mpx13YjcmU/NwrZCKRLNRZsrSZErvJ1h+glFgiYxC6Pyze8zSvOwsLzuZ5T9/n/T7n+z3ndCaTiX+JHkTELlzHHozQxQrOl1JeRcReLGIbxtiAN7jcS6JrCT5OcIx9mMcAZ/EBz5N8hCO4UQl240kp5XYtLSJmsZDpdjwspTxr4V9xppv5EP0peVuzEnlumcL7GFaCDn5OXfj+l/wHulXCBIci4rXG2BFmMZP4RhyLiBmNR0McxqgSLGBOY1iNIW7l96LGyNMtfBXznf81B/vzhR0pB37hbillOSIO4hw2JdbBJ9yrEu7gIx7504OLWMYFvMcLax6cwv1K0MPLUsrTWlr2eS7TEZZKKUstfCcGtY3jVnk1+i05E+vnZDPGlaBnfZ+/aMZWnqtT+Df0qoR3ON7qc92FlcQ/YxARB6ztwlG8rQRXNdt4Mn/u5AuXEn+AmziRcroaU6/8BgTXdRpxDzi5AAAAAElFTkSuQmCC)}.n-menu[data-v-3daab35e] .n-menu-item .n-menu-item-content--selected .app{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAKnAAACpwB9NLfEgAAABx0RVh0U29mdHdhcmUAQWRvYmUgRmlyZXdvcmtzIENTNui8sowAAAFsSURBVDiNrdO/jw1RFAfwz4xnVzYIydZeY0tEKETChkIoNGrNtkKyhQL/gUg0YgudQiciGpVEIRsdPdlkQ0usH4vNvHcUc27e9bbkm9zMmfnOPfP9nvneJiL8CwZ5PYS72I8xdmANN/EeQ9zGAkZosYHrTSp4gD14m+QIZ/ATl/AI83iRzcc4jC0RISIeR8S5rMu6EhFvsl6NiOUpfjEinrZpYZwKasyhy7rL+xp7MW6rB5tTL/xKO9Dg9xS/WQ9xJ85jJj12OJ2zgMBJvMs9IyxipgzxFK5lo4JvWMFrHMNV7Kv4DivN/8rBkVQwn3JhC/fwCiewjNnkGnzG/aLgJT7h4ZTHBVzEE3w0yUGHyxgWBQOs4lml7rvet2z4PFfBASzVOZj1N+YqO2F7DnapcjCwPQdfTXLQ6v9KjR8YFAsfcMEkByXrG8l/wRKOmpyVs1gvQzyoP23D3NzkF27oc3Acd7A77bT6od76A2AskgeNVoIQAAAAAElFTkSuQmCC)}.n-menu[data-v-3daab35e] .n-menu-item .n-menu-item-content:hover .app{background-image:url(data:image/gif;base64,R0lGODlhEAAQAOYAAOPj4+Hh4d/f393d3dvb29nZ2dfX19XV1dPT09HR0c/Pz83NzcvLy8nJycfHx8XFxcPDw7+/v729vbu7u6+vr62traurq6mpqaenp6WlpZmZmZeXl5WVlRTDQBTDPpOTkxLDPhbBQBi/QBTBQBq9Qha/QJGRkRi9Qhi9QI+Pjxq7Qhy5RB63RBy5QiC1RiC1RI2NjSKzRiSxRouLiyKxRiavSCitSCSvSImJiSatSCypSiirSCynSoWFhYODg4GBgTadUDadTjabUDSdTjibUDiZUDyXUn5+fjqXUjyVUnx8fHh4eESLVkaLVkaJWEaJVkqHWEiHWEqFWE6DWkyDWk6BWlB+WlB8XFJ8XFJ6XFR6XlR4Xlh2Xlp0YGZmZgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH/C05FVFNDQVBFMi4wAwEAAAAh+QQFHgBeACwAAAEAEAAPAAAHtoBeXTEdIR0qWF4/BgECAQtKXjIrQkBAMjVeEAwVFBUHCl4iRV6lUy5eCyalXhgAXidArE6oCxqsFQGiRKxStR+sGLonLk5MTTwsXgoSHBscCwJeWDUu1jFUXjMLCt0OOKzh4uI+DwndDDNeOAzdCQ89XgUKzhwTCcsR9dFeAxasKUItAFZKmBcCFFhxEHirVK5+F1jBwKeKVYZXDA50qtDAgZcHnDwdwKdEQaMABcD1KHAywZFAACH5BAUeAF4ALAAAAQAQAAcAAAdhgF5LDAECAQY+XloqHSEdMVxeDQcVFBUND147MkBAQisuXgMXXqUwCV4uUKVeRh1eBBSsHApeMUysRK8EFqwptTGrpa6wChwbHBMIqTxNTE4xIV49DwrWCzBeUzEu3TVWgQAh+QQFHgBeACwJAAEABwAPAAAHWIA/BgECAQtKEAwVFBUHCgsmXpIYAAsakl4Vhh+YGAEKEhwbHAsCMwsKqQ44mK1WMS6xNlguOk1MTjEhMVCYRh0xTJhEHS69kkkdNjJAQEIrLlckHSHFWoEAIfkECR4AXgAsAAABABAADwAAB3CAXoKDhIWGh4iJiouMjY6PiVg2LpQxVV44DAoKCQ89XiQuTkxNPCxeChEcGxwLAl4iRINSLl4LH4MYAV4nQINOtQsagxW7IkWDU8EmgxkAXjErQkBAMjVeDwwVFBUHCV5cLh0hHSRWXj0FAQIBCUeBADs=)}.n-menu[data-v-3daab35e] .n-menu-item .n-menu-item-content .settings{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAABx0RVh0U29mdHdhcmUAQWRvYmUgRmlyZXdvcmtzIENTNui8sowAAAH3SURBVDiNpZI/SJZhFMV/90kicsv+EdEQRUNQYC1S0R+ag2hxMKPgvc/r0Ba2FFEpJARhiF/P9QsaGippimgoG4QgI6egICcJEkoIEyI/9L0NvV98llLQmS6c5x7OPc8Rd+d/0LQcUa1W1xZFcR9ocvfOGOPkXwXMbDvQoqov3b0NuA00i8gBYNLM9gBfVXWiviP1E8xsB3AZmANmgHVAt4jMu/sl4DuwFfgI9KvqO4DQYKAFmFXVU8Bj4JqqfsiybAroBZ6r6jFglbtv+MNB6aIHeKKqL4aGhra4eycQRORelmXvU0pHgPYYoy4SSCltFJGDwEngCjANXHT3WyGEeXfvAq4Dze7eKyJ3i6IYyfN8KgCIyAjQDFxQ1VfAaaA/xjiWZdm4iPQBHao6LiLdwJoQwsiiX3D3z0VR1NNd4e5zDfnUACnnWeATsNB4wjYR2Q8cdfcbIYSau58D+kRkwd273X1QRGaAAWC4KIrRPM8nfg/xqrs/jTGOmtlOoKN08zDGOGZm+0SkPcuys7+W3J3Sxd6U0s1ybk0ptda5SqWyOqW0u+QepJTa6lxjD2rASjO7A5wBBszsEEAI4TzQZWaDwBfg23I92AWsV9VnZnYC2OTur0Vks6oOm9lhYFpV3ywp0IiySI/42bzjMca3S71bVuBf8QODpRL9eTmkdgAAAABJRU5ErkJggg==)}.n-menu[data-v-3daab35e] .n-menu-item .n-menu-item-content--selected .settings{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAKnAAACpwB9NLfEgAAABx0RVh0U29mdHdhcmUAQWRvYmUgRmlyZXdvcmtzIENTNui8sowAAAF0SURBVDiNpdJNiM5RGAXw38ukkJVvMYqZRsqYZmyYDTZWbCxsKLG3pCSaWNmNJU2NmhU7pQjFRhYsJCTWykfJRz5eH8fmefn39lLy1FPn3nPv7Zzz3FYS/1Oz/sItwg3cwuo/HWp1KRjEQtzBTizAfHzCDMbwDk97PTCECXzBWyzGYXzDCXzGGjzHJB6DJJ3ekuRc4R1JNja4VUl2FZ5OsrXDNTO4jRcYx1W8wTEcx1xcwna0cbM7xGXYgxF8LakTuIbLZWVdWevHXixvWniY5ECSkVqfbGBJBpOcKjyc5FCSR90WXjXSnV1hdqqNVuH3eInvTQUDSfYnmUkylmRDkvNJ1icZSjJV+wNJriQ5WKr01avPqtfW3O/hNPaVmrO1N14qp35pa/jclORM4dHqDjevMdYLSTZ3uD6/q405mMYHjOJojewIluJHjfdj51L3Vx7GElzHbqzAXazERWzDazzoZaG7+5PcT/Kkwux5rlvBP9dPgIpDWf6ENxgAAAAASUVORK5CYII=)}.n-menu[data-v-3daab35e] .n-menu-item .n-menu-item-content:hover .settings{background-image:url(data:image/gif;base64,R0lGODlhEAAQAOYAAMfHx8XFxbm5ube3t7W1tbOzs7GxsQbROGqpeg7JPBDHPpWVlRLFPmylemCnchTDQBbBQFqnbBTBQFSpaBi/QEqrYpGRkRq9QlinbBa/QI+RkRi9QBi9Qh65RI+Pjxq7QkqpYhy5RIuPjRy5Qh63RCC1RIePiSKzRiSxRn6Rg4uLiyKxRiavSCitSCSvSImJiSqrSiatSIeHhyypSiirSCqpSiynSoWFhS6lTHyJfjCjTHyHfjKhTDKhToODgzSfTmaNcIGBgTadTjKfTjabUDSdTjqZUDiZUH5+fjyXUjqXUDqXUj6VUjyVUj6TVHx8fD6TUkCRVEKPVHp6ekKNVnJ8dECPVESNVkaLVkSLVnh4eEiJWEaJVkaJWEiHWEqHWHZ2dkyFWkqFWE6DWkyDWk6BWlB+XFB+WlB8XFJ8XFR6XlR6XFJ6XGR0aFR4XlZ4Xlp0YFh2XlZ2XlxyYFh0YFpyYFxwYlxwYF5uYmZmZgAAAAAAAAAAAAAAAAAAAAAAACH/C05FVFNDQVBFMi4wAwEAAAAh+QQJDwB5ACwAAAEADwAOAAAHpoB5goN4Hxdwg4l5b2Z5W1JMUnlpb4lvJywzKHBzMDYkMJWCZS15Fj6CWgt5LGSJOi95WgYFSHkeNINzVCQyUwEyNwFINyFSc3kKTml5BKh5TwR5akYKyVuCA7Z5UwN5cFIMeXFRKDdBAEhIATdPIU6ieTwqeUEDAjJ5LzOJZvw3NwahOlFmkBoYmSi46gGjITODYfJgUVLmSh4yahQNgsMgQcZEgQAAIfkECQ8AeQAsAAABAA8ADgAAB7CAeYJ5c15pgjo2eIODeEIXLExJQh1mjIM/aXhGUXlRW4xzZVcsGj6CWggwMEeLJxdMGHlaBgVIeSJfJGR5NUp5MlMBMjcBSDdwLId5QlJ5BKd5TwR5PE6DUUx5A7d5UwPMRIJpNnk3QQBISAE3T3MwOHlbJWMmeUEDAjJ5E1IbM3nsCNHRocKNQTtKYBmzKM8iL+LGJJmzJd6lPGQeMHESpUWJIxcdtgCYx0yYhnkCAQAh+QQJDwB5ACwAAAAADwAPAAAHqoB5goN5c4SHhEIoUYiDb3lvNk4wW2UoSYQlEEYhZXlqLFg2KIQtWGkNPoJVC2SMg2FOL3laBgVIeQ4zhFI2MlMBMjcBSDdOJFh5RD+CBKp5TwSCNUlwM06CA7h5UwN5Ui1feU41RjdBAEhIATdAEHCEFBF5QQMCMnkpRPCDRmo3OQS1AZEGgo5BaQ4YoQIjTZ4eLZpQ8DRISY85ZWjAqCEITyNBTpKMORQIACH5BAkPAHkALAAAAQAPAA4AAAemgHmCg3gfF3CDiXlvZnlbUkxSeWlviW8nLDMocHMwNiQwlYJlLXkWPoJaC3ksZIk6L3laBgVIeR40g3NUJDJTATI3AUg3IVJzeQpOaXkEqHlPBHlqRgrJW4IDtnlTA3lwUgx5cVEoN0EASEgBN08hTqJ5PCp5QQMCMnkvM4lm/Dc3BqE6UWaQGhiZKLjqAaMhM4Nh8mBRUuZKHjJqFA2CwyBBxkSBAAAh+QQJDwB5ACwAAAEADwAOAAAHsIB5gnlzXmmCOjZ4g4N4QhcsTElCHWaMgz9peEZReVFbjHNlVywaPoJaCDAwR4snF0wYeVoGBUh5Il8kZHk1SnkyUwEyNwFIN3Ash3lCUnkEp3lPBHk8ToNRTHkDt3lTA8xEgmk2eTdBAEhIATdPczA4eVslYyZ5QQMCMnkTUhszeewI0dGhwo1BO0pgGbMozyIv4sYkmbMl3qU8ZB4wcRKlRYkjFx22AJjHTJiGeQIBACH5BAkPAHkALAAAAAAPAA8AAAeqgHmCg3lzhIeEQihRiINveW82TjBbZShJhCUQRiFleWosWDYohC1YaQ0+glULZIyDYU4veVoGBUh5DjOEUjYyUwEyNwFIN04kWHlEP4IEqnlPBII1SXAzToIDuHlTA3lSLV95TjVGN0EASEgBN0AQcIQUEXlBAwIyeSlE8INGajc5BLUBkQaCjkFpDhihAiNNnh4tmlDwNEhJjzllaMCoIQhPI0FOkow5FAgAIfkECQ8AeQAsAAABAA8ADgAAB6aAeYKDeB8XcIOJeW9meVtSTFJ5aW+JbycsMyhwczA2JDCVgmUteRY+gloLeSxkiToveVoGBUh5HjSDc1QkMlMBMjcBSDchUnN5Ck5peQSoeU8EeWpGCslbggO2eVMDeXBSDHlxUSg3QQBISAE3TyFOonk8KnlBAwIyeS8ziWb8NzcGoTpRZpAaGJkouOoBoyEzg2HyYFFS5koeMmoUDYLDIEHGRIEAACH5BAkPAHkALAAAAQAPAA4AAAewgHmCeXNeaYI6NniDg3hCFyxMSUIdZoyDP2l4RlF5UVuMc2VXLBo+gloIMDBHiycXTBh5WgYFSHkiXyRkeTVKeTJTATI3AUg3cCyHeUJSeQSneU8EeTxOg1FMeQO3eVMDzESCaTZ5N0EASEgBN09zMDh5WyVjJnlBAwIyeRNSGzN57AjR0aHCjUE7SmAZsyjPIi/ixiSZsyXepTxkHjBxEqVFiSMXHbYAmMdMmIZ5AgEAOw==)}.n-menu[data-v-3daab35e] .n-menu-item .n-menu-item-content .logout{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAK6wAACusBgosNWgAAABx0RVh0U29mdHdhcmUAQWRvYmUgRmlyZXdvcmtzIENTNui8sowAAAEYSURBVDiNpZOtTkNBEEbPFCQIUHgEBoJAYFDgERgSCBjSvU9Q0/AkX5+ApB6PI6lAYPhJUCgEgkApkHyI/nBpb28DPWozu3MyuzsTtpmG2f5CUs32BlABouBsAK8RUU8pPY4IImIfOLd9k4/n+IyII2AZGBUAM8BZlmXX48qVtAksFl6hx/y45B5N4C4fqExI+EVK6QJYkLT9L0GPJ+BU0hYUP9YAScfACtDh52c6wAPQlHRQKoiIN+B5WGC7DXzYfi8VVKvV5nCs0WgsRcSh7b0sy1qlgiJszwG1lFIL/viIknaAdkrpsh8bruBlgmOXbq8UduIXcCLpvkDc31+j20wDBgdty/Y6sMroMJnuda+A2/xGTDvO32OQXrvPg7l3AAAAAElFTkSuQmCC)}.n-menu[data-v-3daab35e] .n-menu-item .n-menu-item-content--selected .logout{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAKdQAACnUBSiXd/QAAABx0RVh0U29mdHdhcmUAQWRvYmUgRmlyZXdvcmtzIENTNui8sowAAADvSURBVDiNpdO7LkRRFAbg7wwlBZVeoSEKEtHSayUSGs+g8RwqbyDR6ycaiYRC45KoVAqFuAySpdhzODn2mWMyf7KSvdflz7oWEWEUjFfee1hCB0XGt8AL9vGQI9jECa5r+hKf2MZsE8EYjnA1IOMVTDeVAJMDguEYt1VFpyWgji6msNaUwX/wiAN84LSNYAdz6PmdTA/3UjlbbQSveMoQvPUzeBcRpVxExGrl3yQzEdGNiOWIGLqJMCEt3TnDT2G9n/5Zqaj34LmFYEPalewmfmEXdxni0r4gdf8HVcdDLGLe32MKqdxL3FQNxajn/A0ZS19hUhhlTwAAAABJRU5ErkJggg==)}.n-menu[data-v-3daab35e] .n-menu-item .n-menu-item-content:hover .logout{background-image:url(data:image/gif;base64,R0lGODlhEAAQANUAAOPj4+Hh4dnZ2dXV1c3NzcvLy8fHx8PDw8HBwb+/v729vbu7u7W1ta2trampqaenp6Ojo6GhoZ2dnQzNOgjPOpeXlxq9Qhi9QI+Pj4uLi4mJiSatSCqpSjCjTDSfToGBgTadTjKfTjibUDqZUDqXUDyVUkCRVESNVnZ2dkyFWnR0dE6BWlB+XFB8XFR4Xlh2XlxwYF5uYmZmZgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH/C05FVFNDQVBFMi4wAwEAAAAh+QQFCAAyACwCAAEACwAOAAAGQMBGgUAsEgyoAEMSaTYlgwzgI6taZYkKQHO1ZlDb7jUsrpLLZ3G6ux5zxRgwVayoBBQPh17/EGQgCQiCgwcLKkEAIfkEBQgAMgAsBwAHAAEAAgAABgRA0ykIACH5BAUIADIALAgABwABAAIAAAYEwI4oCAAh+QQFCAAyACwJAAcAAgACAAAGBkCPhzQKAgAh+QQFCAAyACwLAAcAAQACAAAGBEDPKAgAIfkEBQgAMgAsDAAHAAIAAgAABgZA0KbECQIAIfkEBQgAMgAsDAAFAAIAAgAABgZAVypmCQIAIfkEBQgAMgAsDgAGAAIAAwAABgfAlYySmqyCACH5BAUIADIALAwACQADAAEAAAYFQNiFFQQAIfkEBQgAMgAsDAAKAAIAAQAABgTAFysIACH5BAkyADIALAIAAQAOAA4AAAYUQJlwSCwaj8ikcslsOp/QqHRqDAIAOw==)}.nps-container[data-v-5249d570]{color:var(--border-hover-focus-color);position:absolute;bottom:10em;right:1px;cursor:pointer;box-shadow:0 0 10px rgba(0,0,0,.1)}.nps-container[data-v-5249d570]:hover{color:#fff}.nps-container:hover .nps-box[data-v-5249d570]{background:var(--nps-box-hover-bg)}.nps-container:hover .nps-box span[data-v-5249d570]{color:#fff}.nps-box[data-v-5249d570]{background:var(--color-bg-2);display:flex;flex-direction:column;align-items:center;justify-content:center;border-radius:4px;padding:15px 10px}.nps-box span[data-v-5249d570]{color:var(--border-hover-focus-color)}.n-button[data-v-76a25600]{user-select:auto;line-height:inherit;font-size:inherit;text-align:left}.bt-layout[data-v-422be52e]{--n-color: #f2f2f2}.bt-layout[data-v-422be52e]>.n-layout-scroll-container{overflow-x:auto}.n-tag[data-v-a19063b0]{--n-height: 24px;--n-border-radius: 6px;min-width:24px;justify-content:center;font-weight:700;cursor:pointer}.n-layout-sider[data-v-0b6e4e36]{background:none}.n-layout-sider[data-v-0b6e4e36]:after{content:"";position:absolute;top:0;left:0;width:100%;height:100%;background-color:var(--n-color);opacity:var(--menu-bg-opacity);z-index:-1}.n-menu[data-v-0b6e4e36]{--n-font-size: 14px;--n-item-height: 38px;--n-border-radius: 6px;--n-item-text-color: var(--color-sider-text);--n-item-color-hover: var(--color-sider-hover);--n-item-color-active: var(--color-sider-active);--n-item-text-color-hover: var(--color-sider-hover-text);--n-item-text-color-active: var(--color-sider-active-text);--n-item-text-color-active-hover: var(--color-sider-active-text)}.n-menu[data-v-0b6e4e36] .n-menu-item:first-of-type{margin-top:0}.n-menu[data-v-0b6e4e36] .n-menu-item .n-menu-item-content:before{left:16px;right:16px;background-color:var(--color-sider);opacity:var(--menu-bg-opacity)}.n-menu[data-v-0b6e4e36] .n-menu-item .n-menu-item-content:not(.n-menu-item-content--disabled):hover:before{background-color:var(--n-item-color-hover);opacity:1}.n-menu[data-v-0b6e4e36] .n-menu-item .n-menu-item-content:not(.n-menu-item-content--disabled).n-menu-item-content--selected:before{background-color:var(--n-item-color-active);opacity:1}.n-layout-footer[data-v-81702d69]{border-top-left-radius:10px;border-top-right-radius:10px}.layout-container[data-v-19d95428]:before{content:"";position:absolute;top:0;left:0;width:100%;height:100%;background-image:var(--main-bg-image);background-size:cover;background-position:top right;background-color:var(--color-bg-1);opacity:var(--main-bg-opacity)}.bt-layout[data-v-19d95428]{--n-color: transparent}.bt-layout[data-v-19d95428]>.n-layout-scroll-container{overflow-x:auto} diff --git a/BTPanel/static/vite/css/ssh-protection-log.css b/BTPanel/static/vite/css/ssh-protection-log.css new file mode 100644 index 00000000..9a76ee38 --- /dev/null +++ b/BTPanel/static/vite/css/ssh-protection-log.css @@ -0,0 +1 @@ +.stat-box[data-v-d420b8b4]{margin-bottom:16px;align-items:center;border-radius:8px;padding:16px;border:1px solid var(--color-border)} diff --git a/BTPanel/static/vite/images/node-files.png b/BTPanel/static/vite/images/node-files.png new file mode 100644 index 00000000..ea4a8a81 Binary files /dev/null and b/BTPanel/static/vite/images/node-files.png differ diff --git a/BTPanel/static/vite/images/node-mannage.png b/BTPanel/static/vite/images/node-mannage.png new file mode 100644 index 00000000..70ed579e Binary files /dev/null and b/BTPanel/static/vite/images/node-mannage.png differ diff --git a/BTPanel/static/vite/images/soft-ico/ico-cloudflare_manage.png b/BTPanel/static/vite/images/soft-ico/ico-cloudflare_manage.png new file mode 100644 index 00000000..c190672f Binary files /dev/null and b/BTPanel/static/vite/images/soft-ico/ico-cloudflare_manage.png differ diff --git a/BTPanel/static/vite/images/soft-ico/ico-site_total.png b/BTPanel/static/vite/images/soft-ico/ico-site_total.png new file mode 100644 index 00000000..2c828bd7 Binary files /dev/null and b/BTPanel/static/vite/images/soft-ico/ico-site_total.png differ diff --git a/BTPanel/static/vite/js/Backup-legacy.js b/BTPanel/static/vite/js/Backup-legacy.js index ced5dd6a..4b16ab20 100644 --- a/BTPanel/static/vite/js/Backup-legacy.js +++ b/BTPanel/static/vite/js/Backup-legacy.js @@ -1 +1 @@ -System.register(["./index-legacy.js?v=1767769852656","./public-legacy.js?v=1767769852656","./page_layout-legacy.js?v=1767769852656","./ResourceManagerWindow-legacy.js?v=1767769852656","./naive-legacy.js?v=1767769852656","./vue-legacy.js?v=1767769852656","./common-legacy.js?v=1767769852656","./__commonjsHelpers__-legacy.js?v=1767769852656","./index-legacy38.js?v=1767769852656","./soft-legacy2.js?v=1767769852656","./soft-legacy.js?v=1767769852656","./site-legacy.js?v=1767769852656","./file-legacy2.js?v=1767769852656","./index.vue_vue_type_script_setup_true_lang-legacy7.js?v=1767769852656"],function(e,a){"use strict";var l,t,i,n,u,s,c,o,p,r,d,f,m,k,v,g,h,y,b,_,x,M,w,j,C,B,P,R;return{setters:[e=>{l=e._},e=>{t=e.f,i=e.a,n=e.h},e=>{u=e.aa,s=e.aE,c=e.x,o=e._,p=e.m},e=>{r=e.R},e=>{d=e.av,f=e.au,m=e.aC},e=>{k=e.k,v=e.P,g=e.i,h=e.r,y=e.av,b=e.R,_=e.V,x=e.W,M=e.a3,w=e.S,j=e.U,C=e.j,B=e.a4,P=e.ak,R=e.F},null,null,null,null,null,null,null,null],execute:function(){const a={class:"p-20px"},U={class:"flex items-center gap-16px mb-16px"},N={class:"p-20px"},S={class:"mb-16px text-14px"},q={class:"flex items-center gap-20px"},D={class:"text-13px"};e("default",k({__name:"Backup",setup(e,{expose:k}){const{t:F}=v(),O=g("fileStore"),{currentPath:T,backupForm:W}=O,z=h(!1),E=h(!1),H=h([]);k({open(){W.value.path="",z.value=!0,L()},close(){z.value=!1,H.value=[]}});const V=h(!1),A=y("resourceManagerRef"),G=h([{key:"time",title:F("file.backupModal.backupTime"),width:160,render:e=>u(e.time)},{key:"path",title:F("file.backupModal.backupPath"),ellipsis:{tooltip:!0}},{key:"name",title:F("file.backupModal.backupName"),width:120,ellipsis:{tooltip:!0},render:e=>e.name||"--"},t({width:100,options:e=>[{label:F("Public.Btn.Delete"),onClick:()=>{i({title:F("file.backupModal.deleteBackup"),content:F("file.backupModal.deleteConfirm"),onConfirm:async()=>{await s.post("/files?action=del_path_premissions",{id:e.id},{requestOptions:{loading:F("file.backupModal.deletingBackup"),successMessage:!0}}),L()}})}}]})]);function I(){A.value?.open()}function J(e){W.value.path=e}function K(){W.value.path?V.value=!0:p.warning(F("file.backupModal.pleaseSelectPath"))}async function L(){try{E.value=!0;const{message:e}=await s.post("/files?action=get_all_back");c(e)?H.value=e.map(e=>({id:Number(e[0]),time:Number(e[2]),name:e[1],path:e[3]})):H.value=[]}finally{E.value=!1}}async function Q(){try{await s.post("/files?action=back_path_permissions",W.value,{requestOptions:{loading:F("file.backupModal.executingBackup"),successMessage:!0}}),L(),W.value.path="",W.value.remark=""}catch(e){console.warn(e)}}return(e,t)=>{const i=f,u=o,s=m,c=d,p=n,k=l;return _(),b(R,null,[x(k,{show:j(z),"onUpdate:show":t[1]||(t[1]=e=>P(z)?z.value=e:null),title:j(F)("file.backupModal.title"),width:"700"},{default:M(()=>[w("div",a,[w("div",U,[x(c,null,{default:M(()=>[x(i,{value:j(W).path,"onUpdate:value":t[0]||(t[0]=e=>j(W).path=e)},null,8,["value"]),x(s,{onClick:I},{icon:M(()=>[x(u,{name:"file-dir",size:"20"})]),_:1})]),_:1}),x(s,{type:"primary",onClick:K},{default:M(()=>[C(B(j(F)("file.backupModal.backupButton")),1)]),_:1})]),x(p,{loading:j(E),"max-height":370,data:j(H),columns:j(G)},null,8,["loading","data","columns"])])]),_:1},8,["show","title"]),x(k,{show:j(V),"onUpdate:show":t[3]||(t[3]=e=>P(V)?V.value=e:null),title:j(F)("file.backupModal.confirmTitle"),width:320,footer:!0,onConfirm:Q},{default:M(()=>[w("div",N,[w("div",S,B(j(F)("file.backupModal.enterBackupName")),1),w("div",q,[w("div",D,B(j(F)("file.backupModal.remarks")),1),x(i,{class:"flex-1",value:j(W).remark,"onUpdate:value":t[2]||(t[2]=e=>j(W).remark=e)},null,8,["value"])])])]),_:1},8,["show","title"]),x(r,{ref_key:"resourceManagerRef",ref:A,"current-path":j(T),onChooseDir:J},null,8,["current-path"])],64)}}}))}}}); +System.register(["./index-legacy.js?v=1769066082311","./public-legacy.js?v=1769066082311","./page_layout-legacy.js?v=1769066082311","./ResourceManagerWindow-legacy.js?v=1769066082311","./naive-legacy.js?v=1769066082311","./vue-legacy.js?v=1769066082311","./common-legacy.js?v=1769066082311","./__commonjsHelpers__-legacy.js?v=1769066082311","./CalcSize.vue_vue_type_script_setup_true_lang-legacy.js?v=1769066082311","./soft-legacy2.js?v=1769066082311","./soft-legacy.js?v=1769066082311","./site-legacy.js?v=1769066082311","./index-legacy38.js?v=1769066082311","./file-legacy2.js?v=1769066082311","./index.vue_vue_type_script_setup_true_lang-legacy7.js?v=1769066082311"],function(e,a){"use strict";var l,t,i,u,n,s,c,o,p,r,d,f,m,k,v,g,_,h,y,b,x,M,j,w,C,B,P,R;return{setters:[e=>{l=e._},e=>{t=e.f,i=e.a,u=e.h},e=>{n=e.aa,s=e.aE,c=e.x,o=e._,p=e.m},e=>{r=e.R},e=>{d=e.av,f=e.au,m=e.aC},e=>{k=e.k,v=e.P,g=e.i,_=e.r,h=e.av,y=e.R,b=e.V,x=e.W,M=e.a3,j=e.S,w=e.U,C=e.j,B=e.a4,P=e.ak,R=e.F},null,null,null,null,null,null,null,null,null],execute:function(){const a={class:"p-20px"},S={class:"flex items-center gap-16px mb-16px"},U={class:"p-20px"},N={class:"mb-16px text-14px"},q={class:"flex items-center gap-20px"},z={class:"text-13px"};e("default",k({__name:"Backup",setup(e,{expose:k}){const{t:D}=v(),F=g("fileStore"),{currentPath:O,backupForm:T}=F,W=_(!1),E=_(!1),H=_([]);k({open(){T.value.path="",W.value=!0,L()},close(){W.value=!1,H.value=[]}});const V=_(!1),A=h("resourceManagerRef"),G=_([{key:"time",title:D("file.backupModal.backupTime"),width:160,render:e=>n(e.time)},{key:"path",title:D("file.backupModal.backupPath"),ellipsis:{tooltip:!0}},{key:"name",title:D("file.backupModal.backupName"),width:120,ellipsis:{tooltip:!0},render:e=>e.name||"--"},t({width:100,options:e=>[{label:D("Public.Btn.Delete"),onClick:()=>{i({title:D("file.backupModal.deleteBackup"),content:D("file.backupModal.deleteConfirm"),onConfirm:async()=>{await s.post("/files?action=del_path_premissions",{id:e.id},{requestOptions:{loading:D("file.backupModal.deletingBackup"),successMessage:!0}}),L()}})}}]})]);function I(){A.value?.open()}function J(e){T.value.path=e}function K(){T.value.path?V.value=!0:p.warning(D("file.backupModal.pleaseSelectPath"))}async function L(){try{E.value=!0;const{message:e}=await s.post("/files?action=get_all_back");c(e)?H.value=e.map(e=>({id:Number(e[0]),time:Number(e[2]),name:e[1],path:e[3]})):H.value=[]}finally{E.value=!1}}async function Q(){try{await s.post("/files?action=back_path_permissions",T.value,{requestOptions:{loading:D("file.backupModal.executingBackup"),successMessage:!0}}),L(),T.value.path="",T.value.remark=""}catch(e){console.warn(e)}}return(e,t)=>{const i=f,n=o,s=m,c=d,p=u,k=l;return b(),y(R,null,[x(k,{show:w(W),"onUpdate:show":t[1]||(t[1]=e=>P(W)?W.value=e:null),title:w(D)("file.backupModal.title"),width:"700"},{default:M(()=>[j("div",a,[j("div",S,[x(c,null,{default:M(()=>[x(i,{value:w(T).path,"onUpdate:value":t[0]||(t[0]=e=>w(T).path=e)},null,8,["value"]),x(s,{onClick:I},{icon:M(()=>[x(n,{name:"file-dir",size:"20"})]),_:1})]),_:1}),x(s,{type:"primary",onClick:K},{default:M(()=>[C(B(w(D)("file.backupModal.backupButton")),1)]),_:1})]),x(p,{loading:w(E),"max-height":370,data:w(H),columns:w(G)},null,8,["loading","data","columns"])])]),_:1},8,["show","title"]),x(k,{show:w(V),"onUpdate:show":t[3]||(t[3]=e=>P(V)?V.value=e:null),title:w(D)("file.backupModal.confirmTitle"),width:320,footer:!0,onConfirm:Q},{default:M(()=>[j("div",U,[j("div",N,B(w(D)("file.backupModal.enterBackupName")),1),j("div",q,[j("div",z,B(w(D)("file.backupModal.remarks")),1),x(i,{class:"flex-1",value:w(T).remark,"onUpdate:value":t[2]||(t[2]=e=>w(T).remark=e)},null,8,["value"])])])]),_:1},8,["show","title"]),x(r,{ref_key:"resourceManagerRef",ref:A,"current-path":w(O),onChooseDir:J},null,8,["current-path"])],64)}}}))}}}); diff --git a/BTPanel/static/vite/js/Backup.js b/BTPanel/static/vite/js/Backup.js index f727c6b8..8c3141cc 100644 --- a/BTPanel/static/vite/js/Backup.js +++ b/BTPanel/static/vite/js/Backup.js @@ -1 +1 @@ -import{_ as a}from"./index.js?v=1767769852656";import{f as e,a as t,h as l}from"./public.js?v=1767769852656";import{aa as s,aE as i,x as o,_ as n,m as u}from"./page_layout.js?v=1767769852656";import{R as p}from"./ResourceManagerWindow.js?v=1767769852656";import{av as r,au as c,aC as m}from"./naive.js?v=1767769852656";import{k as d,P as f,i as k,r as v,av as h,R as b,V as _,W as x,a3 as g,S as M,U as w,j,a4 as y,ak as C,F as B}from"./vue.js?v=1767769852656";import"./common.js?v=1767769852656";import"./__commonjsHelpers__.js?v=1767769852656";import"./index38.js?v=1767769852656";import"./soft2.js?v=1767769852656";import"./soft.js?v=1767769852656";import"./site.js?v=1767769852656";import"./file2.js?v=1767769852656";import"./index.vue_vue_type_script_setup_true_lang7.js?v=1767769852656";const P={class:"p-20px"},R={class:"flex items-center gap-16px mb-16px"},U={class:"p-20px"},N={class:"mb-16px text-14px"},S={class:"flex items-center gap-20px"},q={class:"text-13px"},D=d({__name:"Backup",setup(d,{expose:D}){const{t:F}=f(),O=k("fileStore"),{currentPath:T,backupForm:W}=O,z=v(!1),E=v(!1),H=v([]);D({open(){W.value.path="",z.value=!0,L()},close(){z.value=!1,H.value=[]}});const V=v(!1),A=h("resourceManagerRef"),G=v([{key:"time",title:F("file.backupModal.backupTime"),width:160,render:a=>s(a.time)},{key:"path",title:F("file.backupModal.backupPath"),ellipsis:{tooltip:!0}},{key:"name",title:F("file.backupModal.backupName"),width:120,ellipsis:{tooltip:!0},render:a=>a.name||"--"},e({width:100,options:a=>[{label:F("Public.Btn.Delete"),onClick:()=>{t({title:F("file.backupModal.deleteBackup"),content:F("file.backupModal.deleteConfirm"),onConfirm:async()=>{await i.post("/files?action=del_path_premissions",{id:a.id},{requestOptions:{loading:F("file.backupModal.deletingBackup"),successMessage:!0}}),L()}})}}]})]);function I(){var a;null==(a=A.value)||a.open()}function J(a){W.value.path=a}function K(){W.value.path?V.value=!0:u.warning(F("file.backupModal.pleaseSelectPath"))}async function L(){try{E.value=!0;const{message:a}=await i.post("/files?action=get_all_back");o(a)?H.value=a.map(a=>({id:Number(a[0]),time:Number(a[2]),name:a[1],path:a[3]})):H.value=[]}finally{E.value=!1}}async function Q(){try{await i.post("/files?action=back_path_permissions",W.value,{requestOptions:{loading:F("file.backupModal.executingBackup"),successMessage:!0}}),L(),W.value.path="",W.value.remark=""}catch(a){console.warn(a)}}return(e,t)=>{const s=c,i=n,o=m,u=r,d=l,f=a;return _(),b(B,null,[x(f,{show:w(z),"onUpdate:show":t[1]||(t[1]=a=>C(z)?z.value=a:null),title:w(F)("file.backupModal.title"),width:"700"},{default:g(()=>[M("div",P,[M("div",R,[x(u,null,{default:g(()=>[x(s,{value:w(W).path,"onUpdate:value":t[0]||(t[0]=a=>w(W).path=a)},null,8,["value"]),x(o,{onClick:I},{icon:g(()=>[x(i,{name:"file-dir",size:"20"})]),_:1})]),_:1}),x(o,{type:"primary",onClick:K},{default:g(()=>[j(y(w(F)("file.backupModal.backupButton")),1)]),_:1})]),x(d,{loading:w(E),"max-height":370,data:w(H),columns:w(G)},null,8,["loading","data","columns"])])]),_:1},8,["show","title"]),x(f,{show:w(V),"onUpdate:show":t[3]||(t[3]=a=>C(V)?V.value=a:null),title:w(F)("file.backupModal.confirmTitle"),width:320,footer:!0,onConfirm:Q},{default:g(()=>[M("div",U,[M("div",N,y(w(F)("file.backupModal.enterBackupName")),1),M("div",S,[M("div",q,y(w(F)("file.backupModal.remarks")),1),x(s,{class:"flex-1",value:w(W).remark,"onUpdate:value":t[2]||(t[2]=a=>w(W).remark=a)},null,8,["value"])])])]),_:1},8,["show","title"]),x(p,{ref_key:"resourceManagerRef",ref:A,"current-path":w(T),onChooseDir:J},null,8,["current-path"])],64)}}});export{D as default}; +import{_ as a}from"./index.js?v=1769066082311";import{f as e,a as t,h as l}from"./public.js?v=1769066082311";import{aa as s,aE as i,x as o,_ as u,m as n}from"./page_layout.js?v=1769066082311";import{R as p}from"./ResourceManagerWindow.js?v=1769066082311";import{av as r,au as c,aC as m}from"./naive.js?v=1769066082311";import{k as d,P as f,i as k,r as v,av as _,R as h,V as b,W as x,a3 as g,S as M,U as j,j as w,a4 as y,ak as C,F as B}from"./vue.js?v=1769066082311";import"./common.js?v=1769066082311";import"./__commonjsHelpers__.js?v=1769066082311";import"./CalcSize.vue_vue_type_script_setup_true_lang.js?v=1769066082311";import"./soft2.js?v=1769066082311";import"./soft.js?v=1769066082311";import"./site.js?v=1769066082311";import"./index38.js?v=1769066082311";import"./file2.js?v=1769066082311";import"./index.vue_vue_type_script_setup_true_lang7.js?v=1769066082311";const P={class:"p-20px"},R={class:"flex items-center gap-16px mb-16px"},U={class:"p-20px"},N={class:"mb-16px text-14px"},S={class:"flex items-center gap-20px"},q={class:"text-13px"},z=d({__name:"Backup",setup(d,{expose:z}){const{t:D}=f(),F=k("fileStore"),{currentPath:O,backupForm:T}=F,W=v(!1),E=v(!1),H=v([]);z({open(){T.value.path="",W.value=!0,L()},close(){W.value=!1,H.value=[]}});const V=v(!1),A=_("resourceManagerRef"),G=v([{key:"time",title:D("file.backupModal.backupTime"),width:160,render:a=>s(a.time)},{key:"path",title:D("file.backupModal.backupPath"),ellipsis:{tooltip:!0}},{key:"name",title:D("file.backupModal.backupName"),width:120,ellipsis:{tooltip:!0},render:a=>a.name||"--"},e({width:100,options:a=>[{label:D("Public.Btn.Delete"),onClick:()=>{t({title:D("file.backupModal.deleteBackup"),content:D("file.backupModal.deleteConfirm"),onConfirm:async()=>{await i.post("/files?action=del_path_premissions",{id:a.id},{requestOptions:{loading:D("file.backupModal.deletingBackup"),successMessage:!0}}),L()}})}}]})]);function I(){var a;null==(a=A.value)||a.open()}function J(a){T.value.path=a}function K(){T.value.path?V.value=!0:n.warning(D("file.backupModal.pleaseSelectPath"))}async function L(){try{E.value=!0;const{message:a}=await i.post("/files?action=get_all_back");o(a)?H.value=a.map(a=>({id:Number(a[0]),time:Number(a[2]),name:a[1],path:a[3]})):H.value=[]}finally{E.value=!1}}async function Q(){try{await i.post("/files?action=back_path_permissions",T.value,{requestOptions:{loading:D("file.backupModal.executingBackup"),successMessage:!0}}),L(),T.value.path="",T.value.remark=""}catch(a){console.warn(a)}}return(e,t)=>{const s=c,i=u,o=m,n=r,d=l,f=a;return b(),h(B,null,[x(f,{show:j(W),"onUpdate:show":t[1]||(t[1]=a=>C(W)?W.value=a:null),title:j(D)("file.backupModal.title"),width:"700"},{default:g(()=>[M("div",P,[M("div",R,[x(n,null,{default:g(()=>[x(s,{value:j(T).path,"onUpdate:value":t[0]||(t[0]=a=>j(T).path=a)},null,8,["value"]),x(o,{onClick:I},{icon:g(()=>[x(i,{name:"file-dir",size:"20"})]),_:1})]),_:1}),x(o,{type:"primary",onClick:K},{default:g(()=>[w(y(j(D)("file.backupModal.backupButton")),1)]),_:1})]),x(d,{loading:j(E),"max-height":370,data:j(H),columns:j(G)},null,8,["loading","data","columns"])])]),_:1},8,["show","title"]),x(f,{show:j(V),"onUpdate:show":t[3]||(t[3]=a=>C(V)?V.value=a:null),title:j(D)("file.backupModal.confirmTitle"),width:320,footer:!0,onConfirm:Q},{default:g(()=>[M("div",U,[M("div",N,y(j(D)("file.backupModal.enterBackupName")),1),M("div",S,[M("div",q,y(j(D)("file.backupModal.remarks")),1),x(s,{class:"flex-1",value:j(T).remark,"onUpdate:value":t[2]||(t[2]=a=>j(T).remark=a)},null,8,["value"])])])]),_:1},8,["show","title"]),x(p,{ref_key:"resourceManagerRef",ref:A,"current-path":j(O),onChooseDir:J},null,8,["current-path"])],64)}}});export{z as default}; diff --git a/BTPanel/static/vite/js/CalcSize.vue_vue_type_script_setup_true_lang-legacy.js b/BTPanel/static/vite/js/CalcSize.vue_vue_type_script_setup_true_lang-legacy.js new file mode 100644 index 00000000..7fe05b80 --- /dev/null +++ b/BTPanel/static/vite/js/CalcSize.vue_vue_type_script_setup_true_lang-legacy.js @@ -0,0 +1 @@ +System.register(["./vue-legacy.js?v=1769066082311","./page_layout-legacy.js?v=1769066082311","./public-legacy.js?v=1769066082311","./soft-legacy2.js?v=1769066082311","./naive-legacy.js?v=1769066082311"],function(t,e){"use strict";var i,a,n,s,o,l,c,r,p,u,d,f,v,m,g,h,b,y,x,k,w,_,C,S,F,j,O,P,R,L,N,M,T,q,z,D,K,I,E;return{setters:[t=>{i=t.r,a=t.ak,n=t.aC,s=t.aD,o=t._,l=t.n,c=t.ap,r=t.W,p=t.F,u=t.k,d=t.c,f=t.R,v=t.V,m=t.H,g=t.U,h=t.P,b=t.a2,y=t.a3,x=t.j,k=t.a4},t=>{w=t.w,_=t.r,C=t.aE,S=t.y,F=t.i,j=t.x,O=t.a,P=t.m,R=t.d,L=t.aJ,N=t.p},t=>{M=t.b,T=t.u,q=t.a,z=t.p,D=t.i},t=>{K=t.c},t=>{I=t._,E=t.aC}],execute:function(){var J=document.createElement("style");function U(t,e,i){_("FileEditorPath",i),openEditorView(t,e)}function A(t,e,s){const o=i(!0),l=i(0),c=i(0),r=i(0),p=i(0),u=i(0),d=i(0),f=i(0),v=i(0);let m;a(t)?m=t.value:"string"==typeof t?m=document.querySelector(t):t instanceof Element&&(m=t);const g=function(){let t=null;return!!e&&(()=>{t||(t=setTimeout(()=>{e({m_flag:o,m_left:l,m_right:c,m_bottom:p,m_top:r,m_x:f,m_y:v,m_height:u,m_width:d}),clearTimeout(t),t=null},10))})}();function h(t){const{left:e,right:i,top:a,bottom:n,height:s,width:o,x:m,y:g}=t.getBoundingClientRect();l.value=e,c.value=i,r.value=a,p.value=n,u.value=s,d.value=o,f.value=m,v.value=g}const b=t=>{if(s&&s(t,{m_flag:o,m_left:l,m_right:c,m_bottom:p,m_top:r,m_x:f,m_y:v,m_height:u,m_width:d}),!o.value)return;const{left:e,right:i,top:a,bottom:b}=m.getBoundingClientRect(),y=document.createElement("div"),x=t.clientX,k=t.clientY;y.style.position="absolute",y.style.left=x-e+"px",y.style.top=k-a+"px",y.style.width="0px",y.style.height="0px",y.style.backgroundColor="rgba(135, 182, 130, 0.1)",y.classList.add("district-wrapper"),m.appendChild(y),t.preventDefault();const{pause:w,resume:_,isActive:C}=n(()=>{O.scrollTop>=O.scrollHeight-O.clientHeight?w():(y.style.height=y.offsetHeight+10+"px",y.style.marginTop=parseInt(getComputedStyle(y).marginTop)-10+"px",O.scrollTop+=10,P=O.scrollTop,h(y),g&&g())},{immediate:!1}),{pause:S,resume:F,isActive:j}=n(()=>{O.scrollTop<=0?S():(y.style.height=y.offsetHeight+10+"px",O.scrollTop-=10,R+=10,h(y),g&&g())},{immediate:!1}),O=m.querySelector(".n-scrollbar-container");let P=0,R=0;document.onmousemove=t=>{t.preventDefault(),C.value||j.value||(x<=t.clientX?y.style.width=t.clientX-x+"px":(y.style.width=x-t.clientX+"px",y.style.marginLeft=-(x-t.clientX)+"px"),k<=t.clientY?(y.style.height=t.clientY-k+P+"px",y.style.marginTop=-P+"px"):(y.style.height=k-t.clientY+R+"px",y.style.marginTop=-(k-t.clientY)+"px"),t.clientXi&&(y.style.width=i-x+"px")),t.clientY>b&&_(),t.clientY{document.onmousemove=null,m.contains(y)&&m.removeChild(y)}};return m&&(m.onmousedown=b),{m_flag:o,m_x:f,m_y:v,m_left:l,m_right:c,m_top:r,m_bottom:p,m_height:u,m_width:d}}function B(t,e){const i=s(t.m_left),a=s(t.m_right),n=s(t.m_top),o=s(t.m_bottom),l=s(e.left),c=s(e.right),r=s(e.top),p=s(e.bottom);return!(ca||po)}J.textContent=".files-icon[data-v-0a2d98fb]{display:inline-block;width:25px;height:25px;background-image:url(/static/vite/images/file_icon.png);background-repeat:no-repeat;background-size:25px;background-position:0px -375px}.files-icon.medium-icon.swf-icon[data-v-0a2d98fb]{background-position:0px 0px}.files-icon.medium-icon.webm-icon[data-v-0a2d98fb]{background-position:0px -25px}.files-icon.medium-icon.webp-icon[data-v-0a2d98fb]{background-position:0px -50px}.files-icon.medium-icon.wma-icon[data-v-0a2d98fb]{background-position:0px -75px}.files-icon.medium-icon.wmv-icon[data-v-0a2d98fb]{background-position:0px -100px}.files-icon.medium-icon.xls-icon[data-v-0a2d98fb]{background-position:0px -125px}.files-icon.medium-icon.xml-icon[data-v-0a2d98fb]{background-position:0px -150px}.files-icon.medium-icon.access-icon[data-v-0a2d98fb]{background-position:0px -175px}.files-icon.medium-icon.apk-icon[data-v-0a2d98fb]{background-position:0px -200px}.files-icon.medium-icon.avi-icon[data-v-0a2d98fb],.files-icon.medium-icon.bmp-icon[data-v-0a2d98fb]{background-position:0px -250px}.files-icon.medium-icon.cdr-icon[data-v-0a2d98fb]{background-position:0px -275px}.files-icon.medium-icon.compress-icon[data-v-0a2d98fb]{background-position:0px -300px}.files-icon.medium-icon.css-icon[data-v-0a2d98fb]{background-position:0px -325px}.files-icon.medium-icon.doc-icon[data-v-0a2d98fb]{background-position:0px -350px}.files-icon.medium-icon.file-icon[data-v-0a2d98fb]{background-position:0px -375px}.files-icon.medium-icon.folder-icon[data-v-0a2d98fb]{background-position:0px -400px}.files-icon.medium-icon.gif-icon[data-v-0a2d98fb]{background-position:0px -425px}.files-icon.medium-icon.html-icon[data-v-0a2d98fb]{background-position:0px -450px}.files-icon.medium-icon.ico-icon[data-v-0a2d98fb]{background-position:0px -475px}.files-icon.medium-icon.java-icon[data-v-0a2d98fb]{background-position:0px -500px}.files-icon.medium-icon.js-icon[data-v-0a2d98fb]{background-position:0px -525px}.files-icon.medium-icon.bt_split_json-icon[data-v-0a2d98fb]{background-position:0px -550px}.files-icon.medium-icon.jpeg-icon[data-v-0a2d98fb]{background-position:0px -575px}.files-icon.medium-icon.jpg-icon[data-v-0a2d98fb]{background-position:0px -600px}.files-icon.medium-icon.json-icon[data-v-0a2d98fb]{background-position:0px -625px}.files-icon.medium-icon.log-icon[data-v-0a2d98fb]{background-position:0px -650px}.files-icon.medium-icon.lua-icon[data-v-0a2d98fb]{background-position:0px -675px}.files-icon.medium-icon.mkv-icon[data-v-0a2d98fb]{background-position:0px -700px}.files-icon.medium-icon.mov-icon[data-v-0a2d98fb]{background-position:0px -725px}.files-icon.medium-icon.mp4-icon[data-v-0a2d98fb]{background-position:0px -750px}.files-icon.medium-icon.mpg-icon[data-v-0a2d98fb]{background-position:0px -775px}.files-icon.medium-icon.mpeg-icon[data-v-0a2d98fb]{background-position:0px -800px}.files-icon.medium-icon.pdf-icon[data-v-0a2d98fb]{background-position:0px -825px}.files-icon.medium-icon.php-icon[data-v-0a2d98fb]{background-position:0px -850px}.files-icon.medium-icon.png-icon[data-v-0a2d98fb]{background-position:0px -875px}.files-icon.medium-icon.ppt-icon[data-v-0a2d98fb]{background-position:0px -900px}.files-icon.medium-icon.py-icon[data-v-0a2d98fb]{background-position:0px -925px}.files-icon.medium-icon.rm-icon[data-v-0a2d98fb]{background-position:0px -950px}.files-icon.medium-icon.rmvb-icon[data-v-0a2d98fb]{background-position:0px -975px}.files-icon.medium-icon.sh-icon[data-v-0a2d98fb]{background-position:0px -1000px}.files-icon.medium-icon.bt_split-icon[data-v-0a2d98fb]{background-position:0px -1025px}.files-icon.medium-icon.sql-icon[data-v-0a2d98fb]{background-position:0px -1050px}.files-icon.large-icon[data-v-0a2d98fb]{width:50px;height:50px;background-size:50px;background-position:0px -750px}.files-icon.large-icon.swf-icon[data-v-0a2d98fb]{background-position:0px 0px}.files-icon.large-icon.webm-icon[data-v-0a2d98fb]{background-position:0px -50px}.files-icon.large-icon.webp-icon[data-v-0a2d98fb]{background-position:0px -100px}.files-icon.large-icon.wma-icon[data-v-0a2d98fb]{background-position:0px -150px}.files-icon.large-icon.wmv-icon[data-v-0a2d98fb]{background-position:0px -200px}.files-icon.large-icon.xls-icon[data-v-0a2d98fb]{background-position:0px -250px}.files-icon.large-icon.xml-icon[data-v-0a2d98fb]{background-position:0px -300px}.files-icon.large-icon.access-icon[data-v-0a2d98fb]{background-position:0px -350px}.files-icon.large-icon.apk-icon[data-v-0a2d98fb]{background-position:0px -400px}.files-icon.large-icon.avi-icon[data-v-0a2d98fb]{background-position:0px -450px}.files-icon.large-icon.bmp-icon[data-v-0a2d98fb]{background-position:0px -500px}.files-icon.large-icon.cdr-icon[data-v-0a2d98fb]{background-position:0px -550px}.files-icon.large-icon.compress-icon[data-v-0a2d98fb]{background-position:0px -600px}.files-icon.large-icon.css-icon[data-v-0a2d98fb]{background-position:0px -650px}.files-icon.large-icon.doc-icon[data-v-0a2d98fb]{background-position:0px -700px}.files-icon.large-icon.file-icon[data-v-0a2d98fb]{background-position:0px -750px}.files-icon.large-icon.folder-icon[data-v-0a2d98fb]{background-position:0px -800px}.files-icon.large-icon.gif-icon[data-v-0a2d98fb]{background-position:0px -850px}.files-icon.large-icon.html-icon[data-v-0a2d98fb]{background-position:0px -900px}.files-icon.large-icon.ico-icon[data-v-0a2d98fb]{background-position:0px -950px}.files-icon.large-icon.java-icon[data-v-0a2d98fb]{background-position:0px -1000px}.files-icon.large-icon.js-icon[data-v-0a2d98fb]{background-position:0px -1050px}.files-icon.large-icon.bt_split_json-icon[data-v-0a2d98fb]{background-position:0px -1100px}.files-icon.large-icon.jpeg-icon[data-v-0a2d98fb]{background-position:0px -1150px}.files-icon.large-icon.jpg-icon[data-v-0a2d98fb]{background-position:0px -1200px}.files-icon.large-icon.json-icon[data-v-0a2d98fb]{background-position:0px -1250px}.files-icon.large-icon.log-icon[data-v-0a2d98fb]{background-position:0px -1300px}.files-icon.large-icon.lua-icon[data-v-0a2d98fb]{background-position:0px -1350px}.files-icon.large-icon.mkv-icon[data-v-0a2d98fb]{background-position:0px -1400px}.files-icon.large-icon.mov-icon[data-v-0a2d98fb]{background-position:0px -1450px}.files-icon.large-icon.mp4-icon[data-v-0a2d98fb]{background-position:0px -1500px}.files-icon.large-icon.mpg-icon[data-v-0a2d98fb]{background-position:0px -1550px}.files-icon.large-icon.mpeg-icon[data-v-0a2d98fb]{background-position:0px -1600px}.files-icon.large-icon.pdf-icon[data-v-0a2d98fb]{background-position:0px -1650px}.files-icon.large-icon.php-icon[data-v-0a2d98fb]{background-position:0px -1700px}.files-icon.large-icon.png-icon[data-v-0a2d98fb]{background-position:0px -1750px}.files-icon.large-icon.ppt-icon[data-v-0a2d98fb]{background-position:0px -1800px}.files-icon.large-icon.py-icon[data-v-0a2d98fb]{background-position:0px -1850px}.files-icon.large-icon.rm-icon[data-v-0a2d98fb]{background-position:0px -1900px}.files-icon.large-icon.rmvb-icon[data-v-0a2d98fb]{background-position:0px -1950px}.files-icon.large-icon.sh-icon[data-v-0a2d98fb]{background-position:0px -2000px}.files-icon.large-icon.bt_split-icon[data-v-0a2d98fb]{background-position:0px -2050px}.files-icon.large-icon.sql-icon[data-v-0a2d98fb]{background-position:0px -2100px}\n/*$vite$:1*/",document.head.appendChild(J),t({$:G,A:At,B:nt,C:function(t){return!!["file-txt","file-json","file-html","file-css","file-js","file-php","file-doc","file-sh"].includes(It(t.ext))},D:Jt,E:Z,G:function(t,e){const{currentPath:i}=t;"dir"==e.type?(i.value="/"==i.value?`/${e.nm}`:i.value+"/"+e.nm,W(t)):$t(e)?nt(t,e.path):Jt(e.ext)?Bt(t,"Decompress",t=>t.value.open()):Et(e.ext)?st(t,e):Ot(t)},H:tt,I:rt,K:async function(t,e){const{close:a}=P.loading("Processing, please wait...");try{await K("tamper_core",71);const{message:a}=await C.post("/tamper_core/get_effective_path.json",{path:e.path},{requestOptions:{isOriginalResult:!0}});if(R(a)&&a.status){const{data:n}=a;"dir"===e.type?function(t,e,i){const{pid:a,lock:n,action:s}=i,o=(n?"Turning off protection ":"Turning on protection ")+`[${e.path}]`,l=Y(n?"file.tableController.afterTurningOffProtectionDir":"file.tableController.afterTurningOnProtectionDir");q({width:480,title:o,content:l,onConfirm:async()=>{if("create"===s[0]&&0===a)return await it(e.path,[]),void W(t);const i=[];n?i.push({key:-1!=e.path.indexOf("/www/server/panel/class")?"add_wd":s[0],values:[e.path]}):i.push({key:s[0],values:[e.path]}),await at(a,i),W(t)}})}(t,e,n):function(t,e,a){const{pid:n,lock:s,action:o}=a,l=Y(s?"file.tableController.turningOffProtection":"file.tableController.turningOnProtection",{path:e.path}),c=Y(s?"file.tableController.afterTurningOffProtectionFile":"file.tableController.afterTurningOnProtectionFile"),u=i(!1),d=i(!0);q({title:l,width:480,content:()=>r(p,null,[r("div",null,[c]),r("div",{class:"mt-8px"},[r(I,{checked:d.value,"onUpdate:checked":t=>d.value=t},{default:()=>[r("span",null,[Y(s?"file.tableController.turningOffProtectionFile":"file.tableController.turningOnProtectionFile",{path:e.nm})])]})]),r("div",{class:"mt-8px"},[r(I,{checked:u.value,"onUpdate:checked":t=>u.value=t},{default:()=>[r("span",null,[Y(s?"file.tableController.turningOffProtectionSuffix":"file.tableController.turningOnProtectionSuffix",{suffix:e.ext})])]})])]),onConfirm:async()=>{if("create"===o[0]&&0===n){const i=e.path.substring(0,e.path.lastIndexOf("/")),a=[];if(d.value){const t=e.path.split("/"),i=t.length>=2?t[t.length-2]:"";a.push(`${i}/${e.nm}`)}return u.value&&a.push("."+e.ext),await it(i,a),void W(t)}const i=[];s?(d.value&&(i.push({key:"remove_bf",values:[e.path]}),i.push({key:"add_wf",values:[e.path]})),u.value&&i.push({key:"remove_bf",values:["."+e.ext]})):(d.value&&(i.push({key:"add_bf",values:[e.path]}),i.push({key:"remove_wf",values:[e.path]})),u.value&&i.push({key:"add_bf",values:["."+e.ext]})),await at(n,i),W(t)}})}(t,e,n)}}finally{a()}},L:A,M:Pt,N:Ot,O:B,P:async function(t){if(document.querySelector(".file-task-modal"))return;const{message:i}=await pt();j(i)&&i.length>0&&T({title:Y("file.tableController.realtimeTaskQueue"),width:510,class:"file-task-modal",unstableShowMask:!1,data:{store:t,taskList:i},component:o(()=>O(()=>e.import("./FileTask-legacy.js?v=1769066082311"),void 0))})},Q:async function(){await async function(){await w("/static/vite/oldjs/jquery-2.2.4.min.js?v=1769066082311"),await w("/static/layer/layer.js?v=1769066082311"),await w("/static/vite/oldjs/jsencrypt.min.js?v=1769066082311"),await w("/static/language/English/lan.js?v=1769066082311"),await w("/static/ace/ace.js?v=1769066082311"),await w("/static/ace/ext-language_tools.js?v=1769066082311"),await w("/static/vite/oldjs/polyfill.min.js?v=1769066082311"),await w("/static/vite/oldjs/public.js?v=1769066082311"),await w("/static/vite/oldjs/public_backup.js?v=1769066082311")}(),window.usePay=M,$("#file-main").append('\n\t\t - - - - - - - - - - + + + + + + + + + + @@ -55,7 +55,7 @@
- - + + diff --git a/BTTask/brain.py b/BTTask/brain.py index 59a8c5ec..d894b76f 100644 --- a/BTTask/brain.py +++ b/BTTask/brain.py @@ -11,7 +11,7 @@ # ------------------------------ import os import sys -from typing import Callable, Tuple, Type, TypeVar, List +from typing import Callable, Type, TypeVar, List, Dict sys.path.insert(0, "/www/server/panel/class/") @@ -20,11 +20,13 @@ import threading import heapq import psutil from dataclasses import dataclass, field, fields -from concurrent.futures import ThreadPoolExecutor, Future, wait +from concurrent.futures import ThreadPoolExecutor, Future from BTTask.conf import logger, CHILD_PID_PATH T = TypeVar("T", bound="TaskInfo") +CPU_COUNT = psutil.cpu_count() + @dataclass(order=True) class TaskInfo: @@ -35,6 +37,7 @@ class TaskInfo: func: Callable = field(compare=False) interval: int | float is_core: bool + loop: bool = True @classmethod def from_dict(cls: Type[T], data: dict, next_run: float) -> T: @@ -46,28 +49,59 @@ class TaskInfo: class SimpleBrain: + MAXFACTOR = 5.0 # 最大延迟因子 + MEM_LIMIT_MB = 100 # 内存限制 + MAX_WORKER = 16 # 最大线程数 + DEFAULT_WORKER = max(4, CPU_COUNT) # 默认线程数 + CHECKER_INTERVAL = 10 # 检查器间隔时间/秒 + TIMEOUT_FACTOR = 2 # 任务超时倍率 + TASK_MAX_TIMEOUT = 6 * 3600.0 # 任务最大超时6小时 + __slots__ = ( - "cpu_max", "max_workers", "executor", "task_queue", "queue_lock", - "task_status", "status_lock", "core_tasks", "delay_factor", - "shutdown_flag", "_start_time", + "cpu_max", "workers", "executor", "task_queue", "queue_lock", + "task_status", "status_lock", "core_status_lock", "core_tasks", "delay_factor", + "shutdown", "mem_limit", "pool_full_count", ) - def __init__(self, cpu_max: float = 30.0, max_workers: int = None): + def __init__(self, cpu_max: float = 30.0, workers: int = None, mem_limit: int = None): self.cpu_max = cpu_max - self.max_workers = max_workers or max(2, psutil.cpu_count() * 2) - logger.debug(f"max_workers = {self.max_workers}") + self.workers = min(self.MAX_WORKER, workers or self.DEFAULT_WORKER) + self.mem_limit = mem_limit or self.MEM_LIMIT_MB + logger.debug(f"max_workers = {self.workers}, mem_limit = {self.mem_limit}MB") self.task_queue: List[TaskInfo] = [] - self.task_status = {} self.queue_lock = threading.RLock() self.status_lock = threading.RLock() - self.core_tasks = {} - self.shutdown_flag = False + self.core_status_lock = threading.RLock() + self.core_tasks: Dict[str, tuple[threading.Thread, tuple[Callable, int]]] = {} + self.task_status: Dict[str, tuple[float, float, Future]] = {} + self.shutdown = False self.delay_factor = 0.0 - self._start_time = time.monotonic() - self.executor = ThreadPoolExecutor(max_workers=self.max_workers) + self.pool_full_count = 0 + self.executor = ThreadPoolExecutor(max_workers=self.workers) self._start_checker() logger.debug("SimpleBrain initialized") + def _auto_pool(self): + """自适应扩容池""" + cpu = psutil.cpu_percent(interval=0.1) + new_size = None + # 扩容, 任务堆积 + if all([ + self.pool_full_count >= (60 // self.CHECKER_INTERVAL), # 1min内连续满载 + cpu < 80, # 在CPU未过载时进行线程扩容 + self.workers < self.MAX_WORKER + ]): + new_size = min(self.workers + 2, self.MAX_WORKER) + # else: # 缩容 + + if new_size and new_size != self.workers: + logger.warning(f"Resize Task Pool from {self.workers} to {new_size}...") + self._shutdown() + os.system( + f"nohup /www/server/panel/BT-Task --max-workers {new_size} >> /www/server/panel/logs/task.log 2>&1 &" + ) + os._exit(0) + @property def queue_size(self) -> int: with self.queue_lock: @@ -76,35 +110,28 @@ class SimpleBrain: @property def get_current_process_memory(self): """返回当前进程内存MB""" - p = psutil.Process(os.getpid()) - info = p.memory_info() - rss_mb = round(info.rss / 1024 / 1024, 2) - uss_mb = None - try: - uss_mb = round(p.memory_full_info().uss / 1024 / 1024, 2) - except Exception: - pass - return {"rss_mb": rss_mb, "uss_mb": uss_mb} + return round(psutil.Process().memory_info().rss / 1024 / 1024, 2) - def __mem_limit(self, rss: int): - if rss >= 100: + def __mem_limit(self, current_mem: float = None): + if not current_mem: + current_mem = self.get_current_process_memory + if current_mem >= self.mem_limit: logger.warning("Memory exceed limit...Restart brain task") - self.shutdown() - # ps: mian has been checked Task process + self._shutdown() os.system( "nohup /www/server/panel/BT-Task >> /www/server/panel/logs/task.log 2>&1 &" ) + os._exit(0) def __core_alive(self): - with self.status_lock: + with self.core_status_lock: dead_tasks = [ - task_id for task_id, task_info in self.core_tasks.items() - if not task_info["thread"].is_alive() + task_id for task_id, (thread, _) in self.core_tasks.items() + if not thread.is_alive() ] for task_id in dead_tasks: logger.warning(f"Core task [{task_id}] is dead. Restarting...") - task_info = self.core_tasks[task_id] - args = task_info["args"] + _, args = self.core_tasks[task_id] thread = threading.Thread( target=self._core_task_runner, args=args, @@ -112,30 +139,80 @@ class SimpleBrain: name=f"CoreTask-{task_id}" ) thread.start() - self.core_tasks[task_id]["thread"] = thread + self.core_tasks[task_id] = (thread, args) + + def __normal_task_process(self, now_time: float) -> int: + """ + - 对于普通任务 deadline_ts != -1,如果超时则移除。 + - 对于循环任务 deadline_ts == -1,如果其 future非running,则移除。 + 返回当前运行中的所有普通任务数 + """ + + def _pop_task(tid_str: str): + self.clean_child(os.path.join(CHILD_PID_PATH, f"{tid_str}.pid")) + self.task_status.pop(tid_str, None) + + with self.status_lock: + for tid, info in list(self.task_status.items()): + if not info or len(info) != 3: + _pop_task(tid) + continue + + start_time, deadline_ts, future = info + if deadline_ts != -1: + if now_time > deadline_ts: + # 普通任务超时静默移除 + _pop_task(tid) + continue + + if future and not future.running(): + # loop任务异常移除 + _pop_task(tid) + return len(self.task_status) def __checker(self): - count = 0 - while not self.shutdown_flag: + resize_check_interval = 60 # 每1min检查一次是否需要扩容 + last_check_time = time.monotonic() + last_resize_check = time.monotonic() + + while not self.shutdown: try: cpu = psutil.cpu_percent(interval=0.5) - if count >= 5: - count = 0 - self.__core_alive() + now = time.monotonic() + # 每10s + now_time = time.time() + if now - last_check_time > self.CHECKER_INTERVAL: + last_check_time = now mem = self.get_current_process_memory - logger.debug("Mem: {} MB, CPU: {}%".format(mem["rss_mb"], cpu)) - self.__mem_limit(int(mem.get("rss_mb", 0))) + self.__mem_limit(mem) # 内存阈值检测 + self.__core_alive() + running_tasks = self.__normal_task_process(now_time) + rate = (running_tasks / self.workers) * 100 + logger.debug( + f"Mem: {mem} MB, CPU: {cpu}%, " + f"Pool: {running_tasks}/{self.workers} ({rate:.1f}%)" + ) + if rate >= 90.0: # 高负荷计数 + self.pool_full_count += 1 + else: # 重置计数 + self.pool_full_count = 0 + + # 每1min + if now - last_resize_check > resize_check_interval: + last_resize_check = now + self._auto_pool() + + if cpu > self.cpu_max: + self.delay_factor = min( + self.MAXFACTOR, + self.MAXFACTOR * (cpu - self.cpu_max) / (100.0 - self.cpu_max) + ) + elif self.delay_factor > 0: + self.delay_factor = max(0.0, self.delay_factor - 0.5) - if cpu <= self.cpu_max: - target = 0.0 - else: - target = 2.0 * (cpu - self.cpu_max) / (100.0 - self.cpu_max) - self.delay_factor = max(0.0, min(2.0, target)) - time.sleep(0.5) - count += 1 except Exception as e: logger.error(f"cpu mem checker error: {e}") - time.sleep(3) + time.sleep(5) def _start_checker(self): threading.Thread( @@ -144,52 +221,63 @@ class SimpleBrain: def _callback(self, task_id: str, future: Future): try: - future.result(timeout=0.5) + future.result() except Exception as e: logger.error(f"task error [{task_id}]: {str(e)}") finally: with self.status_lock: - try: - status = self.task_status.pop(task_id) - logger.debug( - f"task done [{task_id}] use time: {round(time.time() - status['start_time'], 2)}s" - ) - except Exception: - logger.info(f"task done [{task_id}]") + info = self.task_status.pop(task_id, None) + if not info: + logger.info(f"task done [{task_id}]") + return + start_time, _, _ = info + logger.debug( + f"task done [{task_id}] use time: {round(time.time() - start_time, 2)}s" + ) - def _core_task_runner(self, funcs: Callable | List[Callable], interval: float): + def _run_func_safe(self, func: Callable): + """捕获异常""" try: - while 1: - if not isinstance(funcs, list): - try: - funcs() - except Exception: - import traceback - logger.error(traceback.format_exc()) - else: - for f in funcs: - try: - f() - except Exception: - import traceback - logger.error(traceback.format_exc()) - continue - time.sleep(interval) + func() except Exception: import traceback logger.error(traceback.format_exc()) - def _submit_task(self, tasks: List[Tuple[str, Callable, bool]]): - for task_id, func in tasks: - future: Future = self.executor.submit(func) - with self.status_lock: - self.task_status[task_id] = { - "start_time": time.time(), - "future": future - } - future.add_done_callback( - lambda f, tid=task_id: self._callback(tid, f) - ) + def _core_task_runner(self, funcs: Callable | List[Callable], interval: float): + funcs = funcs if isinstance(funcs, list) else [funcs] + while 1: + for f in funcs: + self._run_func_safe(f) + time.sleep(interval) + + def _submit_task(self, tasks: List[TaskInfo]): + for task in tasks: + start_time = time.time() + # 超时值: 自身任务间隔 * 超时倍率, 最大限制 + if not task.loop: + timeout_sec = min( + self.TASK_MAX_TIMEOUT, (max(1.0, float(task.interval) * self.TIMEOUT_FACTOR)) + ) + deadline_ts = start_time + timeout_sec + else: + deadline_ts = -1 # 无限期 + + future = None + try: + with self.status_lock: + future = self.executor.submit(task.func) + self.task_status[task.task_id] = ( + start_time, deadline_ts, future + ) + future.add_done_callback( + lambda f, tid=task.task_id: self._callback(tid, f) + ) + except Exception as e: + logger.error(f"Failed to submit task [{task.task_id}]: {e}") + # 无条件确保清理状态 + with self.status_lock: + self.task_status.pop(task.task_id, None) + continue # ========================== Public ======================================= def register_task(self, **kwargs): @@ -210,80 +298,94 @@ class SimpleBrain: logger.debug( f"registe core task [{task_id}], interval [{kwargs['interval']}]" ) - with self.status_lock: - self.core_tasks[task_id] = {"thread": core_thread, "args": args} + with self.core_status_lock: + self.core_tasks[task_id] = (core_thread, args) else: # not core task, heapq, pool with self.queue_lock: - if not any(t.task_id == kwargs.get("task_id", "") for t in self.task_queue): - task = TaskInfo.from_dict( - kwargs, next_run=time.monotonic() - ) + if task_id not in {t.task_id for t in self.task_queue}: + task = TaskInfo.from_dict(kwargs, next_run=time.monotonic()) heapq.heappush(self.task_queue, task) logger.debug( f"register normal task [{task_id}], interval [{task.interval}s]" ) @staticmethod - def clean_child(): + def clean_child(pid_path: str = None): # 清理进程, 防泄漏 - if os.path.exists(CHILD_PID_PATH): - for pid_file in os.listdir(CHILD_PID_PATH): - pid_path = os.path.join(CHILD_PID_PATH, pid_file) + def _clean_single(path): + if not os.path.exists(path) or not path.endswith(".pid"): + return + try: + with open(path, "r") as pf: + pid = int(pf.read().strip()) + psutil.Process(pid).kill() + except (psutil.NoSuchProcess, psutil.AccessDenied, FileNotFoundError, ValueError): + pass + except Exception: + pass + finally: try: - with open(pid_path, 'r') as pf: - pid = int(pf.read().strip()) - proc = psutil.Process(pid) - proc.kill() - except (psutil.NoSuchProcess, psutil.AccessDenied, FileNotFoundError): + os.remove(path) + except Exception: pass - finally: - try: - os.remove(pid_path) - except OSError: - pass + + if not pid_path: + # 清理所有子进程 + if not os.path.exists(CHILD_PID_PATH): + return + for pid_file in os.listdir(CHILD_PID_PATH): + _clean_single(os.path.join(CHILD_PID_PATH, pid_file)) + else: # 清理指定子进程 + _clean_single(pid_path) def run(self): self.clean_child() - while not self.shutdown_flag: + while not self.shutdown: now = time.monotonic() - tasks = [] with self.queue_lock: + ready_tasks = [] while self.task_queue and self.task_queue[0].next_run <= now: - task: TaskInfo = heapq.heappop(self.task_queue) + ready_tasks.append(heapq.heappop(self.task_queue)) + next_run_time = self.task_queue[0].next_run if self.task_queue else now + 1.0 - with self.status_lock: - is_running = task.task_id in self.task_status + submit = [] + requeue = [] + for task in ready_tasks: + with self.status_lock: + is_running = task.task_id in self.task_status - if is_running: - logger.warning(f"still running, {task.task_id}") - task.next_run += task.interval - heapq.heappush(self.task_queue, task) - continue - - if self.delay_factor >= 0.2: - # 指数退避 - logger.warning(f"cpu overload, requeue [{task.task_id}]") - task.next_run += 1.1 * (1.0 + self.delay_factor) - heapq.heappush(self.task_queue, task) - continue - - # 归队 + if is_running: + logger.debug(f"still running, {task.task_id}") task.next_run = now + task.interval - heapq.heappush(self.task_queue, task) - tasks.append( - (task.task_id, task.func) - ) - if tasks: - self._submit_task(tasks) + requeue.append(task) + continue - next_time = self.task_queue[0].next_run if self.task_queue else now + 1.0 - # [0.01, 1.0] - delay_time = max(0.01, min(1.0, next_time - now)) - time.sleep(delay_time) + if self.delay_factor > 0: + # 指数退避 + logger.debug(f"cpu overload, requeue [{task.task_id}]") + task.next_run = now + 1.5 * (1.0 + self.delay_factor) + requeue.append(task) + continue - def shutdown(self, timeout: int = 10): - self.shutdown_flag = True + # 更新间隔, 准备提交, 归队 + task.next_run = now + task.interval + requeue.append(task) + submit.append(task) + + if requeue: + with self.queue_lock: + for task in requeue: + heapq.heappush(self.task_queue, task) + next_run_time = self.task_queue[0].next_run + + if submit: + self._submit_task(submit) + + time.sleep(max(0.01, min(1.0, next_run_time - now))) + + def _shutdown(self): + self.shutdown = True logger.warning("shutdown...") with self.queue_lock: @@ -291,18 +393,15 @@ class SimpleBrain: self.task_queue.clear() with self.status_lock: - futures = [s["future"] for s in self.task_status.values()] + running = len(self.task_status) self.task_status.clear() - if futures: - done, not_done = wait(futures, timeout=timeout) - for f in not_done: - f.cancel() - logger.warning( - f"shutdown complete, {len(done)} tasks finished, " - f"{len(not_done)} tasks cancelled, " - f"{pending} tasks discarded" - ) + with self.core_status_lock: + self.core_tasks.clear() + + logger.warning( + f"shutdown complete, {running} tasks cancelled, {pending} tasks discarded" + ) self.executor.shutdown(wait=False) self.clean_child() diff --git a/BTTask/conf.py b/BTTask/conf.py index 488c3830..352a49d7 100644 --- a/BTTask/conf.py +++ b/BTTask/conf.py @@ -17,7 +17,6 @@ import os __all__ = [ "BASE_PATH", "CURRENT_TASK_VERSION", - "pre", "PYTHON_BIN", "isTask", "exlogPath", @@ -34,7 +33,6 @@ CURRENT_TASK_VERSION = "1.0.1" TASK_LOG_FILE = f"{BASE_PATH}/logs/task.log" # 旧常量 -pre = 0 isTask = "/tmp/panelTask.pl" exlogPath = "/tmp/panelExec.log" @@ -64,4 +62,11 @@ logging.basicConfig( filename=TASK_LOG_FILE, filemode="a+", ) +logging.getLogger("pyroute2").setLevel(logging.ERROR) +logging.getLogger("pyroute2").propagate = False +for name in ("pyroute2.netlink", "pyroute2.netlink.core"): + lg = logging.getLogger(name) + lg.setLevel(logging.ERROR) + lg.propagate = False + logger = logging.getLogger() diff --git a/BTTask/task.py b/BTTask/task.py index bf9bb896..934fc6b8 100644 --- a/BTTask/task.py +++ b/BTTask/task.py @@ -11,45 +11,97 @@ # ------------------------------ # aa Background Schedule Task # ------------------------------ - -import importlib +import gc import json import os -import re -import shutil +import subprocess import sys import threading import time +import traceback from datetime import datetime, timedelta from typing import Optional import psutil sys.path.insert(0, "/www/server/panel/class/") -import db -import public -from panelTask import bt_task +from public.hook_import import hook_import try: - from public.hook_import import hook_import - hook_import() -except Exception: +except: pass +import db +from panelTask import bt_task +from script.restart_services import RestartServices from BTTask.brain import SimpleBrain from BTTask.conf import ( BASE_PATH, - CURRENT_TASK_VERSION, PYTHON_BIN, exlogPath, isTask, logger, ) -# 非标准库等任务依赖导入请在函数中延迟导入 -global pre +def write_file(path: str, content: str, mode='w'): + try: + fp = open(path, mode) + fp.write(content) + fp.close() + return True + except: + try: + fp = open(path, mode, encoding="utf-8") + fp.write(content) + fp.close() + return True + except: + return False + + +def read_file(filename: str): + fp = None + try: + fp = open(filename, "rb") + f_body_bytes: bytes = fp.read() + f_body = f_body_bytes.decode("utf-8", errors='ignore') + fp.close() + return f_body + except Exception: + return False + finally: + if fp and not fp.closed: + fp.close() + + +def exec_shell(cmdstring, timeout=None, shell=True, cwd=None): + """ + @name 执行命令 + @param cmdstring 命令 [必传] + @param timeout 超时时间 + @param shell 是否通过shell运行 + @return 命令执行结果 + """ + try: + result = subprocess.run( + cmdstring, + shell=shell, + cwd=cwd, + timeout=timeout, + capture_output=True, + text=True, # 直接以文本模式处理输出 + encoding='utf-8', + errors='ignore', + env=os.environ + ) + return result.stdout, result.stderr + except subprocess.TimeoutExpired: + return 'Timed out', '' + except Exception: + return '', traceback.format_exc() + task_obj = bt_task() task_obj.not_web = True @@ -61,7 +113,7 @@ def task_ExecShell(fucn_name: str, **kw): 仅运行 /www/server/panel/BTTask/task_script.py 下的包装函数 可通过 kw 参数扩展前置检查,例如: - kw['paths_exists']: List [str] - (例如, 检查邮局插件是否存在 + (例如, 检查邮局插件是否存在, 任何一个检查不存在则不执行 paths_exists=['/www/server/panel/plugin/mail_sys/mail_sys_main.py', '/www/vmail']) """ @@ -72,13 +124,13 @@ def task_ExecShell(fucn_name: str, **kw): for p in kw["paths_exists"]: try: if not os.path.exists(str(p)): - logger.debug(f"Skip task [{fucn_name}]: path exists check failed - '{p}' not found") + logger.debug(f"Skip task [{fucn_name}]: path not exists") return except Exception as e: raise ValueError(f"Invalid path in paths_exists: '{p}', error: {e}") cmd = f"{PYTHON_BIN} /www/server/panel/BTTask/task_script.py {fucn_name}" - _, err = public.ExecShell(cmd) + _, err = exec_shell(cmd) if err: raise Exception(err) del err, cmd @@ -87,301 +139,220 @@ def task_ExecShell(fucn_name: str, **kw): # 系统监控任务 # noinspection PyUnusedLocal def systemTask(): - def GetMemUsed(): + cycle = 60 + control_conf = f"{BASE_PATH}/data/control.conf" + + def get_mem_used_percent() -> float: try: mem = psutil.virtual_memory() - memInfo = {'memTotal': mem.total / 1024 / 1024, 'memFree': mem.free / 1024 / 1024, - 'memBuffers': mem.buffers / 1024 / 1024, 'memCached': mem.cached / 1024 / 1024} - tmp = memInfo['memTotal'] - memInfo['memFree'] - \ - memInfo['memBuffers'] - memInfo['memCached'] - tmp1 = memInfo['memTotal'] / 100 - return tmp / tmp1 - except: - return 1 + total = mem.total / 1024 / 1024 + free = mem.free / 1024 / 1024 + buffers = getattr(mem, "buffers", 0) / 1024 / 1024 + cached = getattr(mem, "cached", 0) / 1024 / 1024 + used = total - free - buffers - cached + return used / (total / 100.0) if total else 1.0 + except Exception: + return 1.0 - def GetLoadAverage(): - c = os.getloadavg() - data = { - 'one': float(c[0]), - 'five': float(c[1]), - 'fifteen': float(c[2]), - 'max': psutil.cpu_count() * 2 + def get_load_average(): + one, five, fifteen = os.getloadavg() + max_v = psutil.cpu_count() * 2 + return { + "one": float(one), + "five": float(five), + "fifteen": float(fifteen), + "max": max_v, + "limit": max_v, + "safe": max_v * 0.75, } - data['limit'] = data['max'] - data['safe'] = data['max'] * 0.75 - return data - cycle = 60 - try: - filename = '{}/data/control.conf'.format(BASE_PATH) + def ensure_tables(): with db.Sql() as sql: - sql = sql.dbfile('system') + sql = sql.dbfile("system") + sql.execute( + """CREATE TABLE IF NOT EXISTS `load_average`( + `id` INTEGER PRIMARY KEY KEY AUTOINCREMENT, + `pro` REAL, `one` REAL, `five` REAL, `fifteen` REAL, `addtime` INTEGER + )""", + (), + ) + sql.execute( + """CREATE TABLE IF NOT EXISTS `network`( + `id` INTEGER PRIMARY KEY KEY AUTOINCREMENT, + `up` INTEGER, `down` INTEGER, `total_up` INTEGER, `total_down` INTEGER, + `down_packets` INTEGER, `up_packets` INTEGER, `addtime` INTEGER + )""", + (), + ) + sql.execute( + """CREATE TABLE IF NOT EXISTS `cpuio`( + `id` INTEGER PRIMARY KEY KEY AUTOINCREMENT, + `pro` INTEGER, `mem` INTEGER, `addtime` INTEGER + )""", + (), + ) + sql.execute( + """CREATE TABLE IF NOT EXISTS `diskio`( + `id` INTEGER PRIMARY KEY KEY AUTOINCREMENT, + `read_count` INTEGER, `write_count` INTEGER, + `read_bytes` INTEGER, `write_bytes` INTEGER, + `read_time` INTEGER, `write_time` INTEGER, + `addtime` INTEGER + )""", + (), + ) - csql = '''CREATE TABLE IF NOT EXISTS `load_average` - ( - `id` - INTEGER - PRIMARY - KEY - AUTOINCREMENT, - `pro` - REAL, - `one` - REAL, - `five` - REAL, - `fifteen` - REAL, - `addtime` - INTEGER - )''' + def read_keep_days() -> int: + try: + day = int(read_file(control_conf) or 30) + return day if day >= 1 else 0 + except Exception: + return 30 - network_sql = '''CREATE TABLE IF NOT EXISTS `network` - ( - `id` - INTEGER - PRIMARY - KEY - AUTOINCREMENT, - `up` - INTEGER, - `down` - INTEGER, - `total_up` - INTEGER, - `total_down` - INTEGER, - `down_packets` - INTEGER, - `up_packets` - INTEGER, - `addtime` - INTEGER - )''' + def collect_network(net_up, net_down): + net_io = psutil.net_io_counters(pernic=True) + up_total = down_total = 0 + up = down = 0.0 + down_packets = {} + up_packets = {} - cpuio_sql = '''CREATE TABLE IF NOT EXISTS `cpuio` - ( - `id` - INTEGER - PRIMARY - KEY - AUTOINCREMENT, - `pro` - INTEGER, - `mem` - INTEGER, - `addtime` - INTEGER - )''' + for nic, counters in net_io.items(): + sent, recv = counters[:2] + if nic not in net_up: + net_up[nic] = sent + net_down[nic] = recv - diskio_sql = '''CREATE TABLE IF NOT EXISTS `diskio` - ( - `id` - INTEGER - PRIMARY - KEY - AUTOINCREMENT, - `read_count` - INTEGER, - `write_count` - INTEGER, - `read_bytes` - INTEGER, - `write_bytes` - INTEGER, - `read_time` - INTEGER, - `write_time` - INTEGER, - `addtime` - INTEGER - )''' + up_total += sent + down_total += recv - sql.execute(csql, ()) - sql.execute(network_sql, ()) - sql.execute(cpuio_sql, ()) - sql.execute(diskio_sql, ()) + dp = round(float((recv - net_down[nic]) / 1024) / cycle, 2) + up_p = round(float((sent - net_up[nic]) / 1024) / cycle, 2) + down_packets[nic] = dp + up_packets[nic] = up_p + up += up_p + down += dp - sql.close() + net_up[nic] = sent + net_down[nic] = recv - count = 0 - reloadNum = 0 - diskio_1 = diskio_2 = networkInfo = cpuInfo = diskInfo = None - network_up = {} - network_down = {} + return { + "upTotal": up_total, + "downTotal": down_total, + "up": up, + "down": down, + "downPackets": down_packets, + "upPackets": up_packets, + } + + diskstats_exists = os.path.exists("/proc/diskstats") + diskio_prev = None + + try: + ensure_tables() import process_task proc_task_obj = process_task.process_task() - + net_up, net_down = {}, {} while True: - if not os.path.exists(filename): + if not os.path.exists(control_conf): + time.sleep(10) + continue + keep_days = read_keep_days() + if keep_days < 1: time.sleep(10) continue - - day = 30 - try: - day = int(public.readFile(filename)) - if day < 1: - time.sleep(10) - continue - except: - day = 30 - addtime = int(time.time()) - deltime = addtime - (day * 86400) - # 取当前CPU Io - tmp = {'used': proc_task_obj.get_monitor_list(addtime), 'mem': GetMemUsed()} - cpuInfo = tmp - - # 取当前网络Io - networkIo_list = psutil.net_io_counters(pernic=True) - tmp = {'upTotal': 0, 'downTotal': 0, 'up': 0, 'down': 0, 'downPackets': {}, 'upPackets': {}} - - for k in networkIo_list.keys(): - networkIo = networkIo_list[k][:4] - if not k in network_up.keys(): - network_up[k] = networkIo[0] - network_down[k] = networkIo[1] - - tmp['upTotal'] += networkIo[0] - tmp['downTotal'] += networkIo[1] - tmp['downPackets'][k] = round( - float((networkIo[1] - network_down[k]) / 1024) / cycle, 2) - tmp['upPackets'][k] = round( - float((networkIo[0] - network_up[k]) / 1024) / cycle, 2) - tmp['up'] += tmp['upPackets'][k] - tmp['down'] += tmp['downPackets'][k] - - network_up[k] = networkIo[0] - network_down[k] = networkIo[1] - - networkInfo = tmp - - # 取磁盘Io - disk_ios = True + deltime = addtime - (keep_days * 86400) try: - if os.path.exists('/proc/diskstats'): - diskio_2 = psutil.disk_io_counters() + cpu_used = proc_task_obj.get_monitor_list(addtime) + mem_used = get_mem_used_percent() + network_info = collect_network(net_up, net_down) + disk_info = None + disk_ios_ok = True + if diskstats_exists: + try: + diskio_now = psutil.disk_io_counters() + if diskio_prev is None: + diskio_prev = diskio_now + disk_info = { + "read_count": int((diskio_now.read_count - diskio_prev.read_count) / cycle), + "write_count": int((diskio_now.write_count - diskio_prev.write_count) / cycle), + "read_bytes": int((diskio_now.read_bytes - diskio_prev.read_bytes) / cycle), + "write_bytes": int((diskio_now.write_bytes - diskio_prev.write_bytes) / cycle), + "read_time": int((diskio_now.read_time - diskio_prev.read_time) / cycle), + "write_time": int((diskio_now.write_time - diskio_prev.write_time) / cycle), + } + diskio_prev = diskio_now + except Exception: + disk_ios_ok = False + load_average = get_load_average() + lpro = round((load_average["one"] / load_average["max"]) * 100, 2) if load_average["max"] else 0 + if lpro > 100: + lpro = 100 - if not diskio_1: - diskio_1 = diskio_2 - tmp = {'read_count': int((diskio_2.read_count - diskio_1.read_count) / cycle), - 'write_count': int((diskio_2.write_count - diskio_1.write_count) / cycle), - 'read_bytes': int((diskio_2.read_bytes - diskio_1.read_bytes) / cycle), - 'write_bytes': int((diskio_2.write_bytes - diskio_1.write_bytes) / cycle), - 'read_time': int((diskio_2.read_time - diskio_1.read_time) / cycle), - 'write_time': int((diskio_2.write_time - diskio_1.write_time) / cycle)} - - if not diskInfo: - diskInfo = tmp - - diskInfo['read_count'] = tmp['read_count'] - diskInfo['write_count'] = tmp['write_count'] - diskInfo['read_bytes'] = tmp['read_bytes'] - diskInfo['write_bytes'] = tmp['write_bytes'] - diskInfo['read_time'] = tmp['read_time'] - diskInfo['write_time'] = tmp['write_time'] - - diskio_1 = diskio_2 - except: - logger.info(public.get_error_info()) - disk_ios = False - - try: with db.Sql().dbfile("system") as sql: - data = (cpuInfo['used'], cpuInfo['mem'], addtime) - sql.table('cpuio').add('pro,mem,addtime', data) - sql.table('cpuio').where("addtime 100: - lpro = 100 - sql.table('load_average').add('pro,one,five,fifteen,addtime', - (lpro, load_average['one'], load_average['five'], - load_average['fifteen'], - addtime)) - sql.table('load_average').where("addtime 1440: - reloadNum = 0 + if diskstats_exists and disk_ios_ok and disk_info: + sql.table("diskio").add( + "read_count,write_count,read_bytes,write_bytes,read_time,write_time,addtime", + ( + disk_info["read_count"], + disk_info["write_count"], + disk_info["read_bytes"], + disk_info["write_bytes"], + disk_info["read_time"], + disk_info["write_time"], + addtime, + ), + ) + sql.table("diskio").where("addtime /dev/null".format(BASE_PATH) -# ) -# del lets_info -# except Exception as e: -# raise e - -# 更新PID文件 -def update_pid_file(pid): - pid_file = "{}/logs/panel.pid".format(public.get_panel_path()) - try: - with open(pid_file, 'w') as f: - f.write(str(pid)) - logger.info(f'Updated panel PID file with PID {pid}') - except Exception as e: - logger.error(f'Error writing to PID file: {e}') - - # 服务守护 def daemon_service(): try: - from script import restart_services - importlib.reload(restart_services) - obj = restart_services.RestartServices() - obj.main() - del obj - except Exception: - from script.restart_services import RestartServices obj = RestartServices() obj.main() del obj + finally: + gc.collect() # 重启面板服务 @@ -408,14 +379,12 @@ def restart_panel(): def send_mail_time(): if not os.path.exists('/www/server/panel/plugin/mail_sys/mail_sys_main.py') or not os.path.exists('/www/vmail'): return - os.system("nohup " + PYTHON_BIN + " /www/server/panel/script/mail_task.py > /dev/null 2>&1 &") + exec_shell("{} /www/server/panel/script/mail_task.py".format(PYTHON_BIN)) # 面板消息提醒 def check_panel_msg(): - os.system( - 'nohup {} /www/server/panel/script/check_msg.py > /dev/null 2>&1 &'.format(PYTHON_BIN) - ) + exec_shell("{} /www/server/panel/script/check_msg.py".format(PYTHON_BIN)) # 面板推送消息 @@ -423,7 +392,7 @@ def push_msg(): def _read_file(file_path: str) -> Optional[list]: if not os.path.exists(file_path): return None - content = public.readFile(file_path) + content = read_file(file_path) if not content: return None try: @@ -442,14 +411,10 @@ def push_msg(): break if not work: return - - task_info = _read_file(task_path) or [] - if not task_info: + if not _read_file(task_path): return + exec_shell("{} /www/server/panel/script/push_msg.py".format(PYTHON_BIN)) - public.ExecShell( - 'nohup {} /www/server/panel/script/push_msg.py > /dev/null 2>&1 &'.format(PYTHON_BIN) - ) # 检测面板授权 @@ -463,7 +428,6 @@ def panel_auth(): except Exception as e: logger.error("Failed to import cache from BTPanel: {}".format(e)) cache = None - if cache: key = 'pro_check_sdfjslk' res = cache.get(key) @@ -476,139 +440,7 @@ def panel_auth(): def count_ssh_logs(): - """ - @name 统计SSH登录日志 - @return None - """ - - import json - - def parse_journal_disk_usage(output): - # 使用正则表达式来提取数字和单位 - match = re.search(r'take up (\d+(\.\d+)?)\s*([KMGTP]?)', output) - total_bytes = 0 - if match: - value = float(match.group(1)) # 数字 - unit = match.group(3) # 单位 - # 将所有单位转换为字节 - if unit == '': - unit_value = 1 - elif unit == 'K': - unit_value = 1024 - elif unit == 'M': - unit_value = 1024 * 1024 - elif unit == 'G': - unit_value = 1024 * 1024 * 1024 - elif unit == 'T': - unit_value = 1024 * 1024 * 1024 * 1024 - elif unit == 'P': - unit_value = 1024 * 1024 * 1024 * 1024 * 1024 - else: - unit_value = 0 - - # 计算总字节数 - total_bytes = value * unit_value - return total_bytes - - if os.path.exists("/etc/debian_version"): - version = public.readFile('/etc/debian_version') - if not version: - return - version = version.strip() - if 'bookworm' in version or 'jammy' in version or 'impish' in version: - version = 12 - else: - try: - version = float(version) - except: - version = 11 - - if version >= 12: - while True: - filepath = "/www/server/panel/data/ssh_login_counts.json" - - # 获取今天的日期 - today = datetime.now().strftime('%Y-%m-%d') - result = { - 'date': today, # 添加日期字段 - 'error': 0, - 'success': 0, - 'today_error': 0, - 'today_success': 0 - } - try: - filedata = public.readFile(filepath) if os.path.exists(filepath) else public.writeFile(filepath, - "[]") - try: - data_list = json.loads(filedata) - except: - data_list = [] - - # 检查是否已有今天的记录,避免重复统计 - found_today = False - for day in data_list: - if day['date'] == today: - found_today = True - break - - if found_today: - break # 如果找到今天的记录,跳出while循环 - - today_err_num1 = int(public.ExecShell( - "journalctl -u ssh --no-pager -S today |grep -a 'Failed password for' |grep -v 'invalid' |wc -l")[ - 0]) - - today_err_num2 = int(public.ExecShell( - "journalctl -u ssh --no-pager -S today |grep -a 'Connection closed by authenticating user' |grep -a 'preauth' |wc -l")[ - 0]) - - today_success = int( - public.ExecShell("journalctl -u ssh --no-pager -S today |grep -a 'Accepted' |wc -l")[0]) - - # 查看文件大小 判断是否超过5G - is_bigfile = False - - res, err = public.ExecShell("journalctl --disk-usage") - total_bytes = parse_journal_disk_usage(res) - limit_bytes = 5 * 1024 * 1024 * 1024 - if total_bytes > limit_bytes: - is_bigfile = True - - if is_bigfile: - err_num1 = int(public.ExecShell( - "journalctl -u ssh --since '30 days ago' --no-pager | grep -a 'Failed password for' | grep -v 'invalid' | wc -l")[ - 0]) - err_num2 = int(public.ExecShell( - "journalctl -u ssh --since '30 days ago' --no-pager --grep='Connection closed by authenticating user|preauth' | wc -l")[ - 0]) - success = int(public.ExecShell( - "journalctl -u ssh --since '30 days ago' --no-pager | grep -a 'Accepted' | wc -l")[0]) - else: - # 统计失败登陆次数 - err_num1 = int(public.ExecShell( - "journalctl -u ssh --no-pager |grep -a 'Failed password for' |grep -v 'invalid' |wc -l")[0]) - err_num2 = int(public.ExecShell( - "journalctl -u ssh --no-pager --grep='Connection closed by authenticating user|preauth' |wc -l")[ - 0]) - success = int(public.ExecShell("journalctl -u ssh --no-pager|grep -a 'Accepted' |wc -l")[0]) - result['error'] = err_num1 + err_num2 - # 统计成功登录次数 - result['success'] = success - result['today_error'] = today_err_num1 + today_err_num2 - result['today_success'] = today_success - - data_list.insert(0, result) - data_list = data_list[:7] - public.writeFile(filepath, json.dumps(data_list)) - except: - logger.error(public.get_error_info()) - public.writeFile(filepath, json.dumps([{ - 'date': today, # 添加日期字段 - 'error': 0, - 'success': 0, - 'today_error': 0, - 'today_success': 0 - }])) + task_ExecShell("count_ssh_logs") # 每天提交一次昨天的邮局发送总数 @@ -636,7 +468,7 @@ def mailsys_domain_restrictions(): yesterday = datetime.now() - timedelta(days=1) yesterday = yesterday.strftime('%Y-%m-%d') cloud_yesterday_submit = '{}/data/{}_update_mailsys_domain_restrictions.pl'.format( - public.get_panel_path(), yesterday + BASE_PATH, yesterday ) if os.path.exists(cloud_yesterday_submit): return @@ -646,21 +478,21 @@ def mailsys_domain_restrictions(): # 检查版本 检查是否能查询额度 剩余额度 import public.PluginLoader as plugin_loader - bulk = plugin_loader.get_module('{}/plugin/mail_sys/mail_send_bulk.py'.format(public.get_panel_path())) + bulk = plugin_loader.get_module('{}/plugin/mail_sys/mail_send_bulk.py'.format(BASE_PATH)) SendMailBulk = bulk.SendMailBulk try: SendMailBulk()._get_user_quota() except: - logger.error(public.get_error_info()) + logger.error(traceback.format_exc()) return # 添加标记 - public.writeFile(cloud_yesterday_submit, '1') + write_file(cloud_yesterday_submit, '1') # 删除前天标记 before_yesterday = datetime.now() - timedelta(days=2) before_yesterday = before_yesterday.strftime('%Y-%m-%d') cloud_before_yesterday_submit = '{}/data/{}_update_mailsys_domain_restrictions.pl'.format( - public.get_panel_path(), before_yesterday + BASE_PATH, before_yesterday ) if os.path.exists(cloud_before_yesterday_submit): os.remove(cloud_before_yesterday_submit) @@ -692,9 +524,8 @@ def mailsys_quota_alarm(): if not os.path.exists(script): return - time.sleep(3600) # 进入脚本前等待 和更新配额错开时间 cmd = f"btpython {script}" - public.ExecShell(cmd) + exec_shell(cmd) except: pass @@ -710,7 +541,7 @@ def mailsys_update_usage(): if not os.path.exists(script): return cmd = f"btpython {script}" - public.ExecShell(cmd) + exec_shell(cmd) except: pass @@ -743,13 +574,6 @@ def domain_ssl_service(): task_ExecShell("make_suer_ssl_task") -# 3小时一次检查DNS解析状态 -def dns_checker(): - os.system( - f"{PYTHON_BIN} /www/server/panel/class_v2/ssl_dnsV2/dns_manager.py" - ) - - # 每隔20分钟更新一次网站报表数据 def update_monitor_requests(): task_ExecShell("update_monitor_requests") @@ -772,32 +596,6 @@ def multi_web_server_daemon(): def soft_task(): # 执行面板soft corn之类的安装执行任务, from task.py -> def startTask(): - global pre - - # 下载文件 - def DownloadFile(url, filename): - try: - import urllib - import socket - socket.setdefaulttimeout(10) - # noinspection PyUnresolvedReferences - urllib.urlretrieve(url, filename=filename, reporthook=DownloadHook) - os.system('chown www.www ' + filename) - public.writeFile(exlogPath, 'done') - except: - public.writeFile(exlogPath, 'done') - - # 下载文件进度回调 - def DownloadHook(count, blockSize, totalSize): - global pre - used = count * blockSize - pre1 = int((100.0 * used / totalSize)) - if pre == pre1: - return - speed = {'total': totalSize, 'used': used, 'pre': pre} - public.writeFile(exlogPath, json.dumps(speed)) - pre = pre1 - def ExecShell(cmdstring, cwd=None, shell=True, symbol='&>'): try: import shlex @@ -826,20 +624,18 @@ def soft_task(): for value in taskArr: start = int(time.time()) if not sql.table('tasks').where("id=?", (value['id'],)).count(): - public.writeFile(tip_file, str(int(time.time()))) + write_file(tip_file, str(int(time.time()))) continue sql.table('tasks').where("id=?", (value['id'],)).save('status,start', ('-1', start)) - if value['type'] == 'download': - argv = value['execstr'].split('|bt|') - DownloadFile(argv[0], argv[1]) - elif value['type'] == 'execshell': - ExecShell(value['execstr']) + if value['type'] != 'execshell': + continue + ExecShell(value['execstr']) end = int(time.time()) sql.table('tasks').where("id=?", (value['id'],)).save('status,end', ('1', end)) if sql.table('tasks').where("status=?", ('0',)).count() < 1: if os.path.exists(isTask): os.remove(isTask) - public.writeFile(tip_file, str(int(time.time()))) + write_file(tip_file, str(int(time.time()))) except Exception as e: logger.error(f"start_bt_task error: {e}") @@ -848,6 +644,15 @@ def soft_task(): def check_site_monitor(): task_ExecShell("check_site_monitor") +# 节点监控 +def node_monitor(): + task_ExecShell("node_monitor") + + +# 节点监控 +def node_monitor_check(): + task_ExecShell("node_monitor_check") + # 检测防爆破计划任务 def breaking_through(): @@ -856,7 +661,12 @@ def breaking_through(): # 找site favicons def find_favicons(): - task_ExecShell("find_favicons") + task_ExecShell( + "find_favicons", + paths_exists=[ + '/www/server/panel/config/auto_favicon.conf', + ] + ) # 邮件日志 @@ -899,78 +709,20 @@ def refresh_dockerapps(): # 版本更新执行一次性 def task_version_part(): - def _run_post_update_tasks(from_version, to_version): - """ - 在版本更新后执行一次性任务。 - :param from_version: 旧版本号 - :param to_version: 新版本号 - :return: bool, 任务是否成功 - """ - try: - if from_version == to_version: - logger.info("Current task version is the same as the last version, no update tasks to run.") - return True - - logger.info( - f"Detected update program start, {from_version} -> {to_version}. Executing one-time update tasks..." - ) - - if from_version < '1.0.0': - dirs_to_clean = [ - os.path.join(BASE_PATH, 'logs/sqlite_easy'), - os.path.join(BASE_PATH, 'logs/sql_log') - ] - - for dir_path in dirs_to_clean: - if os.path.isdir(dir_path): - try: - shutil.rmtree(dir_path) - logger.info(f"Removed directory: {dir_path}") - except Exception as e: - logger.error(f"Removing directory {dir_path} failed: {str(e)}") - else: - logger.info(f"Directory not exists, skipped: {dir_path}") - - if from_version < '1.0.1': - sites = public.M('sites').field('id,name,path').select() - pattern = r'
(.+?)' - for site in sites: - temo_dir = [ - os.path.join(site['path'], '404.html'), - os.path.join(site['path'], '502.html'), - os.path.join(site['path'], 'index.html'), - ] - for d in temo_dir: - if os.path.exists(d): - html = public.readFile(d) - result = re.sub(pattern, r'\1', html) - public.writeFile(d, result.strip()) - - logger.info("All one-time update tasks executed successfully.") - return True - except Exception as e: - logger.error(f"Executing one-time update task failed: {str(e)}") - return False - - # run_post_update_tasks - version_file = '{}/data/task_version.pl'.format(public.get_panel_path()) - last_version = "0.0.0" # 默认为一个很旧的版本 - - if os.path.exists(version_file): - last_version = public.readFile(version_file) or "0.0.0" - if _run_post_update_tasks(last_version, CURRENT_TASK_VERSION): - public.writeFile(version_file, CURRENT_TASK_VERSION) + task_ExecShell("task_version_part") # ================================ 这是任务分割线 =============================== TASKS = [ - # <核心任务> 面板重启检查, 面板任务2个, 面板授权检查 - {"func": [restart_panel, bt_box_task, soft_task, panel_auth], "interval": 2, "is_core": True}, + # <核心任务> 面板重启检查, 面板授权检查 + {"func": [restart_panel, panel_auth], "interval": 2, "is_core": True}, + {"func": soft_task, "interval": 2, "is_core": True}, # 原面板任务 + {"func": bt_box_task, "interval": 2, "is_core": True}, # 原面板任务 # <核心任务> 服务守护 {"func": daemon_service, "interval": 10, "is_core": True}, - # <核心任务> 系统监控 + # <核心任务> 原系统监控 {"func": systemTask, "is_core": True}, # 每1分钟系统监控任务, 常驻, 内置间隔 # ================================ 分割线 =============================== @@ -982,19 +734,19 @@ TASKS = [ {"func": multi_web_server_daemon, "interval": 300}, # 每5分钟多服务守护任务 {"func": check502Task, "interval": 60 * 10}, # 每10分钟 502检查(夹杂若干任务) {"func": check_site_monitor, "interval": 60 * 10}, # 每10分钟检查站点安装监控 + {"func": node_monitor, "interval": 60 }, # 每1分钟节点监控任务 + {"func": node_monitor_check, "interval": 60*60*24*30 }, # 每月节点监控检测任务 {"func": update_waf_config, "interval": 60 * 20}, # 每隔20分钟更新一次waf报表数据 {"func": update_monitor_requests, "interval": 60 * 20}, # 每隔20分钟更新一次网站报表数据 {"func": check_panel_msg, "interval": 3600}, # 每1小时面板消息提醒 - # {"func": check_panel_ssl, "interval": 60}, # 每1小时面板证书是否有更新 - {"func": dns_checker, "interval": 3600 * 3}, # 每3小时dns解析验证 {"func": find_favicons, "interval": 43200}, # 每12小时找favicons {"func": domain_ssl_service, "interval": 3600}, # 每6小时进行域名SSL服务(内置时间标记, 可提前检查) {"func": malicious_file_scanning, "interval": 60 * 60 * 6}, # 每每6小时进行恶意文件扫描 {"func": count_ssh_logs, "interval": 3600 * 24}, # 每天统计SSH登录日志 {"func": submit_module_call_statistics, "interval": 3600}, # 每天一次 提交今天之前的统计数据(内置时间标记, 可提前检查) - {"func": maillog_event, "interval": 60}, # 邮局日志事件监控 event loop事件, 每60秒一次, 起守护作用 + {"func": maillog_event, "interval": 60, "loop": True}, # 邮局日志事件监控 event loop事件, 每60秒一次, 起守护作用 {"func": send_mail_time, "interval": 60 * 3}, # 每3分钟检测邮件信息 {"func": auto_reply_tasks, "interval": 3600}, # 每1小时自动回复邮件 {"func": schedule_automations, "interval": 60}, # 每1分钟邮局自动化任务 @@ -1032,6 +784,7 @@ def thread_register(brain: SimpleBrain, is_core: bool = True): task_id=task_id, interval=task.get("interval", 3600), is_core=task.get("is_core", False), + loop=task.get("loop", False), ) except Exception: import traceback @@ -1042,7 +795,7 @@ def thread_register(brain: SimpleBrain, is_core: bool = True): ) -def main(): +def main(max_workers: int = None): main_pid = "logs/task.pid" if os.path.exists(main_pid): os.system("kill -9 $(cat {}) &> /dev/null".format(main_pid)) @@ -1054,7 +807,7 @@ def main(): _pid = os.fork() if _pid: - public.writeFile(main_pid, str(_pid)) + write_file(main_pid, str(_pid)) sys.exit(0) sys.stdout.flush() @@ -1064,7 +817,7 @@ def main(): time.sleep(5) task_version_part() # =================== Start =========================== - sb = SimpleBrain(cpu_max=50.0) + sb = SimpleBrain(cpu_max=30.0, workers=max_workers) try: # core tasks thread_register(brain=sb, is_core=True) @@ -1076,7 +829,7 @@ def main(): except Exception: import traceback logger.error(traceback.format_exc()) - sb.shutdown() + sb._shutdown() # =================== End ======================== diff --git a/BTTask/task_script.py b/BTTask/task_script.py index 410b7b34..35fdd0b2 100644 --- a/BTTask/task_script.py +++ b/BTTask/task_script.py @@ -19,14 +19,14 @@ os.chdir("/www/server/panel") sys.path.insert(0, os.path.abspath("/www/server/panel")) sys.path.insert(0, "/www/server/panel/class/") sys.path.insert(0, "/www/server/panel/class_v2/") + +from BTTask.conf import logger, CURRENT_TASK_VERSION +from public.hook_import import hook_import try: - from public.hook_import import hook_import - hook_import() -except Exception: +except: pass - def task(): def decorator(func): @functools.wraps(func) @@ -132,6 +132,29 @@ def check_site_monitor(): (None, install_name, 'execshell', '0', time.strftime('%Y-%m-%d %H:%M:%S'), execstr)) public.writeFile('/tmp/panelTask.pl', 'True') +# 节点监控 +@task() +def node_monitor(): + import public + bin_file = '/www/server/panel/pyenv/bin/python' + bin_file2 = '/usr/bin/python' + if os.path.exists(bin_file): + python_bin = bin_file + else:python_bin = bin_file2 + cmd ='nohup {} /www/server/panel/script/node_monitor.py > /dev/null 2>&1 &'.format(python_bin) + os.system(cmd) + +# 节点监控依赖包检测 +@task() +def node_monitor_check(): + import public + # 定义处理h11的命令变量 + cmd_h11 = "cd /www/server/panel/pyenv/bin && source activate && H11_VERSION=$(./pip3 show h11 | grep -i Version | awk '{print $2}') && if [ \"$H11_VERSION\" != \"0.14.0\" ]; then ./pip3 uninstall h11 -y; fi; ./pip3 install h11==0.14.0" + + # 定义处理wsproto的命令变量 + cmd_wsproto = "cd /www/server/panel/pyenv/bin && source activate && WSPROTO_VERSION=$(./pip3 show wsproto | grep -i Version | awk '{print $2}') && if [ \"$WSPROTO_VERSION\" != \"1.2.0\" ]; then ./pip3 uninstall wsproto -y; fi; ./pip3 install wsproto==1.2.0" + public.ExecShell(cmd_h11) + public.ExecShell(cmd_wsproto) # 多web @task() @@ -480,7 +503,11 @@ def update_vulnerabilities(): public.writeFile(path_time, json.dumps({"time": int(time.time())})) share_ip_info = {"time": 0} else: - share_ip_info = json.loads(public.readFile(path_time)) + try: + share_ip_info = json.loads(public.readFile(path_time)) + except Exception: + public.ExecShell("rm -f {}".format(path_time)) + share_ip_info = {"time": 0} if (int(time.time()) - share_ip_info["time"]) < 86400: return public.returnMsg(False, "未达到时间") share_ip_info["time"] = int(time.time()) @@ -506,7 +533,11 @@ def update_vulnerabilities(): public.writeFile(path_time, json.dumps({"time": int(time.time())})) share_ip_info = {"time": 0} else: - share_ip_info = json.loads(public.readFile(path_time)) + try: + share_ip_info = json.loads(public.readFile(path_time)) + except Exception: + public.ExecShell("rm -f {}".format(path_time)) + share_ip_info = {"time": 0} if (int(time.time()) - share_ip_info["time"]) < 86400: return public.returnMsg(False, "未达到时间") share_ip_info["time"] = int(time.time()) @@ -543,7 +574,11 @@ def update_vulnerabilities(): public.writeFile(path_time, json.dumps({"time": int(time.time())})) share_ip_info = {"time": 0} else: - share_ip_info = json.loads(public.readFile(path_time)) + try: + share_ip_info = json.loads(public.readFile(path_time)) + except Exception: + public.ExecShell("rm -f {}".format(path_time)) + share_ip_info = {"time": 0} if (int(time.time()) - share_ip_info["time"]) < 86400: return public.returnMsg(False, "未达到时间") share_ip_info["time"] = int(time.time()) @@ -574,7 +609,11 @@ def update_vulnerabilities(): # 如果第一次运行则三天后再运行 share_ip_info = {"time": int(time.time()) - 86400 * 2} else: - share_ip_info = json.loads(public.readFile(path_time)) + try: + share_ip_info = json.loads(public.readFile(path_time)) + except Exception: + public.ExecShell("rm -f {}".format(path_time)) + share_ip_info = {"time": 0} if (int(time.time()) - share_ip_info["time"]) < 259200: return public.returnMsg(False, "未达到时间") share_ip_info["time"] = int(time.time()) @@ -611,6 +650,8 @@ def update_vulnerabilities(): check_plugin_close() get_plugin_update_time() except Exception: + import traceback + public.print_log(traceback.format_exc()) raise @@ -668,7 +709,7 @@ def check502task(): f_list = os.listdir(sess_path) f_num = len(f_list) sess_expired_path = f"{public.get_panel_path()}/data/session_timeout.pl" - sess_expired = 86400 # default 24H + sess_expired = 86400 # default 24H if os.path.exists(sess_expired_path): try: sess_expired = int(public.readFile(sess_expired_path).strip()) @@ -876,6 +917,216 @@ def check502task(): flush_geoip() +@task() +def count_ssh_logs(): + """ + @name 统计SSH登录日志 + @return None + """ + + import json + import public + import re + from datetime import datetime + + def parse_journal_disk_usage(output): + # 使用正则表达式来提取数字和单位 + match = re.search(r'take up (\d+(\.\d+)?)\s*([KMGTP]?)', output) + total_bytes = 0 + if match: + value = float(match.group(1)) # 数字 + unit = match.group(3) # 单位 + # 将所有单位转换为字节 + if unit == '': + unit_value = 1 + elif unit == 'K': + unit_value = 1024 + elif unit == 'M': + unit_value = 1024 * 1024 + elif unit == 'G': + unit_value = 1024 * 1024 * 1024 + elif unit == 'T': + unit_value = 1024 * 1024 * 1024 * 1024 + elif unit == 'P': + unit_value = 1024 * 1024 * 1024 * 1024 * 1024 + else: + unit_value = 0 + + # 计算总字节数 + total_bytes = value * unit_value + return total_bytes + + if os.path.exists("/etc/debian_version"): + version = public.readFile('/etc/debian_version') + if not version: + return + version = version.strip() + if 'bookworm' in version or 'jammy' in version or 'impish' in version: + version = 12 + else: + try: + version = float(version) + except: + version = 11 + + if version >= 12: + while True: + filepath = "/www/server/panel/data/ssh_login_counts.json" + + # 获取今天的日期 + today = datetime.now().strftime('%Y-%m-%d') + result = { + 'date': today, # 添加日期字段 + 'error': 0, + 'success': 0, + 'today_error': 0, + 'today_success': 0 + } + try: + filedata = public.readFile(filepath) if os.path.exists(filepath) else public.writeFile(filepath, + "[]") + try: + data_list = json.loads(filedata) + except: + data_list = [] + + # 检查是否已有今天的记录,避免重复统计 + found_today = False + for day in data_list: + if day['date'] == today: + found_today = True + break + + if found_today: + break # 如果找到今天的记录,跳出while循环 + + today_err_num1 = int(public.ExecShell( + "journalctl -u ssh --no-pager -S today |grep -a 'Failed password for' |grep -v 'invalid' |wc -l")[ + 0]) + + today_err_num2 = int(public.ExecShell( + "journalctl -u ssh --no-pager -S today |grep -a 'Connection closed by authenticating user' |grep -a 'preauth' |wc -l")[ + 0]) + + today_success = int( + public.ExecShell("journalctl -u ssh --no-pager -S today |grep -a 'Accepted' |wc -l")[0]) + + # 查看文件大小 判断是否超过5G + is_bigfile = False + + res, err = public.ExecShell("journalctl --disk-usage") + total_bytes = parse_journal_disk_usage(res) + limit_bytes = 5 * 1024 * 1024 * 1024 + if total_bytes > limit_bytes: + is_bigfile = True + + if is_bigfile: + err_num1 = int(public.ExecShell( + "journalctl -u ssh --since '30 days ago' --no-pager | grep -a 'Failed password for' | grep -v 'invalid' | wc -l")[ + 0]) + err_num2 = int(public.ExecShell( + "journalctl -u ssh --since '30 days ago' --no-pager --grep='Connection closed by authenticating user|preauth' | wc -l")[ + 0]) + success = int(public.ExecShell( + "journalctl -u ssh --since '30 days ago' --no-pager | grep -a 'Accepted' | wc -l")[0]) + else: + # 统计失败登陆次数 + err_num1 = int(public.ExecShell( + "journalctl -u ssh --no-pager |grep -a 'Failed password for' |grep -v 'invalid' |wc -l")[0]) + err_num2 = int(public.ExecShell( + "journalctl -u ssh --no-pager --grep='Connection closed by authenticating user|preauth' |wc -l")[ + 0]) + success = int(public.ExecShell("journalctl -u ssh --no-pager|grep -a 'Accepted' |wc -l")[0]) + result['error'] = err_num1 + err_num2 + # 统计成功登录次数 + result['success'] = success + result['today_error'] = today_err_num1 + today_err_num2 + result['today_success'] = today_success + + data_list.insert(0, result) + data_list = data_list[:7] + public.writeFile(filepath, json.dumps(data_list)) + except: + public.writeFile(filepath, json.dumps([{ + 'date': today, # 添加日期字段 + 'error': 0, + 'success': 0, + 'today_error': 0, + 'today_success': 0 + }])) + finally: + del filedata, data_list, result + + +def task_version_part(): + import public + import shutil + import re + BASE_PATH = public.get_panel_path() + + def _run_post_update_tasks(from_version, to_version): + """ + 在版本更新后执行一次性任务。 + :param from_version: 旧版本号 + :param to_version: 新版本号 + :return: bool, 任务是否成功 + """ + try: + if from_version == to_version: + logger.info("Current task version is the same as the last version, no update tasks to run.") + return True + + logger.info( + f"Detected update program start, {from_version} -> {to_version}. Executing one-time update tasks..." + ) + + if from_version < '1.0.0': + dirs_to_clean = [ + os.path.join(BASE_PATH, 'logs/sqlite_easy'), + os.path.join(BASE_PATH, 'logs/sql_log') + ] + + for dir_path in dirs_to_clean: + if os.path.isdir(dir_path): + try: + shutil.rmtree(dir_path) + logger.info(f"Removed directory: {dir_path}") + except Exception as e: + logger.error(f"Removing directory {dir_path} failed: {str(e)}") + else: + logger.info(f"Directory not exists, skipped: {dir_path}") + + if from_version < '1.0.1': + sites = public.M('sites').field('id,name,path').select() + pattern = r'(.+?)' + for site in sites: + temo_dir = [ + os.path.join(site['path'], '404.html'), + os.path.join(site['path'], '502.html'), + os.path.join(site['path'], 'index.html'), + ] + for d in temo_dir: + if os.path.exists(d): + html = public.readFile(d) + result = re.sub(pattern, r'\1', html) + public.writeFile(d, result.strip()) + + logger.info("All one-time update tasks executed successfully.") + return True + except Exception as e: + logger.error(f"Executing one-time update task failed: {str(e)}") + return False + + # run_post_update_tasks + version_file = '{}/data/task_version.pl'.format(public.get_panel_path()) + last_version = "0.0.0" # 默认为一个很旧的版本 + + if os.path.exists(version_file): + last_version = public.readFile(version_file) or "0.0.0" + if _run_post_update_tasks(last_version, CURRENT_TASK_VERSION): + public.writeFile(version_file, CURRENT_TASK_VERSION) + + if __name__ == '__main__': if len(sys.argv) < 2: print("Usage: python task_script.py ") diff --git a/class/acme_v2.py b/class/acme_v2.py index e85ffea8..aa85d0f9 100755 --- a/class/acme_v2.py +++ b/class/acme_v2.py @@ -3179,17 +3179,12 @@ fullchain.pem Paste into certificate input box if is_ip_ssl and ssl.panel_uf == ["panel"]: # 如果是ip ssl且是面板证书 from ssl_domainModelV2.service import apply_panel_ip_ssl_script - _, e = apply_panel_ip_ssl_script(ip=",".join(ssl.dns), log_path=ssl.log) - if e: - write_log( - f"|- IP Subject:【{ssl.subject}】Http Verification Renewal SSL certificate failed: {e.strip()}" - ) - else: - write_log( - f"|- IP Subject:【{ssl.subject}】Http Verification " - f"Renewal SSL certificate processed via script, please check log file" - ) - reload = True + apply_panel_ip_ssl_script(ip=",".join(ssl.dns), log_path=ssl.log) + write_log( + f"|- IP Subject:【{ssl.subject}】Http Verification " + f"Renewal SSL certificate processed via script, please check log file" + ) + reload = True continue auth_type = ssl.auth_info.get("auth_type") diff --git a/class/cachelib/session_simpile.py b/class/cachelib/session_simpile.py index 876b4e71..1edb4791 100644 --- a/class/cachelib/session_simpile.py +++ b/class/cachelib/session_simpile.py @@ -56,7 +56,6 @@ class SimpleCacheSession(BaseCache): def _prune(self): if len(self._cache) > self._threshold: import public - public.print_log('+++++++++++++++++++ prune session +++++++++++++++\ncurrent_sessions: {}\nthreshold: {}'.format(len(self._cache), self._threshold)) now = time() toremove = [] for idx, (key, (expires, _)) in enumerate(self._cache.items()): @@ -65,9 +64,6 @@ class SimpleCacheSession(BaseCache): for key in toremove: self._cache.pop(key, None) self.del_session_by_file(key) - public.print_log( - '+++++++++++++++++++ prune session done +++++++++++++++\ncurrent_sessions: {}'.format( - len(self._cache))) def _normalize_timeout(self, timeout): diff --git a/class/common.py b/class/common.py index 40a7a97d..4dd61e2a 100755 --- a/class/common.py +++ b/class/common.py @@ -51,7 +51,7 @@ class panelSetup: if ua.find('spider') != -1 or g.ua.find('bot') != -1: return abort(403) - g.version = '7.63.0' + g.version = '7.65.0' g.title = public.GetConfigValue('title') g.uri = request.path g.debug = os.path.exists('data/debug.pl') diff --git a/class/db.py b/class/db.py index 27bfc7f8..61a42b9b 100644 --- a/class/db.py +++ b/class/db.py @@ -9,6 +9,7 @@ import sqlite3 import os,time,sys +from typing import List, Optional os.chdir('/www/server/panel') if not 'class/' in sys.path: sys.path.insert(0,'class/') @@ -28,6 +29,7 @@ class Sql(): __OPT_PARAM = () # where值 __LOCK = '/dev/shm/sqlite_lock.pl' ERR_INFO = None + __ENCRYPT_KEYS = [] # 新增:加密字段列表,默认空列表(无需加密) def __init__(self): self.__DB_FILE = 'data/default.db' @@ -350,6 +352,41 @@ class Sql(): # if os.path.exists(self.__LOCK): # os.remove(self.__LOCK) + def clear_files(self): + """ + @name 清理空间 + """ + import psutil + path = public.get_panel_path() + + res = psutil.disk_usage(path) + limit = 512 * 1024 + if res.free > limit: + return + + #清理安装日志 + log_path = '{}/logs/installed'.format(path) + if os.path.exists(log_path): + total = 0 + try: + flist = [] + for f in os.listdir(log_path): + sfile = '{}/{}'.format(log_path, f) + if not os.path.isfile(sfile): + continue + flist.append(sfile) + flist.sort(key=lambda x: os.path.getmtime(x), reverse=False) + + for f in flist: + total += os.path.getsize(f) + if total >= limit: + os.remove(f) + break + os.remove(f) + except:pass + if total: + print('Jointly released:{}'.format(public.to_size(total))) + def query(self,sql,param = ()): self.ERR_INFO = None #执行SQL语句返回数据集 @@ -410,3 +447,38 @@ class Sql(): # 设置数据库名称,用于判断数据库文件 self.__DB_NAME = name return self + + def batch_add(self, keys: List[str], value_list: List[tuple]): + # 批量插入数据 + self.clear_files() + self.__GetConn() + self.__DB_CONN.text_factory = str + need_crypt = any(key in keys for key in self.__ENCRYPT_KEYS) + keys_str = ",".join(["`{}`".format(key) for key in keys]) + for idx, param in enumerate(value_list): + if len(param) != len(keys): + raise public.PanelError("The data length is inconsistent with the field length") + if need_crypt: + value_list[idx] = self.en_crypt(keys_str,param) + try: + values_temp=",".join(["?" for _ in range(len(keys))]) + sql = "INSERT INTO " + self.__DB_TABLE + "(" + keys_str + ") " + "VALUES(" + values_temp + ")" + self.__DB_CONN.executemany(sql, value_list) + self._close() + self.__DB_CONN.commit() + return True + except Exception as ex: + raise public.PanelError("Database insertion error:" + "error: " + str(ex)) + # return "error: " + str(ex) + + def batch_insert(self, data_list:List[dict]): + keys = list(data_list[0].keys()) + value_list = [] + try: + for items in data_list: + if not isinstance(items, dict): + raise public.PanelError("Data type error") + value_list.append(tuple(items[key] for key in keys)) + except: + raise public.PanelError("Data type error") + return self.batch_add(keys, value_list) diff --git a/class/jobs.py b/class/jobs.py index e2896aff..a80da2c8 100755 --- a/class/jobs.py +++ b/class/jobs.py @@ -520,6 +520,18 @@ def sql_pacth(): public.M('messages').execute("alter TABLE messages add send integer DEFAULT 0",()) public.M('messages').execute("alter TABLE messages add retry_num integer DEFAULT 0",()) + try: + # firewall new table 初始化 + from safeModelV2.firewallModel import Sqlite + Sqlite() + except: + pass + + if sql: + try: + sql.close() + except: + pass def upgrade_gevent(): ''' diff --git a/class/public/aaModel/fields.py b/class/public/aaModel/fields.py index 53036f87..2a5df5ba 100644 --- a/class/public/aaModel/fields.py +++ b/class/public/aaModel/fields.py @@ -6,7 +6,7 @@ import time from collections.abc import Callable from dataclasses import dataclass, field as dataclass_field from datetime import datetime -from typing import Any, TypeVar, List, Optional, Iterable +from typing import Any, TypeVar, List, Optional, Iterable, TYPE_CHECKING from public.exceptions import HintException @@ -20,6 +20,10 @@ __all__ = [ "DateTimeStrField", ] +if TYPE_CHECKING: + from .model import aaModel + + M = TypeVar("M", bound="aaModel") @@ -497,6 +501,7 @@ class DictField(aaField): "update", ) +ACCURACY = 1000 @dataclass class DateTimeStrField(aaField): @@ -541,7 +546,7 @@ class DateTimeStrField(aaField): dynamic: bool = True auto_now_add: bool = False auto_now: bool = False - accuracy: int = 1000 + accuracy: int = ACCURACY format: str = "%Y-%m-%d %H:%M:%S" compare: tuple[str] = ( "gt", diff --git a/class/public/aaModel/manager.py b/class/public/aaModel/manager.py index 308bbde2..3f1aa473 100644 --- a/class/public/aaModel/manager.py +++ b/class/public/aaModel/manager.py @@ -5,17 +5,16 @@ import sqlite3 as Engine import uuid from functools import reduce from itertools import chain -from typing import Optional, TypeVar, Generic, Any, List, Dict, Generator, Iterable, TYPE_CHECKING, Type +from typing import Optional, TypeVar, Generic, Any, List, Dict, Generator, Iterable, Type from public.aaModel.fields import COMPARE from public.exceptions import HintException, PanelError from public.sqlite_easy import Db -if TYPE_CHECKING: - from .model import aaModel __all__ = ["aaManager", "Q"] +# noinspection PyUnresolvedReferences M = TypeVar("M", bound="aaModel") @@ -62,6 +61,21 @@ else: # ==================== Patch End ================== +def db_file_connect(db_name: str) -> Db: + if not db_name: + raise PanelError("db_file_connect_generator error, db_name is empty") + if db_name == "default": + return Db(db_name=db_name, engine=_ENGINE) + else: + db_root_dir = "/www/server/panel/data/db" + os.makedirs(db_root_dir, exist_ok=True) + db_path = os.path.join(db_root_dir, f"{db_name}") + new = Db(db_name="", engine=_ENGINE, auto_connect=False) + setattr(new, "_Db__DB_NAME", db_path) + new._connect() + return new + + class Operator: SIMPLE_OP = { "gt": ">", "lt": "<", "gte": ">=", "lte": "<=", "ne": "!=", @@ -637,7 +651,7 @@ class QuerySet(Generic[M]): self._query.field(*(f"{self._tb}.{f}" for f in field_set)) # db level return self - def first(self) -> Optional[M]: + def first(self) -> "Optional[M]": """ 获取第一条数据 :return: QuerySet @@ -681,6 +695,20 @@ class QuerySet(Generic[M]): target = None if not target: return 0 + try: + if "update_time" not in target: + fields = getattr(self._model_class, "__fields__", {}) or {} + auto_now = None + for name, f in fields.items(): + if name == "update_time" and getattr(f, "auto_now", False) is True: + auto_now = name + break + if auto_now: + import time + from public.aaModel.fields import ACCURACY + target[auto_now] = round(time.time() * ACCURACY) + except: + pass serlz = self._model_class._get_serialized() body = { k: (serlz[k].serialized(v, True) if k in serlz else v) for k, v in target.items() @@ -735,11 +763,20 @@ class aaObjects(Generic[M]): 管理器 """ _queryset_class = QuerySet - __m_map__ = {} + __m_map__ = { + "default": set(), # 默认使用default.db, default = 表集合 + "db": dict() # 指定了db_file的只放在db路径下, db = {db_file: 表集合} + } def __new__(cls, args): - if hasattr(args, "__table_name__") and not cls.__m_map__.get(args.__table_name__): - cls.__m_map__[args.__table_name__] = aaMigrate(args).run_migrate() + if hasattr(args, "__table_name__"): + if args.__db_name__ == "default": + if args.__table_name__ not in cls.__m_map__["default"]: + cls.__m_map__["default"].add(aaMigrate(args).run_migrate()) + else: + if args.__db_name__ not in cls.__m_map__["db"]: + cls.__m_map__["db"][args.__db_name__] = set() + cls.__m_map__["db"][args.__db_name__].add(aaMigrate(args).run_migrate()) return super(aaObjects, cls).__new__(cls) def __init__(self, model: Type[M]): @@ -758,10 +795,7 @@ class aaObjects(Generic[M]): @property def _query(self) -> "Db.query": if not self.__q: - q = Db( - db_name=self._model.__db_name__, - engine=_ENGINE, - ).query() + q = db_file_connect(self._model.__db_name__).query() self.__q = q.table(self._model.__table_name__) return self.__q @@ -857,7 +891,7 @@ class aaMigrate: self.__client = None self.__query = None - def run_migrate(self) -> bool | None: + def run_migrate(self) -> str | None: """ 迁移 """ @@ -871,9 +905,7 @@ class aaMigrate: raise PanelError(f"{self.__model.__class__.__name__} need 'fields'") try: - self.__client = Db( - db_name=self.__model.__db_name__, engine=_ENGINE - ) + self.__client: Db = db_file_connect(self.__model.__db_name__) self.__table_exists() self.__index_exists() except Exception as e: @@ -883,7 +915,7 @@ class aaMigrate: self.__query.close() if self.__client: self.__client.close() - return True + return self.__model.__table_name__ def __new_tb_transform_sql(self, tb_name: str) -> str: """ @@ -1032,7 +1064,7 @@ class aaManager: def __get__(self, instance, cls: Type[M]): if instance is not None: - raise RuntimeError( + raise AttributeError( f"object manager can't accessible from '{cls.__name__}' instances" ) try: diff --git a/class/public/aaModel/model.py b/class/public/aaModel/model.py index 2014f791..50eaa166 100644 --- a/class/public/aaModel/model.py +++ b/class/public/aaModel/model.py @@ -173,7 +173,7 @@ class aaModel(aaCusModel): return f"<{self.__class__.__name__}: {self.as_dict()}>" @staticmethod - def check_destroyed(func): + def _check_destroyed(func): def wrapper(self, *args, **kwargs): if getattr(self, "__destroyed", False): raise RuntimeError(f"Cannot call {func.__name__}() on destroyed object") @@ -182,7 +182,7 @@ class aaModel(aaCusModel): return wrapper @classmethod - @check_destroyed + @_check_destroyed def _output(cls, data: dict, _field_filter=None) -> dict: serlz = cls._get_serialized() serlz_fields = cls._get_serialized_fields_fz() @@ -195,7 +195,7 @@ class aaModel(aaCusModel): } @classmethod - @check_destroyed + @_check_destroyed def _serialized_data(cls, data: Optional[dict | list], _field_filter=None) -> Optional[dict | list]: if isinstance(data, list): return [cls._output(d, _field_filter) for d in data] @@ -204,7 +204,7 @@ class aaModel(aaCusModel): else: return data - @check_destroyed + @_check_destroyed def _validate(self, target: dict = None, raise_exp: bool = True) -> Optional[Dict[str, Any]]: """ 模型验证, 返回序列化后的结果 @@ -246,7 +246,7 @@ class aaModel(aaCusModel): # override pass - @check_destroyed + @_check_destroyed def save(self, raise_exp: bool = True) -> Optional[Self]: """ 模型数据, 不存在则 保存 , 存在则 更新, 仅更新变动字段 @@ -316,7 +316,7 @@ class aaModel(aaCusModel): if self._dirty_fields: self._dirty_fields.clear() - @check_destroyed + @_check_destroyed def delete(self) -> int: try: self.__class__.objects._query.where( @@ -328,7 +328,7 @@ class aaModel(aaCusModel): return 0 return 1 - @check_destroyed + @_check_destroyed def as_dict(self) -> dict: """ 转字典 diff --git a/class/public/common.py b/class/public/common.py index 66b3061a..67096353 100644 --- a/class/public/common.py +++ b/class/public/common.py @@ -200,7 +200,9 @@ _LAN_LOG = None _LAN_TEMPLATE = None if sys.version_info[0] == 2: + # noinspection PyUnresolvedReferences,PyUnboundLocalVariable reload(sys) + # noinspection PyUnresolvedReferences sys.setdefaultencoding('utf8') else: from importlib import reload @@ -1284,6 +1286,7 @@ def GetNumLines(path, num: int, p=1): return json.loads(result).strip() except: if pyVersion == 2: + # noinspection PyUnresolvedReferences result = result.decode('utf8', errors='ignore') else: result = result.encode('utf-8', errors='ignore').decode("utf-8", errors="ignore") @@ -2347,6 +2350,7 @@ def to_btint(string): def load_module(pluginCode): + # noinspection PyUnresolvedReferences from imp import new_module from BTPanel import cache p_tk = 'data/%s' % md5(pluginCode + get_uuid()) @@ -2395,6 +2399,7 @@ def auth_decode(data): if signature != data['signature']: return returnMsg(False, 'REQUEST_ERR') # 返回 + # noinspection PyUnresolvedReferences return json.loads(urllib.unquote(tdata)) @@ -2408,6 +2413,7 @@ def auth_encode(data): # 生成signature import binascii, hashlib, urllib, hmac, json + # noinspection PyUnresolvedReferences tdata = urllib.quote(json.dumps(data)) # 公式 hex(hmac_sha256(data)) pdata['signature'] = binascii.hexlify(hmac.new(token['secret_key'], tdata, digestmod=hashlib.sha256).digest()) @@ -2536,6 +2542,7 @@ def to_string(lites): m_str = '' for mu in lites: if sys.version_info[0] == 2: + # noinspection PyUnresolvedReferences m_str += unichr(mu).encode('utf-8') else: m_str += chr(mu) @@ -2553,6 +2560,7 @@ def to_ord(string): # xss 防御 def xssencode(text): try: + # noinspection PyUnresolvedReferences from cgi import html list = ['`', '~', '&', '#', '/', '*', '$', '@', '<', '>', '\"', '\'', ';', '%', ',', '.', '\\u'] ret = [] @@ -2575,6 +2583,7 @@ def html_decode(text): @return string 返回解码后的HTML ''' try: + # noinspection PyUnresolvedReferences from cgi import html text2 = html.unescape(text) return text2 @@ -2590,6 +2599,7 @@ def html_encode(text): @return string 返回编码后的HTML ''' try: + # noinspection PyUnresolvedReferences from cgi import html text2 = html.escape(text) return text2 @@ -2644,6 +2654,7 @@ def get_mysql_info(): # xss 防御 def xssencode2(text): try: + # noinspection PyUnresolvedReferences from cgi import html text2 = html.escape(text, quote=True) return text2 @@ -2832,14 +2843,15 @@ def get_path_size(path, exclude=[]): # print("exclude:"+ str(exclude)) _exclude = exclude[0:] for i, e in enumerate(_exclude): - if not e.startswith(path): - basename = os.path.basename(path) - if not e.startswith(basename): - exclude.append(os.path.join(path, e)) - else: - new_exc = e.replace(basename + "/", "") - new_exc = os.path.join(path, new_exc) - exclude.append(new_exc) + if isinstance(e, str): + if not e.startswith(path): + basename = os.path.basename(path) + if not e.startswith(basename): + exclude.append(os.path.join(path, e)) + else: + new_exc = e.replace(basename + "/", "") + new_exc = os.path.join(path, new_exc) + exclude.append(new_exc) # print(exclude) total_size = 0 @@ -2917,6 +2929,7 @@ def mod_reload(mode): if sys.version_info[0] == 2: reload(mode) else: + # noinspection PyUnresolvedReferences import imp imp.reload(mode) return True @@ -3352,6 +3365,7 @@ def check_domain_panel(): if check_client_info(): try: from flask import render_template + # noinspection PyUnresolvedReferences return render_template('error2.html') except: pass @@ -3555,10 +3569,13 @@ def reload_mod(mod_name=None): def de_hexb(data): if sys.version_info[0] != 2: - if type(data) == str: data = data.encode('utf-8') + if type(data) == str: + data = data.encode('utf-8') pdata = base64.b64encode(data) if sys.version_info[0] != 2: - if type(pdata) == str: pdata = pdata.encode('utf-8') + if type(pdata) == str: + # noinspection PyUnresolvedReferences + pdata = pdata.encode('utf-8') return binascii.hexlify(pdata) @@ -3806,6 +3823,7 @@ def url_encode(data): pdata = urllib.parse.quote(data) else: import urllib + # noinspection PyUnresolvedReferences pdata = urllib.urlencode(data) return pdata @@ -3817,6 +3835,7 @@ def url_decode(data): pdata = urllib.parse.unquote(data) else: import urllib + # noinspection PyUnresolvedReferences pdata = urllib.urldecode(data) return pdata @@ -3824,6 +3843,7 @@ def url_decode(data): def unicode_encode(data): try: if sys.version_info[0] == 2: + # noinspection PyUnresolvedReferences result = unicode(data, errors='ignore') else: result = data.encode('utf8', errors='ignore') @@ -3835,6 +3855,7 @@ def unicode_encode(data): def unicode_decode(data, charset='utf8'): try: if sys.version_info[0] == 2: + # noinspection PyUnresolvedReferences result = unicode(data, errors='ignore') else: result = data.decode('utf8', errors='ignore') @@ -3843,6 +3864,7 @@ def unicode_decode(data, charset='utf8'): return data +# noinspection PyUnresolvedReferences def import_cdn_plugin(): plugin_path = 'plugin/static_cdn' if not os.path.exists(plugin_path): return True @@ -3856,6 +3878,7 @@ def import_cdn_plugin(): def get_cdn_hosts(): try: if import_cdn_plugin(): return [] + # noinspection PyUnresolvedReferences import static_cdn_main return static_cdn_main.static_cdn_main().get_hosts(None) except: @@ -3870,6 +3893,7 @@ def get_cdn_url(): cdn_url = cache.get('cdn_url') if cdn_url: return cdn_url if import_cdn_plugin(): return False + # noinspection PyUnresolvedReferences import static_cdn_main cdn_url = static_cdn_main.static_cdn_main().get_url(None) cache.set('cdn_url', cdn_url, 3) @@ -3883,6 +3907,7 @@ def set_cdn_url(cdn_url): import_cdn_plugin() get = dict_obj() get.cdn_url = cdn_url + # noinspection PyUnresolvedReferences import static_cdn_main static_cdn_main.static_cdn_main().set_url(get) return True @@ -4256,6 +4281,7 @@ def _decrypt(data: str) -> str: if not isinstance(data, str): return data if data.startswith('BT-0x:'): + # noinspection PyUnresolvedReferences res = PluginLoader.db_decrypt(data[6:])['msg'] return res return data @@ -4711,6 +4737,7 @@ def xssdecode(text): import html text2 = html.unescape(str_convert) else: + # noinspection PyUnresolvedReferences text2 = cgi.unescape(str_convert) return text2 except: @@ -5521,11 +5548,13 @@ def login_send_body(is_type, username, login_ip, port): 'user': username} rdata = object.send_msg('login_panel', check_sms_argv(sm_args)) else: + # noinspection PyUnresolvedReferences from panel_msg.collector import SitePushMsgCollect msg = SitePushMsgCollect.panel_login(plist) if send_type.strip() == "wx_account": + # noinspection PyUnresolvedReferences from push.site_push import ToWechatAccountMsg object.send_msg(ToWechatAccountMsg.panel_login( name=username, @@ -6170,6 +6199,7 @@ def error_not_login(e=None, _src=None): } return Response(json.dumps(result), mimetype='application/json', status=200) + # noinspection PyUnresolvedReferences return render_template('autherr.html') try: @@ -7011,6 +7041,7 @@ def get_cloud_ip_info2(ips): try: for ip in ips: ip_area_dict = get_ip_location(ip) + # noinspection PyUnresolvedReferences if isinstance(ip_area_dict, geoip2.models.City): country = ip_area_dict.raw["country"] country['carrier'] = '' # 缺少信息 @@ -8713,31 +8744,53 @@ def get_client_info_db_obj(): db_obj.execute('CREATE INDEX client_ip_index ON client_info(client_ip)') db_obj.execute('CREATE INDEX session_id_index ON client_info(session_id)') db_obj.execute('CREATE INDEX login_time_index ON client_info(login_time)') + + # 增加字段login_type "登录是否成功" + try: + hit = False + for f in db_obj.table("sqlite_master").query("PRAGMA table_info('client_info');") or []: + if f[1] == "login_type": + hit = True + break + if not hit: + db_obj.table("sqlite_master").execute( + 'ALTER TABLE `client_info` ADD COLUMN `login_type` INTEGER DEFAULT 1' + ) + except Exception as e: + public.print_log(str(e)) + return db_obj -def record_client_info(): - ''' +def record_client_info(login_type: int = 1): + """ @name 记录客户端信息 - @return void - ''' - from flask import request - from BTPanel import cache - db_obj = get_client_info_db_obj() - remote_addr = GetClientIp() - user_agent = request.headers.get('User-Agent', '') - pdata = { - 'remote_addr': remote_addr, - 'remote_port': request.environ.get('REMOTE_PORT'), - 'session_id': md5(remote_addr + user_agent), - 'user_agent': user_agent, - 'login_time': int(time.time()) - } - db_obj.table('client_info').insert(pdata) - db_obj.close() - - # 设置缓存 - cache.set('last_client_session_id', pdata['session_id'], 86400 * 2) + @param login_type int 登录类型 1:成功 0:失败 + @return None + """ + db_obj = None + try: + from flask import request + from BTPanel import cache + db_obj = get_client_info_db_obj() + remote_addr = GetClientIp() + user_agent = request.headers.get('User-Agent', '') + pdata = { + 'remote_addr': remote_addr, + 'remote_port': request.environ.get('REMOTE_PORT'), + 'session_id': md5(remote_addr + user_agent), + 'user_agent': user_agent, + 'login_time': int(time.time()), + 'login_type': int(login_type), + } + db_obj.table('client_info').insert(pdata) + # 设置缓存 + cache.set('last_client_session_id', pdata['session_id'], 86400 * 2) + except Exception as e: + public.print_log(f"error record_client_info: {str(e)}") + finally: + if db_obj: + db_obj.close() def check_client_info(): @@ -8849,6 +8902,7 @@ def ws_send(data: str): try: if '/www/server/panel' not in sys.path: sys.path.insert(0, '/www/server/panel') + # noinspection PyUnresolvedReferences from BTPanel import WS_OBJ ws_obj = {i: j for i, j in WS_OBJ.items() if j['timeout'] > int(time.time())} if ws_obj == {}: return False @@ -8941,6 +8995,7 @@ def download_main(upgrade_plugin_name, upgrade_version): pdata['os'] = 'Linux' pdata['environment_info'] = json.dumps(fetch_env_info(), ensure_ascii=False) import config, socket + # noinspection PyUnresolvedReferences import requests.packages.urllib3.util.connection as urllib3_conn _ip_type = config.config().get_request_iptype() old_family = urllib3_conn.allowed_gai_family @@ -9195,6 +9250,45 @@ def readFile(filename, mode='r'): return ReadFile(filename, mode) +def read_rare_charset_file(filename: str): + """ + 读取文件内容, 返回本信息, 如果出错返回 False, + 与readFile相比可以处理更多种编码格式。 + 处理python项目中存在奇怪编码问题 + """ + import chardet + if not os.path.exists(filename): + return False + fp = None + try: + fp = open(filename, "rb") + f_body_bytes: bytes = fp.read() + fp.close() + except: + if fp and not fp.closed: + fp.close() + return False + + if hasattr(chardet, "detect_all"): # 处理部分版本没有detect_all方法的问题 + tmp_eng_list = chardet.detect_all(f_body_bytes)[:3] + else: + tmp_eng_list = [chardet.detect(f_body_bytes)] + for tmp_eng in tmp_eng_list: + try: + f_body = f_body_bytes.decode(tmp_eng["encoding"]) + except: + continue + return f_body + + for eng in ("utf-8", "GBK", "utf-16", "utf-32", "BIG5"): + try: + f_body = f_body_bytes.decode(eng, errors="ignore") + except: + continue + return f_body + + return False + # 写入文件 def WriteFile(filename, s_body, mode='w+'): """ @@ -9635,8 +9729,8 @@ def progress_acquire_lock(lock_file): thread_id = int(thread_id_str) # 检查线程是否存在 thread_exists = any( - hasattr(thread, '_ident') and thread._ident == thread_id - for thread in threading.enumerate() + thread.ident == thread_id + for thread in threading.enumerate() if thread ) # 线程存在则不允许获取锁 if thread_exists: diff --git a/class/public/sqlite_easy.py b/class/public/sqlite_easy.py index 24fc41f6..7276f003 100644 --- a/class/public/sqlite_easy.py +++ b/class/public/sqlite_easy.py @@ -1305,7 +1305,7 @@ class Db: __DB_ROOT_DIR = '{}/data/'.format(_BASE_DIR) - def __init__(self, db_name, engine=None): + def __init__(self, db_name, engine=None, auto_connect: bool = True): ''' @name 初始化函数 @author Zhj<2022-12-14> @@ -1325,7 +1325,8 @@ class Db: self.__DEBUG_LOG = False # 是否开启调试日志 self.__QUERIES = [] # 查询构造器数量 - self.__connect() + if auto_connect: + self._connect() def __del__(self): self.close() @@ -1337,7 +1338,7 @@ class Db: def __exit__(self, exc_type, exc_value, exc_trackback): self.close() - def __connect(self): + def _connect(self): ''' @name 连接Sqlite数据库 @author Zhj<2022-07-16> diff --git a/class/userlogin.py b/class/userlogin.py index 46e3de4b..a86a83a6 100755 --- a/class/userlogin.py +++ b/class/userlogin.py @@ -451,6 +451,7 @@ class userlogin: return public.returnJson(False,public.lang('Disk inode has been exhausted, the panel has attempted to release the inode. Please try again ...')),json_header public.write_log_gettext('Login','Password is incorrect, Username:{}, Password:{}, Login IP:{}',('****','******',public.GetClientIp())) num = self.limit_address('+') + public.record_client_info(login_type=0) return public.returnJson(False,public.lang('Invalid username or password. You have [{}] times left to try!',str(num))),json_header diff --git a/class_v2/ajax_v2.py b/class_v2/ajax_v2.py index 4cd3a135..d94534ce 100644 --- a/class_v2/ajax_v2.py +++ b/class_v2/ajax_v2.py @@ -683,6 +683,42 @@ class ajax: return public.return_message(0,0,data) except: return public.return_message(-1, 0, public.lang("Fail to connect to the server!")) + # + def get_version_logs(self,get): + + LOG_TYPE_MAP = { + 'beta': '/api/panel/getBetaVersionLogs', + 'official': '/api/panel/getOfficialVersionLogs', + 'pro': None # pro 版暂不支持 + } + + # 确定当前面板类型 + if os.path.exists('/www/server/panel/data/panel_pro.pl'): + log_type = 'pro' + elif os.path.exists('/www/server/panel/data/is_beta.pl'): + log_type = 'beta' + else: + log_type = 'official' + + + # 检查是否支持该类型 + if log_type not in LOG_TYPE_MAP: + return public.return_message(-1, 0, public.lang("Parameter error!")) + + api_path = LOG_TYPE_MAP[log_type] + + # pro 版后续再做 + if api_path is None: + return public.return_message(0, 0, {"list": []}) + + url = self.__official_url + api_path + + try: + data = json.loads(public.HttpGet(url)) + return public.return_message(0,0,data) + except: + return public.return_message(-1, 0, public.lang("Fail to connect to the server!")) + def get_other_info(self): other = {} diff --git a/class_v2/database_v2.py b/class_v2/database_v2.py index 0564c9fa..ba6c5353 100644 --- a/class_v2/database_v2.py +++ b/class_v2/database_v2.py @@ -427,7 +427,6 @@ class database(datatool.datatools): Param('active').Require().Bool(), Param('address').Require(), Param('ps').Require().String(), - Param('ssl').String(), Param('dtype').Require().String(), ], [ public.validate.trim_filter(), @@ -446,12 +445,6 @@ class database(datatool.datatools): except: pass - ssl = "" - if hasattr(get, "ssl"): - ssl = get.ssl - if ssl == "REQUIRE SSL" and not self.check_mysql_ssl_status(get)["message"].get("status"): - - return public.return_message(-1, 0, public.lang("SSL is not enabled in the database, please open it in the Mysql manager first")) data_name = get['name'].strip().lower() if self.CheckRecycleBin(data_name): @@ -654,7 +647,7 @@ ssl-key=/www/server/mysql/mysql-test/std_data/server-key.pem return False # 创建用户 - def __CreateUsers(self, dbname, username, password, address, ssl=None): + def __CreateUsers(self, dbname, username, password, address): mysql_obj = public.get_mysql_obj_by_sid(self.sid) if not mysql_obj: return public.returnMsg(False, public.lang("Failed to connect to the specified database")) @@ -666,10 +659,6 @@ ssl-key=/www/server/mysql/mysql-test/std_data/server-key.pem dbname, username ) ) - if not ssl: - mysql_obj.execute( - "update mysql.user set ssl_type='' where user='%s' and host='localhost'" % username - ) for a in address.strip("\n").split(','): if not a: @@ -2443,19 +2432,22 @@ SetLink public.print_log("error info: {}".format(ex)) return public.return_message(-1, 0, str(ex)) - name = get['name'] - db_name = public.M('databases').where("username=? AND LOWER(type)=LOWER('mysql')", name).getField('name') + name = get['name'].strip() + db_info = public.M('databases').where("name=? AND LOWER(type)=LOWER('mysql')", name).find() + if not db_info: + return public.return_message(-1, 0, "Database does not exist") + + db_name = db_info['name'] + username = db_info['username'] mysql_obj = public.get_mysql_obj(db_name) if mysql_obj is False: return public.return_message(-1, 0, "Failed to connect to database") - # todo db ssl_type 计划移除 users = mysql_obj.query( - "select Host, ssl_type from mysql.user where User='" + name + "' AND Host!='localhost'" + "select Host from mysql.user where User='" + username + "' AND Host!='localhost'" ) self.__check_mysql_query_error(users) try: users = self.map_to_list(users) - ssl_type = [x[1] for x in users if x[1]] if len(users) < 1: permission = "127.0.0.1" else: @@ -2466,9 +2458,8 @@ SetLink except Exception as e: public.print_log("error info: {}".format(e)) permission = '127.0.0.1' - ssl_type = [] - return public.return_message(0, 0, {'permission': permission, 'ssl': ssl_type}) + return public.return_message(0, 0, {'permission': permission}) # 设置数据库权限 def SetDatabaseAccess(self, get): @@ -2476,10 +2467,7 @@ SetLink try: get.validate([ Param('name').Require().String(), - # Param('dataAccess').String().Xss(), - # Param('address').String().Xss(), Param('access').Require().String(), - Param('ssl').String(), ], [ public.validate.trim_filter(), ]) @@ -2499,12 +2487,6 @@ SetLink access = get['access'].strip() if access in ['']: return public.fail_v2(public.lang('IP not found!')) - # todo db ssl 计划移除 - ssl = get.ssl if hasattr(get, 'ssl') else '' - if ssl == "REQUIRE SSL" and not self.check_mysql_ssl_status(get)["message"].get("status"): - return public.return_message(-1, 0, public.lang( - "SSL is not enabled in the database, please open it in the Mysql manager first" - )) password = public.M('databases').where( "username=? AND LOWER(type)=LOWER('mysql')", (name,) diff --git a/class_v2/git_tools.py b/class_v2/git_tools.py index a9503296..64d55ce3 100644 --- a/class_v2/git_tools.py +++ b/class_v2/git_tools.py @@ -13,6 +13,7 @@ I8MGJUwtjfcKc5w4E0SmjHwLsErBQ84ek459TV1n0Iir/P4mdpfwDI34s6+8CBN0 iOUsBGgOHEqzdAdQgfAp4j3wnUjRiYKRNCV/AJLY4Tq9tI2MtVClijOZgnnqJPgu xR6fRUqpQVYbqROwFmCXIfD94AH3xLqlvi5n8KFgDh0= rpy88ff5JnVuJqXSNlYf+CQ4VKHExseR2LosMAdYEeHGNm80vDZH+2U6FEAnuapk +wiYVtfO/yzajW1Tv5z7hyA== 1u+XjG/2+GSQRv6EzCaWRQ== 8NNIDGOF0re2kgXSaFy5kpbAmOuUvjKYAxYWqmNd20k= /c7jKMTBTCBZ+JWfu0bexkfTXepOoUvpKP91ASrZEK4+ACLH4M2zsj9WFukxOgwk @@ -384,6 +385,8 @@ AKR+OhMsr76k2SU3CFoUddWPibTbi98EH/ZD+KjqfUHircWtOlWh+o52szssarfMnIo+dCQMtbDEWB57 uTEK8Ng11d3ix2pA+DD/aS59VL6WaJawxL94sTB39KI= L0eUthVnpkGsmKFAX6d+uDz5ZRBys3d0SQKK5GYgSmWghjKa4Bx/9hwfBJOgnWLqLGq5JBuZjIZ38HYgA4Ou/LSxsMAqnWKRcmIKawE4Fi3cE5vgH5PB2YHqqGv8Yatp 1u+XjG/2+GSQRv6EzCaWRQ== +rDb5bxUyMyyGUJttJSC+iRxu2R6/osAFtDStlhkq+IKi7lJZ0wc8XMSkeS0Yhs1GEZOorpDoZn875BxZO8c73w== +1u+XjG/2+GSQRv6EzCaWRQ== HkpWIIscVPpexsx6eTOLEidOiyFexh+1whGsSgEaO2D4ilZLQj2ansWITnzxdvsO8YxnGBXCbKUjdYJwmS7mPp59HECVwk8W7yxAg55ZVzJtPUiSNzz6pFkGNg7POI9py24rI0cNt07DYb4TKCfjYMc8cd+ArgVVIvdZqORVlJc= qq4yIoPisa0yoUJe+GfvFHJsgTa9O8Y85M6rGzt9NHw= L0eUthVnpkGsmKFAX6d+uDz5ZRBys3d0SQKK5GYgSmWghjKa4Bx/9hwfBJOgnWLqX/8JDaO3YMkUn8ksLmNJ7F/GtrNwcxdThcZjMzbrly7lWyQg0PbrwcNdFmJKIu+B diff --git a/class_v2/logsModelV2/panelModel.py b/class_v2/logsModelV2/panelModel.py index 86ab2bdb..f10d3677 100644 --- a/class_v2/logsModelV2/panelModel.py +++ b/class_v2/logsModelV2/panelModel.py @@ -15,11 +15,12 @@ import os,re,json,time from logsModel.base import logsBase import public,db from html import unescape,escape +from public.validate import Param class main(logsBase): - def __init__(self): - pass + super().__init__() + public.get_client_info_db_obj() def get_logs_info(self,args): @@ -236,33 +237,6 @@ class main(logsBase): # mysql慢日志有顺序问题,倒序显示不利于排查问题 return public.return_message(0, 0, public.xsssec(public.GetNumLines(path, limit))) - # find_idx = 0 - # p_num = 0 #分页计数器 - # next_file = False - # log_list = [] - # while not next_file: - # if len(log_list) >= limit: - # break - # p_num += 1 - # result = self.GetNumLines(path,10001,p_num).replace('\r\n','\n').split('\n') - # if len(result) < 10000: - # next_file = True - # result.reverse() - - # for _line in result: - # if not _line: continue - # if len(log_list) >= limit: - # break - - # try: - # if self.find_line_str(_line,search): - # find_idx += 1 - # if find_idx > (p-1) * limit: - # info = escape(_line) - # log_list.append(info) - # except:pass - # return log_list - def IP_geolocation(self, get): ''' @name 列出所有IP及其归属地 @@ -320,4 +294,78 @@ class main(logsBase): elif args.search in line: result.append(line) - return public.return_message(0, 0, result) \ No newline at end of file + return public.return_message(0, 0, result) + + def get_panel_login_log(self, get): + """ + @name 获取面板登录日志 + @param get + search : 关键字 + login_type: 登陆状态 + page : 页码 + limit : 每页显示数量 + """ + try: + get.validate([ + Param("p").Integer(), + Param("limit").Integer(), + Param("search").String(), + ], [public.validate.trim_filter()]) + except Exception as ex: + public.print_log("error info: {}".format(ex)) + return public.fail_v2(str(ex)) + + query_conditions = [] + query_params = [] + + # 处理 login_type 条件 + if hasattr(get, "login_type"): + login_type = get.login_type + if isinstance(login_type, bytes): + login_type = login_type.decode('utf-8').strip() + elif isinstance(login_type, str): + login_type = login_type.strip() + + if login_type: + query_conditions.append("login_type = ?") + query_params.append(login_type) + + # search + if hasattr(get, "search"): + search = get.search.strip() + + # 处理字节类型的 search + if isinstance(search, bytes): + search = search.decode('utf-8').strip() + elif isinstance(search, str): + search = search.strip() + + if search: + query_conditions.append("(remote_addr LIKE ? OR user_agent LIKE ?)") + search_params = "%{}%".format(search) + query_params.extend([search_params, search_params]) + + # 构建查询 + query_string = " AND ".join(query_conditions) if query_conditions else "1=1" + + # 分页处理 + page = int(get.p) if hasattr(get, 'p') and str(get.p).isdigit() else 1 + limit = int(get.limit) if hasattr(get, 'limit') and str(get.limit).isdigit() else 10 + offset = (page - 1) * limit + + # 执行查询 按 login_time 降序排序 + import db + with db.Sql() as db_obj: + db_obj._Sql__DB_FILE = "data/db/client_info.db" + db_obj.table("client_info") + data = db_obj.where(query_string, tuple(query_params)) \ + .field("id,remote_addr,remote_port,user_agent,login_time,login_type") \ + .order("login_time DESC") \ + .limit(str(offset) + ',' + str(limit)) \ + .select() + # 获取总数 + total = db_obj.where(query_string, tuple(query_params)).count() + return public.success_v2({ + "data": public.return_area(data, "remote_addr"), + "total": total + }) \ No newline at end of file diff --git a/class_v2/panelModelV2/publicModel.py b/class_v2/panelModelV2/publicModel.py index 0f5b442c..72a0b21e 100644 --- a/class_v2/panelModelV2/publicModel.py +++ b/class_v2/panelModelV2/publicModel.py @@ -176,6 +176,12 @@ pFg4Zp+YPGJXKgdAyL1zkI7hNf5vh6StzdUMuWhIbi0AD8Z96z3aChjaHxfuUSGARNu2enecDJDVjvw4 WHkOzVx7seuLmxs5Hu+l/hqQ42Rdao9KsJalFc3Uy3PPYvM+rpo7PCjI0oSCScNPbWurlpyqH75wxHzNu07uwg== NhnIR3Ilo4H2su9/cTNo/ICZTGzhWDfqRxvJsiO+SFp3raTQcMRn2bn8JTBNQQrbkW7yaHo1jZQBWfanlPEa8A== 1u+XjG/2+GSQRv6EzCaWRQ== +orwDq9zQW3P0icGqt0KM6nxnp5qm+pIacfFS4fYEUobxNKiRkIdytefZ/lw8BPvc +xNdksvgDJQMonSzwupQgOJn9O8yJsai+dEK5NBOwnENnRngMLiECLcbi7X/DYewOY0JQXQSI9bFwOXCtxbUtkg== +s8G27S+eoeLf23Lhm2sV+Wdziv+hx+guqtFm3KrbXAUiWROiyfyNma4NOJyh3G24OcARbMTm0FLSHVJ0Xu356a1cRgYbjt8/nLc9O3JL73I= +WHkOzVx7seuLmxs5Hu+l/lFjiasIhmnxvxh91/IEy2UALr/Q2Jwh2cpvZbHxSfXK +NhnIR3Ilo4H2su9/cTNo/AERu03Y4pYXVas/DTzThK9N62ycOFUnblrU2v88GGaHooZJDUnDNjwsS9CEx//OVg== +1u+XjG/2+GSQRv6EzCaWRQ== 3hCm6yDF8QSQ/yEbAtwtdq0rzuiteh3WYSTLRsG5O0dX/VhvBj4ApO5dsRhgEcZX ZJEoitRQAm7dKGJdUfxbFmDrY4YEgtXVG1lhlAaCc/x9n+3FgPGICDlC6/txNl7k AQ0EFiUuMT5/f86kH+tPcHrF4D7dxNUTwbkZLq5cMlg= diff --git a/class_v2/panel_plugin_v2.py b/class_v2/panel_plugin_v2.py index 37191a59..d4032223 100644 --- a/class_v2/panel_plugin_v2.py +++ b/class_v2/panel_plugin_v2.py @@ -1851,6 +1851,7 @@ class panelPlugin: if size == 0: public.run_thread(self.download_icon,(name,iconFile,downFile)) # self.download_icon(name,iconFile,downFile) + public.ExecShell('chmod 644 ' + iconFile) #下载图标 def download_icon(self,name,iconFile,downFile): diff --git a/class_v2/panel_site_v2.py b/class_v2/panel_site_v2.py index 00e0ca74..a33b52fe 100644 --- a/class_v2/panel_site_v2.py +++ b/class_v2/panel_site_v2.py @@ -2494,108 +2494,6 @@ listener Default%s{ return public.return_message(0, 0, result['runPath']) return public.return_message(-1, 0, public.lang("")) - # 创建Let's Encrypt免费证书 - def CreateLet(self, get): - - domains = json.loads(get.domains) - if not len(domains): - return_message = public.return_msg_gettext(False, 'Please choose a domain name') - del return_message['status'] - return public.return_message(-1, 0, return_message['msg']) - - file_auth = True - if hasattr(get, 'dnsapi'): - file_auth = False - - if not hasattr(get, 'dnssleep'): - get.dnssleep = 10 - - email = public.M('users').getField('email') - if hasattr(get, 'email'): - if get.email.find('@') == -1: - get.email = email - else: - get.email = get.email.strip() - public.M('users').where('id=?', (1,)).setField('email', get.email) - else: - get.email = email - - for domain in domains: - if public.checkIp(domain): continue - if domain.find('*.') >= 0 and file_auth: - return_message = public.return_msg_gettext(False, - 'A generic domain name cannot be used to apply for a certificate using [File Validation]!') - del return_message['status'] - return public.return_message(-1, 0, return_message['msg']) - - if file_auth: - get.sitename = get.siteName - if self.GetRedirectList(get): - return_message = public.return_msg_gettext(False, - 'Your site has 301 Redirect on,Please turn it off first!') - del return_message['status'] - return public.return_message(-1, 0, return_message['msg']) - if self.GetProxyList(get): - return_message = public.return_msg_gettext(False, - 'Sites that have reverse proxy turned on cannot request SSL!') - del return_message['status'] - return public.return_message(-1, 0, return_message['msg']) - data = self.get_site_info(get.siteName) - get.id = data['id'] - runPath = self.GetRunPath(get)['message']['result'] - if runPath != '/': - if runPath[:1] != '/': runPath = '/' + runPath - else: - runPath = '' - get.site_dir = data['path'] + runPath - - else: - dns_api_list = self.GetDnsApi(get) - get.dns_param = None - for dns in dns_api_list: - if dns['name'] == get.dnsapi: - param = [] - if not dns['data']: continue - for val in dns['data']: - param.append(val['value']) - get.dns_param = '|'.join(param) - n_list = ['dns', 'dns_bt'] - if not get.dnsapi in n_list: - if len(get.dns_param) < 16: - return_message = public.return_msg_gettext(False, 'No valid DNSAPI key information found', - (get.dnsapi,)) - del return_message['status'] - return public.return_message(-1, 0, return_message['msg']) - if get.dnsapi == 'dns_bt': - if not os.path.exists('plugin/dns/dns_main.py'): - return_message = public.return_msg_gettext(False, - 'Please go to the software store to install [Cloud Resolution] and complete the domain name NS binding.') - del return_message['status'] - return public.return_message(-1, 0, return_message['msg']) - - self.check_ssl_pack() - try: - import panel_lets_v2 as panelLets - public.mod_reload(panelLets) - except Exception as ex: - if str(ex).find('No module named requests') != -1: - public.ExecShell("pip install requests &") - return_message = public.return_msg_gettext(False, - 'Missing requests component, please try to repair the panel!') - del return_message['status'] - return public.return_message(-1, 0, return_message['msg']) - return_message = public.return_msg_gettext(False, str(ex)) - del return_message['status'] - return public.return_message(-1, 0, return_message['msg']) - - lets = panelLets.panelLets() - result = lets.apple_lest_cert(get) - if result['status'] and not 'code' in result: - get.onkey = 1 - path = '/www/server/panel/cert/' + get.siteName - if os.path.exists(path + '/certOrderId'): os.remove(path + '/certOrderId') - result = self.SetSSLConf(get) - return result def get_site_info(self, siteName): data = public.M("sites").where('name=?', siteName).field('id,path,name').find() @@ -2612,73 +2510,6 @@ listener Default%s{ except: public.ExecShell('btpip install pyOpenSSL') - # 判断DNS-API是否设置 - def Check_DnsApi(self, dnsapi): - dnsapis = self.GetDnsApi(None) - for dapi in dnsapis: - if dapi['name'] == dnsapi: - if not dapi['data']: return True - for d in dapi['data']: - if d['key'] == '': return False - return True - - # 获取DNS-API列表 - def GetDnsApi(self, get): - api_path = './config/dns_api.json' - api_init = './config/dns_api_init.json' - if not os.path.exists(api_path): - if os.path.exists(api_init): - import shutil - shutil.copyfile(api_init, api_path) - apis = json.loads(public.ReadFile(api_path)) - - path = '/root/.acme.sh' - if not os.path.exists(path + '/account.conf'): path = "/.acme.sh" - account = public.readFile(path + '/account.conf') - if not account: account = '' - is_write = False - for i in range(len(apis)): - if not apis[i]['data']: continue - for j in range(len(apis[i]['data'])): - if apis[i]['data'][j]['value']: continue - search_str = apis[i]['data'][j]['key'] + r"\s*=\s*'(.+)'" - match = re.search("" + apis[i]['data'][j]['key'] + r"\s*=\s*'(.+)'", account) - if match: apis[i]['data'][j]['value'] = match.groups()[0] - if apis[i]['data'][j]['value']: is_write = True - if is_write: public.writeFile('./config/dns_api.json', json.dumps(apis)) - result = [] - for i in apis: - if i['title'] == 'CloudFlare': - if os.path.exists('/www/server/panel/data/cf_limit_api.pl'): - i['API_Limit'] = True - else: - i['API_Limit'] = False - result.insert(0, i) - return public.return_message(0, 0, result) - - # 设置DNS-API - def SetDnsApi(self, get): - pdata = json.loads(get.pdata) - cf_limit_api = "/www/server/panel/data/cf_limit_api.pl" - if 'API_Limit' in pdata and pdata['API_Limit'] == True and not os.path.exists(cf_limit_api): - os.mknod(cf_limit_api) - if 'API_Limit' in pdata and pdata['API_Limit'] == False: - if os.path.exists(cf_limit_api): os.remove(cf_limit_api) - apis = json.loads(public.ReadFile('./config/dns_api.json')) - is_write = False - for key in pdata.keys(): - for i in range(len(apis)): - if not apis[i]['data']: continue - for j in range(len(apis[i]['data'])): - if apis[i]['data'][j]['key'] != key: continue - apis[i]['data'][j]['value'] = pdata[key] - is_write = True - - if is_write: public.writeFile('./config/dns_api.json', json.dumps(apis)) - return_message = public.return_msg_gettext(True, 'Setup successfully!') - del return_message['status'] - return public.return_message(0, 0, return_message['msg']) - # 获取站点所有域名 def GetSiteDomains(self, get): data = {} @@ -2720,7 +2551,8 @@ listener Default%s{ def get_tls13(self): nginx_bin = '/www/server/nginx/sbin/nginx' nginx_v = public.ExecShell(nginx_bin + ' -V 2>&1')[0] - nginx_v_re = re.findall(r"nginx/(\d\.\d+).+OpenSSL\s+(\d\.\d+)", nginx_v, re.DOTALL) + # nginx_v_re = re.findall(r"nginx/(\d\.\d+).+OpenSSL\s+(\d\.\d+)", nginx_v, re.DOTALL) + nginx_v_re = re.findall(r"(?:nginx|openresty)/(\d\.\d+)\.\d+.+OpenSSL\s+(\d\.\d+)", nginx_v, re.DOTALL) if nginx_v_re: if nginx_v_re[0][0] in ['1.8', '1.9', '1.7', '1.6', '1.5', '1.4']: return '' @@ -2754,20 +2586,20 @@ listener Default%s{ listen_conf = self.setupPath + '/panel/vhost/openlitespeed/listen/443.conf' conf = public.readFile(listen_conf) ssl_conf = """ - vhssl { - keyFile /www/server/panel/vhost/cert/BTDOMAIN/privkey.pem - certFile /www/server/panel/vhost/cert/BTDOMAIN/fullchain.pem - certChain 1 - sslProtocol 24 - ciphers EECDH+AESGCM:EDH+AESGCM:AES256+EECDH:AES256+EDH:ECDHE-RSA-AES128-GCM-SHA384:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA128:DHE-RSA-AES128-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES128-GCM-SHA128:ECDHE-RSA-AES128-SHA384:ECDHE-RSA-AES128-SHA128:ECDHE-RSA-AES128-SHA:ECDHE-RSA-AES128-SHA:DHE-RSA-AES128-SHA128:DHE-RSA-AES128-SHA128:DHE-RSA-AES128-SHA:DHE-RSA-AES128-SHA:ECDHE-RSA-DES-CBC3-SHA:EDH-RSA-DES-CBC3-SHA:AES128-GCM-SHA384:AES128-GCM-SHA128:AES128-SHA128:AES128-SHA128:AES128-SHA:AES128-SHA:DES-CBC3-SHA:HIGH:!aNULL:!eNULL:!EXPORT:!DES:!MD5:!PSK:!RC4 - enableECDHE 1 - renegProtection 1 - sslSessionCache 1 - enableSpdy 15 - enableStapling 1 - ocspRespMaxAge 86400 - } - """ +vhssl { + keyFile /www/server/panel/vhost/cert/BTDOMAIN/privkey.pem + certFile /www/server/panel/vhost/cert/BTDOMAIN/fullchain.pem + certChain 1 + sslProtocol 24 + ciphers EECDH+AESGCM:EDH+AESGCM:AES256+EECDH:AES256+EDH:ECDHE-RSA-AES128-GCM-SHA384:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA128:DHE-RSA-AES128-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES128-GCM-SHA128:ECDHE-RSA-AES128-SHA384:ECDHE-RSA-AES128-SHA128:ECDHE-RSA-AES128-SHA:ECDHE-RSA-AES128-SHA:DHE-RSA-AES128-SHA128:DHE-RSA-AES128-SHA128:DHE-RSA-AES128-SHA:DHE-RSA-AES128-SHA:ECDHE-RSA-DES-CBC3-SHA:EDH-RSA-DES-CBC3-SHA:AES128-GCM-SHA384:AES128-GCM-SHA128:AES128-SHA128:AES128-SHA128:AES128-SHA:AES128-SHA:DES-CBC3-SHA:HIGH:!aNULL:!eNULL:!EXPORT:!DES:!MD5:!PSK:!RC4 + enableECDHE 1 + renegProtection 1 + sslSessionCache 1 + enableSpdy 15 + enableStapling 1 + ocspRespMaxAge 86400 +} +""" ssl_dir = self.setupPath + '/panel/vhost/openlitespeed/detail/ssl/' if not os.path.exists(ssl_dir): os.makedirs(ssl_dir) @@ -2828,24 +2660,17 @@ listener SSL443 {{ if not 'first_domain' in get: get.first_domain = siteName if 'isBatch' in get and siteName != get.first_domain: get.first_domain = siteName - # Nginx配置 + # ========================== Nginx配置 =========================== file = self.setupPath + '/panel/vhost/nginx/' + siteName + '.conf' # Node项目 - if not os.path.exists(file): file = self.setupPath + '/panel/vhost/nginx/node_' + siteName + '.conf' - # if not os.path.exists(file): file = self.setupPath + '/panel/vhost/nginx/java_' + siteName + '.conf' - # if not os.path.exists(file): file = self.setupPath + '/panel/vhost/nginx/go_' + siteName + '.conf' - # if not os.path.exists(file): file = self.setupPath + '/panel/vhost/nginx/other_' + siteName + '.conf' - # if not os.path.exists(file): file = self.setupPath + '/panel/vhost/nginx/python_' + siteName + '.conf' - # if not os.path.exists(file): file = self.setupPath + '/panel/vhost/nginx/net_' + siteName + '.conf' - # if not os.path.exists(file): file = self.setupPath + '/panel/vhost/nginx/html_' + siteName + '.conf' + if not os.path.exists(file): + file = self.setupPath + '/panel/vhost/nginx/node_' + siteName + '.conf' + ng_file = file ng_conf = public.readFile(file) have_nginx_conf = ng_conf is not False - # 是否为子目录设置SSL - # if hasattr(get,'binding'): - # allconf = conf; - # conf = re.search("#BINDING-"+get.binding+"-START(.|\n)*#BINDING-"+get.binding+"-END",conf).group() + try: if ng_conf: if ng_conf.find('ssl_certificate') == -1: @@ -2853,18 +2678,18 @@ listener SSL443 {{ if not self.is_nginx_http3(): http3_header = "" sslStr = """#error_page 404/404.html; - ssl_certificate /www/server/panel/vhost/cert/%s/fullchain.pem; - ssl_certificate_key /www/server/panel/vhost/cert/%s/privkey.pem; - ssl_protocols %s; - ssl_ciphers EECDH+CHACHA20:EECDH+CHACHA20-draft:EECDH+AES128:RSA+AES128:EECDH+AES256:RSA+AES256:EECDH+3DES:RSA+3DES:!MD5; - ssl_prefer_server_ciphers on; - ssl_session_tickets on; - ssl_session_cache shared:SSL:10m; - ssl_session_timeout 10m; - add_header Strict-Transport-Security "max-age=31536000";%s - error_page 497 https://$host$request_uri; - """ % (get.first_domain, get.first_domain, self.get_tls_protocol(self.get_tls13(), is_apache=False), http3_header) - if (ng_conf.find('ssl_certificate') != -1): + ssl_certificate /www/server/panel/vhost/cert/%s/fullchain.pem; + ssl_certificate_key /www/server/panel/vhost/cert/%s/privkey.pem; + ssl_protocols %s; + ssl_ciphers EECDH+CHACHA20:EECDH+CHACHA20-draft:EECDH+AES128:RSA+AES128:EECDH+AES256:RSA+AES256:EECDH+3DES:RSA+3DES:!MD5; + ssl_prefer_server_ciphers on; + ssl_session_tickets on; + ssl_session_cache shared:SSL:10m; + ssl_session_timeout 10m; + add_header Strict-Transport-Security "max-age=31536000";%s + error_page 497 https://$host$request_uri; +""" % (get.first_domain, get.first_domain, self.get_tls_protocol(self.get_tls13(), is_apache=False), http3_header) + if ng_conf.find('ssl_certificate') != -1: if 'isBatch' not in get: public.serviceReload() return public.return_message(0, 0, public.lang("SSL turned on!")) @@ -2929,30 +2754,6 @@ listener SSL443 {{ file = self.setupPath + '/panel/vhost/apache/node_' + siteName + '.conf' other_project = "node" - # if not os.path.exists(file): - # file = self.setupPath + '/panel/vhost/apache/java_' + siteName + '.conf' - # other_project = "java" - # - # if not os.path.exists(file): - # file = self.setupPath + '/panel/vhost/apache/go_' + siteName + '.conf' - # other_project = "go" - # - # if not os.path.exists(file): - # file = self.setupPath + '/panel/vhost/apache/other_' + siteName + '.conf' - # other_project = "other" - # - # if not os.path.exists(file): - # file = self.setupPath + '/panel/vhost/apache/python_' + siteName + '.conf' - # other_project = "python" - # - # if not os.path.exists(file): - # other_project = "net" - # file = self.setupPath + '/panel/vhost/apache/net_' + siteName + '.conf' - # - # if not os.path.exists(file): - # other_project = "html" - # file = self.setupPath + '/panel/vhost/apache/html_' + siteName + '.conf' - ap_conf = public.readFile(file) have_apache_conf = ap_conf is not False ap_static_security = self._get_ap_static_security(ap_conf) @@ -2987,47 +2788,47 @@ listener SSL443 {{ else: return False phpConfig = ''' - #PHP - - SetHandler "proxy:%s" - - ''' % (public.get_php_proxy(version, 'apache'),) + #PHP + + SetHandler "proxy:%s" + + ''' % (public.get_php_proxy(version, 'apache'),) apaOpt = 'Require all granted' sslStr = fr'''%s - ServerAdmin webmaster@example.com - DocumentRoot "%s" - ServerName SSL.%s - ServerAlias %s - #errorDocument 404 /404.html - ErrorLog "%s-error_log" - CustomLog "%s-access_log" combined + ServerAdmin webmaster@example.com + DocumentRoot "%s" + ServerName SSL.%s + ServerAlias %s + #errorDocument 404 /404.html + ErrorLog "%s-error_log" + CustomLog "%s-access_log" combined + %s + #SSL + SSLEngine On + SSLCertificateFile /www/server/panel/vhost/cert/%s/fullchain.pem + SSLCertificateKeyFile /www/server/panel/vhost/cert/%s/privkey.pem + SSLCipherSuite EECDH+CHACHA20:EECDH+CHACHA20-draft:EECDH+AES128:RSA+AES128:EECDH+AES256:RSA+AES256:EECDH+3DES:RSA+3DES:!MD5:ALL:!ADH:!EXPORT56:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv2:+EXP:+eNULL + SSLProtocol All -SSLv2 -SSLv3 %s + SSLHonorCipherOrder On + %s + %s + + #DENY FILES + + Order allow,deny + Deny from all + + + #PATH + + SetOutputFilter DEFLATE + Options FollowSymLinks + AllowOverride All %s - #SSL - SSLEngine On - SSLCertificateFile /www/server/panel/vhost/cert/%s/fullchain.pem - SSLCertificateKeyFile /www/server/panel/vhost/cert/%s/privkey.pem - SSLCipherSuite EECDH+CHACHA20:EECDH+CHACHA20-draft:EECDH+AES128:RSA+AES128:EECDH+AES256:RSA+AES256:EECDH+3DES:RSA+3DES:!MD5:ALL:!ADH:!EXPORT56:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv2:+EXP:+eNULL - SSLProtocol All -SSLv2 -SSLv3 %s - SSLHonorCipherOrder On - %s - %s - - #DENY FILES - - Order allow,deny - Deny from all - - - #PATH - - SetOutputFilter DEFLATE - Options FollowSymLinks - AllowOverride All - %s - DirectoryIndex %s - - ''' % (vName, ssl_prot, path, siteName, domains, public.GetConfigValue('logs_path') + '/' + siteName, + DirectoryIndex %s + +''' % (vName, ssl_prot, path, siteName, domains, public.GetConfigValue('logs_path') + '/' + siteName, public.GetConfigValue('logs_path') + '/' + siteName, ap_proxy, get.first_domain, get.first_domain, self.get_tls_protocol(is_apache=True), ap_static_security, phpConfig, path, apaOpt, index) @@ -3054,25 +2855,16 @@ listener SSL443 {{ try: self.set_ols_ssl(get, siteName) isError = public.checkWebConfig() - if (isError != True): + if isError is not True: if os.path.exists(self.nginx_conf_bak): shutil.copyfile(self.nginx_conf_bak, ng_file) if os.path.exists(self.apache_conf_bak): shutil.copyfile(self.apache_conf_bak, file) public.ExecShell("rm -f /tmp/backup_*.conf") return public.returnMsg(False, 'ssl cert wrong:
' + isError.replace("\n", '
') + '
') - - # sql = public.M('firewall') - # import firewalls - # get.port = ssl_prot - # get.ps = 'HTTPS' - # if 'isBatch' not in get: firewalls.firewalls().AddAcceptPort(get) - # if 'isBatch' not in get: public.serviceReload() - self.save_cert(get) - public.WriteLog('Site manager', 'Site [{}] turned on SSL successfully!'.format(siteName)) - except Exception as ols_err: public.print_log(f"set ols conf error: {ols_err}") - + + public.WriteLog('Site manager', 'Site [{}] turned on SSL successfully!'.format(siteName)) result = public.returnMsg(True, 'SITE_SSL_OPEN_SUCCESS') result['csr'] = public.readFile('/www/server/panel/vhost/cert/' + get.siteName + '/fullchain.pem') result['key'] = public.readFile('/www/server/panel/vhost/cert/' + get.siteName + '/privkey.pem') @@ -3081,17 +2873,6 @@ listener SSL443 {{ else: return public.returnMsg(True, "") - def save_cert(self, get): - # try: - import panel_ssl_v2 as panelSSL - ss = panelSSL.panelSSL() - get.keyPath = '/www/server/panel/vhost/cert/' + get.siteName + '/privkey.pem' - get.certPath = '/www/server/panel/vhost/cert/' + get.siteName + '/fullchain.pem' - return ss.SaveCert(get) - # return public.return_message(0, 0, public.lang("")) - # except: - # return False; - # HttpToHttps def HttpToHttps(self, get): # 校验参数 @@ -3355,10 +3136,7 @@ listener SSL443 {{ if not os.path.isfile(os.path.join(path, "fullchain.pem")) and not os.path.isfile( os.path.join(path, "privkey.pem")): path = os.path.join('/etc/letsencrypt/live/', siteName) - type = 0 - if os.path.exists(path + '/README'): type = 1 - if os.path.exists(path + '/partnerOrderId'): type = 2 - if os.path.exists(path + '/certOrderId'): type = 3 + csrpath = path + "/fullchain.pem" # 生成证书路径 keypath = path + "/privkey.pem" # 密钥文件路径 key = public.readFile(keypath) @@ -3369,24 +3147,6 @@ listener SSL443 {{ if not os.path.exists(file): file = self.setupPath + '/panel/vhost/' + public.get_webserver() + '/node_' + siteName + '.conf' - if not os.path.exists(file): - file = self.setupPath + '/panel/vhost/' + public.get_webserver() + '/java_' + siteName + '.conf' - - if not os.path.exists(file): - file = self.setupPath + '/panel/vhost/' + public.get_webserver() + '/go_' + siteName + '.conf' - - if not os.path.exists(file): - file = self.setupPath + '/panel/vhost/' + public.get_webserver() + '/other_' + siteName + '.conf' - - if not os.path.exists(file): - file = self.setupPath + '/panel/vhost/' + public.get_webserver() + '/python_' + siteName + '.conf' - - if not os.path.exists(file): - file = self.setupPath + '/panel/vhost/' + public.get_webserver() + '/net_' + siteName + '.conf' - - if not os.path.exists(file): - file = self.setupPath + '/panel/vhost/' + public.get_webserver() + '/html_' + siteName + '.conf' - if public.get_webserver() == "openlitespeed": file = self.setupPath + '/panel/vhost/' + public.get_webserver() + '/detail/' + siteName + '.conf' @@ -3403,65 +3163,41 @@ listener SSL443 {{ status = True if conf.find(keyText) == -1: status = False - type = -1 toHttps = self.IsToHttps(siteName) id = public.M('sites').where("name=?", (siteName,)).getField('id') domains = public.M('domain').where("pid=?", (id,)).field('name').select() email = public.M('users').where('id=?', (1,)).getField('email') if email == '287962566@qq.com': email = '' - index = '' - auth_type = 'http' - if status is True: - if type != 1: - import acme_v2 - acme = acme_v2.acme_v2() - index = acme.check_order_exists(csrpath) - if index: - if index.find('/') == -1: - auth_type = acme._config['orders'][index]['auth_type'] - type = 1 - else: - crontab_file = 'vhost/cert/crontab.json' - tmp = public.readFile(crontab_file) - if tmp: - crontab_config = json.loads(tmp) - if siteName in crontab_config: - if 'dnsapi' in crontab_config[siteName]: - auth_type = 'dns' - - if os.path.exists(path + '/certOrderId'): type = 3 - oid = -1 - if type == 3: - oid = int(public.readFile(path + '/certOrderId')) # ================== domian ssl v2 part ========================= - try: - from ssl_domainModelV2.service import CertHandler - from ssl_domainModelV2.model import DnsDomainSSL - ssl = DnsDomainSSL.objects.filter(hash=CertHandler.get_hash(csr)).first() - if not ssl: - ssl = None - res = { - 'status': status, - 'oid': oid, - 'domain': domains, - 'key': key, - 'csr': csr, - 'type': type, - 'httpTohttps': toHttps, - 'cert_data': CertHandler.get_cert_info(cert_file_path=csrpath), - 'email': email, - "index": index, - 'auth_type': auth_type, - 'tls_versions': self.get_ssl_protocol(get), - 'push': self.get_site_push_status(None, siteName, 'ssl'), - 'hash': CertHandler.get_hash(cert_pem=csr), - 'auto_renew': ssl.auto_renew if ssl else 0, - } - except Exception as e: - return public.fail_v2(e) + from ssl_domainModelV2.service import CertHandler + from ssl_domainModelV2.model import DnsDomainSSL + ssl = DnsDomainSSL.objects.filter(hash=CertHandler.get_hash(csr)).first() + if ssl: + auto_renew = ssl.auto_renew + oid = int(ssl.order_info.get("oid", -1)) if ssl else -1 + auth_type = ssl.auth_info.get("auth_type", "http") if oid != -1 else "dns" + else: + auto_renew = -1 + oid = -1 + auth_type = 'http' + res = { + 'status': status, + 'oid': oid, + 'domain': domains, + 'key': key, + 'csr': csr, + 'httpTohttps': toHttps, + 'cert_data': CertHandler.get_cert_info(cert_file_path=csrpath) if ssl else None, + 'email': email, + 'auth_type': auth_type, + 'tls_versions': self.get_ssl_protocol(get), + 'push': self.get_site_push_status(None, siteName, 'ssl'), + 'hash': CertHandler.get_hash(cert_pem=csr), + 'auto_renew': auto_renew, + } return public.success_v2(res) def get_site_push_status(self, get, siteName=None, stype=None): @@ -8636,32 +8372,40 @@ RewriteRule \.(BTPFILE)$ /404.html [R,NC] def get_wp_security_status(self, get): domain_list = public.S('sites').where_in('project_type', 'WP2').field('id,name,path').select() data = [] + + # 获取网站waf数据 + from panel_plugin_v2 import panelPlugin + obj = panelPlugin() + waf_obj = obj.get_soft_find(public.to_dict_obj({"sName":"btwaf"})) + waf_status = waf_obj["message"].get("status") if waf_obj.get("status") in [0, '0'] else False + + waf_data = {} + if waf_status: + # 先尝试从json中获取数据 + waf_path = "/www/server/btwaf/site.json" + if os.path.exists(waf_path): + try: + waf_data = json.loads(public.readFile(waf_path)) + except: + pass + + # 获取失败尝试从插件中获取 + try: + if not waf_data: + waf_data = public.run_plugin('btwaf', 'get_site_config', None) + except: + pass + for i in domain_list: info = public.to_dict_obj(i) info.site_name = info.name - # try: - # res = self.get_wp_security_info(info) - # if not res["status"] == 0: - # data.append({i['name']: False}) - # continue - # - # if res['message']["file_status"] == 1 and res['message']["firewall_status"] == 1: - # data.append({i['name']: True}) - # continue - # - # data.append({i['name']: False}) - # - # except Exception as e: - # data.append({i['name']: False}) - # 获取防火墙状态 firewall_status = 0 try: - result = public.run_plugin('btwaf', 'get_site_config_byname', - public.to_dict_obj({'siteName': info.site_name})) - if result['open']: - firewall_status = 1 + if info.site_name in waf_data: + if waf_data[info.site_name].get("open") in [True,'true']: + firewall_status = 1 except: pass @@ -11901,16 +11645,7 @@ server #error_page 502 /502.html; #ERROR-PAGE-END {begin_deny} - - location ~* \.(js|css|png|jpg|jpeg|gif|ico|bmp|webp|woff|woff2|svg)$ {{ - root {site_path}; - expires 30d; - access_log off; - add_header Cache-Control "public, no-transform"; - try_files $uri =404; - }} - - + location / {{ proxy_pass http://{site_name}; proxy_http_version 1.1; @@ -11990,14 +11725,6 @@ server #error_page 502 /502.html; #ERROR-PAGE-END {begin_deny} - - location ~* \.(js|css|png|jpg|jpeg|gif|ico|bmp|webp|woff|woff2|svg)$ {{ - root {site_path}; - expires 30d; - access_log off; - add_header Cache-Control "public, no-transform"; - try_files $uri =404; - }} location / {{ proxy_pass http://{site_name}; diff --git a/class_v2/panel_ssl_v2.py b/class_v2/panel_ssl_v2.py index ab5c50e4..54b7fe34 100644 --- a/class_v2/panel_ssl_v2.py +++ b/class_v2/panel_ssl_v2.py @@ -25,7 +25,7 @@ try: except: pass - +# todo废弃, 仅保留若干用户信息接口 class panelSSL: # __APIURL = public.GetConfigValue('home') + '/api/Auth' # __APIURL2 = public.GetConfigValue('home') + '/api/Cert' @@ -183,7 +183,7 @@ class panelSSL: return public.return_message(-1,0, '%s
%s' % ( public.lang("Failed to connect server!"), str(rtmp))) -# 删除Token todo + # 删除Token todo def DelToken(self, get): uinfo = public.readFile(self.__UPATH) try: diff --git a/class_v2/power_mta/maillog_stat.py b/class_v2/power_mta/maillog_stat.py index e97c4a43..2c641f17 100644 --- a/class_v2/power_mta/maillog_stat.py +++ b/class_v2/power_mta/maillog_stat.py @@ -904,7 +904,9 @@ def query_maillog_with_time_section(query: SqliteEasy, start_time: int = -1, end end_time = int(time.time()) if end_time < start_time: - raise ValueError(public.lang('end_time must greater than start_time')) + # raise ValueError(public.lang('end_time must greater than start_time')) + # todo 暂时跳过 + return [] ret = [] diff --git a/class_v2/projectModelV2/base.py b/class_v2/projectModelV2/base.py index c47f27cb..050472a2 100644 --- a/class_v2/projectModelV2/base.py +++ b/class_v2/projectModelV2/base.py @@ -1,7 +1,31 @@ -#coding: utf-8 -import public,re +# coding: utf-8 +import json +import os +import pwd +import re +from typing import Union -class projectBase: +import public +public.sys_path_append("class_v2") +from projectModelV2.common import LimitNet, Redirect +from public.exceptions import HintException + +try: + from public.hook_import import hook_import + + hook_import() +except: + pass +try: + import idna +except: + public.ExecShell('btpip install idna') + import idna + + +class projectBase(LimitNet, Redirect): + def __init__(self): + self._is_nginx_http3 = None def check_port(self, port): ''' @@ -27,10 +51,10 @@ class projectBase: @author: lkq 2021-08-28 ''' import re - domain_regex = re.compile(r'(?:[A-Z0-9_](?:[A-Z0-9-_]{0,247}[A-Z0-9])?\.)+(?:[A-Z]{2,6}|[A-Z0-9-]{2,}(?= 1000 的用户 和 root + get中包含 sys_user 返回 uid>= 100 的用户 和 root + get中包含 all_user 返回所有的用户 + """ + sys_user = False + all_user = False + if get is not None: + if hasattr(get, "sys_user"): + sys_user = True + if hasattr(get, "all_user"): + all_user = True + + user_set = set() + try: + for tmp_uer in pwd.getpwall(): + if tmp_uer.pw_uid == 0: + user_set.add(tmp_uer.pw_name) + elif tmp_uer.pw_uid >= 1000: + user_set.add(tmp_uer.pw_name) + elif sys_user and tmp_uer.pw_uid >= 100: + user_set.add(tmp_uer.pw_name) + elif all_user: + user_set.add(tmp_uer.pw_name) + except Exception: + pass + return list(user_set) + + @staticmethod + def _pass_dir_for_user(path_dir: str, user: str): + """ + 给某个用户,对应目录的执行权限 + """ + import stat + if not os.path.isdir(path_dir): + return + try: + import pwd + uid_data = pwd.getpwnam(user) + uid = uid_data.pw_uid + gid = uid_data.pw_gid + except: + return + + if uid == 0: + return + + if path_dir[:-1] == "/": + path_dir = path_dir[:-1] + + while path_dir != "/": + path_dir_stat = os.stat(path_dir) + if path_dir_stat.st_uid != uid or path_dir_stat.st_gid != gid: + old_mod = stat.S_IMODE(path_dir_stat.st_mode) + if not old_mod & 1: + os.chmod(path_dir, old_mod + 1) + path_dir = os.path.dirname(path_dir) + + @staticmethod + def start_by_user(project_id): + file_path = "{}/data/push/tips/project_stop.json".format(public.get_panel_path()) + if not os.path.exists(file_path): + data = {} + else: + data_content = public.readFile(file_path) + try: + data = json.loads(data_content) + except json.JSONDecodeError: + data = {} + data[str(project_id)] = False + public.writeFile(file_path, json.dumps(data)) + + @staticmethod + def stop_by_user(project_id): + file_path = "{}/data/push/tips/project_stop.json".format(public.get_panel_path()) + if not os.path.exists(file_path): + data = {} + else: + data_content = public.readFile(file_path) + try: + data = json.loads(data_content) + except json.JSONDecodeError: + data = {} + data[str(project_id)] = True + public.writeFile(file_path, json.dumps(data)) + + @staticmethod + def is_stop_by_user(project_id): + file_path = "{}/data/push/tips/project_stop.json".format(public.get_panel_path()) + if not os.path.exists(file_path): + data = {} + else: + data_content = public.readFile(file_path) + try: + data = json.loads(data_content) + except json.JSONDecodeError: + data = {} + if str(project_id) not in data: + return False + return data[str(project_id)] + + def is_nginx_http3(self): + """判断nginx是否可以使用http3""" + if getattr(self, "_is_nginx_http3", None) is None: + _is_nginx_http3 = public.ExecShell("nginx -V 2>&1| grep 'http_v3_module'")[0] != '' + setattr(self, "_is_nginx_http3", _is_nginx_http3) + return self._is_nginx_http3 + + @staticmethod + def _check_webserver(): + setup_path = public.GetConfigValue('setup_path') + ng_path = setup_path + '/nginx/sbin/nginx' + ap_path = setup_path + '/apache/bin/apachectl' + op_path = '/usr/local/lsws/bin/lswsctrl' + not_server = False + if not os.path.exists(ng_path) and not os.path.exists(ap_path) and not os.path.exists(op_path): + not_server = True + if not not_server: + raise HintException(public.lang("Not Found any Web Server")) + + tasks = public.M('tasks').where("status!=? AND type!=?", ('1', 'download')).field('id,name').select() + for task in tasks: + name = task["name"].lower() + if name.find("openlitespeed") != -1: + raise HintException(public.lang("Installing OpenLiteSpeed, please wait")) + if name.find("nginx") != -1: + raise HintException(public.lang("Installing Nginx, please wait")) + if name.lower().find("apache") != -1: + raise HintException(public.lang("Installing Apache, please wait")) + + # 域名编码转换 + @staticmethod + def domain_to_puny_code(domain): + match = re.search(u"[^u\0000-u\001f]+", domain) + if not match: + return domain + try: + if domain.startswith("*."): + return "*." + idna.encode(domain[2:]).decode("utf8") + else: + return idna.encode(domain).decode("utf8") + except: + return domain + + # 判断域名是否有效,并返回 + def check_domain(self, domain: str) -> Union[str, bool]: + domain = self.domain_to_puny_code(domain) + # 判断通配符域名格式 + if domain.find('*') != -1 and domain.find('*.') == -1: + return False + from ssl_domainModelV2.service import DomainValid + if not DomainValid.is_valid_domain(domain): + return False + return domain + + def _release_firewall(self, get) -> tuple[bool, str]: + """尝试放行端口 + @author baozi <202-04-18> + @param: + get ( dict_obj ): 创建项目的请求 + @return + """ + + release = getattr(get, "release_firewall", None) + if release in ("0", '', None, False, 0): + return False, public.lang("PS: port not released in firewall, local access only") + port = getattr(get, "port", None) + project_name = getattr(get, "name", "") or getattr(get, "pjname", "") or getattr(get, "project_name", "") + if port is None: + return True, "" + + new_get = public.dict_obj() + new_get.protocol = "tcp" + new_get.ports = str(port) + new_get.choose = "all" + new_get.address = "" + new_get.domain = "" + new_get.types = "accept" + new_get.brief = "Site Project: " + project_name + " release port " + new_get.source = "" + try: + res = None + from safeModelV2.firewallModel import main as firewall + firewall_obj = firewall() + get_obj = public.dict_obj() + get_obj.p = 1 + get_obj.limit = 99 + get_obj.query = str(port) + res_data = firewall_obj.get_rules_list(get_obj) # 查询是否已经有端口 + res_data = public.find_value_by_key(res_data, key="data", default=[]) + if len(res_data) == 0: + res = firewall_obj.create_rules(new_get) + for i in res_data: + new_get.id = i.get("id") + res = firewall_obj.modify_rules(new_get) + + if res.get("status"): + return True, "" + return False, public.lang("PS: port not released in firewall, local access only") + except: + return False, public.lang("PS: port not released in firewall, local access only") + diff --git a/class_v2/safeModelV2/serversafeModel.py b/class_v2/safeModelV2/serversafeModel.py new file mode 100644 index 00000000..b92a9dc9 --- /dev/null +++ b/class_v2/safeModelV2/serversafeModel.py @@ -0,0 +1,393 @@ +# coding: utf-8 +# ------------------------------------------------------------------- +# aaPanel +# ------------------------------------------------------------------- +# Copyright (c) 2014-2099 aaPanel(www.aapanel.com) All rights reserved. +# ------------------------------------------------------------------- +# Author: aapanel +# ------------------------------------------------------------------- + +# ------------------------------ +# server safe app +# ------------------------------ +import json +import os +import re +from copy import deepcopy +from typing import Callable + +import public +from public.exceptions import HintException +from public.validate import Param + +public.sys_path_append("class_v2/") +from ssh_security_v2 import ssh_security +from config_v2 import config + + +class main: + def __init__(self): + # {name:安全项名称,desc:描述, + # suggest:修复建议,check:检查函数,repair:修复函数,value:获取当前值函数,status:状态} + self.config = [ + { + "name": "Default SSH Port", + "desc": public.lang("Modify the default SSH port to improve server security"), + "suggest": public.lang("Use a high port other than 22"), + "check": self.check_ssh_port, + }, + { + "name": "Password Complexity Policy", + "desc": public.lang("Enable password complexity check to ensure password security"), + "suggest": public.lang("Use a level greater than 3"), + "check": self.check_ssh_minclass, + "repair": self.repair_ssh_minclass, + }, + { + "name": "Password Length Limit", + "desc": public.lang("Set minimum password length requirement"), + "suggest": public.lang("Use a password of 9-20 characters"), + "check": self.check_ssh_security, + "repair": self.repair_ssh_passwd_len, + }, + { + "name": "SSH Login Alert", + "desc": public.lang("Send alert notification upon SSH login"), + "suggest": public.lang("Enable SSH login alert"), + "check": self.check_ssh_login_sender, + }, + { + "name": "Root Login Settings", + "desc": public.lang("It is recommended to allow key-based login only"), + "suggest": public.lang("Allow only SSH key-based login"), + "check": self.check_ssh_login_root_with_key, + }, + { + "name": "SSH Brute-force", + "desc": public.lang("Prevent SSH brute-force attacks"), + "suggest": public.lang("Enable SSH brute-force protection"), + "check": self.check_ssh_fail2ban_brute, + }, + { + "name": "Panel Login Alert", + "desc": public.lang("Send alert notification upon panel login"), + "suggest": public.lang("Enable panel login alert"), + "check": self.check_panel_swing, + }, + { + "name": "Panel Google Authenticator login", + "desc": public.lang("Enable TOTP for enhanced security"), + "suggest": public.lang("Enable OTP authentication"), + "check": self.check_panel_login_2fa, + }, + { + "name": "UnAuth Response Status Code", + "desc": public.lang("Set the HTTP response status code for unauthenticated access"), + "suggest": public.lang("Set 404 as the response code"), + "check": self.check_panel_not_auth_code, + }, + { + "name": "Panel SSL", + "desc": public.lang("Enable HTTPS encrypted transmission (after setting will restart the panel)"), + "suggest": public.lang("Enable panel HTTPS"), + "check": self.check_panel_ssl, + } + ] + self.ssh_security_obj = ssh_security() + self.config_obj = config() + + def get_security_info(self, get=None): + """ + 获取安全评分 + """ + new_list = deepcopy(self.config) + for idx, module in enumerate(new_list): + if isinstance(module.get("check"), Callable): + try: + module["id"] = int(idx) + 1 + check_status = module["check"]() + module["status"] = check_status.get("status", False) + module["value"] = check_status.get("value") + except: + module["status"] = False + module["value"] = None + + if "check" in module and isinstance(module["check"], Callable): + del module["check"] + if "repair" in module and isinstance(module["repair"], Callable): + del module["repair"] + if "value" not in module: + module["value"] = None + + total_score = 100 # 总分 + score = total_score / len(new_list) # 每条的分数 + missing_count = 0 # 缺少的条数 + for module in new_list: + if module["status"] is False: + missing_count += 1 + # 计算总分 + security_score = total_score - (missing_count * score) + security_score = round(security_score, 2) + + # 计算得分文本 + if security_score >= 90: + score_text = public.lang("Secure") + elif security_score >= 70: + score_text = public.lang("Relatively Secure") + elif security_score >= 50: + score_text = public.lang("Average Security") + else: + score_text = public.lang("Insecure") + + public.set_module_logs("server_secury", "get_security_info", 1) + return public.success_v2({ + "security_data": new_list, + "total_score": total_score, + "score_text": score_text, + "score": int(security_score) + }) + + def install_fail2ban(self, get): + from panel_plugin_v2 import panelPlugin + public.set_module_logs("server_secury", "install_fail2ban", 1) + return panelPlugin().install_plugin(get) + + def repair_security(self, get): + """ + @name 修复安全项 + @parma {"name":"","args":{}} + """ + try: + get.validate([ + Param("name").String().Require(), + Param("args").Dict().Require(), + ], [public.validate.trim_filter()]) + except Exception as ex: + public.print_log("error info: {}".format(ex)) + return public.fail_v2(str(ex)) + + for security in self.config: + if security.get("name") == get.name and isinstance(security.get("repair"), Callable): + return security["repair"](public.to_dict_obj(get.args)) + raise HintException(public.lang(f"Security Repair Item [{get.name}] Not Found!")) + + @staticmethod + def _find_pwquality_conf_with_keyword(re_search: str) -> str: + """ + 读取ssh密码复杂度配置 + @param re_search: 正则表达式 + """ + try: + if not re_search: + raise HintException("required parameter re_search") + p_file = '/etc/security/pwquality.conf' + p_body = public.readFile(p_file) + if not p_body: + return "" # 无配置文件时 + tmp = re.findall(re_search, p_body, re.M) + if not tmp: + return "" # 未设置minclass + find = tmp[0].strip() + return find + except: + return "" # 异常时认为无 + + # =================== 检查函数 =================== + def check_ssh_port(self) -> dict: + """ + @name 检查SSH端口是否为默认端口22 + """ + current_port = public.get_ssh_port() + return {"status": current_port != 22, "value": current_port} + + def check_ssh_minclass(self) -> dict: + """ + @name 检查SSH密码复杂度策略 + """ + re_pattern = r"\n\s*minclass\s+=\s+(.+)" + find = self._find_pwquality_conf_with_keyword(re_pattern) + if not find: + return {"status": False, "value": None} # 未设置minclass + minclass_value = int(find) + return {"status": minclass_value >= 3, "value": minclass_value} + + def check_ssh_security(self) -> dict: + """ + @name 检查SSH密码长度限制 + """ + re_pattern = r"\s*minlen\s+=\s+(.+)" + find = self._find_pwquality_conf_with_keyword(re_pattern) + if not find: + return {"status": True, "value": None} # 未设置minlen时认为无风险 + minlen_value = int(find) + return {"status": minlen_value >= 9, "value": minlen_value} + + def check_panel_swing(self) -> dict: + """ + @name 检查面板登录告警是否开启 + """ + tip_files = [ + "panel_login_send.pl", "login_send_type.pl", "login_send_mail.pl", "login_send_dingding.pl" + ] + enabled_files = [] + for fname in tip_files: + filename = "data/" + fname + if os.path.exists(filename): + enabled_files.append(fname) + break + + is_enabled = len(enabled_files) > 0 + value = None + if not is_enabled: + return {"status": False, "value": value} + + task_file_path = "/www/server/panel/data/mod_push_data/task.json" + sender_file_path = "/www/server/panel/data/mod_push_data/sender.json" + task_data = {} + try: + with open(task_file_path, "r") as file: + tasks = json.load(file) + # 读取发送者配置文件 + with open(sender_file_path, "r") as file: + senders = json.load(file) + sender_dict = { + sender["id"]: sender for sender in senders + } + # 查找特定的告警任务 + for task in tasks: + if task.get("keyword") == "panel_login": + task_data = task + sender_types = set() # 使用集合来保证类型的唯一性 + # 对应sender的ID,获取sender_type,并保证唯一性 + for sender_id in task.get("sender", []): + if sender_id in sender_dict: + sender_types.add(sender_dict[sender_id]["sender_type"]) + # 将唯一的通道类型列表转回列表格式,添加到告警数据中 + task_data["channels"] = list(sender_types) + break + except: + pass + value = task_data + return {"status": value.get("status", False), "value": value} + + def check_ssh_login_sender(self) -> dict: + """ + @name 检查SSH登录告警是否启用 + """ + result = self.ssh_security_obj.get_login_send(None) + res = public.find_value_by_key( + result, "result", "error" + ) + return {"status": res != "error", "value": res} + + def check_ssh_login_root_with_key(self) -> dict: + """ + @name 检查SSH是否仅允许密钥登录root + """ + parsed = self.ssh_security_obj.paser_root_login() + current_policy = None + try: + current_policy = parsed[1] + except Exception as e: + import traceback + public.print_log("error info: {}".format(traceback.format_exc())) + return {"status": current_policy == "without-password", "value": current_policy} + + def check_ssh_fail2ban_brute(self) -> dict: + """ + @name 检查SSH防爆破是否启用 + """ + from safeModelV2.sshModel import main as sshmod + cfg = sshmod._get_ssh_fail2ban() or {} + current_value = cfg.get("status", 0) + return {"status": current_value == 1, "value": current_value} + + def check_panel_login_2fa(self) -> dict: + """ + @name 检查面板登录动态口令认证是否启用 + """ + current_value = self.config_obj.check_two_step(None) + res = public.find_value_by_key( + current_value, "result", False + ) + return {"status": bool(res), "value": res} + + def check_panel_not_auth_code(self) -> dict: + """ + @name 检查面板未登录响应状态码是否设置为 400+ + """ + current_code = self.config_obj.get_not_auth_status() + return {"status": current_code != 0, "value": current_code} + + def check_panel_ssl(self): + """ + @name 检查面板是否开启SSL + """ + enabled = os.path.exists("data/ssl.pl") + return {"status": bool(enabled), "value": enabled} + + # =================== 修复函数 =================== + def repair_ssh_minclass(self, get): + """ + @name 修复SSH密码复杂度 + @param {"minclass":9} + """ + try: + get.validate([ + Param("minclass").Integer(">", 0).Require(), + ], [public.validate.trim_filter()]) + except Exception as ex: + public.print_log("error info: {}".format(ex)) + return public.fail_v2(str(ex)) + + minclass = int(get.minclass) + file = "/etc/security/pwquality.conf" + result = { + "status": False, "msg": public.lang("Failed to set SSH password complexity, " + "please disable system hardening or set it manually") + } + if not os.path.exists(file): + public.ExecShell("apt install libpam-pwquality -y") + if os.path.exists(file): + f_data = public.readFile(file) + if re.findall("\n\s*minclass\s*=\s*\d*", f_data): + file_result = re.sub("\n\s*minclass\s*=\s*\d*", "\nminclass = {}".format(minclass), f_data) + else: + file_result = f_data + "\nminclass = {}".format(minclass) + public.writeFile(file, file_result) + f_data = public.readFile(file) + if f_data.find("minclass = {}".format(minclass)) != -1: + result["status"] = True + result["msg"] = public.lang("SSH minimum password complexity has been set") + return public.return_message(0 if result["status"] else 1, 0, result["msg"]) + + def repair_ssh_passwd_len(self, get): + """ + @name SSH密码最小长度设置 + @param {"len":9} + """ + try: + get.validate([ + Param("len").Integer(">", 0).Require(), + ], [public.validate.trim_filter()]) + except Exception as ex: + public.print_log("error info: {}".format(ex)) + return public.fail_v2(str(ex)) + + pwd_len = int(get.len) + file = "/etc/security/pwquality.conf" + result = { + "status": False, "msg": public.lang("Failed to set SSH minimum password length, please set it manually") + } + if not os.path.exists(file): + public.ExecShell("apt install libpam-pwquality -y") + if os.path.exists(file): + f_data = public.readFile(file) + ssh_minlen = "\n#?\s*minlen\s*=\s*\d*" + file_result = re.sub(ssh_minlen, "\nminlen = {}".format(pwd_len), f_data) + public.writeFile(file, file_result) + f_data = public.readFile(file) + if f_data.find("minlen = {}".format(pwd_len)) != -1: + result["status"] = True + result["msg"] = "SSH minimum password length has been set to {}".format(pwd_len) + return public.return_message(0 if result["status"] else 1, 0, result["msg"]) diff --git a/class_v2/safeModelV2/sshModel.py b/class_v2/safeModelV2/sshModel.py index 2b8ecc0c..42aa3adf 100644 --- a/class_v2/safeModelV2/sshModel.py +++ b/class_v2/safeModelV2/sshModel.py @@ -276,11 +276,12 @@ class main(safeBase): if tmp == '1': isPing = False except: isPing = True - + from ssh_security_v2 import ssh_security data = {} data['port'] = port data['status'] = status data['ping'] = isPing + data['config'] = ssh_security().get_config(None).get("message", {}) data['firewall_status'] = self.CheckFirewallStatus() # data['error'] = self.get_ssh_intrusion(get) data['fail2ban'] = self._get_ssh_fail2ban() diff --git a/class_v2/ssh_security_v2.py b/class_v2/ssh_security_v2.py index 306278e1..8afb76c5 100644 --- a/class_v2/ssh_security_v2.py +++ b/class_v2/ssh_security_v2.py @@ -1,22 +1,21 @@ -#coding: utf-8 -#------------------------------------------------------------------- +# coding: utf-8 +# ------------------------------------------------------------------- # aaPanel -#------------------------------------------------------------------- +# ------------------------------------------------------------------- # Copyright (c) 2015-2017 aaPanel(www.aapanel.com) All rights reserved. -#------------------------------------------------------------------- +# ------------------------------------------------------------------- # Author: lkqiang -#------------------------------------------------------------------- +# ------------------------------------------------------------------- # SSH 安全类 -#------------------------------ -import public,os,re,send_mail,json -from datetime import datetime +# ------------------------------ +import public, os, re, send_mail, json from public.validate import Param class ssh_security: - __type_list = ['ed25519','ecdsa','rsa', 'dsa'] + __type_list = ['ed25519', 'ecdsa', 'rsa', 'dsa'] __key_type_file = '{}/data/ssh_key_type.pl'.format(public.get_panel_path()) - __key_files = ['/root/.ssh/id_ed25519','/root/.ssh/id_ecdsa','/root/.ssh/id_rsa','/root/.ssh/id_rsa_bt'] + __key_files = ['/root/.ssh/id_ed25519', '/root/.ssh/id_ecdsa', '/root/.ssh/id_rsa', '/root/.ssh/id_rsa_bt'] __type_files = { "ed25519": "/root/.ssh/id_ed25519", "ecdsa": "/root/.ssh/id_ecdsa", @@ -25,102 +24,109 @@ class ssh_security: } open_ssh_login = public.get_panel_path() + '/data/open_ssh_login.pl' - __SSH_CONFIG='/etc/ssh/sshd_config' + __SSH_CONFIG = '/etc/ssh/sshd_config' __ip_data = None - __ClIENT_IP='/www/server/panel/data/host_login_ip.json' + __ClIENT_IP = '/www/server/panel/data/host_login_ip.json' __pyenv = 'python' - __REPAIR={"1":{"id":1, - "type":"file", - "harm":"High", - "repaired":"1", - "level":"3", - "name":"Make sure SSH MaxAuthTries is set between 3-6", - "file":"/etc/ssh/sshd_config", - "Suggestions":"Remove the MaxAuthTries comment symbol # in /etc/ssh/sshd_config, set the maximum number of failed password attempts 3-6 recommended 4", - "repair":"MaxAuthTries 4", - "rule":[{"re":"\nMaxAuthTries\\s*(\\d+)","check":{"type":"number","max":7,"min":3}}], - "repair_loophole":[{"re":"\n?#?MaxAuthTries\\s*(\\d+)","check":"\nMaxAuthTries 4"}]}, - "2":{"id":2, - "repaired":"1", - "type":"file", - "harm":"High", - "level":"3", - "name":"SSHD Mandatory use of V2 security protocol", - "file":"/etc/ssh/sshd_config", - "Suggestions":"Set parameters in the /etc/ssh/sshd_config file as follows", - "repair":"Protocol 2", - "rule":[{"re":"\nProtocol\\s*(\\d+)", - "check":{"type":"number","max":3,"min":1}}], - "repair_loophole":[{"re":"\n?#?Protocol\\s*(\\d+)","check":"\nProtocol 2"}]}, - "3":{"id":3, - "repaired":"1", - "type":"file", - "harm":"High", - "level":"3", - "name":"Set SSH idle exit time", - "file":"/etc/ssh/sshd_config", - "Suggestions":"Set ClientAliveInterval to 300 to 900 in /etc/ssh/sshd_config, which is 5-15 minutes, and set ClientAliveCountMax to 0-3", - "repair":"ClientAliveInterval 600 ClientAliveCountMax 2", - "rule":[{"re":"\nClientAliveInterval\\s*(\\d+)","check":{"type":"number","max":900,"min":300}}], - "repair_loophole":[{"re":"\n?#?ClientAliveInterval\\s*(\\d+)","check":"\nClientAliveInterval 600"}]}, - "4":{"id":4, - "repaired":"1", - "type":"file", - "harm":"High", - "level":"3", - "name":"Make sure SSH LogLevel is set to INFO", - "file":"/etc/ssh/sshd_config", - "Suggestions":"Set parameters in the /etc/ssh/sshd_config file as follows (uncomment)", - "repair":"LogLevel INFO", - "rule":[{"re":"\nLogLevel\\s*(\\w+)","check":{"type":"string","value":["INFO"]}}], - "repair_loophole":[{"re":"\n?#?LogLevel\\s*(\\w+)","check":"\nLogLevel INFO"}]}, - "5":{"id":5, - "repaired":"1", - "type":"file", - "harm":"High", - "level":"3", - "name":"Disable SSH users with empty passwords from logging in", - "file":"/etc/ssh/sshd_config", - "Suggestions":"Configure PermitEmptyPasswords to no in /etc/ssh/sshd_config", - "repair":"PermitEmptyPasswords no", - "rule":[{"re":"\nPermitEmptyPasswords\\s*(\\w+)","check":{"type":"string","value":["no"]}}], - "repair_loophole":[{"re":"\n?#?PermitEmptyPasswords\\s*(\\w+)","check":"\nPermitEmptyPasswords no"}]}, - "6":{"id":6, - "repaired":"1", - "type":"file", - "name":"SSH uses the default port 22", - "harm":"High", - "level":"3", - "file":"/etc/ssh/sshd_config", - "Suggestions":"Set Port to 6000 to 65535 in / etc / ssh / sshd_config", - "repair":"Port 60151", - "rule":[{"re":"Port\\s*(\\d+)","check":{"type":"number","max":65535,"min":22}}], - "repair_loophole":[{"re":"\n?#?Port\\s*(\\d+)","check":"\nPort 65531"}]}} - __root_login_types = {'yes':'yes - keys and passwords','no':'no - no login','without-password':'without-password - only key login','forced-commands-only':'forced-commands-only - can only execute commands'} - + __REPAIR = {"1": {"id": 1, + "type": "file", + "harm": "High", + "repaired": "1", + "level": "3", + "name": "Make sure SSH MaxAuthTries is set between 3-6", + "file": "/etc/ssh/sshd_config", + "Suggestions": "Remove the MaxAuthTries comment symbol # in /etc/ssh/sshd_config, set the maximum number of failed password attempts 3-6 recommended 4", + "repair": "MaxAuthTries 4", + "rule": [{"re": "\nMaxAuthTries\\s*(\\d+)", "check": {"type": "number", "max": 7, "min": 3}}], + "repair_loophole": [{"re": "\n?#?MaxAuthTries\\s*(\\d+)", "check": "\nMaxAuthTries 4"}]}, + "2": {"id": 2, + "repaired": "1", + "type": "file", + "harm": "High", + "level": "3", + "name": "SSHD Mandatory use of V2 security protocol", + "file": "/etc/ssh/sshd_config", + "Suggestions": "Set parameters in the /etc/ssh/sshd_config file as follows", + "repair": "Protocol 2", + "rule": [{"re": "\nProtocol\\s*(\\d+)", + "check": {"type": "number", "max": 3, "min": 1}}], + "repair_loophole": [{"re": "\n?#?Protocol\\s*(\\d+)", "check": "\nProtocol 2"}]}, + "3": {"id": 3, + "repaired": "1", + "type": "file", + "harm": "High", + "level": "3", + "name": "Set SSH idle exit time", + "file": "/etc/ssh/sshd_config", + "Suggestions": "Set ClientAliveInterval to 300 to 900 in /etc/ssh/sshd_config, which is 5-15 minutes, and set ClientAliveCountMax to 0-3", + "repair": "ClientAliveInterval 600 ClientAliveCountMax 2", + "rule": [{"re": "\nClientAliveInterval\\s*(\\d+)", + "check": {"type": "number", "max": 900, "min": 300}}], + "repair_loophole": [ + {"re": "\n?#?ClientAliveInterval\\s*(\\d+)", "check": "\nClientAliveInterval 600"}]}, + "4": {"id": 4, + "repaired": "1", + "type": "file", + "harm": "High", + "level": "3", + "name": "Make sure SSH LogLevel is set to INFO", + "file": "/etc/ssh/sshd_config", + "Suggestions": "Set parameters in the /etc/ssh/sshd_config file as follows (uncomment)", + "repair": "LogLevel INFO", + "rule": [{"re": "\nLogLevel\\s*(\\w+)", "check": {"type": "string", "value": ["INFO"]}}], + "repair_loophole": [{"re": "\n?#?LogLevel\\s*(\\w+)", "check": "\nLogLevel INFO"}]}, + "5": {"id": 5, + "repaired": "1", + "type": "file", + "harm": "High", + "level": "3", + "name": "Disable SSH users with empty passwords from logging in", + "file": "/etc/ssh/sshd_config", + "Suggestions": "Configure PermitEmptyPasswords to no in /etc/ssh/sshd_config", + "repair": "PermitEmptyPasswords no", + "rule": [ + {"re": "\nPermitEmptyPasswords\\s*(\\w+)", "check": {"type": "string", "value": ["no"]}}], + "repair_loophole": [ + {"re": "\n?#?PermitEmptyPasswords\\s*(\\w+)", "check": "\nPermitEmptyPasswords no"}]}, + "6": {"id": 6, + "repaired": "1", + "type": "file", + "name": "SSH uses the default port 22", + "harm": "High", + "level": "3", + "file": "/etc/ssh/sshd_config", + "Suggestions": "Set Port to 6000 to 65535 in / etc / ssh / sshd_config", + "repair": "Port 60151", + "rule": [{"re": "Port\\s*(\\d+)", "check": {"type": "number", "max": 65535, "min": 22}}], + "repair_loophole": [{"re": "\n?#?Port\\s*(\\d+)", "check": "\nPort 65531"}]}} + __root_login_types = {'yes': 'yes - keys and passwords', 'no': 'no - no login', + 'without-password': 'without-password - only key login', + 'forced-commands-only': 'forced-commands-only - can only execute commands'} def __init__(self): if not public.M('sqlite_master').where('type=? AND name=?', ('table', 'ssh_login_record')).count(): - public.M('').execute('''CREATE TABLE ssh_login_record ( - id INTEGER PRIMARY KEY AUTOINCREMENT, - addr TEXT, - server_ip TEXT, - user_agent TEXT, - ssh_user TEXT, - login_time INTEGER DEFAULT 0, - close_time INTEGER DEFAULT 0, - video_addr TEXT);''') + public.M('').execute('''CREATE TABLE ssh_login_record + ( + id INTEGER PRIMARY KEY AUTOINCREMENT, + addr TEXT, + server_ip TEXT, + user_agent TEXT, + ssh_user TEXT, + login_time INTEGER DEFAULT 0, + close_time INTEGER DEFAULT 0, + video_addr TEXT + );''') public.M('').execute('CREATE INDEX ssh_login_record ON ssh_login_record (addr);') if not os.path.exists(self.__ClIENT_IP): - public.WriteFile(self.__ClIENT_IP,json.dumps([])) - self.__mail=send_mail.send_mail() - self.__mail_config=self.__mail.get_settings() + public.WriteFile(self.__ClIENT_IP, json.dumps([])) + self.__mail = send_mail.send_mail() + self.__mail_config = self.__mail.get_settings() self._check_pyenv() try: self.__ip_data = json.loads(public.ReadFile(self.__ClIENT_IP)) except: - self.__ip_data=[] + self.__ip_data = [] def _check_pyenv(self): if os.path.exists('/www/server/panel/pyenv'): @@ -140,14 +146,12 @@ class ssh_security: return new_type return default_type - def return_python(self): - if os.path.exists('/www/server/panel/pyenv/bin/python'):return '/www/server/panel/pyenv/bin/python' - if os.path.exists('/usr/bin/python'):return '/usr/bin/python' - if os.path.exists('/usr/bin/python3'):return '/usr/bin/python3' + if os.path.exists('/www/server/panel/pyenv/bin/python'): return '/www/server/panel/pyenv/bin/python' + if os.path.exists('/usr/bin/python'): return '/usr/bin/python' + if os.path.exists('/usr/bin/python3'): return '/usr/bin/python3' return 'python' - def return_profile(self): if os.path.exists('/root/.bash_profile'): return '/root/.bash_profile' if os.path.exists('/etc/profile'): return '/etc/profile' @@ -156,14 +160,13 @@ class ssh_security: return '/root/.bash_profil' def return_bashrc(self): - if os.path.exists('/root/.bashrc'):return '/root/.bashrc' - if os.path.exists('/etc/bashrc'):return '/etc/bashrc' - if os.path.exists('/etc/bash.bashrc'):return '/etc/bash.bashrc' + if os.path.exists('/root/.bashrc'): return '/root/.bashrc' + if os.path.exists('/etc/bashrc'): return '/etc/bashrc' + if os.path.exists('/etc/bash.bashrc'): return '/etc/bash.bashrc' fd = open('/root/.bashrc', mode="w", encoding="utf-8") fd.close() return '/root/.bashrc' - def check_files(self): try: json.loads(public.ReadFile(self.__ClIENT_IP)) @@ -174,7 +177,7 @@ class ssh_security: conf = public.readFile(self.__SSH_CONFIG) if not conf: conf = '' rep = r"#*Port\s+([0-9]+)\s*\n" - tmp1 = re.search(rep,conf) + tmp1 = re.search(rep, conf) port = '22' if tmp1: port = tmp1.groups(0)[0] @@ -209,8 +212,8 @@ class ssh_security: return False return True - def san_ssh_security(self,get): - data={"num":100,"result":[]} + def san_ssh_security(self, get): + data = {"num": 100, "result": []} result = [] ret = self.check_san_baseline(self.__REPAIR['1']) if not ret: result.append(self.__REPAIR['1']) @@ -224,9 +227,9 @@ class ssh_security: if not ret: result.append(self.__REPAIR['5']) ret = self.check_san_baseline(self.__REPAIR['6']) if not ret: result.append(self.__REPAIR['6']) - data["result"]=result - if len(result)>=1: - data['num']=data['num']-(len(result)*10) + data["result"] = result + if len(result) >= 1: + data['num'] = data['num'] - (len(result) * 10) return data ################## SSH 登陆报警设置 #################################### @@ -236,7 +239,7 @@ class ssh_security: from panel_msg.collector import SitePushMsgCollect msg = SitePushMsgCollect.ssh_login(body) push_data = { - "login_ip": "" if body.find("backdoor user") != -1 else ( login_ip if login_ip != "" else "unknown ip"), + "login_ip": "" if body.find("backdoor user") != -1 else (login_ip if login_ip != "" else "unknown ip"), "msg_list": ['>Send content:' + body] } # public.print_log(push_data) @@ -265,12 +268,12 @@ class ssh_security: object = public.init_msg(login_type.strip()) if not object: return False - if login_type=="mail": - data={} + if login_type == "mail": + data = {} data['title'] = title data['msg'] = body object.push_data(data) - elif login_type=="wx_account": + elif login_type == "wx_account": from push.site_push import ToWechatAccountMsg if body.find("backdoor user") != -1: msg = ToWechatAccountMsg.ssh_login("") @@ -284,7 +287,7 @@ class ssh_security: except: pass - #检测非UID为0的账户 + # 检测非UID为0的账户 def check_user(self): ret = [] cfile = '/etc/passwd' @@ -296,21 +299,23 @@ class ssh_security: if i[0] == 'root': continue ret.append(i[0]) if ret: - data=''.join(ret) - public.run_thread(self.send_mail_data,args=(public.GetLocalIp()+' There is a backdoor user in the server',public.GetLocalIp()+' There is a backdoor user in the server '+data+' please check/etc/passwd',)) + data = ''.join(ret) + public.run_thread(self.send_mail_data, + args=(public.GetLocalIp() + ' There is a backdoor user in the server', + public.GetLocalIp() + ' There is a backdoor user in the server ' + data + ' please check/etc/passwd',)) return True else: return False - #记录root 的登陆日志 + # 记录root 的登陆日志 - #返回登陆IP - def return_ip(self,get): + # 返回登陆IP + def return_ip(self, get): self.check_files() # return public.returnMsg(True, self.__ip_data) return public.return_message(0, 0, self.__ip_data) - #添加IP白名单 + # 添加IP白名单 def add_return_ip(self, get): # 校验参数 @@ -356,23 +361,25 @@ class ssh_security: # return public.returnMsg(False, public.lang("IP does not exist")) return public.return_message(-1, 0, public.lang("IP does not exist")) - #取登陆的前50个条记录 + # 取登陆的前50个条记录 def login_last(self): self.check_files() - data=public.ExecShell('last -n 50') - data=re.findall(r"(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)",data[0]) - if data>=1: - data2=list(set(data)) + data = public.ExecShell('last -n 50') + data = re.findall(r"(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)", + data[0]) + if data >= 1: + data2 = list(set(data)) for i in data2: if not i in self.__ip_data: self.__ip_data.append(i) public.writeFile(self.__ClIENT_IP, json.dumps(self.__ip_data)) return self.__ip_data - #获取ROOT当前登陆的IP + # 获取ROOT当前登陆的IP def get_ip(self): data = public.ExecShell(''' who am i |awk ' {print $5 }' ''') - data = re.findall(r"(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)",data[0]) + data = re.findall(r"(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)", + data[0]) return data def get_logs(self, get): @@ -412,48 +419,51 @@ class ssh_security: def get_server_ip(self): if os.path.exists('/www/server/panel/data/iplist.txt'): - data=public.ReadFile('/www/server/panel/data/iplist.txt') + data = public.ReadFile('/www/server/panel/data/iplist.txt') return data.strip() - else:return '127.0.0.1' + else: + return '127.0.0.1' - - #登陆的情况下 + # 登陆的情况下 def login(self): self.check_files() self.check_user() self.__ip_data = json.loads(public.ReadFile(self.__ClIENT_IP)) - ip=self.get_ip() - if len(ip[0])==0:return False + ip = self.get_ip() + if len(ip[0]) == 0: return False try: import time mDate = time.strftime('%Y-%m-%d %X', time.localtime()) if ip[0] in self.__ip_data: - if public.M('logs').where('type=? addtime', ('SSH security',mDate,)).count():return False - public.WriteLog('SSH security', 'The server {} login IP is {}, login user is root'.format(public.GetLocalIp(),ip[0])) + if public.M('logs').where('type=? addtime', ('SSH security', mDate,)).count(): return False + public.WriteLog('SSH security', + 'The server {} login IP is {}, login user is root'.format(public.GetLocalIp(), ip[0])) return False else: if public.M('logs').where('type=? addtime', ('SSH security', mDate,)).count(): return False - self.send_mail_data('Server {} login alarm'.format(public.GetLocalIp()),'There is a login alarm on the server {}, the login IP is {}, the login user is root'.format(public.GetLocalIp(),ip[0])) - public.WriteLog('SSH security','There is a login alarm on the server {}, the login IP is {}, login user is root'.format(public.GetLocalIp(),ip [0])) + self.send_mail_data('Server {} login alarm'.format(public.GetLocalIp()), + 'There is a login alarm on the server {}, the login IP is {}, the login user is root'.format( + public.GetLocalIp(), ip[0])) + public.WriteLog('SSH security', + 'There is a login alarm on the server {}, the login IP is {}, login user is root'.format( + public.GetLocalIp(), ip[0])) return True except: pass - - - #修复bashrc文件 + # 修复bashrc文件 def repair_bashrc(self): data = public.ReadFile(self.return_bashrc()) if re.search(self.return_python() + ' /www/server/panel/class/ssh_security.py', data): - public.WriteFile(self.return_bashrc(),data.replace(self.return_python()+' /www/server/panel/class/ssh_security.py login','')) - #遗留的错误信息 + public.WriteFile(self.return_bashrc(), + data.replace(self.return_python() + ' /www/server/panel/class/ssh_security.py login', '')) + # 遗留的错误信息 datassss = public.ReadFile(self.return_bashrc()) - if re.search(self.return_python(),datassss): - public.WriteFile(self.return_bashrc(),datassss.replace(self.return_python(),'')) + if re.search(self.return_python(), datassss): + public.WriteFile(self.return_bashrc(), datassss.replace(self.return_python(), '')) - - #开启监控 - def start_jian(self,get): + # 开启监控 + def start_jian(self, get): self.repair_bashrc() data = public.ReadFile(self.return_profile()) if not re.search(self.return_python() + ' /www/server/panel/class/ssh_security.py', data): @@ -464,33 +474,35 @@ class ssh_security: return public.returnMsg(True, public.lang("Open successfully")) return public.returnMsg(False, public.lang("Open failed")) - #关闭监控 - def stop_jian(self,get): + # 关闭监控 + def stop_jian(self, get): data = public.ReadFile(self.return_profile()) - if re.search(self.return_python()+' /www/server/panel/class/ssh_security.py', data): - cmd='''shell="%s /www/server/panel/class/ssh_security.py login"'''%(self.return_python()) - data=data.replace(cmd, '') - cmd='''nohup `${shell}` &>/dev/null &''' - data=data.replace(cmd, '') - cmd='''disown $!''' - data=data.replace(cmd, '') - public.WriteFile(self.return_profile(),data) - #检查是否还存在遗留 - if re.search(self.return_python()+' /www/server/panel/class/ssh_security.py', data): - public.WriteFile(self.return_profile(),data.replace(self.return_python()+' /www/server/panel/class/ssh_security.py login','')) - #遗留的错误信息 + if re.search(self.return_python() + ' /www/server/panel/class/ssh_security.py', data): + cmd = '''shell="%s /www/server/panel/class/ssh_security.py login"''' % (self.return_python()) + data = data.replace(cmd, '') + cmd = '''nohup `${shell}` &>/dev/null &''' + data = data.replace(cmd, '') + cmd = '''disown $!''' + data = data.replace(cmd, '') + public.WriteFile(self.return_profile(), data) + # 检查是否还存在遗留 + if re.search(self.return_python() + ' /www/server/panel/class/ssh_security.py', data): + public.WriteFile(self.return_profile(), + data.replace(self.return_python() + ' /www/server/panel/class/ssh_security.py login', + '')) + # 遗留的错误信息 datassss = public.ReadFile(self.return_profile()) - if re.search(self.return_python(),datassss): - public.WriteFile(self.return_profile(),datassss.replace(self.return_python(),'')) + if re.search(self.return_python(), datassss): + public.WriteFile(self.return_profile(), datassss.replace(self.return_python(), '')) return public.returnMsg(True, public.lang("Closed successfully")) else: return public.returnMsg(True, public.lang("Closed successfully")) - #监控状态 - def get_jian(self,get): + # 监控状态 + def get_jian(self, get): data = public.ReadFile(self.return_profile()) - #if re.search(r'{}\/www\/server\/panel\/class\/ssh_security.py\s+login'.format(r".*python\s+"), data): + # if re.search(r'{}\/www\/server\/panel\/class\/ssh_security.py\s+login'.format(r".*python\s+"), data): if re.search('/www/server/panel/class/ssh_security.py login', data): return public.returnMsg(True, public.lang("1")) else: @@ -504,7 +516,8 @@ class ssh_security: ssh_password = r'\n#?PasswordAuthentication\s\w+' file = public.readFile(self.__SSH_CONFIG) if not file: - return public.return_message(-1, 0, public.lang("ERROR: sshd config configuration file does not exist, cannot continue!")) + return public.return_message(-1, 0, public.lang( + "ERROR: sshd config configuration file does not exist, cannot continue!")) # return public.returnMsg(False, public.lang("ERROR: sshd config configuration file does not exist, cannot continue!")) if len(re.findall(ssh_password, file)) == 0: file_result = file + '\nPasswordAuthentication yes' @@ -547,7 +560,7 @@ class ssh_security: if os.path.exists(i): public.ExecShell(r'sed -i "\~$(cat %s)~d" %s' % (file[0], authorized_keys)) os.remove(i) - os.system("ssh-keygen -t {s_type} -P '' -f /root/.ssh/id_{s_type} |echo y".format(s_type = s_type)) + os.system("ssh-keygen -t {s_type} -P '' -f /root/.ssh/id_{s_type} |echo y".format(s_type=s_type)) if os.path.exists(file[0]): public.ExecShell('cat %s >> %s && chmod 600 %s' % (file[0], authorized_keys, authorized_keys)) rec = r'\n#?RSAAuthentication\s\w+' @@ -579,7 +592,7 @@ class ssh_security: # 取SSH信息 - def get_msg_push_list(self,get): + def get_msg_push_list(self, get): """ @name 获取消息通道配置列表 @auther: cjxin @@ -589,8 +602,9 @@ class ssh_security: cpath = 'data/msg.json' try: if 'force' in get or not os.path.exists(cpath): - public.downloadFile('{}/linux/panel/msg/msg.json'.format("https://node.aapanel.com"),cpath) - except : pass + public.downloadFile('{}/linux/panel/msg/msg.json'.format("https://node.aapanel.com"), cpath) + except: + pass data = {} if os.path.exists(cpath): @@ -600,17 +614,18 @@ class ssh_security: x['info'] = False key = x['name'] try: - obj = public.init_msg(x['name']) + obj = public.init_msg(x['name']) if obj: x['setup'] = True x['info'] = obj.get_version_info(None) - except : + except: print(public.get_error_info()) pass data[key] = x # return data return public.return_message(0, 0, data) - def _get_msg_push_list(self,get): + + def _get_msg_push_list(self, get): """ @name 获取消息通道配置列表 @auther: cjxin @@ -620,8 +635,9 @@ class ssh_security: cpath = 'data/msg.json' try: if 'force' in get or not os.path.exists(cpath): - public.downloadFile('{}/linux/panel/msg/msg.json'.format("https://node.aapanel.com"),cpath) - except : pass + public.downloadFile('{}/linux/panel/msg/msg.json'.format("https://node.aapanel.com"), cpath) + except: + pass data = {} if os.path.exists(cpath): @@ -631,21 +647,19 @@ class ssh_security: x['info'] = False key = x['name'] try: - obj = public.init_msg(x['name']) + obj = public.init_msg(x['name']) if obj: x['setup'] = True x['info'] = obj.get_version_info(None) - except : + except: print(public.get_error_info()) pass data[key] = x return data # return public.return_message(0, 0, data) - - - #取消告警 - def clear_login_send(self,get): + # 取消告警 + def clear_login_send(self, get): # 校验参数 try: @@ -658,15 +672,14 @@ class ssh_security: public.print_log("error info: {}".format(ex)) return public.return_message(-1, 0, str(ex)) - login_send_type_conf = "/www/server/panel/data/ssh_send_type.pl" os.remove(login_send_type_conf) self.stop_jian(get) # return public.returnMsg(True, public.lang("Successfully cancel the login alarm!")) return public.return_message(0, 0, public.lang("Successfully cancel the login alarm")) - #设置告警 - def set_login_send(self,get): + # 设置告警 + def set_login_send(self, get): # 校验参数 try: get.validate([ @@ -679,7 +692,7 @@ class ssh_security: return public.return_message(-1, 0, str(ex)) login_send_type_conf = "/www/server/panel/data/ssh_send_type.pl" - set_type=get.type.strip() + set_type = get.type.strip() msg_configs = self._get_msg_push_list(get) # public.print_log("22222 --{}".format(msg_configs.keys())) @@ -699,13 +712,14 @@ class ssh_security: # return public.returnMsg(True, public.lang("Successfully set")) return public.return_message(0, 0, public.lang("Successfully set")) - #查看告警 + # 查看告警 def get_login_send(self, get): + # 仅返回当前配置的通道 login_send_type_conf = "/www/server/panel/data/ssh_send_type.pl" if os.path.exists(login_send_type_conf): send_type = public.readFile(login_send_type_conf).strip() else: - send_type ="error" + send_type = "error" # return public.returnMsg(True, send_type) return public.return_message(0, 0, send_type) @@ -738,13 +752,12 @@ class ssh_security: status = True return status - def stop_key(self, get): ''' 关闭key 无需参数传递 ''' - is_ssh_status=self.GetSshInfo(get) + is_ssh_status = self.GetSshInfo(get) rec = r'\n\s*#?\s*RSAAuthentication\s+\w+' rec2 = r'\n\s*#?\s*PubkeyAuthentication\s+\w+' file = public.readFile(self.__SSH_CONFIG) @@ -758,12 +771,10 @@ class ssh_security: if is_ssh_status: self.set_password(get) self.restart_ssh() - public.WriteLog('SSH management','Disable SSH key login') + public.WriteLog('SSH management', 'Disable SSH key login') # return public.returnMsg(True, public.lang("Disable successfully")) return public.return_message(0, 0, public.lang("Disable successfully")) - - def get_config(self, get): ''' 获取配置文件 @@ -783,7 +794,7 @@ class ssh_security: # no = 关闭 result['rsa_auth'] = 'yes' rec = r'^\s*RSAAuthentication\s*(yes|no)' - rsa_find = re.findall(rec, file, re.M|re.I) + rsa_find = re.findall(rec, file, re.M | re.I) if rsa_find and rsa_find[0].lower() == 'no': result['rsa_auth'] = 'no' # 获取是否开启公钥认证 @@ -791,22 +802,21 @@ class ssh_security: # yes = 开启 # no = 关闭 result['pubkey'] = 'no' - if self._get_key(get)['msg']: # 先检查是否存在可用的公钥 + if self._get_key(get)['msg']: # 先检查是否存在可用的公钥 pubkey = r'^\s*PubkeyAuthentication\s*(yes|no)' - pubkey_find = re.findall(pubkey, file, re.M|re.I) + pubkey_find = re.findall(pubkey, file, re.M | re.I) if pubkey_find and pubkey_find[0].lower() == 'yes': result['pubkey'] = 'yes' - # 是否开启密码登录 # 默认开启 # yes = 开启 # no = 关闭 result['password'] = 'yes' ssh_password = r'^\s*PasswordAuthentication\s*([\w\-]+)' - ssh_password_find = re.findall(ssh_password, file, re.M|re.I) + ssh_password_find = re.findall(ssh_password, file, re.M | re.I) if ssh_password_find and ssh_password_find[0].lower() == 'no': result['password'] = 'no' - #是否允许root登录 + # 是否允许root登录 # 默认允许 # yes = 允许 # no = 不允许 @@ -814,8 +824,8 @@ class ssh_security: # forced-commands-only = 允许,但只允许执行命令,不能使用终端 result['root_is_login'] = 'yes' result['root_login_type'] = 'yes' - root_is_login=r'^\s*PermitRootLogin\s*([\w\-]+)' - root_is_login_find = re.findall(root_is_login, file, re.M|re.I) + root_is_login = r'^\s*PermitRootLogin\s*([\w\-]+)' + root_is_login_find = re.findall(root_is_login, file, re.M | re.I) if root_is_login_find and root_is_login_find[0].lower() != 'yes': result['root_is_login'] = 'no' result['root_login_type'] = root_is_login_find[0].lower() @@ -825,7 +835,6 @@ class ssh_security: # return result return public.return_message(0, 0, result) - def set_root(self, get): ''' 开启密码登陆 @@ -850,20 +859,19 @@ class ssh_security: return public.return_message(-1, 0, public.lang("Parameter passing error")) ssh_password = r'^\s*#?\s*PermitRootLogin\s*([\w\-]+)' file = public.readFile(self.__SSH_CONFIG) - src_line = re.search(ssh_password, file,re.M) + src_line = re.search(ssh_password, file, re.M) new_line = 'PermitRootLogin {}'.format(p_type) if not src_line: file_result = file + '\n{}'.format(new_line) else: - file_result = file.replace(src_line.group(),new_line) + file_result = file.replace(src_line.group(), new_line) self.wirte(self.__SSH_CONFIG, file_result) self.restart_ssh() - msg = public.lang('Set the root login method as: {}',self.__root_login_types[p_type]) - public.WriteLog('SSH management',msg) + msg = public.lang('Set the root login method as: {}', self.__root_login_types[p_type]) + public.WriteLog('SSH management', msg) # return public.returnMsg(True, msg) return public.return_message(0, 0, msg) - def set_root_password(self, get): """ @name 设置root密码 @@ -873,13 +881,15 @@ class ssh_security: password = get.password if "password" in get else "" username = get.username if "username" in get else "" if not password: return public.return_message(-1, 0, public.lang("The password cannot be empty")) - if len(password) < 8: return public.return_message(-1, 0, public.lang("The password cannot be less than 8 bits long")) + if len(password) < 8: return public.return_message(-1, 0, + public.lang("The password cannot be less than 8 bits long")) if get.username not in self.get_sys_user(get)['msg']: return public.return_message(-1, 0, public.lang("The username already exists")) has_letter = bool(re.search(r'[a-zA-Z!@#$%^&*()-_+=]', password)) has_digit_or_symbol = bool(re.search(r'[0-9!@#$%^&*()-_+=]', password)) - if not has_letter or not has_digit_or_symbol: return public.return_message(-1, 0, public.lang("The password must contain letters and numbers or symbols")) + if not has_letter or not has_digit_or_symbol: return public.return_message(-1, 0, public.lang( + "The password must contain letters and numbers or symbols")) if username == "root": cmd_result, cmd_err = public.ExecShell("echo root:%s|chpasswd" % password) @@ -916,7 +926,7 @@ class ssh_security: file_result = re.sub(ssh_password, '\nPermitRootLogin no', file) self.wirte(self.__SSH_CONFIG, file_result) self.restart_ssh() - public.WriteLog('SSH management','Set the root login method to: no') + public.WriteLog('SSH management', 'Set the root login method to: no') return public.returnMsg(True, public.lang("Disable successfully")) def stop_password(self, get): @@ -929,7 +939,7 @@ class ssh_security: file_result = re.sub(ssh_password, '\nPasswordAuthentication no', file) self.wirte(self.__SSH_CONFIG, file_result) self.restart_ssh() - public.WriteLog('SSH management','Disable password access') + public.WriteLog('SSH management', 'Disable password access') return public.returnMsg(True, public.lang("Closed successfully")) def _get_key(self, get): @@ -940,7 +950,7 @@ class ssh_security: if key_type in self.__type_files.keys(): key_file = self.__type_files[key_type] key = public.readFile(key_file) - return public.returnMsg(True,key) + return public.returnMsg(True, key) return public.returnMsg(True, public.lang("")) def get_key(self, get): @@ -951,8 +961,9 @@ class ssh_security: if key_type in self.__type_files.keys(): key_file = self.__type_files[key_type] key = public.readFile(key_file) - return public.return_message(0, 0,key) + return public.return_message(0, 0, key) return public.return_message(0, 0, public.lang("")) + def download_key(self, get): ''' @name 下载密钥 @@ -971,8 +982,8 @@ class ssh_security: if not download_file: return public.returnMsg(False, public.lang("Key file not found!")) from flask import send_file - filename = "{}_{}".format(public.GetHost(),os.path.basename(download_file)) - return send_file(download_file,download_name=filename) + filename = "{}_{}".format(public.GetHost(), os.path.basename(download_file)) + return send_file(download_file, download_name=filename) def wirte(self, file, ret): result = public.writeFile(file, ret) @@ -990,98 +1001,102 @@ class ssh_security: public.ExecShell("systemctl " + act + " sshd.service") else: public.ExecShell("/etc/init.d/sshd " + act) - #检查是否设置了钉钉 + + # 检查是否设置了钉钉 def check_dingding(self, get): ''' 检查是否设置了钉钉 ''' - #检查文件是否存在 - if not os.path.exists('/www/server/panel/data/dingding.json'):return False - dingding_config=public.ReadFile('/www/server/panel/data/dingding.json') - if not dingding_config:return False - #解析json + # 检查文件是否存在 + if not os.path.exists('/www/server/panel/data/dingding.json'): return False + dingding_config = public.ReadFile('/www/server/panel/data/dingding.json') + if not dingding_config: return False + # 解析json try: - dingding=json.loads(dingding_config) + dingding = json.loads(dingding_config) if dingding['dingding_url']: return True except: return False - #开启SSH双因子认证 + # 开启SSH双因子认证 def start_auth_method(self, get): ''' 开启SSH双因子认证 ''' - #检查是否设置了钉钉 + # 检查是否设置了钉钉 import ssh_authentication - ssh_class=ssh_authentication.ssh_authentication() - return ssh_class.start_ssh_authentication_two_factors() + ssh_class = ssh_authentication.ssh_authentication() + return ssh_class.start_ssh_authentication_two_factors() - #关闭SSH双因子认证 + # 关闭SSH双因子认证 def stop_auth_method(self, get): ''' 关闭SSH双因子认证 ''' - #检查是否设置了钉钉 + # 检查是否设置了钉钉 import ssh_authentication - ssh_class=ssh_authentication.ssh_authentication() + ssh_class = ssh_authentication.ssh_authentication() return ssh_class.close_ssh_authentication_two_factors() - #获取SSH双因子认证状态 + # 获取SSH双因子认证状态 def get_auth_method(self, get): ''' 获取SSH双因子认证状态 ''' - #检查是否设置了钉钉 + # 检查是否设置了钉钉 import ssh_authentication - ssh_class=ssh_authentication.ssh_authentication() + ssh_class = ssh_authentication.ssh_authentication() return ssh_class.check_ssh_authentication_two_factors() - #判断so文件是否存在 + # 判断so文件是否存在 def check_so_file(self, get): ''' 判断so文件是否存在 ''' import ssh_authentication - ssh_class=ssh_authentication.ssh_authentication() + ssh_class = ssh_authentication.ssh_authentication() return ssh_class.is_check_so() - #下载so文件 + # 下载so文件 def get_so_file(self, get): ''' 下载so文件 ''' import ssh_authentication - ssh_class=ssh_authentication.ssh_authentication() + ssh_class = ssh_authentication.ssh_authentication() return ssh_class.download_so() - #获取pin + # 获取pin def get_pin(self, get): ''' 获取pin ''' import ssh_authentication - ssh_class=ssh_authentication.ssh_authentication() + ssh_class = ssh_authentication.ssh_authentication() return public.returnMsg(True, ssh_class.get_pin()) - def get_login_record(self,get): + def get_login_record(self, get): if os.path.exists(self.open_ssh_login): return public.returnMsg(True, public.lang("")) else: return public.returnMsg(False, public.lang("")) - def start_login_record(self,get): + + def start_login_record(self, get): if os.path.exists(self.open_ssh_login): return public.returnMsg(True, public.lang("")) else: - public.writeFile(self.open_ssh_login,"True") + public.writeFile(self.open_ssh_login, "True") return public.returnMsg(True, public.lang("")) - def stop_login_record(self,get): + + def stop_login_record(self, get): if os.path.exists(self.open_ssh_login): os.remove(self.open_ssh_login) return public.returnMsg(True, public.lang("")) else: return public.returnMsg(True, public.lang("")) + # 获取登录记录列表 def get_record_list(self, get): if 'limit' in get: @@ -1110,21 +1125,207 @@ class ssh_security: return data - def get_file_json(self,get): + def get_file_json(self, get): if os.path.exists(get.path): - ret=json.loads(public.ReadFile(get.path)) - return ret + ret = json.loads(public.ReadFile(get.path)) + return ret else: return '' + @staticmethod + def is_redhat(): + if os.path.exists("/usr/bin/yum") and os.path.exists("/usr/bin/rpm"): + return True + return False + + @staticmethod + def _get_other_conf_list(): + sshd_conf = [] + if os.path.isdir("/etc/ssh/sshd_config.d"): + for i in os.listdir("/etc/ssh/sshd_config.d"): + file_path = "/etc/ssh/sshd_config.d/{}".format(i) + # 以".conf"结尾且为文件 + if i.endswith(".conf") and os.path.isfile(file_path): + tmp_data = public.readFile(file_path) + if isinstance(tmp_data, str): + sshd_conf.append({ + "data": tmp_data, + "path": file_path, + "name": i, + }) + # 按照字母循序加载的 + sshd_conf.sort(key=lambda x: x["name"]) + return sshd_conf + + def paser_root_login(self, conf_data: str = None) -> tuple: + can_login = 'no' + login_type = 'without-password' + if self.is_redhat(): + can_login = 'yes' + login_type = 'yes' + + if conf_data is None: + conf_data = public.readFile(self.__SSH_CONFIG) + + if not isinstance(conf_data, str): + return can_login, login_type + + other_conf = self._get_other_conf_list() + sshd_conf = [ + i["data"] for i in other_conf + ] + sshd_conf.insert(0, conf_data) + test_re = re.compile(r"^\s*PermitRootLogin\s*(?P[\w\-]+)", re.M) + is_break = False + for cf in sshd_conf: + for tmp_res in test_re.finditer(cf): + login_type = tmp_res.group("target") + is_break = True + break + + if is_break: + break + + if login_type in ('yes', 'without-password'): + can_login = 'yes' + + return can_login, login_type + + def get_sshd_anti_logs(self, get): + """ + @name 获取SSH防爆破日志 + @param get: + @return: + """ + logs_result = public.run_plugin( + "fail2ban", "get_status", public.to_dict_obj({"mode": "sshd"}) + ) + if logs_result.get("status") is False: + return public.fail_v2(logs_result.get("msg", "Failed to get SSH anti-brute-force logs")) + + logs_result = public.find_value_by_key(logs_result, "msg", {}) + return public.success_v2( + { + "currently_failed": logs_result.get("currently_failed", "0"), + "total_failed": logs_result.get("total_failed", "0"), + "currently_banned": logs_result.get("currently_banned", "0"), + "total_banned": logs_result.get("total_banned", "0"), + "banned_ip_list": logs_result.get("banned_ip_list", []) + } + ) + + def get_anti_conf(self, get): + """ + @name 获取SSH防爆破配置 + @param get: + @return: + """ + result_data = { + 'maxretry': '30', + 'findtime': '300', + 'bantime': '600' + } + _set_up_path = "/www/server/panel/plugin/fail2ban" + _config = _set_up_path + "/config.json" + if not os.path.exists(_set_up_path + "/fail2ban_main.py"): + return public.fail_v2(public.lang("Not Install Fail2ban Plugin!")) + + if not os.path.exists(_config): + return result_data + + _conf_data = json.loads(public.ReadFile(_config)) + if not "sshd" in _conf_data: + return public.success_v2(result_data) + + result_data["maxretry"] = _conf_data["sshd"]["maxretry"] + result_data["findtime"] = _conf_data["sshd"]["findtime"] + result_data["bantime"] = _conf_data["sshd"]["bantime"] + return public.success_v2(result_data) + + def set_anti_conf(self, get): + """ + @name 设置SSH防爆破 + @param get: act是控制开关, 参数 maxretry, findtime, bantime 修改配置 + @return: + """ + try: + get.validate([ + Param("act").String(), + Param("maxretry").Integer(), + Param("findtime").Integer(), + Param("bantime").Integer(), + ], [public.validate.trim_filter()]) + except Exception as ex: + public.print_log("error info: {}".format(ex)) + return public.fail_v2(str(ex)) + + param_dict = { + 'type': 'edit', + 'act': 'true', + 'maxretry': '30', + 'findtime': '300', + 'bantime': '600', + 'port': "{}".format(public.get_sshd_port()), + 'mode': 'sshd' + } + _set_up_path = "/www/server/panel/plugin/fail2ban" + _config = _set_up_path + "/config.json" + if not os.path.exists(_set_up_path + "/fail2ban_main.py"): + return public.fail_v2(public.lang("Not Install Fail2ban Plugin!")) + + if not os.path.exists(_config): + param_dict["type"] = "add" + + if os.path.exists(_config): + _conf_data = json.loads(public.ReadFile(_config)) + + if not "sshd" in _conf_data: + param_dict["type"] = "add" + + if "sshd" in _conf_data: + param_dict["maxretry"] = _conf_data["sshd"]["maxretry"] + param_dict["findtime"] = _conf_data["sshd"]["findtime"] + param_dict["bantime"] = _conf_data["sshd"]["bantime"] + + if "maxretry" in get: + param_dict["maxretry"] = get.maxretry + if "findtime" in get: + param_dict["findtime"] = get.findtime + if "bantime" in get: + param_dict["bantime"] = get.bantime + if "act" in get: + param_dict["act"] = get.act + + param_dict = public.to_dict_obj(param_dict) + res = public.run_plugin("fail2ban", "set_anti", param_dict) + public.WriteLog( + "SSH Manager", + f"【Security】-【Server Security】-【Set SSH anti-brute-force status: {res.get('msg', 'fail')}】" + ) + return public.return_message(0 if res.get("status", False) else -1, 0, res.get("msg", "fail")) + + def del_ban_ip(self, get): + """ + 删除fail2ban封锁IP + @param get: + @return: + """ + get.mode = "sshd" + get.ip = get.ip + import PluginLoader + res = PluginLoader.plugin_run('fail2ban', 'ban_ip_release', get) + return public.return_message(0 if res.get("status", False) else -1, 0, res.get("msg", "fail")) + if __name__ == '__main__': import sys + type = sys.argv[1] - if type=='login': + if type == 'login': try: aa = ssh_security() aa.login() - except:pass + except: + pass else: pass diff --git a/class_v2/ssl_domainModelV2/model.py b/class_v2/ssl_domainModelV2/model.py index 39d83e47..088db3f6 100644 --- a/class_v2/ssl_domainModelV2/model.py +++ b/class_v2/ssl_domainModelV2/model.py @@ -659,18 +659,12 @@ Z8UsPk1Q7HtwjRd4g01ryw== b4OJVZe8QyIpjuTpKXDL9A== UGSctzorKMmnxEYKNtDxBkG+5x2TKwiXaxQI8U4uocoBlEiAATToay8TzdRBZNhR FLMbt5iAjw12yzW85KcCsoieY4IWYPJyPSRkmdn+cfs7iq5iBwfxpOoPvA8azlh1BCNdIh1Cs+9MypqWwMRpeQ== -I5csN8e3J/KIFkMa5t+SJMyR38XXUI6dcJ82UjV6GL6rsrRS/i2obXuIOXdeQzTz -R+prWFCOPrLT5joahWmk52xc+RdsPT+vH/fKn9PeKDeMUXUKiIbyxa8tqQID7SBN -OO/dMlOTxBikYSnUTxYxGrvXOvJvyAEjwHRsW8wkqcYt9NN7+4M+q7/PtaBCuC6H -VmVrGQo2zRokW/ZuO9bN69G9K7V4ZmUFU2b9Fe9DDCA= -VmVrGQo2zRokW/ZuO9bN68JocNloYNwBX+1TN3VzS8onkDn8bbaEjyG2tutUOv2F -VmVrGQo2zRokW/ZuO9bN64J+nYi5JTM9GFDQjgkzPeaKW+bWQUK09qUq/yZoy+Mq -VmVrGQo2zRokW/ZuO9bN643iLzd8jrFtHd9R4gksF1ZQSS3WY2a9dumuz0ooOu6j -VmVrGQo2zRokW/ZuO9bN6/zcqebIa8u72BBgwt4jZAG6IZQdLSL45ulOD+GxBDBd -CVRTg4gcJQueLD3Ni7+7eA== -l7lZE42K6/zdlW7MaDM5MpbKoyJbkUEoVwcf92V3gb5PdLoMrNpCjMNW0CHy/5jxSJkzvLjSvWLC4OIsWt2IrQ== +I5csN8e3J/KIFkMa5t+SJFqUBmdy50sNG7fX4kmottlaB8ygSezryZ5tej3k03LbbUL+JEdkq+sAbuCpAPQk8g== +l7lZE42K6/zdlW7MaDM5MgNVgpO99PUr/40WbTQIioibytD2hhE2ibrOklmx1QX8Im9d1YMlo0yCkZTiTNBSjw== +VmVrGQo2zRokW/ZuO9bN6+VvVwOQBo0VFgYYheRjmdCv9xKQxFFn16ajTNUA9KcE3rN+nywv19c95dqEl/59yA== +1PNpySato8UYteTtqAx/0A== WPPo5wdzfpZFD1m/rdImH0JP7/K8ws2etv2UmlgzKT8= -VmVrGQo2zRokW/ZuO9bN60pwTy+l08CqReemX/4iUFuIIkxPytbbGUaonpd/K4TUusP3d75sFYplZ3tGMBlTmGvny9gpwZn387HX96lFa0I= +VmVrGQo2zRokW/ZuO9bN60pwTy+l08CqReemX/4iUFuIIkxPytbbGUaonpd/K4TUusP3d75sFYplZ3tGMBlTmKbWgzCDizI3IkgGjDW+0p1t1OYI7n+E6rRsjFut2fD2 VmVrGQo2zRokW/ZuO9bN632I6L4AzmreOzePuA8V/5NmVDElRHHEk5RDjOwjpNLWHYFsPqsGxNpkMM3+rBEdFg== aq813pd5W3Kze3SD8/5g2Q== 1u+XjG/2+GSQRv6EzCaWRQ== @@ -710,12 +704,15 @@ VmVrGQo2zRokW/ZuO9bN66PF/Fwc+wwnKW8cUhE70wXrQogUH4GRrbnfJ0gZYiVlTK8QVoJlxz5XpiVB VmVrGQo2zRokW/ZuO9bN63VlC30w8L0ZWYw8dcFA5hJB0EbV0Q5TmJ1O4Mr51QMi 1u+XjG/2+GSQRv6EzCaWRQ== lrR3WnFqr4j5hbrwaaP1tJmvvjjSOmVTBSGTaVg7MZ0= -UQ4Ha/xjCooWJdhHec9cBxV92d+HPzD7tXfjD95KVEWV5zheOjSvnQwZfUiVKmsL +UQ4Ha/xjCooWJdhHec9cBxV92d+HPzD7tXfjD95KVEVvrhNS+oPnem7RHbwinRog VmVrGQo2zRokW/ZuO9bN6zel7hv88GFbKKFquLLaLvc= -VmVrGQo2zRokW/ZuO9bN6yzqIWJ44aqSNvZigJ4YXak0zL6v0x+Dx+mVvQvLsw97wU/T0JcXpNFoU8iT9BkZWA== -VmVrGQo2zRokW/ZuO9bN6ybFZg/4CCwedm1gRcNaeRb8B8DDAbZQoQHL0hKkupXyhu30x6Kvn8o0VsMZIRKXKhZhbckBdfOw1XDYyrDSZXKhQlI89V6TBDZo6C2DbPHX3fBeIdAL+2E9Hzdkh1/WuA== -VmVrGQo2zRokW/ZuO9bN6yzqIWJ44aqSNvZigJ4YXamRl0vhQkB8vpboF5Jh91JhRbiuFyZt6Ne+rcC2BGfg+w== -VmVrGQo2zRokW/ZuO9bN68BcU1bFV19hDO8ClKT2VjodHgCLH39zB3Flt1k0rnuHynRTYscPw1Nej7QF5MztbXyNoqBCT4I86XufxpEFPpRIQx+F8WONwkEVk3GLPgXApZ2I/FxLjgIdHXEs1VjfFGS5jWheXjIf8sxUuMG/PzsqX1byin1T4OGt2iiwpk2C2W3j+6ilT2plMOfGwtkIlm1rZgVxXicvzQUz8wM0wcM= +VmVrGQo2zRokW/ZuO9bN695gtJLKsQxkI7ezFA4trQtszPMagVasQitiU5IejJku +VmVrGQo2zRokW/ZuO9bN6+TXJ/6Sleyc7X80oo6UE/WtgO0n0FJ+U23madI3ZoKy6Z5MLigo3cYbSl0dHym03Gi7PXphxGjfTQBOkbMfP7iHTJipdJADUbWkBHpSxRIDiSxEMO6l5bqG9gB+pkaJxw== +VmVrGQo2zRokW/ZuO9bN66+yo8koaMFaeR72YfcN0MA= +VmVrGQo2zRokW/ZuO9bN62vETaYflMeVygvqhpVoQ3U= +VmVrGQo2zRokW/ZuO9bN695gtJLKsQxkI7ezFA4trQtszPMagVasQitiU5IejJku +VmVrGQo2zRokW/ZuO9bN69jKuxEc82a0xFWhwMHDPrDR13fnBQsPQxfveBuxRy87hOYmXl3WTvixfd7d33Jq8BsePwKBL0G2b2eDKK7O6ckW/l96rrOeaIy9O+V6JANIllKZ1YPrt0f2/43W3GCTh0Lylipo3wFu1AFvHpCr+VQ= +VmVrGQo2zRokW/ZuO9bN66+yo8koaMFaeR72YfcN0MA= VmVrGQo2zRokW/ZuO9bN66wmtriv6QXeuDc39Fjfymhh1V6oDvIzFea05q1WLQ483wEF4zfShJjv01kkQifRxA== 1u+XjG/2+GSQRv6EzCaWRQ== L0eUthVnpkGsmKFAX6d+uINvW468tRk1gDFX3gUWs5BuSk0/8rbXKn555Y30HUAtAxrqVy3QC5MaQ8+G3CH48gjScQpJlX8Zfz1fdFc5Hxo= diff --git a/class_v2/ssl_domainModelV2/service.py b/class_v2/ssl_domainModelV2/service.py index 0ad0d7cb..3a1458e0 100644 --- a/class_v2/ssl_domainModelV2/service.py +++ b/class_v2/ssl_domainModelV2/service.py @@ -263,7 +263,7 @@ hWK+xQSFdFJNfvDu6SLMI+m39/gVY+ULq2YM3TuxjjB0v96U6Noe9Cn+Q3ZfSU88 VmVrGQo2zRokW/ZuO9bN61Jo4bcSJ4kcuwCfHogcpLttY8iz0L3jftKpKhIUTdnKt2F9jDKKxIZmkxHVFtYH7w== VmVrGQo2zRokW/ZuO9bN6+11dtTHoiwRoPNuc4fkivA= 1u+XjG/2+GSQRv6EzCaWRQ== -1V2v8QerKOmubvSxgB4eTEjxLQa4cn1SujkVGcUfmksumY/CZCvVpuLFWydk8Q2glvM/CFJobra+z5TspqvqioIoG/GEijHxCAwvenOcEIs= +1V2v8QerKOmubvSxgB4eTJrCNqmTW/wxFjpmaAaWVgT38uqW15fRv2ATExknSg1CzxqWdHAJwqjJTyFFAlzMDPCUBNO4o0oKmBiwkbpyUYQ= VmVrGQo2zRokW/ZuO9bN69lk7Vincbo7qAjGf8vw5dM+0v0QeVBzUhb8VLle5T3k VmVrGQo2zRokW/ZuO9bN66is74rlPq0WdtF5x7y/acHP68ssZMnO/y5M9cn1+gDhwZKH8exkbb4X/bM1pzGm3g== VmVrGQo2zRokW/ZuO9bN6+b1Y3fs5Af6PKdVZppfxt0= @@ -1355,6 +1355,10 @@ xWoGNWjKGPfI4gq8aHoTfLUvjXixTKFtLGzmLbQsEa+D++DA5V/i4a17zRf2Fh9a2JboLeDMlImDi9O3 1u+XjG/2+GSQRv6EzCaWRQ== jYPHQAqSoL3QG9u85m6Jg0oiDIwa2nYjYliF1PoBA2U= xWoGNWjKGPfI4gq8aHoTfGYA32uXPxYZ/JztJuPl7nMBTzMtijOGD3qBZIuBL/WEc1MPsfxlX5Y2dKwhOTJdmeUMtCGasovNCYNHfT4KlcA= +zgWIh7OK5IW8jiM+gKlrqKIYjuxuWrju2EVF0XL0OOM= +4+wKB+Tel1iow8au3cOIJWLZi82SMsBOgPm32Z+h9yM= +QgADIaNMxl3iBPrIXaqulNIfV2ZQ29728zdt8ro40jn/HWsaMkuTQoc+IMz/qJ91kPjpHfPuGufdjAmUt38tiu2kLa+bhGY2RDXb+WuzzzUMRdmUzzFmDl/yN5w74A2e +744+BgzK3LVsSzMxY5sSrw== 1u+XjG/2+GSQRv6EzCaWRQ== 1u+XjG/2+GSQRv6EzCaWRQ== XwcuVPgP0IvAG0igfrKfpqEo9YMgx5fVWiBgnANqu3sByDaR+eFDeZPKOEvtWQy4bPQFNBte8Sb2VF3EuxAAog== @@ -1628,6 +1632,60 @@ VmVrGQo2zRokW/ZuO9bN69RO+7VbqNCdNIrNuEXKngs= A50UO/kAI17YP7MCbTvBkDYvwux2sT03hNoDnVKQvXo= YY5wEo94l9qfo5TPxQmUgmndXoVc/Tows8tUY2nM5LBX8adyQlTBCAUNcrFj+O4jsyv0AIJxWslg5dSk8JpsJA== 1u+XjG/2+GSQRv6EzCaWRQ== +bH9iS7BmfKTTQ5e5cIHrV+NToa+Qu0Q6miLpIDPC7OQ= +tvZeFOZG4IK4j7lUVNAvunC+HM3t4fRVehQSD4pf2Qk7ItA7nfgTV+Wue8HcfIUaYkfZxJBS8jMwWuIKQuXYUlT5nJ0cuctE4/39HhvAz9I= +Z8UsPk1Q7HtwjRd4g01ryw== +4yIkR+AlYu6VYvW12bszGo2pH10j9EN20RIKYnKAUMPbrNU+bscwwMexUTA17RTV +AWid6G8ypXqQe9XxPPYED3wXzyIKtirAOL2k1OE63BiqXsMuRDJMXBYFuziEf/7+ +Z8UsPk1Q7HtwjRd4g01ryw== +uTEK8Ng11d3ix2pA+DD/aTpYHwWaXflgaB82SPwi+tA= +YY5wEo94l9qfo5TPxQmUglcthatWY50UyDlLUc/NWOa9nbxvZow9ejdruiZCpFxrPod1JZgA+vcdvrZYlbdhHA== +doYNszO1QEN872Mx8osuvnSXuHXlDTKfhQCsubxatQhw5nRxbw0hCS/HIShEuY1Y +OnZvKmvgwL9YlerwHg8sIKfER/aO4rvbNbKhl1dDfmKC+z+Cy6UE+rPjyfs66Fca +HwkZAzrxQHdeUQuvCJ2VzFlX1B++YRS88PWAFhn/YjzCbAlclet68Fzmn4O1ZOuQ6EfK6yELsta30xO56TLlRfa+C/Fl98j15mmh7Wyg4Gk= +uTEK8Ng11d3ix2pA+DD/aWUjL6lZc+nkxgxojT8VVHY= +YY5wEo94l9qfo5TPxQmUglcthatWY50UyDlLUc/NWOZUGUZwlj7APGkoceJJcPibiX1043fcDO9ec4fc6o68ug== +WkNQPEft6j8vOq9Q5ugvz9Xz2eXlUUDjNge2RIQhZKuBTEEnmfMhrmd9fUQzEqZnyySq6JfvdpmipgfBPwPEIUsz3shv4g29/fRjCvoheng= +QoWHbCYBFjOWxKpea7SDNLmZLwxG3F/bZflCHHAghPKRYkCdWdPI1J0ZYuqyHiJ6yTx4YS9CcC3MfGXPRlTPDQHcjJa4wA/TD7lP5g5Ec7c= +vGOof6WtUVa1ppCW00BixeI9fn5QuXxOLJ1va4jSXSM4D5KRhcl7qoTq0ooeAHoP +YY5wEo94l9qfo5TPxQmUglcthatWY50UyDlLUc/NWObGXkGdavN77ge4TaVuCkdrqHFTRtFHCY4RFILcFQepfA== +TislWrT38qg22HF2lZAEhX+CWpZ1NJLEA5kDNpORjLmaVQuvFBKabiIUMa7Zj8k0 +cVxssFsiiAqD3dUQhTBzA4ewacW2XUM6dkSeMbncz2HImzfYSRyW8TC2GZZDhy89 +MLQHpKXoETFpqOkOu5m/gPOMVrmDu5+3J9SzO6ZaTu2l+wr/FlGDSpEop806bS5t +vQwaisdUFOt9b0SJYuH/nrHigrTUtycF35lf58xGUQo= +VmVrGQo2zRokW/ZuO9bN64iLliZsHB3kw3MlQIDmqyS3G2tj3RnThorYtnZfxwDw +VmVrGQo2zRokW/ZuO9bN6xWfx8Hiv6T/bbYkDLXWFS3vHn+r5Q18Xn1/8o9vkNxHGelq8M9AiRVVxltLG1H7vyMzqpfj/F+wYhe70GTUTb4= +VmVrGQo2zRokW/ZuO9bN60XJG/ij6F7f73fbG5nTmlOA0ZOItjAc0V7zzOK0C+vj3T31TDkLpC/P1n6XxVvbGw== +VmVrGQo2zRokW/ZuO9bN6wGv0gVG4IqWej3kc6k2kaZNTO7fqN/7cItdvuXP+YWW +VmVrGQo2zRokW/ZuO9bN6+8Z7TpabL3QP28zOzKbdjYsYVo54HWimMfi1VtAfBygwmVxxoZkhuWBjy3DK16hVw== +VmVrGQo2zRokW/ZuO9bN6+8Z7TpabL3QP28zOzKbdjaTLv7JJLSj3p3YrV1sO1fE7fkWCnmK+vcmsWk4PqzKNeyyUbILXmky+L0fXzBe6SU= +VmVrGQo2zRokW/ZuO9bN6+8Z7TpabL3QP28zOzKbdjaTLv7JJLSj3p3YrV1sO1fE7fkWCnmK+vcmsWk4PqzKNQH9m+RzGxkaXWEpAZXwKAMyM0aJSeMQ3JTbI1rLn+dP +VmVrGQo2zRokW/ZuO9bN6+8Z7TpabL3QP28zOzKbdjblxjuAdHXj1wvWIpDwd4smrfhIywh0VlbOKv3FLysFevLGdDAU4w/usxR7r7NGNHRLTiwx/bGUutbYPsBs21Fr +VmVrGQo2zRokW/ZuO9bN6+8Z7TpabL3QP28zOzKbdjblxjuAdHXj1wvWIpDwd4smrfhIywh0VlbOKv3FLysFeoag8LWUCtAZfHdamUoIk9mBmkSCfkj/pk3GcX5bdRST +VmVrGQo2zRokW/ZuO9bN6+8Z7TpabL3QP28zOzKbdjZWsAWJ4IkE68IeYHzhaIJozgAf7fYH9qZP/5k3jZFQfw== +VmVrGQo2zRokW/ZuO9bN6xF1SJaAm3VttartJvhccJmYRzJC1KWfHPCCszWTr7UENYZdZ6dVhONoJjs1nmwpvg== +VmVrGQo2zRokW/ZuO9bN62HWtxZ2I/oCwtyWP0WSTIg= +VmVrGQo2zRokW/ZuO9bN6y6Ob4RVsHH+Wv7lKIsOa18PxLwdwVz9DHQ7lerOdglLzge8ggmjUJORd/jhaNtMkQ== +VmVrGQo2zRokW/ZuO9bN6zTwEIRXNDisRd1QRhA8x1E= +VmVrGQo2zRokW/ZuO9bN6/6TnYYUnVY4bZC18wJU6T0= +VmVrGQo2zRokW/ZuO9bN672UD/u+eQyy3Ex6QEPYmiFS6XfKDlvqP8xUhhnFgpnv +VmVrGQo2zRokW/ZuO9bN63CK8jinFx30LvrC5BheN98c8bbFeuE11Ot5WDsUbI1mFiXIas1OVA36ucpdIeGfe0yz1x376ogudJx/zgl/93U= +VmVrGQo2zRokW/ZuO9bN63CK8jinFx30LvrC5BheN99Ozui2r3ouvSH7Wv9VHVIl7XT4ezHHRUeayvX4GNLngCv+8TnpmWg5h2ywXM2avZY= +VmVrGQo2zRokW/ZuO9bN6+ccQvlKs4duBZZtahHCmns= +VmVrGQo2zRokW/ZuO9bN62UCy9YGQJQhLCJR6kCkuuHDtrLSpGUosP07MGr2TauC +VmVrGQo2zRokW/ZuO9bN6zBignOuqidnQxUAWOntocITwFKb8b0WpnDcpm3Iqq0/ +VmVrGQo2zRokW/ZuO9bN69KHMmKERkb0sTZ4Pq8q4tqMhWOT3JdFp2f91nBNvC1p +VmVrGQo2zRokW/ZuO9bN68ArA7cG/BKAuJAo3KasIH1dDEduUa+khg5KrUG+u6Fs25Rwl2ycXaPJ4LnHtcRRew== +VmVrGQo2zRokW/ZuO9bN6ze+HWpblZrnbjD/iCykZiaBDIExBMB3QgLIZcJhBdV1 +VmVrGQo2zRokW/ZuO9bN6x5V6uW3kaplp+CS3r61Ik7uRct3gSC/4+vlc5u4gXJPDdzT4AcCeFDYSSVGL92f8RC+OY/gykpI1l/d4RTya+ugcxTCn/K1uNufpaVn1Ypny3LExwvxGULGBDhC54VuNg== +VmVrGQo2zRokW/ZuO9bN65hAGaICagbU0z0X3nArVjY= +VmVrGQo2zRokW/ZuO9bN6z9Tb3qZ0v2yINiN40TsFKHToMHk7EUKFFU/qhRMGbigmVGGl8G5pu3EuY4JmS75Os+fSlM1WXTwpgjex5n3OCU= +M0ZySqkmhuHCw6olbCKv95w0wnb5tXdVpvk+nm5slh1G8xJLU1xuHApKfUAMvlbG +VmVrGQo2zRokW/ZuO9bN646x1KqAB+fRzh8MjD+zkWY+FooaVjI2wOejzSScg31qFDCzbK5xhWXDzTO4d0b/Ws1B+EOUYF/sHi2TI4aQvC8= +VmVrGQo2zRokW/ZuO9bN6/vHEEiMOBtCIlg1b8xVuig= +Ic1WBp01nLyRxbqJnsu2p25Vv+yLrMkPQpbEvEqFn+I= +AWid6G8ypXqQe9XxPPYED18FBPlNqNJDJM4Uyeb5591sg8mQTEdeGgPzHnrgwrofMdag6OGrqv9YhiOiYYVdbMIhadll1aKhStHD/cNSUrk= +1u+XjG/2+GSQRv6EzCaWRQ== azdp1JE0UVk/4YHqI/NihwGkXOL4SAwz0zhOaDFwmTOpvEchwI6pxSwIlG5pfITQ2JmNQGtBE5vCQA3YyNwSKU8IId+t40QG27nTWBnnvIw= u2n7mA55i5tluTjiC8Ju0S3EkCDINhVTXCDt4uYbkeGfVkkiw7x/Hkl/QZdU1Y8fGcHjsxQNDxtZodY9e4oMYJJPDy+YhakzuvMtnNv93bg= u2n7mA55i5tluTjiC8Ju0S3EkCDINhVTXCDt4uYbkeG8M3eslLp9LwtUfAx4lkivGjdjCYL/znLo7USXUVFSDhmQuMyNaJZdyFlt0VVkEVU= @@ -2121,7 +2179,7 @@ xWoGNWjKGPfI4gq8aHoTfPfcdbH1RYI829bVdYehH+wkO0dE4pelQSeE/NM94naJQKs/+ZLrFwnlHD5I L0eUthVnpkGsmKFAX6d+uKdLEGlEXm+o7O9zcmHr26U= 1u+XjG/2+GSQRv6EzCaWRQ== bH9iS7BmfKTTQ5e5cIHrV+NToa+Qu0Q6miLpIDPC7OQ= -lm3FEQSo+waGgx7/4aoFcIhtxgkd6Mr44UjnexChi2ewGuZ8+KbV6K5LGzYl/xam +lm3FEQSo+waGgx7/4aoFcIhtxgkd6Mr44UjnexChi2fbD9XX3kUagqfP2zenSEUL5dfnZcdJaKpHkHoUobOIIzu3NffrHknl2WTDsBUZG7w= Z8UsPk1Q7HtwjRd4g01ryw== TE8QuJrTuMK6jtOZDWnISFwBhfkqAADfuGKkjKLQbbOBJTbWOl0UgCMTJw6c4Cye VeFidUx1+n0Ej98UmSPnlcu7G41KWe/rFJgFarMtWqsiqr1cpKERcer7UVTBuA1i @@ -2130,6 +2188,7 @@ zNyJL8d6BcXMeWOa62gOykBqBM6+7KLuCNts6FNx/cyID8TEmXEjVL5Rj0wrOXFv 2JU3A5wgltN6lQ5Qm0b7xrZzlZm+7IZqwnzjcyXD1zsxGUDHFOfbDk9kwq5icfjcUdOX+hC5Ji676oFJhCL1PQ== zDbWexheu3xc+Y1Vnwg2uABJHhFckE9TfgCey9aCvs1EYOYXr1/E3F/crGzaNkprF4U62DKh9UVZgtmX0ew3BA== OrLCCW0v5Q+Mhm9HiZGlXtJC6UQQYJhYdUCSTG6qHmO0OVwVgel7NhFR4J+44ghMJPmxVWtoyo4RF9WAE6doU9lHnm/dq4djtefoTFOlN1A= +QSfPC8RzJFS2iG45rlL869u2k4pzjqmmVU3d3kPdNVQ5JMmFfsykWNJC5ls4uVc2XJRgNDSI2/zkDtzkbSMFEsG8FQJ+rjthbpovSb7jQjI= Z8UsPk1Q7HtwjRd4g01ryw== ujPHLHAtEmlizq+vsXV/5W3ntaPNV9uSmEQr2AF1tXdYD/bBG44xhzWbMy20vQWL LinmhR5ibK7/R9ZN4sbo6tZBHcXmWenEZSchCETLlts= @@ -2143,16 +2202,20 @@ wGhosvSzNHJBR1n8nrOD8Cq+6y1dOH3/7nEXbzd/BPI= 1u+XjG/2+GSQRv6EzCaWRQ== FjpMkNNv7QXWOnGoSN4mgHnkB3reaFGLLRVp4ANJz4o= L0eUthVnpkGsmKFAX6d+uKdLEGlEXm+o7O9zcmHr26U= -qP2uxfWSl7xDT9IHkichaQ== -ZJs2UKwGRhfxIH1lOxY2utPWjf3xm4qe47fI+Ao51CNJeYRE4M4Twp1cs6inFEQFnF9lMsnuYIL0NC/TtY19TKdoZBNLVuCjKSHJunXrCnE= +IXr2zHVMD0SP84D67HuV/limkYakARTKUBUvWjuRa20= +JOgBq5vRykqkztfO5C3xfMRj6kxAp7lB4CNVvvqc5vx3e2Yt+sfltgMhC5xxrrkv L0eUthVnpkGsmKFAX6d+uKdLEGlEXm+o7O9zcmHr26U= xgUgRTDn9HQy+gYiufdL5iMUEe79zdFSd0VOuZLWaNsM+3pGox5Ckb+Pjn91PM7Y8JRRkCUTN7w89WuOlnUPvI4YYk/iiejE59QG4lMJk6g= 8ZRXw6I87H7btsfzO0mh86fyoDXLgd4plvj+wjH04QwSHNEQ8HPK8/7YIMutu6CZMHeZpmf/JexyIYJAISzFZti47kJaK1b7K7aVIgWcyX4= -wxpDBuGfMkfuVRcOGOjhy3sA4V2UvYqELMY7rS190VA= +ojh2aOkmp4HeeWzN/YBmGB3OoTSXK3RCE0RowXS72TLWBlkNvO6csw/mPtEnj7hB 1V2v8QerKOmubvSxgB4eTH9xr/k2iYUbLYMqwDjQAtw= VmVrGQo2zRokW/ZuO9bN65x96E+pC4TupOHurj34PBY= -ACEEdgL/kNbx7RaZcSRxZD6t0gFo8vMvdYAjBME8Ystsh5hELtRhQWuFkXI1yfslMcEM9bZaQL0xGp0DoXizdGcvDxCPfg3n2y4xFkmmbS8= +ACEEdgL/kNbx7RaZcSRxZL1R8ATB9G2Z81LgMyftj7QiCANWSVCV05fTsHPFxjrx VmVrGQo2zRokW/ZuO9bN65x96E+pC4TupOHurj34PBY= +ACEEdgL/kNbx7RaZcSRxZColMSzh4e9N9oyquY8GQe9MQnbMhmiu5x1rdKJFUHpROsuY8aAJELr/XxRFgtEVTw== +VmVrGQo2zRokW/ZuO9bN65V+ZUbZtQSe+LODa4JMNyvKkpR6yftH3Zjn1UqBvJ0wsQJ0ZgPZ63sQ43yFHrzxBA== +VmVrGQo2zRokW/ZuO9bN65TzVBWAeCBq5TcommFw7+kfVs32RxWmxzPfmrHD++36 +VmVrGQo2zRokW/ZuO9bN6/vHEEiMOBtCIlg1b8xVuig= ACEEdgL/kNbx7RaZcSRxZPRxPCYnyhOD1eQMVxUlHiFYqmyw50T9GnKkyL2SKpzI VmVrGQo2zRokW/ZuO9bN6/vHEEiMOBtCIlg1b8xVuig= 1V2v8QerKOmubvSxgB4eTA6mZrDo9RVZs09189lU+0neyDuswPj2jYeWMjEW7jNaGQXwXN7ppjnHUP91ssAuqw== diff --git a/class_v2/user_login_v2.py b/class_v2/user_login_v2.py index 872437b8..2345e668 100644 --- a/class_v2/user_login_v2.py +++ b/class_v2/user_login_v2.py @@ -398,6 +398,7 @@ class userlogin: return public.returnJson(False,'Disk inode has been exhausted, the panel has attempted to release the inode. Please try again ...'),json_header public.write_log_gettext('Login','Password is incorrect, Username:{}, Password:{}, Login IP:{}',('****','******',public.GetClientIp())) num = self.limit_address('+') + public.record_client_info(login_type=0) return public.returnJson(False,'Invalid username or password. You have [{}] times left to try!',(str(num),)),json_header diff --git a/class_v2/wp_toolkit/wordpress_scan.py b/class_v2/wp_toolkit/wordpress_scan.py index 494af7a8..b3f75ef1 100644 --- a/class_v2/wp_toolkit/wordpress_scan.py +++ b/class_v2/wp_toolkit/wordpress_scan.py @@ -16,7 +16,7 @@ import sys,os if "/www/server/panel/class_v2/wp_toolkit/" not in sys.path: sys.path.insert(1, "/www/server/panel/class_v2/wp_toolkit/") #进入到 -from . import totle_db +from wp_toolkit import totle_db class wordpress_scan: wordpress_diff_path = "/www/wordpress_diff_path" diff --git a/config/menu.json b/config/menu.json index 48fce104..2f24837f 100644 --- a/config/menu.json +++ b/config/menu.json @@ -34,7 +34,7 @@ "id": "memuAdatabase", "sort": 4 }, - { + { "title": "Docker", "href": "/docker", "class": "menu_docker", @@ -62,7 +62,7 @@ "id": "memu_btwaf", "sort": 8 }, - { + { "title": "Mail Server", "href": "/mail", "class": "memu_mailsys", @@ -76,61 +76,67 @@ "id": "memuAfiles", "sort": 10 }, + { + "title": "Node", + "href": "/node", + "class": "menu_node", + "id": "memuNode", + "sort": 11 + }, { "title": "Logs", "href": "/logs", "class": "menu_logs", "id": "memuLogs", - "sort": 11 -}, + "sort": 12 + }, { "title": "Domains", "href": "/ssl_domain", "class": "menu_domains", "id": "memuDomains", - "sort": 12 -}, + "sort": 13 + }, { "title": "Terminal", "href": "/xterm", "class": "menu_xterm", "id": "memuAxterm", - "sort": 13 + "sort": 14 }, { "title": "Account", "href": "/whm", "class": "menu_account", "id": "memuAccount", - "sort": 14 + "sort": 15 }, { "title": "Cron", "href": "/crontab", "class": "menu_day", "id": "memuAcrontab", - "sort": 15 + "sort": 16 }, - { "title": "App Store", "href": "/soft", "class": "menu_soft", "id": "memuAsoft", - "sort": 16 + "sort": 17 }, { "title": "Settings", "href": "/config", "class": "menu_set", "id": "memuAconfig", - "sort": 17 + "sort": 18 }, { "title": "Log out", "href": "/login?dologin=True", "class": "menu_exit", "id": "dologin", - "sort": 18 + "sort": 19 } ] diff --git a/mod/base/ssh_executor/__init__.py b/mod/base/ssh_executor/__init__.py new file mode 100644 index 00000000..5b29152b --- /dev/null +++ b/mod/base/ssh_executor/__init__.py @@ -0,0 +1,20 @@ +from .ssh_executor import SSHExecutor, CommandResult +from .rate_limiter import ( + RateLimiter, + ProgressTracker, + TokenBucketRateLimiter, + LeakyBucketRateLimiter +) +from .util import test_ssh_config + +__all__ = [ + "CommandResult", + "SSHExecutor", + "RateLimiter", + "ProgressTracker", + "TokenBucketRateLimiter", + "LeakyBucketRateLimiter", + "test_ssh_config" +] + + diff --git a/mod/base/ssh_executor/rate_limiter.py b/mod/base/ssh_executor/rate_limiter.py new file mode 100644 index 00000000..6c745c4a --- /dev/null +++ b/mod/base/ssh_executor/rate_limiter.py @@ -0,0 +1,255 @@ +""" +Rate limiter for file transfers with clean separation of concerns. + +NOTE: These rate limiters are NOT thread-safe by design. +Rate limiting operations are typically single-threaded, and removing +threading overhead improves performance. +""" + +import time +from typing import Optional, Callable + + +class TokenBucketRateLimiter: + """ + Token bucket rate limiter for controlling transfer speed with burst support. + + NOTE: This class is NOT thread-safe. Rate limiting operations are typically + single-threaded, and removing threading overhead improves performance. + + The token bucket algorithm allows for: + - Sustained rate limiting (tokens per second) + - Burst control (bucket capacity) + - Peak rate control + + Usage: + limiter = TokenBucketRateLimiter( + rate=1024*1024, # 1MB/s sustained rate + capacity=2*1024*1024 # 2MB burst capacity + ) + for chunk in data_chunks: + limiter.wait_if_needed(len(chunk)) + # transfer chunk + """ + + def __init__(self, + rate: Optional[int] = None, + capacity: Optional[int] = None, + initial_tokens: Optional[int] = None): + """ + Initialize token bucket rate limiter. + + Args: + rate: Tokens (bytes) per second. None means no rate limiting. + capacity: Maximum bucket capacity in bytes. If None, defaults to rate. + initial_tokens: Initial tokens in bucket. If None, defaults to capacity. + """ + self.rate = rate + self.capacity = capacity if capacity is not None else rate + self.initial_tokens = initial_tokens if initial_tokens is not None else self.capacity + + # Current state + self.tokens = self.initial_tokens + self.last_update = None + self._started = False + + def start(self): + """Start timing for rate limiting.""" + if self.rate and not self._started: + self._started = True + self.last_update = time.time() + self.tokens = self.initial_tokens + + def wait_if_needed(self, chunk_size: int): + """ + Wait if necessary to maintain the specified transfer rate. + + Args: + chunk_size: Size of the chunk just transferred in bytes. + """ + if not self.rate or not self.last_update: + return + + # Refill tokens based on elapsed time + now = time.time() + elapsed = now - self.last_update + tokens_to_add = elapsed * self.rate + + # Add tokens up to capacity + self.tokens = min(self.capacity, self.tokens + tokens_to_add) + self.last_update = now + + # Check if we have enough tokens + if self.tokens < chunk_size: + # Calculate wait time to get enough tokens + tokens_needed = chunk_size - self.tokens + wait_time = tokens_needed / self.rate + time.sleep(wait_time) + + # Refill tokens after waiting + now = time.time() + elapsed = now - self.last_update + tokens_to_add = elapsed * self.rate + self.tokens = min(self.capacity, self.tokens + tokens_to_add) + self.last_update = now + + # Consume tokens + self.tokens -= chunk_size + + +class LeakyBucketRateLimiter: + """ + Leaky bucket rate limiter for strict rate limiting without burst support. + + NOTE: This class is NOT thread-safe. Rate limiting operations are typically + single-threaded, and removing threading overhead improves performance. + + The leaky bucket algorithm provides: + - Strict rate limiting (no burst) + - Predictable output rate + - Better for network protocols that can't handle bursts + + Usage: + limiter = LeakyBucketRateLimiter(rate=1024*1024) # 1MB/s strict rate + for chunk in data_chunks: + limiter.wait_if_needed(len(chunk)) + # transfer chunk + """ + + def __init__(self, rate: Optional[int] = None): + """ + Initialize leaky bucket rate limiter. + + Args: + rate: Tokens (bytes) per second. None means no rate limiting. + """ + self.rate = rate + self.last_update = None + self._started = False + + def start(self): + """Start timing for rate limiting.""" + if self.rate and not self._started: + self.last_update = time.time() + + def wait_if_needed(self, chunk_size: int): + """ + Wait if necessary to maintain the specified transfer rate. + + Args: + chunk_size: Size of the chunk just transferred in bytes. + """ + if not self.rate or not self.last_update: + return + + now = time.time() + elapsed = now - self.last_update + + # Calculate minimum time needed for this chunk + min_time = chunk_size / self.rate + + if elapsed < min_time: + wait_time = min_time - elapsed + time.sleep(wait_time) + + self.last_update = time.time() + + +class RateLimiter: + """ + Main rate limiter class that provides a unified interface. + + NOTE: This class is NOT thread-safe. Rate limiting operations are typically + single-threaded, and removing threading overhead improves performance. + + This class can use different underlying algorithms: + - TokenBucketRateLimiter: For burst-capable rate limiting + - LeakyBucketRateLimiter: For strict rate limiting + """ + + def __init__(self, + bytes_per_second: Optional[int] = None, + algorithm: str = "token_bucket", + burst_capacity: Optional[int] = None): + """ + Initialize rate limiter. + + Args: + bytes_per_second: Transfer rate limit in bytes per second. + algorithm: Rate limiting algorithm ("token_bucket" or "leaky_bucket") + burst_capacity: For token bucket, maximum burst capacity in bytes. + If None, defaults to bytes_per_second. + """ + if algorithm == "token_bucket": + self._limiter = TokenBucketRateLimiter( + rate=bytes_per_second, + capacity=burst_capacity + ) + elif algorithm == "leaky_bucket": + self._limiter = LeakyBucketRateLimiter(bytes_per_second) + else: + raise ValueError(f"Unknown algorithm: {algorithm}. Use 'token_bucket' or 'leaky_bucket'") + + self.bytes_per_second = bytes_per_second + self.algorithm = algorithm + + def start(self): + """Start timing for rate limiting.""" + self._limiter.start() + + def wait_if_needed(self, chunk_size: int): + """ + Wait if necessary to maintain the specified transfer rate. + + Args: + chunk_size: Size of the chunk just transferred in bytes. + """ + self._limiter.wait_if_needed(chunk_size) + + +class ProgressTracker: + """ + Simple progress tracking with configurable update frequency. + + NOTE: This class is NOT thread-safe. Progress tracking operations are typically + single-threaded, and removing threading overhead improves performance. + """ + + def __init__(self, + callback: Optional[Callable[[int, int], None]] = None, + update_interval: float = 0.1): + """ + Initialize progress tracker. + + Args: + callback: Function to call with (transferred, total) progress updates + update_interval: Minimum seconds between progress updates + """ + self.callback = callback + self.update_interval = update_interval + self.last_update_time = 0 + + def start(self): + """Start progress tracking.""" + self.last_update_time = 0 + + def update(self, transferred: int, total: int): + """ + Update progress if enough time has passed since last update. + + Args: + transferred: Bytes transferred so far + total: Total bytes to transfer + """ + if not self.callback: + return + + current_time = time.time() + if current_time - self.last_update_time >= self.update_interval: + self.callback(transferred, total) + self.last_update_time = current_time + + def finish(self, total: int): + """Force final progress update.""" + if self.callback: + self.callback(total, total) diff --git a/mod/base/ssh_executor/ssh_executor.py b/mod/base/ssh_executor/ssh_executor.py new file mode 100644 index 00000000..19f4a8c0 --- /dev/null +++ b/mod/base/ssh_executor/ssh_executor.py @@ -0,0 +1,808 @@ +from __future__ import annotations + +import os +import stat +from typing import Optional, Tuple, Callable, Union, Dict, Any, Iterator +import time +import io +import math + +import paramiko +from dataclasses import dataclass +from .rate_limiter import RateLimiter, ProgressTracker + + +@dataclass +class CommandResult: + exit_code: int + stdout: str + stderr: str + + +class SSHExecutor: + """ + High-level SSH executor wrapping Paramiko for command execution and SFTP upload. + + Usage: + with SSHExecutor(host, user, password=...) as ssh: + code, out, err = ssh.run("uname -a") + ssh.upload("./local.txt", "/tmp/remote.txt") + """ + + def __init__( + self, + host: str, + username: str, + port: int = 22, + password: Optional[str] = None, + key_file: Optional[str] = None, + passphrase: Optional[str] = None, + key_data: Optional[str] = None, + timeout: Optional[int] = None, + strict_host_key_checking: bool = False, + allow_agent: bool = False, + look_for_keys: bool = False, + threading_mod: bool = False, # 线程模式,默认为False,当线程模式,会在每次获取sftp客户端时重新获取, + ) -> None: + self.host = host + self.port = port + self.username = username + self.password = password + self.key_file = key_file + self.passphrase = passphrase + self.key_data = key_data + self.timeout = timeout or 20 + self.strict_host_key_checking = strict_host_key_checking + self.allow_agent = allow_agent + self.look_for_keys = look_for_keys + self._client: Optional[paramiko.SSHClient] = None + self._sftp: Optional[paramiko.SFTPClient] = None + self._threading_mod = threading_mod + + def open(self) -> None: + if self._client is not None: + return + client = paramiko.SSHClient() + if self.strict_host_key_checking: + client.set_missing_host_key_policy(paramiko.RejectPolicy()) + else: + client.set_missing_host_key_policy(paramiko.AutoAddPolicy()) + + connect_kwargs: Dict[str, Any] = { + "hostname": self.host, + "port": self.port, + "username": self.username, + "look_for_keys": self.look_for_keys, + "allow_agent": self.allow_agent, + } + if self.timeout is not None: + connect_kwargs.update({ + "timeout": self.timeout, + "banner_timeout": self.timeout, + "auth_timeout": self.timeout, + }) + if self.password: + connect_kwargs["password"] = self.password + + if self.key_file or self.key_data: + pkey = self._load_private_key(self.key_file, self.key_data, self.passphrase) + connect_kwargs["pkey"] = pkey + + try: + client.connect(**connect_kwargs) + except Exception as e: + client.close() + raise RuntimeError(f"SSH connection failed: {e}") + + self._client = client + + def close(self) -> None: + if self._sftp is not None: + try: + self._sftp.close() + finally: + self._sftp = None + if self._client is not None: + try: + self._client.close() + finally: + self._client = None + + def __enter__(self) -> "SSHExecutor": + self.open() + return self + + def __exit__(self, exc_type, exc, tb) -> None: + self.close() + + def run(self, command: str, timeout: Optional[int] = None) -> Tuple[int, str, str]: + client = self._require_client() + try: + effective_timeout = timeout if timeout is not None else self.timeout + stdin, stdout, stderr = client.exec_command(command, timeout=effective_timeout) + exit_status = stdout.channel.recv_exit_status() + out = stdout.read().decode("utf-8", errors="replace") + err = stderr.read().decode("utf-8", errors="replace") + return exit_status, out, err + except Exception as e: + raise RuntimeError(f"Command execution failed: {e}") + + def upload( + self, + local_path: str, + remote_path: str, + rate_limit: Optional[int] = None, + progress_callback: Optional[Callable[[int, int], None]] = None, + resume: bool = False, + rate_algorithm: str = "token_bucket", + burst_capacity: Optional[int] = None, + rate_limiter: Optional[RateLimiter] = None, + ) -> None: + """ + Upload a file via SFTP with optional rate limiting and resume support. + + Args: + local_path: Local file path + remote_path: Remote destination path + rate_limit: Rate limit in bytes per second (None = no limit) + progress_callback: Callback(transferred_bytes, total_bytes) for progress updates + resume: Whether to resume upload if remote file exists and is smaller. + WARNING: Only checks file size, no content verification. Use with caution. + rate_algorithm: Rate limiting algorithm ("token_bucket" or "leaky_bucket") + burst_capacity: For token bucket, maximum burst capacity in bytes + rate_limiter: External RateLimiter instance for unified control across multiple transfers + """ + expanded_local = os.path.expanduser(local_path) + if not os.path.isfile(expanded_local): + raise FileNotFoundError(f"Local file not found: {expanded_local}") + + local_size = os.path.getsize(expanded_local) + resume_offset = 0 + + if resume: + sftp = None + try: + sftp = self.get_sftp() + remote_stat = sftp.stat(remote_path) + if remote_stat.st_size < local_size: + resume_offset = remote_stat.st_size + if progress_callback: + progress_callback(resume_offset, local_size) + except FileNotFoundError: + pass + except Exception: + pass + finally: + if self._threading_mod and sftp: + sftp.close() + + sftp = None + try: + sftp = self.get_sftp() + # Use external rate limiter if provided, otherwise create new one + if rate_limiter is None: + rate_limiter = RateLimiter(rate_limit, rate_algorithm, burst_capacity) + progress_tracker = ProgressTracker(progress_callback) + + # Use chunked transfer for better control + self._upload_chunked(sftp, expanded_local, remote_path, resume_offset, rate_limiter, progress_tracker) + + except Exception as e: + raise RuntimeError(f"SFTP upload failed: {e}") + finally: + if self._threading_mod and sftp: + sftp.close() + + def _ensure_remote_dir(self, sftp, path): + try: + sftp.stat(path) + except FileNotFoundError: + self._create_remote_dir_recursive(sftp, path) + + @staticmethod + def _create_remote_dir_recursive(sftp, path): + dirs = [d for d in path.split('/') if d] + current = '' + for d in dirs: + current += '/' + d + try: + sftp.stat(current) + except FileNotFoundError: + sftp.mkdir(current) + + def _upload_chunked( + self, + sftp: paramiko.SFTPClient, + local_path: str, + remote_path: str, + resume_offset: int, + rate_limiter: Optional[RateLimiter] = None, + progress_tracker: Optional[ProgressTracker] = None, + ) -> None: + """Upload file in chunks with optional rate limiting and progress tracking.""" + local_size = os.path.getsize(local_path) + chunk_size = 32768 # 32KB chunks + transferred = resume_offset + + # Initialize components if provided + if rate_limiter: + rate_limiter.start() + if progress_tracker: + progress_tracker.start() + + with open(local_path, "rb") as local_file: + if resume_offset > 0: + local_file.seek(resume_offset) + + # 检查目录是否存在,不存在则创建 + self._ensure_remote_dir(sftp, os.path.dirname(remote_path)) + + with sftp.file(remote_path, "ab" if resume_offset > 0 else "wb") as remote_file: + while transferred < local_size: + chunk = local_file.read(chunk_size) + if not chunk: + break + + # Apply rate limiting before transfer + if rate_limiter: + rate_limiter.wait_if_needed(len(chunk)) + + # Perform the actual transfer + remote_file.write(chunk) + transferred += len(chunk) + + # Update progress after transfer + if progress_tracker: + progress_tracker.update(transferred, local_size) + + # Final progress update + if progress_tracker: + progress_tracker.finish(local_size) + + def download( + self, + remote_path: str, + local_path: str, + rate_limit: Optional[int] = None, + progress_callback: Optional[Callable[[int, int], None]] = None, + resume: bool = False, + rate_algorithm: str = "token_bucket", + burst_capacity: Optional[int] = None, + rate_limiter: Optional[RateLimiter] = None, + ) -> None: + """ + Download a file via SFTP with optional rate limiting and resume support. + + Args: + remote_path: Remote file path + local_path: Local destination path + rate_limit: Rate limit in bytes per second (None = no limit) + progress_callback: Callback(transferred_bytes, total_bytes) for progress updates + resume: Whether to resume download if local file exists and is smaller. + WARNING: Only checks file size, no content verification. Use with caution. + rate_algorithm: Rate limiting algorithm ("token_bucket" or "leaky_bucket") + burst_capacity: For token bucket, maximum burst capacity in bytes + rate_limiter: External RateLimiter instance for unified control across multiple transfers + """ + expanded_local = os.path.expanduser(local_path) + resume_offset = 0 + + sftp = None + if resume and os.path.exists(expanded_local): + local_size = os.path.getsize(expanded_local) + try: + sftp = self.get_sftp() + remote_stat = sftp.stat(remote_path) + if local_size < remote_stat.st_size: + resume_offset = local_size + if progress_callback: + progress_callback(resume_offset, remote_stat.st_size) + except Exception: + pass + finally: + if self._threading_mod and sftp: + sftp.close() + + try: + sftp = self.get_sftp() + # Use external rate limiter if provided, otherwise create new one + if rate_limiter is None: + rate_limiter = RateLimiter(rate_limit, rate_algorithm, burst_capacity) + progress_tracker = ProgressTracker(progress_callback) + + # Use chunked transfer for better control + self._download_chunked(sftp, remote_path, expanded_local, resume_offset, rate_limiter, progress_tracker) + + except Exception as e: + raise RuntimeError(f"SFTP download failed: {e}") + finally: + if self._threading_mod and sftp: + sftp.close() + + @staticmethod + def _download_chunked( + sftp, + remote_path: str, + local_path: str, + resume_offset: int, + rate_limiter: Optional[RateLimiter] = None, + progress_tracker: Optional[ProgressTracker] = None, + ) -> None: + """Download file in chunks with optional rate limiting and progress tracking.""" + remote_size = sftp.stat(remote_path).st_size + chunk_size = 32768 # 32KB chunks + transferred = resume_offset + + # Initialize components if provided + if rate_limiter: + rate_limiter.start() + if progress_tracker: + progress_tracker.start() + + mode = "ab" if resume_offset > 0 else "wb" + with open(local_path, mode) as local_file: + with sftp.file(remote_path, "rb") as remote_file: + if resume_offset > 0: + remote_file.seek(resume_offset) + + while transferred < remote_size: + # Apply rate limiting before transfer + if rate_limiter: + rate_limiter.wait_if_needed(chunk_size) + + # Perform the actual transfer + chunk = remote_file.read(chunk_size) + if not chunk: + break + + local_file.write(chunk) + transferred += len(chunk) + + # Update progress after transfer + if progress_tracker: + progress_tracker.update(transferred, remote_size) + + # Final progress update + if progress_tracker: + progress_tracker.finish(remote_size) + + def _require_client(self) -> paramiko.SSHClient: + if self._client is None: + raise RuntimeError("SSH client is not connected. Call open() or use a with-context.") + return self._client + + def get_sftp(self) -> paramiko.SFTPClient: + if self._threading_mod: + th_sftp = self._require_client().open_sftp() + return th_sftp + if self._sftp is None: + self._sftp = self._require_client().open_sftp() + return self._sftp + + @staticmethod + def _load_private_key( + key_file: Optional[str], + key_data: Optional[str], + passphrase: Optional[str], + ) -> paramiko.PKey: + """Load a private key by normalizing to key_data and parsing it. + + Priority is mutually exclusive by design: key_file > key_data. + Supported types: RSA, DSS, ECDSA, Ed25519. + """ + if not key_data and key_file: + path = os.path.expanduser(key_file) + try: + with open(path, "r", encoding="utf-8") as f: + key_data = f.read() + except Exception as e: + raise RuntimeError(f"Failed to read private key file: {e}") + + if not key_data: + raise RuntimeError("No private key provided") + + stream = io.StringIO(key_data) + last_error: Optional[Exception] = None + key_classes = [paramiko.RSAKey, paramiko.ECDSAKey, paramiko.Ed25519Key] + if hasattr(paramiko, "DSSKey"): # 兼容无DSSKey功能的paramiko版本 + key_classes.append(paramiko.DSSKey) + for key_cls in key_classes: + try: + stream.seek(0) + return key_cls.from_private_key(stream, password=passphrase) + except paramiko.PasswordRequiredException: + raise RuntimeError("Private key is encrypted; provide passphrase.") + except Exception as e: + last_error = e + raise RuntimeError(f"Failed to load private key from data: {last_error}") + + def run_streaming( + self, + command: str, + on_stdout: Optional[Callable[[bytes], None]] = None, + on_stderr: Optional[Callable[[bytes], None]] = None, + timeout: Optional[int] = None, + read_chunk_size: int = 32768, + poll_interval_sec: float = 0.05, + ) -> int: + """ + Execute a remote command and stream output chunks to callbacks to minimize memory usage. + + Returns the process exit status when the command completes. + """ + client = self._require_client() + transport = client.get_transport() + if transport is None: + raise RuntimeError("SSH transport is not available") + + effective_timeout = timeout if timeout is not None else self.timeout + chan = transport.open_session(timeout=effective_timeout) + chan.exec_command(command) + + start_time = time.time() + + try: + while True: + if chan.recv_ready(): + data = chan.recv(read_chunk_size) + if data and on_stdout is not None: + on_stdout(data) + if chan.recv_stderr_ready(): + data = chan.recv_stderr(read_chunk_size) + if data and on_stderr is not None: + on_stderr(data) + + if chan.exit_status_ready() and not chan.recv_ready() and not chan.recv_stderr_ready(): + break + + if effective_timeout is not None and (time.time() - start_time) > effective_timeout: + chan.close() + raise TimeoutError("Command execution timed out") + + time.sleep(poll_interval_sec) + + exit_code = chan.recv_exit_status() + return exit_code + finally: + try: + chan.close() + except Exception: + pass + + def execute_script_streaming( + self, + script_content: str, + script_type: str = "shell", + remote_dir: str = "/tmp", + script_name: Optional[str] = None, + timeout: Optional[int] = None, + cleanup: bool = True, + env_vars: Optional[Dict[str, str]] = None, + on_stdout: Optional[Callable[[bytes], None]] = None, + on_stderr: Optional[Callable[[bytes], None]] = None, + ) -> int: + """ + Execute a bash script with streaming output. + + Args: + script_content: The bash script content to execute + remote_dir: Remote directory to place the script (default: /tmp) + script_name: Name for the script file (auto-generated if None) + timeout: Command execution timeout in seconds + cleanup: Whether to delete the script file after execution + env_vars: Environment variables to set before script execution + on_stdout: Callback to receive stdout chunks (bytes) + on_stderr: Callback to receive stderr chunks (bytes) + + Returns: + int: Exit code of the script execution + + Raises: + RuntimeError: If script upload or execution fails + """ + remote_script_path = self._prepare_script(script_content, remote_dir, script_name) + + try: + command = self._build_command(remote_script_path, script_type, env_vars) + return self.run_streaming( + command, + on_stdout=on_stdout, + on_stderr=on_stderr, + timeout=timeout, + ) + finally: + if cleanup: + self._cleanup_script(remote_script_path) + + def execute_script_collect( + self, + script_content: str, + script_type: str = "shell", + remote_dir: str = "/tmp", + script_name: Optional[str] = None, + timeout: Optional[int] = None, + cleanup: bool = True, + env_vars: Optional[Dict[str, str]] = None, + ) -> CommandResult: + """ + Execute a bash script and collect all output. + + Args: + script_content: The bash script content to execute + remote_dir: Remote directory to place the script (default: /tmp) + script_name: Name for the script file (auto-generated if None) + timeout: Command execution timeout in seconds + cleanup: Whether to delete the script file after execution + env_vars: Environment variables to set before script execution + + Returns: + CommandResult: The execution result with exit_code, stdout, stderr + + Raises: + RuntimeError: If script upload or execution fails + """ + remote_script_path = self._prepare_script(script_content, remote_dir, script_name) + + try: + command = self._build_command(remote_script_path, script_type, env_vars) + code, out, err = self.run(command, timeout=timeout) + return CommandResult(exit_code=code, stdout=out, stderr=err) + finally: + if cleanup: + self._cleanup_script(remote_script_path) + + def execute_local_script_streaming( + self, + local_script_path: str, + script_type: str = "shell", + remote_dir: str = "/tmp", + script_name: Optional[str] = None, + timeout: Optional[int] = None, + cleanup: bool = True, + env_vars: Optional[Dict[str, str]] = None, + on_stdout: Optional[Callable[[bytes], None]] = None, + on_stderr: Optional[Callable[[bytes], None]] = None, + ) -> int: + """ + Execute a local bash script with streaming output. + + Args: + local_script_path: Path to the local script file + remote_dir: Remote directory to place the script (default: /tmp) + script_name: Name for the script file (uses basename if None) + timeout: Command execution timeout in seconds + cleanup: Whether to delete the script file after execution + env_vars: Environment variables to set before script execution + on_stdout: Callback to receive stdout chunks (bytes) + on_stderr: Callback to receive stderr chunks (bytes) + + Returns: + int: Exit code of the script execution + + Raises: + FileNotFoundError: If local script file not found + RuntimeError: If script upload or execution fails + """ + if not os.path.isfile(local_script_path): + raise FileNotFoundError(f"Local script not found: {local_script_path}") + + if not script_name: + script_name = os.path.basename(local_script_path) + + remote_script_path = f"{remote_dir.rstrip('/')}/{script_name}" + + # Upload the local script file via SFTP with LF normalization + sftp = self.get_sftp() + with open(local_script_path, "r", encoding="utf-8", newline="") as f: + content = f.read() + content_lf = content.replace("\r\n", "\n").replace("\r", "\n") + with sftp.file(remote_script_path, "w") as remote_file: + remote_file.write(content_lf.encode("utf-8")) + + try: + command = self._build_command(remote_script_path, script_type, env_vars) + return self.run_streaming( + command, + on_stdout=on_stdout, + on_stderr=on_stderr, + timeout=timeout, + ) + finally: + if cleanup: + self._cleanup_script(remote_script_path) + + def execute_local_script_collect( + self, + local_script_path: str, + script_type: str = "shell", + remote_dir: str = "/tmp", + script_name: Optional[str] = None, + timeout: Optional[int] = None, + cleanup: bool = True, + env_vars: Optional[Dict[str, str]] = None, + ) -> CommandResult: + """ + Execute a local bash script and collect all output. + + Args: + local_script_path: Path to the local script file + remote_dir: Remote directory to place the script (default: /tmp) + script_name: Name for the script file (uses basename if None) + timeout: Command execution timeout in seconds + cleanup: Whether to delete the script file after execution + env_vars: Environment variables to set before script execution + + Returns: + CommandResult: The execution result with exit_code, stdout, stderr + + Raises: + FileNotFoundError: If local script file not found + RuntimeError: If script upload or execution fails + """ + if not os.path.isfile(local_script_path): + raise FileNotFoundError(f"Local script not found: {local_script_path}") + + if not script_name: + script_name = os.path.basename(local_script_path) + + remote_script_path = f"{remote_dir.rstrip('/')}/{script_name}" + + # Upload the local script file via SFTP with LF normalization + sftp = self.get_sftp() + with open(local_script_path, "r", encoding="utf-8", newline="") as f: + content = f.read() + content_lf = content.replace("\r\n", "\n").replace("\r", "\n") + with sftp.file(remote_script_path, "w") as remote_file: + remote_file.write(content_lf.encode("utf-8")) + + try: + command = self._build_command(remote_script_path, script_type, env_vars) + code, out, err = self.run(command, timeout=timeout) + return CommandResult(exit_code=code, stdout=out, stderr=err) + finally: + if cleanup: + self._cleanup_script(remote_script_path) + + def _prepare_script(self, script_content: str, remote_dir: str, script_name: Optional[str]) -> str: + """Prepare script by uploading content (LF normalized).""" + if not script_name: + import uuid + script_name = f"script_{uuid.uuid4().hex[:8]}" + + remote_script_path = f"{remote_dir.rstrip('/')}/{script_name}" + + sftp = None + try: + # Upload script content directly via SFTP (normalize to LF) + sftp = self.get_sftp() + content_lf = script_content.replace("\r\n", "\n").replace("\r", "\n") + with sftp.file(remote_script_path, "w") as remote_file: + remote_file.write(content_lf.encode("utf-8")) + except: + pass + finally: + if sftp and self._threading_mod: + sftp.close() + + return remote_script_path + + @staticmethod + def _build_command( + remote_script_path: str, + script_type: str = "shell", + env_vars: Optional[Dict[str, str]] = None) -> str: + """Build the command string with environment variables.""" + env_string = "" + if env_vars: + env_pairs = [f"{k}='{v}'" for k, v in env_vars.items()] + env_string = " ".join(env_pairs) + " " + + if script_type == "shell": + return f"{env_string}bash {remote_script_path}" + elif script_type == "python": + get_py_bin = "pyBin=$(which python3 2> /dev/null || which python 2> /dev/null || echo 'python')" + py_info = "echo ""; echo \"Current Python environment:${pyBin} $(${pyBin} -c 'import sys,platform;print(sys.version.split()[0],platform.platform())')\"" + cmd = "%s;${pyBin} %s; ret=$?; [ $ret -eq 0 ] && exit $ret; %s;exit $ret;" % ( + get_py_bin, remote_script_path, py_info + ) + return cmd + else: + raise ValueError("Invalid script type") + + def _cleanup_script(self, remote_script_path: str) -> None: + """Clean up the remote script file via SFTP without invoking shell.""" + sftp = None + try: + sftp = self.get_sftp() + # Ensure path exists before removal + try: + sftp.stat(remote_script_path) + except FileNotFoundError: + return + sftp.remove(remote_script_path) + except Exception: + # Swallow cleanup errors + pass + finally: + if sftp and self._threading_mod: + sftp.close() + + def path_exists(self, path: str) -> Tuple[bool, str]: + """ + Check if a path exists on the remote server. + + Args: + path: Path to check + + Returns: + Tuple[bool, str]: A tuple containing a boolean indicating whether the path exists and an error message + """ + sftp = None + try: + sftp = self.get_sftp() + try: + sftp.stat(path) + return True, "" + except FileNotFoundError: + return False, "" + except Exception as e: + return False, str(e) + finally: + if sftp and self._threading_mod: + sftp.close() + + + def create_dir(self, path: str): + """ + Create a directory on the remote server. + + Args: + path: Path to create + + Returns: + Tuple[bool, str]: A tuple containing a boolean indicating whether the directory was created successfully and an error message + """ + sftp = None + try: + sftp = self.get_sftp() + self._ensure_remote_dir(sftp, path) + return True, "" + except Exception as e: + return False, str(e) + finally: + if sftp and self._threading_mod: + return sftp.close() + + def path_info(self, path: str) -> Dict: + """ + Get information about a path on the remote server. + + Args: + path: Path to get information about + + Returns: + Dict: A dictionary containing information about the path, including path, isdir, size, mtime, mode, uid, gid, and exists + """ + sftp = None + not_found = {"path": path,"isdir": False,"size": 0,"mtime": 0,"mode": 0,"uid": 0,"gid": 0, "exists": False} + try: + sftp = self.get_sftp() + info = sftp.stat(path) + return { + "path": path, + "isdir": stat.S_ISDIR(info.st_mode), + "size": info.st_size, + "mtime": info.st_mtime, + "mode": info.st_mode, + "uid": info.st_uid, + "gid": info.st_gid, + "exists": True + } + except FileNotFoundError: + return not_found + except: + return not_found + finally: + if sftp and self._threading_mod: + sftp.close() + diff --git a/mod/base/ssh_executor/util.py b/mod/base/ssh_executor/util.py new file mode 100644 index 00000000..bc0b602c --- /dev/null +++ b/mod/base/ssh_executor/util.py @@ -0,0 +1,51 @@ +import io +import paramiko + + +def test_ssh_config(host, port, username, password, pkey, pkey_passwd, timeout: int = 10) -> str: + try: + ssh = paramiko.SSHClient() + pkey_obj = None + if pkey: + pky_io = io.StringIO(pkey) + key_cls_list = [paramiko.RSAKey, paramiko.ECDSAKey, paramiko.Ed25519Key] + if hasattr(paramiko, "DSSKey"): + key_cls_list.append(paramiko.DSSKey) + for key_cls in key_cls_list: + pky_io.seek(0) + try: + pkey_obj = key_cls.from_private_key(pky_io, password=(pkey_passwd if pkey_passwd else None)) + except Exception as e: + if "base64 decoding error" in str(e): + return "Private key data error, please check if it is a complete copy of the private key information" + elif "Private key file is encrypted" in str(e): + return "The private key has been encrypted, but the password for the private key has not been provided, so the private key information cannot be verified" + elif "Invalid key" in str(e): + return "Private key parsing error, please check if the password for the private key is correct" + continue + else: + break + else: + return "Private key parsing error, please confirm that the entered key format is correct" + ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy()) + # look_for_keys 一定要是False,排除不必要的私钥尝试导致的错误 + ssh.connect(hostname=host, port=port, username=username, password=(password if password else None), + pkey=pkey_obj, look_for_keys=False, auth_timeout=timeout) + ssh.close() + return "" + except Exception as e: + err_str = str(e) + auth_str = "{}@{}:{}".format(username, host, port) + if err_str.find('Authentication timeout') != -1: + return 'Authentication timeout, [{}] error:{}'.format(auth_str, e) + if err_str.find('Authentication failed') != -1: + if pkey: + return 'Authentication failed, please check if the private key is correct: ' + auth_str + return 'Account or password error:' + auth_str + if err_str.find('Bad authentication type; allowed types') != -1: + return 'Unsupported authentication type: {}'.format(err_str) + if err_str.find('Connection reset by peer') != -1: + return 'The target server actively rejects the connection' + if err_str.find('Error reading SSH protocol banner') != -1: + return 'Protocol header response timeout, error:' + err_str + return "Connection failed:" + err_str \ No newline at end of file diff --git a/mod/base/web_conf/__init__.py b/mod/base/web_conf/__init__.py index 5c858f75..9b18241e 100644 --- a/mod/base/web_conf/__init__.py +++ b/mod/base/web_conf/__init__.py @@ -11,7 +11,6 @@ from .redirect import RealRedirect, Redirect from .access_restriction import AccessRestriction, RealAccessRestriction from .domain_tool import domain_to_puny_code, check_domain, normalize_domain, NginxDomainTool, ApacheDomainTool, \ is_domain -from .dns_api import DNSApiManager, RealDnsMager from .dir_tool import DirTool from .referer import Referer, RealReferer from .logmanager import LogMgr, RealLogMgr @@ -19,6 +18,7 @@ from .proxy import Proxy, RealProxy from .ssl import SSLManager, RealSSLManger from .config_mgr import ConfigMgr from .default_site import set_default_site, get_default_site, check_default +from .server_extension import NginxExtension as ng_ext, ApacheExtension as ap_ext def remove_sites_service_config(site_name: str, config_prefix: str = ""): diff --git a/mod/project/node/__init__.py b/mod/project/node/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/mod/project/node/dbutil/__init__.py b/mod/project/node/dbutil/__init__.py new file mode 100644 index 00000000..dcdc5e41 --- /dev/null +++ b/mod/project/node/dbutil/__init__.py @@ -0,0 +1,17 @@ +from .load_db import LoadSite, HttpNode, TcpNode, NodeDB +from .node_db import Node, ServerNodeDB, ServerMonitorRepo, NodeAPPKey +from .file_transfer_db import FileTransfer, FileTransferDB, FileTransferTask +# from .executor import Script, ScriptGroup, ExecutorDB, ExecutorLog, ExecutorTask +from .node_task_flow import Script, Flow, CommandTask, CommandLog, TransferFile, TransferLog, TaskFlowsDB, \ + TransferTask, FlowTemplates + +# 初始化数据库 +try: + NodeDB().init_db() + ServerNodeDB().init_db() + FileTransferDB().init_db() + # ExecutorDB().init_db() + TaskFlowsDB().init_db() +except Exception as e: + import public + public.print_error() diff --git a/mod/project/node/dbutil/executor.py b/mod/project/node/dbutil/executor.py new file mode 100644 index 00000000..15bfd16a --- /dev/null +++ b/mod/project/node/dbutil/executor.py @@ -0,0 +1,481 @@ +import os +import sys +from dataclasses import dataclass, field +from datetime import datetime +from typing import Optional, List, Dict, Tuple, Any, Union, Type, Generic, TypeVar, TextIO +import sqlite3 +import json + +if "/www/server/panel/class" not in sys.path: + sys.path.insert(0, "/www/server/panel/class") + +import public +import db + +if "/www/server/panel" not in sys.path: + sys.path.insert(0, "/www/server/panel") + + +@dataclass +class Script: + """对应scripts表""" + name: str + script_type: str + content: str + id: Optional[int] = None + description: Optional[str] = None + group_id: int = 0 + created_at: Optional[datetime] = None + updated_at: Optional[datetime] = None + + @staticmethod + def check(data: Dict[str, Any]) -> str: + if "script_type" not in data or not data["script_type"]: + return "Script type cannot be empty" + if not data["script_type"] in ["python", "shell"]: + return "Script type error, please choose Python or Shell" + if "content" not in data or not data["content"]: + return "Script content cannot be empty" + if "name" not in data or not data["name"]: + return "Script name cannot be empty" + return "" + + @classmethod + def from_dict(cls, data: Dict[str, Any]) -> 'Script': + """从字典创建Script实例""" + return cls( + id=int(data['id']) if data.get('id', None) else None, + name=str(data['name']), + script_type=str(data['script_type']), + content=str(data['content']), + description=str(data['description']) if data.get('description', None) else None, + group_id=int(data['group_id']) if data.get('group_id', None) else 0, + created_at=datetime.fromisoformat(data['created_at']) if data.get('created_at', None) else None, + updated_at=datetime.fromisoformat(data['updated_at']) if data.get('updated_at', None) else None + ) + + def to_dict(self) -> Dict[str, Any]: + """转换为字典格式""" + return { + 'id': self.id, + 'name': self.name, + 'script_type': self.script_type, + 'content': self.content, + 'description': self.description, + 'group_id': self.group_id, + 'created_at': self.created_at.isoformat() if self.created_at else None, + 'updated_at': self.updated_at.isoformat() if self.updated_at else None + } + + +@dataclass +class ScriptGroup: + """对应script_groups表""" + name: str + id: Optional[int] = None + description: Optional[str] = None + created_at: Optional[datetime] = None + + @staticmethod + def check(data: Dict[str, Any]) -> str: + if "name" not in data or not data["name"]: + return "Script group name cannot be empty" + return "" + + @classmethod + def from_dict(cls, data: Dict[str, Any]) -> 'ScriptGroup': + """从字典创建ScriptGroup实例""" + return cls( + id=int(data['id']) if data.get('id', None) else None, + name=str(data['name']), + description=str(data['description']) if data.get('description', None) else None, + created_at=datetime.fromisoformat(data['created_at']) if data.get('created_at', None) else None + ) + + def to_dict(self) -> Dict[str, Any]: + """转换为字典格式""" + return { + 'id': self.id, + 'name': self.name, + 'description': self.description, + 'created_at': self.created_at.isoformat() if self.created_at else None + } + + +@dataclass +class ExecutorTask: + """对应executor_tasks表""" + script_id: int + script_content: str + script_type: str + server_ids: str = "" + id: Optional[int] = None + created_at: Optional[datetime] = None + updated_at: Optional[datetime] = None + _elogs: Optional[List["ExecutorLog"]] = None + + @classmethod + def from_dict(cls, data: Dict[str, Any]) -> 'ExecutorTask': + """从字典创建ExecutorTask实例""" + return cls( + id=int(data['id']) if data.get('id', None) else None, + script_id=int(data['script_id']), + script_content=str(data['script_content']), + script_type=str(data['script_type']), + created_at=datetime.fromisoformat(data['created_at']) if data.get('created_at', None) else None, + updated_at=datetime.fromisoformat(data['updated_at']) if data.get('updated_at', None) else None + ) + + def to_dict(self) -> Dict[str, Any]: + """转换为字典格式""" + return { + 'id': self.id, + 'script_id': self.script_id, + 'server_ids': self.server_ids, + 'script_content': self.script_content, + 'script_type': self.script_type, + 'created_at': self.created_at.isoformat() if self.created_at else None, + 'updated_at': self.updated_at.isoformat() if self.updated_at else None + } + + @property + def elogs(self) -> List["ExecutorLog"]: + if self._elogs is None: + return [] + return self._elogs + + @elogs.setter + def elogs(self, elogs: List["ExecutorLog"]): + self._elogs = elogs + + +_EXECUTOR_LOG_DIR = public.get_panel_path() + "/logs/executor_log/" +try: + if not os.path.exists(_EXECUTOR_LOG_DIR): + os.makedirs(_EXECUTOR_LOG_DIR) +except: + pass + + +@dataclass +class ExecutorLog: + """对应executor_logs表""" + executor_task_id: int + server_id: int + ssh_host: str + id: Optional[int] = None + status: int = 0 # 0:运行中 1:成功 2:失败 3:异常 + log_name: Optional[str] = None + created_at: Optional[datetime] = None + updated_at: Optional[datetime] = None + _log_fp: Optional[TextIO] = None + + @classmethod + def from_dict(cls, data: Dict[str, Any]) -> 'ExecutorLog': + """从字典创建ExecutorLog实例""" + return cls( + id=int(data['id']) if data.get('id', None) else None, + executor_task_id=int(data['executor_task_id']), + server_id=int(data['server_id']), + ssh_host=str(data['ssh_host']), + status=int(data['status']) if data.get('status', 0) else 0, + log_name=str(data['log_name']) if data.get('log_name', None) else None, + created_at=datetime.fromisoformat(data['created_at']) if data.get('created_at', None) else None, + updated_at=datetime.fromisoformat(data['updated_at']) if data.get('updated_at', None) else None + ) + + def to_dict(self) -> Dict[str, Any]: + """转换为字典格式""" + return { + 'id': self.id, + 'executor_task_id': self.executor_task_id, + 'server_id': self.server_id, + 'ssh_host': self.ssh_host, + 'status': self.status, + 'log_name': self.log_name, + 'created_at': self.created_at.isoformat() if self.created_at else None, + 'updated_at': self.updated_at.isoformat() if self.updated_at else None + } + + @property + def log_file(self): + return os.path.join(_EXECUTOR_LOG_DIR, self.log_name) + + @property + def log_fp(self): + if self._log_fp is None: + self._log_fp = open(self.log_file, "w+") + return self._log_fp + + def create_log(self): + public.writeFile(self.log_file, "") + + def remove_log(self): + if os.path.exists(self.log_file): + os.remove(self.log_file) + + def get_log(self): + return public.readFile(self.log_file) + + def write_log(self, log_data: str, is_end_log=False): + self.log_fp.write(log_data) + self.log_fp.flush() + if is_end_log: + self.log_fp.close() + self._log_fp = None + + +_TableType = TypeVar("_TableType", bound=Union[Script, ScriptGroup, ExecutorTask, ExecutorLog]) + + +class _Table(Generic[_TableType]): + """数据库表""" + table_name: str = "" + data_cls: Type[_TableType] + + def __init__(self, db_obj: db.Sql): + self._db = db_obj + + # 当仅传递一个数据时,返回插入数的 id或错误信息; 当传递多个数据时,返回插入的行数或错误信息 + def create(self, + data: Union[_TableType, List[_TableType]]) -> Union[int, str]: + """创建数据""" + if not isinstance(data, list): + data = [data] + + if not len(data): + raise ValueError("Data cannot be empty") + if not isinstance(data[0], self.data_cls): + raise ValueError("Data type error") + + now = datetime.now().isoformat() + + def fileter_data(item): + item_dict = item.to_dict() + if "id" in item_dict: + item_dict.pop("id") + if "created_at" in item_dict and item_dict["created_at"] is None: + item_dict["created_at"] = now + if "updated_at" in item_dict and item_dict["updated_at"] is None: + item_dict["updated_at"] = now + return item_dict + + data_list = list(map(fileter_data, data)) + if len(data_list) == 1: + try: + res = self._db.table(self.table_name).insert(data_list[0]) + if isinstance(res, int): + return res + return str(res) + except Exception as e: + return str(e) + try: + res = self._db.table(self.table_name).batch_insert(data_list) + if isinstance(res, (int, bool)): + return len(data) + return str(res) + except Exception as e: + return str(e) + + def update(self, data: _TableType) -> str: + """更新数据""" + if not isinstance(data, self.data_cls): + raise ValueError("Data type error") + data_dict = data.to_dict() + data_dict.pop('created_at', None) + if "updated_at" in data_dict: + data_dict["updated_at"] = datetime.now().isoformat() + if "id" not in data_dict: + raise ValueError("The data ID cannot be empty") + try: + self._db.table(self.table_name).where("id=?", (data_dict["id"],)).update(data_dict) + except Exception as e: + return str(e) + return "" + + def get_byid(self, data_id: int) -> Optional[_TableType]: + """根据id获取数据""" + try: + result = self._db.table(self.table_name).where("id=?", (data_id,)).find() + except Exception as e: + return None + if not result: + return None + return self.data_cls.from_dict(result) + + def delete(self, data_id: Union[int, List[int]]): + """删除数据""" + if isinstance(data_id, list): + data_id = [int(item) for item in data_id] + elif isinstance(data_id, int): + data_id = [int(data_id)] + else: + return "数据id类型错误" + try: + self._db.table(self.table_name).where( + "id in ({})".format(",".join(["?"] * len(data_id))), (*data_id,) + ).delete() + return "" + except Exception as e: + return str(e) + + def query(self, *args) -> List[_TableType]: + """查询数据""" + try: + result = self._db.table(self.table_name).where(*args).select() + except Exception as e: + return [] + if not result: + return [] + return [self.data_cls.from_dict(item) for item in result] + + def query_page(self, *args, page_num: int = 1, limit: int = 10) -> List[_TableType]: + """查询数据, 支持分页""" + try: + offset = limit * (page_num - 1) + result = self._db.table(self.table_name).where(*args).limit(limit, offset).order("id DESC").select() + except Exception as e: + public.print_error() + return [] + if not result: + return [] + return [self.data_cls.from_dict(item) for item in result] + + def count(self, *args) -> int: + """查询数据数量""" + try: + result = self._db.table(self.table_name).where(*args).count() + except Exception as e: + return 0 + return result + + def find(self, *args) -> Optional[_TableType]: + """查询单条数据""" + try: + result = self._db.table(self.table_name).where(*args).find() + except Exception as e: + return None + if not result: + return None + return self.data_cls.from_dict(result) + + +class _ScriptTable(_Table[Script]): + """脚本表""" + table_name = "scripts" + data_cls = Script + + def set_group_id(self, group_id: int, *where_args) -> str: + """设置脚本组""" + try: + self._db.table(self.table_name).where(where_args).update({"group_id": group_id}) + except Exception as e: + return str(e) + return "" + + +class _ScriptGroupTable(_Table[ScriptGroup]): + """脚本组表""" + table_name = "script_groups" + data_cls = ScriptGroup + default_group = ScriptGroup( + id=0, + name="default", + description="Default grouping, use this grouping when not set", + created_at=datetime.now(), + ) + + def all_group(self) -> List[ScriptGroup]: + """获取所有脚本组""" + try: + result = self._db.table(self.table_name).select() + except Exception as e: + return [] + if not result: + return [] + return [self.default_group] + [self.data_cls.from_dict(item) for item in result] + + +class _ExecutorTaskTable(_Table[ExecutorTask]): + """执行任务表""" + table_name = "executor_tasks" + data_cls = ExecutorTask + + def query_tasks(self, + page=1, size=10, node_id: int = None, script_type: str = None, search: str = None + ) -> Tuple[int, List[ExecutorTask]]: + """查询任务""" + where_args, parms = [], [] + if script_type and script_type != "all": + where_args.append("script_type=?") + parms.append(script_type) + if search: + search_str = "script_content like ?" + parms.append("%{}%".format(search)) + + stable = _ScriptTable(self._db) + data = stable.query("name like ? or description like ?", ("%{}%".format(search), "%{}%".format(search))) + if data: + search_str += " or script_id in ({})".format(",".join(["?"] * len(data))) + where_args.append("(" + search_str + ")") + parms.append(tuple([item.id for item in data])) + else: + where_args.append(search_str) + + if node_id: + where_args.append("server_ids like ?") + parms.append("%|{}%".format(node_id)) + + + # public.print_log("search criteria: {}".format(" AND ".join(where_args)), parms) + count = self.count( + " AND ".join(where_args), + (*parms, ) + ) + + return count, self.query_page( + " AND ".join(where_args), + (*parms, ), + page_num=page, + limit=size + ) + + +class _ExecutorLogTable(_Table[ExecutorLog]): + """执行日志表""" + table_name = "executor_logs" + data_cls = ExecutorLog + + +class ExecutorDB: + _DB_FILE = public.get_panel_path() + "/data/db/executor.db" + _DB_INIT_FILE = os.path.dirname(__file__) + "/executor.sql" + + def __init__(self): + sql = db.Sql() + sql._Sql__DB_FILE = self._DB_FILE + self.db = sql + self.Script = _ScriptTable(self.db) + self.ScriptGroup = _ScriptGroupTable(self.db) + self.ExecutorTask = _ExecutorTaskTable(self.db) + self.ExecutorLog = _ExecutorLogTable(self.db) + + def init_db(self): + sql_data = public.readFile(self._DB_INIT_FILE) + if not os.path.exists(self._DB_FILE) or os.path.getsize(self._DB_FILE) == 0: + public.writeFile(self._DB_FILE, "") + import sqlite3 + conn = sqlite3.connect(self._DB_FILE) + cursor = conn.cursor() + cursor.executescript(sql_data) + conn.commit() + conn.close() + + def close(self): + self.db.close() + + def __enter__(self): + return self + + def __exit__(self, exc_type, exc_value, exc_trackback): + self.close() diff --git a/mod/project/node/dbutil/executor.sql b/mod/project/node/dbutil/executor.sql new file mode 100644 index 00000000..8712809d --- /dev/null +++ b/mod/project/node/dbutil/executor.sql @@ -0,0 +1,60 @@ + +-- 创建脚本表 +CREATE TABLE IF NOT EXISTS scripts ( + id INTEGER PRIMARY KEY AUTOINCREMENT, + name TEXT NOT NULL CHECK(length(name) <= 255), + script_type TEXT NOT NULL CHECK(length(script_type) <= 255), + content TEXT NOT NULL, + description TEXT CHECK(length(description) <= 255), + created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, + updated_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, + group_id INTEGER NOT NULL DEFAULT 0 +); + +-- 创建脚本组表 +CREATE TABLE IF NOT EXISTS script_groups ( + id INTEGER PRIMARY KEY AUTOINCREMENT, + name TEXT NOT NULL CHECK(length(name) <= 255), + description TEXT CHECK(length(description) <= 255), + created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP +); + +-- 创建执行任务表 +CREATE TABLE IF NOT EXISTS executor_tasks ( + id INTEGER PRIMARY KEY AUTOINCREMENT, + server_ids TEXT NOT NULL, + script_id INTEGER NOT NULL, + script_content TEXT NOT NULL, + script_type TEXT NOT NULL CHECK(length(script_type) <= 255), + created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, + updated_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP +); + +-- 创建执行日志表 +CREATE TABLE IF NOT EXISTS executor_logs ( + id INTEGER PRIMARY KEY AUTOINCREMENT, + executor_task_id INTEGER NOT NULL, + server_id INTEGER NOT NULL, + ssh_host TEXT NOT NULL, + status INTEGER NOT NULL DEFAULT 0 CHECK(status IN (0,1,2,3)), + log_name TEXT CHECK(length(log_name) <= 255), + created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, + updated_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP +); + + +-- 创建索引(分开创建以避免SQLite语法错误) +-- 脚本表索引 +CREATE INDEX IF NOT EXISTS idx_scripts_name ON scripts(name); +CREATE INDEX IF NOT EXISTS idx_scripts_script_type ON scripts(script_type); +CREATE INDEX IF NOT EXISTS idx_scripts_group_id ON scripts(group_id); + +-- 脚本组索引 +CREATE INDEX IF NOT EXISTS idx_script_groups_name ON script_groups(name); + +-- 执行任务索引 +CREATE INDEX IF NOT EXISTS idx_executor_tasks_script_id ON executor_tasks(script_id); + +-- 执行日志索引 +CREATE INDEX IF NOT EXISTS idx_executor_logs_task_server ON executor_logs(executor_task_id, server_id); +CREATE INDEX IF NOT EXISTS idx_executor_logs_status ON executor_logs(status); \ No newline at end of file diff --git a/mod/project/node/dbutil/file_transfer.sql b/mod/project/node/dbutil/file_transfer.sql new file mode 100644 index 00000000..46cdabeb --- /dev/null +++ b/mod/project/node/dbutil/file_transfer.sql @@ -0,0 +1,36 @@ +-- 传输任务表 +CREATE TABLE IF NOT EXISTS transfer_tasks +( + task_id INTEGER PRIMARY KEY AUTOINCREMENT, + source_node TEXT NOT NULL DEFAULT '{}', -- {"address":"https:/xxxx", "api_key":"xxxxx", "name":"xxxx"} + target_node TEXT NOT NULL DEFAULT '{}', -- {"address":"https:/xxxx", "api_key":"xxxxx", "name":"xxxx"} + source_path_list TEXT NOT NULL DEFAULT '[]', -- 源节点上的路径 [{"path":"/www/wwwroot/aaaa", "is_dir":true}] + target_path TEXT NOT NULL, -- 目标节点上的路径 + task_action TEXT NOT NULL, -- upload/download + status TEXT NOT NULL, -- pending/running/completed/failed + default_mode TEXT NOT NULL, -- 默认处理模式 cover: 覆盖,ignore: 跳过,rename:重命名 + created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, + started_at TIMESTAMP, + completed_at TIMESTAMP, + created_by TEXT NOT NULL, -- 创建的节点名称 + target_task_id INTEGER NOT NULL, + is_source_node BOOLEAN NOT NULL, -- 是否为本节点发送 + is_target_node BOOLEAN NOT NULL -- 是否为本节点接收 +); + +-- 文件传输详情表 +CREATE TABLE IF NOT EXISTS file_transfers +( + transfer_id INTEGER PRIMARY KEY AUTOINCREMENT, + task_id INTEGER NOT NULL, + src_file TEXT NOT NULL, -- 源文件 + dst_file TEXT NOT NULL, -- 目标文件 + file_size INTEGER NOT NULL, -- 文件大小 + is_dir INTEGER NOT NULL DEFAULT 0, + status TEXT NOT NULL, -- pending/running/completed/failed + progress INTEGER DEFAULT 0, -- 0-100 + message TEXT NOT NULL DEFAULT '', + created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, + started_at TIMESTAMP, + completed_at TIMESTAMP +); diff --git a/mod/project/node/dbutil/file_transfer_db.py b/mod/project/node/dbutil/file_transfer_db.py new file mode 100644 index 00000000..ccac1922 --- /dev/null +++ b/mod/project/node/dbutil/file_transfer_db.py @@ -0,0 +1,328 @@ +import os +import sys +from dataclasses import dataclass, field +from datetime import datetime +from typing import Optional, List, Dict, Tuple +import sqlite3 +import json + +if "/www/server/panel/class" not in sys.path: + sys.path.insert(0, "/www/server/panel/class") + +import public +import db + +if "/www/server/panel" not in sys.path: + sys.path.insert(0, "/www/server/panel") + + +@dataclass +class FileTransferTask: + task_id: Optional[int] = None + source_node: dict = field(default_factory=lambda: {}) + target_node: dict = field(default_factory=lambda: {}) + source_path_list: list = field(default_factory=lambda: []) # [{"path":"/www/wwwroot/aaaa", "is_dir":true}] + target_path: str = "" + task_action: str = "" # upload/download + status: str = "pending" # pending/running/completed/failed + default_mode: str = "cover" # 默认处理模式 cover: 覆盖,ignore: 跳过,rename:重命名 + created_at: Optional[datetime] = None + started_at: Optional[datetime] = None + completed_at: Optional[datetime] = None + created_by: str = "" + target_task_id: int = 0 + is_source_node: bool = False + is_target_node: bool = False + + @classmethod + def from_dict(cls, row: dict) -> 'FileTransferTask': + source_node = row.get("source_node", "{}") + if isinstance(source_node, str): + source_node = json.loads(source_node) + elif isinstance(source_node, dict): + source_node = source_node + else: + source_node = {} + + target_node = row.get("target_node", "{}") + if isinstance(target_node, str): + target_node = json.loads(target_node) + elif isinstance(target_node, dict): + target_node = target_node + else: + target_node = {} + + source_path_list = row.get("source_path_list", "[]") + if isinstance(source_path_list, str): + source_path_list = json.loads(source_path_list) + elif isinstance(source_path_list, list): + source_path_list = source_path_list + else: + source_path_list = [] + + return cls( + task_id=row.get("task_id", None), + source_node=source_node, + target_node=target_node, + source_path_list=source_path_list, + target_path=row.get("target_path", ""), + task_action=row.get("task_action", ""), + status=row.get("status", ""), + default_mode=row.get("default_mode", "cover"), + created_at=datetime.fromisoformat(row.get("created_at")) if row.get("created_at", "") else None, + started_at=datetime.fromisoformat(row.get("started_at")) if row.get("started_at", "") else None, + completed_at=datetime.fromisoformat(row.get("completed_at")) if row.get("completed_at", "") else None, + created_by=row.get("created_by", ""), + target_task_id=row.get("target_task_id", 0), + is_source_node=row.get("is_source_node", False), + is_target_node=row.get("is_target_node", False) + ) + + def to_dict(self) -> dict: + return { + "task_id": self.task_id, + "source_node": self.source_node, + "target_node": self.target_node, + "source_path_list": self.source_path_list, + "target_path": self.target_path, + "task_action": self.task_action, + "status": self.status, + "default_mode": self.default_mode, + "created_at": self.created_at.isoformat() if self.created_at else None, + "started_at": self.started_at.isoformat() if self.started_at else None, + "completed_at": self.completed_at.isoformat() if self.completed_at else None, + "created_by": self.created_by, + "target_task_id": self.target_task_id, + "is_source_node": self.is_source_node, + "is_target_node": self.is_target_node + } + + +@dataclass +class FileTransfer: + transfer_id: Optional[int] = None + task_id: int = 0 + src_file: str = "" + dst_file: str = "" + file_size: int = 0 + is_dir: int = 0 + status: str = "" # pending/running/completed/failed + progress: int = 0 + message: str = "" + created_at: Optional[datetime] = None + started_at: Optional[datetime] = None + completed_at: Optional[datetime] = None + + @classmethod + def from_dict(cls, row: dict) -> 'FileTransfer': + return cls( + transfer_id=row.get("transfer_id", None), + task_id=row.get("task_id", 0), + src_file=row.get("src_file", ""), + dst_file=row.get("dst_file", ""), + file_size=row.get("file_size", 0), + is_dir=row.get("is_dir", 0), + status=row.get("status", ""), + progress=row.get("progress", 0), + message=row.get("message", ""), + created_at=datetime.fromisoformat(row.get("created_at")) if row.get("created_at", "") else None, + started_at=datetime.fromisoformat(row.get("started_at")) if row.get("started_at", "") else None, + completed_at=datetime.fromisoformat(row.get("completed_at")) if row.get("completed_at", "") else None + ) + + def to_dict(self) -> dict: + return { + "transfer_id": self.transfer_id, + "task_id": self.task_id, + "src_file": self.src_file, + "dst_file": self.dst_file, + "file_size": self.file_size, + "is_dir": self.is_dir, + "status": self.status, + "progress": self.progress, + "message": self.message, + "created_at": self.created_at.isoformat() if self.created_at else None, + "started_at": self.started_at.isoformat() if self.started_at else None, + "completed_at": self.completed_at.isoformat() if self.completed_at else None + } + + +# SQLite 操作类 +class FileTransferDB: + _DB_FILE = public.get_panel_path() + "/data/db/node_file_transfer.db" + _DB_INIT_FILE = os.path.dirname(__file__) + "/file_transfer.sql" + + def __init__(self): + sql = db.Sql() + sql._Sql__DB_FILE = self._DB_FILE + self.db = sql + + def init_db(self): + sql_data = public.readFile(self._DB_INIT_FILE) + if not os.path.exists(self._DB_FILE) or os.path.getsize(self._DB_FILE) == 0: + public.writeFile(self._DB_FILE, "") + import sqlite3 + conn = sqlite3.connect(self._DB_FILE) + c = conn.cursor() + c.executescript(sql_data) + conn.commit() + conn.close() + + def close(self): + self.db.close() + + def __enter__(self): + return self + + def __exit__(self, exc_type, exc_value, exc_trackback): + self.close() + + def __del__(self): + self.close() + + def create_task(self, task: FileTransferTask) -> str: + task_data = task.to_dict() + task_data.pop('task_id', None) + task_data.pop('created_at', None) + task_data["source_node"] = json.dumps(task_data["source_node"]) + task_data["target_node"] = json.dumps(task_data["target_node"]) + task_data["source_path_list"] = json.dumps(task_data["source_path_list"]) + try: + err = self.db.table("transfer_tasks").insert(task_data) + if isinstance(err, str): + return err + elif isinstance(err, int): + task.task_id = err + return "" + except Exception as e: + return f"Database operation error: {str(e)}" + + def update_task(self, task: FileTransferTask) -> str: + task_data = task.to_dict() + task_data.pop('created_at', None) + task_data["source_node"] = json.dumps(task_data["source_node"]) + task_data["target_node"] = json.dumps(task_data["target_node"]) + task_data["source_path_list"] = json.dumps(task_data["source_path_list"]) + if not task.task_id: + return "task_id is required" + try: + err = self.db.table("transfer_tasks").where("task_id = ?", task.task_id).update(task_data) + if isinstance(err, str): + return err + return "" + except Exception as e: + return f"Database operation error: {str(e)}" + + def get_task(self, task_id: int) -> Tuple[Optional[dict], str]: + result = self.db.table("transfer_tasks").where("task_id = ?", task_id).find() + if isinstance(result, str): + return None, result + if self.db.ERR_INFO: + return None, self.db.ERR_INFO + return result, "" + + def get_last_task(self) -> Tuple[Optional[dict], str]: + result = self.db.table("transfer_tasks").order("task_id DESC").limit(1).find() + if isinstance(result, str): + return None, result + if self.db.ERR_INFO: + return None, self.db.ERR_INFO + return result, "" + + def delete_task(self, task_id: int) -> str: + result = self.db.table("transfer_tasks").where("task_id = ?", task_id).delete() + if isinstance(result, str): + return result + return "" + + def get_all_tasks(self, offset: int = 0, limit: int = 100) -> List[dict]: + results = self.db.table("transfer_tasks").limit(limit, offset).select() + if isinstance(results, list): + return results + return [] + + def count_tasks(self) -> int: + return self.db.table("transfer_tasks").count() + + def create_file_transfer(self, transfer: FileTransfer) -> str: + transfer_data = transfer.to_dict() + transfer_data.pop('transfer_id', None) + transfer_data.pop('created_at', None) + try: + err = self.db.table("file_transfers").insert(transfer_data) + if isinstance(err, str): + return err + return "" + except Exception as e: + return f"Database operation error: {str(e)}" + + def update_file_transfer(self, transfer: FileTransfer) -> str: + transfer_data = transfer.to_dict() + if not transfer.transfer_id: + return "transfer_id is required" + try: + err = self.db.table("file_transfers").where("transfer_id = ?", transfer.transfer_id).update(transfer_data) + if isinstance(err, str): + return err + return "" + except Exception as e: + return f"Database operation error: {str(e)}" + + def get_file_transfer(self, transfer_id: int) -> Optional[dict]: + result = self.db.table("file_transfers").where("transfer_id = ?", transfer_id).find() + if isinstance(result, str): + return None + if self.db.ERR_INFO: + return None + return result + + def get_task_file_transfers(self, task_id: int) -> List[dict]: + results = self.db.table("file_transfers").where("task_id = ?", task_id).select() + if isinstance(results, list): + return results + return [] + + def batch_create_file_transfers(self, transfers: List[FileTransfer]) -> str: + """ + 批量创建文件传输记录 + + Args: + transfers: FileTransfer 对象列表 + + Returns: + str: 错误信息,如果成功则返回空字符串 + """ + if not transfers: + return "" + + try: + # 准备批量插入的数据 + transfer_data_list = [] + for transfer in transfers: + transfer_data = transfer.to_dict() + transfer_data.pop('transfer_id', None) + transfer_data['created_at'] = datetime.now().isoformat() + transfer_data_list.append(transfer_data) + + # 执行批量插入 + err = self.db.table("file_transfers").batch_insert(transfer_data_list) + if isinstance(err, str): + return err + return "" + except Exception as e: + return f"Batch creation of file transfer records failed: {str(e)}" + + # 获取上一个任务所有文件传输状态 + def last_task_all_status(self) -> Tuple[Dict, str]: + last_task, err = self.get_last_task() + if err: + return {}, err + if not last_task: + return {}, "" + + task = FileTransferTask.from_dict(last_task) + file_list = self.get_task_file_transfers(task.task_id) + return { + "task": task.to_dict(), + "file_list": file_list, + }, "" diff --git a/mod/project/node/dbutil/load_balancer.sql b/mod/project/node/dbutil/load_balancer.sql new file mode 100644 index 00000000..e9ce898f --- /dev/null +++ b/mod/project/node/dbutil/load_balancer.sql @@ -0,0 +1,54 @@ +-- load_sites 负载均衡网站 +CREATE TABLE IF NOT EXISTS `load_sites` +( + `load_id` INTEGER PRIMARY KEY AUTOINCREMENT, -- 负载均衡ID + `name` TEXT NOT NULL UNIQUE, -- 负载均衡名称 + `site_id` INTEGER NOT NULL DEFAULT 0, -- 站点ID + `site_name` TEXT NOT NULL , -- 站点名称,网站主域名 + `site_type` TEXT NOT NULL DEFAULT 'http', -- http, tcp (http:代表http负载均衡,tcp:代表tcp/udp负载均衡) + `ps` TEXT NOT NULL DEFAULT '', + `http_config` TEXT NOT NULL DEFAULT '{"proxy_next_upstream":"error timeout http_500 http_502 http_503 http_504","http_alg":"sticky_cookie"}', + `tcp_config` TEXT NOT NULL DEFAULT '{"proxy_connect_timeout":8,"proxy_timeout":86400,"host":"127.0.0.1","port":80,"type":"tcp"}', + `created_at` TIMESTAMP DEFAULT CURRENT_TIMESTAMP +); + +-- http_nodes +CREATE TABLE IF NOT EXISTS `http_nodes` +( + `id` INTEGER PRIMARY KEY AUTOINCREMENT, + `load_id` INTEGER NOT NULL DEFAULT 0, -- 负载均衡ID + `node_id` INTEGER NOT NULL DEFAULT 0, -- 节点ID + `node_site_id` INTEGER NOT NULL DEFAULT 0, -- 节点上的网站ID + `node_site_name` TEXT NOT NULL DEFAULT '', -- 节点上的网站名称 + `port` INTEGER NOT NULL DEFAULT 0, -- 端口 + `location` TEXT NOT NULL DEFAULT '/', -- 实施代理的路由, 默认是根路由 '/' 当前版本也只支持根路由 + `path` TEXT NOT NULL DEFAULT '/', -- 访问验证路径 + `node_status` TEXT NOT NULL DEFAULT 'online', -- 节点状态 online, backup, down + `weight` INTEGER NOT NULL DEFAULT 1, -- 权重 + `max_fail` INTEGER NOT NULL DEFAULT 0, -- 最大失败次数 + `fail_timeout` INTEGER NOT NULL DEFAULT 0, -- 失败恢复时间 + `max_conns` INTEGER NOT NULL DEFAULT 0, -- 最大连接数 + `ps` TEXT NOT NULL DEFAULT '', + `created_at` TIMESTAMP DEFAULT CURRENT_TIMESTAMP +); + +-- tcp_nodes +CREATE TABLE IF NOT EXISTS `tcp_nodes` +( + `id` INTEGER PRIMARY KEY AUTOINCREMENT, + `load_id` INTEGER NOT NULL DEFAULT 0, -- 负载均衡ID + `node_id` INTEGER NOT NULL DEFAULT 0, -- 节点ID + `host` TEXT NOT NULL, + `port` INTEGER NOT NULL DEFAULT 0, + `node_status` TEXT NOT NULL DEFAULT 'online', -- 节点状态 online, backup, down + `weight` INTEGER NOT NULL DEFAULT 1, + `max_fail` INTEGER NOT NULL DEFAULT 0, + `fail_timeout` INTEGER NOT NULL DEFAULT 0, + `ps` TEXT NOT NULL DEFAULT '', + `created_at` TIMESTAMP DEFAULT CURRENT_TIMESTAMP +); + +CREATE INDEX IF NOT EXISTS `load_sites_name` ON `load_sites` (`name`); +CREATE INDEX IF NOT EXISTS `load_sites_site_type` ON `load_sites` (`site_type`); +CREATE INDEX IF NOT EXISTS `http_nodes_load_id` ON `http_nodes` (`load_id`); +CREATE INDEX IF NOT EXISTS `tcp_nodes_load_id` ON `tcp_nodes` (`load_id`); \ No newline at end of file diff --git a/mod/project/node/dbutil/load_db.py b/mod/project/node/dbutil/load_db.py new file mode 100644 index 00000000..9d3abffa --- /dev/null +++ b/mod/project/node/dbutil/load_db.py @@ -0,0 +1,449 @@ +import json +import os.path +import re +import sys +from dataclasses import dataclass, field +from typing import Tuple, Optional, List, Union + +if "/www/server/panel/class" not in sys.path: + sys.path.insert(0, "/www/server/panel/class") + +import public +import db + +if "/www/server/panel" not in sys.path: + sys.path.insert(0, "/www/server/panel") + + +@dataclass +class LoadSite: + name: str + site_name: str + site_type: str + ps: str = '' + http_config: dict = field(default_factory=lambda: { + "proxy_next_upstream": "error timeout http_500 http_502 http_503 http_504", + "http_alg": "sticky_cookie", + "proxy_cache_status": False, + "cache_time": "1d", + "cache_suffix": "css,js,jpg,jpeg,gif,png,webp,woff,eot,ttf,svg,ico,css.map,js.map", + }) + tcp_config: dict = field(default_factory=lambda: { + "proxy_connect_timeout": 8, + "proxy_timeout": 86400, + "host": "127.0.0.1", + "port": 80, + "type": "tcp" + }) + created_at: int = 0 + load_id: int = 0 + site_id: int = 0 + + @classmethod + def bind_http_load(cls, data: dict) -> Tuple[Optional["LoadSite"], str]: + check_msg = cls.base_check(data) + if check_msg: + return None, check_msg + if not data.get('site_name', None): + return None, 'site_name is required' + if not public.is_domain(data['site_name']): + return None, 'site_name is invalid' + if not isinstance(data.get('http_config', None), dict): + return None, 'http_config is required' + else: + if "proxy_cache_status" not in dict.keys(data['http_config']): #兼容旧版本数据 + data['http_config']["proxy_cache_status"] = False + data['http_config']["cache_time"] = "1d" + data['http_config']["cache_suffix"] = "css,js,jpg,jpeg,gif,png,webp,woff,eot,ttf,svg,ico,css.map,js.map" + for k in ['proxy_next_upstream', 'http_alg', "proxy_cache_status", "cache_time", "cache_suffix"]: + if k not in dict.keys(data['http_config']): + return None, 'http_config.{} is required'.format(k) + for i in data['http_config']['proxy_next_upstream'].split(): + if i not in ('error', 'timeout') and not re.match(r'^http_\d{3}$', i): + return None, 'http_config.proxy_next_upstream is invalid' + if data['http_config']['http_alg'] not in ('sticky_cookie', 'round_robin', 'least_conn', 'ip_hash'): + return None, 'http_config.http_alg is invalid' + if not isinstance(data['http_config']['proxy_cache_status'], bool): + return None, 'http_config.proxy_cache_status is invalid' + if not isinstance(data['http_config']['cache_time'], str): + return None, 'http_config.cache_time is invalid' + if not re.match(r"^[0-9]+([smhd])$", data['http_config']['cache_time']): + return None, 'http_config.cache_time is invalid' + cache_suffix = data['http_config']['cache_suffix'] + cache_suffix_list = [] + for suffix in cache_suffix.split(","): + tmp_suffix = re.sub(r"\s", "", suffix) + if not tmp_suffix: + continue + cache_suffix_list.append(tmp_suffix) + real_cache_suffix = ",".join(cache_suffix_list) + if not real_cache_suffix: + real_cache_suffix = "css,js,jpg,jpeg,gif,png,webp,woff,eot,ttf,svg,ico,css.map,js.map" + data['http_config']['cache_suffix'] = real_cache_suffix + + l = LoadSite(data.get('name'), data.get('site_name'), 'http', data.get('ps', ''), + http_config=data.get('http_config'), + created_at=data.get('created_at', 0), load_id=data.get('load_id', 0), + site_id=data.get('site_id', 0)) + return l, "" + + @classmethod + def base_check(cls, data) -> str: + if not data.get('name', None): + return 'name is required' + if not re.match(r'^[a-zA-Z0-9][a-zA-Z0-9_]+$', data['name']): + return 'The name can only contain letters, numbers, underscores, and cannot start with numbers or underscores' + if not len(data['name']) >= 3: + return 'The length of the name cannot be less than 3 characters' + return "" + + @classmethod + def bind_tcp_load(cls, data: dict) -> Tuple[Optional["LoadSite"], str]: + check_msg = cls.base_check(data) + if check_msg: + return None, check_msg + if not isinstance(data.get('tcp_config', None), dict): + return None, 'tcp_config is required' + else: + for k in ['proxy_connect_timeout', 'proxy_timeout', 'host', 'port', 'type']: + if not data['tcp_config'].get(k): + return None, 'tcp_config.{} is required'.format(k) + if data['tcp_config']['type'] not in ('tcp', 'udp'): + return None, 'tcp_config.type is invalid' + if not isinstance(data['tcp_config']['port'], int) and not 1 <= data['tcp_config']['port'] <= 65535: + return None, 'tcp_config.port is invalid' + if not public.check_ip(data['tcp_config']['host']): + return None, 'tcp_config.host is invalid' + + l = LoadSite(data.get('name'), data.get('site_name'), 'tcp', ps=data.get('ps', ''), + tcp_config=data.get('tcp_config'), + created_at=data.get('created_at', 0), load_id=data.get('load_id', 0), + site_id=data.get('site_id', 0)) + return l, "" + + def to_dict(self) -> dict: + return { + "name": self.name, + "site_name": self.site_name, + "site_type": self.site_type, + "ps": self.ps, + "http_config": self.http_config, + "tcp_config": self.tcp_config, + "created_at": self.created_at, + "load_id": self.load_id, + "site_id": self.site_id + } + + +@dataclass +class HttpNode: + node_id: int + node_site_name: str + port: int + location: str = "/" + path: str = "/" + node_status: str = "online" # online, backup, down + weight: int = 1 + max_fail: int = 3 + fail_timeout: int = 600 + ps: str = "" + created_at: int = 0 + node_site_id: int = 0 + id: int = 0 + load_id: int = 0 + + @classmethod + def bind(cls, data: dict) -> Tuple[Optional["HttpNode"], str]: + if not isinstance(data.get('node_site_name', None), str): + return None, 'node_site_name is required' + if not public.is_domain(data['node_site_name']) and not public.check_ip(data['node_site_name']): + return None, 'node_site_name is invalid' + if not isinstance(data.get('port', None), int): + return None, 'port is required' + if not 1 <= data['port'] <= 65535: + return None, 'port is invalid' + if not isinstance(data.get('node_id', None), int): + return None, 'node_id is required' + if not isinstance(data.get('node_status', None), str): + return None, 'node_status is required' + if not data['node_status'] in ('online', 'backup', 'down'): + return None, 'node_status is invalid' + + n = HttpNode(data.get('node_id'), data.get('node_site_name'), data.get('port'), "/", + data.get('path', "/"), data.get('node_status', "online"), data.get('weight', 1), + data.get('max_fail', 3), data.get('fail_timeout', 600), data.get('ps', ''), + data.get('created_at', 0), data.get('node_site_id', 0), data.get('id', 0), + data.get('load_id', 0) + ) + return n, "" + + def to_dict(self) -> dict: + return { + "node_id": self.node_id, + "node_site_name": self.node_site_name, + "port": self.port, + "location": self.location, + "path": self.path, + "node_status": self.node_status, + "weight": self.weight, + "max_fail": self.max_fail, + "fail_timeout": self.fail_timeout, + "ps": self.ps, + "created_at": self.created_at, + "node_site_id": self.node_site_id, + "id": self.id, + "load_id": self.load_id + } + + +@dataclass +class TcpNode: + node_id: int + host: str + port: int + id: int = 0 + load_id: int = 0 + node_status: str = "online" # online, backup, down + weight: int = 1 + max_fail: int = 3 + fail_timeout: int = 600 + ps: str = "" + created_at: int = 0 + + @classmethod + def bind(cls, data: dict) -> Tuple[Optional["TcpNode"], str]: + if not isinstance(data.get('node_status', None), str): + return None, 'node_status is required' + if not data['node_status'] in ('online', 'backup', 'down'): + return None, 'node_status is invalid' + if not isinstance(data.get('host', None), str): + return None, 'host is required' + if not isinstance(data.get('node_id', None), int): + return None, 'node_id is required' + if not isinstance(data.get('port', None), int): + return None, 'port is required' + if not 1 <= data['port'] <= 65535: + return None, 'port is invalid' + n = TcpNode(data.get('node_id'), data.get('host'), data.get('port'), data.get('id', 0), data.get('load_id', 0), + data.get('node_status', "online"), data.get('weight', 1), data.get('max_fail', 3), + data.get('fail_timeout', 600), data.get('ps', ''), data.get('created_at', 0)) + return n, "" + + def to_dict(self) -> dict: + return { + "node_id": self.node_id, + "host": self.host, + "port": self.port, + "id": self.id, + "load_id": self.load_id, + "node_status": self.node_status, + "weight": self.weight, + "max_fail": self.max_fail, + "fail_timeout": self.fail_timeout, + "ps": self.ps, + "created_at": self.created_at + } + + +class NodeDB: + _DB_FILE = public.get_panel_path() + "/data/db/node_load_balance.db" + _DB_INIT_FILE = os.path.dirname(__file__) + "/load_balancer.sql" + + def __init__(self): + sql = db.Sql() + sql._Sql__DB_FILE = self._DB_FILE + self.db = sql + + def init_db(self): + sql_data = public.readFile(self._DB_INIT_FILE) + if not os.path.exists(self._DB_FILE) or os.path.getsize(self._DB_FILE) == 0: + public.writeFile(self._DB_FILE, "") + import sqlite3 + conn = sqlite3.connect(self._DB_FILE) + c = conn.cursor() + c.executescript(sql_data) + conn.commit() + conn.close() + + def close(self): + self.db.close() + + def __enter__(self): + return self + + def __exit__(self, exc_type, exc_value, exc_trackback): + self.close() + + def __del__(self): + self.close() + + def update_load_key(self, load_id: int, load_data: dict) -> str: + if not isinstance(load_id, int): + return "load_id is required" + if not isinstance(load_data, dict): + return "load_data is required" + err = self.db.table("load_sites").where("load_id = ?", load_id).update(load_data) + if isinstance(err, str): + return err + return "" + + def name_exist(self, name: str) -> bool: + return self.db.table("load_sites").where("name = ?", name).count() > 0 + + def load_site_name_exist(self, name: str) -> bool: + return self.db.table("load_sites").where("site_name = ?", name).count() > 0 + + def load_id_exist(self, load_id: int) -> bool: + return self.db.table("load_sites").where("load_id = ?", load_id).count() > 0 + + def loads_count(self, site_type: str, query: str = "") -> int: + if site_type == "http": + if not query: + return self.db.table("load_sites").where("site_type = ?", "http").count() + return self.db.table("load_sites").where( + "site_type = ? AND ps like ?", ("http", "%" + query + "%")).count() + else: + if not query: + return self.db.table("load_sites").where("site_type = ?", "tcp").count() + return self.db.table("load_sites").where( + "site_type = ? AND ps like ?", ("tcp", "%" + query + "%")).count() + + def loads_list(self, site_type: str, offset: int, limit: int, query: str = ""): + if site_type == "all": + if query: + return self.db.table("load_sites").where("ps like ?", "%" + query + "%").limit(limit, offset).select() + return self.db.table("load_sites").limit(limit, offset).select() + if site_type == "http": + if not query: + return self.db.table("load_sites").where("site_type = ?", "http").limit(limit, offset).select() + return self.db.table("load_sites").where( + "site_type = ? AND ps like ?", ("http", "%" + query + "%")).limit(limit, offset).select() + else: + if not query: + return self.db.table("load_sites").where("site_type = ?", "tcp").limit(limit, offset).select() + return self.db.table("load_sites").where( + "site_type = ? AND ps like ?", ("tcp", "%" + query + "%")).limit(limit, offset).select() + + def create_load(self, site_type: str, load: LoadSite, nodes: List[Union[HttpNode, TcpNode]]) -> str: + load_data = load.to_dict() + load_data.pop('load_id') + load_data.pop('created_at') + load_data["http_config"] = json.dumps(load.http_config) + load_data["tcp_config"] = json.dumps(load.tcp_config) + try: + err = self.db.table("load_sites").insert(load_data) + if isinstance(err, str): + return err + load.load_id = err + + for node in nodes: + node_data = node.to_dict() + node_data.pop('id') + node_data.pop('created_at') + node_data['load_id'] = load.load_id + if site_type == "http" and isinstance(node, HttpNode): + err = self.db.table("http_nodes").insert(node_data) + else: + err = self.db.table("tcp_nodes").insert(node_data) + if isinstance(err, str): + return err + except Exception as e: + return "数据库操作错误:" + str(e) + + return "" + + def update_load(self, site_type: str, load: LoadSite, nodes: List[Union[HttpNode, TcpNode]]) -> str: + load_data = load.to_dict() + if not load.load_id: + return "load_id is required" + load_data.pop('created_at') + load_data.pop('load_id') + load_data["http_config"] = json.dumps(load.http_config) + load_data["tcp_config"] = json.dumps(load.tcp_config) + + try: + err = self.db.table("load_sites").where("load_id = ?", load.load_id).update(load_data) + if isinstance(err, str): + return err + except Exception as e: + return "数据库操作错误:" + str(e) + + old_nodes, err = self.get_nodes(load.load_id, site_type) + if err: + return err + old_nodes_map = {} + for old_node in old_nodes: + old_nodes_map[old_node['id']] = old_node + + try: + for node in nodes: + node_data = node.to_dict() + node_data.pop('id') + node_data.pop('created_at') + node_data['load_id'] = load.load_id + if node.id in old_nodes_map: + if site_type == "http" and isinstance(node, HttpNode): + err = self.db.table("http_nodes").where("id = ?", node.id).update(node_data) + else: + err = self.db.table("tcp_nodes").where("id = ?", node.id).update(node_data) + if isinstance(err, str): + return err + old_nodes_map.pop(node.id) + else: + if site_type == "http" and isinstance(node, HttpNode): + err = self.db.table("http_nodes").insert(node_data) + else: + err = self.db.table("tcp_nodes").insert(node_data) + if isinstance(err, str): + return err + for node_id in old_nodes_map: + if site_type == "http": + err = self.db.table("http_nodes").where("id = ?", node_id).delete() + else: + err = self.db.table("tcp_nodes").where("id = ?", node_id).delete() + if isinstance(err, str): + return err + except Exception as e: + return "数据库操作错误:" + str(e) + return "" + + def get_nodes(self, load_id: int, site_type: str) -> Tuple[List[dict], str]: + if site_type == "http": + nodes: List[dict] = self.db.table("http_nodes").where("load_id = ?", load_id).select() + else: + nodes: List[dict] = self.db.table("tcp_nodes").where("load_id = ?", load_id).select() + if isinstance(nodes, str): + return [], nodes + if not nodes and self.db.ERR_INFO: + return [], self.db.ERR_INFO + return nodes, "" + + def get_load(self, load_id: int) -> Tuple[Optional[dict], str]: + load_data = self.db.table("load_sites").where("load_id = ?", load_id).find() + if isinstance(load_data, str): + return None, load_data + if self.db.ERR_INFO: + return None, self.db.ERR_INFO + if len(load_data) == 0: + return None, "未查询到该负载配置" + return load_data, "" + + def delete(self, load_id: int) -> str: + load_data = self.db.table("load_sites").where("load_id = ?", load_id).find() + if isinstance(load_data, str): + return load_data + if self.db.ERR_INFO: + return self.db.ERR_INFO + if len(load_data) == 0: + return "" + + if load_data["site_type"] == "http": + err = self.db.table("http_nodes").where("load_id = ?", load_id).delete() + else: + err = self.db.table("tcp_nodes").where("load_id = ?", load_id).delete() + if isinstance(err, str): + return err + err = self.db.table("load_sites").where("load_id = ?", load_id).delete() + if isinstance(err, str): + return err + return "" diff --git a/mod/project/node/dbutil/node.sql b/mod/project/node/dbutil/node.sql new file mode 100644 index 00000000..3616e23f --- /dev/null +++ b/mod/project/node/dbutil/node.sql @@ -0,0 +1,28 @@ +CREATE TABLE IF NOT EXISTS `node` +( + `id` INTEGER PRIMARY KEY AUTOINCREMENT, + `address` VARCHAR, -- 节点地址 https://xxx:xx/ + `category_id` INTEGER, -- 分类 + `remarks` VARCHAR, -- 节点名称 + `api_key` VARCHAR, -- api key + `create_time` INTEGER DEFAULT (0), -- 创建时间 + `server_ip` TEXT, -- 服务器ip + `status` INTEGER, -- 0: 不在线 1: 在线 + `error` TEXT DEFAULT '{}', + `error_num` INTEGER DEFAULT 0, + `app_key` TEXT, -- app key + `ssh_conf` TEXT NOT NULL DEFAULT '{}', + `ssh_test` INTEGER DEFAULT 0, -- 是否执行了ssh秘钥测试, 0: 未测试 1: 已测试 + `lpver` TEXT DEFAULT '' -- 1panel 版本,当目标面板时1panel时,记录版本是v1还是v2 +); + +CREATE TABLE IF NOT EXISTS `category` +( + `id` INTEGER PRIMARY KEY AUTOINCREMENT, + `name` VARCHAR, + `create_time` INTEGER DEFAULT (0) +); + +INSERT INTO `node` (app_key, api_key, remarks, server_ip) +SELECT 'local', 'local', 'Local node', '127.0.0.1' +WHERE NOT EXISTS (SELECT 1 FROM `node` WHERE app_key = 'local' AND api_key = 'local'); diff --git a/mod/project/node/dbutil/node_db.py b/mod/project/node/dbutil/node_db.py new file mode 100644 index 00000000..0099e21e --- /dev/null +++ b/mod/project/node/dbutil/node_db.py @@ -0,0 +1,462 @@ +import base64 +import json +import os.path +import re +import time +import sys +from urllib.parse import urlparse +from dataclasses import dataclass, field +from typing import Tuple, Optional, List, Union, Dict + +if "/www/server/panel/class" not in sys.path: + sys.path.insert(0, "/www/server/panel/class") + +import public +import db + +if "/www/server/panel" not in sys.path: + sys.path.insert(0, "/www/server/panel") + + +@dataclass +class NodeAPPKey: + origin: str + request_token: str + app_key: str + app_token: str + + def to_string(self)->str: + data = "|".join((self.origin, self.request_token, self.app_key, self.app_token)) + return base64.b64encode(data.encode()).decode("utf-8") + + +@dataclass +class Node: + remarks: str + id: int = 0 + address: str = "" + category_id: int = 0 + api_key: str = "" + create_time: int = 0 + server_ip: str = "" + status: int = 1 + error: dict = field(default_factory=dict) + error_num: int = 0 + app_key: str = "" + ssh_conf: dict = field(default_factory=dict) + lpver: str = "" + + @classmethod + def from_dict(cls, data: dict) -> Tuple[Optional["Node"], str]: + if not isinstance(data.get('remarks', None), str): + return None, 'remarks is required' + if not data["remarks"].strip(): + return None, 'remarks is required' + data["remarks"] = data["remarks"].strip() + + api_key = data.get('api_key', '') + app_key = data.get('app_key', '') + ssh_conf: dict = data.get('ssh_conf', {}) + if not api_key and not app_key and not ssh_conf: + return None, 'api_key or app_key or ssh_conf is required' + + if app_key: + app = cls.parse_app_key(app_key) + if not app: + return None, 'App_key format error' + data["address"] = app.origin + url = urlparse(data["address"], allow_fragments=False) + if not url.scheme or not url.netloc: + return None, 'address is invalid' + + if api_key: + if not isinstance(data.get('address', None), str): + return None, 'address is required' + url = urlparse(data["address"], allow_fragments=False) + if not url.scheme or not url.netloc: + return None, 'address is invalid' + + if ssh_conf: + for key in ("host", "port"): + if key not in ssh_conf: + return None, 'ssh_conf is invalid' + if "username" not in ssh_conf: + ssh_conf["username"] = "root" + if "password" not in ssh_conf: + ssh_conf["password"] = "" + if "pkey" not in ssh_conf: + ssh_conf["pkey"] = "" + if "pkey_passwd" not in ssh_conf: + ssh_conf["pkey_passwd"] = "" + + if ssh_conf and not data.get("address", None): + data["address"] = ssh_conf["host"] + + n = Node( + data["remarks"], id=data.get('id', 0), address=data.get("address"), category_id=int(data.get('category_id', 0)), + api_key=api_key, create_time=data.get('create_time', 0), server_ip=data.get('server_ip', ''), + status=data.get('status', 1), error=data.get('error', {}), error_num=data.get('error_num', 0), + app_key=app_key, ssh_conf=ssh_conf, lpver=data.get('lpver', '') + ) + return n, '' + + def to_dict(self) -> dict: + return { + "remarks": self.remarks, + "id": self.id, + "address": self.address, + "category_id": self.category_id, + "api_key": self.api_key, + "create_time": self.create_time, + "server_ip": self.server_ip, + "status": self.status, + "error": self.error, + "error_num": self.error_num, + "app_key": self.app_key, + "ssh_conf": self.ssh_conf, + "lpver": self.lpver + } + + def parse_server_ip(self): + import socket + from urllib.parse import urlparse + if not self.address.startswith("http"): + host = self.address # 仅 ssh时 address本身就是host + else: + host = urlparse(self.address).hostname + if isinstance(host, str) and public.check_ip(host): + return host + try: + ip_address = socket.gethostbyname(host) + return ip_address + except socket.gaierror as e: + public.print_log(f"Error: {e}") + return "" + + @staticmethod + def parse_app_key(app_key: str) -> Optional[NodeAPPKey]: + try: + data = base64.b64decode(app_key).decode("utf-8") + origin, request_token, app_key, app_token = data.split("|") + origin_arr = origin.split(":") + if len(origin_arr) > 3: + origin = ":".join(origin_arr[:3]) + return NodeAPPKey(origin, request_token, app_key, app_token) + except: + return None + + +class ServerNodeDB: + _DB_FILE = public.get_panel_path() + "/data/db/node.db" + _DB_INIT_FILE = os.path.dirname(__file__) + "/node.sql" + + def __init__(self): + sql = db.Sql() + sql._Sql__DB_FILE = self._DB_FILE + self.db = sql + + def init_db(self): + sql_data = public.readFile(self._DB_INIT_FILE) + import sqlite3 + conn = sqlite3.connect(self._DB_FILE) + cur = conn.cursor() + cur.executescript(sql_data) + cur.execute("PRAGMA table_info(node)") + existing_cols = [row[1] for row in cur.fetchall()] + if "ssh_test" in existing_cols: + pass + # print("字段 ssh_test 已存在") + else: + cur.execute("ALTER TABLE node ADD COLUMN ssh_test INTEGER DEFAULT (0)") + conn.commit() + conn.close() + + def close(self): + self.db.close() + + def __enter__(self): + return self + + def __exit__(self, exc_type, exc_value, exc_trackback): + self.close() + + def __del__(self): + self.close() + + def is_local_node(self, node_id: int): + return self.db.table('node').where("id=? AND app_key = 'local' AND api_key = 'local'", (node_id,)).count() > 0 + + def get_local_node(self): + data = self.db.table('node').where("app_key = 'local' AND api_key = 'local'", ()).find() + if isinstance(data, dict): + return data + return { + "id": 0, + "address": "", + "category_id": 0, + "remarks": "Local node", + "api_key": "local", + "create_time": time.strftime('%Y-%m-%d %H:%M:%S'), + "server_ip": "127.0.0.1", + "status": 0, + "error": 0, + "error_num": 0, + "app_key": "local", + "ssh_conf": "{}", + "lpver": "", + } + + def create_node(self, node: Node) -> str: + node_data = node.to_dict() + node_data.pop("id") + node_data["create_time"] = time.strftime('%Y-%m-%d %H:%M:%S') + node_data.pop("error") + node_data["status"] = 1 + node_data["ssh_conf"] = json.dumps(node_data["ssh_conf"]) + + if node.category_id > 0 and not self.category_exites(node.category_id): + return "Classification does not exist" + + if self.db.table('node').where('remarks=?', (node.remarks,)).count() > 0: + return "The node with this name already exists" + try: + node_id = self.db.table('node').insert(node_data) + if isinstance(node_id, int): + node.id = node_id + return "" + elif isinstance(node_id, str): + return node_id + else: + return str(node_id) + except Exception as e: + return str(e) + + def update_node(self, node: Node, with_out_fields: List[str] = Node) -> str: + if self.is_local_node(node.id): + return "Cannot modify local nodes" + if not self.node_id_exites(node.id): + return "Node does not exist" + node_data = node.to_dict() + node_data.pop("create_time") + node_data.pop("id") + node_data["ssh_conf"] = json.dumps(node_data["ssh_conf"]) + node_data["error"] = json.dumps(node_data["error"]) + if with_out_fields and isinstance(with_out_fields, list): + for f in with_out_fields: + if f in node_data: + node_data.pop(f) + + if node.category_id > 0 and not self.category_exites(node.category_id): + node.category_id = 0 + node_data["category_id"] = 0 + try: + res = self.db.table('node').where('id=?', (node.id,)).update(node_data) + if isinstance(res, str): + return res + except Exception as e: + return str(e) + + return "" + + def set_node_ssh_conf(self, node_id: int, ssh_conf: dict, ssh_test: int=0): + pdata = {"ssh_conf": json.dumps(ssh_conf)} + if ssh_test: + pdata["ssh_test"] = 1 + self.db.table('node').where('id=?', (node_id,)).update(pdata) + return + + def remove_node_ssh_conf(self, node_id: int): + self.db.table('node').where('id=?', (node_id,)).update({"ssh_conf": "{}"}) + return + + def delete_node(self, node_id: int) -> str: + if self.is_local_node(node_id): + return "Cannot delete local node" + if not self.node_id_exites(node_id): + return "Node does not exist" + try: + res = self.db.table('node').where('id=?', (node_id,)).delete() + if isinstance(res, str): + return res + except Exception as e: + return str(e) + return "" + + def find_node(self, api_key:str = "", app_key: str = "") -> Optional[dict]: + res = self.db.table('node').where('api_key=?', (api_key, app_key)).find() + if isinstance(res, dict): + return res + else: + return None + + def get_node_list(self, + search: str = "", + category_id: int = -1, + offset: int = 0, + limit: int = 10) -> Tuple[List[Dict], str]: + try: + args = [] + query_str = "" + if search: + query_str += "remarks like ?" + args.append('%{}%'.format(search)) + if category_id >= 0: + if query_str: + query_str += " and category_id=?" + else: + query_str += "category_id=?" + args.append(category_id) + if query_str: + data_list = self.db.table('node').where(query_str, args).order('id desc').limit(limit, offset).select() + else: + data_list = self.db.table('node').order('id desc').limit(limit, offset).select() + if self.db.ERR_INFO: + return [], self.db.ERR_INFO + if not isinstance(data_list, list): + return [], str(data_list) + return data_list, "" + except Exception as e: + return [], str(e) + + def query_node_list(self, *args) -> List[Dict]: + return self.db.table('node').where(*args).select() + + def category_exites(self, category_id: int) -> bool: + return self.db.table('category').where('id=?', (category_id,)).count() > 0 + + def node_id_exites(self, node_id: int) -> bool: + return self.db.table('node').where('id=?', (node_id,)).count() > 0 + + def category_map(self) -> Dict: + default_data = {0: "Default classification"} + data_list = self.db.table('category').field('id,name').select() + if isinstance(data_list, list): + for data in data_list: + default_data[data["id"]] = data["name"] + return default_data + + def node_map(self) -> Dict: + default_data = {} + data_list = self.db.table('node').field('id,remarks').select() + if isinstance(data_list, list): + for data in data_list: + default_data[data["id"]] = data["remarks"] + return default_data + + def create_category(self, name: str) -> str: + if self.db.table('category').where('name=?', (name,)).count() > 0: + return "The classification for this name already exists" + try: + res = self.db.table('category').insert({"name": name, "create_time": time.strftime('%Y-%m-%d %H:%M:%S')}) + if isinstance(res, str): + return res + except Exception as e: + return str(e) + return "" + + def delete_category(self, category_id: int): + self.db.table('node').where('category_id=?', (category_id,)).update({"category_id": 0}) + self.db.table('category').where('id=?', (category_id,)).delete() + + def bind_category_to_node(self, node_id: List[int], category_id: int) -> str: + if not node_id: + return "Node ID cannot be empty" + if category_id > 0 and not self.category_exites(category_id): + return "Classification does not exist" + + try: + err = self.db.table('node').where( + 'id in ({})'.format(",".join(["?"]*len(node_id))), (*node_id,) + ).update({"category_id": category_id}) + if isinstance(err, str): + return err + + except Exception as e: + return str(e) + return "" + + def node_count(self, search, category_id) -> int: + try: + args = [] + query_str = "" + if search: + query_str += "remarks like ?" + args.append('%{}%'.format(search)) + if category_id >= 0: + if query_str: + query_str += " and category_id=?" + else: + query_str += "category_id=?" + args.append(category_id) + if query_str: + count = self.db.table('node').where(query_str, args).order('id desc').count() + else: + count = self.db.table('node').order('id desc').count() + return count + except: + return 0 + + def get_node_by_id(self, node_id: int) -> Optional[Dict]: + try: + data = self.db.table('node').where('id=?', (node_id,)).find() + if self.db.ERR_INFO: + return None + if not isinstance(data, dict): + return None + return data + except: + return None + +class ServerMonitorRepo: + _REPO_DIR = public.get_panel_path() + "/data/mod_node_status_cache/" + + def __init__(self): + if not os.path.exists(self._REPO_DIR): + os.makedirs(self._REPO_DIR) + + def set_wait_reboot(self, server_ip: str, start: bool): + wait_file = os.path.join(self._REPO_DIR, "wait_reboot_{}".format(server_ip)) + if start: + return public.writeFile(wait_file, "wait_reboot") + else: + if os.path.exists(wait_file): + os.remove(wait_file) + + def is_reboot_wait(self, server_ip: str): + wait_file = os.path.join(self._REPO_DIR, "wait_reboot_{}".format(server_ip)) + # 重器待等待时间超过10分钟认为超时 + return os.path.exists(wait_file) and os.path.getmtime(wait_file) > time.time() - 610 + + @staticmethod + def get_local_server_status(): + from system import system + return system().GetNetWork(None) + + def get_server_status(self, server_id: int) -> Optional[Dict]: + cache_file = os.path.join(self._REPO_DIR, "server_{}.json".format(server_id)) + if not os.path.exists(cache_file): + return None + + mtime = os.path.getmtime(cache_file) + if time.time() - mtime > 60 * 5: + os.remove(cache_file) + return None + try: + data = public.readFile(cache_file) + if isinstance(data, str): + return json.loads(data) + except: + return None + + def save_server_status(self, server_id: int, data: Dict) -> str: + cache_file = os.path.join(self._REPO_DIR, "server_{}.json".format(server_id)) + try: + public.writeFile(cache_file, json.dumps(data)) + return "" + except Exception as e: + return str(e) + + def remove_cache(self, server_id: int): + cache_file = os.path.join(self._REPO_DIR, "server_{}.json".format(server_id)) + if os.path.exists(cache_file): + os.remove(cache_file) \ No newline at end of file diff --git a/mod/project/node/dbutil/node_task_flow.py b/mod/project/node/dbutil/node_task_flow.py new file mode 100644 index 00000000..6158f573 --- /dev/null +++ b/mod/project/node/dbutil/node_task_flow.py @@ -0,0 +1,1149 @@ +import copy +import os +import sys +import time +import json +import uuid +from dataclasses import dataclass, field +from datetime import datetime, date +from typing import Optional, List, Dict, Tuple, Any, Union, Type, Generic, TypeVar, TextIO, Iterable +import sqlite3 + +if "/www/server/panel/class" not in sys.path: + sys.path.insert(0, "/www/server/panel/class") + +import public +import db + +if "/www/server/panel" not in sys.path: + sys.path.insert(0, "/www/server/panel") + + +def random_name() -> str: + return uuid.uuid4().hex[::4] + + +@dataclass +class Script: + """对应scripts表""" + name: str + script_type: str + content: str + id: Optional[int] = None + description: Optional[str] = None + created_at: Optional[datetime] = None + updated_at: Optional[datetime] = None + + @staticmethod + def check(data: Dict[str, Any]) -> str: + if "script_type" not in data or not data["script_type"]: + return "Script type cannot be empty" + if not data["script_type"] in ["python", "shell"]: + return "Script type error, please choose Python or Shell" + if "content" not in data or not data["content"]: + return "Script content cannot be empty" + if "name" not in data or not data["name"]: + return "Script name cannot be empty" + return "" + + @classmethod + def from_dict(cls, data: Dict[str, Any]) -> 'Script': + """从字典创建Script实例""" + return cls( + id=int(data['id']) if data.get('id', None) else None, + name=str(data['name']), + script_type=str(data['script_type']), + content=str(data['content']), + description=str(data['description']) if data.get('description', None) else None, + created_at=datetime.fromtimestamp(data['created_at']) if data.get('created_at', None) else None, + updated_at=datetime.fromtimestamp(data['updated_at']) if data.get('updated_at', None) else None + ) + + def to_dict(self) -> Dict[str, Any]: + """转换为字典格式""" + return { + 'id': self.id, + 'name': self.name, + 'script_type': self.script_type, + 'content': self.content, + 'description': self.description, + 'created_at': self.created_at.timestamp() if self.created_at else None, + 'updated_at': self.updated_at.timestamp() if self.updated_at else None + } + + +@dataclass +class Flow: + server_ids: str # 存储服务器ID列表,原始TEXT类型 + step_count: int + strategy: Dict[str, Any] # JSON字段,存储策略 + status: str # 状态 waiting, running, complete, error + id: Optional[int] = None + created_at: Optional[datetime] = None + updated_at: Optional[datetime] = None + _steps: Optional[List[Union["CommandTask", "TransferTask"]]] = None + + @staticmethod + def check(data: Dict[str, Any]) -> str: + if "strategy" not in data: + data["strategy"] = {} + else: + strategy = data["strategy"] + if isinstance(strategy, str): + try: + strategy = json.loads(strategy) + except json.JSONDecodeError: + return "Strategy field format error" + if not isinstance(strategy, dict): + return "Strategy field format error" + return "" + + @classmethod + def from_dict(cls, data: Dict[str, Any]) -> 'Flow': + return cls( + id=int(data['id']) if data.get('id') is not None else None, + server_ids=str(data['server_ids']), + step_count=int(data['step_count']), + strategy=data['strategy'] if data.get('strategy') else {}, + status=str(data['status']), + created_at=datetime.fromtimestamp(data['created_at']) if data.get('created_at') else None, + updated_at=datetime.fromtimestamp(data['updated_at']) if data.get('updated_at') else None + ) + + def to_dict(self) -> Dict[str, Any]: + now = int(time.time()) + return { + 'id': self.id, + 'server_ids': self.server_ids, + 'step_count': self.step_count, + 'strategy': self.strategy, + 'status': self.status, + 'created_at': int(self.created_at.timestamp()) if self.created_at else now, + 'updated_at': int(self.updated_at.timestamp()) if self.updated_at else now + } + + @property + def steps(self) -> List[Union["CommandTask", "TransferTask"]]: + if self._steps is None: + raise RuntimeError("Please set the steps content first") + return self._steps + + @steps.setter + def steps(self, steps: List[Union["CommandTask", "TransferTask"]]) -> None: + self._steps = steps + + +@dataclass +class CommandTask: + flow_id: int + step_index: int + script_id: int + script_content: str + script_type: str + status: int = 0 # 0: 等待中, 1: 进行中, 2: 成功, 3: 失败 + name: str = "" + id: Optional[int] = None + created_at: Optional[datetime] = None + updated_at: Optional[datetime] = None + _elogs: Optional[List["CommandLog"]] = None + + @classmethod + def from_dict(cls, data: Dict[str, Any]) -> 'CommandTask': + return cls( + id=int(data['id']) if data.get('id') is not None else None, + name=str(data.get('name', '')), + flow_id=int(data['flow_id']), + step_index=int(data['step_index']), + script_id=int(data['script_id']), + script_content=str(data['script_content']), + script_type=str(data['script_type']), + status=int(data.get('status', 0)), + created_at=datetime.fromtimestamp(data['created_at']) if data.get('created_at') else None, + updated_at=datetime.fromtimestamp(data['updated_at']) if data.get('updated_at') else None + ) + + def to_dict(self) -> Dict[str, Any]: + now = int(time.time()) + return { + 'id': self.id, + 'flow_id': self.flow_id, + 'name': self.name, + 'step_index': self.step_index, + 'script_id': self.script_id, + 'script_content': self.script_content, + 'script_type': self.script_type, + 'status': self.status, + 'created_at': int(self.created_at.timestamp()) if self.created_at else now, + 'updated_at': int(self.updated_at.timestamp()) if self.updated_at else now + } + + def to_show_data(self) -> Dict[str, Any]: + tmp = self.to_dict() + tmp["task_type"] = "command" + return tmp + + @property + def elogs(self) -> List["CommandLog"]: + if self._elogs is None: + return [] + return self._elogs + + @elogs.setter + def elogs(self, elogs: List["CommandLog"]): + self._elogs = elogs + + +_EXECUTOR_LOG_DIR = public.get_panel_path() + "/logs/executor_log/" +try: + if not os.path.exists(_EXECUTOR_LOG_DIR): + os.makedirs(_EXECUTOR_LOG_DIR) +except: + pass + + +@dataclass +class CommandLog: + command_task_id: int + server_id: int + ssh_host: str + id: Optional[int] = None + status: int = 0 # 0: 等待, 1: 运作中, 2: 成功, 3: 失败, 4: 异常 + log_name: Optional[str] = None + _log_fp: Optional[TextIO] = None + _log_idx: int = -1 + + @classmethod + def from_dict(cls, data: Dict[str, Any]) -> 'CommandLog': + return cls( + id=int(data['id']) if data.get('id') is not None else None, + command_task_id=int(data['command_task_id']), + server_id=int(data['server_id']), + ssh_host=str(data['ssh_host']), + status=int(data['status']) if data.get('status') is not None else 0, + log_name=str(data['log_name']) if data.get('log_name') is not None else None, + ) + + def to_dict(self) -> Dict[str, Any]: + now = int(time.time()) + return { + 'id': self.id, + 'command_task_id': self.command_task_id, + 'server_id': self.server_id, + 'ssh_host': self.ssh_host, + 'status': self.status, + 'log_name': self.log_name + } + + def to_show_data(self, only_error=True): + tmp = self.to_dict() + if self.status in (3, 4): + tmp["message"] = self.get_log() + else: + tmp["message"] = "" if only_error else self.get_log() + + if self._log_idx > -1: + tmp["log_idx"] = self.log_idx + + return tmp + + @property + def log_file(self): + return os.path.join(_EXECUTOR_LOG_DIR, self.log_name) + + @property + def log_fp(self): + if self._log_fp is None: + self._log_fp = open(self.log_file, "w+") + return self._log_fp + + @property + def log_idx(self): + return self._log_idx + + @log_idx.setter + def log_idx(self, log_idx: int): + self._log_idx = log_idx + + def create_log(self): + public.writeFile(self.log_file, "") + + def remove_log(self): + if os.path.exists(self.log_file): + os.remove(self.log_file) + + def get_log(self): + return public.readFile(self.log_file) + + def write_log(self, log_data: str, is_end_log=False): + self.log_fp.write(log_data) + self.log_fp.flush() + if is_end_log: + self.log_fp.close() + self._log_fp = None + + +@dataclass +class TransferTask: + flow_id: int + step_index: int + src_node: Dict[str, Any] + src_node_task_id: int + dst_nodes: Dict[int, Dict[str, Any]] + name: str = "" + message: str = "" + path_list: List[Dict[str, Any]] = field(default_factory=lambda: []) + status: int = 0 # 0: 等待中, 1: 进行中, 2: 成功, 3: 失败 + id: Optional[int] = None + created_at: Optional[datetime] = None + updated_at: Optional[datetime] = None + + @classmethod + def from_dict(cls, data: Dict[str, Any]) -> 'TransferTask': + if "dst_nodes" in data: + tmp = data["dst_nodes"] + if isinstance(tmp, list): # 兼容旧版数据,只是防止报错,但无法正常展示,会持续清理过期数据 + tmp = {idx: i for idx, i in enumerate(tmp)} + + data["dst_nodes"] = {int(i): tmp[i] for i in tmp} + return cls( + id=int(data['id']) if data.get('id') is not None else None, + flow_id=int(data['flow_id']), + name=str(data.get('name', '')), + message=str(data.get('message', '')), + step_index=int(data['step_index']), + src_node=data['src_node'] if data.get('src_node') else {}, + src_node_task_id=int(data['src_node_task_id']), + dst_nodes=data['dst_nodes'] if data.get('dst_nodes') else {}, + path_list=data['path_list'] if data.get('path_list') else [], + status=int(data['status']) if data.get('status') is not None else 0, + created_at=datetime.fromtimestamp(data['created_at']) if data.get('created_at') else None, + updated_at=datetime.fromtimestamp(data['updated_at']) if data.get('updated_at') else None + ) + + def to_dict(self) -> Dict[str, Any]: + now = int(time.time()) + return { + 'id': self.id, + 'flow_id': self.flow_id, + 'step_index': self.step_index, + 'name': self.name, + 'src_node': copy.deepcopy(self.src_node), + 'src_node_task_id': self.src_node_task_id, + 'dst_nodes': copy.deepcopy(self.dst_nodes), + 'path_list': self.path_list, + 'status': self.status, + 'message': self.message, + 'created_at': int(self.created_at.timestamp()) if self.created_at else now, + 'updated_at': int(self.updated_at.timestamp()) if self.updated_at else now + } + + def to_show_data(self): + tmp = self.to_dict() + for key in ("api_key", "app_key", "ssh_conf"): + if key in tmp["src_node"]: + tmp["src_node"].pop(key) + for node in tmp["dst_nodes"].values(): + if key in node: + node.pop(key) + tmp["task_type"] = "file" + return tmp + + +@dataclass +class TransferFile: + flow_id: int + transfer_task_id: int + src_file: str + dst_file: str + file_size: int + is_dir: int = 0 # 0: 文件, 1: 目录 + id: Optional[int] = None + + @classmethod + def from_dict(cls, data: Dict[str, Any]) -> 'TransferFile': + return cls( + id=int(data['id']) if data.get('id') is not None else None, + flow_id=int(data['flow_id']), + transfer_task_id=int(data['transfer_task_id']), + src_file=str(data['src_file']), + dst_file=str(data['dst_file']), + file_size=int(data['file_size']), + is_dir=int(data['is_dir']) if data.get('is_dir') is not None else 0 + ) + + def to_dict(self) -> Dict[str, Any]: + return { + 'id': self.id, + 'flow_id': self.flow_id, + 'transfer_task_id': self.transfer_task_id, + 'src_file': self.src_file, + 'dst_file': self.dst_file, + 'file_size': self.file_size, + 'is_dir': self.is_dir + } + + +@dataclass +class TransferLog: + flow_id: int + transfer_task_id: int + transfer_file_id: int + dst_node_idx: int + status: int = 0 # 0: 等待中, 1: 进行中, 2: 成功, 3: 失败, 4: 跳过 + progress: int = 0 + message: str = "" + id: Optional[int] = None + created_at: Optional[datetime] = None + started_at: Optional[datetime] = None + completed_at: Optional[datetime] = None + _tf: Optional[TransferFile] = None + _log_idx: int = -1 + + @classmethod + def from_dict(cls, data: Dict[str, Any]) -> 'TransferLog': + return cls( + id=int(data['id']) if data.get('id') is not None else None, + flow_id=int(data['flow_id']), + transfer_task_id=int(data['transfer_task_id']), + transfer_file_id=int(data['transfer_file_id']), + dst_node_idx=int(data['dst_node_idx']), + status=int(data['status']) if data.get('status') is not None else 0, + progress=int(data['progress']) if data.get('progress') is not None else 0, + message=str(data['message']) if data.get('message') is not None else "", + created_at=datetime.fromtimestamp(data['created_at']) if data.get('created_at') else None, + started_at=datetime.fromtimestamp(data['started_at']) if data.get('started_at') else None, + completed_at=datetime.fromtimestamp(data['completed_at']) if data.get('completed_at') else None + ) + + def to_dict(self) -> Dict[str, Any]: + now = int(time.time()) + return { + 'id': self.id, + 'flow_id': self.flow_id, + 'transfer_task_id': self.transfer_task_id, + 'transfer_file_id': self.transfer_file_id, + 'dst_node_idx': self.dst_node_idx, + 'status': self.status, + 'progress': self.progress, + 'message': self.message, + 'created_at': int(self.created_at.timestamp()) if self.created_at else now, + 'started_at': int(self.started_at.timestamp()) if self.started_at else None, + 'completed_at': int(self.completed_at.timestamp()) if self.completed_at else None + } + + @property + def tf(self) -> TransferFile: + if not self._tf: + raise RuntimeError("tf is not set") + return self._tf + + @tf.setter + def tf(self, v: TransferFile): + self._tf = v + + def to_show_data(self) -> Dict[str, Any]: + ret = self.to_dict() + if self._tf: + ret.update(self._tf.to_dict()) + ret["id"] = self.id + if self._log_idx > -1: + ret["log_idx"] = self.log_idx + return ret + + @property + def log_idx(self): + return self._log_idx + + @log_idx.setter + def log_idx(self, log_idx: int): + self._log_idx = log_idx + + +@dataclass +class FlowTemplates: + name: str + key_words: str = "" + description: str = "" + content: str = "" + id: Optional[int] = None + created_at: Optional[datetime] = None + updated_at: Optional[datetime] = None + + @classmethod + def from_dict(cls, data: Dict[str, Any]) -> 'FlowTemplates': + return cls( + id=int(data['id']) if data.get('id', None) is not None else None, + name=str(data['name']) if data.get('name', None) is not None else "Unknow", + key_words=str(data['key_words']) if data.get('key_words', None) is not None else "", + description=str(data['description']) if data.get('description', None) is not None else "", + content=str(data['content']) if data.get('content', None) is not None else "", + created_at=datetime.fromtimestamp(data['created_at']) if data.get('created_at') else None, + updated_at=datetime.fromtimestamp(data['updated_at']) if data.get('updated_at') else None + ) + + def to_dict(self) -> Dict[str, Any]: + now = int(time.time()) + return { + 'id': self.id, + 'name': self.name, + 'key_words': self.key_words, + 'description': self.description, + 'content': self.content, + 'created_at': int(self.created_at.timestamp()) if self.created_at else now, + 'updated_at': int(self.updated_at.timestamp()) if self.updated_at else now + } + + @staticmethod + def check(data: Dict[str, Any]) -> str: + if "name" not in data: + return "name is required" + if "content" not in data: + return "content is required" + try: + content_dat =json.loads(data["content"]) + except json.JSONDecodeError: + return "content is not json" + if "flow_data" not in content_dat: + return "flow_data is required" + if not isinstance(content_dat["flow_data"], list): + return "flow_data must be list" + names = [] + for i in content_dat["flow_data"]: + if "name" not in i or not isinstance(i["name"], str) or not i["name"]: + return "flow_data item must have name" + names.append(i["name"]) + if "task_type" not in i or i["task_type"] not in ["command", "file"]: + return "flow_data item must have task_type" + data["key_words"] = ",".join(names) + return "" + + +_TableType = TypeVar( + "_TableType", + bound=Union[Script, Flow, CommandTask, CommandLog, TransferTask, TransferFile, TransferLog] +) + + +class _Table(Generic[_TableType]): + """数据库表""" + table_name: str = "" + data_cls: Type[_TableType] + json_field_names: Tuple[str, ...] = tuple() + + def __init__(self, db_obj: db.Sql): + self._db = db_obj + + def _deserialize(self, row: dict): + for k, v in row.items(): + if k in self.json_field_names and isinstance(v, str): + row[k] = json.loads(v) + return self.data_cls.from_dict(row) + + # 当仅传递一个数据时,返回插入数的 id或错误信息; 当传递多个数据时,返回插入的行数或错误信息 + def create(self, + data: Union[_TableType, List[_TableType]]) -> Union[int, str]: + """创建数据""" + if not isinstance(data, list): + data = [data] + + if not len(data): + raise ValueError("Data cannot be empty") + if not isinstance(data[0], self.data_cls): + raise ValueError("Data type error") + + now = int(time.time()) + + def fileter_data(item): + item_dict = item.to_dict() + if "id" in item_dict: + item_dict.pop("id") + if "created_at" in item_dict and item_dict["created_at"] is None: + item_dict["created_at"] = now + if "updated_at" in item_dict and item_dict["updated_at"] is None: + item_dict["updated_at"] = now + for fj_n in self.json_field_names: + if fj_n in item_dict and item_dict[fj_n] is not None and not isinstance(item_dict[fj_n], str): + item_dict[fj_n] = json.dumps(item_dict[fj_n]) + return item_dict + + data_list = list(map(fileter_data, data)) + if len(data_list) == 1: + try: + # public.print_log(data_list) + res = self._db.table(self.table_name).insert(data_list[0]) + if isinstance(res, int): + return res + return str(res) + except Exception as e: + return str(e) + try: + res = self._db.table(self.table_name).batch_insert(data_list) + if isinstance(res, (int, bool)): + return len(data) + return str(res) + except Exception as e: + return str(e) + + def update(self, data: _TableType) -> str: + """更新数据""" + if not isinstance(data, self.data_cls): + raise ValueError("Data type error") + data_dict = data.to_dict() + data_dict.pop('created_at', None) + if "updated_at" in data_dict: + data_dict["updated_at"] = datetime.now().timestamp() + if "id" not in data_dict: + raise ValueError("The data ID cannot be empty") + for fj_n in self.json_field_names: + if fj_n in data_dict and data_dict[fj_n] is not None and not isinstance(data_dict[fj_n], str): + data_dict[fj_n] = json.dumps(data_dict[fj_n]) + try: + self._db.table(self.table_name).where("id=?", (data_dict["id"],)).update(data_dict) + except Exception as e: + return str(e) + return "" + + def get_byid(self, data_id: int) -> Optional[_TableType]: + """根据id获取数据""" + try: + result = self._db.table(self.table_name).where("id=?", (data_id,)).find() + except Exception as e: + return None + if not result: + return None + return self._deserialize(result) + + def delete(self, data_id: Union[int, List[int]]): + """删除数据""" + if isinstance(data_id, list): + data_id = [int(item) for item in data_id] + elif isinstance(data_id, int): + data_id = [int(data_id)] + else: + return "Data ID type error" + try: + self._db.table(self.table_name).where( + "id in ({})".format(",".join(["?"] * len(data_id))), (*data_id,) + ).delete() + return "" + except Exception as e: + return str(e) + + def query(self, *args) -> List[_TableType]: + """查询数据""" + try: + if args: + result = self._db.table(self.table_name).where(*args).select() + else: + result = self._db.table(self.table_name).select() + except Exception as e: + return [] + if not result: + return [] + return [self._deserialize(item) for item in result] + + def query_page(self, *args, page_num: int = 1, limit: int = 10) -> List[_TableType]: + """查询数据, 支持分页""" + try: + offset = limit * (page_num - 1) + if not args: + ret = self._db.table(self.table_name).limit(limit, offset).order("id DESC").select() + else: + ret = self._db.table(self.table_name).where(*args).limit(limit, offset).order("id DESC").select() + except Exception as e: + public.print_error() + return [] + if not ret: + return [] + return [self._deserialize(item) for item in ret] + + def count(self, *args) -> int: + """查询数据数量""" + try: + if args: + result = self._db.table(self.table_name).where(*args).count() + else: + result = self._db.table(self.table_name).count() + except Exception as e: + return 0 + return result + + def find(self, *args, order_by: str = None) -> Optional[_TableType]: + """查询单条数据""" + try: + if order_by: + result = self._db.table(self.table_name).where(*args).order(order_by).find() + else: + result = self._db.table(self.table_name).where(*args).find() + except Exception as e: + return None + if not result: + return None + return self._deserialize(result) + + def bath_update(self, data: List[_TableType], update_fields: List[str]) -> Union[str, int]: + """批量更新数据""" + if not data or not update_fields: + return "Parameter error" + parms = [] + real_update_fields = list(update_fields).copy() + real_update_fields.append("id") + for d in data: + rows = [] + for f_name in real_update_fields: + tmp = getattr(d, f_name) + if isinstance(tmp, (list, dict)): + tmp = json.dumps(tmp) + elif isinstance(tmp, (datetime, date)): + tmp = tmp.timestamp() + rows.append(tmp) + parms.append(tuple(rows)) + + sql_str = "UPDATE {} SET {} WHERE id = ?".format( + self.table_name, + ",".join(["{}=?".format(f_name) for f_name in update_fields]) + ) + + res = self._db.executemany(sql_str, parms) + if isinstance(res, int): + return res + return str(res) + + def delete_where(self, where_str: str, parms: Iterable[Any]) -> str: + try: + self._db.table(self.table_name).where(where_str, parms).delete() + return "" + except Exception as e: + return str(e) + + +class _ScriptTable(_Table[Script]): + """脚本表""" + table_name = "scripts" + data_cls = Script + + +class _FlowTable(_Table[Flow]): + """任务流表""" + table_name = "flows" + data_cls = Flow + json_field_names = ("strategy",) + + def last(self, order_by: str = "id DESC") -> Optional[Flow]: + try: + result = self._db.table(self.table_name).order(order_by).find() + if not result: + return None + except Exception as e: + return None + return self._deserialize(result) + + +class _CommandTaskTable(_Table[CommandTask]): + """命令任务表""" + table_name = "command_tasks" + data_cls = CommandTask + + def query_tasks(self, + page=1, size=10, script_type: str = None, search: str = None + ) -> Tuple[int, List[CommandTask]]: + """查询任务""" + where_args, parms = [], [] + if script_type and script_type != "all": + where_args.append("script_type=?") + parms.append(script_type) + if search: + search_str = "script_content like ?" + parms.append("%{}%".format(search)) + + stable = _ScriptTable(self._db) + data = stable.query("name like ? or description like ?", ("%{}%".format(search), "%{}%".format(search))) + if data: + search_str += " or script_id in ({})".format(",".join(["?"] * len(data))) + where_args.append("(" + search_str + ")") + parms.append(tuple([item.id for item in data])) + else: + where_args.append(search_str) + + # public.print_log("查询条件: {}".format(" AND ".join(where_args)), parms) + count = self.count( + " AND ".join(where_args), + (*parms,) + ) + + return count, self.query_page( + " AND ".join(where_args), + (*parms,), + page_num=page, + limit=size + ) + + +class _CommandLogTable(_Table[CommandLog]): + """命令日志表""" + table_name = "command_logs" + data_cls = CommandLog + + +class _FlowTemplateTable(_Table[FlowTemplates]): + """任务模板表""" + table_name = "flow_templates" + data_cls = FlowTemplates + + +class _TransferTaskTable(_Table[TransferTask]): + """文件传输任务表""" + table_name = "transfer_tasks" + data_cls = TransferTask + json_field_names = ("src_node", "dst_nodes", "path_list") + + +class _TransferFileTable(_Table[TransferFile]): + """文件传输文件表""" + table_name = "transfer_files" + data_cls = TransferFile + + +class _TransferLogTable(_Table[TransferLog]): + """文件传输日志表""" + table_name = "transfer_logs" + data_cls = TransferLog + + +class TaskFlowsDB(object): + _DB_FILE = public.get_panel_path() + "/data/db/node_task_flow.db" + _DB_INIT_FILE = os.path.dirname(__file__) + "/node_task_flow.sql" + + def __init__(self): + sql = db.Sql() + sql._Sql__DB_FILE = self._DB_FILE + self.db = sql + self.Script = _ScriptTable(self.db) + self.Flow = _FlowTable(self.db) + self.CommandTask = _CommandTaskTable(self.db) + self.CommandLog = _CommandLogTable(self.db) + self.TransferTask = _TransferTaskTable(self.db) + self.TransferFile = _TransferFileTable(self.db) + self.TransferLog = _TransferLogTable(self.db) + self.FlowTemplate = _FlowTemplateTable(self.db) + + def init_db(self): + import sqlite3 + sql_data = public.readFile(self._DB_INIT_FILE) + if not os.path.exists(self._DB_FILE) or os.path.getsize(self._DB_FILE) == 0: + public.writeFile(self._DB_FILE, "") + conn = sqlite3.connect(self._DB_FILE) + cursor = conn.cursor() + cursor.executescript(sql_data) + conn.commit() + conn.close() + else: + conn = sqlite3.connect(self._DB_FILE) + cursor = conn.cursor() + ret = cursor.execute("SELECT * from sqlite_master where type='index' and name = 'idx_flow_templates_name'") + if ret.fetchone(): + return + cursor.executescript(sql_data) + conn.commit() + conn.close() + + def close(self): + self.db.close() + + def __enter__(self): + return self + + def __exit__(self, exc_type, exc_value, exc_trackback): + self.close() + + def create_flow( + self, used_nodes: List[Dict], target_nodes: List[Dict], + strategy: dict, flow_data: List[dict]) -> Tuple[Optional[Flow], str]: + """创建任务流""" + f = Flow( + server_ids="|{}|".format("|".join([str(item["id"]) for item in target_nodes])), + step_count=len(flow_data), + strategy=strategy, + status="waiting" + ) + f.id = self.Flow.create(f) + if not isinstance(f.id, int): + return None, "Task creation failed:{}".format(f.id) + step_index = 1 + steps = [] + + def clear(): + self.Flow.delete(f.id) + for step in steps: + if isinstance(step, CommandTask): + self.CommandTask.delete(step.id) + elif isinstance(step, TransferTask): + self.TransferTask.delete(step.id) + + for task_data in flow_data: + if task_data["task_type"] == "command": + cmd_task, msg = self.create_cmd_task(f.id, step_index, task_data, target_nodes) + if not cmd_task: + clear() + return None, msg + steps.append(cmd_task) + elif task_data["task_type"] == "file": + transfer_task, msg = self.create_transfer_task(f.id, step_index, task_data, target_nodes, used_nodes) + if not transfer_task: + clear() + return None, msg + steps.append(transfer_task) + step_index += 1 + + return f, "" + + def create_cmd_task(self, + flow_id: int, step_index: int, task_data: dict, + nodes: List[Dict]) -> Tuple[Optional[CommandTask], str]: + + script_id = task_data.get('script_id', 0) + script_content = task_data.get('script_content', "").strip() + script_type = task_data.get('script_type', "").strip() + name = task_data.get('name', random_name()) + if script_id: + s = self.Script.get_byid(script_id) + if not s: + return None, "Script does not exist" + script_content = s.content + script_type = s.script_type + elif script_content: + if not script_type in ("python", "shell"): + return None, "Script type error" + else: + return None, "No script selected" + + cmd_task = CommandTask( + flow_id=flow_id, + step_index=step_index, + script_id=script_id, + name=name, + script_content=script_content, + script_type=script_type, + ) + task_id = self.CommandTask.create(cmd_task) + if not isinstance(task_id, int): + return None, str(task_id) + cmd_task.id = task_id + time_now = time.time() + md5_str = public.md5(script_content)[::2] + cmd_logs = [ + CommandLog( + command_task_id=task_id, + server_id=node["id"], + ssh_host=node["ssh_conf"]["host"], + log_name="{}_{}_{}.log".format(md5_str, time_now, node['remarks']) + ) + for node in nodes + ] + res = self.CommandLog.create(cmd_logs) + if not isinstance(res, int): + self.CommandTask.delete(task_id) + return None, str(res) + cmd_task.elogs = cmd_logs + return cmd_task, "" + + def create_transfer_task( + self, flow_id: int, step_index: int, task_data: dict, + nodes: List[Dict], used_nodes: List[Dict]) -> Tuple[Optional[TransferTask], str]: + + src_node_id = task_data.get('src_node_id', 0) + for node in used_nodes: + if node["id"] == src_node_id: + src_node = node + break + else: + return None, "The source node does not exist" + + path_list = task_data.get('path_list', []) + for p in path_list: + if "path" not in p or "dst_path" not in p or "is_dir" not in p: + return None, "File distribution rule error" + if not path_list: + return None, "Please select a file" + + dst_nodes = { + node["id"]: { + "name": node["remarks"], "address": node["address"], + "api_key": node["api_key"], "app_key": node["app_key"], + "ssh_conf": node["ssh_conf"], "lpver": node["lpver"], + "id": node["id"] + } + for node in nodes if node["id"] != src_node_id + } + + tt = TransferTask( + name=task_data.get('name', random_name()), + flow_id=flow_id, + step_index=step_index, + src_node={"name": "local"}, + src_node_task_id=0, + dst_nodes=dst_nodes, + path_list=task_data.get('path_list', []), + ) + + if not (src_node["app_key"] == "local" and src_node["api_key"] == "local"): + from mod.project.node.nodeutil import ServerNode + srv = ServerNode(src_node["address"], src_node["api_key"], src_node["app_key"]) + res = srv.node_create_transfer_task(tt.to_dict()) + if "task_id" in res.get("data", {}): + tt.src_node_task_id = res["data"]["task_id"] + tt.src_node = { + "name": src_node["remarks"], "address": src_node["address"], + "api_key": src_node["api_key"], "app_key": src_node["app_key"], + "lpver": src_node["lpver"] + } + + task_id = self.TransferTask.create(tt) + if not isinstance(task_id, int): + return None, str(task_id) + + tt.id = task_id + return tt, "" + + def history_transferfile_task(self, file_id: int, only_error: bool = True) -> Dict: + if only_error: + log_list= self.TransferLog.query("transfer_task_id = ? and status = ?", (file_id, 3)) + files_id_list = [i.transfer_file_id for i in log_list] + files = self.TransferFile.query("transfer_task_id = ? and id in ({})".format( + ",".join([str(i) for i in files_id_list]) + ), (file_id,)) + fils_map = {i.id: i for i in files} + error_num = len(log_list) + else: + log_list = self.TransferLog.query("transfer_task_id = ?", (file_id,)) + files = self.TransferFile.query("transfer_task_id = ?", (file_id,)) + fils_map = {i.id: i for i in files} + error_num = len([i for i in log_list if i.status == 3]) + for i in log_list: + i.tf = fils_map[i.transfer_file_id] + + count = self.TransferLog.count("transfer_task_id = ?", (file_id,)) + running_count = self.TransferLog.count("transfer_task_id = ? and status in (0,1)", (file_id,)) + return { + "task_type": "file", + "task_id": file_id, + "count": count, + "complete": count - error_num - running_count, + "error": error_num, + "error_nodes": list(set(int(i.dst_node_idx) for i in log_list if i.status == 3)), + "exclude_nodes": [] if running_count == count else list(set(int(i.dst_node_idx) for i in log_list if i.status == 0)), + "data": [i.to_show_data() for i in log_list], + } + + def history_transferfile_task_log(self, file_id: int, log_id: int) -> Dict: + log_data = self.TransferLog.query("transfer_task_id = ? and id = ?", (file_id, log_id)) + file_record = self.TransferFile.get_byid(file_id) + if not log_data or not file_record: + return { + "task_type": "file", + "task_id": file_id, + "count": 0, + "complete": 0, + "error": 0, + "error_nodes": [], + } + the_log = log_data[0] + the_log.tf = file_record + return { + "task_type": "file", + "task_id": file_id, + "count": 0, + "complete": 0, + "error": 0, + "error_nodes": [], + "exclude_nodes": [], + "data": [the_log.to_show_data()], + } + + def history_command_task(self, cmd_id: int, only_error: bool = True) -> Dict: + if only_error: + log_list = self.CommandLog.query("command_task_id = ? and status in (?, ?)", (cmd_id, 3, 4)) + error_num = len(log_list) + else: + log_list = self.CommandLog.query("command_task_id = ?", (cmd_id,)) + error_num = len([i for i in log_list if i.status == 3]) + count = self.CommandLog.count("command_task_id = ?", (cmd_id,)) + running_count = self.CommandLog.count("command_task_id = ? and status in (0,1)", (cmd_id,)) + return { + "task_type": "command", + "task_id": cmd_id, + "count": count, + "complete": count - error_num - running_count, + "error": error_num, + "error_nodes": list(set(int(i.server_id) for i in log_list if i.status in (3, 4))), + "exclude_nodes": [] if running_count == count else list(set(int(i.server_id) for i in log_list if i.status == 0)), + "data": [i.to_show_data(only_error=only_error) for i in log_list], + } + + def history_flow_task(self, flow: Union[int, Flow], has_sub_data: bool = False) -> Dict: + if isinstance(flow, int): + flow = self.Flow.get_byid(flow) + steps: List[Union[CommandTask, TransferTask]] = [ + *self.CommandTask.query("flow_id = ?", (flow.id,)), + *self.TransferTask.query("flow_id = ?", (flow.id,)) + ] + + for step in steps: + if step.status == 1: + now_idx = step.step_index + break + else: + now_idx = len(steps) + steps.sort(key=lambda x: x.step_index, reverse=False) + + flow.steps = steps + flow_data = flow.to_dict() + flow_data["steps"] = [] + for i in steps: + if isinstance(i, CommandTask): + tmp = i.to_show_data() + if has_sub_data: + tmp.update(self.history_command_task(i.id, only_error=False)) + flow_data["steps"].append(tmp) + elif isinstance(i, TransferTask): + tmp = i.to_show_data() + if has_sub_data: + tmp.update(self.history_transferfile_task(i.id, only_error=False)) + flow_data["steps"].append(tmp) + + flow_data["now_idx"] = now_idx + return flow_data + + def clear_old_log(self): + """ + select * from transfer_tasks where dst_nodes like '[{"%' order by id desc limit 1; + """ + t_task = self.TransferTask.find("dst_nodes like ?", ('[{"%',), order_by="id desc") + if t_task: + old_flow_id = t_task.flow_id + else: + old_flow_id = 0 + exp_flow = self.Flow.find("created_at < ?", (int(time.time() - 86400 * 7),), order_by="id desc") + if exp_flow: + old_flow_id = max(old_flow_id, exp_flow.id) + if not old_flow_id: # 没有过期的数据需要清理 + return + + last_command_task = self.CommandTask.find("flow_id = ?", (old_flow_id,), order_by="id desc") + if not last_command_task: + self.CommandLog.delete_where("command_task_id <= ?", (last_command_task.id,)) + + self.Flow.delete_where("id <= ?", (old_flow_id,)) + self.CommandTask.delete_where("id <= ?", (last_command_task.id,)) + + # 清理文件任务 + self.TransferTask.delete_where("flow_id <= ?", (old_flow_id,)) + self.TransferFile.delete_where("flow_id <= ?", (old_flow_id,)) + self.TransferLog.delete_where("flow_id <= ?", (old_flow_id,)) + + for log_file in os.listdir(_EXECUTOR_LOG_DIR): + file_path = os.path.join(_EXECUTOR_LOG_DIR, log_file) + mtime = os.path.getmtime(file_path) + if mtime < time.time() - 86400 * 7: + os.remove(file_path) + diff --git a/mod/project/node/dbutil/node_task_flow.sql b/mod/project/node/dbutil/node_task_flow.sql new file mode 100644 index 00000000..f06ad3a9 --- /dev/null +++ b/mod/project/node/dbutil/node_task_flow.sql @@ -0,0 +1,144 @@ +-- 创建脚本表 +CREATE TABLE IF NOT EXISTS scripts +( + id INTEGER PRIMARY KEY AUTOINCREMENT, + name TEXT NOT NULL CHECK (length(name) <= 255), + script_type TEXT NOT NULL CHECK (length(script_type) <= 255), + content TEXT NOT NULL, + description TEXT, + created_at INTEGER NOT NULL DEFAULT (strftime('%s', 'now')), + updated_at INTEGER NOT NULL DEFAULT (strftime('%s', 'now')) +); + +-- 创建任务流 +CREATE TABLE IF NOT EXISTS flows +( + id INTEGER PRIMARY KEY AUTOINCREMENT, + server_ids TEXT NOT NULL, -- 存储服务器ID列表 + step_count INTEGER NOT NULL, + strategy TEXT NOT NULL, -- 对于不同任务的处理策略, json字段 + status TEXT NOT NULL, -- 总体状态 waiting, running, complete, error + created_at INTEGER NOT NULL DEFAULT (strftime('%s', 'now')), + updated_at INTEGER NOT NULL DEFAULT (strftime('%s', 'now')) +); + +-- 创建命令行任务表 +CREATE TABLE IF NOT EXISTS command_tasks +( + id INTEGER PRIMARY KEY AUTOINCREMENT, + flow_id INTEGER NOT NULL, + name TEXT NOT NULL CHECK (length(name) <= 255), + step_index INTEGER NOT NULL, + script_id INTEGER NOT NULL, + script_content TEXT NOT NULL, + script_type TEXT NOT NULL CHECK (length(script_type) <= 255), + status INTEGER NOT NULL DEFAULT 0 CHECK (status IN (0, 1, 2, 3)), -- 0: 等待中, 1: 进行中, 2: 成功, 3: 失败 + created_at INTEGER NOT NULL DEFAULT (strftime('%s', 'now')), + updated_at INTEGER NOT NULL DEFAULT (strftime('%s', 'now')) +); + +-- 创建命令行任务日志表 +CREATE TABLE IF NOT EXISTS command_logs +( + id INTEGER PRIMARY KEY AUTOINCREMENT, + command_task_id INTEGER NOT NULL, + server_id INTEGER NOT NULL, + ssh_host TEXT NOT NULL, + status INTEGER NOT NULL DEFAULT 0 CHECK (status IN (0, 1, 2, 3, 4)), -- 0: 等待中, 1: 进行中, 2: 成功, 3: 失败, 4: 异常 + log_name TEXT NOT NULL CHECK (length(log_name) <= 255) +); + +-- 传输任务表 +CREATE TABLE IF NOT EXISTS transfer_tasks +( + id INTEGER PRIMARY KEY AUTOINCREMENT, + name TEXT NOT NULL CHECK (length(name) <= 255), + flow_id INTEGER NOT NULL, -- 当本机不是数据源节点时, 本字段的值为 0 + step_index INTEGER NOT NULL, + src_node TEXT NOT NULL, -- 数据源节点, json字段 + src_node_task_id INTEGER NOT NULL, -- 当本机是数据源节点时, 本字段的值为 0, 否则为目标机器上的transfer_tasks.id + dst_nodes TEXT NOT NULL, -- 目标节点,多个,json字段 + message TEXT NOT NULL DEFAULT '', -- 与目标节点的链接错误信息 + path_list TEXT NOT NULL DEFAULT '[]', -- 源节点上的路径 [{"path":"/www/wwwroots", "is_dir":true}] + status INTEGER NOT NULL DEFAULT 0 CHECK (status IN (0, 1, 2, 3)), -- 0: 等待中, 1: 进行中, 2: 成功, 3: 失败 + created_at INTEGER NOT NULL DEFAULT (strftime('%s', 'now')), + updated_at INTEGER NOT NULL DEFAULT (strftime('%s', 'now')) +); + +-- 传输文件列表 +CREATE TABLE IF NOT EXISTS transfer_files +( + id INTEGER PRIMARY KEY AUTOINCREMENT, + flow_id INTEGER NOT NULL, + transfer_task_id INTEGER NOT NULL, + src_file TEXT NOT NULL, -- 源文件 + dst_file TEXT NOT NULL, -- 目标文件 + file_size INTEGER NOT NULL, -- 文件大小 + is_dir INTEGER NOT NULL DEFAULT 0 +); + + +-- 传输文件列表 +CREATE TABLE IF NOT EXISTS transfer_logs +( + id INTEGER PRIMARY KEY AUTOINCREMENT, + flow_id INTEGER NOT NULL, + transfer_task_id INTEGER NOT NULL, + transfer_file_id INTEGER NOT NULL, + dst_node_idx INTEGER NOT NULL, -- 目标节点索引,基于 transfer_tasks.dst_nodes + status INTEGER NOT NULL DEFAULT 0 CHECK (status IN (0, 1, 2, 3, 4)), -- 0: 等待中, 1: 进行中, 2: 成功, 3: 失败, 4: 跳过 + progress INTEGER DEFAULT 0, -- 0-100 + message TEXT NOT NULL DEFAULT '', + created_at INTEGER NOT NULL DEFAULT (strftime('%s', 'now')), + started_at INTEGER, + completed_at INTEGER +); + +-- 创建流程模板表 +CREATE TABLE IF NOT EXISTS flow_templates +( + id INTEGER PRIMARY KEY AUTOINCREMENT, + name TEXT NOT NULL CHECK (length(name) <= 255), + key_words TEXT NOT NULL DEFAULT '', -- 关键字词,用来查询内容是子任务的名称 + description TEXT NOT NULL DEFAULT '', -- 模板描述 + content TEXT NOT NULL, -- json字段,由前端构建,实际流程内容 + created_at INTEGER NOT NULL DEFAULT (strftime('%s', 'now')), + updated_at INTEGER NOT NULL DEFAULT (strftime('%s', 'now')) +); + +CREATE INDEX IF NOT EXISTS idx_scripts_name ON scripts (name); +CREATE INDEX IF NOT EXISTS idx_scripts_description ON scripts (description); + +CREATE INDEX IF NOT EXISTS idx_flow_server_ids ON flows (server_ids); + +-- command_tasks 表 +CREATE INDEX IF NOT EXISTS idx_command_tasks_flow_id ON command_tasks (flow_id); +CREATE INDEX IF NOT EXISTS idx_command_tasks_script_id ON command_tasks (script_id); + +-- command_logs 表 +CREATE INDEX IF NOT EXISTS idx_command_logs_task_id ON command_logs (command_task_id); +CREATE INDEX IF NOT EXISTS idx_command_logs_server_id ON command_logs (server_id); +-- command_logs 状态查询 +CREATE INDEX IF NOT EXISTS idx_command_logs_status ON command_logs (command_task_id, status); + +-- transfer_tasks 表 +CREATE INDEX IF NOT EXISTS idx_transfer_tasks_flow_id ON transfer_tasks (flow_id); +CREATE INDEX IF NOT EXISTS idx_transfer_tasks_src_node_task_id ON transfer_tasks (src_node_task_id); + +-- transfer_files 表 +CREATE INDEX IF NOT EXISTS idx_transfer_files_task_id ON transfer_files (transfer_task_id); + +-- transfer_logs 表 +CREATE INDEX IF NOT EXISTS idx_transfer_logs_flow_id ON transfer_logs (flow_id); +CREATE INDEX IF NOT EXISTS idx_transfer_logs_task_id ON transfer_logs (transfer_task_id); +CREATE INDEX IF NOT EXISTS idx_transfer_logs_file_id ON transfer_logs (transfer_file_id); +-- transfer_logs 状态查询 +CREATE INDEX IF NOT EXISTS idx_transfer_logs_status ON transfer_logs (transfer_file_id, status); + +-- flow_templates 表 +CREATE INDEX IF NOT EXISTS idx_flow_templates_name ON flow_templates (name); +CREATE INDEX IF NOT EXISTS idx_flow_templates_key_words ON flow_templates (key_words); + + + + diff --git a/mod/project/node/executor/__init__.py b/mod/project/node/executor/__init__.py new file mode 100644 index 00000000..9ff3dd86 --- /dev/null +++ b/mod/project/node/executor/__init__.py @@ -0,0 +1,115 @@ +import json +import threading +import queue +import time +import traceback + +from mod.base.ssh_executor import SSHExecutor +from mod.project.node.dbutil import ServerNodeDB, ExecutorDB, ExecutorLog + + +class Task(object): + def __init__(self, task_id: int, log_id: int): + self._edb = ExecutorDB() + self.task = self._edb.ExecutorTask.find("id = ?", (task_id,)) + if not self.task: + raise RuntimeError("The specified task does not exist") + if log_id == 0: + self.task.elogs = self._edb.ExecutorLog.query("executor_task_id = ?", (self.task.id,)) + else: + self.task.elogs = [self._edb.ExecutorLog.find("executor_task_id = ? AND id = ?", (self.task.id, log_id))] + if not self.task.elogs: + raise RuntimeError("Task has no execution entry") + + self.end_queue = queue.Queue() + self.end_status = False + + + def end_func(self): + self._edb = ExecutorDB() + while not self.end_queue.empty() or not self.end_status: + if self.end_queue.empty(): + time.sleep(0.1) + + elog: ExecutorLog = self.end_queue.get() + self._edb.ExecutorLog.update(elog) + + def start(self): + thread_list = [] + s_db = ServerNodeDB() + for log in self.task.elogs: + node = s_db.get_node_by_id(log.server_id) + if not node: + log.status = 2 + log.update_log("Node data loss, unable to execute\n") + self._edb.ExecutorLog.update(log) + + ssh_conf = json.loads(node["ssh_conf"]) + if not ssh_conf: + log.status = 2 + log.update_log("Node SSH configuration data lost, unable to execute\n") + self._edb.ExecutorLog.update(log) + + thread = threading.Thread(target=self.run_one, args=(ssh_conf, log)) + thread.start() + thread_list.append(thread) + + self._edb.close() + end_th = threading.Thread(target=self.end_func) + end_th.start() + + for i in thread_list: + i.join() + self.end_status = True + end_th.join() + + def run_one(self, ssh_conf: dict, elog: ExecutorLog): + ssh = SSHExecutor( + host=ssh_conf["host"], + port=ssh_conf["port"], + username=ssh_conf["username"], + password=ssh_conf["password"], + key_data=ssh_conf["pkey"], + passphrase=ssh_conf["pkey_passwd"]) + elog.write_log("Start executing the task\nStart establishing SSH connection...\n") + try: + ssh.open() + def on_stdout(data): + if isinstance(data, bytes): + data = data.decode() + print(data) + elog.write_log(data) + + elog.write_log("Start executing script...\n\n") + t = time.time() + res_code = ssh.execute_script_streaming( + script_content=self.task.script_content, + script_type=self.task.script_type, + timeout=60*60, + on_stdout=on_stdout, + on_stderr=on_stdout + ) + take_time = round((time.time() - t)* 1000, 2) + elog.write_log("\n\nExecution completed, time-consuming [{}ms]\n".format(take_time)) + if res_code == 0: + elog.status = 1 + elog.write_log("Mission accomplished\n", is_end_log=True) + else: + elog.status = 3 + elog.write_log("Task exception, return status code is:{}\n".format(res_code), is_end_log=True) + self.end_queue.put(elog) + except Exception as e: + traceback.print_exc() + elog.status = 2 + elog.write_log("\nTask failed, error:" + str(e), is_end_log=True) + self.end_queue.put(elog) + return + + +# log_id 要执行的子任务,默认为 0,表示执行所有子任务 +def run_executor_task(task_id: int, log_id: int = 0): + t = Task(task_id, log_id) + t.start() + + + diff --git a/mod/project/node/executorMod.py b/mod/project/node/executorMod.py new file mode 100644 index 00000000..cf69292a --- /dev/null +++ b/mod/project/node/executorMod.py @@ -0,0 +1,913 @@ +import json +import os.path +import threading +import time +import psutil +import traceback +from datetime import datetime +from typing import List, Dict, Optional, Tuple, MutableMapping, Union + +import simple_websocket +from mod.base import json_response, list_args +from mod.project.node.nodeutil import ServerNode, LocalNode, LPanelNode, SSHApi +from mod.project.node.dbutil import Script, CommandLog, TaskFlowsDB, CommandTask, ServerNodeDB, TransferTask, \ + ServerMonitorRepo, Flow, FlowTemplates +from mod.project.node.task_flow import self_file_running_log, flow_running_log, flow_useful_version, file_task_run_sync, \ + command_task_run_sync + +import public + + +class main: + next_flow_tip_name = "user_next_flow_tip" + + @staticmethod + def create_script(get): + e_db = TaskFlowsDB() + err = Script.check(get) + if err: + return public.return_message(-1, 0,=err) + s = Script.from_dict(get) + # 查重 + if e_db.Script.find("name = ?", (s.name,)): + return public.return_message(-1, 0,"Script name already exists") + err = e_db.Script.create(s) + if isinstance(err, str): + return public.return_message(-1, 0,err) + # return json_response(status=True, msg="Created successfully", data=s.to_dict()) + return public.return_message(0, 0,s.to_dict()) + + @staticmethod + def modify_script(get): + e_db = TaskFlowsDB() + err = Script.check(get) + if err: + return public.return_message(-1, 0,err) + s = Script.from_dict(get) + if not s.id: + return public.return_message(-1, 0,"Script ID cannot be empty") + if not e_db.Script.find("id = ?", (s.id,)): + return public.return_message(-1, 0,"Script does not exist") + err = e_db.Script.update(s) + if err: + return public.return_message(-1, 0,err) + # return json_response(status=True, msg="Modified successfully", data=s.to_dict()) + return public.return_message(0, 0,s.to_dict()) + + @staticmethod + def delete_script(get): + e_db = TaskFlowsDB() + if not get.id: + return public.return_message(-1, 0,"Script ID cannot be empty") + try: + del_id = int(get.id) + except: + return public.return_message(-1, 0,"Script ID format error") + + e_db.Script.delete(del_id) + return public.return_message(0, 0,"Deleted successfully") + + @staticmethod + def get_script_list(get): + page_num = max(int(get.get('p/d', 1)), 1) + limit = max(int(get.get('limit/d', 16)), 1) + search = get.get('search', "").strip() + script_type = get.get('script_type/s', "all") + if not script_type in ["all", "python", "shell"]: + script_type = "all" + + where_list, params = [], [] + if search: + where_list.append("(name like ? or content like ? or description like ?)") + params.append("%{}%".format(search)) + params.append("%{}%".format(search)) + params.append("%{}%".format(search)) + + if script_type != "all": + where_list.append("script_type = ?") + params.append(script_type) + + where = " and ".join(where_list) + e_db = TaskFlowsDB() + data_list = e_db.Script.query_page(where, (*params,), page_num=page_num, limit=limit) + count = e_db.Script.count(where, params) + page = public.get_page(count, page_num, limit) + page["data"] = [i.to_dict() for i in data_list] + return page + + @staticmethod + def bath_delete_script(get): + script_ids = list_args(get, 'script_ids') + try: + script_ids = [int(i) for i in script_ids] + except: + return public.return_message(-1, 0,"Script ID format error") + if not script_ids: + return public.return_message(-1, 0,"Script ID cannot be empty") + + e_db = TaskFlowsDB() + err = e_db.Script.delete(script_ids) + if err: + return public.return_message(-1, 0,err) + return public.return_message(0, 0,"Deleted successfully") + + @staticmethod + def create_task(get): + node_ids = list_args(get, 'node_ids') + if not node_ids: + return public.return_message(-1, 0,"Node ID cannot be empty") + try: + node_ids = [int(i) for i in node_ids] + except: + return public.return_message(-1, 0,"Node ID format error") + + e_db = TaskFlowsDB() + script_id = get.get('script_id/d', 0) + if script_id: + s = e_db.Script.find("id = ?", (script_id,)) + if not s: + return public.return_message(-1, 0,"Script does not exist") + + elif get.get("script_content/s", "").strip(): + if not (get.get("script_type", "").strip() in ("python", "shell")): + return public.return_message(-1, 0,"Script type error") + s = Script("", get.get("script_type", "").strip(), content=get.get("script_content", "").strip()) + s.id = 0 + else: + return public.return_message(-1, 0,"Please select a script") + + nodes_db = ServerNodeDB() + nodes = [] + timestamp = int(datetime.now().timestamp()) + for i in node_ids: + n = nodes_db.get_node_by_id(i) + if not n: + return public.return_message(-1, 0,"The node with node ID [{}] does not exist".format(i)) + n["ssh_conf"] = json.loads(n["ssh_conf"]) + if not n["ssh_conf"]: + return public.return_message(-1, 0,"The node with node ID [{}] has not configured SSH information and cannot distribute instructions".format(i)) + n["log_name"] = "{}_{}_{}.log".format(public.md5(s.content)[::2], timestamp, n['remarks']) + nodes.append(n) + + e_task = CommandTask( + script_id=s.id, + script_content=s.content, + script_type=s.script_type, + flow_id=0, + step_index=0, + ) + command_task_id = e_db.CommandTask.create(e_task) + e_task.id = command_task_id + if not isinstance(command_task_id, int) or command_task_id <= 0: + return public.return_message(-1, 0,"Task creation failed:" + command_task_id) + + log_list = [] + for i in nodes: + elog = CommandLog( + command_task_id=command_task_id, + server_id=i["id"], + ssh_host=i["ssh_conf"]["host"], + status=0, + log_name=i["log_name"], + ) + elog.create_log() + log_list.append(elog) + + last_id = e_db.CommandLog.create(log_list) + if not isinstance(last_id, int) or last_id <= 0: + for i in log_list: + i.remove_log() + return public.return_message(-1, 0,"Failed to create log:" + last_id) + + script_py = "{}/script/node_command_executor.py command".format(public.get_panel_path()) + res = public.ExecShell("nohup {} {} {} > /dev/null 2>&1 &".format( + public.get_python_bin(), script_py, command_task_id) + ) + + data_dict = e_task.to_dict() + data_dict["log_list"] = [i.to_dict() for i in log_list] + data_dict["task_id"] = command_task_id + # return json_response(status=True, msg="Created successfully", data=data_dict) + return public.return_message(0, 0, data_dict) + + @staticmethod + def get_server_info(server_id: int, server_cache) -> dict: + server_info = server_cache.get(server_id) + if not server_info: + server = ServerNodeDB().get_node_by_id(server_id) + if not server: + server_cache[server_id] = {} + else: + server_cache[server_id] = server + return server_cache[server_id] + else: + return server_info + + @classmethod + def get_task_list(cls, get): + page_num = max(int(get.get('p/d', 1)), 1) + limit = max(int(get.get('limit/d', 16)), 1) + script_type = get.get('script_type/s', "all") + if not script_type in ["all", "python", "shell"]: + script_type = "all" + search = get.get('search', "").strip() + + e_db = TaskFlowsDB() + count, tasks = e_db.CommandTask.query_tasks( + page=page_num, size=limit, script_type=script_type, search=search + ) + + res = [] + server_cache: Dict[int, Dict] = {} + for i in tasks: + task_dict = i.to_dict() + log_list = e_db.CommandLog.query("command_task_id = ?", (i.id,)) + task_dict["log_list"] = [] + if i.script_id > 0: + s = e_db.Script.find("id = ?", (i.script_id,)) + if s: + task_dict["script_name"] = s.name + else: + task_dict["script_name"] = "-" + + for j in log_list: + tmp = j.to_dict() + tmp["server_name"] = cls.get_server_info(j.server_id, server_cache).get("remarks") + task_dict["log_list"].append(tmp) + + res.append(task_dict) + + page = public.get_page(count, page_num, limit) + page["data"] = res + return public.return_message(0, 0,page) + + @classmethod + def get_task_info(cls, get): + task_id = get.get('task_id/d', 0) + if not task_id: + return public.return_message(-1, 0,"Task ID cannot be empty") + + e_db = TaskFlowsDB() + task = e_db.CommandTask.find("id = ?", (task_id,)) + if not task: + return public.return_message(-1, 0,"Task does not exist") + + task_dict = task.to_dict() + task_dict["log_list"] = [] + server_cache = {} + log_list = e_db.CommandLog.query("command_task_id = ?", (task_id,)) + for i in log_list: + tmp = i.to_dict() + if i.status != 0: + tmp["log"] = i.get_log() + tmp["server_name"] = cls.get_server_info(i.server_id, server_cache).get("remarks", "") + task_dict["log_list"].append(tmp) + + return public.return_message(0, 0,task_dict) + + @staticmethod + def delete_task(get): + e_db = TaskFlowsDB() + task_id = get.get('task_id/d', 0) + if not task_id: + return public.return_message(-1, 0,"Task ID cannot be empty") + + task = e_db.CommandTask.find("id = ?", (task_id,)) + if not task: + return public.return_message(-1, 0,"Task does not exist") + + pid_file = "{}/logs/executor_log/{}.pid".format(public.get_panel_path(), task_id) + if os.path.exists(pid_file): + pid: str = public.readFile(pid_file) + if pid and pid.isdigit(): + public.ExecShell("kill -9 {}".format(pid)) + os.remove(pid_file) + + log_list = e_db.CommandLog.query("command_task_id = ?", (task_id,)) + for i in log_list: + i.remove_log() + e_db.CommandLog.delete(i.id) + + e_db.CommandTask.delete(task_id) + return public.return_message(0, 0,"Deleted successfully") + + @staticmethod + def batch_delete_task(get): + task_ids: List[int] = list_args(get, "task_ids") + if not task_ids: + return public.return_message(-1, 0,"Please select the task to delete") + task_ids = [int(i) for i in task_ids] + e_db = TaskFlowsDB() + task_list = e_db.CommandTask.query("id IN ({})".format(",".join(["?"] * len(task_ids))), (*task_ids,)) + if not task_list: + return public.return_message(-1, 0,"Task does not exist") + for i in task_list: + pid_file = "{}/logs/executor_log/{}.pid".format(public.get_panel_path(), i.id) + if os.path.exists(pid_file): + pid: str = public.readFile(pid_file) + if pid and pid.isdigit(): + public.ExecShell("kill -9 {}".format(pid)) + os.remove(pid_file) + + log_list = e_db.CommandLog.query("command_task_id = ?", (i.id,)) + for j in log_list: + j.remove_log() + e_db.CommandLog.delete(j.id) + e_db.CommandTask.delete(i.id) + + return public.return_message(0, 0,"Deleted successfully") + + @staticmethod + def retry_task(get): + task_id = get.get('task_id/d', 0) + if not task_id: + return public.return_message(-1, 0,"Task ID cannot be empty") + + log_id = get.get('log_id/d', 0) + if not log_id: + return public.return_message(-1, 0,"The log ID cannot be empty") + + e_db = TaskFlowsDB() + log = e_db.CommandLog.find("id = ? AND command_task_id = ?", (log_id, task_id)) + if not log: + return public.return_message(-1, 0,"log does not exist") + + log.create_log() + log.status = 0 + e_db.CommandLog.update(log) + script_py = "{}/script/node_command_executor.py command".format(public.get_panel_path()) + public.ExecShell("nohup {} {} {} {} > /dev/null 2>&1 &".format( + public.get_python_bin(), script_py, task_id, log_id) + ) + return public.return_message(0, 0,"Retry started") + + @staticmethod + def node_create_transfer_task(get): + try: + transfer_task_data = json.loads(get.get('transfer_task_data', "{}")) + if not transfer_task_data: + return public.return_message(-1, 0,"Parameter error") + except Exception as e: + return public.return_message(-1, 0,"Parameter error") + + transfer_task_data["flow_id"] = 0 + transfer_task_data["step_index"] = 0 + transfer_task_data["src_node"] = {"name": "local"} + transfer_task_data["src_node_task_id"] = 0 + if not isinstance(transfer_task_data["dst_nodes"], dict): + return public.return_message(-1, 0,"Please upgrade the version of the main node panel you are currently using") + + fdb = TaskFlowsDB() + tt = TransferTask.from_dict(transfer_task_data) + task_id = fdb.TransferTask.create(tt) + if not task_id: + return public.return_message(-1, 0,"Task creation failed") + # return json_response(status=True, msg="Created successfully", data={"task_id": task_id}) + return public.return_message(0, 0, {"task_id": task_id}) + + @classmethod + def node_transferfile_status_history(cls, get): + task_id = get.get('task_id/d', 0) + only_error = get.get('only_error/d', 1) + if not task_id: + return public.return_message(-1, 0,"Task ID cannot be empty") + fdb = TaskFlowsDB() + ret = fdb.history_transferfile_task(task_id, only_error=only_error==1) + fdb.close() + # return json_response(status=True, msg="Successfully obtained", data=ret) + return public.return_message(0, 0, ret) + + @classmethod + def node_proxy_transferfile_status(cls, get): + ws: simple_websocket.Server = getattr(get, '_ws', None) + if not ws: + return public.return_message(-1, 0, "Please use WebSocket connection") + + task_id = get.get('task_id/d', 0) + exclude_nodes = list_args(get, "exclude_nodes") + the_log_id = get.get('the_log_id/d', 0) + if not task_id: + ws.send(json.dumps({"type": "end", "msg": "Task ID cannot be empty"})) + ws.send("{}") + return + + try: + exclude_nodes = [int(i) for i in exclude_nodes] + except: + exclude_nodes = [] + + fdb = TaskFlowsDB() + task = fdb.TransferTask.get_byid(task_id) + if not task: + ws.send(json.dumps({"type": "end", "msg": "Task does not exist"})) + ws.send("{}") + return + if the_log_id: # 单任务重试 + res_data = file_task_run_sync(task_id, the_log_id) + if isinstance(res_data, str): + ws.send(json.dumps({"type": "error", "msg": res_data})) + ws.send("{}") + else: + ws.send(json.dumps({"type": "end", "data": res_data})) + ws.send("{}") + fdb.close() + return + + if task.status in (0, 3): # 初次执行 或 出错后再次尝试 + pid = cls._start_task("file", task_id, exclude_nodes=exclude_nodes) + elif task.status == 2: # 运行成功了, 获取历史数据并返回 + ret = fdb.history_transferfile_task(task_id) + ws.send(json.dumps({"type": "end", "data": ret})) + ws.send("{}") + fdb.close() + return + else: # 还在运行中 + pid_file = "{}/logs/executor_log/file_{}_0.pid".format(public.get_panel_path(), task_id) + if os.path.exists(pid_file): + pid = int(public.readFile(pid_file)) + else: + pid = None + + if not pid: # 运行失败, 返回数据库信息 + ret = fdb.history_transferfile_task(task_id) + ws.send(json.dumps({"type": "end", "data": ret})) + fdb.close() + ws.send("{}") + return + + def send_status(soc_data: dict): + ws.send(json.dumps({"type": "status", "data": soc_data})) + + err = self_file_running_log(task_id, send_status) + if err: + ws.send(json.dumps({"type": "error", "msg": err})) + + ret = fdb.history_transferfile_task(task_id) + ws.send(json.dumps({"type": "end", "data": ret})) + fdb.close() + ws.send("{}") # 告诉接收端,数据传输已经结束 + return + + def run_flow_task(self, get): + ws: simple_websocket.Server = getattr(get, '_ws', None) + if not ws: + return public.return_message(-1, 0,"Please use WebSocket connection") + + public.set_module_logs("nodes_flow_task", "run_flow_task") + node_ids = list_args(get, 'node_ids') + if not node_ids: + ws.send(json.dumps({"type": "error", "msg": "Node ID cannot be empty"})) + return + try: + node_ids = [int(i) for i in node_ids] + except: + ws.send(json.dumps({"type": "error", "msg": "Node ID format error"})) + return + + try: + flow_data = get.get('flow_data', '[]') + if isinstance(flow_data, str): + flow_data = json.loads(flow_data) + elif isinstance(flow_data, (list, tuple)): + pass + else: + raise + except: + ws.send(json.dumps({"type": "error", "msg": "Process data format error"})) + return + + strategy = {"run_when_error": True} + if "exclude_when_error" in get and get.exclude_when_error not in ("1", "true", 1, True): + strategy["exclude_when_error"] = False + + has_cmd_task = False + data_src_node = [] + for i in flow_data: + if i["task_type"] == "command": + has_cmd_task = True + elif i["task_type"] == "file": + data_src_node.append(i["src_node_id"]) + + nodes_db = ServerNodeDB() + used_nodes, target_nodes = [], [] + srv_cache = ServerMonitorRepo() + for i in set(node_ids + data_src_node): + n = nodes_db.get_node_by_id(i) + if not n: + ws.send(json.dumps({"type": "error", "msg": "The node with node ID [{}] does not exist".format(i)})) + return + n["ssh_conf"] = json.loads(n["ssh_conf"]) + if has_cmd_task and n["id"] in node_ids and not n["ssh_conf"]: + ws.send(json.dumps({"type": "error", "msg": "The node of node [{}] has not enabled SSH".format(n["remarks"])})) + return + if n["id"] in data_src_node: + is_local = n["app_key"] == n["api_key"] == "local" + if (not n["app_key"] and not n["api_key"]) or n["lpver"]: # 1panel面板或者 仅有ssh配置的节点无法作为数据源 + ws.send(json.dumps( + {"type": "error", "msg": "Node [{}] is not a pagoda node and cannot be used as a data source".format(n["remarks"])})) + return + if not is_local: + # 检查节点版本号 + tmp = srv_cache.get_server_status(n["id"]) + if not tmp or not flow_useful_version(tmp["version"]): + ws.send( + json.dumps({"type": "error", "msg": "Node [{}] version is too low, please upgrade the node".format(n["remarks"])})) + return + + used_nodes.append(n) + if n["id"] in node_ids: + target_nodes.append(n) + + fdb = TaskFlowsDB() + flow, err = fdb.create_flow(used_nodes, target_nodes, strategy, flow_data) + if not flow: + ws.send(json.dumps({"type": "error", "msg": err})) + return + fdb.close() + + pid = self._start_task("flow", flow.id) + if not pid: + ws.send(json.dumps({"type": "error", "msg": "Task startup failed"})) + return + + def update_status(data: dict): + ws.send(json.dumps({"type": "status", "data": data})) + + err = flow_running_log(flow.id, update_status) + if err: + ws.send(json.dumps({"type": "error", "msg": err})) + # flow_data = fdb.history_flow_task(flow.id) + # ws.send(json.dumps({"type": "data", "data": flow_data})) + ws.send(json.dumps({"type": "end", "msg": "Mission complete"})) + return + + @classmethod + def _start_task(cls, task_type: str, task_id: int, exclude_nodes: List[int]=None) -> Optional[int]: + pid_file = "{}/logs/executor_log/{}_{}_0.pid".format(public.get_panel_path(), task_type, task_id) + if os.path.exists(pid_file): + pid = int(public.readFile(pid_file)) + if psutil.pid_exists(pid): + return pid + + script_py = "{}/script/node_command_executor.py".format(public.get_panel_path()) + cmd = [ + public.get_python_bin(), script_py, + "--task_type={}".format(task_type), + "--task_id={}".format(task_id), + ] + + exclude_nodes = exclude_nodes or [] + if exclude_nodes: + exclude_nodes = [str(i) for i in exclude_nodes if i] + exclude_nodes_str = "'{}'".format(",".join(exclude_nodes)) + cmd.append("--exclude_nodes={}".format(exclude_nodes_str)) + + cmd_str = "nohup {} > /dev/null 2>&1 &".format(" ".join(cmd)) + public.ExecShell(cmd_str) + for i in range(60): + if os.path.exists(pid_file): + pid = int(public.readFile(pid_file)) + if psutil.pid_exists(pid): + return pid + time.sleep(0.05) + return None + + @classmethod + def flow_task_status(cls, get): + ws: simple_websocket.Server = getattr(get, '_ws', None) + if not ws: + return public.return_message(-1, 0, "Please use WebSocket connection") + + fdb = TaskFlowsDB() + flow = fdb.Flow.last(order_by="id DESC") + if flow and flow.status == "running": + flow_data = fdb.history_flow_task(flow) + ws.send(json.dumps({"type": "status", "data": flow_data})) + for t in flow.steps: + t: Union[CommandTask, TransferTask] + src_node = getattr(t, "src_node", {}) + is_local_src = src_node.get("address", None) is None + if not src_node: + task_data = fdb.history_command_task(t.id) + elif is_local_src: + task_data = fdb.history_transferfile_task(t.id) + else: + srv = ServerNode(src_node["address"], src_node["api_key"], src_node["app_key"], src_node["remarks"]) + srv_data = srv.node_transferfile_status_history(t.src_node_task_id) + if srv_data["status"]: + task_data = srv_data["data"] + else: + task_data = { + "task_id": t.id, "task_type": "file", + "count": 0, "complete": 0, "error": 0, "data": [] + } + ws.send(json.dumps({"type": "status", "data": task_data})) + + err = flow_running_log(flow.id, lambda x: ws.send(json.dumps({"type": "status", "data": x}))) + if err: + ws.send(json.dumps({"type": "error", "msg": err})) + + ws.send(json.dumps({"type": "end", "msg": "Mission complete"})) + return + else: + if not flow: + ws.send(json.dumps({"type": "no_flow", "msg": "No tasks"})) # 没有任务 + return + flow_data = fdb.history_flow_task(flow.id) + ws.send(json.dumps({"type": "end", "last_flow": flow_data})) + return + + @classmethod + def next_flow_tip(cls, get): + return public.return_message(0, 0,"Setup successful") + + @staticmethod + def get_flow_info(get): + flow_id = get.get("flow_id/d", 0) + fdb = TaskFlowsDB() + flow = fdb.Flow.get_byid(flow_id) + if not flow: + return public.return_message(-1, 0,"Task does not exist") + + flow_data = fdb.history_flow_task(flow.id) + return public.return_message(0, 0,flow_data) + + @staticmethod + def get_command_task_info(get): + task_id = get.get("task_id/d", 0) + fdb = TaskFlowsDB() + task = fdb.CommandTask.get_byid(task_id) + if not task: + return public.return_message(-1, 0,"Task does not exist") + return public.return_message(0, 0,fdb.history_command_task(task.id, only_error=False)) + + @staticmethod + def get_transferfile_task_info(get): + task_id = get.get("task_id/d", 0) + fdb = TaskFlowsDB() + task = fdb.TransferTask.get_byid(task_id) + if not task: + return public.return_message(-1, 0,"Task does not exist") + + src_node = task.src_node + is_local_src = task.src_node.get("address", None) is None + if is_local_src: + return public.return_message(0, 0,fdb.history_transferfile_task(task.id, only_error=False)) + else: + srv = ServerNode(src_node["address"], src_node["api_key"], src_node["app_key"], src_node["name"]) + srv_data = srv.node_transferfile_status_history(task.src_node_task_id, only_error=False) + if srv_data["status"]: + task_data = srv_data["data"] + else: + task_data = { + "task_id": task.id, "task_type": "file", + "count": 0, "complete": 0, "error": 0, "data": [] + } + return public.return_message(0, 0,task_data) + + def flow_task_list(self, get): + page_num = max(int(get.get('p/d', 1)), 1) + limit = max(int(get.get('limit/d', 16)), 1) + + fdb = TaskFlowsDB() + flow_list = fdb.Flow.query_page(page_num=page_num, limit=limit) + count = fdb.Flow.count() + res = [] + server_cache: Dict[int, Dict] = {} + for flow in flow_list: + tmp_data = fdb.history_flow_task(flow.id) + tmp_data["server_list"] = [{ + "id": int(i), + "name": self.get_server_info(int(i), server_cache).get("remarks", ""), + "server_ip": self.get_server_info(int(i), server_cache).get("server_ip", ""), + } for i in tmp_data["server_ids"].strip("|").split("|")] + res.append(tmp_data) + + page = public.get_page(count, page_num, limit) + page["data"] = res + return public.return_message(0, 0,page) + + @staticmethod + def remove_flow(get): + flow_ids = list_args(get,"flow_ids") + if not flow_ids: + return public.return_message(-1, 0,"Please select the task to delete") + fdb = TaskFlowsDB() + flows = fdb.Flow.query( + "id IN (%s) AND status NOT IN (?, ?)" % (",".join(["?"]*len(flow_ids))), + (*flow_ids, "waiting", "running") + ) + + command_tasks = fdb.CommandTask.query( + "flow_id IN (%s)" % (",".join(["?"]*len(flow_ids))), + (*flow_ids,) + ) + + command_logs = fdb.CommandLog.query( + "command_task_id IN (%s)" % (",".join(["?"]*len(flow_ids))), + (*flow_ids,) + ) + + for log in command_logs: + try: + if os.path.exists(log.log_file): + os.remove(log.log_file) + except: + pass + + fdb.CommandLog.delete([log.id for log in command_logs]) + fdb.CommandTask.delete([task.id for task in command_tasks]) + fdb.Flow.delete([flow.id for flow in flows]) + + w, p = "flow_id IN (%s)" % (",".join(["?"]*len(flow_ids))), (*flow_ids,) + fdb.TransferTask.delete_where(w, p) + fdb.TransferLog.delete_where(w, p) + fdb.TransferFile.delete_where(w, p) + + return public.return_message(0, 0,"Deleted successfully") + + def retry_flow(self, get): + ws: simple_websocket.Server = getattr(get, '_ws', None) + if not ws: + return public.return_message(-1, 0,"Please use WebSocket connection") + + flow_id = get.get("flow_id/d", 0) + flow = TaskFlowsDB().Flow.get_byid(flow_id) + if not flow: + ws.send(json.dumps({"type": "error", "msg": "Task does not exist"})) + return + + if flow.status == "complete": + ws.send(json.dumps({"type": "error", "msg": "Task completed, cannot retry"})) + return + + def call_status(data): + ws.send(json.dumps({"type": "status", "data": data})) + + pid = self._start_task("flow", flow.id) + if not pid: + ws.send(json.dumps({"type": "error", "msg": "Task startup failed"})) + return + + err = flow_running_log(flow.id, call_status) + if err: + ws.send(json.dumps({"type": "error", "msg": err})) + + ws.send(json.dumps({"type": "end", "msg": "Mission complete"})) + return + + # 重试某个单一任务, 如:单机器文件上传或单机器命令执行 + @staticmethod + def retry_flow_task(get): + task_type = get.get("task_type/s", "") + task_id = get.get("task_id/d", 0) + log_id = get.get("log_id/d", 0) + if not task_type or not task_id or not log_id: + return public.return_message(-1, 0,"Parameter error") + if task_type not in ("file", "command"): + return public.return_message(-1, 0,"Parameter error") + if task_type == "file": + ret = file_task_run_sync(task_id, log_id) + else: + ret = command_task_run_sync(task_id, log_id) + if isinstance(ret, str): + return public.return_message(-1, 0,ret) + # return json_response(status=True, msg="Task has been retried", data=ret) + return public.return_message(0, 0, ret) + + + @staticmethod + def stop_flow(get): + flow_id = get.get("flow_id/d", 0) + if not flow_id: + return public.return_message(-1, 0,"Please select the task to stop") + pid_file = "{}/logs/executor_log/flow_{}_0.pid".format(public.get_panel_path(), flow_id) + if os.path.exists(pid_file): + pid = int(public.readFile(pid_file)) + if psutil.pid_exists(pid): + psutil.Process(pid).kill() + + if os.path.exists(pid_file): + os.remove(pid_file) + + sock_file = "/tmp/flow_task/flow_task_{}".format(flow_id) + if os.path.exists(sock_file): + os.remove(sock_file) + + return public.return_message(0, 0,"Task stopped") + + @staticmethod + def file_dstpath_check(get): + path = get.get("path/s", "") + node_ids = list_args(get, "node_ids") + if not path or not node_ids: + return public.return_message(-1, 0,"Parameter error") + + if path == "/": + return public.return_message(-1, 0,"Cannot upload to root directory") + + nodes_db = ServerNodeDB() + ret = [] + + def check_node(n_data:dict, t_srv: Union[ServerNode, LPanelNode, SSHApi]): + res = {"id": n_data["id"], "err": "", "remarks": n_data["remarks"]} + err = t_srv.upload_dir_check(path) + if err: + res["err"] = err + ret.append(res) + + th_list = [] + for i in node_ids: + n = nodes_db.get_node_by_id(i) + if not n: + ret.append({"id": i, "err": "Node does not exist"}) + n["ssh_conf"] = json.loads(n["ssh_conf"]) + if n["app_key"] or n["api_key"]: + srv = ServerNode.new_by_data(n) + elif n["ssh_conf"]: + srv = SSHApi(**n["ssh_conf"]) + else: + ret.append({"id": i, "err": "Node configuration error"}) + continue + + th = threading.Thread(target=check_node, args=(n, srv)) + th.start() + th_list.append(th) + + for th in th_list: + th.join() + + # return json_response(status=True, data=ret) + return public.return_message(0, 0,ret) + + @staticmethod + def create_flow_template(get): + err = FlowTemplates.check(get) + if err: + return public.return_message(-1, 0,err) + s = FlowTemplates.from_dict(get) + # 查重 + e_db = TaskFlowsDB() + if e_db.FlowTemplate.find("name = ?", (s.name,)): + return public.return_message(-1, 0,"Script name already exists") + err = e_db.FlowTemplate.create(s) + if isinstance(err, str): + return public.return_message(-1, 0,err) + e_db.close() + # return json_response(status=True, msg="Created successfully", data=s.to_dict()) + return public.return_message(0, 0,s.to_dict()) + + + @staticmethod + def modify_flow_template(get): + err = FlowTemplates.check(get) + if err: + return public.return_message(-1, 0,err) + e_db = TaskFlowsDB() + ft = FlowTemplates.from_dict(get) + if not ft.id: + return public.return_message(-1, 0,"Please select the template to modify") + if not e_db.FlowTemplate.get_byid(ft.id): + return public.return_message(-1, 0,"Template does not exist") + err = e_db.FlowTemplate.update(ft) + if isinstance(err, str) and err: + return public.return_message(-1, 0,err) + e_db.close() + # return json_response(status=True, msg="Modified successfully", data=ft.to_dict()) + return public.return_message(0, 0,ft.to_dict()) + + @staticmethod + def delete_flow_template(get): + e_db = TaskFlowsDB() + if not get.get("id/d", 0): + return public.return_message(-1, 0,"Script ID cannot be empty") + try: + del_id = int(get.id) + except: + return public.return_message(-1, 0,"Script ID format error") + + e_db.FlowTemplate.delete(del_id) + return public.return_message(0, 0,"Deleted successfully") + + @staticmethod + def get_flow_template_list(get): + page_num = max(int(get.get('p/d', 1)), 1) + limit = max(int(get.get('limit/d', 16)), 1) + search = get.get('search', "").strip() + + where_list, params = [], [] + if search: + where_list.append("(name like ? or key_words like ? or description like ?)") + params.append("%{}%".format(search)) + params.append("%{}%".format(search)) + params.append("%{}%".format(search)) + + where = " and ".join(where_list) + e_db = TaskFlowsDB() + data_list = e_db.FlowTemplate.query_page(where, (*params,), page_num=page_num, limit=limit) + count = e_db.FlowTemplate.count(where, params) + page = public.get_page(count, page_num, limit) + page["data"] = [i.to_dict() for i in data_list] + return public.return_message(0, 0,page) + + diff --git a/mod/project/node/file_transferMod.py b/mod/project/node/file_transferMod.py new file mode 100644 index 00000000..e3043cf5 --- /dev/null +++ b/mod/project/node/file_transferMod.py @@ -0,0 +1,662 @@ +import json +import os.path +import traceback +from typing import List, Dict, Optional + +import simple_websocket +from mod.base import json_response +from mod.project.node.dbutil import FileTransfer, FileTransferTask, FileTransferDB, ServerNodeDB +from mod.project.node.nodeutil import ServerNode, LocalNode, LPanelNode +from mod.project.node.filetransfer import task_running_log, wait_running + +import public + + +class main(): + log_dir = "{}/logs/node_file_transfers".format(public.get_panel_path()) + if not os.path.exists(log_dir): + os.makedirs(log_dir) + + @staticmethod + def file_upload(args): + node_id = args.get('node_id', -1) + if node_id == -1: + from BTPanel import request + node_id = request.form.get('node_id', 0) + + if not node_id: + return public.return_message(-1, 0,"node_id is null") + + if isinstance(node_id, str): + try: + node_id = int(node_id) + except: + return public.return_message(-1, 0,"node_id is null") + + node = ServerNode.new_by_id(node_id) + if not node: + return public.return_message(-1, 0,"node not exists") + + return node.upload_proxy() + + @staticmethod + def file_download(args): + node_id = args.get('node_id', 0) + if not node_id: + return public.return_message(-1, 0,"node_id is null") + + filename = args.get('filename/s', "") + if not filename: + return jpublic.return_message(-1, 0,"The filename parameter cannot be empty") + if isinstance(node_id, str): + try: + node_id = int(node_id) + except: + return public.return_message(-1, 0,"node_id is null") + + node = ServerNode.new_by_id(node_id) + if not node: + return public.return_message(-1, 0,"node not exists") + + return node.download_proxy(filename) + + @staticmethod + def dir_walk(get): + path = get.get('path/s', "") + if not path: + return public.return_message(-1, 0,"The path parameter cannot be empty") + + res_list, err = LocalNode().dir_walk(path) + if err: + return public.return_message(-1, 0,err) + return res_list + + @classmethod + def create_filetransfer_task(cls, get): + ft_db = FileTransferDB() + task_data, err = ft_db.get_last_task() + if err: + return public.return_message(-1, 0,err) + if task_data and task_data["status"] not in ("complete", "failed"): + return public.return_message(-1, 0,"There are ongoing tasks on the current node, please wait for them to complete before submitting") + + public.set_module_logs("nodes_create_filetransfer_9", "create_filetransfer") + source_node_id = get.get('source_node_id/d', -1) + target_node_id = get.get('target_node_id/d', -1) + source_path_list = get.get('source_path_list/s', "") + target_path = get.get('target_path/s', "") + default_mode = get.get('default_mode/s', "cover") + if default_mode not in ("cover", "ignore", "rename"): + return public.return_message(-1, 0,"Default mode parameter error") + if source_node_id == target_node_id: + return public.return_message(-1, 0,"The source node and target node cannot be the same") + if source_node_id == -1 or target_node_id == -1: + return public.return_message(-1, 0,"The source or destination node cannot be empty") + + try: + source_path_list = json.loads(source_path_list) + except: + return public.return_message(-1, 0,"Error in the parameter 'sourcew_path_ist'") + keys = ("path", "size", "is_dir") + for items in source_path_list: + if not all(item in keys for item in items.keys()): + return public.return_message(-1, 0,"Error in the parameter 'sourcew_path_ist'") + if not (isinstance(items["path"], str) and isinstance(items["is_dir"], bool) and + isinstance(items["size"], int)): + return public.return_message(-1, 0,"Error in the parameter 'sourcew_path_ist'") + + if not target_path: + return public.return_message(-1, 0,"The target_cath parameter cannot be empty") + node_db = ServerNodeDB() + if source_node_id == 0: + src_node = node_db.get_local_node() + else: + src_node = node_db.get_node_by_id(source_node_id) + + + if not src_node: + return public.return_message(-1, 0,"The source node does not exist") + if target_node_id == 0: + target_node = node_db.get_local_node() + else: + target_node = node_db.get_node_by_id(target_node_id) + if not target_node: + return public.return_message(-1, 0,"The target node does not exist") + if src_node["id"] == target_node["id"]: + return public.return_message(-1, 0,"The source node and target node cannot be the same") + + # public.print_log("src_node:", src_node, "target_node:", target_node) + real_create_res: Optional[dict] = None # 实际上创建的结果,创建的任务不在本地时使用 + if src_node["api_key"] == src_node["app_key"] == "local": + return cls._create_filetransfer_task( + source_node={ + "name": "local", + }, + target_node={ + "name": "{}({})".format(target_node["remarks"], target_node["server_ip"]), + "address": target_node["address"], + "api_key": target_node["api_key"], + "app_key": target_node["app_key"], + "node_id": target_node_id, + "lpver": target_node["lpver"] + }, + source_path_list=source_path_list, + target_path=target_path, + created_by="local", + default_mode=default_mode, + ) + elif target_node["api_key"] == target_node["app_key"] == "local": + return cls._create_filetransfer_task( + source_node={ + "name": "{}({})".format(src_node["remarks"], src_node["server_ip"]), + "address": src_node["address"], + "api_key": src_node["api_key"], + "app_key": src_node["app_key"], + "node_id": source_node_id, + "lpver": src_node["lpver"] + }, + target_node={ + "name": "local", + }, + source_path_list=source_path_list, + target_path=target_path, + created_by="local", + default_mode=default_mode, + ) + elif src_node["lpver"]: + if target_node["lpver"]: + return public.return_message(-1, 0,"Cannot support file transfer between 1panel nodes") + # 源节点是1panel时,只能下载去目标节点操作 + if target_node["api_key"] == target_node["app_key"] == "local": + return cls._create_filetransfer_task( + source_node={ + "name": "{}".format(target_node["remarks"]) + ("({})".format(target_node["server_ip"]) if target_node["server_ip"] else ""), + "address": src_node["address"], + "api_key": src_node["api_key"], + "app_key": "", + "node_id": source_node_id, + "lpver": src_node["lpver"] + }, + target_node={ + "name": "local", + }, + source_path_list=source_path_list, + target_path=target_path, + created_by="local", + default_mode=default_mode, + ) + else: + srv = ServerNode(target_node["address"], target_node["api_key"], target_node["app_key"]) + real_create_res = srv.node_create_filetransfer_task( + source_node={ + "name": "{}".format(target_node["remarks"]) + ("({})".format(target_node["server_ip"]) if target_node["server_ip"] else ""), + "address": src_node["address"], + "api_key": src_node["api_key"], + "app_key": "", + "node_id": source_node_id, + "lpver": src_node["lpver"] + }, + target_node={ + "name": "local", + }, + source_path_list=source_path_list, + target_path=target_path, + created_by="{}({})".format(public.GetConfigValue("title"), public.get_server_ip()), + default_mode=default_mode + ) + else: # 都是宝塔节点的情况下 + srv = ServerNode(src_node["address"], src_node["api_key"], src_node["app_key"]) + if srv.filetransfer_version_check(): + srv = ServerNode(target_node["address"], target_node["api_key"], target_node["app_key"]) + res = srv.filetransfer_version_check() + if res: + return public.return_message(-1, 0,"{} Node check error:".format(target_node["remarks"]) + res) + real_create_res = srv.node_create_filetransfer_task( + source_node={ + "name": "{}".format(target_node["remarks"]) + ("({})".format(target_node["server_ip"]) if target_node["server_ip"] else ""), + "address": src_node["address"], + "api_key": src_node["api_key"], + "app_key": src_node["app_key"], + "node_id": source_node_id, + "lpver": src_node["lpver"] + }, + target_node={ + "name": "local", + }, + source_path_list=source_path_list, + target_path=target_path, + created_by="{}({})".format(public.GetConfigValue("title"), public.get_server_ip()), + default_mode=default_mode, + ) + else: + real_create_res = srv.node_create_filetransfer_task( + source_node={ + "name": "local", + }, + target_node={ + "name": "{}".format(target_node["remarks"]) + ("({})".format(target_node["server_ip"]) if target_node["server_ip"] else ""), + "address": target_node["address"], + "api_key": target_node["api_key"], + "app_key": target_node["app_key"], + "node_id": target_node_id, + "lpver": target_node["lpver"] + }, + source_path_list=source_path_list, + target_path=target_path, + created_by="{}({})".format(public.GetConfigValue("title"), public.get_server_ip()), + default_mode=default_mode, + ) + + if not real_create_res["status"]: + return public.return_message(-1, 0,real_create_res["msg"]) + + tt_task_id = real_create_res["data"]["task_id"] + db = FileTransferDB() + tt = FileTransferTask( + source_node={"node_id": source_node_id}, + target_node={"node_id": target_node_id}, + source_path_list=source_path_list, + target_path=target_path, + task_action=real_create_res["data"]["task_action"], + status="running", + created_by="local", + default_mode=default_mode, + target_task_id=tt_task_id, + is_source_node=node_db.is_local_node(source_node_id), + is_target_node=node_db.is_local_node(target_node_id), + ) + db.create_task(tt) + return public.return_message(-1, 0,tt.to_dict()) + + @classmethod + def node_create_filetransfer_task(cls, get): + from BTPanel import g + if not g.api_request: + return public.return_message(-1, 0,"Unable to activate") + + source_node = get.get("source_node/s", "") + target_node = get.get("target_node/s", "") + source_path_list = get.get("source_path_list/s", "") + target_path = get.get("target_path/s", "") + created_by = get.get("created_by/s", "") + default_mode = get.get("default_mode/s", "") + + try: + source_node = json.loads(source_node) + target_node = json.loads(target_node) + source_path_list = json.loads(source_path_list) + except Exception: + return public.return_message(-1, 0,"Parameter error") + if not target_path or not created_by or not default_mode or not source_node or not target_node or not source_path_list: + return public.return_message(-1, 0,"Parameter loss") + + ft_db = FileTransferDB() + task_data, err = ft_db.get_last_task() + if err: + return public.return_message(-1, 0,err) + if task_data and task_data["status"] not in ("complete", "failed"): + return public.return_message(-1, 0,"There is an ongoing task on the node, please wait for it to complete before submitting") + return cls._create_filetransfer_task( + source_node=source_node, + target_node=target_node, + source_path_list=source_path_list, + target_path=target_path, + created_by=created_by, + default_mode=default_mode + ) + + # 实际创建任务 + # 可能的情况 + # 1.source_node 是当前节点,target_node 是其他节点, 此时为上传 + # 2.target_node 是当前节点, 此时为下载 + @classmethod + def _create_filetransfer_task(cls, source_node: dict, + target_node: dict, + source_path_list: List[dict], + target_path: str, + created_by: str, + default_mode: str = "cover") -> Dict: + if source_node["name"] == "local": + task_action = "upload" + check_node = LocalNode() + if target_node["lpver"]: + t_node = LPanelNode(target_node["address"], target_node["api_key"], target_node["lpver"]) + err = t_node.test_conn() + else: + t_node = ServerNode(target_node["address"], target_node["api_key"], target_node["app_key"]) + err = t_node.test_conn() + # public.print_log(target_node["address"], err) + if err: + return public.return_message(-1, 0,"{} Node cannot connect, error message: {}".format(target_node["name"], err)) + elif target_node["name"] == "local": + task_action = "download" + if source_node["lpver"]: + check_node = LPanelNode(source_node["address"], source_node["api_key"], source_node["lpver"]) + err = check_node.test_conn() + else: + check_node = ServerNode(source_node["address"], source_node["api_key"], source_node["app_key"]) + err = check_node.test_conn() + # public.print_log(source_node["address"], err) + if err: + return public.return_message(-1, 0,"{} Node cannot connect, error message: {}".format(source_node["name"], err)) + else: + return public.return_message(-1, 0,"Node information that cannot be processed") + + if check_node.__class__ is ServerNode: + ver_check = check_node.filetransfer_version_check() + if ver_check: + return public.return_message(-1, 0,"{} Node check error::".format(source_node["name"]) + ver_check) + + target_path = target_path.rstrip("/") + file_list = [] + for src_item in source_path_list: + if src_item["is_dir"]: + f_list, err = check_node.dir_walk(src_item["path"]) + if err: + return public.return_message(-1, 0,err) + if not f_list: + src_item["dst_file"] = os.path.join(target_path, os.path.basename(src_item["path"])) + file_list.append(src_item) + else: + for f_item in f_list: + f_item["dst_file"] = f_item["path"].replace(os.path.dirname(src_item["path"]), target_path) + file_list.append(f_item) + else: + src_item["dst_file"] = os.path.join(target_path, os.path.basename(src_item["path"])) + file_list.append(src_item) + + if len(file_list) > 1000: + return public.return_message(-1, 0,"More than 1000 files, please compress before transferring") + + db = FileTransferDB() + tt = FileTransferTask( + source_node=source_node, + target_node=target_node, + source_path_list=source_path_list, + target_path=target_path, + task_action=task_action, + status="pending", + created_by=created_by, + default_mode=default_mode, + is_source_node=source_node["name"] == "local", + is_target_node=target_node["name"] == "local", + ) + err = db.create_task(tt) + if err: + return public.return_message(-1, 0,err) + ft_list = [] + for f_item in file_list: + ft = FileTransfer( + task_id=tt.task_id, + src_file=f_item["path"], + dst_file=f_item["dst_file"], + file_size=f_item["size"], + is_dir=f_item.get("is_dir", 0), + status="pending", + progress=0, + ) + ft_list.append(ft) + if not ft_list: + return public.return_message(-1, 0,"There are no files available for transfer") + err = db.batch_create_file_transfers(ft_list) + if err: + db.delete_task(tt.task_id) + return public.return_message(-1, 0,err) + + py_bin = public.get_python_bin() + log_file = "{}/task_{}.log".format(cls.log_dir, tt.task_id) + start_task = "nohup {} {}/script/node_file_transfers.py {} > {} 2>&1 &".format( + py_bin, + public.get_panel_path(), + tt.task_id, + log_file, + ) + res = public.ExecShell(start_task) + wait_timeout = wait_running(tt.task_id, timeout=10.0) + if wait_timeout: + return public.return_message(-1, 0,wait_timeout) + return public.return_message(0, 0,tt.to_dict()) + + @staticmethod + def file_list(get): + node_id = get.get("node_id/d", -1) + p = get.get("p/d", 1) + row = get.get("showRow/d", 50) + path = get.get("path/s", "") + search = get.get("search/s", "") + + if node_id == -1: + return public.return_message(-1, 0,"Node parameter error") + if node_id == 0: + node = LocalNode() + else: + node = ServerNode.new_by_id(node_id) + + if not node: + return public.return_message(-1, 0,"Node does not exist") + + if not path: + return public.return_message(-1, 0,"Path parameter error") + + data, err = node.file_list(path, p, row, search) + if err: + return public.return_message(-1, 0,err) + if "status" not in data and "message" not in data:return public.return_message(0, 0,data) + return data + + @staticmethod + def delete_file(get): + node_id = get.get("node_id/d", -1) + if node_id == -1: + return public.return_message(-1, 0,"Node parameter error") + if node_id == 0: + node = LocalNode() + else: + node = ServerNode.new_by_id(node_id) + + if not node: + return public.return_message(-1, 0,"Node does not exist") + + path = get.get("path/s", "") + is_dir = get.get("is_dir/d", 0) + if not path: + return public.return_message(-1, 0,"Path parameter error") + res=node.remove_file(path, is_dir=is_dir == 1) + if res.get('status',-1)==0: return public.return_message(0, 0,res.get('message',{}).get('result',"File deleted successfully")) + if res.get('result','')=='File moved to recycle bin': return public.return_message(0, 0,res.get('msg',"File moved to recycle bin")) + if res.get('result','')=='Successfully deleted file': return public.return_message(0, 0,res.get('msg',"Successfully deleted file")) + if res.get('result','')=='Directory moved to recycle bin!': return public.return_message(0, 0,res.get('msg',"Directory moved to recycle bin!")) + return public.return_message(-1, 0,res.get('msg',"File delete failed")) + # return node.remove_file(path, is_dir=is_dir == 1) + + def transfer_status(self, get): + ws: simple_websocket.Server = getattr(get, '_ws', None) + if not ws: + return jpublic.return_message(-1, 0,"Please use WebSocket connection") + + ft_db = FileTransferDB() + task_data, err = ft_db.get_last_task() + if err: + ws.send(json.dumps({"type": "error", "msg": err})) + return + if not task_data: + ws.send(json.dumps({"type": "end", "msg": "No tasks"})) + return + task = FileTransferTask.from_dict(task_data) + if task.target_task_id: + if task.task_action == "upload": + run_node_id = task.source_node["node_id"] + else: + run_node_id = task.target_node["node_id"] + run_node = ServerNode.new_by_id(run_node_id) + res = run_node.get_transfer_status(task.target_task_id) + if not res["status"]: + ws.send(json.dumps({"type": "error", "msg": res["msg"]})) + return + if res["data"]["task"]["status"] in ("complete", "failed"): + task.status = res["data"]["task"]["status"] + task.completed_at = res["data"]["task"]["completed_at"] + ft_db.update_task(task) + res_data = res["data"] + res_data["type"] = "end" + res_data["msg"] = "Mission completed" + ws.send(json.dumps(res_data)) + return + + run_node.proxy_transfer_status(task.target_task_id, ws) + else: + if task.status in ("complete", "failed"): + data, _ = ft_db.last_task_all_status() + data.update({"type": "end", "msg": "Mission completed"}) + ws.send(json.dumps(data)) + return + self._proxy_transfer_status(task, ws) + + def node_proxy_transfer_status(self, get): + ws: simple_websocket.Server = getattr(get, '_ws', None) + if not ws: + return public.return_message(-1, 0, "Please use WebSocket connection") + task_id = get.get("task_id/d", 0) + if not task_id: + ws.send(json.dumps({"type": "error", "msg": "Task ID parameter error"})) + return + ft_db = FileTransferDB() + task_data, err = ft_db.get_task(task_id) + if err: + ws.send(json.dumps({"type": "error", "msg": err})) + return + + task = FileTransferTask.from_dict(task_data) + if task.status in ("complete", "failed"): + data, _ = ft_db.last_task_all_status() + data["type"] = "end" + data["msg"] = "Mission completed" + ws.send(json.dumps(data)) + return + self._proxy_transfer_status(task, ws) + + @staticmethod + def _proxy_transfer_status(task: FileTransferTask, ws: simple_websocket.Server): + def call_log(data): + if isinstance(data, str): + ws.send(json.dumps({"type": "end", "msg": data})) + else: + if data["task"]["status"] in ("complete", "failed"): + data["msg"] = "Mission completed" + data["type"] = "end" + else: + data["type"] = "status" + data["msg"] = "Task in progress" + ws.send(json.dumps(data)) + + task_running_log(task.task_id, call_log) + + @staticmethod + def get_transfer_status(get): + task_id = get.get("task_id/d", 0) + if not task_id: + return public.return_message(-1, 0, "Task ID parameter error") + + ft_db = FileTransferDB() + task_data, err = ft_db.get_task(task_id) + if err: + return public.return_message(-1, 0, err) + task = FileTransferTask.from_dict(task_data) + file_list = ft_db.get_task_file_transfers(task_id) + return public.return_message(0, 0, { + "task": task.to_dict(), + "file_list": file_list, + }) + + @staticmethod + def upload_check(get): + node_id = get.get("node_id/d", -1) + if node_id == -1: + return public.return_message(-1, 0,"Node parameter error") + if node_id == 0: + node = LocalNode() + else: + node = ServerNode.new_by_id(node_id) + + if not node: + return public.return_message(-1, 0,"Node does not exist") + filename = get.get("files/s", "") + if "\n" in filename: + f_list = filename.split("\n") + else: + f_list = [filename] + res, err = node.upload_check(f_list) + if err: + return public.return_message(-1, 0,err) + if 'message' not in res and 'status' not in res:return public.return_message(0, 0,res) + return res + + @staticmethod + def dir_size(get): + node_id = get.get("node_id/d", -1) + if node_id < 0: + return public.return_message(-1, 0,"Node parameter error") + if node_id == 0: + node = LocalNode() + else: + node = ServerNode.new_by_id(node_id) + + if not node: + return public.return_message(-1, 0,"Node does not exist") + path = get.get("path/s", "") + size, err = node.dir_size(path) + if err: + return public.return_message(-1, 0,err) + return public.return_message(0, 0, { + "size": public.to_size(size), + "size_b": size, + }) + + @staticmethod + def create_dir(get): + node_id = get.get("node_id/d", -1) + if node_id < 0: + return public.return_message(-1, 0,"Node parameter error") + if node_id == 0: + node = LocalNode() + else: + node = ServerNode.new_by_id(node_id) + + if not node: + return public.return_message(-1, 0,"Node does not exist") + + path = get.get("path/s", "") + res, err = node.create_dir(path) + if err: + return public.return_message(-1, 0,err) + # if res["status"]: + # return public.return_message(0, 0,res["msg"]) + return public.return_message(0, 0,"Successfully created directory") + # return res + + @staticmethod + def delete_dir(get): + node_id = get.get("node_id/d", -1) + if node_id < 0: + return public.return_message(-1, 0,"Node parameter error") + if res["status"]: + return public.return_message(0, 0,res["msg"]) + return public.return_message(-1, 0,res["msg"]) + + @staticmethod + def node_get_dir(get): + node_id = get.get("node_id/d", -1) + if node_id < 0: + return public.return_message(-1, 0,"Node parameter error") + if node_id == 0: + node = LocalNode() + else: + node = ServerNode.new_by_id(node_id) + + if not node: + return public.return_message(-1, 0,"Node does not exist") + + search = get.get("search/s", "") + disk = get.get("disk/s", "") + path = get.get("path/s", "") + return node.get_dir(path, search, disk) \ No newline at end of file diff --git a/mod/project/node/filetransfer/__init__.py b/mod/project/node/filetransfer/__init__.py new file mode 100644 index 00000000..ca438e3f --- /dev/null +++ b/mod/project/node/filetransfer/__init__.py @@ -0,0 +1,198 @@ +import os +import time +import threading +from datetime import datetime + +from .socket_server import StatusServer, StatusClient, register_cleanup +from mod.project.node.dbutil import FileTransferDB, FileTransfer, FileTransferTask +from mod.project.node.nodeutil import ServerNode, LocalNode, LPanelNode +from typing import Optional, Callable, Union + + +class Filetransfer: + SOCKET_FILE_DIR = "/tmp/filetransfer" + if not os.path.exists(SOCKET_FILE_DIR): + os.mkdir(SOCKET_FILE_DIR) + + def __init__(self, task_id: int): + self.ft_db = FileTransferDB() + task_data, err = self.ft_db.get_task(task_id) + if err is None: + raise ValueError(err) + + self.task = FileTransferTask.from_dict(task_data) + + file_list = self.ft_db.get_task_file_transfers(task_id) + if not file_list: + raise ValueError("task_id:{} file_list is empty".format(task_id)) + + self.file_map = {file_data["transfer_id"]: FileTransfer.from_dict(file_data) for file_data in file_list} + self.file_count = len(self.file_map) + self.file_complete = sum([1 for file in self.file_map.values() if file.status == "complete"]) + self.file_error = sum([1 for file in self.file_map.values() if file.status == "error"]) + self.count_size = sum([file.file_size for file in self.file_map.values()]) + self.complete_size = sum([file.file_size for file in self.file_map.values() if file.status == "complete"]) + self.current_file_size = 0 # 记录当前文件完成的大小 + self._srv = StatusServer(self.get_task_status, self.SOCKET_FILE_DIR + "/task_" + str(task_id)) + + if self.task.task_action == "upload": + self.sn = LocalNode() + if self.task.target_node["lpver"]: + self.dn = LPanelNode(self.task.target_node["address"], self.task.target_node["api_key"], + self.task.target_node["lpver"]) + else: + self.dn = ServerNode(self.task.target_node["address"], self.task.target_node["api_key"], + self.task.target_node["app_key"]) + else: + if self.task.source_node["lpver"]: + self.sn = LPanelNode(self.task.source_node["address"], self.task.source_node["api_key"], + self.task.source_node["lpver"]) + else: + self.sn = ServerNode(self.task.source_node["address"], self.task.source_node["api_key"], + self.task.source_node["app_key"]) + self.dn = LocalNode() + + self._close_func: Optional[Callable]= None + + def get_task_status(self, init: bool = False) -> dict: + task_dict = self.task.to_dict() + task_dict.update({ + "file_count": self.file_count, + "file_complete": self.file_complete, + "file_error": self.file_error, + "count_size": self.count_size, + "complete_size": self.complete_size, + "progress": (self.complete_size + self.current_file_size) * 100 / self.count_size if self.count_size > 0 else 0, + }) + return { + "task": task_dict, + "file_status_list": [{ + "source_path": file.src_file, + "target_path": file.dst_file, + "status": file.status, + "progress": file.progress, + "log": file.message, + } for file in self.file_map.values()], + } + + def start_server(self): + t = threading.Thread(target=self._srv.start_server, args=(), daemon=True) + t.start() + register_cleanup(self._srv) + def close(): + self._srv.stop() + + self._close_func = close + + def close(self): + if self._close_func is None: + return + self._close_func() + + def update_status(self): + self._srv.update_status() + + def run(self): + self.task.status = "running" + self.ft_db.update_task(self.task) + self.start_server() + + pending_list = [file for file in self.file_map.values() if file.status == "pending"] + for file in pending_list: + if file.is_dir > 0: + # 空文件夹处理部分 + exits, _ = self.dn.target_file_exits(file.dst_file) + if exits: + file.progress = 100 + file.status = "complete" + self.ft_db.update_file_transfer(file) + continue + res, err = self.dn.create_dir(path=file.dst_file) + if err: + file.progress = 0 + file.status = "failed" + file.message = err + else: + if res["status"]: + file.progress = 100 + file.status = "complete" + else: + file.progress = 0 + file.status = "failed" + file.message = res["msg"] + self.ft_db.update_file_transfer(file) + continue + + + file.status = "running" + file.started_at = datetime.now() + self.ft_db.update_file_transfer(file) + + def call_log(progress, log): + file.progress = progress + self.current_file_size = file.file_size * progress // 100 + self.ft_db.update_file_transfer(file) + self.update_status() + + if self.task.task_action == "upload": + self.ft_db.update_file_transfer(file) + res = self.dn.upload_file( + filename=file.src_file, + target_path=os.path.dirname(file.dst_file), + mode=self.task.default_mode, + call_log=call_log, + ) + else: + self.ft_db.update_file_transfer(file) + res = self.sn.download_file( + filename=file.src_file, + target_path=os.path.dirname(file.dst_file), + mode=self.task.default_mode, + call_log=call_log, + ) + + self.current_file_size = 0 + + if res: + file.status = "failed" + file.message = res + self.file_error += 1 + else: + file.status = "complete" + file.progress = 100 + self.file_complete += 1 + self.complete_size += file.file_size + + self.ft_db.update_file_transfer(file) + self.update_status() + + if self.file_error == 0: + self.task.status = "complete" + else: + self.task.status = "failed" + self.ft_db.update_task(self.task) + self.update_status() + time.sleep(10) + self.close() + + +def run_file_transfer_task(task_id: int): + ft = Filetransfer(task_id) + ft.run() + +def task_running_log(task_id: int, call_log: Callable[[Union[str,dict]], None]): + socket_file = Filetransfer.SOCKET_FILE_DIR + "/task_" + str(task_id) + if not os.path.exists(socket_file): + call_log("The task status link does not exist") + return + s_client = StatusClient(socket_file, callback=call_log) + s_client.connect() + +def wait_running(task_id: int, timeout:float = 3.0) -> str: + socket_file = Filetransfer.SOCKET_FILE_DIR + "/task_" + str(task_id) + while not os.path.exists(socket_file): + if timeout <= 0: + return "Task startup timeout" + timeout -= 0.05 + time.sleep(0.05) + return "" \ No newline at end of file diff --git a/mod/project/node/filetransfer/socket_server.py b/mod/project/node/filetransfer/socket_server.py new file mode 100644 index 00000000..2535f243 --- /dev/null +++ b/mod/project/node/filetransfer/socket_server.py @@ -0,0 +1,300 @@ +import json +import socket +import struct +import sys +import threading +import os +import atexit +from typing import Callable, Any, Union, Tuple, Optional, List + + +class StatusServer: + def __init__(self, get_status_func: Callable[[bool], Any], server_address: Union[str, Tuple[str, int]]): + """ + 初始化服务端 + :param get_status_func: 获取状态的函数,返回当前进程状态字典, 支持一个参数 init, + 当init为True时,表示获取初始化状态,否则为更新状态 + :param server_address: 本地套接字文件路径(Unix域)或 (host, port)(TCP) + """ + self.get_status_func = get_status_func + self.server_address = server_address + self.clients: List[socket.socket] = [] + self.lock = threading.Lock() # 线程锁 + self.running = False + self.server_socket = None + + def handle_client(self, client_socket): + """处理客户端连接""" + try: + # 发送初始状态 + new_status = self.get_status_func(True) + status_bytes = json.dumps(new_status).encode() # 使用 JSON 更安全 + packed_data = len(status_bytes).to_bytes(4, 'little') + status_bytes # 添加长度头 + + # 添加到客户端列表 + try: + # 分块发送 + client_socket.sendall(packed_data) # 发送结束标志 + except Exception as e: + print(f"Failed to send update to client: {e}") + client_socket.close() + return + + with self.lock: + self.clients.append(client_socket) + + # 保持连接以支持后续更新 + while self.running: + try: + # 可选:接收客户端心跳或命令 + data = client_socket.recv(1024) + if not data: + break + except: + break + + finally: + # 关闭连接并从列表中移除 + client_socket.close() + with self.lock: + if client_socket in self.clients: + self.clients.remove(client_socket) + + def start_server(self): + """启动本地套接字服务端""" + self.running = True + + if isinstance(self.server_address, str): + # Unix 域套接字 + self.server_socket = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) + try: + os.unlink(self.server_address) + except OSError: + if os.path.exists(self.server_address): + raise + self.server_socket.bind(self.server_address) + else: + # TCP 套接字 + self.server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) + self.server_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) + self.server_socket.bind(self.server_address) + + self.server_socket.listen(5) + print(f"Server is listening on {self.server_address}...") + + try: + self.running = True + while self.running: + client_socket, _ = self.server_socket.accept() + print("Client connected") + + # 启动新线程处理客户端 + client_thread = threading.Thread(target=self.handle_client, args=(client_socket,)) + client_thread.start() + except KeyboardInterrupt: + print("Shutting down server...") + finally: + self.stop() + + def stop(self): + """停止服务端并清理资源""" + if not self.running: + return + self.running = False + + with self.lock: + for client in self.clients: + client.close() + self.clients.clear() + + if self.server_socket: + self.server_socket.close() + self.server_socket = None + + # 清理 Unix 套接字文件 + if isinstance(self.server_address, str) and os.path.exists(self.server_address): + os.remove(self.server_address) + print(f"Socket file removed: {self.server_address}") + + def update_status(self, update_data: Optional[dict]=None): + """获取最新的状态并推送给所有客户端""" + if not update_data: + new_status = self.get_status_func(False) + else: + new_status = update_data + status_bytes = json.dumps(new_status).encode() # 使用 JSON 更安全 + packed_data = len(status_bytes).to_bytes(4, 'little') + status_bytes # 添加长度头 + + with self.lock: + for client in self.clients: + print("Sending update to client...") + print(len(status_bytes), status_bytes, packed_data) + try: + client.sendall(packed_data) # 直接发送完整数据 + except Exception as e: + print(f"Failed to send update to client: {e}") + client.close() + if client in self.clients: + self.clients.remove(client) + + +class StatusClient: + def __init__(self, server_address, callback=None): + """ + 初始化客户端 + :param server_address: Unix 域路径(字符串) 或 TCP 地址元组 (host, port) + :param callback: 接收到状态更新时的回调函数,接受一个 dict 参数 + """ + self.server_address = server_address + self.callback = callback + self.sock: Optional[socket.socket] = None + self.running = False + self.receive_thread = None + + def connect(self): + """连接到服务端""" + if isinstance(self.server_address, str): + print("Connecting to Unix socket...", self.server_address) + # Unix 域套接字 + self.sock = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) + self.sock.connect(self.server_address) + else: + # TCP 套接字 + self.sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) + self.sock.connect(self.server_address) + + print("Connected to server.") + + # 启动接收线程 + self.running = True + self.receive_thread = threading.Thread(target=self._receive_loop, daemon=True) + self.receive_thread.start() + + def _receive_loop(self): + buffer = b'' + while self.running: + try: + # 读取长度头 + while len(buffer) < 4: + data = self.sock.recv(4) + if not data: + raise ConnectionResetError("Server closed the connection") + buffer += data + length = int.from_bytes(buffer[:4], 'little') + buffer = buffer[4:] + + # 读取完整数据 + while len(buffer) < length: + data = self.sock.recv(length - len(buffer)) + if not data: + raise ConnectionResetError("Server closed the connection") + buffer += data + message = buffer[:length] + buffer = buffer[length:] + + # 解析JSON + status = json.loads(message.decode()) + if self.callback: + self.callback(status) + except ConnectionResetError as e: + print("Connection interrupted:", e) + self.disconnect() + break + except json.JSONDecodeError as e: + print("JSON parsing failed:", e) + continue + except Exception as e: + print("reception error:", e) + self.disconnect() + break + + def disconnect(self): + """断开连接""" + self.running = False + if self.sock: + self.sock.close() + self.sock = None + print("Disconnected from server.") + + def stop(self): + """停止客户端""" + self.disconnect() + if self.receive_thread and self.receive_thread.is_alive(): + self.receive_thread.join() + print("Client stopped.") + + def wait_receive(self): + if self.receive_thread and self.receive_thread.is_alive(): + self.receive_thread.join() + + +# 注册退出清理钩子 +def register_cleanup(server_instance): + def cleanup(): + server_instance.stop() + + atexit.register(cleanup) + +# # 示例使用 +# if __name__ == '__main__' and "server" in sys.argv: +# +# import time +# +# # 模拟的状态存储 +# process_status = { +# 'process1': 'running', +# 'process2': 'stopped', +# "big_data": "" +# } +# +# def get_status(): +# return process_status +# +# # 设置 Unix 域套接字地址 +# server_address = './socket_filetransfer.sock' +# +# # 创建服务端实例 +# server = StatusServer(get_status, server_address) +# register_cleanup(server) # 注册退出时清理 +# +# # 启动服务端线程 +# server_thread = threading.Thread(target=server.start_server) +# server_thread.daemon = True +# server_thread.start() +# +# # 模拟状态更新 +# try: +# while True: +# print(">>>>>>>change<<<<<<<<<<<<<<<") +# time.sleep(5) +# process_status['process1'] = 'stopped' if process_status['process1'] == 'running' else 'running' +# server.update_status() +# +# time.sleep(5) +# process_status['process2'] = 'running' if process_status['process2'] == 'stopped' else 'stopped' +# server.update_status() +# except KeyboardInterrupt: +# pass +# +# # 示例使用 +# if __name__ == '__main__' and "client" in sys.argv: +# # Unix 域套接字示例: +# server_address = './socket_filetransfer.sock' +# +# # 示例回调函数 +# def on_status_update(status_dict): +# print("[Callback] New status received:") +# for k, v in status_dict.items(): +# print(f" - {k}: {v}") +# +# +# client = StatusClient(server_address, callback=on_status_update) +# try: +# client.connect() +# +# # 主线程保持运行,防止程序退出 +# while client.running: +# pass +# except KeyboardInterrupt: +# print("Client shutting down...") +# client.stop() diff --git a/mod/project/node/nodeMod.py b/mod/project/node/nodeMod.py new file mode 100644 index 00000000..9e6e1db4 --- /dev/null +++ b/mod/project/node/nodeMod.py @@ -0,0 +1,561 @@ +import json +import os.path +import threading +import traceback +import public +from mod.base import json_response +from mod.base.ssh_executor import test_ssh_config +try: + from mod.project.node.nodeutil import ServerNode, LocalNode, monitor_node_once_with_timeout +except: + # 定义处理h11的命令变量 + cmd_h11 = "cd /www/server/panel/pyenv/bin && source activate && H11_VERSION=$(./pip3 show h11 | grep -i Version | awk '{print $2}') && if [ \"$H11_VERSION\" != \"0.14.0\" ]; then ./pip3 uninstall h11 -y; fi; ./pip3 install h11==0.14.0" + + # 定义处理wsproto的命令变量 + cmd_wsproto = "cd /www/server/panel/pyenv/bin && source activate && WSPROTO_VERSION=$(./pip3 show wsproto | grep -i Version | awk '{print $2}') && if [ \"$WSPROTO_VERSION\" != \"1.2.0\" ]; then ./pip3 uninstall wsproto -y; fi; ./pip3 install wsproto==1.2.0" + public.ExecShell(cmd_h11) + public.ExecShell(cmd_wsproto) + from mod.project.node.nodeutil import ServerNode, LocalNode, monitor_node_once_with_timeout +from mod.project.node.dbutil import Node, ServerNodeDB, ServerMonitorRepo +from mod.project.node.task_flow import flow_useful_version + + +class main(): + node_db_obj = ServerNodeDB() + node_db_file =node_db_obj._DB_FILE + def __init__(self): + # self.node_db_obj = ServerNodeDB() + self.tip_file = public.get_panel_path() + "/data/mod_node_used.pl" + self.show_mode_file = public.get_panel_path() + "/data/mod_node_show_mode.pl" + + def add_node(self, get): + """ + 增加节点 + :param get: address节点地址 api_key节点API Key remarks节点备注 category_id节点分类ID + :return: + """ + ssh_conf = get.get('ssh_conf', "{}") + try: + get.ssh_conf = json.loads(ssh_conf) + except Exception: + return public.return_message(-1, 0,"SSH_conf data format error") + n, err = Node.from_dict(get) + if not n: + return public.return_message(-1, 0, err) + public.set_module_logs("nodes_node_adds_9", "add_node") + if n.app_key or n.api_key: + err = ServerNode.check_api_key(n) + if err: + return public.return_message(-1, 0, err) + else: + # ssh 节点,不用处理 + pass + + n.server_ip = n.parse_server_ip() + err = ServerNodeDB().create_node(n) + if err: + return public.return_message(-1, 0, err) + node = ServerNodeDB().get_node_by_id(n.id) + if node: + monitor_node_once_with_timeout(node) + return public.return_message(0, 0, "Node added successfully") + + @staticmethod + def bind_app(get): + n, err = Node.from_dict(get) + if not n: + return public.return_message(-1, 0, err) + if not n.app_key: + return public.return_message(-1, 0, "Please specify the app key to bind to") + srv = ServerNode("", "", n.app_key) + res = srv.app_bind() + if res: + return public.return_message(-1, 0, res) + else: + return public.return_message(0, 0, "Binding request has been sent out") + + @staticmethod + def bind_app_status(get): + n, err = Node.from_dict(get) + if not n: + return public.return_message(-1, 0, err) + if not n.app_key: + return public.return_message(-1, 0, "Please specify the app key to bind to") + srv = ServerNode("", "", n.app_key) + res = srv.app_bind_status() + if res: + return public.return_message(-1, 0, res) + else: + return public.return_message(0, 0, "Binding successful") + + + def del_node(self, get): + """ + 删除节点 + :param get: ids节点ID + :return: + """ + node_ids = get.get('ids', "") + if not node_ids: + return public.return_message(-1, 0, "Node ID cannot be empty, at least one") + try: + node_ids = json.loads(node_ids) + if not isinstance(node_ids, list) and isinstance(node_ids, int): + node_ids = [node_ids] + except Exception: + return public.return_message(-1, 0, "The format of the node ID data passed in is incorrect") + + srv_db = ServerNodeDB() + for node_id in node_ids: + if srv_db.is_local_node(node_id): + continue + err = srv_db.delete_node(node_id) + if err: + return public.return_message(-1, 0, err) + return public.return_message(0, 0, "Node deleted successfully") + + def update_node(self, get): + """ + 更新节点 + :param get: id节点ID address节点地址 api_key节点API Key remarks节点备注 category_id节点分类ID + :return: + """ + node_id = get.get('id/d', 0) + ssh_conf = get.get('ssh_conf', "{}") + try: + get.ssh_conf = json.loads(ssh_conf) + except Exception: + return public.return_message(-1, 0, "SSH_conf data format error") + if not node_id: + return public.return_message(-1, 0, "Node ID cannot be empty") + n, err = Node.from_dict(get) + if not n: + return public.return_message(-1, 0, err) + if n.app_key or n.api_key: + err = ServerNode.check_api_key(n) + if err: + return public.return_message(-1, 0, err) + + n.server_ip = n.parse_server_ip() + srv_db = ServerNodeDB() + err = srv_db.update_node(n, with_out_fields=["id", "status", "error", "error_num"]) + if err: + return public.return_message(-1, 0,err) + node = ServerNodeDB().get_node_by_id(n.id) + if node: + monitor_node_once_with_timeout(node) + return public.return_message(0, 0, "Node update successful") + + def default_show_mode(self) -> str: + if not os.path.exists(self.show_mode_file): + return "list" + show_mode = public.readFile(self.show_mode_file) + if not show_mode: + return "list" + if show_mode not in ["list", "block"]: + return "list" + return show_mode + + def set_show_mode(self, mode_name: str): + if mode_name not in ["list", "block"]: + return False + if mode_name == "block": + public.set_module_logs("node_show_block", "node_show_block") + public.writeFile(self.show_mode_file, mode_name) + return True + + def get_node_list(self, get): + """ + 获取节点列表 + :param get: p页码 limit每页数量 search搜索关键字 category_id分类ID + :return: + """ + page_num = max(int(get.get('p/d', 1)), 1) + limit = max(int(get.get('limit/d', 10)), 10) + search = get.get('search', "").strip() + category_id = get.get('category_id/d', -1) + refresh = get.get('refresh/s', "") + show_mode = get.get('show_mode/s', "") + if not show_mode or show_mode not in ["list", "block"]: + show_mode = self.default_show_mode() + else: + if not self.set_show_mode(show_mode): + show_mode = self.default_show_mode() + + if show_mode == "block": # 返回所有数据 + page_num = 1 + limit = 9999999 + + srv_db = ServerNodeDB() + data, err = srv_db.get_node_list(search, category_id, (page_num - 1) * limit, limit) + if err: + return public.return_message(-1, 0, err) + + if refresh and refresh == "1": + th_list = [] + for node in data: + th = threading.Thread(target=monitor_node_once_with_timeout, args=(node,5)) + th.start() + th_list.append(th) + + for th in th_list: + th.join() + + for node in data: + if isinstance(node["ssh_conf"], str): + node["ssh_conf"] = json.loads(node["ssh_conf"]) + if isinstance(node["error"], str): + node["error"] = json.loads(node["error"]) + if node["app_key"] == "local" and node["api_key"] == "local": + node["address"] = public.getPanelAddr() + if node["lpver"] and not node["remarks"].endswith(" | 1Panel"): + node["remarks"] = node["remarks"] + " | 1Panel" + node_data = self.get_node_data(node) + node['data'] = node_data + count = srv_db.node_count(search, category_id) + page = public.get_page(count, page_num, limit) + page["data"] = data + page["show_mode"] = show_mode + return public.return_message(0, 0,page) + + @staticmethod + def get_node_data(node: dict): + if node["app_key"] == "local" and node["api_key"] == "local": + data = ServerMonitorRepo.get_local_server_status() + else: + srv_m = ServerMonitorRepo() + if srv_m.is_reboot_wait(node["server_ip"]): + return {'status': 4, 'msg': "Server restart in progress..."} + # public.print_log("get_node_data-------------------------1:{}".format(node["id"])) + data = srv_m.get_server_status(node['id']) + # public.print_log("get_node_data------------data----------2---:{}".format(data)) + if data: + cpu_data = data.get('cpu', {}) + memory_data = data.get('mem', {}) + if cpu_data and memory_data: + return { + 'status': 0, + 'cpu': cpu_data[0], + 'cpu_usage': cpu_data[1], + 'memory': round(float(memory_data['memRealUsed']) / float(memory_data['memTotal']) * 100, 2), + 'mem_usage': memory_data['memRealUsed'], + 'memNewTotal': memory_data.get('memNewTotal', "") or public.to_size( + memory_data['memTotal'] * 1024 * 1024) + } + return {'status': 2, 'msg': "Failed to obtain node data"} + + def add_category(self, get): + """ + 添加分类 + :param get: + :return: + """ + name = get.get('name', "").strip() + srv_db = ServerNodeDB() + if not name: + return public.return_message(-1, 0, "Classification name cannot be empty") + if srv_db.category_exites(name): + return public.return_message(-1, 0, "The category name already exists") + err = srv_db.create_category(name) + if err: + return public.return_message(-1, 0, err) + return public.return_message(0, 0, "Category added successfully") + + def del_category(self, get): + """ + 删除分类 + :param get: + :return: + """ + category_id = get.get('id/d', 0) + if not category_id: + return public.return_message(-1, 0, "Classification ID cannot be empty") + srv_db = ServerNodeDB() + if srv_db.category_exites(category_id): + srv_db.delete_category(category_id) + + return public.return_message(0, 0, "Category deleted successfully") + + def bind_node_to_category(self, get): + """ + 绑定节点到分类 可以批量绑定 + :param get: 如果传入单个node_id则是绑定单个,如果是传入列表则批量绑定 + :return: + """ + node_ids = get.get('ids', "") + category_id = get.get('category_id/d', 0) + try: + node_ids = json.loads(node_ids) + if not isinstance(node_ids, list) and isinstance(node_ids, int): + node_ids = [node_ids] + except Exception: + return public.return_message(-1, 0, "Node ID format error") + + if not node_ids: + return public.return_message(-1, 0, "Node ID cannot be empty, at least one") + + if category_id < 0: + return public.return_message(-1, 0, "Classification ID cannot be empty") + + srv_db = ServerNodeDB() + err = srv_db.bind_category_to_node(node_ids, category_id) + if err: + return public.return_message(-1, 0, err) + return public.return_message(0, 0, "Node grouping modification successful") + + def get_category_list(self, get): + """ + 获取分类列表 + :param get: + :return: + """ + try: + categorys = public.S('category', self.node_db_obj._DB_FILE).select() + return public.return_message(0, 0, categorys) + except Exception: + public.print_log(traceback.print_exc()) + return public.return_message(-1, 0, "Data query failed") + + @staticmethod + def get_panel_url(get): + """ + 获取目标面板的访问url + :param get: address节点地址 api_key节点API Key + :return: + """ + node_id = get.get('node_id/d', 0) + if not node_id: + return public.return_message(-1, 0, "node_id cannot be empty") + srv = ServerNode.new_by_id(node_id) + if not srv: + return public.return_message(-1, 0, "node_id does not exist") + token, err = srv.get_tmp_token() + if err: + return public.return_message(-1, 0, err) + target_panel_url = srv.origin + "/login?tmp_token=" + token + return public.return_message(0, 0, {'target_panel_url': target_panel_url}) + + @classmethod + def get_all_node(cls, get): + """ + @route /mod/node/node/get_all_node + @param query: str + @return: [ + { + "node_id": int, + "remarks": str, + "ip": str, + } + ] + """ + query_type = get.get('node_type/s', "api") + field_str = "id,remarks,server_ip,address,app_key,api_key,lpver,category_id,error_num,ssh_conf" + if query_type == "api": + data = public.S('node', cls.node_db_file).where("app_key != '' or api_key != ''", ()).field(field_str).select() + elif query_type == "ssh": + data = public.S('node', self.node_db_obj._DB_FILE).field(field_str).where("ssh_conf != '{}'", ()).select() + elif query_type == "file_src": + data = public.S('node', self.node_db_obj._DB_FILE).field(field_str).where( + "(app_key != '' or api_key != '') and lpver = ''", ()).select() + else: # all 除本机之外的节点 + data = public.S('node', self.node_db_obj._DB_FILE).where("api_key != 'local'", ()).field(field_str).select() + + srv_cache = ServerMonitorRepo() + for i in data: + i["has_ssh"] = bool(json.loads(i["ssh_conf"])) + i.pop("ssh_conf") + i["is_local"] = (i["app_key"] == "local" and i["api_key"] == "local") + i.pop("app_key") + i.pop("api_key") + if i["server_ip"] == "": + server_ip = ServerNode.get_node_ip(i['id']) + if server_ip: + i["server_ip"] = server_ip + if i["lpver"] and not i["remarks"].endswith(" | 1Panel"): + i["remarks"] = i["remarks"] + " | 1Panel" + + tmp_data = srv_cache.get_server_status(i['id']) + tmp_data = tmp_data or {} + if query_type == "file_src": + if not tmp_data and not i["is_local"]: + i["version"] = "" + i["useful_version"] = True + continue + if not i["is_local"] or not flow_useful_version(tmp_data.get('version', "")): + continue + else: + if not tmp_data: + i["version"] = "" + i["useful_version"] = True + continue + i['version'] = tmp_data.get('version', "") + i['useful_version'] = cls._useful_version(i['version']) + + return public.return_message(0, 0, data) + + @staticmethod + def _useful_version(ver: str): + try: + if ver == "1Panel": + return True + ver_list = [int(i) for i in ver.split(".")] + if ver_list[0] >= 10: + return True + elif ver_list[0] == 9 and ver_list[1] >= 7: + return True + except: + pass + return False + + @staticmethod + def get_node_sites(get): + """ + @route /mod/node/node/get_node_sites + @param node_id: int + @param query: str + @return: [ + { + "node_id": int, + "site_id": int, + "site_name": str, + "site_port": int + } + ] + """ + node_id = get.get('node_id/d', 0) + if not node_id: + return public.return_message(-1, 0, "node_id cannot be empty") + srv = ServerNode.new_by_id(node_id) + if not srv: + return public.return_message(-1, 0, "node_id does not exist") + data_list, err = srv.php_site_list() + if err: + return public.return_message(-1, 0, err) + return public.return_message(0, 0, data_list) + + @staticmethod + def php_site_list(get): + """ + @route /mod/node/node/php_site_list + @return: [ + { + "site_id": int, + "site_name": str, + "ports": []int, + "domains": []str, + "ssl":bool + } + ] + """ + return LocalNode().php_site_list()[0] + + def node_used_status(self, get): + if os.path.exists(self.tip_file): + return public.return_message(0, 0, "Used") + return public.return_message(-1, 0, "Unused") + + def set_used_status(self, get): + # 定义处理h11的命令变量 + cmd_h11 = "cd /www/server/panel/pyenv/bin && source activate && H11_VERSION=$(./pip3 show h11 | grep -i Version | awk '{print $2}') && if [ \"$H11_VERSION\" != \"0.14.0\" ]; then ./pip3 uninstall h11 -y; fi; ./pip3 install h11==0.14.0" + + # 定义处理wsproto的命令变量 + cmd_wsproto = "cd /www/server/panel/pyenv/bin && source activate && WSPROTO_VERSION=$(./pip3 show wsproto | grep -i Version | awk '{print $2}') && if [ \"$WSPROTO_VERSION\" != \"1.2.0\" ]; then ./pip3 uninstall wsproto -y; fi; ./pip3 install wsproto==1.2.0" + public.ExecShell(cmd_h11) + public.ExecShell(cmd_wsproto) + if os.path.exists(self.tip_file): + os.remove(self.tip_file) + else: + public.set_module_logs("nodes_installed_9", "set_used_status") + public.writeFile(self.tip_file, "True") + return public.return_message(0, 0, "Setup successful") + + + @staticmethod + def remove_ssh_conf(get): + node_id = get.get("node_id/d", 0) + ServerNodeDB().remove_node_ssh_conf(node_id) + return public.return_message(0, 0, "Deleted successfully") + + @staticmethod + def set_ssh_conf(get): + """设置ssh配置信息""" + host = get.get("host/s", "") + port = get.get("port/d", 22) + username = get.get("username/s", "root") + password = get.get("password/s", "") + pkey = get.get("pkey/s", "") + pkey_passwd = get.get("pkey_passwd/s", "") + node_id = get.get("node_id/d", 0) + test_case = get.get("test_case/d", 0) + + if not node_id and not test_case: + return public.return_message(-1, 0, "Node does not exist") + + if not host and node_id: + host = ServerNode.get_node_ip(node_id) + if not username: + username = "root" + if not host or not username or not port: + return public.return_message(-1, 0, "Host IP, host port, and user name cannot be empty") + if not password and not pkey: + return public.return_message(-1, 0, "Password or key cannot be empty") + + res = test_ssh_config(host, port, username, password, pkey, pkey_passwd) + if res: + return public.return_message(-1, 0, res) + if test_case: + return public.return_message(0, 0, "Test successful") + ServerNodeDB().set_node_ssh_conf(node_id, { + "host": host, + "port": port, + "username": username, + "password": password, + "pkey": pkey, + "pkey_passwd": pkey_passwd + }) + return public.return_message(0, 0, "Setup successful") + + @staticmethod + def get_sshd_port(get): + node_id = get.get("node_id/d", 0) + srv = ServerNode.new_by_id(node_id) + if not srv: + return public.return_message(-1, 0, "Node does not exist") + + port = srv.get_sshd_port() + if not port: + port = 22 + return public.return_message(0, 0, {"port": port}) + + + @staticmethod + def restart_bt_panel(get): + node_id = get.get("node_id/d", 0) + srv = ServerNode.new_by_id(node_id) + if not srv: + return public.return_message(-1, 0, "Node does not exist") + if srv.is_local: + return public.return_message(-1, 0, "The local node does not support this operation") + ret = srv.restart_bt_panel() + if ret.get("status"): + return public.return_message(0, 0, ret.get("msg")) + else: + return public.return_message(-1, 0, ret.get("msg")) + + + @staticmethod + def server_reboot(get): + node_id = get.get("node_id/d", 0) + srv = ServerNode.new_by_id(node_id) + if not srv: + return public.return_message(-1, 0, "Node does not exist") + if srv.is_local: + return public.return_message(-1, 0, "The local node does not support this operation") + repo = ServerMonitorRepo() + if repo.is_reboot_wait(srv.node_server_ip): + return public.return_message(-1, 0, "Node is restarting, please try again later") + ret = srv.server_reboot() + if ret.get("status"): + return public.return_message(0, 0, ret.get("msg")) + else: + return public.return_message(-1, 0, ret.get("msg")) \ No newline at end of file diff --git a/mod/project/node/nodeutil/__init__.py b/mod/project/node/nodeutil/__init__.py new file mode 100644 index 00000000..e48b1dc0 --- /dev/null +++ b/mod/project/node/nodeutil/__init__.py @@ -0,0 +1,11 @@ +from .base import * +from .ssh_wrap import SSHApi + +__all__ = [ + "ServerNode", + "LocalNode", + "LPanelNode", + "monitor_node_once_with_timeout", + "monitor_node_once", + "SSHApi" +] \ No newline at end of file diff --git a/mod/project/node/nodeutil/base.py b/mod/project/node/nodeutil/base.py new file mode 100644 index 00000000..b23992fc --- /dev/null +++ b/mod/project/node/nodeutil/base.py @@ -0,0 +1,1956 @@ +import hashlib +import html +import io +import ipaddress +import json +import os +import re +import shutil +import sys +import threading +import time +import socket +import platform +from uuid import uuid4 + +import math +import requests +import simple_websocket +import websocket +from werkzeug.datastructures import FileStorage +from datetime import datetime + +if "/www/server/panel/class" not in sys.path: + sys.path.insert(0, "/www/server/panel/class") + +import public +from typing import Optional, Tuple, List, Callable, Union, Any, Dict +from .one_panel_api import OnePanelApiClient +from mod.project.node.dbutil import Node, NodeAPPKey + +try: + from BTPanel import cache +except: + class _Cache: + def __init__(self): + self._data = {} + + def get(self, key): + return self._data.get(key, None) + + def set(self, key, value, timeout): + self._data[key] = value + + + cache = _Cache() + + +def _get_os_info() -> Tuple[str, str]: + os_data = public.readFile("/etc/os-release") + if not os_data: + return "", "" + + version = ["", ""] + for line in os_data.split("\n"): + if line.startswith("NAME="): + name = line.split("=")[1].replace('"', "").strip() + name_arr = name.split(" ") + if len(name_arr) > 1: + name = name_arr[0] + version[0] = name + elif line.startswith("VERSION="): + ver = line.split("=")[1].replace('"', "").strip() + ver_arr = ver.split(" ") + if len(ver_arr) > 1: + ver = ver_arr[0] + version[1] = ver + + version = " ".join(version) + return version, platform.machine() + + +class ServerNode: + is_local = False + node_db_file = public.get_panel_path() + "/data/db/node.db" + + def __init__(self, origin: str, api_key: str, app_key: str, remarks: str = "", timeout: int = 20): + self.origin = origin + self.api_key = api_key + self.app_key: Optional[NodeAPPKey] = Node.parse_app_key(app_key) + self.remarks = remarks + self.timeout = timeout + + @property + def node_server_ip(self): + from urllib.parse import urlparse + host = urlparse(self.origin).hostname + try: + if isinstance(host, str) and ipaddress.ip_address(host): + return host + except: + pass + try: + ip_address = socket.gethostbyname(host) + return ip_address + except socket.gaierror as e: + print(f"Error: {e}") + return host + + def app_bind(self) -> Optional[str]: + if self.app_key is None: + return "App key parsing failed, please confirm key information again" + version, arch = _get_os_info() + # public.print_log(self.app_key.app_token) + pdata = { + "bind_token": self.app_key.app_token, + "client_brand": "BT-Panel", + "client_model": "Linux" if not version else "Linux {} {}".format(version, arch) + } + header = { + 'Content-Type': 'application/x-www-form-urlencoded', + "User-Agent": "Bt-Panel/Node Manager" + } + bind_url = self.app_key.origin + "/check_bind" + try: + res = requests.post(bind_url, data=pdata, headers=header, verify=False, timeout=self.timeout) + if res.status_code != 200: + return "Binding request failed, returned status code:%s,响应信息为:%s" % (res.status_code, res.text) + res_str = res.text.strip() + if res_str == "0": + return "Binding failed, please check if your key is correct" + elif res_str == "1": + return None + else: + return "Binding failed, error message is:{}".format(json.loads(res_str)) + except Exception as e: + return "Network connection failed, unable to request to the target server" + + def app_bind_status(self) -> Optional[str]: + if self.app_key is None: + return "App key parsing failed, please confirm key information again" + pdata = {"bind_token": self.app_key.app_token} + header = { + 'Content-Type': 'application/x-www-form-urlencoded', + "User-Agent": "Bt-Panel/Node Manager" + } + bind_url = self.app_key.origin + "/get_app_bind_status" + try: + resp = requests.post(bind_url, data=pdata, headers=header, verify=False, timeout=self.timeout) + if not resp.status_code == 200: + return "Error in obtaining binding status response status code. Please check if the node address and API are correct. The current status code is {},The return information is {}".format( + resp.status_code, resp.text) + res_str = resp.text.strip() + if res_str == "0": + return "Your device is not bound, please try to rebind it" + elif res_str == "1": + return None + else: + return "Request binding status failed with error message:{}".format(json.loads(res_str)) + except Exception as e: + return "Failed to obtain binding status. Please check if the node app key is correct. The error message is:{}".format(str(e)) + + @classmethod + def new_by_id(cls, node_id: int) -> Optional[Union['ServerNode', 'LocalNode', 'LPanelNode']]: + data = public.S('node', cls.node_db_file).where("id = ?", (node_id,)).find() + if not data or not isinstance(data, dict): + return None + return cls.new_by_data(data) + + @classmethod + def new_by_data(cls, node_data: dict): + if node_data["api_key"] == "local" and node_data["app_key"] == "local": + return LocalNode() + + if node_data['lpver']: + lp = LPanelNode( + address=node_data['address'], + api_key=node_data['api_key'], + lpver=node_data['lpver'], + timeout=node_data.get('timeout', 20) + ) + lp.remarks = node_data['remarks'] + return lp + if not node_data["api_key"] and not node_data["app_key"]: + return None + + return cls( + origin=node_data['address'], + api_key=node_data['api_key'], + app_key=node_data['app_key'], + remarks=node_data['remarks'], + timeout=node_data.get('timeout', 20) + ) + + def show_name(self) -> str: + if self.remarks: + return "{}({})".format(self.remarks, self.origin) + return self.origin + + @staticmethod + def _get_node_ip(node_id: int) -> str: + data = public.S('node', public.get_panel_path() + "/data/db/node.db").where("id = ?", (node_id,)).find() + if not data or not isinstance(data, dict): + return "" + if data['address'].startswith("http"): + from urllib.parse import urlparse + host = urlparse(data['address']).hostname + else: + host = data['address'] + try: + if isinstance(host, str) and ipaddress.ip_address(host): + return host + except: + pass + try: + ip_address = socket.gethostbyname(host) + return ip_address + except socket.gaierror as e: + print(f"Error: {e}") + return "" + + @classmethod + def get_node_ip(cls, node_id: int) -> Optional[str]: + if public.S('node', cls.node_db_file).where("id=? AND app_key = 'local' AND api_key = 'local'", (node_id,)).count() > 0: + return "127.0.0.1" + cache_key = "mod_node_server_ip_{}".format(node_id) + c_ip = cache.get(cache_key) + if c_ip: + return c_ip + else: + ip = cls._get_node_ip(node_id) + if ip: + cache.set(cache_key, ip, 86400) + return ip + return None + + @classmethod + def check_api_key(cls, node: Node) -> str: + if not LPanelNode.check_api_key(node): # 如果1panel检查可以连接上,则标记为1panel并直接返回 + return "" + + node = cls(node.address, node.api_key, node.app_key) + data, err = node._request("/system", "GetSystemTotal") + if err: + return err + if isinstance(data, dict) and "version" in data: + return "" + if isinstance(data, dict) and not data:return "Validation error:Please check if the node information is correct" + return "Validation error:%s" % str(data) + + def test_conn(self) -> str: + data, err = self._request("/system", "GetSystemTotal") + if err: + return err + if isinstance(data, dict) and "version" in data: + return "" + return "Validation error:%s" % str(data) + + def version(self) -> Optional[str]: + data, err = self._request("/system", "GetSystemTotal") + if err: + return None + if isinstance(data, dict) and "version" in data: + return data["version"] + return None + + def get_net_work(self) -> Tuple[Optional[dict], str]: + data, err = self._request("/system", "GetNetWork") + if err: + return None, err + if isinstance(data, dict) and "cpu" in data and "mem" in data: + return data, "" + return None, "data in wrong format: %s" % str(data) + + def get_tmp_token(self) -> Tuple[str, str]: + data, err = self._request("/config", "get_tmp_token") + if err: + return "", err + if isinstance(data, dict) and "status" in data: + if data["status"] and "msg" in data: + return data["msg"], "" + return "", data.get("msg", str(data)) + if isinstance(data, dict) and "result" in data: + return data["result"], "" + return "", "data in wrong format: %s" % str(data) + + def get_bt_params(self, other_data: dict = None) -> Dict: + now = int(time.time() * 1000) + other_data = other_data or {} + if self.app_key: + md5_panel_key = hashlib.md5(self.app_key.request_token.encode()).hexdigest() + request_token = hashlib.md5("{}{}".format(now, md5_panel_key).encode()).hexdigest() + other_data["request_token"] = request_token + other_data["request_time"] = str(now) + form_data = json.dumps(other_data) + return { + "client_bind_token": self.app_key.app_token, + "form_data": public.aes_encrypt(form_data, self.app_key.app_key) + } + else: + md5_panel_key = hashlib.md5(self.api_key.encode()).hexdigest() + request_token = hashlib.md5("{}{}".format(now, md5_panel_key).encode()).hexdigest() + other_data["request_token"] = request_token + other_data["request_time"] = str(now) + return other_data + + def _request(self, path: str, action: str, pdata: dict = None) -> Tuple[Optional[any], str]: + url = "{}/v2{}".format(self.origin, path) + pdata = pdata or {} + bt_p = self.get_bt_params({"action": action, **pdata}) + header = { + 'Content-Type': 'application/x-www-form-urlencoded', + "User-Agent": "Bt-Panel/Node Manager" + } + try: + resp = requests.post(url, data=bt_p, headers=header, verify=False, timeout=self.timeout) + if not resp.status_code == 200: + return None, "The response status code is incorrect. Please check if the node address and API are correct. The current response status code is {}".format( + resp.status_code) + if self.app_key: + real_data = public.aes_decrypt(resp.text, self.app_key.app_key) + return json.loads(real_data).get('message',{}), "" + return resp.json().get('message',{}), "" + except Exception as e: + # public.print_error() + # return None, "请求节点失败,请检查节点地址和api是否正确,错误信息为:{}".format(str(e)) + if self.remarks: + return None, "Request node [{}] failed, please check if the node address and API are correct".format(self.remarks) + return None, "Node request failed, please check if the node address and API are correct" + + def get_file_body(self, path: str) -> Tuple[Optional[str], str]: + data, err = self._request("/files", "GetFileBody", pdata={"path": path}) + if err: + return None, err + if not isinstance(data, dict): + if isinstance(data, dict) and "msg" in data: + return None, data["msg"] + return None, "data in wrong format" + return data["data"], "" + + def php_site_list(self) -> Tuple[Optional[List[dict]], str]: + data, err = self._request("/mod/node/node/php_site_list", "", pdata={ + "type": -1, + "p": 1, + "limit": 1000, + "table": "sites", + "search": "", + }) + if err: + return None, err + + if not isinstance(data, list): + if isinstance(data, dict) and "msg" in data: + return None, data["msg"] + return None, "data in wrong format" + + return data, "" + + def create_php_site(self, site_name: str, port: int, **kwargs) -> Tuple[Optional[int], str]: + path = "/www/wwwroot/{}".format(site_name) + if port not in (80, 443): + path = "/www/wwwroot/{}_{}".format(site_name, port) + webname = { + "domain": site_name if port in (80, 443) else "{}:{}".format(site_name, port), + "domainlist": [], + "count": 0 + } + data, err = self._request("/site", "AddSite", pdata={ + "path": path, + "ftp": "false", + "type": "PHP", + "type_id": "0", + "ps": "{}【Load balancing node】".format(site_name), + "port": str(port), + "version": "00", + "sql": "false", + "webname": json.dumps(webname) + }) + + if err: + return None, err + if not isinstance(data, dict): + return None, "data in wrong format" + + if isinstance(data, dict) and "msg" in data and not data.get("status", True): + return None, data["msg"] + + site_id = data.get("siteId", None) + if not isinstance(site_id, int): + return None, "Data parsing error" + return site_id, "" + + def set_firewall_open(self, port: int, protocol: str = "tcp") -> Tuple[bool, str]: + data, err = self._request("/firewall/com/set_port_rule", "", pdata={ + "protocol": "udp" if protocol == "udp" else "tcp", + "port": str(port), + "choose": "all", + "types": "accept", + "chain": "INPUT", + "operation": "add", + "strategy": "accept", + }) + if err: + return False, err + + if isinstance(data, dict) and "msg" in data: + msg = data["msg"] + if "Port {} already exists".format(port) in msg: + return True, "" + elif "Setup successful" in msg: + return True, "" + return False, "Setup failed" + + def add_domain(self, site_id: int, site_name: str, domain: str, port: int) -> Tuple[bool, str]: + data, err = self._request("/site", "AddDomain", pdata={ + "domain": "{}:{}".format(domain, port), + "webname": site_name, + "id": str(site_id) + }) + if err: + return False, err + + if isinstance(data, dict) and "domains" in data: + for d in data["domains"]: + if d["name"] == domain: + if "Already bound" in d["msg"]: + return True, "" + elif "Added successfully" in d["msg"]: + return True, "" + return False, "Add failed, the target machine returned information as:{}".format( + data.get("msg", str(data)) if isinstance(data, dict) else str(data)) + + def has_domain(self, site_id: int, domain: str) -> bool: + data, err = self._request("/data", "getData", pdata={ + "table": "domain", + "list": "True", + "search": str(site_id) + }) + if err: + return False + if not isinstance(data, list): + return False + for d in data: + if d["name"] == domain: + return True + return False + + # mode -> cover: 覆盖,ignore: 跳过,rename:重命名 + def upload_file(self, filename: str, target_path: str, mode: str = "cover", + call_log: Callable[[int, str], None] = None) -> str: + if not os.path.isfile(filename): + return "File: {} does not exist".format(filename) + + target_file = os.path.join(target_path, os.path.basename(filename)) + exits, err = self.target_file_exits(target_file) + if err: + return err + if exits and mode == "ignore": + call_log(0, "File upload:{} -> {},The target file already exists, skip uploading".format(filename, target_file)) + return "" + if exits and mode == "rename": + upload_name = "{}_{}".format(os.path.basename(filename), public.md5(filename)) + call_log(0, "File upload:{} -> {},The target file already exists, it will be renamed to {}".format(filename, target_file, upload_name)) + else: + upload_name = os.path.basename(filename) + + if os.path.getsize(filename) > 1024 * 1024 * 5: + return self._upload_big_file(filename, target_path, upload_name, call_log) + else: + return self._upload_little_file(filename, target_path, upload_name, call_log) + + def target_file_exits(self, target_file: str) -> Tuple[bool, str]: + data, err = self._request("/files", "upload_files_exists", pdata={ + "files": target_file, + }) + if err: + return False, err + if not isinstance(data, list): + return False, "data in wrong format: %s" % str(data) + for f in data: + if f["filename"] == target_file and f["exists"]: + return True, "" + return False, "" + + def upload_check(self, target_file_list: List[str]) -> Tuple[List[dict], str]: + data, err = self._request("/files", "upload_files_exists", pdata={ + "files": "\n".join(target_file_list), + }) + if err: + return [], err + if not isinstance(data, list): + if isinstance(data, dict): + return [], data.get("msg", "data in wrong format") + return [], "data in wrong format: %s" % str(data) + return data, "" + + def _upload_big_file(self, filename: str, target_path: str, upload_name: str, + call_log: Callable[[int, str], None] = None) -> str: + url = "{}/files".format(self.origin) + bt_p = self.get_bt_params({"action": "upload"}) + header = {"User-Agent": "Bt-Panel/Node Manager"} + try: + fb = open(filename, 'rb') + except Exception as e: + public.print_error() + return "File {} failed to open, please check file permissions, error message is:{}".format(filename, str(e)) + + file_size = os.path.getsize(filename) + for i in range(0, file_size, 1024 * 1024 * 5): + file_data = fb.read(1024 * 1024 * 5) + files = {'blob': ('blob', file_data, 'application/octet-stream')} + data = { + 'f_path': target_path, + 'f_name': upload_name, + 'f_size': file_size, + 'f_start': i, + } + data.update(bt_p) + try: + resp = requests.post(url, data=data, files=files, headers=header, verify=False, timeout=self.timeout) + if not resp.status_code == 200: + return "The response status code for uploading the file is incorrect. Please check if the node address and API are correct. The current status code is {}, and the return message is:{}".format( + resp.status_code, resp.text) + resp_text = resp.text + resp_json = {} + if self.app_key: + resp_text = public.aes_decrypt(resp_text, self.app_key.app_key).strip() + if not resp_text.isdecimal(): + resp_json = json.loads(resp_text) + else: + resp_json = resp.json() + + if resp_text.isdecimal(): + up_p = int(resp_text) + if up_p != i + len(file_data): + return "Upload file failed, file block size is inconsistent" + else: + call_log(up_p * 100 // file_size, "File upload:{} -> {},The uploaded size is:{}".format( + filename, upload_name, public.to_size(up_p))) + elif "status" in resp_json: + if not resp_json["status"]: + return "Upload file failed with error message:{}".format(resp_json["msg"]) + else: + call_log(100, "File upload:{} -> {},Upload successful".format(filename, upload_name)) + return "" + else: + return "Upload file failed, response message is:{}".format(resp_text) + except Exception as e: + public.print_error() + return "Upload file: {} failed with error message:{}".format(filename, str(e)) + return "" + + def _upload_little_file(self, filename: str, target_path: str, upload_name: str, + call_log: Callable[[int, str], None] = None) -> str: + url = "{}/files".format(self.origin) + bt_p = self.get_bt_params({"action": "upload"}) + header = {"User-Agent": "Bt-Panel/Node Manager"} + try: + with open(filename, 'rb') as f: + file_data = f.read() + except Exception as e: + public.print_error() + return "File {} failed to open, please check file permissions, error message is:{}".format(filename, str(e)) + + file_size = os.path.getsize(filename) + files = {'blob': ('blob', file_data, 'application/octet-stream')} + data = { + 'f_path': target_path, + 'f_name': upload_name, + 'f_size': file_size, + 'f_start': 0 + } + data.update(bt_p) + try: + resp = requests.post(url, data=data, files=files, headers=header, verify=False, timeout=self.timeout) + if not resp.status_code == 200: + return "The response status code for uploading the file is incorrect. Please check if the node address and API are correct. The current status code is {}, and the return message is:{}".format( + resp.status_code, resp.text) + resp_json = {} + if self.app_key: + resp_text = public.aes_decrypt(resp.text, self.app_key.app_key).strip() + if not resp_text.isdecimal(): + resp_json = json.loads(resp_text) + else: + resp_json = resp.json() + if not resp_json["status"]: + return "Upload file failed with error message:{}".format(resp_json["msg"]) + return "" + except Exception as e: + public.print_error() + return "Upload file: {} failed with error message:{}".format(filename, str(e)) + + def upload_proxy(self): + try: + from BTPanel import request + f_name = request.form.get('f_name') + f_path = request.form.get('f_path') + f_size = request.form.get('f_size') + f_start = request.form.get('f_start') + blob_file: FileStorage = request.files.getlist('blob')[0] + url = "{}/files".format(self.origin) + bt_p = self.get_bt_params({"action": "upload"}) + header = {"User-Agent": "Bt-Panel/Node Manager"} + files = {'blob': ('blob', blob_file.stream, 'application/octet-stream')} + data = { + 'f_path': f_path, + 'f_name': f_name, + 'f_size': f_size, + 'f_start': f_start + } + data.update(bt_p) + resp = requests.post(url, data=data, files=files, headers=header, verify=False, timeout=self.timeout) + if not resp.status_code == 200: + return "The response status code for uploading the file is incorrect. Please check if the node address and API are correct. The current status code is {}, and the return message is:{}".format( + resp.status_code, resp.text) + resp_text = resp.text + resp_json = {} + if self.app_key: + resp_text = public.aes_decrypt(resp_text, self.app_key.app_key).strip() + if not resp_text.isdecimal(): + resp_json = json.loads(resp_text) + else: + resp_json = resp.json() + if resp_text.isdecimal(): + return int(resp_text) + elif "status" in resp_json: + return resp_json + else: + return {"status": False, "msg": "Upload file failed, response message is:{}".format(resp_text)} + except Exception as e: + public.print_error() + return {"status": False, "msg": "Upload file failed with error message:{}".format(str(e))} + + def remove_file(self, filename: str, is_dir: bool) -> dict: + action = "DeleteDir" if is_dir else "DeleteFile" + data, err = self._request("/files", action, pdata={ + "path": filename, + }) + if err: + return {"status": False, "msg": "Failed to delete file, error message is:{}".format(err)} + + if isinstance(data, dict): + return data + return {"status": False, "msg": "Failed to delete file, response message is:{}".format(data)} + + def create_dir(self, path: str) -> Tuple[Optional[Dict], str]: + data, err = self._request("/files", action="CreateDir", pdata={ + "path": path, + }) + if err: + return None, "Failed to create directory, error message is:{}".format(err) + if isinstance(data, dict): + return data, "" + return None, "Failed to create directory, response message is:{}".format(data) + + def dir_walk(self, path: str) -> Tuple[List[dict], str]: + data, err = self._request("/mod/node/file_transfer/dir_walk", "", pdata={ + "path": path, + }) + if err: + return [], err + + if not isinstance(data, list): + if isinstance(data, dict) and "msg" in data: + return [], data["msg"] + return [], "data in wrong format: %s" + str(data) + + return data, "" + + def filetransfer_version_check(self) -> str: + ver = self.version() + if not ver: + return "Node {} connection error".format(self.show_name()) + + try: + ver_list = [int(i) for i in ver.split(".")] + # if self.app_key: # todo: 版本号检测 + # if ver_list[0] > 11 or (ver_list[0] == 11 and ver_list[1] >= 1): + # return "Node {} version is lower than [11.1.0], unable to use app link, please upgrade node version".format(self.show_name()) + + if ver_list[0] == 7 and ver_list[1] >= 65: + return "" + elif ver_list[0] == 7 and ver_list[1] == 0 and ver_list[2] >= 30: + return "" + elif ver_list[0] ==2 and ver_list[1] >= 15: + return "" + return "Please upgrade the panel version to 【 7.65.0/7.0.30/2.15.0 】 or above before using it" + except: + pass + return "Please upgrade the panel version to 【 7.65.0/7.0.30/2.15.0 】 or above before using it" + + + def node_create_filetransfer_task(self, source_node: dict, + target_node: dict, + source_path_list: List[dict], + target_path: str, + created_by: str, + default_mode: str = "cover") -> dict: + data, err = self._request("/mod/node/file_transfer/node_create_filetransfer_task", "", pdata={ + "source_node": json.dumps(source_node), + "target_node": json.dumps(target_node), + "source_path_list": json.dumps(source_path_list), + "target_path": target_path, + "created_by": created_by, + "default_mode": default_mode, + }) + if err: + return {"status": False, "msg": "Failed to create file transfer task, error message is:{}".format(err)} + if isinstance(data, dict): + return data + else: + return {"status": False, "msg": "Failed to create file transfer task, response message is:{}".format(data)} + + def file_list(self, path: str, p: int, row: int, search: str) -> Tuple[Dict, str]: + data, err = self._request("/files", "GetDirNew", pdata={ + "path": path, + "p": p, + "showRow": row, + "search": search, + }) + if err: + return {}, err + if not isinstance(data, dict): + return {}, "data in wrong format: %s" + str(data) + return data, "" + + def get_transfer_status(self, task_id: int) -> dict: + data, err = self._request("/mod/node/file_transfer/get_transfer_status", "", pdata={ + "task_id": task_id, + }) + if err: + return {"status": False, "msg": "Failed to retrieve the status of the file transfer task, error message is:{}".format(err)} + if isinstance(data, dict): + return data + return {"status": False, "msg": "Failed to obtain file transfer task status, response message is:{}".format(data)} + + def proxy_transfer_status(self, task_id: int, ws: simple_websocket.Server): + err = self._proxy_websocket( + call_data={ + "mod_name": "node", + "sub_mod_name": "file_transfer", + "def_name": "node_proxy_transfer_status", + "callback": "node_proxy_transfer_status", + "data": { + "task_id": task_id, + } + }, + uri="ws_modsoc", + call_back=ws.send + ) + if err: + ws.send(json.dumps({ + "type": "error", + "msg": "Failed to retrieve the status of the file transfer task, error message is:{}".format(err) + })) + + def _proxy_websocket(self, call_data: dict, uri: str, call_back: Callable[[Any],None]) -> str: + from urllib.parse import urlencode, urlparse + from ssl import CERT_NONE + try: + bt_p = self.get_bt_params() + header = {"User-Agent": "Bt-Panel/Node Manager"} + u = urlparse(self.origin) + url = ( + "{}://{}/{}?{}".format( + "ws" if u.scheme == "http" else "wss", + u.netloc, uri, urlencode(bt_p) + ) + ) + ws_req = websocket.WebSocket(sslopt={"cert_reqs": CERT_NONE}) # 忽略证书 + ws_req.connect(url, header=header) + ws_req.send("{}") # 跳过x-http-tokn 验证 + ws_req.send(json.dumps(call_data)) # 发送调用数据 + + while True: + data = ws_req.recv() + if data == "{}": + break + if data: + call_back(data) + else: + break + ws_req.close() + return "" + except Exception as e: + return str(e) + + def proxy_transferfile_status(self, task_id: int, exclude_nodes: List[int], the_log_id: int, call_back: Callable[[Any],None]) -> str: + return self._proxy_websocket( + call_data={ + "mod_name": "node", + "sub_mod_name": "executor", + "def_name": "node_proxy_transferfile_status", + "callback": "node_proxy_transferfile_status", + "data": { + "task_id": task_id, + "exclude_nodes": exclude_nodes, + "the_log_id": the_log_id + } + }, + uri="ws_modsoc", + call_back=call_back + ) + + def node_create_transfer_task(self, transfer_task_data:dict) -> dict: + data, err = self._request( + "/mod/node/executor/node_create_transfer_task", "", pdata={ + "transfer_task_data": json.dumps(transfer_task_data), + } + ) + if err: + return {"status": False, "msg": "Failed to create file transfer task, error message is:{}".format(err)} + if isinstance(data, dict): + return data + else: + return {"status": False, "msg": "Failed to create file transfer task, response message is:{}".format(data)} + + def node_transferfile_status_history(self, transfer_task_id: int, only_error=True): + data, err = self._request( + "/mod/node/executor/node_transferfile_status_history", "", pdata={ + "task_id": transfer_task_id, + "only_error": 1 if only_error else 0 + } + ) + if err: + return {"status": False, "msg": "Failed to create file transfer task, error message is:{}".format(err)} + if isinstance(data, dict): + return data + else: + return {"status": False, "msg": "Failed to create file transfer task, response message is:{}".format(data)} + + def download_proxy(self, filename: str): + url = "{}/download".format(self.origin) + bt_p = self.get_bt_params() + header = {"User-Agent": "Bt-Panel/Node Manager"} + try: + resp = requests.get(url, params={"filename": filename}, data=bt_p, headers=header, stream=True, verify=False, timeout=self.timeout) + if not resp.status_code == 200: + return "The response status code for downloading the file is incorrect. Please check if the node address and API are correct. The current status code is {}, and the return message is:{}".format( + resp.status_code, resp.text) + + from flask import send_file, stream_with_context, Response + filename = os.path.basename(filename) + if resp.headers.get("Content-Disposition", "").find("filename=") != -1: + filename = resp.headers.get("Content-Disposition", "").split("filename=")[1] + + def generate(): + for chunk in resp.iter_content(chunk_size=1024 * 1024 * 5): + if chunk: + yield chunk + + # 设置响应头 + headers = { + 'Content-Type': resp.headers.get('Content-Type', 'application/octet-stream'), + 'Content-Disposition': 'attachment; filename="{}"'.format(filename), + 'Content-Length': resp.headers.get('Content-Length', ''), + 'Accept-Ranges': 'bytes' + } + + # 使用 stream_with_context 确保请求上下文在生成器运行时保持活跃 + return Response( + stream_with_context(generate()), + headers=headers, + direct_passthrough=True + ) + except Exception as e: + public.print_error() + return "Download file: {} failed with error message:{}".format(filename, str(e)) + + def download_file(self, filename: str, target_path: str, mode: str, + call_log: Callable[[int, str], None] = None) -> str: + target_file = os.path.join(target_path, os.path.basename(filename)) + exits = os.path.exists(target_file) + if exits and mode == "ignore": + call_log(0, "File Download:{} -> {},The target file already exists, skip download".format(filename, target_file)) + return "" + if exits and mode == "rename": + download_name = "{}_{}".format(os.path.basename(filename), public.md5(filename)) + call_log(0, "File Download:{} -> {},The target file already exists, it will be renamed to {}".format(filename, target_file, download_name)) + else: + download_name = os.path.basename(filename) + + return self._download_file(filename, target_path, download_name, call_log) + + def _download_file(self, filename: str, target_path: str, download_name: str, + call_log: Callable[[int, str], None] = None) -> str: + data, err = self.upload_check([filename]) + if err: + return "Request file: {} status failed with error message:{}".format(filename, err) + file_size: Optional[int] = None + for i in data: + if i["filename"] == filename and i["isfile"] == True: + file_size = i["size"] + break + + if file_size is None: + return "File {} does not exist, skip download".format(filename) + try: + if not os.path.isdir(target_path): + os.makedirs(target_path) + except Exception as e: + return "Failed to create folder {}, please check folder permissions, error message is:{}".format(target_path, str(e)) + + if file_size == 0: + fp = open(os.path.join(target_path, download_name), "w") + fp.close() + return "" + + tmp_file = os.path.join(target_path, "{}.{}".format(download_name, uuid4().hex)) + try: + if not os.path.exists(target_path): + os.makedirs(target_path) + fb = open(tmp_file, 'wb') + except Exception as e: + return "Failed to create temporary file {}, please check folder permissions, error message is:{}".format(tmp_file, str(e)) + + url = "{}/download".format(self.origin) + bt_p = self.get_bt_params() + header = {"User-Agent": "Bt-Panel/Node Manager"} + try: + resp = requests.get(url, params={"filename": filename}, data=bt_p, headers=header, stream=True, verify=False, timeout=self.timeout) + if not resp.status_code == 200: + return "The response status code for downloading the file is incorrect. Please check if the node address and API are correct. The current status code is {}, and the return message is:{}".format( + resp.status_code, resp.text) + + now_size = 0 + for chunk in resp.iter_content(chunk_size=1024 * 1024 * 3): + if chunk: + now_size += len(chunk) + fb.write(chunk) + fb.flush() + call_log(now_size * 100 // file_size, + "Download file {}, Downloaded: {}".format(filename, public.to_size(now_size))) + if fb.tell() != file_size: + return "Download file {} failed, file size check error".format(filename) + fb.close() + shutil.move(tmp_file, os.path.join(target_path, download_name)) + return "" + except Exception as e: + return "Download file {} failed,The error message is:{}".format(filename, str(e)) + finally: + if not fb.closed: + fb.close() + if os.path.exists(tmp_file): + os.remove(tmp_file) + + def dir_size(self, path: str) -> Tuple[Optional[int], str]: + data, err = self._request("/files", "get_path_size", pdata={ + "path": path, + }) + if err: + return None, err + if isinstance(data, dict) and "size" in data: + return data["size"], "" + return None, "Failed to retrieve directory size, response message is:{}".format(data) + + def get_sshd_port(self) -> Optional[int]: + data, err = self._request("/safe/ssh/GetSshInfo", "", pdata={}) + if err: + return None + if isinstance(data, dict) and "port" in data: + return int(data["port"]) + return None + + def restart_bt_panel(self) -> Dict[str, Any]: + res, err = self._request("/system", "ReWeb", pdata={}) + if err: + return {"status": False, "msg": err} + return {"status": True, "msg": "Restart successful"} + + def server_reboot(self): + res, err = self._request("/system", "ServiceAdmin", pdata={ + "name": "nginx", + "type": "stop", + }) + if err: + return {"status": False, "msg": err} + if res.get('result','')!='Executed successfully!': + return {"status": False, "msg": "Nginx failed to stop, unable to continue executing server restart:" + res["msg"]} + + res, err = self._request("/system", "ServiceAdmin", pdata={ + "name": "mysqld", + "type": "stop", + }) + if err: + return {"status": False, "msg": err} + if res.get('result','')!='Executed successfully!': + return {"status": False, "msg": "MySQL service failed to stop, unable to continue executing server restart:" + res["msg"]} + + res, _ = self._request("/system", "RestartServer", pdata={}) + if res.get('result','')!='Command sent successfully!': + return {"status": False, "msg": "Server restart failed:" + res["msg"]} + + from mod.project.node.dbutil import ServerMonitorRepo + repo = ServerMonitorRepo() + repo.set_wait_reboot(self.node_server_ip, True) + + def wait_for_reboot(): + # wait 等待服务器重启成功, 超时时间默认为 10 分钟 + wait_for = time.time() + 600 + time.sleep(3) + while time.time() < wait_for: + if self.test_conn() == "": # 无错误时表示重启成功 + repo.set_wait_reboot(self.node_server_ip, False) + from mod.project.node.dbutil import ServerNodeDB + if self.app_key !=None:self.app_key=self.app_key.to_string() + node_data = ServerNodeDB().find_node(api_key=self.api_key, app_key=self.app_key) + if node_data: + monitor_node_once(node_data) + return {"status": True, "msg": "Server restart successful"} + time.sleep(3) + # public.print_log("Waiting for server restart... {}".format(wait_for - time.time())) + repo.set_wait_reboot(self.node_server_ip, False) + return {"status": False, "msg": "Restarting server failed, server information has not been detected for more than 10 minutes"} + + t = threading.Thread(target=wait_for_reboot, daemon=True) + t.start() + + return {"status": True, "msg": "The server restart has started, please wait patiently for the successful restart"} + + def read_ssh_key(self) -> Tuple[Optional[str], str]: + data, err = self._request("/ssh_security", "get_key", pdata={}) + if err: + return None, err + if not isinstance(data, dict) or "status" not in data: + return None, "Failed to obtain SSH key, please check if the node address and API are correct" + if not data["status"]: + return None, data["msg"] + return data["msg"], "" + + def get_dir(self, path: str, search: str, disk: str): + data, err = self._request("/files", "GetDir", pdata={ + "path": path, "disk": disk, "search": search + }) + if err: + return {"status": False, "msg": err} + if not isinstance(data, dict): + return {"status": False, "msg": "Failed to retrieve directory, please check if the node address and API are correct"} + return data + + def upload_dir_check(self, target_file: str) -> str: + data, err = self._request("/files", "upload_files_exists", pdata={"files": target_file}) + if err: + return err + if not isinstance(data, list): + return "data in wrong format: %s" % str(data) + for f in data: + if f["filename"] == target_file and f["exists"]: + if f["isfile"]: + return "The name path is not a directory" + else: + return "" + return "" + + +def monitor_all_node_status(): + all_nodes = public.S('node', public.get_panel_path() + "/data/db/node.db").select() + if not isinstance(all_nodes, list) or not all_nodes: + return + + import threading + + threads = [] + for tmp_node_data in all_nodes: + t = threading.Thread(target=monitor_node_once, args=(tmp_node_data,)) + t.start() + threads.append(t) + + # 等待所有线程完成(可选) + for t in threads: + t.join() + + +def monitor_node_once(node_data: dict): + from mod.project.node.dbutil import Node, ServerNodeDB, ServerMonitorRepo + from mod.project.node.nodeutil.ssh_wrap import SSHApi + from mod.base.ssh_executor import test_ssh_config + try: + if node_data["app_key"] == "local" and node_data["api_key"] == "local": + return + node_data["error"] = json.loads(node_data["error"]) + node_data["ssh_conf"] = json.loads(node_data["ssh_conf"]) + node, err = Node.from_dict(node_data) + if err: + # public.print_log("Node data parsing error:{}".format(err)) + return + + if node_data["lpver"]: + srv = LPanelNode(node.address, node.api_key, node.lpver) + elif node.api_key or node.app_key: + srv = ServerNode(node.address, node.api_key, node.app_key) + else: + srv =SSHApi(**node_data["ssh_conf"]) + + data, err = srv.get_net_work() + if err: + node.error_num += 1 + node.error = { + "msg": err, + "time": int(time.time()) + } + if node.error_num >= 2: + node.status = 0 + ServerMonitorRepo().remove_cache(node.id) + + ServerNodeDB().update_node(node) + + else: + if node.error_num > 0: + node.error_num = 0 + node.error = {} + node.status = 1 + ServerNodeDB().update_node(node) + + if data: + repo = ServerMonitorRepo() + repo.save_server_status(node.id, data) + if repo.is_reboot_wait(node.server_ip): + repo.set_wait_reboot(node.server_ip, False) + if not node_data["ssh_test"] and not node_data["ssh_conf"] and not isinstance(srv, SSHApi): + ssh_key, err = srv.read_ssh_key() + if err: + # public.print_log("Failed to obtain SSH key:{}".format(err)) + return + port = srv.get_sshd_port() + if not port: + # public.print_log("Failed to obtain SSH service port") + return + + conf = { + "host": srv.node_server_ip, + "pkey": ssh_key, + "port": port, + "username": "root", + "password": "", + "pkey_passwd": "", + } + err = test_ssh_config(**conf) + if err: + # public.print_log("SSH key test failed:{}".format(err)) + ServerNodeDB().set_node_ssh_conf(node.id, {}, ssh_test=1) + return + else: + ServerNodeDB().set_node_ssh_conf(node.id, conf, ssh_test=1) + + except Exception as e: + if public.is_debug(): + public.print_error() + + +def monitor_node_once_with_timeout(node_data: dict, timeout: int = 5): + if node_data["app_key"] == "local" and node_data["api_key"] == "local": + return + from mod.project.node.dbutil import Node, ServerNodeDB, ServerMonitorRepo + from mod.project.node.nodeutil.ssh_wrap import SSHApi + try: + node_data["error"] = json.loads(node_data["error"]) + node_data["ssh_conf"] = json.loads(node_data["ssh_conf"]) + node, err = Node.from_dict(node_data) + if err: + # public.print_log("Node data parsing error:{}".format(err)) + return + + if node_data["app_key"] or node_data["api_key"]: + node_data["timeout"] = timeout + srv = ServerNode.new_by_data(node_data) + node_data.pop("timeout") + elif node_data["ssh_conf"]: + srv = SSHApi(**node_data["ssh_conf"], timeout=timeout) + else: + return + + data, err = srv.get_net_work() + if err: + node.error_num += 1 + node.error = { + "msg": err, + "time": int(time.time()) + } + if node.error_num >= 2: + node.status = 0 + ServerMonitorRepo().remove_cache(node.id) + + ServerNodeDB().update_node(node) + + elif node.error_num > 0: + node.error_num = 0 + node.error = {} + node.status = 1 + ServerNodeDB().update_node(node) + + if data: + repo = ServerMonitorRepo() + repo.save_server_status(node.id, data) + if repo.is_reboot_wait(node.server_ip): + repo.set_wait_reboot(node.server_ip, False) + except Exception as e: + if public.is_debug(): + public.print_error() + + +class LocalNode(ServerNode): + is_local = True + + def __init__(self): + super().__init__("", "", "") + + def create_php_site(self, site_name: str, port: int = 80, **kwargs) -> Tuple[Optional[int], str]: + path = "/www/wwwroot/{}".format(site_name) + webname = { + "domain": site_name if port in (80, 443) else "{}:{}".format(site_name, port), + "domainlist": [], + "count": 0 + } + pdata = { + "path": path, + "ftp": "false", + "type": "PHP", + "type_id": "0", + "ps": kwargs.get("ps") if kwargs.get("ps", None) else "{}【Load balancing site】".format(site_name), + "port": str(port), + "version": "00", + "sql": "false", + "webname": json.dumps(webname) + } + + if "/www/server/panel/class" not in sys.path: + sys.path.insert(0, "/www/server/panel/class") + + from panelSite import panelSite + + res = panelSite().AddSite(public.to_dict_obj(pdata)) + + if "siteId" in res: + return res["siteId"], "" + if "status" in res and not res["status"]: + return 0, res.get("msg", "Unknown error") + return 0, "Unknown error" + + @staticmethod + def site_proxy_list(site_name: str) -> List[dict]: + from mod.base.web_conf.proxy import RealProxy + data = RealProxy(config_prefix="").get_proxy_list(public.to_dict_obj({ + "sitename": site_name + })) + if isinstance(data, list) and data: + return data + + from panelSite import panelSite + + data = panelSite().GetProxyList(public.to_dict_obj({ + "sitename": site_name + })) + if isinstance(data, list) and data: + return data + return [] + + def show_name(self) -> str: + return "Local node" + + def php_site_list(self) -> Tuple[List[dict], str]: + from mod.base.web_conf.ssl import RealSSLManger + ssl_m = RealSSLManger() + + all_sites = public.M("sites").where("project_type=? and status = 1", "PHP").select() + res = [] + for i in all_sites: + domain = public.M("domain").where("pid=?", i["id"]).select() + domains = list(set([x["name"] for x in domain])) + port = list(set([int(x["port"]) for x in domain])) + ssl = ssl_m.get_site_ssl_info(i["name"]) is not None + if ssl and 443 not in port: + port.append(443) + res.append({ + "site_id": i["id"], + "site_name": i["name"], + "ports": port, + "domains": domains, + "ssl": ssl + }) + + return res, "" + + def add_domain(self, site_id: int, site_name: str, domain: str, port: int) -> Tuple[bool, str]: + from panelSite import panelSite + res = panelSite().AddDomain(public.to_dict_obj({ + "domain": "{}:{}".format(domain, port), + "webname": site_name, + "id": str(site_id) + })) + if isinstance(res, dict) and res.get("status", False): + return True, "" + return False, res.get("msg", "Unknown error") + + def has_domain(self, site_id: int, domain: str): + return public.M("domain").where("pid=? and name=?", site_id, domain).count() > 0 + + def dir_walk(self, path: str) -> Tuple[List[dict], str]: + if not os.path.isdir(path): + return [], "{} Not a directory".format(path) + res_file = [] + count = 0 + empty_dir = [] + for root, dirs, files in os.walk(path): + if not files: + empty_dir.append(root) + for f in files: + if count > 1000: + return [], "The number of directory files exceeds 1000, please compress before operating" + count += 1 + try: + res_file.append({ + "path": os.path.join(root, f), + "size": os.path.getsize(os.path.join(root, f)), + "is_dir": 0 + }) + except: + pass + return [{"path": d, "size": 0, "is_dir": 1} for d in empty_dir] + res_file, "" + + def remove_file(self, filename: str, is_dir: bool) -> dict: + from files_v2 import files + if is_dir: + return files().DeleteDir(public.to_dict_obj({"path": filename})) + else: + return files().DeleteFile(public.to_dict_obj({"path": filename})) + + def file_list(self, path: str, p: int, row: int, search: str) -> Tuple[Dict, str]: + from files_v2 import files + return files().GetDirNew(public.to_dict_obj({ + "path": path, + "p": p, + "showRow": row, + "search": search + })), "" + + def upload_proxy(self): + from files_v2 import files + return files().upload(args=public.to_dict_obj({})) + + def upload_check(self, target_file_list: List[str]) -> Tuple[List[dict], str]: + from files_v2 import files + return files().upload_files_exists(args=public.to_dict_obj({ + "files": "\n".join(target_file_list), + })), "" + + def dir_size(self, path: str) -> Tuple[Optional[int], str]: + return public.get_path_size(path), "" + + def get_sshd_port(self) -> Optional[int]: + return public.get_sshd_port() + + def create_dir(self, path: str) -> Tuple[Optional[Dict], str]: + from files_v2 import files + return files().CreateDir(public.to_dict_obj({"path": path})), "" + + def get_file_body(self, path: str) -> Tuple[Optional[str], str]: + res = public.readFile(path) + if isinstance(res, str): + return res, "" + return None, "fail to read file" + + def read_ssh_key(self) -> Tuple[Optional[str], str]: + from ssh_security import ssh_security + data = ssh_security().get_key(None) + if data["status"]: + return data["msg"], "" + return None, data["msg"] + + def get_dir(self, path: str, search: str, disk: str): + from files_v2 import files + return files().GetDir(public.to_dict_obj({"path": path, "search":search, "disk": disk})) + + +class LPanelNode(ServerNode): + _TIME_REGEXP = re.compile(r":\d{2}(?P\.\d{6,})[+-]\d{2}:\d{2}") + + def __init__(self, address: str, api_key: str, lpver: str = "v2", timeout: int = 20): + super().__init__(address, api_key, "", timeout=timeout) + self.ver = lpver + self.lpc = OnePanelApiClient(address, api_key, lpver, self.timeout) + + @classmethod + def check_api_key(cls, node: Node) -> str: + # public.print_log(node.address, node.api_key) + lpc = OnePanelApiClient(node.address, node.api_key) + if lpc.test_ver(): + node.lpver = lpc.ver + return "" + return "1 Panel node test connection failed" + + def test_conn(self) -> str: + if self.lpc.test_ver(): + return "" + return "1 Panel node test connection failed" + + def get_net_work(self) -> Tuple[Optional[dict], str]: + """{ + "code": 200, + "message": "", + "data": { + "path": "/", + "name": "/", + "user": "root", + "group": "root", + "uid": "0", + "gid": "0", + "extension": "", + "content": "", + "size": 4096, + "isDir": true, + "isSymlink": false, + "isHidden": false, + "linkPath": "", + "type": "", + "mode": "0555", + "mimeType": "", + "updateTime": "0001-01-01T00:00:00Z", + "modTime": "2023-12-16T18:21:10.369198018+08:00", + "items": [], + "itemTotal": 22, + "favoriteID": 0, + "isDetail": true + } +} +API Response Status: 200 +{ + "code": 200, + "message": "", + "data": { + "uptime": 8060394, + "timeSinceUptime": "2025-03-05 10:02:04", + "procs": 173, + "load1": 1.05, + "load5": 1.05, + "load15": 1.05, + "loadUsagePercent": 17.5, + "cpuPercent": [ + 100, + 0, + 0, + 0 + ], + "cpuUsedPercent": 25.000000232830644, + "cpuUsed": 1.0000000093132257, + "cpuTotal": 4, + "memoryTotal": 1038336000, + "memoryAvailable": 298635264, + "memoryUsed": 572526592, + "memoryUsedPercent": 55.13885601577909, + "swapMemoryTotal": 4160745472, + "swapMemoryAvailable": 3816017920, + "swapMemoryUsed": 344727552, + "swapMemoryUsedPercent": 8.285235285836778, + "ioReadBytes": 0, + "ioWriteBytes": 0, + "ioCount": 0, + "ioReadTime": 0, + "ioWriteTime": 0, + "diskData": [ + { + "path": "/", + "type": "xfs", + "device": "/dev/mapper/centos-root", + "total": 37688381440, + "free": 9805086720, + "used": 27883294720, + "usedPercent": 73.98379461954417, + "inodesTotal": 18411520, + "inodesUsed": 729745, + "inodesFree": 17681775, + "inodesUsedPercent": 3.963523924151836 + }, + { + "path": "/www/monitor_data", + "type": "ext4", + "device": "/dev/vdb1", + "total": 10432565248, + "free": 8118497280, + "used": 1760526336, + "usedPercent": 17.82085360286682, + "inodesTotal": 655360, + "inodesUsed": 10029, + "inodesFree": 645331, + "inodesUsedPercent": 1.530303955078125 + } + ], + "netBytesSent": 0, + "netBytesRecv": 0, + "gpuData": null, + "xpuData": null, + "shotTime": "2025-06-06T17:01:59.156659566+08:00" + } +}""" + try: + data = self.lpc.system_status() + system_data = data.get("data", {}) + return { + "cpu": [round(system_data["cpuUsedPercent"], 2), system_data["cpuTotal"]], + "mem": { + "memRealUsed": system_data["memoryUsed"] / 1024 / 1024, + "memTotal": system_data["memoryTotal"] / 1024 / 1024, + "memNewTotal": public.to_size(system_data["memoryTotal"]) + }, + "version": "1Panel" + }, "" + + except Exception as e: + public.print_error() + return None, str(e) + + def get_tmp_token(self) -> Tuple[Optional[str], str]: + return None, "1Panel does not support temporary API access" + + def php_site_list(self) -> Tuple[List[dict], str]: + """{ + "code": 200, + "message": "", + "data": [ + { + "id": 2, + "createdAt": "2025-06-06T14:49:00.687860227+08:00", + "updatedAt": "2025-06-06T14:49:00.687860227+08:00", + "protocol": "HTTP", + "primaryDomain": "www.halotest.com", + "type": "deployment", + "alias": "www.halotest.com", + "remark": "", + "status": "Running", + "httpConfig": "", + "expireDate": "9999-12-31T00:00:00Z", + "proxy": "127.0.0.1:8090", + "proxyType": "", + "errorLog": true, + "accessLog": true, + "defaultServer": false, + "IPV6": false, + "rewrite": "", + "webSiteGroupId": 1, + "webSiteSSLId": 0, + "runtimeID": 0, + "appInstallId": 5, + "ftpId": 0, + "parentWebsiteID": 0, + "user": "", + "group": "", + "dbType": "", + "dbID": 0, + "favorite": false, + "domains": [ + { + "id": 2, + "createdAt": "2025-06-06T14:49:00.69011631+08:00", + "updatedAt": "2025-06-06T14:49:00.69011631+08:00", + "websiteId": 2, + "domain": "www.halotest.com", + "ssl": false, + "port": 7080 + }, + { + "id": 3, + "createdAt": "2025-06-06T14:51:47.932141706+08:00", + "updatedAt": "2025-06-06T14:51:47.932141706+08:00", + "websiteId": 2, + "domain": "qwww.com", + "ssl": false, + "port": 7080 + } + ], + "webSiteSSL": { + "id": 0, + "createdAt": "0001-01-01T00:00:00Z", + "updatedAt": "0001-01-01T00:00:00Z", + "primaryDomain": "", + "privateKey": "", + "pem": "", + "domains": "", + "certURL": "", + "type": "", + "provider": "", + "organization": "", + "dnsAccountId": 0, + "acmeAccountId": 0, + "caId": 0, + "autoRenew": false, + "expireDate": "0001-01-01T00:00:00Z", + "startDate": "0001-01-01T00:00:00Z", + "status": "", + "message": "", + "keyType": "", + "pushDir": false, + "dir": "", + "description": "", + "skipDNS": false, + "nameserver1": "", + "nameserver2": "", + "disableCNAME": false, + "execShell": false, + "shell": "", + "acmeAccount": { + "id": 0, + "createdAt": "0001-01-01T00:00:00Z", + "updatedAt": "0001-01-01T00:00:00Z", + "email": "", + "url": "", + "type": "", + "eabKid": "", + "eabHmacKey": "", + "keyType": "", + "useProxy": false, + "caDirURL": "" + }, + "dnsAccount": { + "id": 0, + "createdAt": "0001-01-01T00:00:00Z", + "updatedAt": "0001-01-01T00:00:00Z", + "name": "", + "type": "" + }, + "websites": null + }, + "errorLogPath": "", + "accessLogPath": "", + "sitePath": "", + "appName": "", + "runtimeName": "", + "runtimeType": "", + "siteDir": "" + } + ] + }""" + try: + data = self.lpc.get_websites() + res = [] + for i in data["data"]: + res.append({ + "site_id": i["id"], + "site_name": i["alias"], + "ports": list(set([i["port"] for i in i["domains"]])), + "domains": list(set([i["domain"] for i in i["domains"]])), + "ssl": any(i["ssl"] for i in i["domains"]) + }) + return res, "" + except Exception as e: + return [], str(e) + + def create_php_site(self, site_name: str, port: int, **kwargs) -> Tuple[Optional[int], str]: + try: + dat = self.lpc.add_website(site_name, port, **kwargs) + # public.print_log(dat) + if dat["code"] == 200: + time.sleep(0.5) + site_id = self.lpc.check_site_create(site_name) + if isinstance(site_id, int): + return site_id, "" + return None, "Website creation failed" + return None, dat["message"] + except Exception as e: + return None, str(e) + + def set_firewall_open(self, port: int, protocol: str = "tcp") -> Tuple[bool, str]: + try: + dat = self.lpc.open_port(port, protocol) + if dat["code"] == 200: + return True, "" + return False, dat["message"] + except Exception as e: + return False, str(e) + + def add_domain(self, site_id: int, site_name: str, domain: str, port: int) -> Tuple[bool, str]: + try: + dat = self.lpc.add_website_domain(site_id, domain, port) + if dat["code"] == 200: + return True, "" + return False, dat["message"] + except Exception as e: + return False, str(e) + + def has_domain(self, site_id: int, domain: str) -> bool: + try: + dat = self.lpc.website_domains(site_id) + if dat["code"] == 200: + for i in dat["data"]: + if i["domain"] == domain: + return True + return False + return False + except Exception as e: + return False + + def target_file_exits(self, target_file: str) -> Tuple[bool, str]: + data = self.lpc.files_exits([target_file]) + if not isinstance(data, dict): + return False, "Request file: {} status failed".format(target_file) + for i in data["data"]: + if i["path"] == target_file: + return True, "" + return False, "" + + def upload_dir_check(self, target_dir: str) -> str: + data = self.lpc.files_exits([target_dir]) + if not isinstance(data, dict): + return "Request file: {} status failed".format(target_dir) + for i in data["data"]: + if i["path"] == target_dir: + if not i.get("isDir", True): + return "The name path is not a directory" + return "" + return "" + + def _upload_big_file(self, filename: str, target_path: str, upload_name: str, + call_log: Callable[[int, str], None] = None) -> str: + try: + fb = open(filename, 'rb') + except Exception as e: + public.print_error() + return "File {} failed to open, please check file permissions, error message is:{}".format(filename, str(e)) + + file_size = os.path.getsize(filename) + count = math.ceil(file_size / (1024 * 1024 * 5)) + idx = 0 + for i in range(0, file_size, 1024 * 1024 * 5): + file_data = fb.read(1024 * 1024 * 5) + err, data = self.lpc.chunkupload(upload_name, target_path, file_data, idx, count) + idx += 1 + if err: + return "Upload file {} failed with error message:{}".format(filename, str(err)) + if data: + call_log(100, "File upload:{} -> {},Upload successful".format(filename, upload_name)) + else: + up_d = (i + len(file_data)) // file_size + call_log(up_d, "File upload:{} -> {},The uploaded size is:{}".format( + filename, upload_name, public.to_size(i + len(file_data)))) + return "" + + def _upload_little_file(self, filename: str, target_path: str, upload_name: str, + call_log: Callable[[int, str], None] = None) -> str: + return self.lpc.upload(filename, target_path, upload_name) + + def download_file(self, filename: str, target_path: str, mode: str, + call_log: Callable[[int, str], None] = None) -> str: + target_file = os.path.join(target_path, os.path.basename(filename)) + exits = os.path.exists(target_file) + if exits and mode == "ignore": + call_log(0, "File Download:{} -> {},The target file already exists, skip download".format(filename, target_file)) + return "" + if exits and mode == "rename": + download_name = "{}_{}".format(os.path.basename(filename), public.md5(filename)) + call_log(0, "File Download:{} -> {},The target file already exists, it will be renamed to {}".format(filename, target_file, download_name)) + else: + download_name = os.path.basename(filename) + + return self.lpc.download_file(filename, target_path, download_name, call_log=call_log) + + def dir_walk(self, path: str) -> Tuple[List[dict], str]: + return self.lpc.dir_walk(path) + + def upload_proxy(self): + try: + from BTPanel import request, cache + f_name = request.form.get('f_name') + f_path = request.form.get('f_path') + f_size = request.form.get('f_size') + f_start = request.form.get('f_start') + cache_key = "upload_file_{}_{}_{}".format(f_name, f_path, f_size) + num = cache.get(cache_key) + if num is None: + num = 0 + cache.set(cache_key, num, 86400) + else: + num = int(num) + cache.set(cache_key, num + 1, 86400) + blob_file: FileStorage = request.files.getlist('blob')[0] + file_data = blob_file.read() + next_size = int(f_start) + len(file_data) + if next_size == int(f_size): + chunk_num = num + 1 + else: + chunk_num = num + 2 + err, data = self.lpc.chunkupload(f_name, f_path, file_data, num, chunk_num) + if err: + return {"status": False, "msg": "Upload file failed with error message:{}".format(str(err))} + elif data is None: + return str(next_size) + elif isinstance(data, dict) and data["code"] == 200: + return {"status": True, "msg": "Upload successful"} + return {"status": False, "msg": "Upload file failed with error message:{}".format(data["message"])} + except Exception as e: + public.print_error() + return {"status": False, "msg": "Upload file failed with error message:{}".format(str(e))} + + def remove_file(self, filename: str, is_dir: bool) -> dict: + try: + res = self.lpc.remove_file(filename, is_dir) + if isinstance(res, dict): + return {"status": res["code"] == 200, "msg": res["message"]} + return {"status": False, "msg": "File deletion failed, remote request failed"} + except Exception as e: + return {"status": False, "msg": "Failed to delete file, error message is:{}".format(str(e))} + + def file_list(self, path: str, p: int, row: int, search: str) -> Tuple[Dict, str]: + try: + res, err = self.lpc.files_search(path, p, row, search) + if err: + return {}, "Failed to retrieve file list, error message is:{}".format(err) + count = res["itemTotal"] + path = res["path"] + dirs = [] + files = [] + sub_items = [] if res["items"] is None else res["items"] + for i in sub_items: + # res = self._TIME_REGEXP.findall(i["modTime"]) + # public.print_log(res) + mt_str = self._TIME_REGEXP.sub(lambda x: x.group().replace(x.group("err"), ""), i["modTime"]) + for f_str in ("%Y-%m-%dT%H:%M:%S%z", "%Y-%m-%dT%H:%M:%S.%f%z"): + try: + mt = datetime.strptime(mt_str, f_str) + break + except: + pass + # public.print_log(i["modTime"], mt_str) + # public.print_error() + else: + continue + + if i["isDir"]: + dirs.append({ + "nm": html.unescape(i["name"]), + "sz": i["size"], + "mt": int(mt.timestamp()), + "acc": i["mode"][1:], + "user": i["user"], + "lnk": "" if not i["linkPath"] else " -> " + i["linkPath"], + "durl": "", + "cmp": 0, + "fav": "0", + "rmk": "", + "top": 0, + "sn": i["name"] + }) + else: + files.append({ + "nm": html.unescape(i["name"]), + "sz": i["size"], + "mt": int(mt.timestamp()), + "acc": i["mode"][1:], + "user": i["user"], + "lnk": "" if not i["linkPath"] else " -> " + i["linkPath"], + "durl": "", + "cmp": 0, + "fav": "0", + "rmk": "", + "top": 0, + "sn": i["name"] + }) + + return { + "path": path, + "page": public.get_page(count, p, row)["page"], + "dir": dirs, + "files": files + }, "" + except Exception as e: + return {}, "Failed to retrieve file list, error message is:{}".format(str(e)) + + def download_proxy(self, filename: str): + return self.lpc.download_proxy(filename) + + def upload_check(self, target_file_list: List[str]) -> Tuple[List[dict], str]: + try: + res = self.lpc.files_exits(target_file_list) + if res is None: + return [], "Request for remote 1Panel failed" + data = res.get("data", []) + res_data = [] + for i in data: + try: + mt = datetime.strptime(i["modTime"], "%Y-%m-%dT%H:%M:%S%z") + except: + try: + mt = datetime.strptime(i["modTime"], "%Y-%m-%dT%H:%M:%S.%f%z") + except: + continue + res_data.append({ + 'filename': i["path"], + 'exists': True, + 'size': i["size"], + 'mtime': int(mt.timestamp()), + 'isfile': False + }) + + return res_data, "" + except Exception as e: + return [], "Request for remote 1Panel failed with error message:{}".format(str(e)) + + def dir_size(self, path: str) -> Tuple[Optional[int], str]: + try: + res = self.lpc.dir_size(path) + if res is None: + return None, "Request for remote 1Panel failed" + if not isinstance(res, dict): + return None, "Request for remote 1Panel failed, response data:%s" % str(res) + return res["data"].get("size", 0), "" + except Exception as e: + return None, "Request for remote 1Panel failed: %s" % str(e) + + def get_sshd_port(self) -> Optional[int]: + try: + data = self.lpc.get_sshd_config() + return int(data["port"]) if data else None + except: + return None + + def create_dir(self, path: str) -> Tuple[Optional[Dict], str]: + try: + data = self.lpc.create_dir(path) + if not data: + return None, "Failed to create directory, 1Panel node connection failed" + status = data["code"] == 200 + return {"status": status, "msg": data["message"] if not status else "Created successfully"}, "" + except Exception as e: + return None, "Request for remote 1Panel node failed: %s" % str(e) + + def restart_bt_panel(self) -> Dict[str, Any]: + self.lpc.restart_panel() + return {"status": True, "msg": "Restart successful"} + + def server_reboot(self) -> Dict[str, Any]: + self.lpc.server_reboot() + + from mod.project.node.dbutil import ServerMonitorRepo + repo = ServerMonitorRepo() + repo.set_wait_reboot(self.node_server_ip, True) + + def wait_for_reboot(): + # wait 等待服务器重启成功, 超时时间默认为 10 分钟 + wait_for = time.time() + 600 + time.sleep(3) + while time.time() < wait_for: + if self.test_conn() == "": # 无错误时表示重启成功 + repo.set_wait_reboot(self.node_server_ip, False) + from mod.project.node.dbutil import ServerNodeDB + node_data = ServerNodeDB().find_node(api_key=self.api_key, app_key=self.app_key.to_string()) + if node_data: + monitor_node_once(node_data) + return {"status": True, "msg": "Server restart successful"} + time.sleep(3) + # public.print_log("Waiting for server restart... {}".format(wait_for - time.time())) + repo.set_wait_reboot(self.node_server_ip, False) + return {"status": False, "msg": "Restarting server failed, server information has not been detected for more than 10 minutes"} + + t = threading.Thread(target=wait_for_reboot, daemon=True) + t.start() + + return {"status": True, "msg": "The server restart has started, please wait patiently for the successful restart"} + + def get_file_body(self, path: str) -> Tuple[Optional[str], str]: + data_dict, err = self.lpc.get_file_body(path) + if err != "": + return None, err + return data_dict["content"], "" + + def read_ssh_key(self) -> Tuple[Optional[str], str]: + key, err = self.lpc.get_file_body("/root/.ssh/id_ed25519_1panel") + if err: + return None, "Failed to read SSH key, error message is: %s" % err + return key, "" \ No newline at end of file diff --git a/mod/project/node/nodeutil/one_panel_api.py b/mod/project/node/nodeutil/one_panel_api.py new file mode 100644 index 00000000..545d7095 --- /dev/null +++ b/mod/project/node/nodeutil/one_panel_api.py @@ -0,0 +1,573 @@ +import os.path +import shutil +import traceback +from uuid import uuid4 + +import requests +import time +import hashlib +import json +from typing import Optional, List, Any, Tuple, Dict + + +class OnePanelApiClient: + def __init__(self, panel_address, api_key, ver: str = "v2", timeout: int = 20): + """ + 初始化 OnePanel API 客户端 + + Args: + panel_address (str): 1Panel 的访问地址 (例如: "http://your_server_ip:4004") + api_key (str): 您的 1Panel API Key + """ + self.panel_address = panel_address + self.api_key = api_key + self.ver = ver + self.timeout = timeout + self._call_err: Optional[Exception] = None + + def _generate_token(self): + """生成 1Panel API token 和时间戳""" + timestamp = str(int(time.time())) + sign_string = f"1panel{self.api_key}{timestamp}" + md5_hash = hashlib.md5(sign_string.encode()).hexdigest() + return md5_hash, timestamp + + def _call_api(self, method, endpoint, json_data=None): + """发送 API 请求""" + token, timestamp = self._generate_token() + headers = { + "1Panel-Token": token, + "1Panel-Timestamp": timestamp, + "Content-Type": "application/json" + } + url = "{}{}".format(self.panel_address, endpoint) + + # print(f"Calling API: {method} {url}") + try: + response = requests.request(method, url, headers=headers, json=json_data, timeout=self.timeout) + response.raise_for_status() # 检查 HTTP 错误 (例如 4xx 或 5xx) + print(f"API Response Status: {response.status_code}") + return response.json() + except requests.exceptions.RequestException as e: + self._call_err = e + print(f"API call failed: {e}") + return None + except Exception as e: + self._call_err = e + print(f"API call failed: {e}") + return None + + def add_website(self, site_name: str, port: int, **kwargs): + """ + 添加网站 + """ + endpoint = "/api/{}/websites".format(self.ver) + return self._call_api("POST", endpoint, json_data={ + "primaryDomain": site_name, + "type": "static", + "alias": site_name, + "remark": kwargs.get("ps") if kwargs.get("ps", None) else "Pagoda aapanel load balancing station", + "appType": "installed", + "webSiteGroupId": 1, + "otherDomains": "", + "proxy": "", + "appinstall": { + "appId": 0, + "name": "", + "appDetailId": 0, + "params": {}, + "version": "", + "appkey": "", + "advanced": False, + "cpuQuota": 0, + "memoryLimit": 0, + "memoryUnit": "MB", + "containerName": "", + "allowPort": False + }, + "IPV6": False, + "enableFtp": False, + "ftpUser": "", + "ftpPassword": "", + "proxyType": "tcp", + "port": 9000, + "proxyProtocol": "http://", + "proxyAddress": "", + "runtimeType": "php", + "taskID": str(uuid4()), + "createDb": False, + "dbName": "", + "dbPassword": "", + "dbFormat": "utf8mb4", + "dbUser": "", + "dbType": "mysql", + "dbHost": "", + "enableSSL": False, + "domains": [ + { + "domain": site_name, + "port": port, + "ssl": False + } + ], + "siteDir": "" + }) + + def check_site_create(self, site_name: str) -> Optional[int]: + endpoint = "/api/{}/websites/search".format(self.ver) + res_data = self._call_api("POST", endpoint, json_data={ + "name": site_name, + "page": 1, + "pageSize": 10, + "orderBy": "favorite", + "order": "descending", + "websiteGroupId": 0, + "type": "static" + }) + + if res_data is not None and "data" in res_data and isinstance(res_data["data"], dict): + for item in res_data["data"].get("items", {}): + if item["alias"] == site_name: + return item["id"] + return None + + def get_websites(self): + """ + 获取所有网站信息 + + Returns: + dict: API 返回结果 (网站列表),失败返回 None + """ + # 示例接口路径,请根据您的 Swagger 文档修改 + endpoint = "/api/{}/websites/list".format(self.ver) + return self._call_api("GET", endpoint) + + def add_website_domain(self, website_id: int, new_domain: str, port: int): + """ + 设置网站域名 + """ + # 示例接口路径和参数,请根据您的 Swagger 文档修改 + endpoint = "/api/{}/websites/domains".format(self.ver) + return self._call_api("POST", endpoint, json_data={ + "websiteID": website_id, + "domains": [ + { + "domain": new_domain, + "port": port, + "ssl": False + } + ], + "domainStr": "" + }) + + def website_domains(self, website_id: int): + """ + 获取网站域名列表 + """ + endpoint = "/api/{}/websites/domains/{website_id}".format(self.ver, website_id=website_id) + return self._call_api("GET", endpoint) + + def list_file_test(self): + endpoint = "/api/{}/files/search".format(self.ver) + return self._call_api("POST", endpoint, json_data={ + "containSub": False, + "dir": True, + "expand": True, + "isDetail": True, + "page": 0, + "pageSize": 0, + "path": "/", + "search": "", + "showHidden": True, + "sortBy": "", + "sortOrder": "" + }) + + def list_file(self, path: str) -> Tuple[List[Dict], str]: + endpoint = "/api/{}/files/search".format(self.ver) + res = self._call_api("POST", endpoint, json_data={ + "containSub": False, + "expand": True, + "isDetail": True, + "page": 1, + "pageSize": 1000, + "path": path, + "search": "", + "showHidden": True, + "sortBy": "name", + "sortOrder": "ascending" + }) + if res is None: + return [], "Failed to retrieve file list" + if res["code"] != 200: + return [], res["message"] + if res["data"]["itemTotal"] > 1000: + return [], "The number of directory files exceeds 1000, please compress before operating" + elif res["data"]["itemTotal"] == 0: + return [], "" + return [] if res["data"]["items"] is None else res["data"]["items"], "" + + def files_search(self, path: str, page: int, page_size: int, search: str): + endpoint = "/api/{}/files/search".format(self.ver) + res = self._call_api("POST", endpoint, json_data={ + "containSub": False, + "expand": True, + "isDetail": True, + "page": page, + "pageSize": page_size, + "path": path, + "search": search, + "showHidden": True, + "sortBy": "name", + "sortOrder": "ascending" + }) + if res is None: + return {}, "Failed to retrieve file list" + elif res["code"] != 200: + return {}, res["message"] + return res["data"], "" + + def test_ver(self) -> bool: + self.ver = "v2" + self._call_err = None + res_data = self.list_file_test() + if res_data is None and isinstance(self._call_err, json.JSONDecodeError): + self.ver = "v1" + res_data = self.list_file_test() + if isinstance(res_data, dict): + return True + elif isinstance(res_data, dict): + return True + return False + + def system_status(self): + endpoint = "/api/{}/dashboard/current".format(self.ver) + if self.ver == "v1": + return self._call_api("POST", endpoint, json_data={ + "scope": "basic", + "ioOption": "all", + "netOption": "all" + }) + else: + return self._call_api("GET", endpoint + "/all/all") + + def open_port(self, port: int, protocol: str): + endpoint = "/api/{}/hosts/firewall/port".format(self.ver) + return self._call_api("POST", endpoint, json_data={ + "protocol": protocol, + "source": "anyWhere", + "strategy": "accept", + "port": str(port), + "description": "aaaa", + "operation": "add", + "address": "" + }) + + def ws_shell(self, work_dir: str, cmd: str) -> Optional[str]: + import websocket + import base64 + import threading + from urllib.parse import urlencode, urlparse + if self.ver != "v2": + return None + try: + pre_command = "PS1="" && stty -echo && clear && cd {}".format(work_dir, cmd) + p = { + "cols": 80, + "rows": 24, + "command": pre_command, + "operateNode": "local" + } + token, timestamp = self._generate_token() + u = urlparse(self.panel_address) + url = ("{}://{}/api/{}/hosts/terminal?{}".format + ("ws" if u.scheme == "http" else "wss", u.netloc, self.ver, urlencode(p))) + ws = websocket.WebSocket() + ws.connect(url, header={"1Panel-Token": token, "1Panel-Timestamp": timestamp, }) + if not cmd.endswith("\n"): + cmd += "\n" + ws.send(json.dumps({"type": "cmd", "data": base64.b64encode(cmd.encode("utf-8")).decode("utf-8")})) + res_str = "" + + wait = False + + def close_timeout(): + time.sleep(5) + if wait: + ws.close() + + threading.Thread(target=close_timeout).start() + + while True: + wait = True + result = ws.recv() + wait = False + if result == "": + break + res_data = json.loads(result) + if res_data["type"] == "cmd": + res_str += base64.b64decode(res_data["data"]).decode("utf-8") + + if pre_command in res_str: + res_str = res_str[res_str.index(pre_command) + len(pre_command):] + + res_str = res_str.strip() + real_data = [] + for line in res_str.split("\r\n"): + if line[0] == '\x1b': + continue + real_data.append(line) + + real_data = "\n".join(real_data) + with open("test.txt", "w") as f: + f.write(real_data) + return real_data + except Exception as e: + print("error:{}".format(str(e))) + traceback.print_exc() + return None + + def chunkupload(self, + upload_name: str, + target_path: str, + chunk: Any, chunk_index: int, chunk_count: int) -> Tuple[str, Optional[dict]]: + token, timestamp = self._generate_token() + header = {"User-Agent": "Bt-Panel/Node Manager", "1Panel-Token": token, "1Panel-Timestamp": timestamp} + files = {'chunk': ("chunk", chunk, 'application/octet-stream')} + data = { + 'path': target_path, + 'filename': upload_name, + 'chunkIndex': chunk_index, + 'chunkCount': chunk_count, + } + url = "{}/api/{}/files/chunkupload".format(self.panel_address, self.ver) + try: + resp = requests.post(url, data=data, files=files, headers=header, verify=False, timeout=self.timeout) + if not resp.status_code == 200: + return "The response status code for uploading the file is incorrect. Please check if the node address and API are correct. The current status code is {}, and the return message is:{}".format( + resp.status_code, resp.text), None + + return "", None if len(resp.text) < 3 else json.loads(resp.text) + except Exception as e: + return "Upload file: {} failed with error message:{}".format(upload_name, str(e)), None + + def upload(self, filename: str, target_path: str, upload_name: str) -> str: + token, timestamp = self._generate_token() + header = {"User-Agent": "Bt-Panel/Node Manager", "1Panel-Token": token, "1Panel-Timestamp": timestamp} + try: + with open(filename, 'rb') as f: + file_data = f.read() + except Exception as e: + return "File {} failed to open, please check file permissions, error message is:{}".format(filename, str(e)) + + files = {'file': (upload_name, file_data, 'application/octet-stream')} + data = { + 'path': target_path, + 'overwrite': True + } + url = "{}/api/{}/files/upload".format(self.panel_address, self.ver) + try: + resp = requests.post(url, data=data, files=files, headers=header, verify=False, timeout=self.timeout) + if not resp.status_code == 200: + return "The response status code for uploading the file is incorrect. Please check if the node address and API are correct. The current status code is {}, and the return message is:{}".format( + resp.status_code, resp.text) + if not resp.json()["code"] == 200: + return "Upload file failed with error message:{}".format(resp.json()["message"]) + return "" + except Exception as e: + return "Upload file: {} failed with error message:{}".format(filename, str(e)) + + def files_exits(self, paths: List[str]) -> Optional[dict]: + endpoint = "/api/{}/files/batch/check".format(self.ver) + return self._call_api("POST", endpoint, json_data={ + "paths": paths, + }) + + def download_file(self, filename: str, target_path: str, download_name: str, **kwargs) -> str: + data = self.files_exits([filename]) + file_size: Optional[int] = None + if not isinstance(data, dict): + return "Request file: {} status failed".format(filename) + for i in data["data"]: + if i["path"] == filename: + file_size = i["size"] + break + if file_size is None: + return "File {} does not exist, skip download".format(filename) + try: + if not os.path.isdir(target_path): + os.makedirs(target_path) + except Exception as e: + return "Failed to create folder {}, please check folder permissions, error message is:{}".format(target_path, str(e)) + + if file_size == 0: + fp = open(os.path.join(target_path, download_name), "w") + fp.close() + return "" + + tmp_file = os.path.join(target_path, "{}.{}".format(download_name, uuid4().hex)) + try: + if not os.path.exists(target_path): + os.makedirs(target_path) + fb = open(tmp_file, 'wb') + except Exception as e: + return "Failed to create temporary file {}, please check folder permissions, error message is:{}".format(tmp_file, str(e)) + + call_log = lambda *args, **keyword_args: None + if "call_log" in kwargs and callable(kwargs["call_log"]): + call_log = kwargs["call_log"] + try: + for i in range(0, file_size, 1024 * 1024 * 5): + start = i + end = min(i + 1024 * 1024 * 5 - 1, file_size - 1) + url = "{}/api/{}/files/chunkdownload".format(self.panel_address, self.ver) + data = { + 'path': filename, + 'name': os.path.basename(filename), + } + token, timestamp = self._generate_token() + header = {"User-Agent": "Bt-Panel/Node Manager", "1Panel-Token": token, "1Panel-Timestamp": timestamp} + header.update({"Range": "bytes={}-{}".format(start, end)}) + resp = requests.post(url, json=data, headers=header, verify=False, stream=True, timeout=self.timeout) + if resp.status_code != 206: + return "The response status code for downloading the file is incorrect. Please check if the node address and API are correct. The current status code is {}, and the response header for the returned message is:{}".format( + resp.status_code, resp.headers) + fb.write(resp.content) + call_log(end // file_size, "File Download:{} -> {}, Downloaded size:{}".format(filename, target_path, end)) + fb.flush() + if fb.tell() != file_size: + print(fb.tell(), file_size) + return "Download file {} failed with error message:{}".format(filename, "files are different sizes") + else: + fb.close() + shutil.move(tmp_file, os.path.join(target_path, download_name)) + return "" + except Exception as e: + return "Download file {} failed with error message:{}".format(filename, str(e)) + finally: + if not fb.closed: + fb.close() + if os.path.exists(tmp_file): + os.remove(tmp_file) + + def dir_walk(self, path: str) -> Tuple[List[dict], str]: + dirs = [path] + res = [] + count = 0 + empty_dir = [] + while dirs: + dir_path = dirs.pop(0) + try: + files, err = self.list_file(dir_path) + except Exception as e: + return [], str(e) + if err: + return [], err + if not files: + empty_dir.append(dir_path) + for i in files: + if i["isDir"]: + dirs.append(i["path"]) + else: + res.append({ + "path": i["path"], + "size": i["size"], + "is_dir": 0 + }) + count += 1 + if count > 1000: + return [], "The number of directory files exceeds 1000, please compress before operating" + + return [{"path": i, "size": 0, "is_dir": 1} for i in empty_dir] + res, "" + + def remove_file(self, path: str, is_dir: bool) -> str: + return self._call_api("POST", "/api/{}/files/del".format(self.ver), json_data={ + "isDir": is_dir, + "path": path, + "forceDelete": False + }) + + def download_proxy(self, filename: str): + try: + url = "{}/api/{}/files/download".format(self.panel_address, self.ver) + token, timestamp = self._generate_token() + header = {"User-Agent": "Bt-Panel/Node Manager", "1Panel-Token": token, "1Panel-Timestamp": timestamp} + resp = requests.get(url, params={ + "operateNode": "local", + "path": filename + }, headers=header, stream=True, verify=False, timeout=self.timeout) + if not resp.status_code == 200: + return "The response status code for downloading the file is incorrect. Please check if the node address and API are correct. The current status code is {}, and the return message is:{}".format( + resp.status_code, resp.text) + + from flask import send_file, stream_with_context, Response + filename = os.path.basename(filename) + if resp.headers.get("Content-Disposition", "").find("filename=") != -1: + filename = resp.headers.get("Content-Disposition", "").split("filename=")[1] + + def generate(): + for chunk in resp.iter_content(chunk_size=1024 * 1024 * 5): + if chunk: + yield chunk + + # 设置响应头 + headers = { + 'Content-Type': resp.headers.get('Content-Type', 'application/octet-stream'), + 'Content-Disposition': 'attachment; filename="{}"'.format(filename), + 'Content-Length': resp.headers.get('Content-Length', ''), + 'Accept-Ranges': 'bytes' + } + + # 使用 stream_with_context 确保请求上下文在生成器运行时保持活跃 + return Response( + stream_with_context(generate()), + headers=headers, + direct_passthrough=True + ) + except Exception as e: + return "Download file: {} failed with error message:{}".format(filename, traceback.format_exc()) + + def dir_size(self, path: str): + return self._call_api("POST", "/api/{}/files/size".format(self.ver), json_data={ + "path": path + }) + + def get_sshd_config(self) -> Optional[dict]: + res = self._call_api("POST", "/api/{}/hosts/ssh/search".format(self.ver)) + if res is None: + return None + if res["code"] == 200: + return res.get("data", {}) + return None + + def create_dir(self, path: str): + return self._call_api("POST", "/api/{}/files".format(self.ver), { + "content": "", + "isDir": True, + "isLink": False, + "isSymlink": False, + "linkPath": "", + "mode": 0, + "path": path, + "sub": False + }) + + def restart_panel(self): + return self._call_api("POST", "/api/{}/dashboard/system/restart/{}".format(self.ver, "1panel")) + + def server_reboot(self): + return self._call_api("POST", "/api/{}/dashboard/system/restart/{}".format(self.ver, "system")) + + def get_file_body(self, path: str) -> Tuple[Optional[dict], str]: + res = self._call_api("POST", "/api/{}/files/content".format(self.ver), json_data={ + "path": path, + "expand":True, + "isDetail": False, + "page":1, + "pageSize":100 + }) + if res is None: + return None, "Failed to retrieve file content" + if res["code"] == 200: + return res.get("data", {}), "" + return None, res.get("message") \ No newline at end of file diff --git a/mod/project/node/nodeutil/rsync_api.py b/mod/project/node/nodeutil/rsync_api.py new file mode 100644 index 00000000..67f82d4a --- /dev/null +++ b/mod/project/node/nodeutil/rsync_api.py @@ -0,0 +1,129 @@ +import json +from typing import Optional, Union, Tuple, List, Any, Dict + +from .base import ServerNode, LocalNode + +import public + + +class _RsyncAPIBase: + + def has_rsync_perm(self) -> bool: + raise NotImplementedError() + + def is_setup_rsync(self) -> bool: + raise NotImplementedError() + + def add_module(self, path: str, name: str, password: str, add_white_ips: List[str]) -> Tuple[Optional[dict], str]: + raise NotImplementedError() + + def add_send_task(self, sou): + pass + + def get_secretkey(self, ip_type: str = "local_ip") -> Tuple[str, str]: + pass + + def check_receiver_conn(self, secret_key: str, work_type: int) -> Tuple[Dict, str]: + pass + + + +class BtLocalRsyncAPI(LocalNode, _RsyncAPIBase): + @classmethod + def new_by_id(cls, node_id: int) -> Optional['BtLocalRsyncAPI']: + node_data = public.S('node', self.node_db_obj._DB_FILE).where('id=?', (node_id,)).find() + if not node_data: + return None + + if node_data["api_key"] == "local" and node_data["app_key"] == "local": + return BtLocalRsyncAPI() + + return None + + @staticmethod + def _plugin_func(func_name: str, **kwargs) -> Any: + from panelPlugin import panelPlugin + return panelPlugin().a(public.to_dict_obj({ + "name": "rsync", + "s": func_name, + **kwargs, + })) + + def has_rsync_perm(self) -> bool: + from panelPlugin import panelPlugin + res = panelPlugin().a(public.to_dict_obj({"name": "rsync"})) + if not res["status"]: + return False + return True + + def is_setup_rsync(self) -> bool: + from panelPlugin import panelPlugin + res = panelPlugin().get_soft_find(public.to_dict_obj({"sName": "rsync"})) + try: + return res["setup"] + except: + return False + + def add_module(self, path: str, name: str, password: str, add_white_ips: List[str]) -> Tuple[Optional[dict], str]: + res = self._plugin_func("add_module", **{ + "path": path, + "mName": name, + "password": password, + "add_white_ips": json.dumps(add_white_ips) + }) + return res, "" + + +class BtRsyncAPI(ServerNode, _RsyncAPIBase): + + def _plugin_api_func(self, func_name: str, **kwargs) -> Tuple[Any, str]: + return self._request("/plugin", "a", pdata={ + "name": "rsync", + "s": func_name, + **kwargs + }) + + @classmethod + def new_by_id(cls, node_id: int) -> Optional['BtRsyncAPI']: + node_data = public.S('node', self.node_db_obj._DB_FILE).where('id=?', (node_id,)).find() + if not node_data: + return None + + if node_data["api_key"] == "local" and node_data["app_key"] == "local": + return None + + if node_data['lpver']: + return None + + return BtRsyncAPI(node_data["address"], node_data["api_key"], "") + + def has_rsync_perm(self) -> bool: + data, err = self._request("/plugin", "a", pdata={"name": "rsync"}) + if err: + return False + return data["status"] + + def is_setup_rsync(self) -> bool: + data, err = self._request("/plugin", "get_soft_find", pdata={"sName": "rsync"}) + if err: + return False + try: + return data["setup"] + except: + return False + + def add_module(self, path: str, name: str, password: str, add_white_ips: List[str]) -> Tuple[Optional[dict], str]: + return self._plugin_api_func("add_module", **{ + "path": path, + "mName": name, + "password": password, + "add_white_ips": json.dumps(add_white_ips) + }) + + + +def get_rsync_api_node(node_id: int) -> Optional[Union['BtRsyncAPI', 'BtLocalRsyncAPI']]: + srv = BtLocalRsyncAPI.new_by_id(node_id) + if srv: + return srv + return BtRsyncAPI.new_by_id(node_id) diff --git a/mod/project/node/nodeutil/ssh_warp_scripts/system_info.sh b/mod/project/node/nodeutil/ssh_warp_scripts/system_info.sh new file mode 100644 index 00000000..fb7e29d1 --- /dev/null +++ b/mod/project/node/nodeutil/ssh_warp_scripts/system_info.sh @@ -0,0 +1,783 @@ +#!/bin/bash + +# 确保输出是纯JSON,不包含其他信息 +export LANG=C +export LC_ALL=C + +# 定义临时文件路径 +NETWORK_DATA_FILE="/tmp/system_network_data_$(id -u).json" + +# 收集网络接口数据并计算速率 +collect_network() { + result="{" + first=true + current_time=$(date +%s) + + # 读取之前的数据(如果存在) + prev_data="" + prev_time=0 + if [ -f "$NETWORK_DATA_FILE" ]; then + prev_data=$(cat "$NETWORK_DATA_FILE") + prev_time=$(echo "$prev_data" | grep -o '"time": [0-9]*' | head -1 | awk '{print $2}') + [ -z "$prev_time" ] && prev_time=0 + fi + + # 创建临时存储当前数据的文件 + temp_current_data="/tmp/system_network_current_$(id -u).json" + echo "{\"time\": $current_time," > "$temp_current_data" + + # 计算时间间隔(秒) + time_diff=1 + if [ $prev_time -ne 0 ]; then + time_diff=$((current_time - prev_time)) + [ $time_diff -le 0 ] && time_diff=1 # 防止除以零 + fi + + # 收集所有网络接口的信息 + for iface in $(ls /sys/class/net/ | grep -v "lo"); do + if [ "$first" = true ]; then + first=false + echo "\"interfaces\": {" >> "$temp_current_data" + else + result+="," + echo "," >> "$temp_current_data" + fi + + # 读取当前网络接口统计 + rx_bytes=$(cat /sys/class/net/$iface/statistics/rx_bytes 2>/dev/null || echo 0) + tx_bytes=$(cat /sys/class/net/$iface/statistics/tx_bytes 2>/dev/null || echo 0) + rx_packets=$(cat /sys/class/net/$iface/statistics/rx_packets 2>/dev/null || echo 0) + tx_packets=$(cat /sys/class/net/$iface/statistics/tx_packets 2>/dev/null || echo 0) + + # 保存当前数据到临时文件 + echo "\"$iface\": {\"rx_bytes\": $rx_bytes, \"tx_bytes\": $tx_bytes, \"rx_packets\": $rx_packets, \"tx_packets\": $tx_packets}" >> "$temp_current_data" + + # 计算速率(如果有之前的数据) + down_speed=0 + up_speed=0 + + if [ -n "$prev_data" ]; then + # 提取之前的数据 + prev_rx_bytes=$(echo "$prev_data" | grep -o "\"$iface\".*rx_bytes.*tx_bytes" | grep -o "rx_bytes\": [0-9]*" | awk '{print $2}') + prev_tx_bytes=$(echo "$prev_data" | grep -o "\"$iface\".*tx_bytes.*rx_packets" | grep -o "tx_bytes\": [0-9]*" | awk '{print $2}') + + # 如果找到了之前的数据,计算速率 + if [ -n "$prev_rx_bytes" ] && [ -n "$prev_tx_bytes" ]; then + # 计算差值 + rx_diff=$((rx_bytes - prev_rx_bytes)) + tx_diff=$((tx_bytes - prev_tx_bytes)) + + # 确保值不是负数(可能由于系统重启计数器重置) + [ $rx_diff -lt 0 ] && rx_diff=0 + [ $tx_diff -lt 0 ] && tx_diff=0 + + # 安全地计算速率 + down_speed=$(awk "BEGIN {printf \"%.2f\", $rx_diff / $time_diff / 1024}") + up_speed=$(awk "BEGIN {printf \"%.2f\", $tx_diff / $time_diff / 1024}") + fi + fi + + # 添加接口信息到结果 + result+=$(cat << EOF +"$iface": { + "down": $down_speed, + "up": $up_speed, + "downTotal": $rx_bytes, + "upTotal": $tx_bytes, + "downPackets": $rx_packets, + "upPackets": $tx_packets +} +EOF +) + done + + # 完成当前数据文件 + if [ "$first" = false ]; then + echo "}" >> "$temp_current_data" + else + echo "\"interfaces\": {}" >> "$temp_current_data" + fi + echo "}" >> "$temp_current_data" + + # 移动临时文件到持久文件位置 + mv "$temp_current_data" "$NETWORK_DATA_FILE" + + result+="}" + echo "$result" +} + +# 收集总体网络统计 +collect_total_network() { + current_time=$(date +%s) + + # 初始化计数器 + down_total=0 + up_total=0 + down_packets=0 + up_packets=0 + down_speed=0 + up_speed=0 + + # 读取之前的数据(如果存在) + prev_data="" + prev_time=0 + + if [ -f "$NETWORK_DATA_FILE" ]; then + prev_data=$(cat "$NETWORK_DATA_FILE") + prev_time=$(echo "$prev_data" | grep -o '"time": [0-9]*' | head -1 | awk '{print $2}') + [ -z "$prev_time" ] && prev_time=0 + fi + + # 计算时间间隔(秒) + time_diff=1 + if [ $prev_time -ne 0 ]; then + time_diff=$((current_time - prev_time)) + [ $time_diff -le 0 ] && time_diff=1 # 防止除以零 + fi + + # 收集当前总流量 + for iface in $(ls /sys/class/net/ | grep -v "lo"); do + # 读取当前网络接口统计 + rx_bytes=$(cat /sys/class/net/$iface/statistics/rx_bytes 2>/dev/null || echo 0) + tx_bytes=$(cat /sys/class/net/$iface/statistics/tx_bytes 2>/dev/null || echo 0) + rx_packets=$(cat /sys/class/net/$iface/statistics/rx_packets 2>/dev/null || echo 0) + tx_packets=$(cat /sys/class/net/$iface/statistics/tx_packets 2>/dev/null || echo 0) + + # 累加当前总量 + down_total=$((down_total + rx_bytes)) + up_total=$((up_total + tx_bytes)) + down_packets=$((down_packets + rx_packets)) + up_packets=$((up_packets + tx_packets)) + done + + # 收集之前的总流量 + if [ -f "$NETWORK_DATA_FILE" ]; then + for iface in $(ls /sys/class/net/ | grep -v "lo"); do + # 提取之前的数据 + iface_prev_rx=$(echo "$prev_data" | grep -o "\"$iface\".*rx_bytes.*tx_bytes" | grep -o "rx_bytes\": [0-9]*" | awk '{print $2}') + iface_prev_tx=$(echo "$prev_data" | grep -o "\"$iface\".*tx_bytes.*rx_packets" | grep -o "tx_bytes\": [0-9]*" | awk '{print $2}') + + # 累加总流量 + if [ -n "$iface_prev_rx" ]; then + prev_down_total=$((prev_down_total + iface_prev_rx)) + fi + if [ -n "$iface_prev_tx" ]; then + prev_up_total=$((prev_up_total + iface_prev_tx)) + fi + done + fi + + # 计算总体速率 + if [ $prev_time -ne 0 ]; then + rx_diff=$((down_total - prev_down_total)) + tx_diff=$((up_total - prev_up_total)) + + # 确保值不是负数 + [ $rx_diff -lt 0 ] && rx_diff=0 + [ $tx_diff -lt 0 ] && tx_diff=0 + + down_speed=$(awk "BEGIN {printf \"%.2f\", $rx_diff / $time_diff/ 1024}") + up_speed=$(awk "BEGIN {printf \"%.2f\", $tx_diff / $time_diff/ 1024}") + fi + + # 返回结果 + cat << EOF +{ + "down": $down_speed, + "up": $up_speed, + "downPackets": $down_packets, + "upPackets": $up_packets, + "downTotal": $down_total, + "upTotal": $up_total +} +EOF +} + +# 收集CPU信息 +collect_cpu() { + # 定义临时文件路径(使用 mktemp 提高安全性) + CPU_DATA_FILE="/tmp/system_cpu_data_$(id -u).json" + TEMP_CURRENT_DATA=$(mktemp "/tmp/system_cpu_current_XXXXXXX.json") + + # 初始化返回值 + local current_time + current_time=$(date +%s) + + # 读取当前CPU统计信息 + local current_cpu_stat + if ! current_cpu_stat=$(cat /proc/stat | grep '^cpu ' | awk '{ + user_nice_system = ($2 + $3 + $4) + 0 + idle = $5 + 0 + total = (user_nice_system + idle + ($6 + 0) + ($7 + 0) + ($8 + 0)) + printf "%d,%d,%d", user_nice_system, idle, total + }'); then + echo "Unable to read CPU statistics information" >&2 + return 1 + fi + local current_user_time=$(echo "$current_cpu_stat" | cut -d',' -f1) + local current_idle_time=$(echo "$current_cpu_stat" | cut -d',' -f2) + local current_total_time=$(echo "$current_cpu_stat" | cut -d',' -f3) + + # 收集各核心当前统计信息 + local core_stats=() + while read -r line; do + if [[ $line =~ ^cpu[0-9]+ ]]; then + local core_stat=$(echo "$line" | awk '{printf "%d,%d,%d", $2+$3+$4+$6+$7+$8, $5, $2+$3+$4+$5+$6+$7+$8}') + core_stats+=("$core_stat") + fi + done < /proc/stat + + # 读取之前的数据(如果存在) + local prev_data="" + local prev_time=0 + local prev_user_time=0 + local prev_idle_time=0 + local prev_total_time=0 + local prev_core_stats=() + + if [[ -f "$CPU_DATA_FILE" ]]; then + if ! prev_data=$(cat "$CPU_DATA_FILE"); then + echo "Unable to read historical CPU data" >&2 + return 1 + fi + + prev_time=$(echo "$prev_data" | grep -o '"time": [0-9]*' | head -1 | awk '{print $2}') + prev_user_time=$(echo "$prev_data" | grep -o '"user_time": [0-9]*' | head -1 | awk '{print $2}') + prev_idle_time=$(echo "$prev_data" | grep -o '"idle_time": [0-9]*' | head -1 | awk '{print $2}') + prev_total_time=$(echo "$prev_data" | grep -o '"total_time": [0-9]*' | head -1 | awk '{print $2}') + + # 使用 awk 跨行匹配核心数据 + local i=0 + while true; do + local core_data + core_data=$(echo "$prev_data" | awk -v core="core_$i" ' + $0 ~ "\"" core "\": {" {flag=1; print; next} + flag && /}/ {print; flag=0; exit} + flag {print} + ') + + if [[ -z "$core_data" ]]; then + break + fi + + local core_user_time=$(echo "$core_data" | grep -o '"user_time": [0-9]*' | awk '{print $2}') + local core_idle_time=$(echo "$core_data" | grep -o '"idle_time": [0-9]*' | awk '{print $2}') + local core_total_time=$(echo "$core_data" | grep -o '"total_time": [0-9]*' | awk '{print $2}') + + prev_core_stats+=("$core_user_time,$core_idle_time,$core_total_time") + ((i++)) + done + fi + + # 计算时间间隔(秒) + local time_diff=$((current_time - prev_time)) + ((time_diff <= 0)) && time_diff=1 # 防止除以零 + + # 计算总CPU使用率 + local cpu_usage=0 + if ((prev_total_time > 0)); then + local user_diff=$((current_user_time - prev_user_time)) + local total_diff=$((current_total_time - prev_total_time)) + + # 防止负值(可能由于系统重启导致计数器重置) + ((user_diff < 0)) && user_diff=0 + ((total_diff < 0)) && total_diff=0 + + if ((total_diff > 0)); then + cpu_usage=$(awk "BEGIN {printf \"%.2f\", ($user_diff / $total_diff) * 100}") + fi + fi + + # 获取逻辑核心数 + local logical_cores + logical_cores=$(nproc 2>/dev/null || getconf _NPROCESSORS_ONLN 2>/dev/null || echo 1) + + # 计算每个核心的使用率 + local cpu_cores_usage="[" + local first=true + local i=0 + + for core_stat in "${core_stats[@]}"; do + local core_user_time=$(echo "$core_stat" | cut -d',' -f1) + local core_idle_time=$(echo "$core_stat" | cut -d',' -f2) + local core_total_time=$(echo "$core_stat" | cut -d',' -f3) + + local core_usage=0 + if ((i < ${#prev_core_stats[@]})); then + local prev_core_stat=${prev_core_stats[$i]} + local prev_core_user_time=$(echo "$prev_core_stat" | cut -d',' -f1) + local prev_core_idle_time=$(echo "$prev_core_stat" | cut -d',' -f2) + local prev_core_total_time=$(echo "$prev_core_stat" | cut -d',' -f3) + + local core_user_diff=$((core_user_time - prev_core_user_time)) + local core_total_diff=$((core_total_time - prev_core_total_time)) + + # 防止负值 + ((core_user_diff < 0)) && core_user_diff=0 + ((core_total_diff < 0)) && core_total_diff=0 + + if ((core_total_diff > 0)); then + core_usage=$(awk "BEGIN {printf \"%.2f\", ($core_user_diff / $core_total_diff) * 100}") + fi + fi + + if [[ "$first" == true ]]; then + first=false + else + cpu_cores_usage+="," + fi + + cpu_cores_usage+="$core_usage" + ((i++)) + done + + cpu_cores_usage+="]" + + # 获取CPU名称(优先使用lscpu) + local cpu_name + if command -v lscpu >/dev/null 2>&1; then + cpu_name=$(lscpu | grep "Model name" | head -n 1 | cut -d':' -f2 | sed 's/^[[:space:]]*//') + else + cpu_name=$(grep "model name" /proc/cpuinfo | head -n 1 | cut -d':' -f2 | sed 's/^[[:space:]]*//') + fi + + # 获取核心数(优先使用lscpu) + local physical_cores=1 + local physical_cpus=1 + if command -v lscpu >/dev/null 2>&1; then + physical_cores=$(lscpu | grep "Core(s) per socket" | awk '{print $4}') + physical_cpus=$(lscpu | grep "Socket(s)" | awk '{print $2}') + else + # 备用方法:解析/proc/cpuinfo + physical_cpus=$(grep "physical id" /proc/cpuinfo | sort -u | wc -l) + physical_cores=$(grep "cpu cores" /proc/cpuinfo | head -1 | awk '{print $4}') + + # 如果无法获取核心数,计算保守估算 + if [[ -z "$physical_cores" ]]; then + physical_cores=$(( logical_cores / physical_cpus )) + fi + fi + + # 确保变量有值 + [[ -z "$physical_cores" ]] && physical_cores=1 + [[ -z "$physical_cpus" ]] && physical_cpus=1 + + # 保存当前CPU统计信息到临时文件用于下次比较 + { + echo "{" + echo " \"time\": $current_time," + echo " \"user_time\": $current_user_time," + echo " \"idle_time\": $current_idle_time," + echo " \"total_time\": $current_total_time," + + # 保存每个核心的统计信息 + local i=0 + for core_stat in "${core_stats[@]}"; do + local core_user_time=$(echo "$core_stat" | cut -d',' -f1) + local core_idle_time=$(echo "$core_stat" | cut -d',' -f2) + local core_total_time=$(echo "$core_stat" | cut -d',' -f3) + + echo " \"core_$i\": {" + echo " \"user_time\": $core_user_time," + echo " \"idle_time\": $core_idle_time," + echo " \"total_time\": $core_total_time" + + if ((i < ${#core_stats[@]} - 1)); then + echo " }," + else + echo " }" + fi + + ((i++)) + done + + echo "}" + } > "$TEMP_CURRENT_DATA" + + # 原子性替换文件 + if ! mv "$TEMP_CURRENT_DATA" "$CPU_DATA_FILE"; then + echo "Unable to save CPU data to $CPU_DATA_FILE" >&2 + rm -f "$TEMP_CURRENT_DATA" + return 1 + fi + + # 返回格式化的结果 + echo "[$cpu_usage, $logical_cores, $cpu_cores_usage, \"$cpu_name\", $physical_cores, $physical_cpus]" +} + +# 收集CPU时间 +collect_cpu_times() { + # 获取CPU时间 + cpu_line=$(cat /proc/stat | grep '^cpu ' | awk '{print $2,$3,$4,$5,$6,$7,$8,$9,$10,$11}') + read -r user nice system idle iowait irq softirq steal guest guest_nice <<< "$cpu_line" + + # 获取进程信息 + total_processes=$(ps -e | wc -l) + active_processes=$(ps -eo stat | grep -c "R") + + cat << EOF +{ + "user": $user, + "nice": $nice, + "system": $system, + "idle": $idle, + "iowait": $iowait, + "irq": $irq, + "softirq": $softirq, + "steal": $steal, + "guest": $guest, + "guest_nice": $guest_nice, + "Total number of processes": $total_processes, + "Number of activity processes": $active_processes +} +EOF +} + +# 收集磁盘信息 +collect_disk() { + df_output=$(df -TPB1 -x tmpfs -x devtmpfs | tail -n +2 | grep -vE "/boot\$" | grep -vE "docker/overlay2") + + result="[" + first=true + + while read -r filesystem type total used avail pcent mountpoint; do + if [ "$first" = true ]; then + first=false + else + result+="," + fi + + size_bytes=$total + size_used=$used + size_avail=$avail + + # 格式化为人类可读大小(使用单独的awk命令处理每个值) + size_human=$(echo "$size_bytes" | awk '{ + suffix="BKMGT"; value=$1; + for(i=1; value>=1024 && i=1024 && i=1024 && i/dev/null | grep -E '^(sd|hd|vd|nvme)' 2>/dev/null || echo "") + + for disk in $disks; do + if [ -r "/sys/block/$disk/stat" ]; then + if [ "$first" = true ]; then + first=false + else + result+="," + fi + + # 读取磁盘统计信息 + disk_stats=$(cat /sys/block/$disk/stat 2>/dev/null) + if [ -n "$disk_stats" ]; then + # 使用默认值以防读取失败 + read_comp=0 read_merged=0 read_sectors=0 read_ms=0 write_comp=0 write_merged=0 write_sectors=0 write_ms=0 io_in_progress=0 io_ms_weighted=0 + + # 尝试读取值 + read read_comp read_merged read_sectors read_ms write_comp write_merged write_sectors write_ms io_in_progress io_ms_weighted <<< "$disk_stats" + + # 转换扇区为字节 (512字节为一个扇区) + read_bytes=$((read_sectors * 512)) + write_bytes=$((write_sectors * 512)) + + result+=$(cat << EOF +"$disk": { + "read_count": $read_comp, + "read_merged_count": $read_merged, + "read_bytes": $read_bytes, + "read_time": $read_ms, + "write_count": $write_comp, + "write_merged_count": $write_merged, + "write_bytes": $write_bytes, + "write_time": $write_ms +} +EOF +) + fi + fi + done + + result+="}" + echo "$result" +} + +# 收集负载信息 +collect_load() { + load_avg=$(cat /proc/loadavg) + read -r one five fifteen others <<< "$load_avg" + + cpu_count=$(nproc) + max_load=$((cpu_count * 2)) + + # 安全计算安全负载 + safe_load=$(awk "BEGIN {printf \"%.2f\", $max_load * 0.7}") + + cat << EOF +{ + "one": $one, + "five": $five, + "fifteen": $fifteen, + "max": $max_load, + "limit": $cpu_count, + "safe": $safe_load +} +EOF +} + +# 收集内存信息 +collect_mem() { + mem_info=$(cat /proc/meminfo) + + # 提取内存数据 (单位: KB) + mem_total=$(awk '/^MemTotal/ {print $2; exit}' <<< "$mem_info" || echo 0) + mem_free=$(awk '/^MemFree/ {print $2; exit}' <<< "$mem_info" || echo 0) + mem_available=$(awk '/^MemAvailable/ {print $2; exit}' <<< "$mem_info" || echo "$mem_free") + mem_buffers=$(awk '/^Buffers/ {print $2; exit}' <<< "$mem_info" || echo 0) + mem_cached=$(awk '/^Cached:/ {print $2; exit}' <<< "$mem_info" || echo 0) + mem_sreclaimable=$(awk '/^SReclaimable:/ {print $2; exit}' <<< "$mem_info" || echo 0) + mem_buffers=$(awk '/^Buffers:/ {print $2; exit}' <<< "$mem_info" || echo 0) + mem_shared=$(awk '/^Shmem/ {print $2; exit}' <<< "$mem_info" || echo 0) + + # 确保数值有效 + [ -z "$mem_total" ] && mem_total=0 + [ -z "$mem_free" ] && mem_free=0 + [ -z "$mem_available" ] && mem_available=0 + [ -z "$mem_buffers" ] && mem_buffers=0 + [ -z "$mem_cached" ] && mem_cached=0 + [ -z "$mem_shared" ] && mem_shared=0 + [ -z "$mem_sreclaimable" ] && mem_sreclaimable=0 + [ -z "$mem_buffers" ] && mem_buffers=0 + + # 安全计算实际使用的内存 + mem_real_used=$((mem_total - mem_free - mem_buffers - mem_cached - mem_sreclaimable - mem_buffers)) + [ $mem_real_used -lt 0 ] && mem_real_used=0 + + # 转换为人类可读格式(单独处理每个值) + mem_new_total=$(awk -v bytes="$((mem_total * 1024))" 'BEGIN { + suffix="BKMGT"; value=bytes; + for(i=1; value>=1024 && i=1024 && i/dev/null 2>&1; then + SUDO_CMD="sudo" + else + SUDO_CMD="" + fi + + # 检查dmidecode是否已安装 + if ! command -v dmidecode >/dev/null 2>&1; then + # 尝试安装dmidecode + if command -v apt-get >/dev/null 2>&1; then + $SUDO_CMD apt-get update >/dev/null 2>&1 && $SUDO_CMD apt-get install -y dmidecode >/dev/null 2>&1 + elif command -v yum >/dev/null 2>&1; then + $SUDO_CMD yum install -y dmidecode >/dev/null 2>&1 + elif command -v dnf >/dev/null 2>&1; then + $SUDO_CMD dnf install -y dmidecode >/dev/null 2>&1 + elif command -v zypper >/dev/null 2>&1; then + $SUDO_CMD zypper install -y dmidecode >/dev/null 2>&1 + elif command -v pacman >/dev/null 2>&1; then + $SUDO_CMD pacman -S --noconfirm dmidecode >/dev/null 2>&1 + fi + fi + + # 再次检查dmidecode是否可用 + if command -v dmidecode >/dev/null 2>&1; then + # 首先尝试获取Maximum Capacity + max_capacity=$($SUDO_CMD dmidecode -t memory 2>/dev/null | grep -i "Maximum Capacity:" | head -n1 | awk ' + { + value = $3 + unit = $4 + # 转换为字节 + if (unit == "GB" || unit == "gb") { + bytes = value * 1024 * 1024 * 1024 + } else if (unit == "MB" || unit == "mb") { + bytes = value * 1024 * 1024 + } else if (unit == "TB" || unit == "tb") { + bytes = value * 1024 * 1024 * 1024 * 1024 + } else { + bytes = 0 + } + printf "%.0f", bytes + } + ') + + if [ -n "$max_capacity" ] && [ "$max_capacity" -gt 0 ] 2>/dev/null; then + echo "$max_capacity" + return 0 + fi + + # 如果Maximum Capacity获取失败,尝试获取已安装内存大小 + total_memory=$($SUDO_CMD dmidecode -t memory 2>/dev/null | grep -i "Size:" | grep -i "[0-9]* GB\|[0-9]* MB" | awk ' + BEGIN { total = 0 } + { + value = $2 + unit = $3 + # 转换为字节 + if (unit == "GB" || unit == "gb") { + bytes = value * 1024 * 1024 * 1024 + } else if (unit == "MB" || unit == "mb") { + bytes = value * 1024 * 1024 + } + total += bytes + } + END { + printf "%.0f", total + } + ') + + if [ -n "$total_memory" ] && [ "$total_memory" -gt 0 ] 2>/dev/null; then + echo "$total_memory" + return 0 + fi + fi + + # 如果任何步骤失败,返回0 + echo "0" + return 1 +} + +# 主函数:收集所有信息并生成JSON +main() { + # 收集系统信息 + os_name=$(cat /etc/os-release 2>/dev/null | grep "PRETTY_NAME" | cut -d "=" -f 2 | tr -d '"' || echo "Unknown") + simple_system=$(awk -F= ' + /^ID=/ {id=$2} + /^VERSION_ID=/ {gsub(/"/,"",$2); version=$2} + END { + gsub(/"/,"",id); + print toupper(substr(id,1,1)) substr(id,2) " " version + }' /etc/os-release 2>/dev/null || echo "Unknown") + + hostname=$(hostname) + current_time=$(date "+%Y-%m-%d %H:%M:%S") + version="1.0.0" # 自定义版本 + + # 假设的站点和数据库计数 (实际需要根据具体环境采集) + site_total=0 + database_total=0 + ftp_total=0 + installed=true + + # 收集网络总统计 + network_stats=$(collect_total_network) + down=$(echo "$network_stats" | grep -o '"down": [0-9.]*' | cut -d ":" -f 2 | tr -d " " || echo "0.00") + up=$(echo "$network_stats" | grep -o '"up": [0-9.]*' | cut -d ":" -f 2 | tr -d " " || echo "0.00") + down_packets=$(echo "$network_stats" | grep -o '"downPackets": [0-9]*' | cut -d ":" -f 2 | tr -d " " || echo "0") + up_packets=$(echo "$network_stats" | grep -o '"upPackets": [0-9]*' | cut -d ":" -f 2 | tr -d " " || echo "0") + down_total=$(echo "$network_stats" | grep -o '"downTotal": [0-9]*' | cut -d ":" -f 2 | tr -d " " || echo "0") + up_total=$(echo "$network_stats" | grep -o '"upTotal": [0-9]*' | cut -d ":" -f 2 | tr -d " " || echo "0") + physical_memory=$(collect_physical_memory) + + # 生成最终JSON + cat << EOF +{ + "cpu": $(collect_cpu), + "cpu_times": $(collect_cpu_times), + "disk": $(collect_disk), + "iostat": $(collect_iostat), + "load": $(collect_load), + "mem": $(collect_mem), + "network": $(collect_network), + "system": "$os_name", + "simple_system": "$simple_system", + "title": "$hostname", + "time": "$current_time", + "version": "$version", + "site_total": $site_total, + "database_total": $database_total, + "ftp_total": $ftp_total, + "installed": $installed, + "down": $down, + "up": $up, + "downPackets": $down_packets, + "upPackets": $up_packets, + "downTotal": $down_total, + "upTotal": $up_total, + "physical_memory": $physical_memory +} +EOF +} + +# 执行主函数 +main diff --git a/mod/project/node/nodeutil/ssh_wrap.py b/mod/project/node/nodeutil/ssh_wrap.py new file mode 100644 index 00000000..1cc3ab32 --- /dev/null +++ b/mod/project/node/nodeutil/ssh_wrap.py @@ -0,0 +1,199 @@ +import json +import os.path +import traceback +from typing import Optional, Tuple, Callable, Union, Dict +from mod.base.ssh_executor import SSHExecutor, CommandResult +from mod.project.node.dbutil import ServerNodeDB, Node + +import public + +def is_much_difference(a:float, b:float)->bool: + if a == 0 or b == 0: + return True + ratio = a / b + return ratio >= 10 or ratio <= 0.1 + +class SSHApi: + is_local = False + _local_scripts_dir = os.path.join(os.path.dirname(__file__), "ssh_warp_scripts") + + def __init__(self, host, port: int=22, username: str="root", password=None, pkey=None, + pkey_passwd=None, threading_mod=False, timeout=20): + self._real_ssh_conf = { + "host": host, + "username": username, + "port": port, + "password": password, + "key_file": "", + "passphrase": pkey_passwd, + "key_data": pkey, + "strict_host_key_checking": False, + "allow_agent": False, + "look_for_keys": False, + "threading_mod": threading_mod, + "timeout": timeout, + } + self._ssh_executor: Optional[SSHExecutor] = None + + + @classmethod + def new_by_id(cls, node_id: int, threading_mod=False) -> Optional["SSHApi"]: + data = ServerNodeDB().get_node_by_id(node_id) + if not data or not isinstance(data, dict): + return None + data["ssh_conf"] = json.loads(data["ssh_conf"]) + if not data["ssh_conf"]: + return None + data["ssh_conf"]["threading_mod"] = threading_mod + return cls(**data["ssh_conf"]) + + def _get_ssh_executor(self) -> SSHExecutor: + if self._ssh_executor: + return self._ssh_executor + self._ssh_executor = SSHExecutor(**self._real_ssh_conf) + return self._ssh_executor + + def get_net_work(self) -> Tuple[Optional[dict], str]: + data, err = self._run_script("system_info.sh") + if err: + return None, err + if not data.exit_code == 0: + return None, data.stderr + try: + data = json.loads(data.stdout) + if isinstance(data, dict) and "cpu" in data and "mem" in data: + return self._tans_net_work_form_data(data), "" + return None, "data in wrong format: %s" % str(data) + except Exception as e: + return None, str(e) + + @staticmethod + def _tans_net_work_form_data(data: dict): + data["mem"]["memAvailable"] = round(data["mem"]["memAvailable"] / 1024 / 1024, 2) + data["mem"]["memBuffers"] = round(data["mem"]["memBuffers"] / 1024 / 1024, 2) + data["mem"]["memCached"] = round(data["mem"]["memCached"] / 1024 / 1024, 2) + data["mem"]["memFree"] = round(data["mem"]["memFree"] / 1024 / 1024, 2) + data["mem"]["memRealUsed"] = round(data["mem"]["memRealUsed"] / 1024 / 1024, 2) + data["mem"]["memShared"] = round(data["mem"]["memShared"] / 1024 / 1024, 2) + data["mem"]["memTotal"] = round(data["mem"]["memTotal"] / 1024 / 1024, 2) + data["physical_memory"]= round(data["physical_memory"] / 1024 / 1024, 2) + if is_much_difference(data["mem"]["memTotal"], data["physical_memory"]): + if data["mem"]["memTotal"] >= 1024: + data["mem"]["memNewTotal"] = "%.2fGB" % (data["mem"]["memTotal"] / 1024) + else: + data["mem"]["memNewTotal"] = "%.2fMB" % data["mem"]["memTotal"] + else: + if data["physical_memory"] >= 1024: + data["mem"]["memNewTotal"] = "%.2fGB" % (data["physical_memory"] / 1024) + else: + data["mem"]["memNewTotal"] = "%.2fMB" % data["physical_memory"] + return data + + def _run_script(self, script_name: str) -> Tuple[Optional[CommandResult], str]: + local_file = os.path.join(self._local_scripts_dir, script_name) + if not os.path.exists(local_file): + return None, "Script does not exist" + executor = None + try: + executor = self._get_ssh_executor() + executor.open() + result = executor.execute_local_script_collect(local_file) + return result, "" + except RuntimeError: + return None, "SSH connection failed" + except Exception as e: + return None, str(e) + finally: + if executor: + executor.close() + + def target_file_exits(self, target_file: str) -> Tuple[bool, str]: + try: + executor = self._get_ssh_executor() + executor.open() + result, err = executor.path_exists(target_file) + return result, err + except RuntimeError: + print(traceback.format_exc(), flush=True) + return False, "SSH connection failed" + except Exception as e: + print(traceback.format_exc(), flush=True) + return False, str(e) + + def create_dir(self, path: str) -> Tuple[bool, str]: + try: + executor = self._get_ssh_executor() + executor.open() + result, err = executor.create_dir(path) + return result, err + except RuntimeError: + print(traceback.format_exc()) + return False, "SSH connection failed" + except Exception as e: + return False, str(e) + + def upload_file(self, filename: str, target_path: str, mode: str = "cover", + call_log: Callable[[int, str], None] = None) -> str: + + if not os.path.isfile(filename): + return "File: {} does not exist".format(filename) + + target_file = os.path.join(target_path, os.path.basename(filename)) + path_info = self.path_info(target_file) + if isinstance(path_info, str): + return path_info + + if path_info['exists'] and mode == "ignore": + call_log(0, "File upload:{} -> {},The target file already exists, skip uploading".format(filename, target_file)) + return "" + if path_info['exists'] and mode == "rename": + upload_name = "{}_{}".format(os.path.basename(filename), public.md5(filename)) + call_log(0, "File upload:{} -> {},The target file already exists, it will be renamed to {}".format(filename, target_file, upload_name)) + else: + upload_name = os.path.basename(filename) + + try: + executor = self._get_ssh_executor() + executor.open() + def progress_callback(current_size: int, total_size: int): + if total_size == 0: + return + call_log(current_size * 100 // total_size, "" ) + executor.upload(filename, os.path.join(target_path, upload_name), progress_callback=progress_callback) + except RuntimeError: + print(traceback.format_exc(), flush=True) + return "SSH connection failed" + except Exception as e: + print(traceback.format_exc(), flush=True) + return str(e) + return "" + + def upload_dir_check(self, target_file: str) -> str: + try: + executor = self._get_ssh_executor() + executor.open() + path_info = executor.path_info(target_file) + if not path_info['exists']: + return "" + if path_info['is_dir']: + return "The name path is not a directory" + return "" + except RuntimeError: + print(traceback.format_exc(), flush=True) + return "SSH connection failed" + except Exception as e: + print(traceback.format_exc(), flush=True) + return str(e) + + def path_info(self, path: str) -> Union[str, Dict]: + try: + executor = self._get_ssh_executor() + executor.open() + path_info = executor.path_info(path) + return path_info + except RuntimeError as e: + print(traceback.format_exc(), flush=True) + return "SSH connection failed: {}".format(str(e)) + except Exception as e: + print(traceback.format_exc(), flush=True) + return "Failed to obtain path information:{}".format(str(e)) diff --git a/mod/project/node/task_flow/__init__.py b/mod/project/node/task_flow/__init__.py new file mode 100644 index 00000000..be414d59 --- /dev/null +++ b/mod/project/node/task_flow/__init__.py @@ -0,0 +1,3 @@ +from .file_task import self_file_running_log, file_task_run_sync +from .command_task import command_task_run_sync +from .flow import flow_running_log, flow_useful_version \ No newline at end of file diff --git a/mod/project/node/task_flow/command_task.py b/mod/project/node/task_flow/command_task.py new file mode 100644 index 00000000..419630a9 --- /dev/null +++ b/mod/project/node/task_flow/command_task.py @@ -0,0 +1,195 @@ +import json +import threading +import queue +import time +import traceback +from typing import List, Dict, Callable, Any, Union + +from mod.base.ssh_executor import SSHExecutor +from mod.project.node.dbutil import ServerNodeDB, CommandTask, CommandLog, TaskFlowsDB + + +class CMDTask(object): + + def __init__(self, task: Union[int, CommandTask], log_id: int, call_update: Callable[[Any], None], exclude_nodes: List[int] = None): + self._edb = TaskFlowsDB() + if isinstance(task, int): + self.task = self._edb.CommandTask.find("id = ?", (task,)) + elif isinstance(task, CommandTask): + self.task = task + else: + raise ValueError("Task parameter error") + if not self.task: + raise RuntimeError("The specified task does not exist") + if log_id == 0: + self.task.elogs = self._edb.CommandLog.query("command_task_id = ? ", (self.task.id,)) + else: + self.task.elogs = [self._edb.CommandLog.find("command_task_id = ? AND id = ?", (self.task.id, log_id))] + if not self.task.elogs: + raise RuntimeError("Task has no execution entry") + + self._exclude_nodes = exclude_nodes or [] + self.task.elogs = [x for x in self.task.elogs if x.server_id not in self._exclude_nodes] + + self.task.status = 1 + self._edb.CommandTask.update(self.task) + self.end_queue = queue.Queue() + self.end_status = False + self.status: List[Dict] = [] + self.call_update = call_update + self.status_dict: Dict[str, Union[List[Any], int]] = { + "task_id": self.task.id, + "task_type": "command", + "flow_idx": self.task.step_index -1, + "count": len(self.task.elogs), + "complete": 0, + "error": 0, + "exclude_nodes": self._exclude_nodes, + "error_nodes": [], + "data": [], + } + + def end_func(self): + edb = TaskFlowsDB() + tmp_dict: Dict[int, CommandLog] = {} + last_time = time.time() + update_fields=("status",) + complete_set, error_set = set(), set() + while True: + try: + elog: CommandLog = self.end_queue.get(timeout=0.1) + except queue.Empty: + if self.end_status: + break + else: + continue + except Exception as e: + print(e) + break + + if elog.status in (3, 4): + error_set.add(elog.id) + self.status_dict["error_nodes"].append(int(elog.server_id)) + self.status_dict["error"] = len(error_set) + elif elog.status == 2: + complete_set.add(elog.id) + self.status_dict["complete"] = len(complete_set) + + tmp_dict[elog.id] = elog + if time.time() - last_time > 0.5: + edb.CommandLog.bath_update(tmp_dict.values(), update_fields=update_fields) + self.status_dict["data"] = [ l.to_show_data() for l in tmp_dict.values()] + self.call_update(self.status_dict) + tmp_dict.clear() + + if tmp_dict: + edb.CommandLog.bath_update(tmp_dict.values(), update_fields=update_fields) + self.status_dict["data"] = [ l.to_show_data() for l in tmp_dict.values()] + self.call_update(self.status_dict) + + return + + def start(self): + thread_list = [] + s_db = ServerNodeDB() + end_th = threading.Thread(target=self.end_func) + end_th.start() + + for (idx, log) in enumerate(self.task.elogs): + log.log_idx = idx + if log.status == 2: # 跳过已完成的 + self.end_queue.put(log) + continue + + log.status = 1 + ssh_conf = None + node = s_db.get_node_by_id(log.server_id) + if not node: + log.status = 3 + log.write_log("Node data loss, unable to execute\n") + + else: + ssh_conf = json.loads(node["ssh_conf"]) + if not ssh_conf: + log.status = 3 + log.write_log("Node SSH configuration data lost, unable to execute\n") + + self.end_queue.put(log) + + if not ssh_conf: + continue + + thread = threading.Thread(target=self.run_one, args=(ssh_conf, log)) + thread.start() + thread_list.append(thread) + + for i in thread_list: + i.join() + self.end_status = True + end_th.join() + if self.status_dict["error"] > 0: + self.task.status = 3 + else: + self.task.status = 2 + self._edb.CommandTask.update(self.task) + self._edb.close() + + def run_one(self, ssh_conf: dict, elog: CommandLog): + ssh = SSHExecutor( + host=ssh_conf["host"], + port=ssh_conf["port"], + username=ssh_conf["username"], + password=ssh_conf["password"], + key_data=ssh_conf["pkey"], + passphrase=ssh_conf["pkey_passwd"]) + elog.write_log("Start executing the task\nStart establishing SSH connection...\n") + try: + ssh.open() + def on_stdout(data): + if isinstance(data, bytes): + data = data.decode() + elog.write_log(data) + + elog.write_log("Start executing script...\n\n") + t = time.time() + res_code = ssh.execute_script_streaming( + script_content=self.task.script_content, + script_type=self.task.script_type, + timeout=60*60, + on_stdout=on_stdout, + on_stderr=on_stdout + ) + take_time = round((time.time() - t)* 1000, 2) + elog.write_log("\n\nExecution completed, time-consuming [{}ms]\n".format(take_time)) + if res_code == 0: + elog.status = 2 + elog.write_log("Mission accomplished\n", is_end_log=True) + else: + elog.status = 4 + elog.write_log("Task exception, return status code is:{}\n".format(res_code), is_end_log=True) + self.end_queue.put(elog) + except Exception as e: + traceback.print_exc() + elog.status = 3 + elog.write_log("\nTask failed, error:" + str(e), is_end_log=True) + self.end_queue.put(elog) + return + + +# 同步执行命令相关任务的重试 +def command_task_run_sync(task_id: int, log_id: int) -> Union[str, Dict[str, Any]]: + fdb = TaskFlowsDB() + task = fdb.CommandTask.get_byid(task_id) + if not task: + return "Task does not exist" + log = fdb.CommandLog.get_byid(log_id) + if not log: + return "Subtask does not exist" + if log.status not in (3, 4): + return "Subtask status is not failed, unable to retry" + if log.command_task_id != task_id: + return "The subtask does not belong to this task and cannot be retried" + cmd_task = CMDTask(task, log_id=log_id, call_update=print) + cmd_task.start() + return cmd_task.status_dict + diff --git a/mod/project/node/task_flow/file_task.py b/mod/project/node/task_flow/file_task.py new file mode 100644 index 00000000..e6e18f97 --- /dev/null +++ b/mod/project/node/task_flow/file_task.py @@ -0,0 +1,484 @@ +import json +import os +import threading +import queue +import time +import traceback +import itertools +from datetime import datetime +from typing import List, Dict, Callable, Any, Tuple, Union, Optional +from concurrent.futures import ThreadPoolExecutor, as_completed + +from mod.base.ssh_executor import SSHExecutor +from mod.project.node.dbutil import ServerNodeDB, TaskFlowsDB, TransferTask, TransferFile, TransferLog +from mod.project.node.nodeutil import ServerNode, LPanelNode, SSHApi +from mod.project.node.filetransfer.socket_server import StatusServer, StatusClient, register_cleanup + + +_SOCKET_FILE_DIR = "/tmp/flow_task" +if not os.path.exists(_SOCKET_FILE_DIR): + os.mkdir(_SOCKET_FILE_DIR) + +def _dir_walk(path: str) -> Tuple[List[dict], str]: + if not os.path.isdir(path): + return [], "{} Not a directory".format(path) + res_file = [] + count = 0 + empty_dir = [] + for root, dirs, files in os.walk(path): + if not files: + empty_dir.append(root) + for f in files: + count += 1 + try: + res_file.append({ + "path": os.path.join(root, f), + "size": os.path.getsize(os.path.join(root, f)), + "is_dir": 0 + }) + except: + pass + return [{"path": d, "size": 0, "is_dir": 1} for d in empty_dir] + res_file, "" + + +class FiletransferTask(object): + + def __init__(self, task: Union[int, TransferTask], + call_update: Callable[[Any], None], + exclude_nodes: List[int] = None, + the_log_id: int = None, + ): + self._fdb = TaskFlowsDB() + if isinstance(task, int): + self.task = self._fdb.TransferTask.get_byid(task) + elif isinstance(task, TransferTask): + self.task = task + else: + raise ValueError("Parameter exception") + + if not self.task: + raise RuntimeError("Task does not exist") + + self.exclude_nodes = exclude_nodes or [] + self.the_log_id = max(the_log_id, 0) if isinstance(the_log_id, int) else 0 + self.event_queue = queue.Queue() + self.trans_queue = queue.Queue() + self.mut = threading.Lock() + self._srv_cache: Dict[int, Union[SSHApi, LPanelNode, ServerNode]] = {} + self.status_dict: Dict[str, Any] = { + "task_id": self.task.id, + "task_type": "file", + "flow_idx": self.task.step_index -1, + "count": 0, + "complete": 0, + "error": 0, + "error_nodes": [], + "exclude_nodes": self.exclude_nodes, + "data": None, + } + self.is_trans_end = False + self.call_update = call_update + + def _init_files(self): # 初始化文件列表 + has_file = self._fdb.TransferFile.find("flow_id = ? AND transfer_task_id = ?", (self.task.flow_id, self.task.id)) + # 判断文件列表是否已经初始化 + if has_file: + return + + file_list = [] + for src_item in self.task.path_list: + dst_path = src_item["dst_path"].rstrip("/") + src_item["path"] = src_item["path"].rstrip("/") + if not os.path.exists(src_item["path"]): + continue + src_item["is_dir"] = os.path.isdir(src_item["path"]) + if src_item["is_dir"]: + f_list, err = _dir_walk(src_item["path"]) + if not f_list: + src_item["dst_file"] = os.path.join(dst_path, os.path.basename(src_item["path"])) + file_list.append(src_item) + else: + for f_item in f_list: + f_item["dst_file"] = f_item["path"].replace(os.path.dirname(src_item["path"]), dst_path) + file_list.extend(f_list) + else: + if not os.path.isfile(src_item["path"]): + continue + src_item["dst_file"] = os.path.join(dst_path, os.path.basename(src_item["path"])) + src_item["size"] = os.path.getsize(src_item["path"]) + file_list.append(src_item) + + t_list = [] + for f_item in file_list: + fl = TransferFile( + flow_id=self.task.flow_id, + transfer_task_id=self.task.id, + src_file=f_item["path"], + dst_file=f_item["dst_file"], + file_size=f_item["size"], + is_dir=f_item["is_dir"], + ) + t_list.append(fl) + try: + self._fdb.TransferFile.create(t_list) + except: + print("Failed to initialize file list", traceback.format_exc()) + + def _init_files_log(self): + tf_list = self._fdb.TransferFile.query("flow_id = ? AND transfer_task_id = ?", (self.task.flow_id, self.task.id)) + if not tf_list: + return [] + has_fl = self._fdb.TransferLog.query("transfer_task_id = ? AND transfer_file_id = ?", (self.task.id, tf_list[0].id)) + if has_fl: + return self._fdb.TransferLog.query("transfer_task_id = ?", (self.task.id,)) + + fl_list = [] + for (tf, dst_node_id) in itertools.product(tf_list, self.task.dst_nodes.keys()): + fl = TransferLog( + flow_id=self.task.flow_id, + transfer_task_id=self.task.id, + transfer_file_id=tf.id, + dst_node_idx=int(dst_node_id), + status=0, + progress=0, + message="" + ) + fl_list.append(fl) + + try: + self._fdb.TransferLog.create(fl_list) + except: + print("Failed to initialize file list", traceback.format_exc()) + + + def _get_srv(self, idx: int) -> Union[SSHApi, LPanelNode, ServerNode]: + idx = int(idx) + if idx in self._srv_cache: + return self._srv_cache[idx] + with self.mut: + if idx in self._srv_cache: + return self._srv_cache[idx] + if idx not in self.task.dst_nodes: + raise RuntimeError("Node index is out of range") + srv_data: dict = self.task.dst_nodes[idx] + if srv_data.get("lpver", None): + srv = LPanelNode(srv_data["address"], srv_data["api_key"], srv_data["lpver"]) + elif srv_data["api_key"] or srv_data["app_key"]: + srv = ServerNode(srv_data["address"], srv_data["api_key"], srv_data["app_key"]) + else: + srv_data["ssh_conf"]["threading_mod"] = True # 线程模式, 在不同线程中使用同一个ssh链接的不同会话 + srv = SSHApi(**srv_data["ssh_conf"]) + self._srv_cache[idx] = srv + return srv + + def start(self): + self.task.status = 1 + self._fdb.TransferTask.update(self.task) + self._init_files() + self._init_files_log() + if self.the_log_id > 0: # 重试某个固定任务 + query_where = "transfer_task_id = ? and id = ?" + files_logs = self._fdb.TransferLog.query(query_where, (self.task.id, self.the_log_id)) + else: + if self.exclude_nodes: + # 获取未完成文件列表 + query_where = "transfer_task_id = ? and status not in (2, 4) and dst_node_idx not in ({})".format( + ",".join(["?"] * len(self.exclude_nodes)) + ) + else: + query_where = "transfer_task_id = ? and status not in (2, 4)" + files_logs = self._fdb.TransferLog.query(query_where, (self.task.id, *self.exclude_nodes)) + files_list = self._fdb.TransferFile.query("transfer_task_id = ?", (self.task.id,)) + if not files_logs: + return + files_map = {fl.id: fl for fl in files_list} + for (idx, fl) in enumerate(files_logs): + fl.log_idx = idx + fl.tf = files_map[fl.transfer_file_id] + self.trans_queue.put(fl) + + self.status_dict["count"] = len(files_logs) + + th_event = threading.Thread(target=self.event_func,) + th_event.start() + + with ThreadPoolExecutor(max_workers=8) as executor: + futures = [executor.submit(self.once_trans, worker_id) for worker_id in range(8)] + for i in range(8): + executor.submit(self.once_trans) + for future in as_completed(futures): + print("Completed result:", future.result()) + + self.is_trans_end = True + th_event.join() + if self.the_log_id > 0: + # 如果有未完成或错误的文件, 则任务完成 + if self._fdb.TransferLog.count("transfer_task_id = ? and status in (0,1,3)", (self.task.id, )) == 0: + self.task.status = 3 + else: + self.task.status = 2 + else: + self.task.status = 2 if self.status_dict["error"] == 0 else 3 + self._fdb.TransferTask.update(self.task) + self._fdb.close() + + def once_trans(self, worker_id: int): + while True: + try: + tl = self.trans_queue.get(block=False) + except queue.Empty: + print("worker_id: %s, The queue is empty" % worker_id) + break + except Exception as e: + print("worker_id: %s, Failed to obtain task" % worker_id) + print(traceback.format_exc()) + break + + # 执行一次文件传输 + try: + if tl.status == 2: # 跳过已完成的文件 + self.event_queue.put(tl) + continue + srv = self._get_srv(tl.dst_node_idx) + if tl.tf.is_dir: # 处理空目录 + exits, err = srv.target_file_exits(tl.tf.dst_file) + if err: # 获取文件状态错误 + tl.message = err + tl.status = 3 + self.event_queue.put(tl) + elif exits: # 目标文件已存在 + tl.status = 4 + tl.progress = 100 + self.event_queue.put(tl) + else: # 目标文件不存在, 创建目录 + res, err = srv.create_dir(tl.tf.dst_file) + if err: + tl.message = err + tl.status = 3 + elif isinstance(res, dict): + if res["status"]: + tl.status = 2 + tl.message = "" + tl.progress = 100 + else: + tl.message = res["msg"] + tl.status = 3 + else: + tl.status = 2 + tl.message = "" + tl.progress = 100 + + self.event_queue.put(tl) + else: # 处理文件上传 + tl.status = 1 + self.event_queue.put(tl) + def _call_log(progress, log): + tl.progress = progress + self.event_queue.put(tl) + + err = srv.upload_file( + filename=tl.tf.src_file, + target_path=os.path.dirname(tl.tf.dst_file), + mode="cover", + call_log=_call_log) + + if err: + tl.status = 3 + tl.message = err + else: + tl.status = 2 + tl.message = "" + tl.progress = 100 + + self.event_queue.put(tl) + except Exception as e: + err = traceback.format_exc() + tl.status = 3 + tl.message = str(e) + "\n" + err + self.event_queue.put(tl) + + def event_func(self): + fdb = TaskFlowsDB() + last_time = time.time() + tmp_dict = {} + update_fields = ("status", "message", "progress", "completed_at", "started_at") + complete_set, error_set = set(), set() + error_node_set = set() + while True: + try: + tl: TransferLog = self.event_queue.get(timeout=0.1) + except queue.Empty: + if self.is_trans_end: + break + else: + continue + except Exception as e: + print(e) + break + if tl.status in (2, 4): + complete_set.add(tl.id) + self.status_dict["complete"] = len(complete_set) + if not tl.started_at: + tl.started_at = tl.started_at or datetime.now() + tl.completed_at = tl.completed_at or datetime.now() + elif tl.status == 3: + error_set.add(tl.id) + self.status_dict["error"] = len(error_set) + tl.completed_at = datetime.now() + error_node_set.add(tl.dst_node_idx) + elif tl.status == 1: + tl.started_at = datetime.now() + + tmp_dict[tl.id] = tl + if time.time() - last_time > 0.5: + fdb.TransferLog.bath_update(tmp_dict.values(), update_fields=update_fields) + last_time = time.time() + + self.status_dict["data"] = [i.to_show_data() for i in tmp_dict.values()] + self.status_dict["error_nodes"] = list(error_node_set) + self.call_update(self.status_dict) + tmp_dict.clear() + + + if tmp_dict: + fdb.TransferLog.bath_update(tmp_dict.values(), update_fields=update_fields) + self.status_dict["data"] = [i.to_show_data() for i in tmp_dict.values()] + self.status_dict["error_nodes"] = list(error_node_set) + self.call_update(self.status_dict) + + fdb.close() + + +# 在远程节点上执行文件传输 +class NodeFiletransferTask(object): + + def __init__(self, task: TransferTask, + call_update: Callable[[Any], None], + exclude_nodes: List[int] = None, + the_log_id: int = None, + ): + self.task = task + src_node = task.src_node + self.exclude_nodes = exclude_nodes or [] + self.srv = ServerNode(src_node["address"],src_node["api_key"], src_node["app_key"], src_node["name"]) + self.the_log_id = max(the_log_id, 0) if isinstance(the_log_id, int) else 0 + self.call_update = call_update + self.default_status_data = { + "task_id": self.task.id, + "task_type": "file", + } + self.status_dict = dict() # 状态数据 + + def start(self): + fdb = TaskFlowsDB() + self.task.status = 1 + fdb.TransferTask.update(self.task) + err = self.srv.proxy_transferfile_status(self.task.src_node_task_id, self.exclude_nodes, self.the_log_id, self.handle_proxy_data) + if err: + self.task.status = 3 + self.task.message += ";" + err + else: + if self.status_dict and self.status_dict.get("error", 0): + self.task.status = 3 + else: + self.task.status = 2 + if self.task.message: + self.task.status = 3 + + fdb.TransferTask.update(self.task) + + def handle_proxy_data(self, data): + ret = {"count": 0,"complete": 0,"error": 0, "error_nodes":[], "data": []} + try: + data_dict = json.loads(data) + if "type" not in data_dict: + return + + if data_dict["type"] == "status": + if "init" in data_dict["data"]: # 初始化状态跳过 + return + ret.update(data_dict["data"]) + ret.update(self.default_status_data) + else: # end / error 状态 获取历史数据或错误信息 + if "data" in data_dict: + ret.update(data_dict["data"]) + ret.update(self.default_status_data) + elif "msg" in data_dict: + self.task.message = data_dict["msg"] + return + except: + print(traceback.format_exc()) + ret["data"].append({"message": "Data source node execution transmission exception, please check if the node is functioning properly"}) + ret.update(self.default_status_data) + + self.status_dict = ret + self.call_update(ret) + + +# 本机执行文件传输,返回信息到远程节点 +class SelfFiletransferTask(object): + + def __init__(self, task_id: int, exclude_nodes: List[int] = None, the_log_id: int = None): + self.status_server = StatusServer(self.get_status, (_SOCKET_FILE_DIR + "/file_task_" + str(task_id))) + self.f_task = FiletransferTask(task_id, self.update_status, exclude_nodes, the_log_id) + + @staticmethod + def get_status( init: bool = False) -> Dict: + return {"init": True } + + def start_status_server(self): + t = threading.Thread(target=self.status_server.start_server, args=(), daemon=True) + t.start() + register_cleanup(self.status_server) + + def update_status(self, update_data: Dict): + self.status_server.update_status(update_data) + + def start(self): + self.start_status_server() + self.f_task.start() + return + + +def self_file_running_log(task_id: int, call_log: Callable[[Union[str,dict]], None], timeout:float = 3.0) -> str: + socket_file = _SOCKET_FILE_DIR + "/file_task_" + str(task_id) + while not os.path.exists(socket_file): + if timeout <= 0: + return "Task startup timeout" + timeout -= 0.05 + time.sleep(0.05) + + s_client = StatusClient(socket_file, callback=call_log) + s_client.connect() + s_client.wait_receive() + return "" + + +# 同步执行文件相关任务的重试 +def file_task_run_sync(task_id: int, log_id: int) -> Union[str, Dict[str, Any]]: + fdb = TaskFlowsDB() + task = fdb.TransferTask.get_byid(task_id) + if not task: + return "Task does not exist" + + # 远程节点任务 + if task.src_node_task_id > 0: + node_file_task = NodeFiletransferTask(task, print, exclude_nodes=[], the_log_id=log_id) + node_file_task.start() + return node_file_task.status_dict + + if not log_id: + return "The log ID cannot be empty" + log = fdb.TransferLog.get_byid(log_id) + if not log: + return "log does not exist" + + if log.status != 3: + return "The task status is not abnormal, no need to retry" + + if log.transfer_task_id != task_id: + return "The log ID does not match the task ID" + + file_task = FiletransferTask(task, print, exclude_nodes=[], the_log_id=log_id) + file_task.start() + return file_task.status_dict diff --git a/mod/project/node/task_flow/flow.py b/mod/project/node/task_flow/flow.py new file mode 100644 index 00000000..fe91e691 --- /dev/null +++ b/mod/project/node/task_flow/flow.py @@ -0,0 +1,152 @@ +import json +import os +import threading +import queue +import time +import traceback +from typing import List, Dict, Callable, Any, Union, Optional, Tuple + +from mod.base.ssh_executor import SSHExecutor +from mod.project.node.dbutil import ServerNodeDB, CommandTask, CommandLog, TaskFlowsDB, TransferTask +from mod.project.node.dbutil import TaskFlowsDB +from mod.project.node.nodeutil import LPanelNode, ServerNode, SSHApi +from mod.project.node.filetransfer.socket_server import StatusServer, StatusClient, register_cleanup + +from .command_task import CMDTask +from .file_task import FiletransferTask, NodeFiletransferTask + +_SOCKET_FILE_DIR = "/tmp/flow_task" +if not os.path.exists(_SOCKET_FILE_DIR): + os.mkdir(_SOCKET_FILE_DIR) + + + +class FlowTask: + + def __init__(self, flow_id: int, step_idx: int=0, sub_id: int=0): + self._fdb = TaskFlowsDB() + self.flow = self._fdb.Flow.get_byid(flow_id) + if not self.flow: + raise RuntimeError("Task does not exist") + + self.steps: List[Union[CommandTask, TransferTask]] = [ + *self._fdb.CommandTask.query("flow_id = ?", (flow_id,)), + *self._fdb.TransferTask.query("flow_id = ?", (flow_id,)) + ] + + self.steps.sort(key=lambda x: x.step_index, reverse=False) + + if not self.steps: + raise RuntimeError("The task content does not exist") + self.now_idx = 1 + # 当任意错误出现时,是否继续执行 + self.run_when_error = False + if self.flow.strategy.get("run_when_error", False): + self.run_when_error = True + # 当某个节点出错时,是否在后续步骤中跳过 + self.exclude_when_error = True + if not self.flow.strategy.get("exclude_when_error", True): + self.exclude_when_error = False + + self.status_server = StatusServer(self.get_status, (_SOCKET_FILE_DIR + "/flow_task_" + str(flow_id))) + self.flow_all_nodes = set([int(i) for i in self.flow.server_ids.split("|") if i and i.isdigit()]) + + def get_status(self, init: bool = False): + flow_data = self.flow.to_dict() + flow_data["steps"] = [x.to_show_data() for x in self.steps] + flow_data["now_idx"] = self.now_idx + return flow_data + + def start_status_server(self): + t = threading.Thread(target=self.status_server.start_server, args=(), daemon=True) + t.start() + register_cleanup(self.status_server) + + def update_status(self, update_data: Dict): + self.status_server.update_status(update_data) + + def _run(self) -> bool: + def call_log(log_data): + self.update_status(log_data) + + all_status = True # 任务全部成功 + error_nodes = set() + for step in self.steps: + if not (self.flow_all_nodes - error_nodes): # 没有节点可执行 + continue + if isinstance(step, CommandTask): + if step.status != 2: # 跳过已完成的 + has_err, task_error_nodes = self.run_cmd_task(step, call_log, exclude_nodes=list(error_nodes)) + all_status = all_status and not has_err + if has_err and not self.run_when_error: + return False + if self.exclude_when_error and task_error_nodes: + error_nodes.update(task_error_nodes) + elif isinstance(step, TransferTask): + if step.status != 2: # 跳过已完成的 + has_err, task_error_nodes = self.run_transfer_task(step, call_log, exclude_nodes=list(error_nodes)) + all_status = all_status and not has_err + if has_err and not self.run_when_error: + return False + if self.exclude_when_error and task_error_nodes: + error_nodes.update(task_error_nodes) + self.now_idx += 1 + return all_status + + def start(self): + self.start_status_server() + + self.flow.status = "running" + self._fdb.Flow.update(self.flow) + all_status = self._run() + self.flow.status = "complete" if all_status else "error" + self._fdb.Flow.update(self.flow) + + self.status_server.stop() + # fdb = TaskFlowsDB() + # print(fdb.history_flow_task(self.flow.id)) + return + + @staticmethod + def run_cmd_task(task: CommandTask, call_log: Callable[[Any], None], exclude_nodes: List[int] = None) -> Tuple[bool, List[int]]: + task = CMDTask(task, 0, call_log, exclude_nodes=exclude_nodes) + task.start() + return task.status_dict["error"] > 0, task.status_dict["error_nodes"] + + @staticmethod + def run_transfer_task(task: TransferTask, call_log: Callable[[Any], None], exclude_nodes: List[int] = None) -> Tuple[bool, List[int]]: + if task.src_node_task_id != 0: + task = NodeFiletransferTask(task, call_log, exclude_nodes=exclude_nodes, the_log_id=None) + task.start() + return task.status_dict["error"] > 0, task.status_dict["error_nodes"] + else: + task = FiletransferTask(task, call_log, exclude_nodes=exclude_nodes) + task.start() + return task.status_dict["error"] > 0, task.status_dict["error_nodes"] + + +def flow_running_log(task_id: int, call_log: Callable[[Union[str,dict]], None], timeout:float = 3.0) -> str: + socket_file = _SOCKET_FILE_DIR + "/flow_task_" + str(task_id) + while not os.path.exists(socket_file): + if timeout <= 0: + return "Task startup timeout" + timeout -= 0.05 + time.sleep(0.05) + + s_client = StatusClient(socket_file, callback=call_log) + s_client.connect() + s_client.wait_receive() + return "" + +def flow_useful_version(ver: str): + # # todo: 临时处理, 上线前确认最新版本号检查逻辑 + # return True + try: + ver_list = [int(i) for i in ver.split(".")] + if ver_list[0] > 11: + return True + if ver_list[0] == 11 and ver_list[1] >= 4: + return True + except: + pass + return False \ No newline at end of file diff --git a/script/btpyprojectenv.sh b/script/btpyprojectenv.sh new file mode 100644 index 00000000..ef873f35 --- /dev/null +++ b/script/btpyprojectenv.sh @@ -0,0 +1,102 @@ +_BT_PYTHON_NAME_MAP_FILE="/www/server/panel/data/python_project_name2env.txt" + +ACTIVATE_NAME="${1}" +if [ -z "${ACTIVATE_NAME}" ]; then + echo "Usage: \" source py-project-env \" to activate virtual environment" + echo "Usage: \" bt_env_deactivate \" command to exit virtual environment and return to previous environment" + echo "(Only supported on Linux servers)" + return 1 +fi + +_bt_map_safe_get() { + awk -F: -v key="$1" '$1 == key {print $2; exit}' "${_BT_PYTHON_NAME_MAP_FILE}" 2>/dev/null +} + +if [ -z "${_BT_PROJECT_ENV}" ]; then + _BT_PROJECT_ENV="$(_bt_map_safe_get ${ACTIVATE_NAME})" +else + ACTIVATE_NAME=$(basename "${_BT_PROJECT_ENV}") +fi + +if [ ! -d "${_BT_PROJECT_ENV}" ]; then + echo "Virtual environment for project: ${ACTIVATE_NAME} does not exist" + return 1 +fi + +# This file must be used with "source bin/activate" *from bash* +# You cannot run it directly + +bt_env_deactivate () { + # reset old environment variables + if [ -n "${_OLD_VIRTUAL_PATH:-}" ] ; then + PATH="${_OLD_VIRTUAL_PATH:-}" + export PATH + unset _OLD_VIRTUAL_PATH + fi + if [ -n "${_OLD_VIRTUAL_PYTHONHOME:-}" ] ; then + PYTHONHOME="${_OLD_VIRTUAL_PYTHONHOME:-}" + export PYTHONHOME + unset _OLD_VIRTUAL_PYTHONHOME + fi + + # This should detect bash and zsh, which have a hash command that must + # be called to get it to forget past commands. Without forgetting + # past commands the $PATH changes we made may not be respected + if [ -n "${BASH:-}" ] || [ -n "${ZSH_VERSION:-}" ] ; then + hash -r 2> /dev/null + fi + + if [ -n "${_OLD_VIRTUAL_PS1:-}" ] ; then + PS1="${_OLD_VIRTUAL_PS1:-}" + export PS1 + unset _OLD_VIRTUAL_PS1 + fi + + unset VIRTUAL_ENV + unset VIRTUAL_ENV_PROMPT + if [ ! "${1:-}" = "nondestructive" ] ; then + # Self destruct! + unset -f bt_env_deactivate + fi +} + +# unset irrelevant variables +bt_env_deactivate nondestructive + +_OLD_VIRTUAL_PATH="$PATH" + +if [ -d "${_BT_PROJECT_ENV}/bin" ] ; then + VIRTUAL_ENV="${_BT_PROJECT_ENV}" + PATH="$VIRTUAL_ENV/bin:$PATH" +else + VIRTUAL_ENV="${_BT_PROJECT_ENV}" + PATH="$VIRTUAL_ENV:$PATH" +fi + +# use the path as-is +export VIRTUAL_ENV + +export PATH + +# unset PYTHONHOME if set +# this will fail if PYTHONHOME is set to the empty string (which is bad anyway) +# could use `if (set -u; : $PYTHONHOME) ;` in bash +if [ -n "${PYTHONHOME:-}" ] ; then + _OLD_VIRTUAL_PYTHONHOME="${PYTHONHOME:-}" + unset PYTHONHOME +fi + +if [ -z "${VIRTUAL_ENV_DISABLE_PROMPT:-}" ] ; then + _OLD_VIRTUAL_PS1="${PS1:-}" + PS1="(${ACTIVATE_NAME}) ${PS1:-}" + export PS1 + VIRTUAL_ENV_PROMPT="(${ACTIVATE_NAME}) " + export VIRTUAL_ENV_PROMPT +fi + +# This should detect bash and zsh, which have a hash command that must +# be called to get it to forget past commands. Without forgetting +# past commands the $PATH changes we made may not be respected +if [ -n "${BASH:-}" ] || [ -n "${ZSH_VERSION:-}" ] ; then + hash -r 2> /dev/null +fi diff --git a/script/install_python.sh b/script/install_python.sh new file mode 100644 index 00000000..6798d66a --- /dev/null +++ b/script/install_python.sh @@ -0,0 +1,55 @@ +#!/bin/bash +pyversion=${1} +py_path=/www/server/pyporject_evn/versions +py_cache=/www/server/pyporject_evn/versions/cached +cpuCore=$(cat /proc/cpuinfo |grep "physical id"|sort |uniq|wc -l) + +mkdir -p ${py_path} +download_Url='https://node.aapanel.com' + +install_python() { + \cp ${py_cache}/Python-${pyversion}.tar.xz /tmp/Python-${pyversion}.tar.xz + cd /tmp/ && xz -d /tmp/Python-${pyversion}.tar.xz && tar -xvf /tmp/Python-${pyversion}.tar + cd /tmp/Python-${pyversion} || exit + if [ ${pyversion:0:1} -ge 2 ]; then + openssl111check=$(openssl version | grep 1.1.1) + if [ -z "${openssl111check}" ]; then + Install_Openssl111 + WITH_SSL="--with-openssl=/usr/local/openssl111" + else + WITH_SSL="" + fi + cd /tmp/Python-${pyversion} || exit + ./configure --prefix=${py_path}/${pyversion} ${WITH_SSL} -with-openssl-rpath=auto + make -j${cpuCore} + make install + rm -rf /tmp/Python-* + else + ./configure --prefix=${py_path}/${pyversion} + make -j${cpuCore} + make install + rm -rf /tmp/Python-* + fi +} + +Install_Openssl111() { + opensslCheck=$(/usr/local/openssl111/bin/openssl version | grep 1.1.1) + if [ -z "${opensslCheck}" ]; then + opensslVersion="1.1.1o" + cd /tmp/ + wget ${download_Url}/src/openssl-${opensslVersion}.tar.gz + tar -zxf openssl-${opensslVersion}.tar.gz + rm -f openssl-${opensslVersion}.tar.gz + cd openssl-${opensslVersion} || exit + ./config --prefix=/usr/local/openssl111 zlib-dynamic + make -j${cpuCore} + make install + echo "/usr/local/openssl111/lib" >>/etc/ld.so.conf.d/openssl111.conf + ldconfig + ldconfig /lib64 + cd .. + rm -rf openssl-${opensslVersion} + fi +} + +install_python diff --git a/script/node_command_executor.py b/script/node_command_executor.py new file mode 100644 index 00000000..e8a8ebee --- /dev/null +++ b/script/node_command_executor.py @@ -0,0 +1,58 @@ +# coding: utf-8 + +import sys +import os +import traceback +import argparse + +os.chdir('/www/server/panel/') +sys.path.insert(0, "/www/server/panel/class/") +sys.path.insert(0, "/www/server/panel/") +if "/www/server/panel/class" not in sys.path: + sys.path.insert(0, "/www/server/panel/class") +import public + +parser = argparse.ArgumentParser() +parser.add_argument("--task_type", type=str, required=True, help="Task type") +parser.add_argument("--task_id", type=int, required=True, help="Task ID") +parser.add_argument("--exclude_nodes", type=str, help="Exclude nodes") +args = parser.parse_args() + +task_type, task_id = args.task_type, args.task_id +ex_ids = [] +if args.exclude_nodes: + ex_ids = [int(i) for i in args.exclude_nodes.split(",")] + + +pid_file = "{}/logs/executor_log/{}_{}_0.pid".format(public.get_panel_path(), task_type, task_id) +with open(pid_file, "w") as f: + f.write(str(os.getpid())) + +def cmd_task(main_id: int, log_id: int = 0): + from mod.project.node.task_flow.command_task import CMDTask + _task = CMDTask(main_id, log_id, print) + _task.start() + +def file_task(main_id: int, exclude_nodes: list, log_id: int = 0): + from mod.project.node.task_flow.file_task import SelfFiletransferTask + _task = SelfFiletransferTask(main_id, exclude_nodes, log_id) + _task.start() + +def flow_task(main_id: int): + from mod.project.node.task_flow.flow import FlowTask + _task = FlowTask(main_id) + _task.start() + +try: + if task_type == "command": + cmd_task(task_id) + elif task_type == "file": + file_task(task_id, ex_ids) + elif task_type == "flow": + flow_task(task_id) + +except: + traceback.print_exc() + with open('/tmp/node_flow_task.log', 'w') as f: + f.write(traceback.format_exc()) +os.remove(pid_file) \ No newline at end of file diff --git a/script/node_file_transfers.py b/script/node_file_transfers.py new file mode 100644 index 00000000..5676d925 --- /dev/null +++ b/script/node_file_transfers.py @@ -0,0 +1,17 @@ +# coding: utf-8 + +import sys +import os +import traceback + +os.chdir('/www/server/panel/') +sys.path.insert(0, "/www/server/panel/class/") +sys.path.insert(0, "/www/server/panel/") + +try: + from mod.project.node.filetransfer import run_file_transfer_task + run_file_transfer_task(int(sys.argv[1])) +except: + traceback.print_exc() + with open('/tmp/node_file_transfer.pl', 'w') as f: + f.write(traceback.format_exc()) diff --git a/script/node_monitor.py b/script/node_monitor.py new file mode 100644 index 00000000..38ca2591 --- /dev/null +++ b/script/node_monitor.py @@ -0,0 +1,20 @@ +# coding: utf-8 + +import sys +import os +import traceback +import time + +os.chdir('/www/server/panel/') +sys.path.insert(0, "/www/server/panel/class/") +sys.path.insert(0, "/www/server/panel/") + +try: + from mod.project.node.nodeutil import monitor_all_node_status + + monitor_all_node_status() +except Exception as e: + traceback.print_exc() + with open('/tmp/node_monitor.pl', 'w') as f: + f.write(str(int(time.time()))) + f.write("{}".format(traceback.format_exc())) diff --git a/script/nodejs-service.py b/script/nodejs-service.py new file mode 100644 index 00000000..8c721df8 --- /dev/null +++ b/script/nodejs-service.py @@ -0,0 +1,35 @@ +#!/www/server/panel/pyenv/bin/python +#coding: utf-8 +import os,sys +os.chdir("/www/server/panel") +sys.path.insert(0,"class/") + +from projectModel.nodejsModel import main +import public +p = main() + +if len(sys.argv) < 3: + print("Usage: nodejs-service [project_name] [start|stop|restart]") + sys.exit() +get = public.dict_obj() +get.project_name = sys.argv[1].strip() +action = sys.argv[2].strip() +if action not in ['start','stop','restart','status']: + print("Usage: nodejs-service [project_name] [start|stop|restart]") + sys.exit() + +if action == 'start': + res = p.start_project(get) +elif action == 'stop': + res = p.stop_project(get) +elif action == 'restart': + res = p.restart_project(get) +elif action == 'status': + res = p.get(get) + +if res['status']: + print("\033[1;32mSUCCESS: " + res['data'] + "\033[0m") +else: + print("\033[1;31mERROR: " + res['error_msg'] + "\033[0m") + + diff --git a/script/restart_services.py b/script/restart_services.py index fea812fb..ea1dc0b6 100644 --- a/script/restart_services.py +++ b/script/restart_services.py @@ -13,7 +13,6 @@ import fcntl os.chdir("/www/server/panel") sys.path.insert(0, "class/") sys.path.insert(0, "class_v2/") -from public import readFile SETUP_PATH = "/www/server" DATA_PATH = os.path.join(SETUP_PATH, "panel/data") @@ -25,6 +24,21 @@ DAEMON_RESTART_RECORD = os.path.join(DATA_PATH, "daemon_restart_record.pl") MANUAL_FLAG = os.path.join(SETUP_PATH, "panel/data/mod_push_data", "manual_flag.pl") +def read_file(filename: str): + fp = None + try: + fp = open(filename, "rb") + f_body_bytes: bytes = fp.read() + f_body = f_body_bytes.decode("utf-8", errors='ignore') + fp.close() + return f_body + except Exception: + return False + finally: + if fp and not fp.closed: + fp.close() + + def run_command(cmd, timeout=5) -> str: try: result = subprocess.run( @@ -213,7 +227,7 @@ SERVICES_MAP = { f"{SETUP_PATH}/nginx/version.pl", ), "openlitespeed": ( - "litespeed", "/tmp/lshttpd/lsphp.sock", "/usr/local/lsws/bin/lswsctrl", + "litespeed", "/tmp/lshttpd/lshttpd.pid", "/usr/local/lsws/bin/lswsctrl", "/usr/local/lsws/VERSION", ), "redis": ( @@ -347,7 +361,12 @@ class ServicesHelper: # 进程是否名字匹配 with open(f"/proc/{pid}/comm", "r") as f: proc_name = f.read().strip() - return proc_name == self.nick_name or proc_name == self._serviced + + # 特殊处理 mysql + if self.nick_name != "mysql": + return proc_name == self._serviced or proc_name == self.nick_name + else: + return proc_name in ["mysqld", "mariadbd"] except (FileNotFoundError, IndexError): return False except Exception: @@ -507,10 +526,12 @@ class ServicesHelper: else: cmd = [bash_path, act] - result = run_command(cmd) - if not result and act in ["start", "restart"]: - write_logs(f"Failed to {act} {self.nick_name}, error: command returned no output.") - + subprocess.Popen( + cmd, + stdout=subprocess.DEVNULL, + stderr=subprocess.DEVNULL, + start_new_session=True + ) except Exception as e: print(str(e)) write_logs(f"Failed to {act} {self.nick_name}, error: {e}") @@ -629,7 +650,7 @@ class DaemonManager: def safe_read(): """服务守护进程服务列表""" try: - res = readFile(DAEMON_SERVICE) + res = read_file(DAEMON_SERVICE) return json.loads(res) if res else [] except: return [] @@ -639,7 +660,7 @@ class DaemonManager: def manual_safe_read(): """手动干预服务字典, 0: 需要干预, 1: 被手动关闭的""" try: - manual = readFile(MANUAL_FLAG) + manual = read_file(MANUAL_FLAG) return json.loads(manual) if manual else {} except: return {} @@ -705,8 +726,8 @@ class RestartServices: @DaemonManager.read_lock def main(self): - manaul = readFile(MANUAL_FLAG) - services = readFile(DAEMON_SERVICE) + manaul = read_file(MANUAL_FLAG) + services = read_file(DAEMON_SERVICE) try: manual_info = json.loads(manaul) if manaul else {} check_list = json.loads(services) if services else [] @@ -731,13 +752,9 @@ class RestartServices: write_logs(f"Service [ {obj.nick_name} ] is Not Running, Try to start it...") if not self._overhead(obj.nick_name): - obj.script("start") - time.sleep(3) - if not obj.is_running: - if not self._overhead(obj.nick_name): - obj.script("restart") + obj.script("restart") - if manual_info.get(obj.nick_name) == 1: + if obj.is_running and manual_info.get(obj.nick_name) == 1: # service is running, fix the wrong flag manual_info[obj.nick_name] = 0 # under lock file read lock diff --git a/script/run_log_split.py b/script/run_log_split.py new file mode 100644 index 00000000..bb5048c8 --- /dev/null +++ b/script/run_log_split.py @@ -0,0 +1,171 @@ +#!/usr/bin/python +# coding: utf-8 +# ----------------------------- +# Website run log split script +# ----------------------------- +import sys +import os +import time +import glob + +os.chdir("/www/server/panel") +if '/www/server/panel' not in sys.path: + sys.path.insert(0,'/www/server/panel') +if '/www/server/panel/class' not in sys.path: + sys.path.insert(0,'class/') +if '/www/server/panel/class_v2' not in sys.path: + sys.path.insert(0,'class_v2/') + +import public, json + +try: + from projectModelV2.pythonModel import main as pythonMod + from projectModelV2.nodejsModel import main as nodejsMod + + mods = { + "python": pythonMod(), + "node": nodejsMod(), + } +except Exception as e: + print(str(e)) + print("****** project split log task error ******") + +print('==================================================================') +print('★[' + time.strftime("%Y/%m/%d %H:%M:%S") + '] split log task start ★') +print('==================================================================') + + +class LogSplit: + __slots__ = ("stype", "log_size", "limit", "_time", "compress", "exclude_sites") + + @classmethod + def build_log_split(cls, name): + logsplit = cls() + path = '{}/data/run_log_split.conf'.format(public.get_panel_path()) + data = {} + if os.path.exists(path): + try: + data = json.loads(public.readFile(path)) + except: + public.ExecShell("rm -f {}".format(path)) + return "file not found" + _clean(data) + public.writeFile(path, json.dumps(data)) + target = data.get(name) + if not target : + return "file not found" + else: + for i in cls.__slots__: + if i in target: + setattr(logsplit, i, target[i]) + logsplit._show() + return logsplit + + def __init__(self, split_type: str = "day", limit: int = 180, log_size: int = 1024, compress: bool = False) -> None: + self.stype = split_type + self.log_size = log_size + self.limit = limit + self._time = time.strftime("%Y-%m-%d_%H%M%S") + self.compress = compress + self.exclude_sites = [] + + def _show(self): + if self.stype == "day": + print('|---Split method: Split 1 copy per day') + else: + print('|---Split method: Split by file size, split when file exceeds {}'.format(public.to_size(self.log_size))) + print('|---Currently keeping the latest [{}] copies'.format(self.limit)) + + def _to_zip(self, file_path): + os.system('gzip {}'.format(file_path)) + + def _del_surplus_log(self, history_log_path, log_prefix): + if not os.path.exists(history_log_path): + os.makedirs(history_log_path, mode=0o755) + logs = sorted(glob.glob(history_log_path + '/' + log_prefix + "*_log.*")) + + count = len(logs) + if count >= self.limit: + for i in logs[:count - self.limit + 1]: + if os.path.exists(i): + os.remove(i) + print('|---Surplus log [' + i + '] has been deleted!') + + def __call__(self, pjanme: str, sfile: str, log_prefix: str): + base_path, filename = sfile.rsplit("/", 1) + history_log_path = '{}/{}-history_logs'.format(base_path, pjanme) + + if self.stype == 'size' and os.path.getsize(sfile) < self.log_size: + print('|---File size has not exceeded [{}], skipping!'.format(public.to_size(self.log_size))) + return + + self._del_surplus_log(history_log_path, log_prefix) + + if os.path.exists(sfile): + history_log_file = history_log_path + '/' + log_prefix + '_' + self._time + '_log.log' + if not os.path.exists(history_log_file): + with open(history_log_file, 'wb') as hf, open(sfile, 'r+b') as lf: + while True: + chunk_data = lf.read(1024*100) + if not chunk_data: + break + hf.write(chunk_data) + lf.seek(0) + lf.truncate() + if self.compress: + self._to_zip(history_log_file) + + print('|---Log has been split to: ' + history_log_file + (".gz" if self.compress else "")) + else: + print('|---Target log file {} for project {} is missing, please note'.format(sfile, pjanme)) + + + +def main(name): + logsplit = LogSplit.build_log_split(name) + if logsplit=="file not found": + print( + "****** Detected panel project log split task configuration is empty," + " please reset project log split task ******" + ) + return + if not logsplit: + print("****** Panel project log split task configuration file is missing ******") + return + project = public.M('sites').where("project_type <> ? and name = ?", ("PHP", name)).find() + project['project_config'] = json.loads(project['project_config']) + for_split_func = getattr(mods.get(project["project_type"].lower()), "for_split") + if callable(for_split_func): + print('|---Starting to operate on {} project [{}] logs'.format(project["project_type"], project["name"])) + try: + for_split_func(logsplit, project) + print('|---Completed log split task for {} project [{}]'.format(project["project_type"], project["name"])) + except: + import traceback + print(traceback.format_exc()) + print('|---Log split task error for {} project [{}]'.format(project["project_type"], project["name"])) + else: + print("****** Panel project log split task error ******") + print('================= All log split tasks completed ==================') + + +def _clean(data): + res = public.M('crontab').field('name').select() + del_config = [] + for i in data.keys(): + for j in res: + if j["name"].find(i) != -1 and j["name"].find("log split"): + break + else: + del_config.append(i) + + for i in del_config: + del data[i] + + +if __name__ == '__main__': + if len(sys.argv) == 2: + name = sys.argv[1].strip() + main(name) + else: + print("****** Panel project log split task configuration parameter error ******") \ No newline at end of file