Проверить доступность сайта

CURL-запрос выполнен без ошибок.
Время распознавания ДНС-имени: 0.116721
IP-адрес сервера: 144.31.230.35
Время соединения с сервером: 0.152864
Время установления SSL-соединения: 0.192696
Время перед началом ответа: 0.226293
Общее время выполнения запроса: 0.268612
Код HTTP-ответа сервера: 200 ( Ok )
Принято байт всего: 29470
Код HTTP-ответа среди заданных: Да
Цепочка сертификатов:
- доверие к цепочке: Да
- даты сертификатов валидны: Да
- имя сервера в сертификате: Да

HTTP/2 200
accept-ranges: bytes
alt-svc: h3=":8443"; ma=2592000
content-type: text/html; charset=utf-8
etag: "dh14wc6l9nggmiv"
last-modified: Thu, 12 Mar 2026 21:50:22 GMT
server: Caddy
vary: Accept-Encoding
content-length: 29191
date: Fri, 13 Mar 2026 16:52:17 GMT

<!DOCTYPE html>
<html lang="ru">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no">
    <title>Статус подключения | NETWAVE.TODAY</title>
    
    <link rel="icon" type="image/x-icon" href="/favicon.ico">
    <link rel="icon" type="image/png" sizes="32x32" href="/favicon-32x32.png">
    <link rel="icon" type="image/png" sizes="16x16" href="/favicon-16x16.png">
    <link rel="apple-touch-icon" sizes="180x180" href="/apple-touch-icon.png">

    <style>
        :root {
            /* Ультра-темный фон */
            --bg-dark: #0a0510; 
            --card-bg: rgba(255, 255, 255, 0.02);
            
            /* Палитра */
            --accent-purple: #9d4edd;
            --accent-burgundy: #e01e37;
            --accent-orange: #ff7900;
            --accent-green: #2ecc71;
            --telegram-blue: #24A1DE; 
            
            /* Цвета текста и бордеры */
            --text-main: #ffffff;
            --text-dim: #a3a3a3;
            --flat-border: rgba(255, 255, 255, 0.05);
            --nav-height: 70px;
        }

        * { margin: 0; padding: 0; box-sizing: border-box; -webkit-font-smoothing: antialiased; }
        html { scroll-behavior: smooth; height: 100%; }
        body {
            font-family: 'Inter', sans-serif;
            background-color: var(--bg-dark);
            color: var(--text-main);
            overflow-x: hidden;
            line-height: 1.6;
            -webkit-user-select: none;
            -moz-user-select: none;
            -ms-user-select: none;
            user-select: none;
            display: flex;
            flex-direction: column;
            min-height: 100vh;
        }

        /* --- ИНДИКАТОР ЗАГРУЗКИ (LOADER) --- */
        .top-loader {
            position: fixed; top: 0; left: 0; width: 0%; height: 3px;
            background: linear-gradient(90deg, var(--accent-orange), var(--accent-burgundy), var(--accent-purple));
            z-index: 9999; box-shadow: 0 0 10px var(--accent-orange);
            animation: page-load 1.5s cubic-bezier(0.4, 0, 0.2, 1) forwards;
        }
        @keyframes page-load { 0% { width: 0%; opacity: 1; } 80% { width: 100%; opacity: 1; } 100% { width: 100%; opacity: 0; display: none; } }

        /* --- ЖИВОЙ ФОН И СЕТКА --- */
        .bg-wrapper { position: fixed; top: 0; left: 0; width: 100%; height: 100%; z-index: -1; background: var(--bg-dark); overflow: hidden; }
        .bg-wrapper::after { content: ''; position: absolute; top: 0; left: 0; width: 100%; height: 100%; background: radial-gradient(circle at center, transparent 30%, var(--bg-dark) 100%); z-index: 2; pointer-events: none; }

        .orb { position: absolute; border-radius: 50%; filter: blur(120px); will-change: transform; z-index: 0; pointer-events: none; opacity: 0.2; }
        .orb-1 { top: 10%; left: 10%; width: 40vw; height: 40vw; min-width: 400px; min-height: 400px; background: var(--accent-purple); animation: move-orb-1 20s infinite alternate ease-in-out; }
        .orb-2 { top: 50%; right: 10%; width: 45vw; height: 45vw; min-width: 450px; min-height: 450px; background: var(--accent-orange); animation: move-orb-2 25s infinite alternate ease-in-out; }
        .orb-3 { bottom: 10%; left: 30%; width: 50vw; height: 50vw; min-width: 500px; min-height: 500px; background: var(--accent-burgundy); animation: move-orb-3 22s infinite alternate ease-in-out; }

        @keyframes move-orb-1 { 0% { transform: translate(0, 0) scale(1); } 50% { transform: translate(50vw, 30vh) scale(1.1); } 100% { transform: translate(20vw, 60vh) scale(0.9); } }
        @keyframes move-orb-2 { 0% { transform: translate(0, 0) scale(1); } 50% { transform: translate(-50vw, -20vh) scale(1.15); } 100% { transform: translate(-20vw, 40vh) scale(0.85); } }
        @keyframes move-orb-3 { 0% { transform: translate(0, 0) scale(1); } 50% { transform: translate(40vw, -50vh) scale(1.2); } 100% { transform: translate(-30vw, -20vh) scale(0.95); } }

        .grid-overlay {
            position: absolute; top: -80px; left: 0; width: 100%; height: calc(100% + 80px);
            background-image: linear-gradient(rgba(255, 255, 255, 0.03) 1px, transparent 1px), linear-gradient(90deg, rgba(255, 255, 255, 0.03) 1px, transparent 1px);
            background-size: 80px 80px; mask-image: radial-gradient(circle at center, black 40%, transparent 100%);
            -webkit-mask-image: radial-gradient(circle at center, black 40%, transparent 100%); animation: grid-scroll 4s linear infinite; z-index: 1; 
        }
        @keyframes grid-scroll { 0% { transform: translateY(0); } 100% { transform: translateY(80px); } }

        .gradient-text {
            background: linear-gradient(90deg, var(--accent-orange), var(--accent-burgundy), var(--accent-purple), var(--accent-orange));
            background-size: 200% auto; -webkit-background-clip: text; -webkit-text-fill-color: transparent; color: transparent; animation: gradient-move 4s linear infinite;
        }
        @keyframes gradient-move { 0% { background-position: 0% center; } 100% { background-position: 200% center; } }

        /* --- HEADER --- */
        header {
            position: fixed; top: 20px; left: 50%; transform: translateX(-50%); width: calc(100% - 40px); max-width: 1150px; height: var(--nav-height);
            z-index: 2000; display: flex; align-items: center; justify-content: space-between; padding: 0 20px; 
            background: rgba(10, 5, 16, 0.85); border: 1px solid var(--flat-border); border-radius: 20px; 
            transition: 0.4s ease; box-shadow: 0 10px 30px rgba(0, 0, 0, 0.5);
            -webkit-backdrop-filter: blur(12px); backdrop-filter: blur(12px);
        }
        header.scrolled { top: 10px; height: 60px; background: rgba(10, 5, 16, 0.95); }

        .logo-group { display: flex; align-items: center; gap: 12px; }
        .logo { font-size: 28px; font-weight: 900; text-decoration: none; letter-spacing: 0.5px; }

        .system-status { display: flex; align-items: center; gap: 6px; font-size: 8px; text-transform: uppercase; letter-spacing: 1.2px; color: var(--accent-green); font-weight: 800; padding: 5px 12px; border: 1px solid rgba(46, 204, 113, 0.3); border-radius: 50px; background: rgba(46, 204, 113, 0.05); }
        @keyframes pulse { 0% { transform: scale(1); opacity: 1; } 100% { transform: scale(3); opacity: 0; } }
        .status-dot { width: 5px; height: 5px; background: var(--accent-green); border-radius: 50%; position: relative; }
        .status-dot::after { content: ''; position: absolute; width: 100%; height: 100%; background: var(--accent-green); border-radius: 50%; animation: pulse 2s infinite; }

        .nav-menu { display: flex; align-items: center; gap: 24px; }
        .nav-links { display: flex; align-items: center; gap: 6px; }
        
        .nav-btn {
            display: inline-flex; align-items: center; gap: 8px; padding: 8px 14px; 
            border-radius: 12px; color: var(--text-dim); text-decoration: none; font-size: 13px; font-weight: 600;
            transition: all 0.3s cubic-bezier(0.25, 0.8, 0.25, 1); border: 1px solid transparent; transform-origin: center;
        }
        header.scrolled .nav-btn { padding: 6px 10px; }
        .nav-btn:hover { color: #fff; background: rgba(255, 255, 255, 0.05); transform: scale(1.03); border-color: rgba(255, 255, 255, 0.1); }

        @keyframes icon-wiggle {
            0% { transform: rotate(0deg); }
            25% { transform: rotate(-12deg); }
            50% { transform: rotate(10deg); }
            75% { transform: rotate(-8deg); }
            100% { transform: rotate(0deg); }
        }
        .nav-btn svg { transition: color 0.3s ease; }
        .nav-btn:hover svg { animation: icon-wiggle 0.6s ease-in-out infinite; color: var(--accent-purple); }

        .btn-support-style { background: rgba(224, 30, 55, 0.1) !important; border: 1px solid rgba(224, 30, 55, 0.4) !important; color: #ff4d6d !important; animation: support-red-pulse 2s infinite; transition: all 0.3s cubic-bezier(0.25, 0.8, 0.25, 1) !important; text-decoration: none; display: inline-flex; align-items: center; justify-content: center; gap: 8px; padding: 8px 16px; border-radius: 12px; font-weight: 700; transform-origin: center; }
        header.scrolled .btn-support-style { padding: 6px 14px; }
        .btn-support-style:hover { background: rgba(224, 30, 55, 0.25) !important; border-color: rgba(224, 30, 55, 0.8) !important; color: #fff !important; transform: scale(1.05); box-shadow: 0 8px 25px rgba(224, 30, 55, 0.5); animation: none; }
        @keyframes gear-spin { 0% { transform: rotate(0deg); } 100% { transform: rotate(360deg); } }
        .btn-support-style:hover svg { animation: gear-spin 4s linear infinite; color: #fff; }
        @keyframes support-red-pulse { 0% { box-shadow: 0 0 0 0 rgba(224, 30, 55, 0.5); } 70% { box-shadow: 0 0 0 12px rgba(224, 30, 55, 0); } 100% { box-shadow: 0 0 0 0 rgba(224, 30, 55, 0); } }

        /* --- СЕКЦИЯ КОНТЕНТА --- */
        .message-container { 
            flex-grow: 1; display: flex; flex-direction: column; align-items: center; justify-content: center; text-align: center; 
            padding: 160px 20px 40px; position: relative; z-index: 10;
        }

        .message-container h1 { 
            font-size: clamp(40px, 8vw, 70px); font-weight: 900; line-height: 1.1; margin-bottom: 20px; letter-spacing: -2px; text-transform: uppercase; 
        }
        
        .message-container p.lead { 
            color: var(--text-dim); font-size: 18px; 
            max-width: 900px; 
            margin: 0 auto 48px; line-height: 1.8; 
        }
        
        .highlight { color: #fff; font-weight: 700; }

        /* --- ТЕРМИНАЛ --- */
        .terminal-block {
            width: 100%; max-width: 800px; margin: 0 auto;
            background: #060309; border: 1px solid var(--flat-border); border-radius: 12px;
            overflow: hidden; text-align: left; box-shadow: 0 15px 40px rgba(0,0,0,0.6);
            display: flex; flex-direction: column;
        }

        .terminal-header-info {
            background: rgba(255, 255, 255, 0.03); border-bottom: 1px solid var(--flat-border);
            padding: 12px 24px; display: flex; justify-content: space-between; align-items: center;
            font-family: 'Courier New', Courier, monospace; font-size: 13px; color: var(--accent-purple); font-weight: 700; letter-spacing: 0.5px;
        }
        .terminal-header-info .val { color: #fff; }
        
        .terminal-wrap {
            padding: 20px 24px;
            background: transparent;
        }

        .terminal-window {
            /* Строгая высота: ровно 14 строк по 24px = 336px */
            height: 336px;
            overflow-y: hidden;
            position: relative;
            font-family: 'Courier New', Courier, monospace; font-size: 14px;
            color: var(--accent-green);
        }

        .t-line { 
            margin: 0; padding: 0; 
            line-height: 24px; height: 24px; 
            /* Запрещаем перенос строк, чтобы не сбивалась высота скролла */
            white-space: nowrap; overflow: hidden; text-overflow: ellipsis;
        }
        .t-time { color: #555; margin-right: 8px; }
        
        /* Цвета для логов терминала */
        .t-purple { color: var(--accent-purple); }
        .t-orange { color: var(--accent-orange); }
        .t-white { color: #ffffff; }
        .t-green { color: var(--accent-green); }
        .t-red { color: #ff5f56; }
        .t-dim { color: #888; }
        
        .cursor {
            display: inline-block; width: 8px; height: 15px; background-color: var(--accent-green);
            vertical-align: middle; margin-left: 4px; animation: blink 1s step-end infinite;
        }
        @keyframes blink { 0%, 100% { opacity: 1; } 50% { opacity: 0; } }

        /* --- ПОДВАЛ И КОНТАКТЫ --- */
        .main-footer { display: flex; flex-direction: column; align-items: center; justify-content: center; padding: 0 0 15px; color: var(--text-dim); font-size: 11px; position: relative; z-index: 10; margin-top: auto; }
        .footer-contacts { display: flex; gap: 20px; flex-wrap: wrap; justify-content: center; width: 100%; margin-bottom: 25px; }

        .contact-box {
            position: relative; display: inline-flex; align-items: center; justify-content: center; width: 270px; max-width: 100%; height: 48px; border: 1px solid var(--flat-border); border-radius: 50px; background: var(--card-bg); color: #ffffff; cursor: pointer; transition: all 0.3s cubic-bezier(0.25, 0.8, 0.25, 1); box-sizing: border-box; overflow: hidden; text-decoration: none;
        }
        
        .contact-box:hover { transform: translateY(-2px); }
        .contact-box:active { transform: scale(0.95); }
        .contact-box.email-box:hover { border-color: rgba(157, 78, 221, 0.5); background: rgba(157, 78, 221, 0.1); }
        .contact-box.tg-box:hover { border-color: rgba(36, 161, 222, 0.5); background: rgba(36, 161, 222, 0.1); }

        .state-default, .state-success { position: absolute; top: 0; left: 0; width: 100%; height: 100%; display: flex; align-items: center; justify-content: center; gap: 10px; transition: all 0.4s cubic-bezier(0.34, 1.56, 0.64, 1); font-size: 13px; letter-spacing: 0.5px; }
        .state-default { opacity: 1; transform: translateY(0); font-weight: 500; }
        .state-success { opacity: 0; transform: translateY(15px); font-weight: 700; color: var(--accent-green); pointer-events: none; }

        .contact-box svg { width: 20px; height: 20px; flex-shrink: 0; transition: transform 0.4s cubic-bezier(0.34, 1.56, 0.64, 1), color 0.3s; }
        @keyframes contact-wiggle { 0% { transform: rotate(0deg); } 15% { transform: rotate(-15deg); } 30% { transform: rotate(10deg); } 45% { transform: rotate(-10deg); } 60% { transform: rotate(5deg); } 75%, 100% { transform: rotate(0deg); } }
        .email-box .state-default svg { color: var(--accent-purple); animation: contact-wiggle 3s infinite ease-in-out; }
        .tg-box .state-default svg { color: var(--telegram-blue); animation: contact-wiggle 3s infinite ease-in-out 1.5s; }

        .contact-box.copied { border-color: var(--accent-green); background: rgba(46, 204, 113, 0.1); pointer-events: none; box-shadow: 0 0 15px rgba(46, 204, 113, 0.2); }
        .contact-box.copied .state-default { opacity: 0; transform: translateY(-15px); }
        .contact-box.copied .state-success { opacity: 1; transform: translateY(0); }
        @keyframes envelope-success-flip { 0% { transform: rotate(0deg); } 40% { transform: rotate(15deg); } 70% { transform: rotate(-10deg); } 100% { transform: rotate(0deg); } }
        .contact-box.copied .state-success svg { animation: envelope-success-flip 0.6s cubic-bezier(0.34, 1.56, 0.64, 1) forwards; }

        .footer-copyright { display: flex; align-items: center; justify-content: center; width: 100%; }
        .footer-copyright span { opacity: 0.5; font-size: 11px; letter-spacing: 0.5px; }

        /* --- МОБИЛЬНАЯ АДАПТАЦИЯ --- */
        @media (max-width: 768px) {
            header { width: calc(100% - 20px); padding: 0 12px; }
            .nav-links { display: none; }
            .nav-menu { width: auto; justify-content: flex-end; gap: 0; }
            .nav-menu .btn-support-style { padding: 10px 16px !important; gap: 8px !important; }
            .nav-menu .btn-support-style span { display: inline-block; font-size: 13px; }
            .nav-menu .btn-support-style svg { width: 18px !important; height: 18px !important; }
            .system-status { display: none; }
            
            .logo { font-size: 22px; }

            .message-container { padding-top: 130px; padding-bottom: 20px; }
            .message-container h1 { font-size: clamp(32px, 8vw, 42px); }
            .message-container p.lead { font-size: 16px; padding: 0 10px; margin-bottom: 35px; }
            
            .terminal-header-info { font-size: 11px; padding: 10px 15px; }
            .terminal-wrap { padding: 15px; }
            /* Строгая высота для мобильных: ровно 12 строк по 24px = 288px */
            .terminal-window { height: 288px; font-size: 12px; }
            
            .orb-1, .orb-2, .orb-3 { min-width: 350px; min-height: 350px; }
            
            .main-footer { padding: 0 0 15px; }
            .footer-contacts { flex-direction: column; align-items: center; gap: 15px; margin-bottom: 30px; }
            .contact-box { width: 100%; max-width: 320px; }
        }
    </style>
</head>
<body>
    <div class="top-loader"></div>
    <div class="bg-wrapper">
        <div class="orb orb-1"></div>
        <div class="orb orb-2"></div>
        <div class="orb orb-3"></div>
        <div class="grid-overlay"></div>
    </div>

    <header id="main-header">
        <div class="logo-group">
            <a href="/" class="logo gradient-text">NETWAVE.TODAY</a>
            <div class="system-status"><div class="status-dot"></div>Все системы ONLINE</div>
        </div>
        
        <nav class="nav-menu">
            <a href="https://t.me/netwavetoday" class="btn-support-style">
                <svg width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><circle cx="12" cy="12" r="3"></circle><path d="M19.4 15a1.65 1.65 0 0 0 .33 1.82l.06.06a2 2 0 0 1 0 2.83 2 2 0 0 1-2.83 0l-.06-.06a1.65 1.65 0 0 0-1.82-.33 1.65 1.65 0 0 0-1 1.51V21a2 2 0 0 1-2 2 2 2 0 0 1-2-2v-.09A1.65 1.65 0 0 0 9 19.4a1.65 1.65 0 0 0-1.82.33l-.06.06a2 2 0 0 1-2.83 0 2 2 0 0 1 0-2.83l.06-.06a1.65 1.65 0 0 0 .33-1.82 1.65 1.65 0 0 0-1.51-1H3a2 2 0 0 1-2-2 2 2 0 0 1 2-2h.09A1.65 1.65 0 0 0 4.6 9a1.65 1.65 0 0 0-.33-1.82l-.06-.06a2 2 0 0 1 0-2.83 2 2 0 0 1 2.83 0l.06.06a1.65 1.65 0 0 0 1.82.33H9a1.65 1.65 0 0 0 1-1.51V3a2 2 0 0 1 2-2 2 2 0 0 1 2 2v.09a1.65 1.65 0 0 0 1 1.51 1.65 1.65 0 0 0 1.82-.33l.06-.06a2 2 0 0 1 2.83 0 2 2 0 0 1 0 2.83l-.06-.06a1.65 1.65 0 0 0-.33 1.82V9a1.65 1.65 0 0 0 1.51 1H21a2 2 0 0 1 2 2 2 2 0 0 1-2 2h-.09a1.65 1.65 0 0 0-1.51 1z"></path></svg>
                <span>Поддержка</span>
            </a>
        </nav>
    </header>

    <section class="message-container">
        <h1>СТАТУС УЗЛА <span class="gradient-text">АКТИВЕН</span></h1>
        
        <p class="lead">
            Прямое соединение с серверной инфраструктурой успешно установлено.
        </p>

        <div class="terminal-block">
            <div class="terminal-header-info">
                <div>IP-АДРЕС: <span class="val" id="stat-ip">ОПРЕДЕЛЕНИЕ...</span></div>
                <div>ПИНГ: <span class="val" id="stat-ping">-- мс</span></div>
            </div>
            
            <div class="terminal-wrap">
                <div class="terminal-window" id="term-box">
                    <span class="cursor" id="term-cursor"></span>
                </div>
            </div>
        </div>
    </section>

    <footer class="main-footer">
        <div class="footer-contacts">
            <a href="https://t.me/netwavetoday" target="_blank" class="contact-box tg-box">
                <div class="state-default">
                    <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M20.665 3.717l-17.73 6.837c-1.21.486-1.203 1.161-.222 1.462l4.552 1.42 10.532-6.645c.498-.303.953-.14.579.192l-8.533 7.701h-.002l.002.001-.314 4.692c.46 0 .663-.211.921-.46l2.211-2.15 4.599 3.397c.848.467 1.457.227 1.668-.785l3.026-14.239c.309-1.239-.473-1.8-1.282-1.43z"/></svg>
                    <span>@netwavetoday</span>
                </div>
            </a>

            <div class="contact-box email-box" onclick="copyEmailText('netwave.today@gmail.com', this)">
                <div class="state-default">
                    <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round"><path d="M4 4h16c1.1 0 2 .9 2 2v12c0 1.1-.9 2-2 2H4c-1.1 0-2-.9-2-2V6c0-1.1.9-2 2-2z"></path><polyline points="22,6 12,13 2,6"></polyline></svg>
                    <span>netwave.today@gmail.com</span>
                </div>
                <div class="state-success">
                    <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round"><path d="M4 4h16c1.1 0 2 .9 2 2v12c0 1.1-.9 2-2 2H4c-1.1 0-2-.9-2-2V6c0-1.1.9-2 2-2z"></path><polyline points="22,6 12,13 2,6"></polyline></svg>
                    <span>Скопировано!</span>
                </div>
            </div>
        </div>
        <div class="footer-copyright">
            <span>© 2026 NETWAVE.TODAY | ВСЕ ПРАВА ЗАЩИЩЕНЫ</span>
        </div>
    </footer>

    <script>
        // Анимация хедера при скролле
        window.addEventListener('scroll', () => {
            const header = document.getElementById('main-header');
            if (window.scrollY > 40) header.classList.add('scrolled');
            else header.classList.remove('scrolled');
        });

        // Копирование почты
        function copyEmailText(email, el) {
            if(el.classList.contains('copied')) return;
            navigator.clipboard.writeText(email).then(() => {
                el.classList.add('copied');
                setTimeout(() => { el.classList.remove('copied'); }, 2500); 
            }).catch(err => {
                console.error('Ошибка копирования: ', err);
            });
        }

        // --- ЛОГИКА ТЕРМИНАЛА ---
        document.addEventListener('DOMContentLoaded', async () => {
            const termBox = document.getElementById('term-box');
            const cursor = document.getElementById('term-cursor');
            
            // Получаем IP пользователя (Российский сервис SypexGeo)
            let userIP = "ОПРЕДЕЛЕНИЕ...";
            try {
                const response = await fetch('https://api.sypexgeo.net/json/');
                const data = await response.json();
                userIP = data.ip;
                document.getElementById('stat-ip').innerText = userIP;
            } catch (e) {
                userIP = "192.168.1.1 (Скрыт)";
                document.getElementById('stat-ip').innerText = userIP;
            }

            // Форматирование времени для логов
            function getTime() {
                const now = new Date();
                return `${now.getHours().toString().padStart(2,'0')}:${now.getMinutes().toString().padStart(2,'0')}:${now.getSeconds().toString().padStart(2,'0')}.${now.getMilliseconds().toString().padStart(3,'0')}`;
            }

            // --- РЕАЛЬНЫЙ ПИНГ С TCP-АППРОКСИМАЦИЕЙ ---
            let estimatedTcpPing = '--';

            async function updatePing() {
                const start = performance.now();
                try {
                    await fetch(window.location.href.split('?')[0] + '?_t=' + Date.now(), { method: 'HEAD', cache: 'no-store' });
                    let httpPing = performance.now() - start;

                    // Формула: 80% от HTTP-времени + случайный джиттер от -2 до +2 мс
                    let baseTcp = httpPing * 0.8;
                    let jitter = (Math.random() * 4) - 2;
                    
                    estimatedTcpPing = Math.max(1, Math.round(baseTcp + jitter));
                    document.getElementById('stat-ping').innerText = estimatedTcpPing + ' мс';
                } catch (e) {
                    console.warn("Сбой проверки пинга");
                }
            }
            
            // Вызываем первый замер сразу, затем каждые 2 секунды
            updatePing();
            setInterval(updatePing, 2000);

            // Фаза 1: Стартовая загрузка
            // Используем стрелочные функции () => для захвата актуального пинга во время отрисовки
            const bootLines = [
                { text: () => "[INIT] Ядро маршрутизации NetWave запущено...", class: "t-dim", delay: 400 },
                { text: () => `[AUTH] Идентификация клиента: <span class="t-white">${userIP}</span>`, class: "t-green", delay: 600 },
                { text: () => "[SECURE] Проверка протоколов шифрования: УСПЕШНО", class: "t-green", delay: 400 },
                { text: () => `[INFO] Оптимальный узел маршрутизации найден. Пинг: ${estimatedTcpPing !== '--' ? estimatedTcpPing : '...'} мс`, class: "t-white", delay: 800 },
                { text: () => "[OK] Соединение стабильно. Переход в режим мониторинга.", class: "t-purple", delay: 500 }
            ];

            // Фаза 2: Бесконечные логи (некоторые тоже подхватывают живой пинг)
            const loopCommands = [
                { text: () => "Переадресация TCP потока через порт 443", color: "t-white" },
                { text: () => "Очистка памяти завершена. Освобождено 12MB", color: "t-dim" },
                { text: () => "Пакет зашифрован (AES-256-GCM)", color: "t-green" },
                { text: () => "Отклонен поврежденный UDP пакет от пира", color: "t-red" },
                { text: () => `Ответ от узла получен за: ${estimatedTcpPing} мс`, color: "t-purple" },
                { text: () => "Обмен ключами успешно верифицирован", color: "t-green" },
                { text: () => "Выделение буфера для входящего трафика", color: "t-white" },
                { text: () => "Применены правила шейпинга трафика (Класс A)", color: "t-purple" },
                { text: () => "Синхронизация состояния узла с главным кластером...", color: "t-orange" },
                { text: () => "Рукопожатие с целевым хостом установлено", color: "t-green" },
                { text: () => `Задержка системного пульса: ${Math.max(1, (estimatedTcpPing === '--' ? 5 : estimatedTcpPing) - Math.floor(Math.random()*3))} мс`, color: "t-dim" },
                { text: () => "Правило брандмауэра #104: РАЗРЕШИТЬ", color: "t-dim" }
            ];

            // Функция добавления одной строки
            function appendLog(htmlContent, cssClass = "") {
                const lineDiv = document.createElement('div');
                lineDiv.className = 't-line ' + cssClass;
                lineDiv.innerHTML = `<span class="t-time">[${getTime()}]</span> ` + htmlContent;
                termBox.insertBefore(lineDiv, cursor);
                
                // Вычисляем максимум строк динамически
                const currentMaxLines = window.innerWidth <= 768 ? 12 : 14;
                const allLines = termBox.querySelectorAll('.t-line');
                
                if(allLines.length > currentMaxLines) {
                    allLines[0].remove();
                }
                
                // Прокрутка в самый низ
                termBox.scrollTop = termBox.scrollHeight;
            }

            // Запуск стартовой загрузки
            async function runBootSequence() {
                for (let i = 0; i < bootLines.length; i++) {
                    await new Promise(r => setTimeout(r, bootLines[i].delay));
                    appendLog(bootLines[i].text(), bootLines[i].class);
                }
                runInfiniteLogs();
            }

            // Функция бесконечной генерации
            function runInfiniteLogs() {
                const randomDelay = Math.floor(Math.random() * 2000) + 200;
                setTimeout(() => {
                    const cmd = loopCommands[Math.floor(Math.random() * loopCommands.length)];
                    appendLog(`<span class="${cmd.color}">${cmd.text()}</span>`);
                    runInfiniteLogs();
                }, randomDelay);
            }

            setTimeout(runBootSequence, 500);
        });
    </script>
</body>
</html>