<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:base="https://www.pandoraburo.ru/" xml:lang="ru">
  <id>https://www.pandoraburo.ru/pravdomer</id>
  <link href="https://www.pandoraburo.ru/pravdomer.xml" rel="self"/>
  <title>ПРАВДОМЕР</title>
  <subtitle type="html">
&lt;html lang="ru"&gt;
&lt;head&gt;
&lt;meta charset="UTF-8"&gt;
&lt;meta name="viewport" content="width=device-width,initial-scale=1"&gt;
&lt;meta name="theme-color" content="#171034"&gt;
&lt;meta name="description" content="Правдомер — игровой тренажёр детектора лжи. Текст, голос, видео, фото, звонки. 18+"&gt;
&lt;title&gt;Правдомер · тренажёр детектора лжи&lt;/title&gt;
&lt;style&gt;
:root{--gold:#D4AF37;--violet:#8B5CF6;--bg:#120c22;--card:#1d1533;--line:rgba(212,175,55,.28);--ink:#efe9dc;--mut:#a79ec9;--rad:18px}
*{margin:0;padding:0;box-sizing:border-box}
body{font-family:Inter,system-ui,sans-serif;background:radial-gradient(1100px 560px at 50% -10%,#241a45,var(--bg) 70%);color:var(--ink);line-height:1.55;min-height:100vh}
h1,h2,.disp{font-family:'Cormorant Garamond',Georgia,serif}
header{position:sticky;top:0;z-index:50;display:flex;align-items:center;gap:10px;padding:12px 16px;background:rgba(18,12,34,.92);backdrop-filter:blur(10px);border-bottom:1px solid var(--line)}
.logo{width:42px;height:42px;border-radius:12px;background:linear-gradient(135deg,var(--violet),var(--gold));display:flex;align-items:center;justify-content:center;font-size:20px}
.hname{font-weight:800;font-size:18px;letter-spacing:.5px}
.hsub{font-size:10px;color:var(--mut);letter-spacing:2px;text-transform:uppercase}
.hchips{margin-left:auto;display:flex;gap:8px}
.hchip{padding:7px 12px;border-radius:999px;border:1px solid var(--line);background:rgba(212,175,55,.08);font-size:12px;font-weight:700;color:#f0d68a}
nav{position:sticky;top:66px;z-index:40;display:flex;gap:6px;overflow-x:auto;padding:10px 14px;background:var(--bg)}
nav button{flex:0 0 auto;padding:8px 14px;border-radius:999px;border:1px solid var(--line);background:var(--card);color:var(--mut);font-size:12px;font-weight:600;cursor:pointer}
nav button.on{background:linear-gradient(135deg,var(--violet),var(--gold));color:#fff;border-color:transparent}
main{max-width:960px;margin:0 auto;padding:8px 14px 40px}
section{background:var(--card);border:1px solid var(--line);border-radius:var(--rad);padding:20px;margin:22px 0;scroll-margin-top:120px;box-shadow:0 10px 30px rgba(0,0,0,.35)}
.sec-ic{font-size:34px}
h2{font-size:24px;color:#f0d68a;margin:6px 0 2px}
.sub{color:var(--mut);font-size:13px;margin-bottom:12px}
.feat{display:flex;gap:8px;align-items:flex-start;font-size:13px;color:#cfc8e8;margin:6px 0}
.feat b{color:#f0d68a}
.btn{display:inline-flex;align-items:center;gap:8px;padding:11px 18px;border-radius:12px;border:none;cursor:pointer;font-weight:700;font-size:13px;background:linear-gradient(135deg,var(--violet),var(--gold));color:#fff}
.btn.ghost{background:none;border:1px solid var(--line);color:#f0d68a}
.btn:disabled{opacity:.45;cursor:not-allowed}
.hero{background:linear-gradient(135deg,rgba(139,92,246,.25),rgba(212,175,55,.15));border-color:rgba(212,175,55,.5)}
.hero .tag{display:inline-block;padding:4px 12px;border-radius:999px;background:rgba(212,175,55,.15);border:1px solid var(--line);color:#f0d68a;font-size:11px;font-weight:700;letter-spacing:1px}
.foot-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(96px,1fr));gap:10px;background:linear-gradient(180deg,#150f2e,#0a0818);border-radius:20px;padding:18px;margin:26px 0}
.sq{display:flex;flex-direction:column;align-items:center;gap:6px;padding:14px 6px;border-radius:14px;border:1px solid rgba(167,139,250,.25);background:rgba(167,139,250,.07);cursor:pointer;text-align:center;color:var(--ink)}
.sq .ic{font-size:26px}.sq .nm{font-size:11px;font-weight:600}
.disc{font-size:11px;color:var(--mut);background:rgba(245,158,11,.08);border:1px solid rgba(245,158,11,.4);border-radius:12px;padding:12px;margin-top:14px}
#coach{position:fixed;left:50%;transform:translateX(-50%);bottom:18px;z-index:60;width:min(480px,92vw);background:linear-gradient(135deg,#241a45,#1d1533);border:1px solid var(--line);border-radius:16px;padding:14px 16px;font-size:13px;box-shadow:0 16px 40px rgba(0,0,0,.5);display:none}
#coach .who{color:#f0d68a;font-weight:800;margin-bottom:4px}
&lt;/style&gt;
&lt;/head&gt;
&lt;body&gt;
&lt;header&gt;
&lt;div class="logo"&gt;?️&lt;/div&gt;
&lt;div&gt;&lt;div class="hname"&gt;ПРАВДОМЕР&lt;/div&gt;&lt;div class="hsub"&gt;тренажёр детектора лжи&lt;/div&gt;&lt;/div&gt;
&lt;div class="hchips"&gt;&lt;span class="hchip" id="hPr"&gt;? 0 PR&lt;/span&gt;&lt;span class="hchip" id="hStreak"&gt;? 0&lt;/span&gt;&lt;/div&gt;
&lt;/header&gt;
&lt;nav id="chips"&gt;
&lt;button data-t="hero" class="on"&gt;? Главная&lt;/button&gt;
&lt;button data-t="text"&gt;? Текст&lt;/button&gt;
&lt;button data-t="voice"&gt;? Голос&lt;/button&gt;
&lt;button data-t="video"&gt;? Видео&lt;/button&gt;
&lt;button data-t="photo"&gt;? Фото&lt;/button&gt;
&lt;button data-t="call"&gt;? Звонок&lt;/button&gt;
&lt;button data-t="sim"&gt;? Симулятор&lt;/button&gt;
&lt;/nav&gt;
&lt;main&gt;
&lt;section id="hero" class="hero"&gt;
&lt;span class="tag"&gt;ДЕЛО ДНЯ&lt;/span&gt;
&lt;h1 class="disp" id="caseTitle" style="font-size:26px;margin:10px 0 4px"&gt;Загрузка…&lt;/h1&gt;
&lt;div class="sub" id="caseText"&gt;…&lt;/div&gt;
&lt;button class="btn" id="caseGo"&gt;? Начать разбор&lt;/button&gt;
&lt;button class="btn ghost" id="caseWhy"&gt;? Почему это важно?&lt;/button&gt;
&lt;/section&gt;
&lt;section id="text"&gt;&lt;div class="sec-ic"&gt;?&lt;/div&gt;&lt;h2&gt;Текст-детектор&lt;/h2&gt;&lt;div class="sub"&gt;Новости, посты, переписки, резюме, отзывы&lt;/div&gt;
&lt;div class="feat"&gt; &lt;span&gt;&lt;b&gt;Карта красных флагов&lt;/b&gt; — стоп-фразы, абсолютизмы, манипуляции&lt;/span&gt;&lt;/div&gt;
&lt;div class="feat"&gt;? &lt;span&gt;&lt;b&gt;Индекс правдивости 0–100&lt;/b&gt; с пояснением&lt;/span&gt;&lt;/div&gt;
&lt;div class="feat"&gt;? &lt;span&gt;&lt;b&gt;Свой текст&lt;/b&gt; — вставьте любой материал&lt;/span&gt;&lt;/div&gt;
&lt;button class="btn" disabled="disabled"&gt;Подключается в Блоке 2&lt;/button&gt;
&lt;/section&gt;
&lt;section id="voice"&gt;&lt;div class="sec-ic"&gt;?&lt;/div&gt;&lt;h2&gt;Голос-детектор&lt;/h2&gt;&lt;div class="sub"&gt;Звонки, диктофон, голосовые&lt;/div&gt;
&lt;div class="feat"&gt;? &lt;span&gt;&lt;b&gt;Оциллограмма&lt;/b&gt; с подсветкой стрессовых участков&lt;/span&gt;&lt;/div&gt;
&lt;div class="feat"&gt;⏸ &lt;span&gt;&lt;b&gt;Паузы, темп, дрожь&lt;/b&gt; — вокальные маркеры лжи&lt;/span&gt;&lt;/div&gt;
&lt;button class="btn" disabled="disabled"&gt;Подключается в Блоке 5&lt;/button&gt;
&lt;/section&gt;
&lt;section id="video"&gt;&lt;div class="sec-ic"&gt;?&lt;/div&gt;&lt;h2&gt;Видео-детектор&lt;/h2&gt;&lt;div class="sub"&gt;Интервью, сторис, видеозвонки&lt;/div&gt;
&lt;div class="feat"&gt;? &lt;span&gt;&lt;b&gt;Таймлайн с маркерами&lt;/b&gt; микровыражений&lt;/span&gt;&lt;/div&gt;
&lt;div class="feat"&gt;? &lt;span&gt;&lt;b&gt;Deepfake-признаки&lt;/b&gt; и рассинхрон речь/тело&lt;/span&gt;&lt;/div&gt;
&lt;button class="btn" disabled="disabled"&gt;Подключается в Блоке 7&lt;/button&gt;
&lt;/section&gt;
&lt;section id="photo"&gt;&lt;div class="sec-ic"&gt;?&lt;/div&gt;&lt;h2&gt;Фото-детектор&lt;/h2&gt;&lt;div class="sub"&gt;Фото, скриншоты, «документы»&lt;/div&gt;
&lt;div class="feat"&gt;? &lt;span&gt;&lt;b&gt;Карта правок&lt;/b&gt; (ELA) и метаданные EXIF&lt;/span&gt;&lt;/div&gt;
&lt;div class="feat"&gt;? &lt;span&gt;&lt;b&gt;Вердикт:&lt;/b&gt; оригинал / монтаж / AI&lt;/span&gt;&lt;/div&gt;
&lt;button class="btn" disabled="disabled"&gt;Подключается в Блоке 6&lt;/button&gt;
&lt;/section&gt;
&lt;section id="call"&gt;&lt;div class="sec-ic"&gt;?&lt;/div&gt;&lt;h2&gt;Звонок-детектор&lt;/h2&gt;&lt;div class="sub"&gt;Анти-мошенничество: «банк», «родственник в беде»&lt;/div&gt;
&lt;div class="feat"&gt;? &lt;span&gt;&lt;b&gt;Чек-лист флагов&lt;/b&gt;: срочность, секретность, коды&lt;/span&gt;&lt;/div&gt;
&lt;div class="feat"&gt;? &lt;span&gt;&lt;b&gt;Тренажёр&lt;/b&gt; — не попадись на скрипт мошенника&lt;/span&gt;&lt;/div&gt;
&lt;button class="btn" disabled="disabled"&gt;Подключается в Блоке 6&lt;/button&gt;
&lt;/section&gt;
&lt;section id="sim"&gt;&lt;div class="sec-ic"&gt;?&lt;/div&gt;&lt;h2&gt;Псих-симулятор&lt;/h2&gt;&lt;div class="sub"&gt;Диалоги с манипулятором, агрессором, симулянтом&lt;/div&gt;
&lt;div class="feat"&gt;? &lt;span&gt;&lt;b&gt;Устойчивость к манипуляциям&lt;/b&gt; — ваш счёт&lt;/span&gt;&lt;/div&gt;
&lt;div class="feat"&gt;? &lt;span&gt;&lt;b&gt;Разбор ответов&lt;/b&gt; дружелюбным тренером&lt;/span&gt;&lt;/div&gt;
&lt;button class="btn" disabled="disabled"&gt;Подключается в Блоке 7&lt;/button&gt;
&lt;/section&gt;
&lt;div class="foot-grid" id="footGrid"&gt;&lt;/div&gt;
&lt;div class="disc"&gt;⚖️ &lt;b&gt;Правдомер&lt;/b&gt; — игровой тренажёр и инструмент саморефлексии (18+). Результаты — вероятности, а не вердикты; не являются экспертизой, диагнозом или юридической консультацией. Не анализируйте реальных людей без их согласия.&lt;/div&gt;
&lt;/main&gt;
&lt;div id="coach"&gt;&lt;div class="who"&gt;? Тренер&lt;/div&gt;&lt;div id="coachText"&gt;&lt;/div&gt;&lt;/div&gt;
&lt;script&gt;
(function(){"use strict";
if(window._prDone)return;window._prDone=1;
var $=function(s){return document.querySelector(s)};
function g(k,d){try{var v=localStorage.getItem(k);return v==null?d:JSON.parse(v)}catch(e){return d}}
function s(k,v){try{localStorage.setItem(k,JSON.stringify(v))}catch(e){}}
/* ── профиль ── */
var P=g('pr_profile',{pr:0,streak:0,last:'',lvl:1});
function renderH(){$('#hPr').textContent='? '+P.pr+' PR';$('#hStreak').textContent='? '+P.streak;}
window.PR={get:function(){return P},add:function(n){P.pr+=n;P.lvl=1+Math.floor(P.pr/100);s('pr_profile',P);renderH();}};
renderH();
/* ── тренер ── */
var q=[];function coach(t){q.push(t);if(q.length===1)next()}
function next(){var t=q.shift();if(!t){$('#coach').style.display='none';return}
$('#coachText').textContent=t;$('#coach').style.display='block';setTimeout(next,5200);}
setTimeout(function(){coach('Привет, детектив! ? Я твой тренер. Правда — это навык, и мы его натренируем. Начнём с Дела дня?');},900);
/* ── дело дня ── */
var CASES=[
{t:'«Срочно! Все уже перевели деньги»',x:'Сообщение требует немедленного действия и ссылается на «всех». Проверь на манипуляцию в Текст-детекторе.',w:'Срочность и стадность — два главных крючка мошенников.'},
{t:'«Я никогда не говорил такого»',x:'Абсолютизм «никогда» + уход от деталей. Вставь фразу в Текст-детектор и посмотри флаги.',w:'Абсолютные отрицания — частый маркер ухода от правды.'},
{t:'«Инвестиции: 300% за неделю, мест мало»',x:'Гарантия сверхдохода + дефицит. Разбери в Текст-детекторе.',w:'«Гарантированная» сверхприбыль — классика финансовых пирамид.'}];
var ci=new Date().getDate()%CASES.length;
$('#caseTitle').textContent=CASES[ci].t;$('#caseText').textContent=CASES[ci].x;
s('pr_case_today',ci);
$('#caseGo').addEventListener('click',function(){document.getElementById('text').scrollIntoView({behavior:'smooth'});coach('Отлично! ? Читай текст и ищи: срочность, абсолютные слова, отсутствие источников. Блок 2 даст тебе карту флагов.');});
$('#caseWhy').addEventListener('click',function(){coach(CASES[ci].w);});
/* ── навигация ── */
var btns=document.querySelectorAll('#chips button');
btns.forEach(function(b){b.addEventListener('click',function(){btns.forEach(function(x){x.classList.remove('on')});b.classList.add('on');document.getElementById(b.dataset.t).scrollIntoView({behavior:'smooth'});});});
if('IntersectionObserver' in window){var obs=new IntersectionObserver(function(es){es.forEach(function(e){if(e.isIntersecting){btns.forEach(function(x){x.classList.toggle('on',x.dataset.t===e.target.id)})}})},{threshold:.25,rootMargin:'-20% 0px -60% 0px'});['hero','text','voice','video','photo','call','sim'].forEach(function(id){var el=document.getElementById(id);if(el)obs.observe(el)});}
/* ── нижняя сетка ── */
var SQ=[['?','Профиль'],['?','Ачивки'],['?','Библиотека дел'],['⚙️','Настройки'],['?','Экспорт'],['ℹ️','О проекте']];
$('#footGrid').innerHTML=SQ.map(function(x,i){return '&lt;div class="sq" data-i="'+i+'"&gt;&lt;span class="ic"&gt;'+x[0]+'&lt;/span&gt;&lt;span class="nm"&gt;'+x[1]+'&lt;/span&gt;&lt;/div&gt;'}).join('');
$('#footGrid').addEventListener('click',function(e){var it=e.target.closest('.sq');if(it)coach('Раздел «'+SQ[+it.dataset.i][1]+'» откроется в следующих блоках. Всё впереди! ?');});
console.log('?️ Правдомер: каркас готов');
})();
&lt;/script&gt;
&lt;/body&gt;
&lt;/html&gt;

&lt;style&gt;
#modeMask{position:fixed;inset:0;z-index:70;background:rgba(10,6,20,.92);backdrop-filter:blur(6px);display:none;align-items:center;justify-content:center}
#modeMask.open{display:flex}
#modeCard{width:min(460px,92vw);background:linear-gradient(180deg,#241a45,#1d1533);border:1px solid rgba(212,175,55,.4);border-radius:20px;padding:22px}
.mode{display:flex;gap:12px;align-items:center;padding:12px;border:1px solid rgba(212,175,55,.25);border-radius:14px;margin:8px 0;cursor:pointer;background:rgba(212,175,55,.06)}
.mode.on{border-color:var(--gold);background:rgba(212,175,55,.16)}
.mode .ic{font-size:26px}
.mode b{display:block;font-size:14px}
.mode span{font-size:12px;color:var(--mut)}
&lt;/style&gt;
&lt;div id="modeMask"&gt;&lt;div id="modeCard"&gt;
&lt;h2 style="color:#f0d68a;font-size:22px"&gt;Кто вы в Правдомере?&lt;/h2&gt;
&lt;div class="sub"&gt;Тренер подстроит тон и подбор дел&lt;/div&gt;
&lt;div class="mode on" data-m="base"&gt;&lt;span class="ic"&gt;?&lt;/span&gt;&lt;div&gt;&lt;b&gt;Универсальный&lt;/b&gt;&lt;span&gt;Всё понемногу: мошенники, манипуляции, фейки&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;
&lt;div class="mode" data-m="parent"&gt;&lt;span class="ic"&gt;?‍?&lt;/span&gt;&lt;div&gt;&lt;b&gt;Родитель&lt;/b&gt;&lt;span&gt;Защита ребёнка от обмана и ловушек в сети&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;
&lt;div class="mode" data-m="senior"&gt;&lt;span class="ic"&gt;?&lt;/span&gt;&lt;div&gt;&lt;b&gt;Простой режим&lt;/b&gt;&lt;span&gt;Главное — распознать мошенника в телефоне&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;
&lt;div class="mode" data-m="hr"&gt;&lt;span class="ic"&gt;?&lt;/span&gt;&lt;div&gt;&lt;b&gt;HR / бизнес&lt;/b&gt;&lt;span&gt;Резюме, переговоры, проверка кандидатов&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;
&lt;button class="btn" id="modeGo" style="width:100%;justify-content:center;margin-top:10px"&gt;Начать тренировки&lt;/button&gt;
&lt;/div&gt;&lt;/div&gt;
&lt;script&gt;
(function(){"use strict";
if(window._prModeDone)return;window._prModeDone=1;
var $=function(s){return document.querySelector(s)};
function g(k,d){try{var v=localStorage.getItem(k);return v==null?d:JSON.parse(v)}catch(e){return d}}
function s(k,v){try{localStorage.setItem(k,JSON.stringify(v))}catch(e){}}
var NAMES={base:'Универсальный',parent:'Родитель',senior:'Простой',hr:'HR / бизнес'};
var GREET={base:'Поехали! Миксую дела: мошенники, манипуляции, фейки.',parent:'Отличная цель ? Дела будут про безопасность детей в сети.',senior:'Объясняю просто, без сложных слов. Главное — увидеть мошенника.',hr:'Деловой стиль: резюме, переговоры, проверка кандидатов.'};
function coach(t){var c=$('#coach');if(!c)return;$('#coachText').textContent=t;c.style.display='block';setTimeout(function(){c.style.display='none'},6000);}
var sel=g('pr_mode',null);
if(!sel){$('#modeMask').classList.add('open');}else{coach('Режим: '+NAMES[sel]+'. '+GREET[sel]);}
var cur=sel||'base';
document.querySelectorAll('.mode').forEach(function(el){el.addEventListener('click',function(){document.querySelectorAll('.mode').forEach(function(x){x.classList.remove('on')});el.classList.add('on');cur=el.dataset.m;});});
$('#modeGo').addEventListener('click',function(){s('pr_mode',cur);$('#modeMask').classList.remove('open');coach(GREET[cur]);});
/* перехватываем нижнюю сетку: «Настройки» открывают выбор режима */
var fg=$('#footGrid');
if(fg){var fg2=fg.cloneNode(true);fg.parentNode.replaceChild(fg2,fg);
fg2.addEventListener('click',function(e){var it=e.target.closest('.sq');if(!it)return;var i=+it.dataset.i;
if(i===3){$('#modeMask').classList.add('open');}
else coach('Раздел «'+['Профиль','Ачивки','Библиотека дел','Настройки','Экспорт','О проекте'][i]+'» откроется в следующих блоках ?');});}
console.log('?️ Правдомер: режимы аудитории подключены');
})();
&lt;/script&gt;

&lt;style&gt;
#text textarea{width:100%;min-height:130px;background:rgba(212,175,55,.06);border:1px solid var(--line);border-radius:12px;color:var(--ink);padding:12px;font-size:14px;margin:10px 0;resize:vertical}
.pd-lens{display:flex;gap:8px;margin:6px 0}
.lens{padding:9px 16px;border-radius:999px;border:1px solid var(--line);background:var(--card);color:var(--mut);font-weight:700;font-size:13px;cursor:pointer}
.lens.on{background:linear-gradient(135deg,var(--violet),var(--gold));color:#fff;border-color:transparent}
.pd-row{display:flex;gap:8px;flex-wrap:wrap;margin:8px 0}
.pd-file{position:relative;overflow:hidden;display:inline-flex;align-items:center;gap:6px;padding:10px 14px;border-radius:12px;border:1px solid var(--line);color:#f0d68a;font-size:12px;font-weight:700;cursor:pointer}
.pd-file input{position:absolute;inset:0;opacity:0;cursor:pointer}
mark{border-radius:4px;padding:0 2px;color:#120c22;font-weight:700}
.m-stop{background:rgba(245,158,11,.55)}.m-abs{background:rgba(239,68,68,.5);color:#fff}
.m-emo{background:rgba(236,72,153,.5);color:#fff}.m-gas{background:rgba(139,92,246,.6);color:#fff}
.m-guilt{background:rgba(239,68,68,.55);color:#fff}.m-fear{background:rgba(245,158,11,.6)}
.m-shame{background:rgba(236,72,153,.55);color:#fff}.m-urg{background:rgba(239,68,68,.65);color:#fff}
.m-scar{background:rgba(245,158,11,.65)}.m-swing{background:rgba(139,92,246,.5);color:#fff}
.pd-score{display:flex;align-items:center;gap:16px;background:rgba(212,175,55,.08);border:1px solid var(--line);border-radius:16px;padding:14px 16px;margin:12px 0}
.pd-score b{font-size:40px;color:#f0d68a}
.pd-bar{flex:1;height:10px;background:rgba(255,255,255,.08);border-radius:99px;overflow:hidden}
.pd-bar i{display:block;height:100%;border-radius:99px;background:linear-gradient(90deg,var(--violet),var(--gold))}
.pd-flag{display:flex;gap:10px;align-items:flex-start;font-size:13px;color:#cfc8e8;background:rgba(255,255,255,.04);border:1px solid rgba(255,255,255,.08);border-radius:10px;padding:8px 10px;margin:6px 0}
.pd-flag .c{flex:0 0 auto;font-weight:800}
.pd-hl{margin-top:12px;background:rgba(0,0,0,.25);border:1px solid var(--line);border-radius:12px;padding:12px;font-size:13px;line-height:1.7;color:#d9d2ea;max-height:260px;overflow-y:auto}
.pd-hist{margin-top:12px;font-size:11px;color:var(--mut)}
&lt;/style&gt;
&lt;script&gt;
(function(){"use strict";
if(window._prTextDone)return;window._prTextDone=1;
var $=function(s){return document.querySelector(s)};
function g(k,d){try{var v=localStorage.getItem(k);return v==null?d:JSON.parse(v)}catch(e){return d}}
function s(k,v){try{localStorage.setItem(k,JSON.stringify(v))}catch(e){}}
function esc(t){var d=document.createElement('div');d.textContent=t;return d.innerHTML}
function coach(t){var c=$('#coach');if(!c)return;$('#coachText').textContent=t;c.style.display='block';clearTimeout(window._prCt);window._prCt=setTimeout(function(){c.style.display='none'},6500);}
var sec=$('#text');if(!sec)return;
sec.innerHTML='&lt;div class="sec-ic"&gt;?&lt;/div&gt;&lt;h2&gt;Текст-детектор&lt;/h2&gt;'+
'&lt;div class="sub"&gt;Вставь текст → получи карту флагов, индекс и совет тренера. Две линзы: ложь и манипуляция&lt;/div&gt;'+
'&lt;div class="pd-lens"&gt;&lt;button class="lens on" data-l="lie"&gt;? Ложь&lt;/button&gt;&lt;button class="lens" data-l="man"&gt;? Манипуляция&lt;/button&gt;&lt;/div&gt;'+
'&lt;textarea id="pd-in" placeholder="Вставь текст: новость, сообщение, письмо… (мин. 40 символов)"&gt;&lt;/textarea&gt;'+
'&lt;div class="pd-row"&gt;&lt;label class="pd-file"&gt;? Загрузить .txt&lt;input type="file" id="pd-file" accept=".txt,.md,text/plain"&gt;&lt;/label&gt;'+
'&lt;button class="btn ghost" id="pd-s1"&gt;Пример: мошенник&lt;/button&gt;&lt;button class="btn ghost" id="pd-s2"&gt;Пример: манипулятор&lt;/button&gt;&lt;button class="btn ghost" id="pd-s3"&gt;Пример: нейтрально&lt;/button&gt;&lt;/div&gt;'+
'&lt;button class="btn" id="pd-go"&gt;? Проверить текст&lt;/button&gt;'+
'&lt;div id="pd-res" style="display:none"&gt;&lt;/div&gt;&lt;div class="pd-hist" id="pd-hist"&gt;&lt;/div&gt;';
var lens='lie';
sec.querySelectorAll('.lens').forEach(function(b){b.addEventListener('click',function(){sec.querySelectorAll('.lens').forEach(function(x){x.classList.remove('on')});b.classList.add('on');lens=b.dataset.l;});});
var S1='Срочно! Ваша карта заблокирована. Немедленно сообщите код из СМС, иначе все деньги пропадут! Только сегодня можно спасти счёт. Осталось мало времени, успей!';
var S2='Ты сам виноват, что так вышло. Я такого не говорил, тебе кажется. После всего, что я для тебя сделал, ты должен мне помочь. Все будут смеяться, если ты откажешься.';
var S3='Встреча переносится на 15:00 в четверг. Повестка: бюджет проекта. Приложены данные за март (12 страниц) и ссылка на документ в общей папке. Источник: отчёт финансового отдела.';
$('#pd-s1').onclick=function(){$('#pd-in').value=S1};
$('#pd-s2').onclick=function(){$('#pd-in').value=S2};
$('#pd-s3').onclick=function(){$('#pd-in').value=S3};
$('#pd-file').addEventListener('change',function(e){var f=e.target.files[0];if(!f)return;var r=new FileReader();r.onload=function(){$('#pd-in').value=String(r.result||'').slice(0,6000)};r.readAsText(f);});
var D={
stop:{n:'Стоп-фразы',tip:'Стоп-фраза «честности»: так часто маскируют непроверяемое утверждение.',w:['честно говоря','поверь мне','поверьте мне','все знают','абсолютно точно','без сомнения','как известно','я не вру','не обманываю','гарантирую','сто процентов']},
abs:{n:'Абсолютизмы',tip:'Абсолютизм: реальность редко бывает «всегда» и «никто».',w:['все','никто','никогда','всегда','каждый','всё','ничего']},
gas:{n:'Газлайтинг',tip:'Газлайтинг: попытка заставить сомневаться в своей памяти.',w:['тебе кажется','ты сам виноват','я такого не говорил','ты неправильно понял','ты всё не так понял','не выдумывай']},
guilt:{n:'Вина',tip:'Давление виной: долг из прошлого вместо аргумента сейчас.',w:['ты должен','после всего','я для тебя всё','ты мне обязан']},
fear:{n:'Страх',tip:'Кнопка страха: срочная угроза, чтобы отключить разум.',w:['иначе','если не','потеряешь','пропадёт','заблокируют','украдут','накажут']},
shame:{n:'Стыд',tip:'Стыд как рычаг: «а что люди скажут».',w:['все будут смеяться','стыдно','позор','что люди скажут']},
urg:{n:'Срочность',tip:'Искусственная срочность: не дают времени подумать.',w:['срочно','немедленно','прямо сейчас','только сегодня','времени нет','быстрее']},
scar:{n:'Дефицит',tip:'Дефицит: «последний шанс», чтобы решить на эмоциях.',w:['осталось мало','последний шанс','мест мало','успей']},
emo:{n:'Эмоц. давление',tip:'КАПС и восклицания вместо аргументов.',w:[]},
swing:{n:'Качели',tip:'Эмоциональные качели: чередование «+» и «−» держит в напряжении.',w:[]}
};
function escRe(x){return x.replace(/[.*+?^${}()|[\]\\]/g,'\\$&amp;')}
function scan(t,cats){var flags=[];cats.forEach(function(cat){(D[cat].w||[]).forEach(function(w){var re=new RegExp('(^|[^а-яёa-z0-9])'+escRe(w)+'($|[^а-яёa-z0-9])','gi');var m;while((m=re.exec(t))){flags.push({cat:cat,at:m.index+m[1].length,len:w.length,phrase:w});}});});return flags}
function capsFlags(t){var flags=[],re=/[A-ZА-ЯЁ]{4,}/g,m;while((m=re.exec(t)))flags.push({cat:'emo',at:m.index,len:m[0].length,phrase:m[0]});var ex=(t.match(/!/g)||[]).length;if(ex&gt;2)flags.push({cat:'emo',at:-1,len:0,phrase:ex+' восклицательных знаков'});return flags}
function swingFlag(t){var pos=['люблю','хорошо','счастье','рад','прекрасно','обожаю'],neg=['ненавижу','плохо','беда','злюсь','ужас','терпеть'];var lo=t.toLowerCase();var p=pos.filter(function(w){return lo.indexOf(w)&gt;=0}).length;var n=neg.filter(function(w){return lo.indexOf(w)&gt;=0}).length;return(p&gt;=1&amp;&amp;n&gt;=1)?[{cat:'swing',at:-1,len:0,phrase:'контраст «+» и «−» в одном тексте'}]:[]}
function facts(t){var c=0;if(/\d/.test(t))c++;if(t.indexOf('%')&gt;=0)c++;if(/https?:\/\//i.test(t))c++;if(/источник|данные|исследован|статист|отчёт/i.test(t))c++;if(t.indexOf('«')&gt;=0)c++;return c}
function analyze(){
var t=$('#pd-in').value.trim();
if(t.length&lt;40){coach('Маловато текста: нужно хотя бы 40 символов, иначе разбор будет неточным ?');return}
var cats=(lens==='lie')?['stop','abs','emo']:['gas','guilt','fear','shame','urg','scar','emo','swing'];
var flags=scan(t,cats).concat(capsFlags(t)).concat(lens==='man'?swingFlag(t):[]);
var score,label;
if(lens==='lie'){score=78;flags.forEach(function(f){if(f.cat==='stop')score-=6;if(f.cat==='abs')score-=4;if(f.cat==='emo')score-=3;});score+=Math.min(12,facts(t)*3);score=Math.max(5,Math.min(95,score));label='Индекс правдивости';}
else{var present={};flags.forEach(function(f){present[f.cat]=1});score=8;['gas','guilt','fear','shame','urg','scar','swing'].forEach(function(c){if(present[c])score+={gas:25,guilt:20,fear:18,shame:15,urg:12,scar:10,swing:12}[c]});if(present.emo)score+=6;score=Math.max(3,Math.min(96,score));label='Индекс манипуляции';}
render(t,flags,score,label);
if(window.PR&amp;&amp;PR.add)PR.add(2);
var h=g('pr_hist',[]);h.unshift({t:Date.now(),l:lens,s:score});s('pr_hist',h.slice(0,6));renderHist();
coach(lens==='lie'?(score&gt;=70?'Похоже на правду: факты на месте, без надрыва. +2 PR ?':score&gt;=45?'Есть жёлтые флаги: проверь факты и источники. +2 PR ?':'Красные флаги во весь рост: эмоции есть, фактов нет. +2 PR ?'):(score&lt;25?'Манипуляций не вижу — ровный, спокойный тон. +2 PR ?':score&lt;55?'Лёгкое давление есть — держи границы. +2 PR ?':'Это классическая манипуляция: факты, границы, пауза. +2 PR ?'));
}
function hl(t,flags){var f=flags.filter(function(x){return x.at&gt;=0}).sort(function(a,b){return a.at-b.at});var out='',pos=0;f.forEach(function(fl){if(fl.at&lt;pos)return;out+=esc(t.slice(pos,fl.at))+'&lt;mark class="m-'+fl.cat+'"&gt;'+esc(t.substr(fl.at,fl.len))+'&lt;/mark&gt;';pos=fl.at+fl.len;});return out+esc(t.slice(pos))}
function render(t,flags,score,label){
var box=$('#pd-res');box.style.display='block';
var uniq={},list=[];flags.forEach(function(f){var k=f.cat+'|'+f.phrase;if(uniq[k])return;uniq[k]=1;list.push(f)});
var html='&lt;div class="pd-score"&gt;&lt;b&gt;'+score+'&lt;/b&gt;&lt;div style="flex:1"&gt;&lt;div style="font-size:12px;color:var(--mut);margin-bottom:6px"&gt;'+label+' (0–100)&lt;/div&gt;&lt;div class="pd-bar"&gt;&lt;i style="width:'+score+'%"&gt;&lt;/i&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;';
if(list.length){html+=list.map(function(f){return '&lt;div class="pd-flag"&gt;&lt;span class="c" style="color:#f0d68a"&gt;'+D[f.cat].n+'&lt;/span&gt;&lt;span&gt;«'+esc(f.phrase)+'» — '+D[f.cat].tip+'&lt;/span&gt;&lt;/div&gt;'}).join('')}
else html+='&lt;div class="pd-flag"&gt;&lt;span class="c"&gt;✅&lt;/span&gt;&lt;span&gt;Явных флагов не нашёл. Но помни: отсутствие флагов — не доказательство правды.&lt;/span&gt;&lt;/div&gt;';
var fc=facts(t);
html+='&lt;div class="pd-flag"&gt;&lt;span class="c"&gt;?&lt;/span&gt;&lt;span&gt;Фактурность: '+fc+' маркеров фактов (цифры, источники, ссылки, цитаты). '+(fc&gt;=3?'Хорошая опора на факты.':'Фактов маловато — проверь утверждения.')+'&lt;/span&gt;&lt;/div&gt;';
html+='&lt;div class="pd-hl"&gt;'+hl(t,flags)+'&lt;/div&gt;';
box.innerHTML=html;box.scrollIntoView({behavior:'smooth',block:'nearest'});
}
function renderHist(){var h=g('pr_hist',[]);var el=$('#pd-hist');if(!el)return;el.innerHTML=h.length?'История: '+h.map(function(x){return (x.l==='lie'?'?':'')+' '+x.s}).join(' · '):''}
$('#pd-go').addEventListener('click',analyze);
renderHist();
console.log('?️ Правдомер: Блок 2 · Текст-детектор подключён');
})();
&lt;/script&gt;

&lt;style&gt;
#gc-mask{position:fixed;inset:0;z-index:71;background:rgba(10,6,20,.92);backdrop-filter:blur(6px);display:none;align-items:center;justify-content:center}
#gc-mask.open{display:flex}
#gc-card{width:min(520px,92vw);max-height:88vh;overflow-y:auto;background:linear-gradient(180deg,#241a45,#1d1533);border:1px solid rgba(212,175,55,.4);border-radius:20px;padding:22px}
.gc-tabs{display:flex;gap:8px;margin:10px 0}
.gc-tab{flex:1;padding:9px;border-radius:12px;border:1px solid var(--line);background:var(--card);color:var(--mut);font-weight:700;font-size:12px;cursor:pointer}
.gc-tab.on{background:linear-gradient(135deg,var(--violet),var(--gold));color:#fff;border-color:transparent}
.gc-pane{display:none}.gc-pane.on{display:block}
.gc-lvl{display:flex;align-items:center;gap:14px;background:rgba(212,175,55,.08);border:1px solid var(--line);border-radius:16px;padding:14px}
.gc-lvl .ic{font-size:38px}.gc-lvl b{font-size:18px;color:#f0d68a}
.gc-bar{height:10px;background:rgba(255,255,255,.08);border-radius:99px;margin:10px 0;overflow:hidden}
.gc-bar i{display:block;height:100%;background:linear-gradient(90deg,var(--violet),var(--gold))}
.gc-row{display:flex;justify-content:space-between;font-size:13px;color:#cfc8e8;padding:6px 2px;border-bottom:1px dashed rgba(255,255,255,.08)}
.gc-achs{display:grid;grid-template-columns:repeat(auto-fill,minmax(140px,1fr));gap:10px}
.ach{border:1px solid var(--line);border-radius:14px;padding:12px;text-align:center;background:rgba(212,175,55,.06)}
.ach .ic{font-size:26px}.ach b{display:block;font-size:12px;margin:6px 0 2px;color:#f0d68a}.ach span{font-size:10px;color:var(--mut)}
.ach.locked{opacity:.4;filter:grayscale(1)}
.alb{border:1px solid var(--line);border-radius:12px;padding:10px;margin:8px 0;font-size:12px;color:#cfc8e8}
.alb b{color:#f0d68a}
&lt;/style&gt;
&lt;div id="gc-mask"&gt;&lt;div id="gc-card"&gt;
&lt;h2 style="color:#f0d68a;font-size:22px"&gt;?️ Кабинет детектива&lt;/h2&gt;
&lt;div class="gc-tabs"&gt;&lt;button class="gc-tab on" data-t="prof"&gt;? Профиль&lt;/button&gt;&lt;button class="gc-tab" data-t="ach"&gt;? Ачивки&lt;/button&gt;&lt;button class="gc-tab" data-t="alb"&gt;? Альбом&lt;/button&gt;&lt;/div&gt;
&lt;div id="gc-prof" class="gc-pane on"&gt;&lt;/div&gt;&lt;div id="gc-ach" class="gc-pane"&gt;&lt;/div&gt;&lt;div id="gc-alb" class="gc-pane"&gt;&lt;/div&gt;
&lt;button class="btn" id="gc-close" style="width:100%;justify-content:center;margin-top:12px"&gt;Закрыть&lt;/button&gt;
&lt;/div&gt;&lt;/div&gt;
&lt;script&gt;
(function(){"use strict";
if(window._prGameDone)return;window._prGameDone=1;
var $=function(s){return document.querySelector(s)};
function g(k,d){try{var v=localStorage.getItem(k);return v==null?d:JSON.parse(v)}catch(e){return d}}
function s(k,v){try{localStorage.setItem(k,JSON.stringify(v))}catch(e){}}
function coach(t){var c=$('#coach');if(!c)return;$('#coachText').textContent=t;c.style.display='block';clearTimeout(window._prCt);window._prCt=setTimeout(function(){c.style.display='none'},6500);}
function today(){return new Date().toDateString()}
var LEVELS=[[0,'?','Новичок'],[50,'?️','Наблюдатель'],[150,'?','Аналитик'],[300,'?️','Профайлер'],[600,'?','Мастер правды']];
function lvl(pr){var cur=LEVELS[0],next=null;for(var i=0;i&lt;LEVELS.length;i++){if(pr&gt;=LEVELS[i][0])cur=LEVELS[i]}for(var j=0;j&lt;LEVELS.length;j++){if(LEVELS[j][0]&gt;pr){next=LEVELS[j];break}}return{cur:cur,next:next}}
var ACHS=[
{id:'first',ic:'?',n:'Первый разбор',d:'Сделай первый анализ',c:function(x){return x.a&gt;=1}},
{id:'ten',ic:'?',n:'Опытный детектив',d:'10 разборов',c:function(x){return x.a&gt;=10}},
{id:'scam',ic:'?',n:'Мошенник-разоблачитель',d:'Поймай скрипт мошенника (индекс ≤ 40)',c:function(x){return x.scam&gt;=1}},
{id:'manip',ic:'?',n:'Манипулятор-детектор',d:'Вскрой манипуляцию (индекс ≥ 55)',c:function(x){return x.manip&gt;=1}},
{id:'truth',ic:'?',n:'Искатель правды',d:'Найди правдивый текст (индекс ≥ 70)',c:function(x){return x.clean&gt;=1}},
{id:'alb5',ic:'?',n:'Коллекционер разоблачений',d:'5 дел в альбоме',c:function(x){return x.al&gt;=5}},
{id:'sk3',ic:'?',n:'Три дня подряд',d:'Стрик 3 дня',c:function(x){return x.sk&gt;=3}},
{id:'sk7',ic:'⚡',n:'Неделя на страже',d:'Стрик 7 дней',c:function(x){return x.sk&gt;=7}},
{id:'pr100',ic:'?',n:'Капитал проницательности',d:'Накопи 100 PR',c:function(x){return x.pr&gt;=100}}];
function stats(){return g('pr_stats',{a:0,scam:0,manip:0,clean:0})}
function achs(){return g('pr_achs',{})}
function album(){return g('pr_album',[])}
function streak(){return g('pr_streak',{d:0,last:''})}
function pr(){return window.PR?PR.get().pr:0}
function renderHeader(){var e1=$('#hPr');if(e1)e1.textContent='? '+pr()+' PR';var e2=$('#hStreak');if(e2)e2.textContent='? '+streak().d;}
function touchStreak(){var st=streak(),t=today();if(st.last===t)return;var y=new Date(Date.now()-864e5).toDateString();st.d=(st.last===y)?st.d+1:1;st.last=t;s('pr_streak',st);}
function checkAchs(){var got=achs(),x={a:stats().a,scam:stats().scam,manip:stats().manip,clean:stats().clean,pr:pr(),al:album().length,sk:streak().d};
ACHS.forEach(function(a){if(!got[a.id]&amp;&amp;a.c(x)){got[a.id]=Date.now();coach('? Ачивка «'+a.n+'»! +1 PR');if(window.PR&amp;&amp;PR.add)PR.add(1);}});
s('pr_achs',got);}
/* перехват PR.add: считаем активности, стрик, альбом */
if(window.PR&amp;&amp;PR.add&amp;&amp;!PR._gc){PR._gc=1;var oa=PR.add;PR.add=function(n){oa(n);onAct(n);};}
function onAct(n){touchStreak();
if(n&gt;=2){var scEl=$('#pd-res .pd-score b');var sc=scEl?parseInt(scEl.textContent,10):NaN;var lEl=document.querySelector('.lens.on');var lens=lEl?lEl.getAttribute('data-l'):'lie';var txt=$('#pd-in')?$('#pd-in').value:'';var st=stats();st.a++;
if(lens==='lie'&amp;&amp;!isNaN(sc)&amp;&amp;sc&lt;=40)st.scam++;if(lens==='man'&amp;&amp;!isNaN(sc)&amp;&amp;sc&gt;=55)st.manip++;if(lens==='lie'&amp;&amp;!isNaN(sc)&amp;&amp;sc&gt;=70)st.clean++;s('pr_stats',st);
if(!isNaN(sc)){var al=album();al.unshift({t:Date.now(),l:lens,s:sc,x:(txt||'').slice(0,60)});s('pr_album',al.slice(0,30));}}
checkAchs();renderHeader();}
/* рендеры */
function renderProf(){var L=lvl(pr()),pct=L.next?Math.round((pr()-L.cur[0])/(L.next[0]-L.cur[0])*100):100;
$('#gc-prof').innerHTML='&lt;div class="gc-lvl"&gt;&lt;span class="ic"&gt;'+L.cur[1]+'&lt;/span&gt;&lt;div&gt;&lt;b&gt;'+L.cur[2]+'&lt;/b&gt;&lt;div style="font-size:12px;color:var(--mut)"&gt;'+pr()+' PR'+(L.next?' · до «'+L.next[2]+'» '+(L.next[0]-pr())+' PR':' · максимальный уровень')+'&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;'+
'&lt;div class="gc-bar"&gt;&lt;i style="width:'+pct+'%"&gt;&lt;/i&gt;&lt;/div&gt;'+
'&lt;div class="gc-row"&gt;&lt;span&gt;Разборов всего&lt;/span&gt;&lt;b&gt;'+stats().a+'&lt;/b&gt;&lt;/div&gt;'+
'&lt;div class="gc-row"&gt;&lt;span&gt;Стрик&lt;/span&gt;&lt;b&gt;? '+streak().d+'&lt;/b&gt;&lt;/div&gt;'+
'&lt;div class="gc-row"&gt;&lt;span&gt;Мошенников поймано&lt;/span&gt;&lt;b&gt;'+stats().scam+'&lt;/b&gt;&lt;/div&gt;'+
'&lt;div class="gc-row"&gt;&lt;span&gt;Манипуляций вскрыто&lt;/span&gt;&lt;b&gt;'+stats().manip+'&lt;/b&gt;&lt;/div&gt;'+
'&lt;div class="gc-row"&gt;&lt;span&gt;Режим&lt;/span&gt;&lt;b&gt;'+({base:'Универсальный',parent:'Родитель',senior:'Простой',hr:'HR / бизнес'})[g('pr_mode','base')]+'&lt;/b&gt;&lt;/div&gt;';}
function renderAch(){var got=achs();$('#gc-ach').innerHTML='&lt;div class="gc-achs"&gt;'+ACHS.map(function(a){var on=!!got[a.id];return '&lt;div class="ach'+(on?'':' locked')+'"&gt;&lt;div class="ic"&gt;'+(on?a.ic:'?')+'&lt;/div&gt;&lt;b&gt;'+a.n+'&lt;/b&gt;&lt;span&gt;'+a.d+'&lt;/span&gt;&lt;/div&gt;'}).join('')+'&lt;/div&gt;';}
function renderAlb(){var al=album();$('#gc-alb').innerHTML=al.length?al.map(function(x){return '&lt;div class="alb"&gt;&lt;b&gt;'+(x.l==='lie'?'? Ложь':'? Манипуляция')+' · индекс '+x.s+'&lt;/b&gt; · '+new Date(x.t).toLocaleDateString('ru-RU')+'&lt;div style="margin-top:4px;color:var(--mut)"&gt;«'+x.x.replace(/&lt;/g,'&amp;lt;')+'…»&lt;/div&gt;&lt;/div&gt;'}).join(''):'&lt;div class="alb"&gt;Пока пусто. Сделай первый разбор — и он ляжет в альбом ?&lt;/div&gt;';}
function openGC(t){$('#gc-mask').classList.add('open');setTab(t||'prof');}
function setTab(t){document.querySelectorAll('.gc-tab').forEach(function(b){b.classList.toggle('on',b.getAttribute('data-t')===t)});
['prof','ach','alb'].forEach(function(p){$('#gc-'+p).classList.toggle('on',p===t)});
if(t==='prof')renderProf();if(t==='ach')renderAch();if(t==='alb')renderAlb();}
document.querySelectorAll('.gc-tab').forEach(function(b){b.addEventListener('click',function(){setTab(b.getAttribute('data-t'))})});
$('#gc-close').addEventListener('click',function(){$('#gc-mask').classList.remove('open')});
$('#gc-mask').addEventListener('click',function(e){if(e.target===this)this.classList.remove('open')});
/* нижняя сетка: профиль/ачивки/альбом/экспорт */
var fg=$('#footGrid');
if(fg){var fg2=fg.cloneNode(true);fg.parentNode.replaceChild(fg2,fg);
fg2.addEventListener('click',function(e){var it=e.target.closest('.sq');if(!it)return;var i=+it.getAttribute('data-i');
if(i===0)openGC('prof');else if(i===1)openGC('ach');else if(i===2)openGC('alb');
else if(i===3){var mm=$('#modeMask');if(mm)mm.classList.add('open');}
else if(i===4){var data={profile:window.PR?PR.get():null,mode:g('pr_mode','base'),stats:stats(),streak:streak(),achs:achs(),album:album()};var blob=new Blob([JSON.stringify(data,null,2)],{type:'application/json'});var a=document.createElement('a');a.href=URL.createObjectURL(blob);a.download='pravdomer-export.json';document.body.appendChild(a);a.click();a.remove();coach('? Экспорт готов — файл скачан.');}
else coach('Правдомер — тренажёр детектива лжи. Учись видеть манипуляции играючи. 18+, не экспертиза.');});}
checkAchs();renderHeader();
console.log('?️ Правдомер: Блок 3 · Геймкор подключён');
})();
&lt;/script&gt;

&lt;style&gt;
.cs{border:1px solid var(--line);border-radius:16px;padding:14px;margin:12px 0;background:rgba(212,175,55,.05)}
.cs-h{display:flex;align-items:center;gap:8px;font-size:14px}
.cs-cat{margin-left:auto;font-size:10px;padding:3px 10px;border-radius:999px;background:rgba(139,92,246,.15);color:#c4b5fd;font-weight:700}
.cs-x{font-size:13px;color:#d9d2ea;margin:8px 0;font-style:italic}
.cs-opt{display:flex;gap:8px;align-items:center;font-size:12px;color:#cfc8e8;margin:5px 0;cursor:pointer}
.cs-opt input{accent-color:var(--gold)}
.cs-row{display:flex;gap:8px;flex-wrap:wrap;align-items:center;margin-top:8px}
.cs-res{margin-top:10px;font-size:12px;color:#cfc8e8}
.cs-res .win{color:#6ee7b7;font-weight:700}.cs-res .lose{color:#fca5a5;font-weight:700}
.inv-clue{border-left:3px solid var(--violet);background:rgba(139,92,246,.07);border-radius:0 10px 10px 0;padding:8px 10px;font-size:12px;margin:6px 0;color:#cfc8e8}
&lt;/style&gt;
&lt;script&gt;
(function(){"use strict";
if(window._prCasesDone)return;window._prCasesDone=1;
var $=function(s){return document.querySelector(s)};
function g(k,d){try{var v=localStorage.getItem(k);return v==null?d:JSON.parse(v)}catch(e){return d}}
function s(k,v){try{localStorage.setItem(k,JSON.stringify(v))}catch(e){}}
function coach(t){var c=$('#coach');if(!c)return;$('#coachText').textContent=t;c.style.display='block';clearTimeout(window._prCt);window._prCt=setTimeout(function(){c.style.display='none'},6500);}
function grant(n){var P=g('pr_profile',{pr:0,streak:0,last:'',lvl:1});P.pr+=n;P.lvl=1+Math.floor(P.pr/100);s('pr_profile',P);var e=$('#hPr');if(e)e.textContent='? '+P.pr+' PR';
var st=g('pr_streak',{d:0,last:''}),t=new Date().toDateString();if(st.last!==t){var y=new Date(Date.now()-864e5).toDateString();st.d=(st.last===y)?st.d+1:1;st.last=t;s('pr_streak',st);var e2=$('#hStreak');if(e2)e2.textContent='? '+st.d;}}
/* ── 12 кейсов ── */
var CASES=[
{id:1,ic:'?',cat:'Мошенники',t:'СМС от «банка»',x:'Срочно! Ваша карта заблокирована. Немедленно сообщите код из СМС, иначе все деньги пропадут!',bad:true,exp:'Срочность + страх + запрос кода = классический скрипт мошенника. Банк никогда не спрашивает код.',opts:[{t:'Искусственная срочность («срочно», «немедленно»)',ok:1},{t:'Кнопка страха («все деньги пропадут»)',ok:1},{t:'Запрос секретного кода',ok:1},{t:'Вежливое приветствие',ok:0}]},
{id:2,ic:'?',cat:'Манипуляции',t:'Разговор с партнёром',x:'Ты сам виноват, что так вышло. Я такого не говорил, тебе кажется.',bad:true,exp:'Газлайтинг: отрицание факта + перекладывание вины. Флаги — «тебе кажется», «ты сам виноват».',opts:[{t:'Отрицание сказанного («я такого не говорил»)',ok:1},{t:'Перекладывание вины',ok:1},{t:'Аргументы с цифрами',ok:0},{t:'Забота о партнёре',ok:0}]},
{id:3,ic:'?',cat:'Фейк-ньюс',t:'Сенсация о воде',x:'Учёные доказали: все, кто пьёт воду по утрам, живут на 20 лет дольше! Поделись со всеми!',bad:true,exp:'Абсолютизм «все», точная цифра без ссылки на исследование, призыв к репосту — фейк-маркеры.',opts:[{t:'Абсолютизм («все»)',ok:1},{t:'Цифра без источника',ok:1},{t:'Призыв «поделись»',ok:1},{t:'Нейтральный тон',ok:0}]},
{id:4,ic:'?',cat:'Работа',t:'Рабочее письмо',x:'Встреча переносится на 15:00 в четверг. Повестка: бюджет Q2. Материалы — в общей папке.',bad:false,exp:'Конкретика: время, место, повестка, материалы. Нет давления и эмоций — чистый текст.',opts:[{t:'Конкретное время и место',ok:0},{t:'Ссылка на материалы',ok:0},{t:'Скрытая срочность',ok:0},{t:'Эмоциональное давление',ok:0}]},
{id:5,ic:'?',cat:'HR',t:'Резюме кандидата',x:'Я увеличил продажи на 500% за месяц. Я лучший специалист на рынке, каждый это подтвердит.',bad:true,exp:'500% без подтверждений, «лучший», «каждый подтвердит» — самопрезентация без фактов.',opts:[{t:'Непроверяемая цифра (500%)',ok:1},{t:'Абсолютизм («лучший», «каждый»)',ok:1},{t:'Конкретные компании и даты',ok:0},{t:'Ссылки на рекомендации',ok:0}]},
{id:6,ic:'?',cat:'Медицина',t:'Звонок «больного»',x:'Мне совсем плохо, я умираю! Срочно переведи деньги на лекарство, только никому не говори!',bad:true,exp:'Страх + срочность + секретность + деньги = мошенническая схема «спаси близкого».',opts:[{t:'Нагнетание страха («я умираю»)',ok:1},{t:'Просьба о деньгах',ok:1},{t:'Секретность («никому не говори»)',ok:1},{t:'Подробное описание симптомов',ok:0}]},
{id:7,ic:'?',cat:'Соцсети',t:'Пост «идеальная жизнь»',x:'Моя жизнь идеальна! Каждый день — праздник! Я никогда не расстраиваюсь!',bad:true,exp:'Токсичный позитив с абсолютизмами: «идеальна», «никогда». Так маскируют реальность.',opts:[{t:'Абсолютизм («никогда», «каждый»)',ok:1},{t:'Токсичный позитив',ok:1},{t:'Реальные фото с деталями',ok:0},{t:'Признание слабостей',ok:0}]},
{id:8,ic:'?',cat:'Политика',t:'Речь кандидата',x:'Если вы не выберете меня, город ждёт катастрофа. Только я могу его спасти.',bad:true,exp:'Кнопка страха + «только я» (исключительность) = манипуляция, а не программа.',opts:[{t:'Кнопка страха («катастрофа»)',ok:1},{t:'Исключительность («только я»)',ok:1},{t:'Программа с цифрами',ok:0},{t:'Призыв к единству',ok:0}]},
{id:9,ic:'?',cat:'Бытовое',t:'Сообщение друга',x:'Могу опоздать на 10 минут, метро ходит реже. Напишу, когда сяду в поезд.',bad:false,exp:'Объяснение причины + обещание написать. Спокойный, проверяемый текст — без флагов.',opts:[{t:'Объяснение причины',ok:0},{t:'Обещание написать',ok:0},{t:'Скрытая срочность',ok:0},{t:'Размытость без деталей',ok:0}]},
{id:10,ic:'?',cat:'Мошенники',t:'«Инвестиции»',x:'Только сегодня! Гарантированные 300% годовых. Осталось мало мест, успей!',bad:true,exp:'Гарантия сверхдохода + дефицит + срочность — пирамида в чистом виде.',opts:[{t:'Гарантия сверхдохода',ok:1},{t:'Дефицит («мало мест»)',ok:1},{t:'Срочность («только сегодня»)',ok:1},{t:'Описание рисков и лицензий',ok:0}]},
{id:11,ic:'?',cat:'Манипуляции',t:'Звонок родителя',x:'После всего, что я для тебя сделал, ты даже не звонишь? Все будут смеяться над таким сыном.',bad:true,exp:'Вина («после всего») + стыд («все будут смеяться») — рычаги давления, а не диалог.',opts:[{t:'Давление виной («после всего»)',ok:1},{t:'Кнопка стыда («все будут смеяться»)',ok:1},{t:'Просьба о встрече напрямую',ok:0},{t:'Выражение любви без условий',ok:0}]},
{id:12,ic:'?',cat:'Новости',t:'Новость с источником',x:'По данным ЦБ (ссылка на отчёт), ключевая ставка снижена на 0,5%.',bad:false,exp:'Источник + точная цифра + нейтральный тон. Так выглядит проверяемая новость.',opts:[{t:'Источник и ссылка',ok:0},{t:'Точная цифра',ok:0},{t:'Нейтральный тон',ok:0},{t:'Кликбейтный заголовок',ok:0}]}];
/* ── 3 расследования ── */
var INVS=[
{id:'i1',ic:'?️',t:'Дело «Наследник»',clues:[{ic:'?',x:'СМС от «дяди»: «Срочно нужны деньги, никому не говори!»'},{ic:'?',x:'Фото из профиля: ELA-анализ — следы монтажа на фоне.'},{ic:'?',x:'Голосовое: голос ровный, без стресса в «трагических» местах.'}],q:'Что происходит?',opts:['Дядя действительно в беде','Это мошенники с поддельным голосом и фото'],ok:1,exp:'Секретность + срочность + монтаж фото + неестественно ровный голос = схема «родственник в беде».'},
{id:'i2',ic:'',t:'Дело «Звёздный блогер»',clues:[{ic:'?',x:'Пост: «Я никогда не использую фильтры и ретушь!»'},{ic:'?',x:'Фото: ELA — артефакты ретуши кожи и фона.'},{ic:'?',x:'Интервью: длинные паузы на вопрос «вы делали пластику?» — «нет».'}],q:'Вердикт?',opts:['Блогер честен','Блогер скрывает ретушь и пластику'],ok:1,exp:'Слова расходятся с фото- и голосовыми маркерами — классическое расхождение модальностей.'},
{id:'i3',ic:'?',t:'Дело «Кандидат»',clues:[{ic:'?',x:'Резюме: «увеличил продажи на 500%» без компаний и дат.'},{ic:'?',x:'Рекомендации: шаблонные фразы, как у ботов.'},{ic:'?',x:'Созвон: не может назвать конкретные цифры, длинные паузы.'}],q:'Вердикт?',opts:['Кандидат преувеличивает','Данные точны'],ok:0,exp:'Непроверяемые цифры + шаблонные рекомендации + уход от конкретики = преувеличение.'}];
/* ── секция ── */
var main=document.querySelector('main');var fg=document.querySelector('.foot-grid');
var sec=document.createElement('section');sec.id='cases';sec.className='';
sec.innerHTML='&lt;div class="sec-ic"&gt;?&lt;/div&gt;&lt;h2&gt;Библиотека дел&lt;/h2&gt;&lt;div class="sub"&gt;Учись на чужих кейсах: найди флаги сам — получи PR&lt;/div&gt;'+
'&lt;div class="pd-lens"&gt;&lt;button class="lens on" data-t="cs"&gt;? Кейсы&lt;/button&gt;&lt;button class="lens" data-t="inv"&gt;?️ Расследования&lt;/button&gt;&lt;/div&gt;'+
'&lt;div id="cs-box"&gt;&lt;/div&gt;&lt;div id="inv-box" style="display:none"&gt;&lt;/div&gt;';
if(fg)main.insertBefore(sec,fg);else main.appendChild(sec);
var chip=document.createElement('button');chip.textContent='? Дела';chip.setAttribute('data-t','cases');
var nav=$('#chips');if(nav){nav.appendChild(chip);chip.addEventListener('click',function(){nav.querySelectorAll('button').forEach(function(x){x.classList.remove('on')});chip.classList.add('on');sec.scrollIntoView({behavior:'smooth'});});}
sec.querySelectorAll('.lens').forEach(function(b){b.addEventListener('click',function(){sec.querySelectorAll('.lens').forEach(function(x){x.classList.remove('on')});b.classList.add('on');var t=b.getAttribute('data-t');$('#cs-box').style.display=t==='cs'?'block':'none';$('#inv-box').style.display=t==='inv'?'block':'none';});});
/* ── кейсы ── */
function doneMap(){return g('pr_cases',{})}
function renderCases(){var dm=doneMap();$('#cs-box').innerHTML=CASES.map(function(c){
var d=dm[c.id];
var h='&lt;div class="cs" data-id="'+c.id+'"&gt;&lt;div class="cs-h"&gt;'+c.ic+' &lt;b&gt;'+c.t+'&lt;/b&gt;&lt;span class="cs-cat"&gt;'+c.cat+'&lt;/span&gt;&lt;/div&gt;&lt;div class="cs-x"&gt;«'+c.x+'»&lt;/div&gt;';
if(d){h+='&lt;div class="cs-res"&gt;'+(d.correct?'&lt;span class="win"&gt;✓ Верно&lt;/span&gt;':'&lt;span class="lose"&gt;✗ Мимо&lt;/span&gt;')+' · +'+d.total+' PR&lt;br&gt;'+c.exp+'&lt;/div&gt;';return h+'&lt;/div&gt;'}
h+='&lt;div style="font-size:11px;color:var(--mut);margin:6px 0"&gt;Шаг 1. Отметь флаги, которые видишь САМ:&lt;/div&gt;';
h+=c.opts.map(function(o,i){return '&lt;label class="cs-opt"&gt;&lt;input type="checkbox" data-i="'+i+'"&gt; '+o.t+'&lt;/label&gt;'}).join('');
h+='&lt;div class="cs-row"&gt;&lt;button class="btn cs-check"&gt;? Проверить флаги&lt;/button&gt;&lt;span class="cs-ver" style="display:none;gap:8px"&gt;&lt;button class="btn ghost cs-bad"&gt;? Ложь/манипуляция&lt;/button&gt;&lt;button class="btn ghost cs-ok"&gt;✅ Чисто&lt;/button&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="cs-res"&gt;&lt;/div&gt;&lt;/div&gt;';
return h}).join('')}
$('#cs-box').addEventListener('click',function(e){
var card=e.target.closest('.cs');if(!card)return;var c=null;CASES.forEach(function(x){if(x.id==card.getAttribute('data-id'))c=x});if(!c)return;
if(e.target.closest('.cs-check')){
var fb=0,checked=card.querySelectorAll('input:checked');
checked.forEach(function(inp){var o=c.opts[+inp.getAttribute('data-i')];fb+=o.ok?2:-1});fb=Math.max(0,fb);
card.setAttribute('data-fb',fb);
card.querySelector('.cs-res').innerHTML='Флагов найдено: '+checked.length+' · бонус за флаги: +'+fb+' PR. Теперь вердикт:';
card.querySelector('.cs-ver').style.display='inline-flex';
}
if(e.target.closest('.cs-bad')||e.target.closest('.cs-ok')){
var ans=!!e.target.closest('.cs-bad');var correct=(ans===c.bad);
var fb=+ (card.getAttribute('data-fb')||0);var total=fb+(correct?3:1);
grant(total);
var dm=doneMap();dm[c.id]={correct:correct,total:total};s('pr_cases',dm);
coach(correct?'? Верно! '+c.exp+' +'+total+' PR':'? Не совсем. '+c.exp+' +'+total+' PR за практику');
renderCases();
}});
/* ── расследования ── */
function invMap(){return g('pr_inv',{})}
function renderInv(){var im=invMap();$('#inv-box').innerHTML=INVS.map(function(v){
var d=im[v.id];
var h='&lt;div class="cs" data-id="'+v.id+'"&gt;&lt;div class="cs-h"&gt;'+v.ic+' &lt;b&gt;'+v.t+'&lt;/b&gt;&lt;span class="cs-cat"&gt;Расследование&lt;/span&gt;&lt;/div&gt;';
h+=v.clues.map(function(cl){return '&lt;div class="inv-clue"&gt;'+cl.ic+' '+cl.x+'&lt;/div&gt;'}).join('');
h+='&lt;div style="font-size:12px;margin:6px 0"&gt;&lt;b&gt;'+v.q+'&lt;/b&gt;&lt;/div&gt;';
if(d){h+='&lt;div class="cs-res"&gt;'+(d.correct?'&lt;span class="win"&gt;✓ Раскрыто&lt;/span&gt;':'&lt;span class="lose"&gt;✗ Мимо&lt;/span&gt;')+' · +'+d.total+' PR&lt;br&gt;'+v.exp+'&lt;/div&gt;';return h+'&lt;/div&gt;'}
h+=v.opts.map(function(o,i){return '&lt;div class="cs-row"&gt;&lt;button class="btn ghost inv-opt" data-i="'+i+'"&gt;'+o+'&lt;/button&gt;&lt;/div&gt;'}).join('');
h+='&lt;div class="cs-res"&gt;&lt;/div&gt;&lt;/div&gt;';return h}).join('')}
$('#inv-box').addEventListener('click',function(e){
var b=e.target.closest('.inv-opt');if(!b)return;var card=e.target.closest('.cs');var v=null;INVS.forEach(function(x){if(x.id===card.getAttribute('data-id'))v=x});if(!v)return;
var i=+b.getAttribute('data-i');var correct=(i===v.ok);var total=correct?10:2;
grant(total);var im=invMap();im[v.id]={correct:correct,total:total};s('pr_inv',im);
coach(correct?'?️ Дело раскрыто! +10 PR':'? Улика велa в другую сторону. +2 PR за попытку');
renderInv();
});
renderCases();renderInv();
console.log('?️ Правдомер: Блок 4 · Библиотека дел подключена');
})();
&lt;/script&gt;

&lt;style&gt;
#voice canvas{width:100%;height:130px;background:rgba(0,0,0,.3);border:1px solid var(--line);border-radius:12px}
.vd-row{display:flex;gap:8px;flex-wrap:wrap;margin:10px 0}
.vd-rec{background:linear-gradient(135deg,#EF4444,#B91C1C)!important}
.vd-rec.on{animation:vdPulse 1.2s infinite}
@keyframes vdPulse{0%,100%{box-shadow:0 0 0 0 rgba(239,68,68,.5)}50%{box-shadow:0 0 0 12px rgba(239,68,68,0)}}
&lt;/style&gt;
&lt;script&gt;
(function(){"use strict";
if(window._prVoiceDone)return;window._prVoiceDone=1;
var $=function(s){return document.querySelector(s)};
function g(k,d){try{var v=localStorage.getItem(k);return v==null?d:JSON.parse(v)}catch(e){return d}}
function s(k,v){try{localStorage.setItem(k,JSON.stringify(v))}catch(e){}}
function coach(t){var c=$('#coach');if(!c)return;$('#coachText').textContent=t;c.style.display='block';clearTimeout(window._prCt);window._prCt=setTimeout(function(){c.style.display='none'},6500);}
function grant(n){var P=g('pr_profile',{pr:0,streak:0,last:'',lvl:1});P.pr+=n;P.lvl=1+Math.floor(P.pr/100);s('pr_profile',P);var e=$('#hPr');if(e)e.textContent='? '+P.pr+' PR';
var st=g('pr_streak',{d:0,last:''}),t=new Date().toDateString();if(st.last!==t){var y=new Date(Date.now()-864e5).toDateString();st.d=(st.last===y)?st.d+1:1;st.last=t;s('pr_streak',st);var e2=$('#hStreak');if(e2)e2.textContent='? '+st.d;}}
var sec=$('#voice');if(!sec)return;
sec.innerHTML='&lt;div class="sec-ic"&gt;?&lt;/div&gt;&lt;h2&gt;Голос-детектор&lt;/h2&gt;&lt;div class="sub"&gt;Запиши голос или загрузи файл — покажу маркеры стресса на осциллограмме. Аудио не покидает устройство&lt;/div&gt;'+
'&lt;div class="vd-row"&gt;&lt;button class="btn vd-rec" id="vd-rec"&gt;? Записать&lt;/button&gt;&lt;label class="pd-file"&gt;? Аудиофайл&lt;input type="file" id="vd-file" accept="audio/*"&gt;&lt;/label&gt;&lt;button class="btn ghost" id="vd-demo"&gt;? Демо-сигнал&lt;/button&gt;&lt;/div&gt;'+
'&lt;canvas id="vd-canvas" width="900" height="140"&gt;&lt;/canvas&gt;'+
'&lt;div id="vd-status" style="font-size:12px;color:var(--mut);margin:6px 0"&gt;До 20 секунд. Говори естественно — система слушает паузы, тон и темп.&lt;/div&gt;'+
'&lt;div id="vd-res" style="display:none"&gt;&lt;/div&gt;';
var AC=window.AudioContext||window.webkitAudioContext;
var recording=false,rec=null,stream=null,an=null,raf=0,stopTimer=0;
$('#vd-rec').addEventListener('click',function(){recording?stopRec():startRec()});
$('#vd-demo').addEventListener('click',function(){coach('? Демо-сигнал: синтез с паузами и дрожью тона. Смотри маркеры!');analyze(demoBuffer())});
$('#vd-file').addEventListener('change',function(e){var f=e.target.files[0];if(!f)return;$('#vd-status').textContent='Декодирую «'+f.name+'»…';
var r=new FileReader();r.onload=function(){var ctx=new AC();ctx.decodeAudioData(r.result).then(function(buf){analyze(buf)}).catch(function(){coach('Не смог декодировать файл — попробуй демо-сигнал ?')})};r.readAsArrayBuffer(f);});
function startRec(){
if(!navigator.mediaDevices||!navigator.mediaDevices.getUserMedia){coach('Микрофон недоступен — жми «Демо-сигнал» ?');return}
navigator.mediaDevices.getUserMedia({audio:true}).then(function(st){
stream=st;var ctx=new AC();var src=ctx.createMediaStreamSource(st);an=ctx.createAnalyser();an.fftSize=2048;src.connect(an);
rec=new MediaRecorder(st);var chunks=[];
rec.ondataavailable=function(ev){chunks.push(ev.data)};
rec.onstop=function(){st.getTracks().forEach(function(t){t.stop()});cancelAnimationFrame(raf);
var blob=new Blob(chunks,{type:rec.mimeType||'audio/webm'});
$('#vd-status').textContent='Анализирую запись…';
blob.arrayBuffer?blob.arrayBuffer().then(function(ab){return new AC().decodeAudioData(ab)}).then(function(buf){analyze(buf)}).catch(function(){coach('Не декодировалась запись — жми «Демо-сигнал» ?')}):coach('Браузер не поддержал запись — жми «Демо-сигнал» ?');};
rec.start();recording=true;var b=$('#vd-rec');b.classList.add('on');b.textContent='⏹ Стоп и анализ';
live();stopTimer=setTimeout(stopRec,20000);
}).catch(function(){coach('Нет доступа к микрофону — жми «Демо-сигнал» ?')});
}
function stopRec(){if(!recording)return;recording=false;clearTimeout(stopTimer);var b=$('#vd-rec');b.classList.remove('on');b.textContent='? Записать';if(rec&amp;&amp;rec.state!=='inactive')rec.stop();}
function live(){var cv=$('#vd-canvas'),cx=cv.getContext('2d'),data=new Uint8Array(an.fftSize);
(function loop(){raf=requestAnimationFrame(loop);an.getByteTimeDomainData(data);cx.clearRect(0,0,cv.width,cv.height);cx.strokeStyle='#8B5CF6';cx.beginPath();
for(var i=0;i&lt;data.length;i+=8){var x=i/data.length*cv.width,y=(data[i]/255)*cv.height;i===0?cx.moveTo(x,y):cx.lineTo(x,y)}cx.stroke();})();}
/* ── анализ ── */
function mean(a){if(!a.length)return 0;var t=0;for(var i=0;i&lt;a.length;i++)t+=a[i];return t/a.length}
function sd(a){if(a.length&lt;2)return 0;var m=mean(a),t=0;for(var i=0;i&lt;a.length;i++)t+=(a[i]-m)*(a[i]-m);return Math.sqrt(t/a.length)}
function autocorr(d,off,win,sr){var minL=Math.floor(sr/400),maxL=Math.floor(sr/60),best=0,lag0=0,e0=0;
for(var i=0;i&lt;win;i+=2){var v=d[off+i];e0+=v*v}if(e0&lt;1e-4)return 0;
for(var lag=minL;lag&lt;maxL;lag+=2){var s=0;for(var i2=0;i2&lt;win;i2+=4){s+=d[off+i2]*d[off+i2+lag]}var c=s/e0;if(c&gt;best){best=c;lag0=lag}}
return best&gt;0.3&amp;&amp;lag0&gt;0?sr/lag0:0}
function analyze(buf){
var sr=buf.sampleRate,d=buf.getChannelData(0);
var win=Math.floor(sr*0.05),hop=Math.floor(win/2),rms=[];
for(var i=0;i+win&lt;d.length;i+=hop){var q=0;for(var j=0;j&lt;win;j++){var v=d[i+j];q+=v*v}rms.push(Math.sqrt(q/win))}
var maxR=0;for(var i2=0;i2&lt;rms.length;i2++)if(rms[i2]&gt;maxR)maxR=rms[i2];
var thr=Math.max(0.004,maxR*0.08),silent=rms.map(function(v){return v&lt;thr});
var pauses=0,pauseLen=0,pauseIdx=[],run=0;
for(var i3=0;i3&lt;silent.length;i3++){if(silent[i3])run++;else{var dur=run*hop/sr;if(dur&gt;0.28){pauses++;pauseLen+=dur;pauseIdx.push([i3-run,i3])}run=0}}
var voiced=0;for(var i4=0;i4&lt;silent.length;i4++)if(!silent[i4])voiced++;var vSec=voiced*hop/sr;
var peaks=0;for(var i5=1;i5&lt;rms.length-1;i5++)if(rms[i5]&gt;thr*2&amp;&amp;rms[i5]&gt;=rms[i5-1]&amp;&amp;rms[i5]&gt;rms[i5+1])peaks++;
var rate=vSec&gt;0?peaks/vSec:0;
var pitches=[];for(var i6=0;i6+win&lt;d.length;i6+=hop*2){if(rms[Math.floor(i6/hop)]&lt;thr*1.5)continue;var p=autocorr(d,i6,win,sr);if(p)pitches.push(p)}
var pm=mean(pitches),psd=pm?sd(pitches)/pm:0,jit=0;
for(var i7=1;i7&lt;pitches.length;i7++)jit+=Math.abs(pitches[i7]-pitches[i7-1]);
jit=pitches.length&gt;1?(jit/(pitches.length-1))/(pm||1):0;
var score=12,marks=[];
if(pauses&gt;=2){score+=Math.min(24,pauses*8);marks.push({ic:'⏸',t:'Длинные паузы: '+pauses+' (Σ '+pauseLen.toFixed(1)+' с)',d:'Частые паузы — подбор слов, возможна конструированная версия.'})}
if(jit&gt;0.09){score+=20;marks.push({ic:'?',t:'Дрожь голоса (джиттер '+Math.round(jit*100)+'%)',d:'Микроколебания тона — маркер стресса.'})}
else if(psd&gt;0.18){score+=14;marks.push({ic:'?',t:'Перепады тона (вариативность '+Math.round(psd*100)+'%)',d:'Эмоциональное напряжение, нестабильность.'})}
if(rate&gt;4.2){score+=12;marks.push({ic:'⚡',t:'Быстрый темп (~'+rate.toFixed(1)+' сл/с)',d:'Волнение, стремление проскочить.'})}
else if(rate&gt;0&amp;&amp;rate&lt;2.2&amp;&amp;vSec&gt;1){score+=10;marks.push({ic:'?',t:'Замедленный темп (~'+rate.toFixed(1)+' сл/с)',d:'Заторможенность, осторожная дозировка ответа.'})}
score=Math.max(3,Math.min(96,score));
drawWave(d,silent,hop,pauseIdx);
render(score,marks,vSec);
grant(3);
var h=g('pr_voice',[]);h.unshift({t:Date.now(),s:score});s('pr_voice',h.slice(0,6));
coach(score&lt;30?'? Голос ровный: стресс-маркеров мало. +3 PR':score&lt;55?'? Есть лёгкое напряжение — смотри маркеры. +3 PR':'? Выраженный стресс в голосе: паузы/дрожь. +3 PR');
}
function drawWave(d,silent,hop,pauseIdx){
var cv=$('#vd-canvas'),cx=cv.getContext('2d'),W=cv.width,H=cv.height;
cx.clearRect(0,0,W,H);cx.strokeStyle='#8B5CF6';cx.lineWidth=1;cx.beginPath();
var step=Math.max(1,Math.floor(d.length/W));
for(var x=0;x&lt;W;x++){var v=d[x*step]||0;var y=H/2-v*H*0.9;y=Math.max(2,Math.min(H-2,y));x===0?cx.moveTo(x,y):cx.lineTo(x,y)}
cx.stroke();
cx.fillStyle='rgba(239,68,68,.25)';
pauseIdx.forEach(function(p){var x1=(p[0]*hop)/d.length*W,x2=(p[1]*hop)/d.length*W;cx.fillRect(x1,0,Math.max(2,x2-x1),H)});
}
function render(score,marks,vSec){
var box=$('#vd-res');box.style.display='block';
var html='&lt;div class="pd-score"&gt;&lt;b&gt;'+score+'&lt;/b&gt;&lt;div style="flex:1"&gt;&lt;div style="font-size:12px;color:var(--mut);margin-bottom:6px"&gt;Индекс стресса голоса (0–100) · длительность речи '+vSec.toFixed(1)+' с&lt;/div&gt;&lt;div class="pd-bar"&gt;&lt;i style="width:'+score+'%"&gt;&lt;/i&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;';
html+=marks.length?marks.map(function(m){return '&lt;div class="pd-flag"&gt;&lt;span class="c" style="color:#f0d68a"&gt;'+m.ic+' '+m.t+'&lt;/span&gt;&lt;span&gt;'+m.d+'&lt;/span&gt;&lt;/div&gt;'}).join(''):'&lt;div class="pd-flag"&gt;&lt;span class="c"&gt;✅&lt;/span&gt;&lt;span&gt;Явных стресс-маркеров не нашёл: ровный тон, естественные паузы.&lt;/span&gt;&lt;/div&gt;';
html+='&lt;div class="pd-flag"&gt;&lt;span class="c"&gt;?&lt;/span&gt;&lt;span&gt;Помни: стресс в голосе ≠ ложь. Волнуются и честные. Сравнивай с базой тона человека.&lt;/span&gt;&lt;/div&gt;';
box.innerHTML=html;box.scrollIntoView({behavior:'smooth',block:'nearest'});
}
function demoBuffer(){
var sr=22050,sec=6,n=sr*sec,d=new Float32Array(n),i=0,seg=0;
while(i&lt;n){var dur=seg%2===0?0.6+Math.random()*0.9:0.3+Math.random()*0.4;var len=Math.floor(dur*sr);
if(seg%2===1){for(var j=0;j&lt;len&amp;&amp;i&lt;n;j++)d[i++]=(Math.random()-0.5)*0.002;}
else{var f0=110+Math.random()*90;for(var j2=0;j2&lt;len&amp;&amp;i&lt;n;j2++){var tt=j2/sr;var wob=1+0.03*Math.sin(2*Math.PI*6*tt)+(Math.random()-0.5)*0.012;var env=Math.sin(Math.PI*j2/len);d[i++]=env*0.3*Math.sin(2*Math.PI*f0*wob*tt)*(1+0.3*Math.sin(2*Math.PI*3*tt));}}
seg++;}
return{sampleRate:sr,duration:sec,getChannelData:function(){return d}};
}
console.log('?️ Правдомер: Блок 5 · Голос-детектор подключён');
})();
&lt;/script&gt;

&lt;style&gt;
.ph-row{display:flex;gap:10px;flex-wrap:wrap;margin:10px 0}
.ph-row canvas{flex:1;min-width:220px;max-width:48%;height:180px;background:rgba(0,0,0,.3);border:1px solid var(--line);border-radius:12px;object-fit:cover}
@media(max-width:640px){.ph-row canvas{max-width:100%}}
.cl-bub{max-width:85%;padding:10px 14px;border-radius:14px;font-size:13px;margin:6px 0;line-height:1.5}
.cl-scam{background:rgba(239,68,68,.12);border:1px solid rgba(239,68,68,.35);color:#fca5a5}
.cl-me{background:rgba(212,175,55,.12);border:1px solid var(--line);color:#f0d68a;margin-left:auto}
.cl-note{font-size:11px;color:var(--mut);margin:2px 0 8px}
.cl-say{width:100%;text-align:left;padding:10px 12px;border-radius:12px;border:1px solid var(--line);background:rgba(255,255,255,.04);color:#cfc8e8;font-size:12px;cursor:pointer;margin:4px 0}
.cl-say:hover{border-color:var(--gold)}
&lt;/style&gt;
&lt;script&gt;
(function(){"use strict";
if(window._prPhotoCall)return;window._prPhotoCall=1;
var $=function(s){return document.querySelector(s)};
function g(k,d){try{var v=localStorage.getItem(k);return v==null?d:JSON.parse(v)}catch(e){return d}}
function s(k,v){try{localStorage.setItem(k,JSON.stringify(v))}catch(e){}}
function coach(t){var c=$('#coach');if(!c)return;$('#coachText').textContent=t;c.style.display='block';clearTimeout(window._prCt);window._prCt=setTimeout(function(){c.style.display='none'},6500);}
function grant(n){var P=g('pr_profile',{pr:0,streak:0,last:'',lvl:1});P.pr+=n;P.lvl=1+Math.floor(P.pr/100);s('pr_profile',P);var e=$('#hPr');if(e)e.textContent='? '+P.pr+' PR';
var st=g('pr_streak',{d:0,last:''}),t=new Date().toDateString();if(st.last!==t){var y=new Date(Date.now()-864e5).toDateString();st.d=(st.last===y)?st.d+1:1;st.last=t;s('pr_streak',st);var e2=$('#hStreak');if(e2)e2.textContent='? '+st.d;}}
/* ═════════ ФОТО-ДЕТЕКТОР ═════════ */
var psec=$('#photo');
if(psec){
psec.innerHTML='&lt;div class="sec-ic"&gt;?&lt;/div&gt;&lt;h2&gt;Фото-детектор&lt;/h2&gt;&lt;div class="sub"&gt;ELA-карта правок + EXIF: оригинал, монтаж или AI? Всё локально&lt;/div&gt;'+
'&lt;div class="ph-row"&gt;&lt;label class="pd-file"&gt;? Загрузить фото&lt;input type="file" id="ph-file" accept="image/*"&gt;&lt;/label&gt;&lt;button class="btn ghost" id="ph-d1"&gt;? Демо: оригинал&lt;/button&gt;&lt;button class="btn ghost" id="ph-d2"&gt;? Демо: монтаж&lt;/button&gt;&lt;/div&gt;'+
'&lt;div class="ph-row"&gt;&lt;canvas id="ph-prev"&gt;&lt;/canvas&gt;&lt;canvas id="ph-heat"&gt;&lt;/canvas&gt;&lt;/div&gt;'+
'&lt;div id="ph-res" style="display:none"&gt;&lt;/div&gt;';
$('#ph-file').addEventListener('change',function(e){var f=e.target.files[0];if(!f)return;var r=new FileReader();
r.onload=function(){var ex=parseEXIF(r.result);var img=new Image();img.onload=function(){analyze(img,ex)};img.src=r.result;};
r.readAsArrayBuffer(f);});
$('#ph-d1').addEventListener('click',function(){makeDemo(false,analyze)});
$('#ph-d2').addEventListener('click',function(){makeDemo(true,analyze)});
}
function parseEXIF(buf){try{var dv=new DataView(buf);if(dv.getUint16(0)!==0xFFD8)return null;var off=2,len=dv.byteLength;
while(off+4&lt;len){var m=dv.getUint16(off),sz=dv.getUint16(off+2);
if(m===0xFFE1&amp;&amp;dv.getUint32(off+4)===0x45786966){var t=off+10,le=dv.getUint16(t)===0x4949;
var u16=function(o){return dv.getUint16(t+o,le)},u32=function(o){return dv.getUint32(t+o,le)};
var ifd=u32(4),n=u16(ifd),res={};
for(var i=0;i&lt;n;i++){var e=ifd+2+i*12,tag=u16(e),cnt=u32(e+4);
if(tag===0x010F||tag===0x0110||tag===0x0131||tag===0x0132){var so=cnt&gt;4?u32(e+8):(e+8),str='';for(var k=0;k&lt;cnt-1;k++)str+=String.fromCharCode(dv.getUint8(t+so+k));res[tag]=str.trim();}}
return res;}
off+=2+sz;}
return null;}catch(e){return null}}
function makeDemo(edited,cb){
var W=420,H=300,c=document.createElement('canvas');c.width=W;c.height=H;var x=c.getContext('2d');
var gr=x.createLinearGradient(0,0,W,H);gr.addColorStop(0,'#3b2f63');gr.addColorStop(1,'#1d1533');x.fillStyle=gr;x.fillRect(0,0,W,H);
for(var i=0;i&lt;2500;i++){x.fillStyle='rgba(255,255,255,'+(Math.random()*0.06)+')';x.fillRect(Math.random()*W,Math.random()*H,1,1);}
x.fillStyle='#D4AF37';x.beginPath();x.arc(110,110,46,0,7);x.fill();
if(!edited){var img=new Image();img.onload=function(){cb(img,null)};img.src=c.toDataURL('image/png');return;}
var p=document.createElement('canvas');p.width=140;p.height=100;var px=p.getContext('2d');
var pg=px.createLinearGradient(0,0,140,100);pg.addColorStop(0,'#6ee7b7');pg.addColorStop(1,'#0ea5e9');px.fillStyle=pg;px.fillRect(0,0,140,100);
for(var j=0;j&lt;700;j++){px.fillStyle='rgba(0,0,0,'+(Math.random()*0.1)+')';px.fillRect(Math.random()*140,Math.random()*100,1,1);}
var pi=new Image();pi.onload=function(){x.drawImage(pi,200,140);var img2=new Image();img2.onload=function(){cb(img2,null)};img2.src=c.toDataURL('image/png');};pi.src=p.toDataURL('image/jpeg',0.95);
}
function ela(img,cb){
var W=Math.min(480,img.naturalWidth||img.width),H=Math.max(60,Math.round((img.naturalHeight||img.height)*(W/(img.naturalWidth||img.width))));
var c1=document.createElement('canvas');c1.width=W;c1.height=H;var x1=c1.getContext('2d');x1.drawImage(img,0,0,W,H);
var im=new Image();im.onload=function(){
var c2=document.createElement('canvas');c2.width=W;c2.height=H;var x2=c2.getContext('2d');x2.drawImage(im,0,0,W,H);
var d1=x1.getImageData(0,0,W,H).data,d2=x2.getImageData(0,0,W,H).data;
var heat=document.createElement('canvas');heat.width=W;heat.height=H;var hx=heat.getContext('2d'),hd=hx.createImageData(W,H);
var diffs=[];for(var i=0;i&lt;d1.length;i+=4){var df=(Math.abs(d1[i]-d2[i])+Math.abs(d1[i+1]-d2[i+1])+Math.abs(d1[i+2]-d2[i+2]))/3;diffs.push(df);
hd.data[i]=Math.min(255,df*10);hd.data[i+1]=0;hd.data[i+2]=Math.min(255,df*4);hd.data[i+3]=255;}
hx.putImageData(hd,0,0);
var bs=8,bw=Math.floor(W/bs),bh=Math.floor(H/bs),hot=0,tot=0;
for(var by=0;by&lt;bh;by++)for(var bx=0;bx&lt;bw;bx++){var s2=0;for(var yy=0;yy&lt;bs;yy++)for(var xx=0;xx&lt;bs;xx++)s2+=diffs[(by*bs+yy)*W+(bx*bs+xx)];if(s2/(bs*bs)&gt;6)hot++;tot++;}
var mean=diffs.reduce(function(a,b){return a+b},0)/diffs.length;
cb({heat:heat,mean:mean,hotPct:tot?hot/tot*100:0});
};im.src=c1.toDataURL('image/jpeg',0.7);}
function analyze(img,ex){
var pv=$('#ph-prev');pv.width=480;pv.height=Math.max(60,Math.round((img.naturalHeight||img.height)*(480/(img.naturalWidth||img.width))));
pv.getContext('2d').drawImage(img,0,0,pv.width,pv.height);
$('#ph-res').style.display='none';coach('? Считала ELA и EXIF…');
ela(img,function(r){
$('#ph-heat').width=pv.width;$('#ph-heat').height=pv.height;
$('#ph-heat').getContext('2d').drawImage(r.heat,0,0,pv.width,pv.height);
var marks=[],score=82;
if(ex===null){score-=10;marks.push({ic:'?',t:'Нет EXIF-метаданных',d:'Метаданные удалены (мессенджер/соцсеть) или файл сгенерирован. Не вердикт, но повод спросить источник.'});}
else if(ex){if(ex[0x0131]){score-=18;marks.push({ic:'?',t:'EXIF: программа «'+ex[0x0131]+'»',d:'Файл сохранялся в редакторе — была обработка.'});}
if(ex[0x010F])marks.push({ic:'?',t:'Камера: '+ex[0x010F]+' '+(ex[0x0110]||''),d:'Есть след реальной камеры — хороший знак.'});}
if(r.hotPct&gt;4){score-=22;marks.push({ic:'?',t:'Локальные зоны с аномальной ошибкой ('+r.hotPct.toFixed(1)+'% блоков)',d:'Характерный след вставки/ретуши отдельных областей.'});}
if(r.mean&lt;0.6){score-=14;marks.push({ic:'?',t:'Подозрительно «чистый» шум',d:'Так выглядит AI-генерация или сильная обработка.'});}
if(!marks.length)marks.push({ic:'✅',t:'Следов монтажа не найдено',d:'Однородный шум сжатия, EXIF и ELA выглядят естественно.'});
score=Math.max(5,Math.min(95,score));
var box=$('#ph-res');box.style.display='block';
var html='&lt;div class="pd-score"&gt;&lt;b&gt;'+score+'&lt;/b&gt;&lt;div style="flex:1"&gt;&lt;div style="font-size:12px;color:var(--mut);margin-bottom:6px"&gt;Индекс подлинности фото (0–100)&lt;/div&gt;&lt;div class="pd-bar"&gt;&lt;i style="width:'+score+'%"&gt;&lt;/i&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;';
html+=marks.map(function(m){return '&lt;div class="pd-flag"&gt;&lt;span class="c" style="color:#f0d68a"&gt;'+m.ic+' '+m.t+'&lt;/span&gt;&lt;span&gt;'+m.d+'&lt;/span&gt;&lt;/div&gt;'}).join('');
html+='&lt;div class="pd-flag"&gt;&lt;span class="c"&gt;?&lt;/span&gt;&lt;span&gt;Слева — фото, справа — ELA-карта: яркие пятна = зоны с разной «глубиной» сжатия. Красный = подозрительно.&lt;/span&gt;&lt;/div&gt;';
box.innerHTML=html;grant(3);
var h=g('pr_photo',[]);h.unshift({t:Date.now(),s:score});s('pr_photo',h.slice(0,6));
coach(score&gt;=70?'? Выглядит подлинным. +3 PR':score&gt;=45?'? Есть вопросы к фото — смотри маркеры. +3 PR':'? Высокая вероятность монтажа/AI. +3 PR');
});}
/* ═════════ ЗВОНОК-ДЕТЕКТОР (тренажёр) ═════════ */
var csec=$('#call');
var CALLS=[
{id:'bank',ic:'?',t:'«Служба безопасности банка»',steps:[
{l:'Здравствуйте! Это служба безопасности банка. По вашему счёту зафиксирована подозрительная операция.',c:[
{t:'Кладу трубку и сам звоню в банк по номеру с карты.',good:1,w:'Единственный надёжный канал — номер на обратной стороне карты.'},
{t:'Ой, что делать? Говорите скорее!',good:0,w:'Страх + спешка = главные рычаги мошенника.'}]},
{l:'Чтобы защитить деньги, назовите код из СМС, которое сейчас придёт.',c:[
{t:'Код не назову. Банк никогда не спрашивает код.',good:1,w:'Верно: код — последняя граница. Её не сдают никому.'},
{t:'Секунду, ищу СМС…',good:0,w:'Назвать код = подписать себе приговор: деньги уйдут.'}]},
{l:'Если вы не сделаете это прямо сейчас, вы потеряете все деньги!',c:[
{t:'Давление срочностью — маркер мошенника. Завершаю разговор.',good:1,w:'Именно так: настоящая безопасность не торопит.'},
{t:'Хорошо-хорошо, тороплюсь!',good:0,w:'Спешка отключает критическое мышление — на это и расчёт.'}]}]},
{id:'mom',ic:'?',t:'«Родственник в беде»',steps:[
{l:'Это мама! Я попала в аварию, срочно нужны деньги, только никому не говори!',c:[
{t:'Перезвоню маме на её известный номер и проверю.',good:1,w:'Всегда проверяй обратным звонком на известный номер.'},
{t:'Боже! Сколько нужно? Говори!',good:0,w:'Секретность + паника — классика схемы «родственник в беде».'}]},
{l:'Переведи вот на этот номер карты, быстро, пока не поздно!',c:[
{t:'Не перевожу деньги без личной проверки. До встречи дома.',good:1,w:'Деньги — только после личного подтверждения.'},
{t:'Понял, перевожу…',good:0,w:'Перевод на чужую карту — деньги в никуда.'}]},
{l:'Ты что, мне не веришь? Я же твоя мать!',c:[
{t:'Эмоциональное давление — маркер. Кладу трубку.',good:1,w:'Манипуляция чувствами — признак сценария, а не беды.'},
{t:'Верю-верю, уже отправляю!',good:0,w:'На этом шаге схема завершается успешно… для мошенника.'}]}]},
{id:'prize',ic:'?',t:'«Выигрыш приза»',steps:[
{l:'Поздравляем! Вы выиграли автомобиль! Для получения оплатите комиссию 300 рублей.',c:[
{t:'Призы не требуют предоплаты. Это мошенники.',good:1,w:'Предоплата «за получение выигрыша» — 100% скам.'},
{t:'Всего 300 рублей? Ладно, плачу.',good:0,w:'300 рублей — приманка: дальше попросят «страховку», «налог»…'}]},
{l:'Также назовите номер карты, куда перевести выигрыш.',c:[
{t:'Номер карты незнакомцам не даю.',good:1,w:'Номер карты — ключ к вашим деньгам.'},
{t:'Вот номер…',good:0,w:'С номером карты начнут списывать «комиссии».'}]},
{l:'И код из СМС для подтверждения операции.',c:[
{t:'Код из СМС не сообщают. Конец разговора.',good:1,w:'Финальный рубеж сохранён. Отлично!'},
{t:'Диктую код…',good:0,w:'Код из СМС никому и никогда.'}]}]}];
var curCall=null,ci=0,cscore=0;
if(csec){
csec.innerHTML='&lt;div class="sec-ic"&gt;?&lt;/div&gt;&lt;h2&gt;Звонок-детектор&lt;/h2&gt;&lt;div class="sub"&gt;Анти-мошеннический тренажёр: продержись и не попадись на скрипт&lt;/div&gt;'+
'&lt;div class="pd-lens" id="cl-chips"&gt;'+CALLS.map(function(c,i){return '&lt;button class="lens'+(i===0?' on':'')+'" data-i="'+i+'"&gt;'+c.ic+' '+c.t+'&lt;/button&gt;'}).join('')+'&lt;/div&gt;'+
'&lt;button class="btn" id="cl-start"&gt;? Начать звонок&lt;/button&gt;&lt;div id="cl-box" style="margin-top:10px"&gt;&lt;/div&gt;'+
'&lt;div class="pd-flag" style="margin-top:12px"&gt;&lt;span class="c"&gt;?&lt;/span&gt;&lt;span&gt;Красные флаги звонка: срочность, секретность, запрос кодов/денег, давление на эмоции, «не кладите трубку».&lt;/span&gt;&lt;/div&gt;';
csec.querySelectorAll('#cl-chips .lens').forEach(function(b){b.addEventListener('click',function(){csec.querySelectorAll('#cl-chips .lens').forEach(function(x){x.classList.remove('on')});b.classList.add('on');curCall=CALLS[+b.getAttribute('data-i')];});});
curCall=CALLS[0];
$('#cl-start').addEventListener('click',function(){ci=0;cscore=50;$('#cl-box').innerHTML='';step();});
}
function say(t){try{var u=new SpeechSynthesisUtterance(t);u.lang='ru-RU';speechSynthesis.speak(u);}catch(e){}}
function step(){
if(!curCall)return;
if(ci&gt;=curCall.steps.length){finish();return}
var st=curCall.steps[ci],box=$('#cl-box');
var b=document.createElement('div');b.className='cl-bub cl-scam';b.innerHTML='? '+st.l+' &lt;button class="btn ghost" style="padding:4px 10px;font-size:11px" onclick="void 0"&gt;?&lt;/button&gt;';
b.querySelector('button').addEventListener('click',function(){say(st.l)});
box.appendChild(b);
st.c.forEach(function(ch,k){
var btn=document.createElement('button');btn.className='cl-say';btn.textContent=ch.t;
btn.addEventListener('click',function(){
btn.parentNode&amp;&amp;Array.prototype.slice.call(box.querySelectorAll('.cl-say')).forEach(function(x){x.remove()});
var me=document.createElement('div');me.className='cl-bub cl-me';me.textContent=ch.t;box.appendChild(me);
var nt=document.createElement('div');nt.className='cl-note';nt.textContent=(ch.good?'✅ ':'⚠️ ')+ch.w;box.appendChild(nt);
cscore+=ch.good?17:-17;ci++;setTimeout(step,600);
});
box.appendChild(btn);});
box.scrollTop=box.scrollHeight;
}
function finish(){
var v=cscore&gt;=70?'Не попался на скрипт!':cscore&gt;=40?'Частично повёлся — смотри разбор.':'Схема сработала — хорошо, что в игре.';
var pr=cscore&gt;=70?5:cscore&gt;=40?3:2;
var box=$('#cl-box');
var d=document.createElement('div');d.className='pd-score';d.innerHTML='&lt;b&gt;'+Math.max(0,Math.min(100,cscore))+'&lt;/b&gt;&lt;div style="flex:1"&gt;&lt;div style="font-size:12px;color:var(--mut)"&gt;'+v+' Устойчивость к скриптам. +'+pr+' PR&lt;/div&gt;&lt;div class="pd-bar"&gt;&lt;i style="width:'+Math.max(0,Math.min(100,cscore))+'%"&gt;&lt;/i&gt;&lt;/div&gt;&lt;/div&gt;';
box.appendChild(d);grant(pr);
var h=g('pr_call',[]);h.unshift({t:Date.now(),s:cscore});s('pr_call',h.slice(0,6));
coach('? '+v+' +'+pr+' PR');
}
console.log('?️ Правдомер: Блок 6 · Фото + Звонок подключены');
})();
&lt;/script&gt;

&lt;script&gt;
(function(){"use strict";
if(window._prSimDone)return;window._prSimDone=1;
var $=function(s){return document.querySelector(s)};
function g(k,d){try{var v=localStorage.getItem(k);return v==null?d:JSON.parse(v)}catch(e){return d}}
function s(k,v){try{localStorage.setItem(k,JSON.stringify(v))}catch(e){}}
function coach(t){var c=$('#coach');if(!c)return;$('#coachText').textContent=t;c.style.display='block';clearTimeout(window._prCt);window._prCt=setTimeout(function(){c.style.display='none'},6500);}
function grant(n){var P=g('pr_profile',{pr:0,streak:0,last:'',lvl:1});P.pr+=n;P.lvl=1+Math.floor(P.pr/100);s('pr_profile',P);var e=$('#hPr');if(e)e.textContent='? '+P.pr+' PR';
var st=g('pr_streak',{d:0,last:''}),t=new Date().toDateString();if(st.last!==t){var y=new Date(Date.now()-864e5).toDateString();st.d=(st.last===y)?st.d+1:1;st.last=t;s('pr_streak',st);var e2=$('#hStreak');if(e2)e2.textContent='? '+st.d;}}
var ARCHS=[
{id:'aggr',ic:'?',t:'Агрессор',d:'Давит злостью и угрозами',steps:[
{l:'Ты вообще нормальный?! Я же сто раз сказал! Бросай всё и переделывай немедленно!',c:[
{t:'Слышу, что ты злишься. Обсудим, когда оба остынем.',k:'ok',w:'Граница + пауза: не впитывать чужую злость и не убегать.'},
{t:'Да-да, прости, я всё переделаю прямо сейчас…',k:'bad',w:'Уступка под крик учит агрессора давить сильнее.'},
{t:'Сам такой! Иди и делай сам!',k:'aggr',w:'Ответная агрессия эскалирует: ты в их игре.'}]},
{l:'Ты вечно оправдываешься! Ты просто ничтожество!',c:[
{t:'Оскорбления — не аргумент. Я завершаю диалог.',k:'ok',w:'Ярлыки — манипуляция. Выход из неё — сила, а не слабость.'},
{t:'Наверное, ты прав… я ничтожество…',k:'bad',w:'Принять чужую оценку — отдать себя.'},
{t:'А ты ещё хуже!',k:'aggr',w:'Обмен оскорблениями — болото, а не решение.'}]},
{l:'Ещё раз так сделаешь — пожалеешь!',c:[
{t:'Это угроза? Фиксирую и беру паузу в разговоре.',k:'ok',w:'Названная вслух угроза теряет власть над тобой.'},
{t:'Хорошо-хорошо, только не злись!',k:'bad',w:'Страх как рычаг: уступка сегодня = новые угрозы завтра.'},
{t:'Ты меня ещё пугать будешь?',k:'aggr',w:'Вызов — провокация: агрессор получит драку.'}]}]},
{id:'gas',ic:'?',t:'Газлайтер',d:'Заставляет сомневаться в памяти',steps:[
{l:'Я такого не говорил. Ты всё выдумываешь, у тебя правда плохая память.',c:[
{t:'Я помню иначе. Давай сверимся с перепиской или записью.',k:'ok',w:'Факты против сомнений: газлайтер отступает перед доказательствами.'},
{t:'Может, я и правда это выдумал…',k:'bad',w:'Именно этого и ждёт газлайтинг: твоего сомнения в себе.'},
{t:'Ты лжец! Ты всегда врешь!',k:'aggr',w:'Обвинение без доказательств подкрепляет их нарратив «ты нестабилен».'}]},
{l:'Ты слишком чувствительный. Нормальные люди реагируют спокойно.',c:[
{t:'Мои чувства нормальны. «Нормальность» обсуждать не буду.',k:'ok',w:'Право на свои чувства — фундамент устойчивости.'},
{t:'Наверное, я и правда слишком чувствительный…',k:'bad',w:'Принять ярлык «ненормальный» — сдать позиции.'},
{t:'Это ты бесчувственный!',k:'aggr',w:'Контр-ярлык — болото. Лучше выйти из обсуждения.'}]},
{l:'Это была шутка! Просто у тебя нет чувства юмора, все подтвердят.',c:[
{t:'«Все» — не аргумент. Мне было неприятно — это факт.',k:'ok',w:'Твой опыт — критерий, а не «мнение толпы».'},
{t:'Да, наверное, у меня нет юмора…',k:'bad',w:'Снова сомнение, посеянное извне.'},
{t:'У самого юмор дурацкий!',k:'aggr',w:'Атака — ловушка: тебя выставят агрессором.'}]}]},
{id:'vic',ic:'?',t:'Жертва (вина)',d:'Манипулирует виной и жалостью',steps:[
{l:'После всего, что я для тебя сделал… Ты даже такой мелочи для меня не хочешь?',c:[
{t:'Я ценю твоё «всё». Но долг — не причина соглашаться сейчас.',k:'ok',w:'Благодарность и долг — разные вещи; манипулятор их смешивает.'},
{t:'Ну хорошо, сделаю, только не обижайся…',k:'bad',w:'Вина — самый липкий рычаг: один раз уступил — будет повторяться.'},
{t:'Ты опять считаешь свои одолжения!',k:'aggr',w:'Атака делает «жертву» пострадавшей, а тебя — злодеем.'}]},
{l:'Если ты уйдёшь, со мной случится что-то ужасное. Мне так плохо…',c:[
{t:'Мне жаль. Я позвоню близким/специалисту. Из вины не останусь.',k:'ok',w:'Реальная помощь — передать ответственным, а не жертвовать собой.'},
{t:'Ладно, останусь, я не могу иначе…',k:'bad',w:'На тебя переложили ответственность за чужое состояние.'},
{t:'Ты опять мной манипулируешь!',k:'aggr',w:'Обвинение эскалирует «драму» и закрепляет роли.'}]},
{l:'Все меня бросили. Ты моя последняя надежда.',c:[
{t:'Ты не один: есть круг поддержки. Помогу его найти.',k:'ok',w:'Возвращаешь ответственность человеку, не забирая её себе.'},
{t:'Я никогда тебя не брошу, сделаю всё!',k:'bad',w:'Роль «последней надежды» — ловушка тотальной ответственности.'},
{t:'Я тебе не спасатель!',k:'aggr',w:'Отказ без альтернативы выглядит жестокостью — это используют.'}]}]},
{id:'sim',ic:'?',t:'Симулянт',d:'Преувеличивает симптомы ради выгоды',steps:[
{l:'У меня температура сорок, я умираю! Но если привезёшь денег на лекарство — я потерплю.',c:[
{t:'При сорок вызывают скорую, я звоню. Деньги для этого не нужны.',k:'ok',w:'Симулянт боится реальных врачей: схема рассыпается.'},
{t:'Ой, переведу, только выздоравливай!',k:'bad',w:'Связка «симптомы + деньги» — классическая схема.'},
{t:'Ты врешь! Ты не болен!',k:'aggr',w:'Обвинение без проверки: вдруг человек правда болен.'}]},
{l:'Врач выписал дорогое лекарство, и только из одной аптеки, срочно!',c:[
{t:'Пришли рецепт, я сам позвоню врачу и в аптеку.',k:'ok',w:'Проверка документов и каналов — лучшее противоядие.'},
{t:'Хорошо, диктуй, сколько перевести.',k:'bad',w:'Срочность + «только здесь» = давление, чтобы ты не проверял.'},
{t:'Врачи все в сговоре!',k:'aggr',w:'Конспирология вместо проверки — тупик.'}]},
{l:'Тебе совсем меня не жалко! Ты бессердечный!',c:[
{t:'Жалко. Поэтому предлагаю реальную помощь, а не деньги по запросу.',k:'ok',w:'Формула «жалость + проверка» неуязвима.'},
{t:'Жалко-жалко! Уже перевожу!',k:'bad',w:'Вина снова сделала своё дело.'},
{t:'Достало твоё нытьё!',k:'aggr',w:'Раздражение — сигнал, что манипуляция работает.'}]}]},
{id:'narc',ic:'?',t:'Нарцисс',d:'Обесценивает и требует восхищения',steps:[
{l:'Твой результат средний. Без меня тебя бы вообще никто не заметил.',c:[
{t:'Мой результат — моя заслуга. Твоё мнение интересно, но не решающее.',k:'ok',w:'Спокойное признание своей ценности — яд для нарцисса.'},
{t:'Да, без тебя я никто…',k:'bad',w:'Именно это и пытаются внушить.'},
{t:'Без тебя было бы в сто раз лучше!',k:'aggr',w:'Драка с нарциссом — топливо для него.'}]},
{l:'Я здесь самый умный. Просто согласись и не спорь.',c:[
{t:'Слышу. У меня другое мнение — скажу спокойно.',k:'ok',w:'Ни подчинение, ни драка: ровная позиция.'},
{t:'Да, конечно, ты самый умный…',k:'bad',w:'Кормление грандиозности лишает тебя голоса.'},
{t:'Самый умный? Ты просто высокомерен!',k:'aggr',w:'Оскорбление — потеря позиции.'}]},
{l:'Ты должен быть благодарен, что я вообще с тобой разговариваю.',c:[
{t:'Общение равно. Благодарности за «честь» не будет.',k:'ok',w:'Навязанная иерархия — не факт, а мнение.'},
{t:'Спасибо за честь…',k:'bad',w:'Роль «избранного» — крючок.'},
{t:'Невелика честь!',k:'aggr',w:'Обесценивание в ответ — их стиль, не твой.'}]}]}];
var sec=$('#sim');if(!sec)return;
sec.innerHTML='&lt;div class="sec-ic"&gt;?&lt;/div&gt;&lt;h2&gt;Псих-симулятор&lt;/h2&gt;&lt;div class="sub"&gt;Дуэль с манипулятором: держи границы и не попадись на рычаги. +15 за здоровый ответ, −15 за уступку, −10 за агрессию&lt;/div&gt;'+
'&lt;div class="pd-lens" id="sim-chips"&gt;'+ARCHS.map(function(a,i){return '&lt;button class="lens'+(i===0?' on':'')+'" data-i="'+i+'"&gt;'+a.ic+' '+a.t+'&lt;/button&gt;'}).join('')+'&lt;/div&gt;'+
'&lt;button class="btn" id="sim-start"&gt;? Начать дуэль&lt;/button&gt;&lt;div id="sim-box" style="margin-top:10px"&gt;&lt;/div&gt;'+
'&lt;div class="pd-flag" style="margin-top:12px"&gt;&lt;span class="c"&gt;?&lt;/span&gt;&lt;span&gt;Пять рычагов манипуляции: злость, сомнение в памяти, вина, жалость, обесценивание. Противоядие одно: факты + границы + пауза.&lt;/span&gt;&lt;/div&gt;';
var cur=ARCHS[0],idx=0,score=50;
sec.querySelectorAll('#sim-chips .lens').forEach(function(b){b.addEventListener('click',function(){sec.querySelectorAll('#sim-chips .lens').forEach(function(x){x.classList.remove('on')});b.classList.add('on');cur=ARCHS[+b.getAttribute('data-i')];});});
$('#sim-start').addEventListener('click',function(){idx=0;score=50;$('#sim-box').innerHTML='';coach('? Дуэль с «'+cur.t+'». Помни: факты, границы, пауза.');step();});
function step(){
var box=$('#sim-box');
if(idx&gt;=cur.steps.length){finish();return}
var st=cur.steps[idx];
var b=document.createElement('div');b.className='cl-bub cl-scam';b.textContent=cur.ic+' '+st.l;box.appendChild(b);
st.c.forEach(function(ch){
var btn=document.createElement('button');btn.className='cl-say';btn.textContent=ch.t;
btn.addEventListener('click',function(){
Array.prototype.slice.call(box.querySelectorAll('.cl-say')).forEach(function(x){x.remove()});
var me=document.createElement('div');me.className='cl-bub cl-me';me.textContent=ch.t;box.appendChild(me);
var nt=document.createElement('div');nt.className='cl-note';nt.textContent=(ch.k==='ok'?'✅ ':ch.k==='bad'?'⚠️ ':'? ')+ch.w;box.appendChild(nt);
score+=ch.k==='ok'?15:ch.k==='bad'?-15:-10;idx++;setTimeout(step,600);
});
box.appendChild(btn);});
box.scrollTop=box.scrollHeight;
}
function finish(){
var sc=Math.max(5,Math.min(95,score));
var v=sc&gt;=75?'Стальные границы! Манипулятор не прошёл.':sc&gt;=50?'Уверенно, но есть щели — смотри разбор.':'Манипулятор дотянулся до рычагов — разбираем, где.';
var pr=sc&gt;=75?6:sc&gt;=50?4:2;
var box=$('#sim-box');
var d=document.createElement('div');d.className='pd-score';d.innerHTML='&lt;b&gt;'+sc+'&lt;/b&gt;&lt;div style="flex:1"&gt;&lt;div style="font-size:12px;color:var(--mut)"&gt;'+v+' Устойчивость к манипуляциям. +'+pr+' PR&lt;/div&gt;&lt;div class="pd-bar"&gt;&lt;i style="width:'+sc+'%"&gt;&lt;/i&gt;&lt;/div&gt;&lt;/div&gt;';
box.appendChild(d);
grant(pr);
var h=g('pr_sim',[]);h.unshift({t:Date.now(),a:cur.id,s:sc});s('pr_sim',h.slice(0,8));
var st2=g('pr_simstat',{plays:0,best:0});st2.plays++;st2.best=Math.max(st2.best,sc);s('pr_simstat',st2);
coach('? '+v+' +'+pr+' PR');
}
console.log('?️ Правдомер: Блок 7 · Псих-симулятор подключён');
})();
&lt;/script&gt;

&lt;script&gt;
(function(){"use strict";
if(window._prSocialDone)return;window._prSocialDone=1;
var $=function(s){return document.querySelector(s)};
function g(k,d){try{var v=localStorage.getItem(k);return v==null?d:JSON.parse(v)}catch(e){return d}}
function s(k,v){try{localStorage.setItem(k,JSON.stringify(v))}catch(e){}}
function coach(t){var c=$('#coach');if(!c)return;$('#coachText').textContent=t;c.style.display='block';clearTimeout(window._prCt);window._prCt=setTimeout(function(){c.style.display='none'},6500);}
function grant(n){var P=g('pr_profile',{pr:0,streak:0,last:'',lvl:1});P.pr+=n;P.lvl=1+Math.floor(P.pr/100);s('pr_profile',P);var e=$('#hPr');if(e)e.textContent='? '+P.pr+' PR';
var st=g('pr_streak',{d:0,last:''}),t=new Date().toDateString();if(st.last!==t){var y=new Date(Date.now()-864e5).toDateString();st.d=(st.last===y)?st.d+1:1;st.last=t;s('pr_streak',st);var e2=$('#hStreak');if(e2)e2.textContent='? '+st.d;}}
var main=document.querySelector('main'),fg=document.querySelector('.foot-grid');
var sec=document.createElement('section');sec.id='social';
sec.innerHTML='&lt;div class="sec-ic"&gt;?&lt;/div&gt;&lt;h2&gt;Соц-детектор&lt;/h2&gt;&lt;div class="sub"&gt;Вставь посты/комментарии + метаданные аккаунта → вердикт «человек / бот / фейк» и психометрика&lt;/div&gt;'+
'&lt;textarea id="so-in" placeholder="Вставь 1–3 поста или комментария…"&gt;&lt;/textarea&gt;'+
'&lt;div class="pd-row"&gt;&lt;input type="number" id="so-age" placeholder="Возраст аккаунта, мес" min="0" style="width:160px"&gt;&lt;input type="number" id="so-ppd" placeholder="Постов в день" min="0" style="width:140px"&gt;&lt;/div&gt;'+
'&lt;div class="pd-row"&gt;&lt;button class="btn ghost" id="so-d1"&gt;? Демо: бот&lt;/button&gt;&lt;button class="btn ghost" id="so-d2"&gt;? Демо: человек&lt;/button&gt;&lt;button class="btn ghost" id="so-d3"&gt;? Демо: фейк&lt;/button&gt;&lt;button class="btn" id="so-go"&gt;? Проверить профиль&lt;/button&gt;&lt;/div&gt;'+
'&lt;canvas id="so-radar" width="300" height="250" style="display:block;margin:10px auto;max-width:100%"&gt;&lt;/canvas&gt;'+
'&lt;div id="so-res" style="display:none"&gt;&lt;/div&gt;';
if(fg)main.insertBefore(sec,fg);else main.appendChild(sec);
var nav=$('#chips');if(nav){var chip=document.createElement('button');chip.textContent='? Соц';chip.addEventListener('click',function(){nav.querySelectorAll('button').forEach(function(x){x.classList.remove('on')});chip.classList.add('on');sec.scrollIntoView({behavior:'smooth'});});nav.appendChild(chip);}
var D1='Отличный пост! Полностью согласен! Класс! Супер! Подпишись на меня, взаимно! Отличный пост! Согласен со всеми! ??????';
var D2='Гуляли сегодня с друзьями по осеннему парку. Устала, но счастлива. Планирую вернуться туда на следующей неделе — хочу показать это место детям.';
var D3='СРОЧНО! ШОК! Они скрывают правду! Все молчат! Репостни и расскажи всем! Такого вы больше нигде не увидите! Никто не переживёт эту зиму!';
$('#so-d1').onclick=function(){$('#so-in').value=D1;$('#so-age').value=1;$('#so-ppd').value=22};
$('#so-d2').onclick=function(){$('#so-in').value=D2;$('#so-age').value=48;$('#so-ppd').value=2};
$('#so-d3').onclick=function(){$('#so-in').value=D3;$('#so-age').value=3;$('#so-ppd').value=9};
var PS={E:['друг','вместе','встреч','компани','обща','праздник','деть'],O:['нов','идея','мечта','экспери','интерес','путеш','место'],C:['план','цель','сдела','органи','порядок','работ','недел'],A:['спасибо','помо','поддерж','соглас','добр','люб','рад'],N:['боюсь','тревог','устал','не могу','страшно','нерв','паник']};
function hits(t,arr){var c=0;arr.forEach(function(w){if(t.indexOf(w)&gt;=0)c++});return c}
function count(t,arr){var c=0;arr.forEach(function(w){var i=t.indexOf(w);while(i&gt;=0){c++;i=t.indexOf(w,i+1)}});return c}
function radar(vals){
var cv=$('#so-radar'),cx=cv.getContext('2d'),W=cv.width,H=cv.height,cx0=W/2,cy0=H/2+6,R=92;
cx.clearRect(0,0,W,H);
var L=['Экстраверсия','Открытость','Организованность','Доброжелательность','Стабильность'];
for(var ring=1;ring&lt;=3;ring++){cx.beginPath();for(var i=0;i&lt;5;i++){var a=-Math.PI/2+i*2*Math.PI/5;var r=R*ring/3;var x=cx0+Math.cos(a)*r,y=cy0+Math.sin(a)*r;i===0?cx.moveTo(x,y):cx.lineTo(x,y)}cx.closePath();cx.strokeStyle='rgba(139,92,246,.25)';cx.stroke();}
cx.beginPath();
for(var j=0;j&lt;5;j++){var a2=-Math.PI/2+j*2*Math.PI/5;var r2=R*Math.max(4,vals[j])/100;var x2=cx0+Math.cos(a2)*r2,y2=cy0+Math.sin(a2)*r2;j===0?cx.moveTo(x2,y2):cx.lineTo(x2,y2);}
cx.closePath();cx.fillStyle='rgba(212,175,55,.25)';cx.fill();cx.strokeStyle='#D4AF37';cx.stroke();
cx.fillStyle='#cfc8e8';cx.font='10px Inter, sans-serif';cx.textAlign='center';
for(var k=0;k&lt;5;k++){var a3=-Math.PI/2+k*2*Math.PI/5;cx.fillText(L[k],cx0+Math.cos(a3)*(R+22),cy0+Math.sin(a3)*(R+16));}
}
function analyze(){
var t=($('#so-in').value||'').toLowerCase();
if(t.length&lt;40){coach('Вставь хотя бы один пост (от 40 символов) ?');return}
var age=+($('#so-age').value||0),ppd=+($('#so-ppd').value||0);
var marks=[],bot=8,fake=8;
var TPL=['отличный пост','полностью согласен','класс!','супер!','подпишись','взаимно','согласен со всеми'];
var tp=count(t,TPL);if(tp&gt;=2){bot+=25;marks.push({ic:'?',t:'Шаблонные фразы ('+tp+')',d:'Боты собирают ленту из клише: «отличный пост», «взаимно».'})}else if(tp===1){bot+=10}
var EM=['?','?','','?','✅'],emx=0;EM.forEach(function(e){var c=(t.match(new RegExp(e,'g'))||[]).length;if(c&gt;emx)emx=c});
if(emx&gt;=6){bot+=15;marks.push({ic:'?',t:'Один эмодзи ×'+emx,d:'Массовая штамповка эмодзи — признак автопостинга.'})}
if(ppd&gt;15){bot+=30;marks.push({ic:'⚙️',t:ppd+' постов в день',d:'Человек физически не пишет так много — это скрипт.'})}else if(ppd&gt;8){bot+=15}
if(age&lt;2&amp;&amp;ppd&gt;5){bot+=20;marks.push({ic:'?',t:'Аккаунту '+age+' мес при высокой активности',d:'Молодой аккаунт + поток постов = классический бот.'})}
if(/скидк|купи|промо|перейди по ссылк/.test(t)){bot+=15;marks.push({ic:'?',t:'Промо-вставки',d:'Спам-боты гонят трафик: «купи», «скидка», ссылки.'})}
var SENS=['шок','срочно','скрывают','все молчат','такого вы не','никто не переживёт'];
var sn=count(t,SENS);if(sn&gt;=2){fake+=30;marks.push({ic:'?',t:'Сенсационализм ('+sn+')',d:'«Шок», «скрывают» — кликбейт-маркеры фейка.'})}else if(sn===1){fake+=12}
if(/репостни|перешли|расскажи всем/.test(t)){fake+=25;marks.push({ic:'?',t:'Призыв к репосту',d:'Фейки живут виральностью: «расскажи всем».'})}
if(/\bвсе\b|\bникто\b/.test(t)){fake+=12;marks.push({ic:'?',t:'Абсолютизмы «все/никто»',d:'Обобщения без источников — топливо паники.'})}
var caps=($('#so-in').value.match(/[А-ЯЁ]{4,}/g)||[]).length;if(caps&gt;=2){fake+=10;marks.push({ic:'?',t:'КАПС ('+caps+')',d:'Крик вместо аргументов.'})}
bot=Math.max(3,Math.min(96,bot));fake=Math.max(3,Math.min(96,fake));
var E=hits(t,PS.E),O=hits(t,PS.O),C=hits(t,PS.C),A=hits(t,PS.A),N=hits(t,PS.N);
var vals=[Math.min(95,45+E*12),Math.min(95,45+O*12),Math.min(95,45+C*12),Math.min(95,45+A*12),Math.max(5,90-N*15)];
radar(vals);
var verdict=bot&gt;=55&amp;&amp;bot&gt;=fake?'? Похоже на бота':fake&gt;=55?'? Похоже на фейк/манипуляцию':'? Похоже на человека';
var box=$('#so-res');box.style.display='block';
var html='&lt;div class="pd-score"&gt;&lt;b&gt;'+bot+'&lt;/b&gt;&lt;div style="flex:1"&gt;&lt;div style="font-size:12px;color:var(--mut);margin-bottom:6px"&gt;Бот-индекс&lt;/div&gt;&lt;div class="pd-bar"&gt;&lt;i style="width:'+bot+'%"&gt;&lt;/i&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;';
html+='&lt;div class="pd-score"&gt;&lt;b&gt;'+fake+'&lt;/b&gt;&lt;div style="flex:1"&gt;&lt;div style="font-size:12px;color:var(--mut);margin-bottom:6px"&gt;Фейк-индекс&lt;/div&gt;&lt;div class="pd-bar"&gt;&lt;i style="width:'+fake+'%"&gt;&lt;/i&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;';
html+='&lt;div class="pd-flag"&gt;&lt;span class="c" style="color:#f0d68a"&gt;⚖️ Вердикт&lt;/span&gt;&lt;span&gt;&lt;b&gt;'+verdict+'&lt;/b&gt;. Это вероятность, а не приговор: смотри маркеры ниже.&lt;/span&gt;&lt;/div&gt;';
html+=marks.length?marks.map(function(m){return '&lt;div class="pd-flag"&gt;&lt;span class="c" style="color:#f0d68a"&gt;'+m.ic+' '+m.t+'&lt;/span&gt;&lt;span&gt;'+m.d+'&lt;/span&gt;&lt;/div&gt;'}).join(''):'&lt;div class="pd-flag"&gt;&lt;span class="c"&gt;✅&lt;/span&gt;&lt;span&gt;Бот- и фейк-маркеров не нашёл: живой тон, личные детали.&lt;/span&gt;&lt;/div&gt;';
html+='&lt;div class="pd-flag"&gt;&lt;span class="c"&gt;?&lt;/span&gt;&lt;span&gt;Психометрика (оценка по тексту, не диагноз): Э='+vals[0]+' · О='+vals[1]+' · Орг='+vals[2]+' · Д='+vals[3]+' · Стаб='+vals[4]+'.&lt;/span&gt;&lt;/div&gt;';
box.innerHTML=html;grant(3);
var h=g('pr_social',[]);h.unshift({t:Date.now(),b:bot,f:fake});s('pr_social',h.slice(0,6));
coach('? '+verdict+'. +3 PR');
}
$('#so-go').addEventListener('click',analyze);
console.log('?️ Правдомер: Блок 8 · Соц-детектор подключён');
})();
&lt;/script&gt;

&lt;style&gt;
#video .vd-strip{display:flex;gap:4px;overflow-x:auto;margin:10px 0}
#video .vd-strip img{height:54px;border-radius:6px;border:1px solid var(--line)}
.vip-card{border:1px solid rgba(212,175,55,.5);border-radius:16px;padding:16px;background:linear-gradient(135deg,rgba(212,175,55,.12),rgba(139,92,246,.08))}
.vip-card .st{font-size:14px;font-weight:800;color:#f0d68a}
&lt;/style&gt;
&lt;script&gt;
(function(){"use strict";
if(window._prVideoVip)return;window._prVideoVip=1;
var $=function(s){return document.querySelector(s)};
function g(k,d){try{var v=localStorage.getItem(k);return v==null?d:JSON.parse(v)}catch(e){return d}}
function s(k,v){try{localStorage.setItem(k,JSON.stringify(v))}catch(e){}}
function coach(t){var c=$('#coach');if(!c)return;$('#coachText').textContent=t;c.style.display='block';clearTimeout(window._prCt);window._prCt=setTimeout(function(){c.style.display='none'},6500);}
function pr(){return g('pr_profile',{pr:0}).pr}
function setPR(n){var P=g('pr_profile',{pr:0,streak:0,last:'',lvl:1});P.pr=Math.max(0,n);P.lvl=1+Math.floor(P.pr/100);s('pr_profile',P);updBadge();}
function grant(n){setPR(pr()+n);var st=g('pr_streak',{d:0,last:''}),t=new Date().toDateString();if(st.last!==t){var y=new Date(Date.now()-864e5).toDateString();st.d=(st.last===y)?st.d+1:1;st.last=t;s('pr_streak',st);var e=$('#hStreak');if(e)e.textContent='? '+st.d;}}
function vipOn(){var v=g('pr_vip',null);return !!(v&amp;&amp;v.until&gt;Date.now())}
function updBadge(){var e=$('#hPr');if(e)e.textContent=(vipOn()?'? ':'')+'? '+pr()+' PR';}
/* ═════ ВИП ═════ */
var main=document.querySelector('main'),fg=document.querySelector('.foot-grid');
var vsec=document.createElement('section');vsec.id='vip';
vsec.innerHTML='&lt;div class="sec-ic"&gt;?&lt;/div&gt;&lt;h2&gt;ВИП-статус&lt;/h2&gt;&lt;div class="sub"&gt;Игровой статус за PR — без денег: престиж, ежедневный бонус и золотой бейдж&lt;/div&gt;&lt;div class="vip-card" id="vip-card"&gt;&lt;/div&gt;';
if(fg)main.insertBefore(vsec,fg);else main.appendChild(vsec);
var nav=$('#chips');if(nav){var chip=document.createElement('button');chip.textContent='? ВИП';chip.addEventListener('click',function(){nav.querySelectorAll('button').forEach(function(x){x.classList.remove('on')});chip.classList.add('on');vsec.scrollIntoView({behavior:'smooth'});});nav.appendChild(chip);}
function renderVip(){
var c=$('#vip-card'),v=g('pr_vip',null),on=vipOn();
if(on){var dl=Math.ceil((v.until-Date.now())/864e5);var taken=g('pr_vipbonus','')===new Date().toDateString();
c.innerHTML='&lt;div class="st"&gt;? ВИП активен&lt;/div&gt;&lt;div style="font-size:12px;color:var(--mut);margin:6px 0"&gt;Осталось: '+dl+' дн. · Бонус +5 PR каждый день&lt;/div&gt;&lt;button class="btn gold" id="vip-b" '+(taken?'disabled':'')+'&gt;'+(taken?'Бонус получен сегодня':'? Забрать +5 PR')+'&lt;/button&gt;';
if(!taken)$('#vip-b').onclick=function(){s('pr_vipbonus',new Date().toDateString());grant(5);coach('? ВИП-бонус: +5 PR');renderVip();};
}else{c.innerHTML='&lt;div class="st"&gt;ВИП не активен&lt;/div&gt;&lt;div style="font-size:12px;color:var(--mut);margin:6px 0"&gt;Цена: 120 PR на 30 дней. Зарабатывай PR разборами — трать на статус.&lt;/div&gt;&lt;button class="btn" id="vip-a" '+(pr()&lt;120?'disabled':'')+'&gt;? Активировать за 120 PR&lt;/button&gt;';
var b=$('#vip-a');if(b)b.onclick=function(){if(pr()&lt;120)return;setPR(pr()-120);s('pr_vip',{until:Date.now()+30*864e5});coach('? ВИП активирован на 30 дней!');renderVip();};}
}
renderVip();updBadge();
/* ═════ ВИДЕО-ДЕТЕКТОР ═════ */
var sec=$('#video');if(!sec)return;
sec.innerHTML='&lt;div class="sec-ic"&gt;?&lt;/div&gt;&lt;h2&gt;Видео-детектор&lt;/h2&gt;&lt;div class="sub"&gt;Кадры + аудиодорожка: ажитация, застывание, ритм и рассинхрон «голос/тело». Всё локально&lt;/div&gt;'+
'&lt;div class="vd-row"&gt;&lt;label class="pd-file"&gt;? Видеофайл&lt;input type="file" id="vd2-file" accept="video/*"&gt;&lt;/label&gt;&lt;button class="btn ghost" id="vd2-cam"&gt;? Камера (10 с)&lt;/button&gt;&lt;button class="btn ghost" id="vd2-demo"&gt;? Демо-разбор&lt;/button&gt;&lt;/div&gt;'+
'&lt;div class="vd-strip" id="vd2-strip"&gt;&lt;/div&gt;&lt;div id="vd2-res" style="display:none"&gt;&lt;/div&gt;';
$('#vd2-file').addEventListener('change',function(e){var f=e.target.files[0];if(f)analyzeVideo(f)});
$('#vd2-cam').addEventListener('click',function(){
if(!navigator.mediaDevices||!navigator.mediaDevices.getUserMedia){coach('Камера недоступна — жми «Демо-разбор» ?');return}
navigator.mediaDevices.getUserMedia({video:true,audio:true}).then(function(st){
coach('? Пишу 10 секунд… говори естественно');
var rec=new MediaRecorder(st),ch=[];rec.ondataavailable=function(ev){ch.push(ev.data)};
rec.onstop=function(){st.getTracks().forEach(function(t){t.stop()});analyzeVideo(new Blob(ch,{type:rec.mimeType}))};
rec.start();setTimeout(function(){if(rec.state!=='inactive')rec.stop()},10000);
}).catch(function(){coach('Нет доступа к камере — жми «Демо-разбор» ?')});});
$('#vd2-demo').addEventListener('click',function(){renderVideo({agit:62,irr:1.1,stiff:false},{score:48,marks:[{ic:'?',t:'Дрожь голоса (джиттер 11%)',d:'Микроскопические колебания тона — маркер стресса.'}]},[],true)});
function mean(a){if(!a.length)return 0;var t=0;for(var i=0;i&lt;a.length;i++)t+=a[i];return t/a.length}
function sd(a){if(a.length&lt;2)return 0;var m=mean(a),t=0;for(var i=0;i&lt;a.length;i++)t+=(a[i]-m)*(a[i]-m);return Math.sqrt(t/a.length)}
function analyzeVideo(blob){
coach('? Разбираю кадры и дорожку…');
var url=URL.createObjectURL(blob),v=document.createElement('video');
v.muted=true;v.playsInline=true;v.src=url;
var am=null,doneA=false,doneF=false,fm=null,thumbs=[];
function maybeRender(){if(doneA&amp;&amp;doneF){URL.revokeObjectURL(url);renderVideo(fm,am,thumbs,false);}}
blob.arrayBuffer?blob.arrayBuffer().then(function(ab){return new (window.AudioContext||window.webkitAudioContext)().decodeAudioData(ab)}).then(function(buf){am=audioMarks(buf);doneA=true;maybeRender();}).catch(function(){doneA=true;maybeRender();}):(doneA=true,setTimeout(maybeRender,0));
v.onloadedmetadata=function(){
var dur=Math.min(v.duration||10,20),times=[];for(var i=0;i&lt;10;i++)times.push(dur*i/10+0.05);
var c=document.createElement('canvas');c.width=64;c.height=48;var cx=c.getContext('2d');
var frames=[],idx=0;
function next(){if(idx&gt;=times.length){finish();return}v.currentTime=times[idx];}
v.onseeked=function(){cx.drawImage(v,0,0,64,48);var d=cx.getImageData(0,0,64,48).data,ga=new Uint8Array(64*48);
for(var i=0;i&lt;ga.length;i++){var o=i*4;ga[i]=(d[o]+d[o+1]+d[o+2])/3}
frames.push(ga);thumbs.push(c.toDataURL());idx++;next();};
function finish(){
var mot=[];for(var i=1;i&lt;frames.length;i++){var s2=0;for(var j=0;j&lt;frames[i].length;j+=4)s2+=Math.abs(frames[i][j]-frames[i-1][j]);mot.push(s2/(frames[i].length/4));}
var mM=mean(mot),sM=sd(mot);
fm={agit:Math.max(0,Math.min(100,mM*6)),irr:mM&gt;0?sM/mM:0,stiff:mM&lt;1.2};
doneF=true;maybeRender();}
next();};
v.onerror=function(){doneF=true;fm={agit:0,irr:0,stiff:true};maybeRender();};
}
function audioMarks(buf){
var sr=buf.sampleRate,d=buf.getChannelData(0),win=Math.floor(sr*0.05),hop=Math.floor(win/2),rms=[];
for(var i=0;i+win&lt;d.length;i+=hop){var q=0;for(var j=0;j&lt;win;j++){var v=d[i+j];q+=v*v}rms.push(Math.sqrt(q/win))}
var mx=0;for(var i2=0;i2&lt;rms.length;i2++)if(rms[i2]&gt;mx)mx=rms[i2];
var thr=Math.max(0.004,mx*0.08),pauses=0,run=0;
for(var i3=0;i3&lt;rms.length;i3++){if(rms[i3]&lt;thr)run++;else{if(run*hop/sr&gt;0.28)pauses++;run=0}}
var pitches=[];for(var i4=0;i4+win&lt;d.length;i4+=hop*2){if(rms[Math.floor(i4/hop)]&lt;thr*1.5)continue;var p=ac(d,i4,win,sr);if(p)pitches.push(p)}
var pm=mean(pitches),jit=0;for(var i5=1;i5&lt;pitches.length;i5++)jit+=Math.abs(pitches[i5]-pitches[i5-1]);
jit=pitches.length&gt;1?(jit/(pitches.length-1))/(pm||1):0;
var score=12,marks=[];
if(pauses&gt;=2){score+=Math.min(24,pauses*8);marks.push({ic:'⏸',t:'Паузы в речи: '+pauses,d:'Частые паузы — подбор слов.'})}
if(jit&gt;0.09){score+=20;marks.push({ic:'?',t:'Дрожь голоса (джиттер '+Math.round(jit*100)+'%)',d:'Маркер стресса в дорожке.'})}
return{score:Math.max(3,Math.min(96,score)),marks:marks};}
function ac(d,off,win,sr){var minL=Math.floor(sr/400),maxL=Math.floor(sr/60),best=0,lag0=0,e0=0;
for(var i=0;i&lt;win;i+=2){var v=d[off+i];e0+=v*v}if(e0&lt;1e-4)return 0;
for(var lag=minL;lag&lt;maxL;lag+=2){var s=0;for(var i2=0;i2&lt;win;i2+=4)s+=d[off+i2]*d[off+i2+lag];var c=s/e0;if(c&gt;best){best=c;lag0=lag}}
return best&gt;0.3&amp;&amp;lag0&gt;0?sr/lag0:0}
function renderVideo(fm,am,thumbs,demo){
var strip=$('#vd2-strip');strip.innerHTML=thumbs.map(function(t){return '&lt;img src="'+t+'"&gt;'}).join('');
var marks=[],vs=15+fm.agit*0.5+(fm.irr&gt;0.9?20:fm.irr*15)+(fm.stiff?15:0);vs=Math.max(3,Math.min(95,vs));
if(fm.agit&gt;55)marks.push({ic:'',t:'Высокая ажитация в кадре',d:'Много резких движений — возбуждение или нерв.'});
if(fm.stiff)marks.push({ic:'?',t:'Застывание',d:'Почти нет мимики/жестов — чтение с листа или контроль.'});
if(fm.irr&gt;0.9)marks.push({ic:'?',t:'Неровный ритм движений',d:'Рваная динамика — внутреннее напряжение.'});
if(am)am.marks.forEach(function(m){marks.push(m)});
if(am&amp;&amp;Math.abs(vs-am.score)&gt;25)marks.push({ic:'?',t:'Рассинхрон «голос/тело»',d:'Каналы расходятся: один спокоен, другой напряжён. Повод присмотреться.'});
var score=am?Math.round((vs+am.score)/2):Math.round(vs);
var box=$('#vd2-res');box.style.display='block';
var html='&lt;div class="pd-score"&gt;&lt;b&gt;'+score+'&lt;/b&gt;&lt;div style="flex:1"&gt;&lt;div style="font-size:12px;color:var(--mut);margin-bottom:6px"&gt;Индекс стресса в видео (0–100)'+(demo?' · демо':'')+'&lt;/div&gt;&lt;div class="pd-bar"&gt;&lt;i style="width:'+score+'%"&gt;&lt;/i&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;';
html+=marks.length?marks.map(function(m){return '&lt;div class="pd-flag"&gt;&lt;span class="c" style="color:#f0d68a"&gt;'+m.ic+' '+m.t+'&lt;/span&gt;&lt;span&gt;'+m.d+'&lt;/span&gt;&lt;/div&gt;'}).join(''):'&lt;div class="pd-flag"&gt;&lt;span class="c"&gt;✅&lt;/span&gt;&lt;span&gt;Маркеров стресса не нашёл: ровная мимика и голос.&lt;/span&gt;&lt;/div&gt;';
html+='&lt;div class="pd-flag"&gt;&lt;span class="c"&gt;?&lt;/span&gt;&lt;span&gt;Стресс в видео ≠ ложь. Волнение, усталость и камера тоже дают маркеры. Сравнивай с базой человека.&lt;/span&gt;&lt;/div&gt;';
box.innerHTML=html;grant(3);
var h=g('pr_video',[]);h.unshift({t:Date.now(),s:score});s('pr_video',h.slice(0,6));
coach(score&lt;30?'? Спокойно и ровно. +3 PR':score&lt;55?'? Лёгкое напряжение — смотри маркеры. +3 PR':'? Выраженный стресс в кадре/голосе. +3 PR');
}
console.log('?️ Правдомер: Блок 9 · Видео + ВИП подключены');
})();
&lt;/script&gt;

&lt;style&gt;
.fu-ch{border:1px solid var(--line);border-radius:14px;padding:12px;margin:8px 0;background:rgba(255,255,255,.03)}
.fu-ch .h{display:flex;justify-content:space-between;font-size:13px;font-weight:700;color:#f0d68a}
.fu-ch .m{font-size:11px;color:var(--mut);margin:4px 0}
.fu-ch input[type=range]{width:100%;accent-color:var(--gold)}
&lt;/style&gt;
&lt;script&gt;
(function(){"use strict";
if(window._prFusion)return;window._prFusion=1;
var $=function(s){return document.querySelector(s)};
function g(k,d){try{var v=localStorage.getItem(k);return v==null?d:JSON.parse(v)}catch(e){return d}}
function s(k,v){try{localStorage.setItem(k,JSON.stringify(v))}catch(e){}}
function coach(t){var c=$('#coach');if(!c)return;$('#coachText').textContent=t;c.style.display='block';clearTimeout(window._prCt);window._prCt=setTimeout(function(){c.style.display='none'},6500);}
function grant(n){var P=g('pr_profile',{pr:0,streak:0,last:'',lvl:1});P.pr+=n;P.lvl=1+Math.floor(P.pr/100);s('pr_profile',P);var e=$('#hPr');if(e)e.textContent=(g('pr_vip',null)&amp;&amp;g('pr_vip',null).until&gt;Date.now()?'? ':'')+'? '+P.pr+' PR';
var st=g('pr_streak',{d:0,last:''}),t=new Date().toDateString();if(st.last!==t){var y=new Date(Date.now()-864e5).toDateString();st.d=(st.last===y)?st.d+1:1;st.last=t;s('pr_streak',st);var e2=$('#hStreak');if(e2)e2.textContent='? '+st.d;}}
var main=document.querySelector('main'),fg=document.querySelector('.foot-grid');
var sec=document.createElement('section');sec.id='fusion';
sec.innerHTML='&lt;div class="sec-ic"&gt;⚗️&lt;/div&gt;&lt;h2&gt;Мультимодальный фьюжн&lt;/h2&gt;&lt;div class="sub"&gt;Своди все каналы в один «Индекс достоверности». Веса — гибкие, у каждого канала — уровень доверия по свежести данных&lt;/div&gt;'+
'&lt;div id="fu-chs"&gt;&lt;/div&gt;'+
'&lt;div class="pd-row"&gt;&lt;button class="btn" id="fu-go"&gt;⚗️ Вычислить фьюжн&lt;/button&gt;&lt;button class="btn ghost" id="fu-demo"&gt;? Демо-данные&lt;/button&gt;&lt;/div&gt;'+
'&lt;div id="fu-res" style="display:none"&gt;&lt;/div&gt;';
if(fg)main.insertBefore(sec,fg);else main.appendChild(sec);
var nav=$('#chips');if(nav){var chip=document.createElement('button');chip.textContent='⚗️ Фьюжн';chip.addEventListener('click',function(){nav.querySelectorAll('button').forEach(function(x){x.classList.remove('on')});chip.classList.add('on');sec.scrollIntoView({behavior:'smooth'});});nav.appendChild(chip);}
var CH=[
{id:'text',n:'? Текст',w:30,get:function(){var h=g('pr_hist',[]);if(!h.length)return null;var e=h[0];return{cred:e.l==='lie'?e.s:100-e.s,raw:e.s,t:e.t}}},
{id:'voice',n:'? Голос',w:25,get:function(){var h=g('pr_voice',[]);if(!h.length)return null;return{cred:100-h[0].s,raw:h[0].s,t:h[0].t}}},
{id:'video',n:'? Видео',w:25,get:function(){var h=g('pr_video',[]);if(!h.length)return null;return{cred:100-h[0].s,raw:h[0].s,t:h[0].t}}},
{id:'photo',n:'? Фото',w:10,get:function(){var h=g('pr_photo',[]);if(!h.length)return null;return{cred:h[0].s,raw:h[0].s,t:h[0].t}}},
{id:'social',n:'? Соцсети',w:10,get:function(){var h=g('pr_social',[]);if(!h.length)return null;var e=h[0];return{cred:100-Math.max(e.b,e.f),raw:Math.max(e.b,e.f),t:e.t}}}];
function weights(){return g('pr_weights',{text:30,voice:25,video:25,photo:10,social:10})}
function conf(t){var a=Date.now()-t;return a&lt;864e5?1:a&lt;3*864e5?0.8:a&lt;7*864e5?0.5:0.25}
function renderChs(){
var W=weights();
$('#fu-chs').innerHTML=CH.map(function(c){
var d=c.get(),cf=d?conf(d.t):0;
return '&lt;div class="fu-ch"&gt;&lt;div class="h"&gt;&lt;span&gt;'+c.n+'&lt;/span&gt;&lt;span&gt;'+(d?'достоверность '+Math.round(d.cred):'нет данных')+'&lt;/span&gt;&lt;/div&gt;'+
'&lt;div class="m"&gt;Доверие канала: '+Math.round(cf*100)+'% '+(d?'· анализ '+new Date(d.t).toLocaleDateString('ru-RU'):'· запусти детектор')+'&lt;/div&gt;'+
'&lt;div class="m"&gt;Вес: &lt;b id="fw-'+c.id+'"&gt;'+W[c.id]+'&lt;/b&gt;%&lt;/div&gt;'+
'&lt;input type="range" min="0" max="100" value="'+W[c.id]+'" data-c="'+c.id+'"&gt;&lt;/div&gt;';
}).join('');
$('#fu-chs').querySelectorAll('input[type=range]').forEach(function(r){r.addEventListener('input',function(){var W=weights();W[r.dataset.c]=+r.value;s('pr_weights',W);$('#fw-'+r.dataset.c).textContent=r.value;});});
}
function compute(){
var W=weights(),num=0,den=0,rows=[];
CH.forEach(function(c){
var d=c.get();if(!d)return;
var cf=conf(d.t),w=W[c.id]||0,eff=w*cf;
if(eff&lt;=0)return;
num+=eff*d.cred;den+=eff;
rows.push({n:c.n,cred:Math.round(d.cred),w:w,cf:Math.round(cf*100),eff:eff});
});
if(den&lt;=0){coach('⚗️ Нет данных ни по одному каналу — запусти детекторы или жми «Демо-данные»');return}
var score=Math.round(num/den);
var box=$('#fu-res');box.style.display='block';
var v=score&gt;=75?'Выглядит достоверно: каналы сходятся.':score&gt;=50?'Есть вопросы: каналы расходятся — смотри флаги каждого детектора.':'Высокий риск обмана/манипуляции: несколько каналов сигнализируют.';
var html='&lt;div class="pd-score"&gt;&lt;b&gt;'+score+'&lt;/b&gt;&lt;div style="flex:1"&gt;&lt;div style="font-size:12px;color:var(--mut);margin-bottom:6px"&gt;Индекс достоверности (0–100) · каналов учтено: '+rows.length+'&lt;/div&gt;&lt;div class="pd-bar"&gt;&lt;i style="width:'+score+'%"&gt;&lt;/i&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;';
html+='&lt;div class="pd-flag"&gt;&lt;span class="c" style="color:#f0d68a"&gt;⚖️ '+v+'&lt;/span&gt;&lt;span&gt;Фьюжн взвешивает каждый канал по весу и свежести данных.&lt;/span&gt;&lt;/div&gt;';
html+=rows.map(function(r){return '&lt;div class="pd-flag"&gt;&lt;span class="c"&gt;'+r.n+'&lt;/span&gt;&lt;span&gt;достоверность '+r.cred+' · вес '+r.w+'% · доверие '+r.cf+'%&lt;/span&gt;&lt;/div&gt;'}).join('');
html+='&lt;div class="pd-flag"&gt;&lt;span class="c"&gt;?&lt;/span&gt;&lt;span&gt;Индекс — вероятность, а не истина. Один канал может врать; три сходящихся — уже сигнал.&lt;/span&gt;&lt;/div&gt;';
box.innerHTML=html;
var rep=g('pr_reports',[]);rep.unshift({t:Date.now(),score:score,ch:rows.length});s('pr_reports',rep.slice(0,10));
grant(4);coach('⚗️ Фьюжн готов: индекс '+score+'. +4 PR');
}
$('#fu-go').addEventListener('click',compute);
$('#fu-demo').addEventListener('click',function(){
var t=Date.now();
s('pr_hist',[{t:t,l:'lie',s:38}]);s('pr_voice',[{t:t,s:62}]);s('pr_video',[{t:t,s:55}]);s('pr_photo',[{t:t,s:70}]);s('pr_social',[{t:t,b:60,f:40}]);
renderChs();coach('? Демо-данные загружены — жми «Вычислить фьюжн»');
});
renderChs();
console.log('?️ Правдомер: Блок 10 · Фьюжн подключён');
})();
&lt;/script&gt;

&lt;style&gt;
.du-arena{border:1px solid var(--line);border-radius:16px;padding:14px;background:rgba(255,255,255,.03)}
.du-txt{font-style:italic;font-size:13px;color:#d9d2ea;margin:10px 0;line-height:1.6}
.du-flags{display:flex;flex-wrap:wrap;gap:6px}
.du-flag{padding:8px 12px;border-radius:999px;border:1px solid var(--line);background:rgba(255,255,255,.04);font-size:12px;cursor:pointer;color:#cfc8e8}
.du-flag.on{background:linear-gradient(135deg,var(--violet),var(--gold));color:#fff;border-color:transparent}
.du-flag.good{background:rgba(16,185,129,.2);border-color:#10B981;color:#6ee7b7}
.du-flag.bad{background:rgba(239,68,68,.15);border-color:#EF4444;color:#fca5a5}
.du-bar{height:8px;background:rgba(255,255,255,.08);border-radius:99px;overflow:hidden;margin:10px 0}
.du-bar i{display:block;height:100%;background:linear-gradient(90deg,#EF4444,#F59E0B);width:100%}
.du-sc{display:flex;gap:10px;margin:10px 0}
.du-p{flex:1;border:1px solid var(--line);border-radius:12px;padding:10px;text-align:center;font-size:13px}
.du-p.on{border-color:var(--gold);background:rgba(212,175,55,.08)}
.du-p b{font-size:22px;display:block;color:#f0d68a}
.api-row{display:flex;justify-content:space-between;gap:8px;font-size:12px;padding:7px 10px;border-radius:10px;background:rgba(139,92,246,.06);border:1px solid rgba(139,92,246,.2);margin:5px 0;color:#cfc8e8}
.api-row b{color:#c4b5fd}
&lt;/style&gt;
&lt;script&gt;
(function(){"use strict";
if(window._prDuelApi)return;window._prDuelApi=1;
var $=function(s){return document.querySelector(s)};
function g(k,d){try{var v=localStorage.getItem(k);return v==null?d:JSON.parse(v)}catch(e){return d}}
function s(k,v){try{localStorage.setItem(k,JSON.stringify(v))}catch(e){}}
function coach(t){var c=$('#coach');if(!c)return;$('#coachText').textContent=t;c.style.display='block';clearTimeout(window._prCt);window._prCt=setTimeout(function(){c.style.display='none'},6500);}
function grant(n){var P=g('pr_profile',{pr:0,streak:0,last:'',lvl:1});P.pr+=n;P.lvl=1+Math.floor(P.pr/100);s('pr_profile',P);var e=$('#hPr');if(e)e.textContent=(g('pr_vip',null)&amp;&amp;g('pr_vip',null).until&gt;Date.now()?'? ':'')+'? '+P.pr+' PR';
var st=g('pr_streak',{d:0,last:''}),t=new Date().toDateString();if(st.last!==t){var y=new Date(Date.now()-864e5).toDateString();st.d=(st.last===y)?st.d+1:1;st.last=t;s('pr_streak',st);var e2=$('#hStreak');if(e2)e2.textContent='? '+st.d;}}
var main=document.querySelector('main'),fg=document.querySelector('.foot-grid');
/* ═════ ДУЭЛЬ ═════ */
var dsec=document.createElement('section');dsec.id='duel';
dsec.innerHTML='&lt;div class="sec-ic"&gt;⚔️&lt;/div&gt;&lt;h2&gt;PvP-дуэль детективов&lt;/h2&gt;&lt;div class="sub"&gt;Хот-сит на одном экране: 6 раундов, ищите флаги на скорость и точность. +2 за верный флаг, −1 за ложный&lt;/div&gt;'+
'&lt;div class="pd-row"&gt;&lt;input id="du-n1" placeholder="Игрок 1" style="width:140px"&gt;&lt;input id="du-n2" placeholder="Игрок 2" style="width:140px"&gt;&lt;button class="btn" id="du-start"&gt;⚔️ Начать дуэль&lt;/button&gt;&lt;/div&gt;'+
'&lt;div class="du-arena" id="du-arena" style="display:none"&gt;'+
'&lt;div class="du-sc"&gt;&lt;div class="du-p" id="du-p0"&gt;&lt;b&gt;0&lt;/b&gt;&lt;span id="du-n0"&gt;Игрок 1&lt;/span&gt;&lt;/div&gt;&lt;div class="du-p" id="du-p1"&gt;&lt;b&gt;0&lt;/b&gt;&lt;span id="du-n1b"&gt;Игрок 2&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;'+
'&lt;div id="du-turn" style="font-size:12px;color:var(--mut)"&gt;&lt;/div&gt;'+
'&lt;div class="du-bar"&gt;&lt;i id="du-fill"&gt;&lt;/i&gt;&lt;/div&gt;'+
'&lt;div class="du-txt" id="du-txt"&gt;&lt;/div&gt;&lt;div class="du-flags" id="du-flags"&gt;&lt;/div&gt;'+
'&lt;div class="pd-row"&gt;&lt;button class="btn" id="du-done"&gt;✅ Готово&lt;/button&gt;&lt;/div&gt;&lt;div class="cs-res" id="du-res"&gt;&lt;/div&gt;&lt;/div&gt;';
if(fg)main.insertBefore(dsec,fg);else main.appendChild(dsec);
var DC=[
{x:'Срочно! Ваша карта заблокирована, назовите код из СМС, иначе потеряете все деньги!',f:[{t:'Искусственная срочность',ok:1},{t:'Запрос секретного кода',ok:1},{t:'Кнопка страха',ok:1},{t:'Вежливый тон',ok:0},{t:'Ссылка на источник',ok:0}]},
{x:'Я такого не говорил, тебе показалось. Ты вечно всё придумываешь.',f:[{t:'Отрицание факта (газлайтинг)',ok:1},{t:'Обесценивание памяти',ok:1},{t:'Конкретные доказательства',ok:0},{t:'Аргумент с цифрами',ok:0}]},
{x:'После всего, что я для тебя сделал, ты не можешь выполнить такую мелочь?',f:[{t:'Давление виной',ok:1},{t:'Подмена долга',ok:1},{t:'Прямая просьба',ok:0},{t:'Благодарность',ok:0}]},
{x:'По данным ЦБ (ссылка на отчёт), ключевая ставка снижена на 0,5%.',f:[{t:'Источник и цифры',ok:0},{t:'Сенсационализм',ok:0},{t:'Нейтральный тон',ok:0},{t:'Кликбейт',ok:0}]},
{x:'Вы выиграли автомобиль! Оплатите комиссию 300 рублей и заберите приз.',f:[{t:'Предоплата за выигрыш',ok:1},{t:'Нереалистичный приз',ok:1},{t:'Проверка личности',ok:0},{t:'Официальный договор',ok:0}]},
{x:'Все об этом молчат! Репостни, пока не удалили! Шок!',f:[{t:'Сенсационализм',ok:1},{t:'Призыв к репосту',ok:1},{t:'Дефицит времени',ok:1},{t:'Ссылка на исследование',ok:0}]}];
var pl=[{s:0},{s:0}],round=0,timer=null,picked={},order=[];
function shuffle(a){a=a.slice();for(var i=a.length-1;i&gt;0;i--){var j=Math.floor(Math.random()*(i+1)),t=a[i];a[i]=a[j];a[j]=t}return a}
$('#du-start').addEventListener('click',function(){
pl=[{s:0},{s:0}];round=0;picked={};order=shuffle([0,1,2,3,4,5]);
$('#du-n0').textContent=$('#du-n1').value||'Игрок 1';
$('#du-n1b').textContent=$('#du-n2').value||'Игрок 2';
$('#du-arena').style.display='block';$('#du-res').innerHTML='';
updSc();nextRound();});
function updSc(){$('#du-p0').querySelector('b').textContent=pl[0].s;$('#du-p1').querySelector('b').textContent=pl[1].s;
$('#du-p0').classList.toggle('on',round%2===0);$('#du-p1').classList.toggle('on',round%2===1);}
function nextRound(){
if(round&gt;=6){finish();return}
var act=round%2;
$('#du-turn').textContent='Раунд '+(round+1)+'/6 · ход: '+($('#du-n'+(act===0?'0':'1b')).textContent);
var c=DC[order[round]];picked={};
$('#du-txt').textContent='«'+c.x+'»';
var fs=shuffle(c.f.map(function(f,i){return{t:f.t,ok:f.ok,i:i}}));
$('#du-flags').innerHTML=fs.map(function(f){return '&lt;button class="du-flag" data-i="'+f.i+'"&gt;'+f.t+'&lt;/button&gt;'}).join('');
$('#du-flags').querySelectorAll('.du-flag').forEach(function(b){b.addEventListener('click',function(){var i=b.getAttribute('data-i');if(picked[i]){delete picked[i];b.classList.remove('on')}else{picked[i]=1;b.classList.add('on')}})});
$('#du-done').style.display='inline-flex';
var left=20;$('#du-fill').style.width='100%';
clearInterval(timer);timer=setInterval(function(){left-=0.1;$('#du-fill').style.width=Math.max(0,left/20*100)+'%';if(left&lt;=0)resolve()},100);
}
$('#du-done').addEventListener('click',resolve);
function resolve(){
clearInterval(timer);$('#du-done').style.display='none';
var c=DC[order[round]],pts=0,fb=[];
$('#du-flags').querySelectorAll('.du-flag').forEach(function(b){
var i=+b.getAttribute('data-i'),f=c.f[i];
if(picked[i]){pts+=f.ok?2:-1;b.classList.add(f.ok?'good':'bad');}
else if(f.ok)b.classList.add('good');
});
pl[round%2].s+=pts;
$('#du-res').innerHTML='&lt;span class="'+(pts&gt;=0?'win':'lose')+'"&gt;'+(pts&gt;=0?'+':'')+pts+' очков&lt;/span&gt; — зелёным подсвечены настоящие флаги.';
updSc();round++;setTimeout(nextRound,1600);
}
function finish(){
$('#du-txt').textContent='';$('#du-flags').innerHTML='';$('#du-turn').textContent='';$('#du-fill').style.width='0%';
var n0=$('#du-n0').textContent,n1=$('#du-n1b').textContent;
var w=pl[0].s===pl[1].s?'Ничья! Оба хороши.':pl[0].s&gt;pl[1].s?'? Победил '+n0+'!':'? Победил '+n1+'!';
$('#du-res').innerHTML='&lt;b style="color:#f0d68a"&gt;'+w+'&lt;/b&gt; '+n0+': '+pl[0].s+' · '+n1+': '+pl[1].s;
var pv=g('pr_pvp',{p1:0,p2:0});if(pl[0].s&gt;pl[1].s)pv.p1++;else if(pl[1].s&gt;pl[0].s)pv.p2++;s('pr_pvp',pv);
grant(6);coach('⚔️ Дуэль завершена: +6 PR обоим. '+w);
}
/* ═════ ОТКРЫТОЕ API ═════ */
function last(k){var h=g(k,[]);return h.length?h[0]:null}
function vipOn(){var v=g('pr_vip',null);return !!(v&amp;&amp;v.until&gt;Date.now())}
window.PravdomerAPI={version:'1.0.0',
ping:function(){return{ok:true,ts:Date.now(),app:'Pravdomer'}},
channels:function(){return{text:last('pr_hist'),voice:last('pr_voice'),video:last('pr_video'),photo:last('pr_photo'),social:last('pr_social')}},
fusion:function(){var W=g('pr_weights',{text:30,voice:25,video:25,photo:10,social:10});
function conf(t){var a=Date.now()-t;return a&lt;864e5?1:a&lt;3*864e5?0.8:a&lt;7*864e5?0.5:0.25}
var CH=[['text',function(){var e=last('pr_hist');return e?(e.l==='lie'?e.s:100-e.s):null}],['voice',function(){var e=last('pr_voice');return e?100-e.s:null}],['video',function(){var e=last('pr_video');return e?100-e.s:null}],['photo',function(){var e=last('pr_photo');return e?e.s:null}],['social',function(){var e=last('pr_social');return e?100-Math.max(e.b,e.f):null}]];
var num=0,den=0;CH.forEach(function(c){var v=c[1]();if(v==null)return;var e=last('pr_'+(c[0]==='text'?'hist':c[0]));if(!e)return;var ef=W[c[0]]*conf(e.t);if(ef&lt;=0)return;num+=ef*v;den+=ef});
return{score:den&gt;0?Math.round(num/den):null,channels:den}},
profile:function(){var P=g('pr_profile',{pr:0,lvl:1});return{pr:P.pr,lvl:P.lvl,streak:g('pr_streak',{d:0}).d,vip:vipOn(),achievements:Object.keys(g('pr_achs',{})).length}},
reports:function(){return g('pr_reports',[])},
exportAll:function(){var out={};for(var i=0;i&lt;localStorage.length;i++){var k=localStorage.key(i);if(k.indexOf('pr_')===0){try{out[k]=JSON.parse(localStorage.getItem(k))}catch(e){out[k]=localStorage.getItem(k)}}}return out}};
var asec=document.createElement('section');asec.id='api';
asec.innerHTML='&lt;div class="sec-ic"&gt;?&lt;/div&gt;&lt;h2&gt;Открытое API&lt;/h2&gt;&lt;div class="sub"&gt;Локальный &lt;b&gt;window.PravdomerAPI&lt;/b&gt; для интеграций и экспорта — всё читается из ваших данных, ничего не отправляется&lt;/div&gt;'+
'&lt;div class="api-row"&gt;&lt;b&gt;ping()&lt;/b&gt;&lt;span&gt;проверка доступности&lt;/span&gt;&lt;/div&gt;'+
'&lt;div class="api-row"&gt;&lt;b&gt;channels()&lt;/b&gt;&lt;span&gt;последние результаты 5 детекторов&lt;/span&gt;&lt;/div&gt;'+
'&lt;div class="api-row"&gt;&lt;b&gt;fusion()&lt;/b&gt;&lt;span&gt;индекс достоверности&lt;/span&gt;&lt;/div&gt;'+
'&lt;div class="api-row"&gt;&lt;b&gt;profile()&lt;/b&gt;&lt;span&gt;PR, уровень, стрик, ачивки, ВИП&lt;/span&gt;&lt;/div&gt;'+
'&lt;div class="api-row"&gt;&lt;b&gt;reports()&lt;/b&gt;&lt;span&gt;история фьюжн-отчётов&lt;/span&gt;&lt;/div&gt;'+
'&lt;div class="api-row"&gt;&lt;b&gt;exportAll()&lt;/b&gt;&lt;span&gt;все данные pr_* одним JSON&lt;/span&gt;&lt;/div&gt;'+
'&lt;div class="pd-row"&gt;&lt;button class="btn ghost" id="ap-ping"&gt;? Тест ping&lt;/button&gt;&lt;button class="btn ghost" id="ap-copy"&gt;? Копировать документацию&lt;/button&gt;&lt;button class="btn ghost" id="ap-man"&gt;? Скачать manifest.json&lt;/button&gt;&lt;/div&gt;'+
'&lt;div id="ap-out" style="display:none;margin-top:10px"&gt;&lt;/div&gt;';
if(fg)main.insertBefore(asec,fg);else main.appendChild(asec);
var nav=$('#chips');if(nav){[['⚔️ Дуэль','duel'],['? API','api']].forEach(function(x){var c=document.createElement('button');c.textContent=x[0];c.addEventListener('click',function(){nav.querySelectorAll('button').forEach(function(b){b.classList.remove('on')});c.classList.add('on');document.getElementById(x[1]).scrollIntoView({behavior:'smooth'});});nav.appendChild(c);});}
$('#ap-ping').addEventListener('click',function(){var o=$('#ap-out');o.style.display='block';o.innerHTML='&lt;div class="pd-flag"&gt;&lt;span class="c"&gt;?&lt;/span&gt;&lt;span&gt;'+JSON.stringify(window.PravdomerAPI.ping())+'&lt;/span&gt;&lt;/div&gt;'});
$('#ap-copy').addEventListener('click',function(){
var docs='PravdomerAPI v1.0.0 — локальный API.\nМетоды: ping(), channels(), fusion(), profile(), reports(), exportAll().\nДанные: localStorage (ключи pr_*). Ничего не отправляется на сервер.\nПример: console.log(PravdomerAPI.fusion())';
if(navigator.clipboard&amp;&amp;navigator.clipboard.writeText){navigator.clipboard.writeText(docs).then(function(){coach('? Документация скопирована')});}else coach('Копирование недоступно в этом браузере');});
$('#ap-man').addEventListener('click',function(){
var man={name:'Pravdomer API',version:'1.0.0',methods:['ping','channels','fusion','profile','reports','exportAll'],storage:'localStorage(pr_*)',privacy:'local-only'};
var blob=new Blob([JSON.stringify(man,null,2)],{type:'application/json'});var a=document.createElement('a');a.href=URL.createObjectURL(blob);a.download='pravdomer-api-manifest.json';document.body.appendChild(a);a.click();a.remove();coach('? manifest.json скачан');});
console.log('?️ Правдомер: Блок 11 · Дуэль + API подключены');
})();
&lt;/script&gt;



&lt;style&gt;
#p12-btn{position:fixed;right:16px;bottom:18px;z-index:66;width:54px;height:54px;border-radius:50%;border:none;cursor:pointer;background:linear-gradient(135deg,#10B981,#06B6D4);color:#fff;font-size:24px;box-shadow:0 8px 24px rgba(16,185,129,.45);transition:transform .2s}
#p12-btn:hover{transform:scale(1.1)}
#p12-mask{position:fixed;inset:0;z-index:72;display:none;align-items:center;justify-content:center;background:rgba(10,6,20,.92);backdrop-filter:blur(6px)}
#p12-mask.open{display:flex}
#p12-card{width:min(600px,94vw);max-height:90vh;overflow-y:auto;background:linear-gradient(180deg,#241a45,#1d1533);border:1px solid rgba(16,185,129,.4);border-radius:20px;padding:22px}
#p12-card h2{color:#6ee7b7;font-size:22px;margin:0 0 4px}
.p12-stats{display:grid;grid-template-columns:repeat(4,1fr);gap:8px;margin:14px 0}
@media(max-width:520px){.p12-stats{grid-template-columns:repeat(2,1fr)}}
.p12-stat{background:rgba(16,185,129,.08);border:1px solid rgba(16,185,129,.3);border-radius:12px;padding:10px;text-align:center}
.p12-stat b{display:block;font-size:20px;color:#6ee7b7}
.p12-stat span{font-size:10px;color:#7fa89a;text-transform:uppercase;letter-spacing:.5px}
.p12-list{display:flex;flex-direction:column;gap:5px;margin:12px 0}
.p12-row{display:flex;justify-content:space-between;font-size:12px;padding:7px 10px;border-radius:8px;background:rgba(16,185,129,.05);border:1px solid rgba(16,185,129,.2);color:#cfc8e8}
.p12-row .ok{color:#6ee7b7;font-weight:800}.p12-row .no{color:#fca5a5;font-weight:800}
.p12-btns{display:flex;gap:8px;flex-wrap:wrap;margin-top:12px}
#p12-consent{position:fixed;inset:0;z-index:80;display:none;align-items:center;justify-content:center;background:rgba(10,6,20,.95);backdrop-filter:blur(8px)}
#p12-consent.open{display:flex}
#p12-ccard{width:min(460px,92vw);background:linear-gradient(180deg,#241a45,#1d1533);border:1px solid rgba(212,175,55,.5);border-radius:20px;padding:24px}
#p12-ccard h2{color:#f0d68a;font-size:20px;margin-bottom:10px}
#p12-ccard p{font-size:13px;color:#cfc8e8;line-height:1.6;margin-bottom:10px}
.p12-badge{position:absolute;top:-4px;right:-4px;min-width:18px;height:18px;border-radius:9px;background:#10B981;color:#fff;font-size:10px;font-weight:800;display:flex;align-items:center;justify-content:center;padding:0 5px;box-shadow:0 2px 6px rgba(16,185,129,.5)}
&lt;/style&gt;

&lt;button id="p12-btn" title="Паспорт проекта · Правдомер" style="position:relative"&gt;
?&lt;span class="p12-badge" id="p12-bad" style="display:none"&gt;&lt;/span&gt;
&lt;/button&gt;

&lt;div id="p12-mask"&gt;&lt;div id="p12-card"&gt;
&lt;h2&gt;? Паспорт проекта · Правдомер &lt;span id="p12-ver" style="font-size:12px;color:#7fa89a"&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;div class="sub" style="color:var(--mut);font-size:12px;margin-bottom:12px"&gt;Финальная сверка · статистика · экспорт · офлайн&lt;/div&gt;
&lt;div class="p12-stats" id="p12-stats"&gt;&lt;/div&gt;
&lt;div class="p12-list" id="p12-list"&gt;&lt;/div&gt;
&lt;div class="p12-btns"&gt;
&lt;button class="btn" id="p12-export"&gt;⬇ Экспорт&lt;/button&gt;
&lt;button class="btn ghost" id="p12-install" disabled="disabled"&gt;? Установить&lt;/button&gt;
&lt;button class="btn ghost" id="p12-reset"&gt;? Сброс&lt;/button&gt;
&lt;/div&gt;
&lt;button class="btn" id="p12-close" style="width:100%;justify-content:center;margin-top:10px"&gt;Закрыть&lt;/button&gt;
&lt;/div&gt;&lt;/div&gt;

&lt;div id="p12-consent"&gt;&lt;div id="p12-ccard"&gt;
&lt;h2&gt;?️ Добро пожаловать в Правдомер&lt;/h2&gt;
&lt;p&gt;&lt;b&gt;18+.&lt;/b&gt; Это игровой тренажёр медиаграмотности. Результаты — &lt;b&gt;вероятности, а не вердикты&lt;/b&gt;; не являются экспертизой, диагнозом или юридической консультацией.&lt;/p&gt;
&lt;p&gt;? Все ваши данные (тексты, аудио, фото, прогресс) хранятся &lt;b&gt;только на вашем устройстве&lt;/b&gt; и никуда не отправляются (соответствует 152-ФЗ).&lt;/p&gt;
&lt;p&gt;⚖️ &lt;b&gt;Не анализируйте реальных людей без их согласия.&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;? При острых психологических состояниях звоните &lt;b&gt;112&lt;/b&gt; или на линию доверия.&lt;/p&gt;
&lt;button class="btn" id="p12-yes" style="width:100%;justify-content:center"&gt;✅ Понятно, начинаем&lt;/button&gt;
&lt;/div&gt;&lt;/div&gt;

&lt;script&gt;
(function(){"use strict";
if(window._prFinal)return;window._prFinal=1;

var $=function(s){return document.querySelector(s)};
function g(k,d){try{var v=localStorage.getItem(k);return v==null?d:JSON.parse(v)}catch(e){return d}}
function s(k,v){try{localStorage.setItem(k,JSON.stringify(v))}catch(e){}}

function coach(t){
  var c=$('#coach');if(!c)return;
  $('#coachText').textContent=t;
  c.style.display='block';
  clearTimeout(window._prCt);
  window._prCt=setTimeout(function(){c.style.display='none'},6500);
}

window.PRAVDOMER_VERSION='1.0.0';
$('#p12-ver').textContent='v'+window.PRAVDOMER_VERSION;

/* ═══════════ 1. СОГЛАСИЕ (первый запуск) ═══════════ */
if(!g('pr_consent',false)){
  setTimeout(function(){$('#p12-consent').classList.add('open');},400);
}
$('#p12-yes').addEventListener('click',function(){
  s('pr_consent',true);
  $('#p12-consent').classList.remove('open');
  coach('Отлично! Все данные остаются на вашем устройстве ?');
});

/* ═══════════ 2. АНАЛИТИКА: визиты и события ═══════════ */
function today(){return new Date().toDateString()}
var vis=g('pr_visits',{});
vis[today()]=(vis[today()]||0)+1;
s('pr_visits',vis);

document.addEventListener('click',function(){
  s('pr_events',g('pr_events',0)+1);
},true);

/* ═══════════ 3. PWA: иконка + манифест ═══════════ */
var iconSvg='&lt;svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 100 100"&gt;&lt;text y=".9em" font-size="90"&gt;?️&lt;/text&gt;&lt;/svg&gt;';
var iconUrl='data:image/svg+xml,'+encodeURIComponent(iconSvg);

if(!document.querySelector('link[rel="icon"]')){
  var fl=document.createElement('link');
  fl.rel='icon';fl.href=iconUrl;
  document.head.appendChild(fl);
}

var manifest={
  name:'Правдомер · тренажёр детектора лжи',
  short_name:'Правдомер',
  start_url:'.',
  scope:'.',
  display:'standalone',
  orientation:'portrait',
  background_color:'#120c22',
  theme_color:'#8B5CF6',
  description:'Игровой тренажёр распознавания лжи и манипуляций. 18+',
  icons:[{src:iconUrl,sizes:'any',type:'image/svg+xml',purpose:'any maskable'}]
};
var ml=document.createElement('link');
ml.rel='manifest';
ml.href=URL.createObjectURL(new Blob([JSON.stringify(manifest)],{type:'application/json'}));
document.head.appendChild(ml);

/* ═══════════ 4. ОФЛАЙН: встроенный Service Worker ═══════════ */
if('serviceWorker' in navigator){
  var isLocal=location.protocol==='https:'||location.hostname==='localhost'||location.hostname==='127.0.0.1'||location.protocol==='file:';
  if(isLocal&amp;&amp;location.protocol!=='file:'){
    var swCode=`
var CACHE='pravdomer-v1';
self.addEventListener('install',function(e){e.waitUntil(caches.open(CACHE).then(function(c){return c.addAll(['./'])}));self.skipWaiting()});
self.addEventListener('activate',function(e){e.waitUntil(caches.keys().then(function(ks){return Promise.all(ks.filter(function(k){return k!==CACHE}).map(function(k){return caches.delete(k)}))}).then(function(){return self.clients.claim()}))});
self.addEventListener('fetch',function(e){if(e.request.method!=='GET')return;e.respondWith(caches.match(e.request).then(function(h){if(h)return h;return fetch(e.request).then(function(r){if(r.ok&amp;&amp;r.type==='basic'){var c=r.clone();caches.open(CACHE).then(function(cc){cc.put(e.request,c)})}return r}).catch(function(){return caches.match('./')})}))});`;
    var swUrl=URL.createObjectURL(new Blob([swCode],{type:'application/javascript'}));
    navigator.serviceWorker.register(swUrl).then(function(reg){
      console.log('? Правдомер: офлайн-кэш активен');
    }).catch(function(err){
      console.log('⚠️ SW не зарегистрирован:',err.message);
    });
  }
}

/* ═══════════ 5. УСТАНОВКА (PWA prompt) ═══════════ */
var deferredPrompt=null;
window.addEventListener('beforeinstallprompt',function(e){
  e.preventDefault();
  deferredPrompt=e;
  var b=$('#p12-install');
  if(b){b.disabled=false;b.textContent='? Установить';}
});
$('#p12-install').addEventListener('click',function(){
  if(!deferredPrompt)return;
  deferredPrompt.prompt();
  deferredPrompt.userChoice.then(function(){deferredPrompt=null;$('#p12-install').disabled=true;});
});
window.addEventListener('appinstalled',function(){
  coach('? Правдомер установлен на устройство!');
});

/* ═══════════ 6. СВЕРКА ВСЕХ БЛОКОВ ═══════════ */
var CHECK=[
  ['hero','? Дело дня',null],
  ['text','? Текст-детектор','_prTextDone'],
  ['voice','? Голос-детектор','_prVoiceDone'],
  ['photo','? Фото-детектор','_prPhotoCall'],
  ['call','? Звонок-детектор','_prPhotoCall'],
  ['sim','? Псих-симулятор','_prSimDone'],
  ['cases','? Библиотека дел','_prCasesDone'],
  ['social','? Соц-детектор','_prSocialDone'],
  ['video','? Видео-детектор','_prVideoVip'],
  ['vip','? ВИП-статус','_prVideoVip'],
  ['fusion','⚗️ Фьюжн','_prFusion'],
  ['duel','⚔️ PvP-дуэль','_prDuelApi'],
  ['api','? Открытое API','_prDuelApi'],
  ['gc-mask','?️ Кабинет детектива','_prGameDone'],
  ['modeMask','? Режимы аудитории','_prModeDone']
];

function isOk(c){
  return !!(document.getElementById(c[0])&amp;&amp;(!c[2]||window[c[2]]));
}

function render(){
  var P=g('pr_profile',{pr:0,lvl:1});
  var st=g('pr_streak',{d:0});
  var stats=g('pr_stats',{a:0});
  var achs=g('pr_achs',{});
  var totV=0;for(var k in vis)totV+=vis[k];
  var okN=0;CHECK.forEach(function(c){if(isOk(c))okN++});
  var vipOn=!!(g('pr_vip',null)&amp;&amp;g('pr_vip',null).until&gt;Date.now());

  $('#p12-stats').innerHTML=
    '&lt;div class="p12-stat"&gt;&lt;b&gt;'+P.pr+'&lt;/b&gt;&lt;span&gt;PR&lt;/span&gt;&lt;/div&gt;'+
    '&lt;div class="p12-stat"&gt;&lt;b&gt;'+st.d+'&lt;/b&gt;&lt;span&gt;стрик&lt;/span&gt;&lt;/div&gt;'+
    '&lt;div class="p12-stat"&gt;&lt;b&gt;'+stats.a+'&lt;/b&gt;&lt;span&gt;разборов&lt;/span&gt;&lt;/div&gt;'+
    '&lt;div class="p12-stat"&gt;&lt;b&gt;'+Object.keys(achs).length+'&lt;/b&gt;&lt;span&gt;ачивок&lt;/span&gt;&lt;/div&gt;'+
    '&lt;div class="p12-stat"&gt;&lt;b&gt;'+totV+'&lt;/b&gt;&lt;span&gt;визитов&lt;/span&gt;&lt;/div&gt;'+
    '&lt;div class="p12-stat"&gt;&lt;b&gt;'+g('pr_events',0)+'&lt;/b&gt;&lt;span&gt;событий&lt;/span&gt;&lt;/div&gt;'+
    '&lt;div class="p12-stat"&gt;&lt;b&gt;'+okN+'/'+CHECK.length+'&lt;/b&gt;&lt;span&gt;блоков ок&lt;/span&gt;&lt;/div&gt;'+
    '&lt;div class="p12-stat"&gt;&lt;b&gt;'+(vipOn?'?':'—')+'&lt;/b&gt;&lt;span&gt;вип&lt;/span&gt;&lt;/div&gt;';

  $('#p12-list').innerHTML=CHECK.map(function(c){
    var ok=isOk(c);
    return '&lt;div class="p12-row"&gt;&lt;span&gt;'+c[1]+'&lt;/span&gt;&lt;span class="'+(ok?'ok':'no')+'"&gt;'+(ok?'✓ подключён':'✗ отсутствует')+'&lt;/span&gt;&lt;/div&gt;';
  }).join('');

  // бейдж на кнопке — количество ✓
  var bad=$('#p12-bad');
  if(bad){
    if(okN===CHECK.length){bad.style.display='flex';bad.textContent='✓';bad.style.background='#10B981';}
    else if(okN&gt;0){bad.style.display='flex';bad.textContent=okN;bad.style.background='#F59E0B';}
    else{bad.style.display='none';}
  }
}

$('#p12-btn').addEventListener('click',function(){
  render();
  $('#p12-mask').classList.add('open');
});
$('#p12-close').addEventListener('click',function(){
  $('#p12-mask').classList.remove('open');
});
$('#p12-mask').addEventListener('click',function(e){
  if(e.target===this)this.classList.remove('open');
});

/* ═══════════ 7. ЭКСПОРТ И СБРОС ═══════════ */
$('#p12-export').addEventListener('click',function(){
  var out={
    app:'Pravdomer',
    version:window.PRAVDOMER_VERSION,
    exported:new Date().toISOString(),
    note:'Полный дамп локальных данных Правдомера'
  };
  for(var i=0;i&lt;localStorage.length;i++){
    var k=localStorage.key(i);
    if(k&amp;&amp;k.indexOf('pr_')===0){
      try{out[k]=JSON.parse(localStorage.getItem(k))}
      catch(e){out[k]=localStorage.getItem(k)}
    }
  }
  var blob=new Blob([JSON.stringify(out,null,2)],{type:'application/json'});
  var a=document.createElement('a');
  a.href=URL.createObjectURL(blob);
  a.download='pravdomer_full_export_'+new Date().toISOString().slice(0,10)+'.json';
  document.body.appendChild(a);a.click();a.remove();
  coach('⬇ Полный экспорт сохранён');
});

$('#p12-reset').addEventListener('click',function(){
  if(!confirm('Сбросить весь прогресс Правдомера?\nЭто удалит PR, ачивки, историю разборов и стрик.\nДействие необратимо.'))return;
  var del=[];
  for(var i=0;i&lt;localStorage.length;i++){
    var k=localStorage.key(i);
    if(k&amp;&amp;k.indexOf('pr_')===0)del.push(k);
  }
  del.forEach(function(k){localStorage.removeItem(k)});
  location.reload();
});

/* ═══════════ 8. ГОРЯЧАЯ КЛАВИША ═══════════ */
document.addEventListener('keydown',function(e){
  if(e.ctrlKey&amp;&amp;e.shiftKey&amp;&amp;e.key==='P'){
    e.preventDefault();
    render();
    $('#p12-mask').classList.add('open');
  }
});

console.log('? Правдомер: Блок 12 · Финальный подключён. Сборка v'+window.PRAVDOMER_VERSION+' завершена ✓');
})();
&lt;/script&gt;

&lt;style&gt;
#rb-btn{position:fixed;right:18px;bottom:24px;z-index:440;width:58px;height:58px;border-radius:50%;border:none;cursor:pointer;background:linear-gradient(135deg,#EF4444,#8B5CF6);color:#fff;font-size:26px;box-shadow:0 6px 24px rgba(139,92,246,.55);transition:transform .2s}
#rb-btn:hover{transform:scale(1.08)}
#rb-mask{position:fixed;inset:0;z-index:460;display:none;align-items:center;justify-content:center;background:rgba(8,6,20,.9);backdrop-filter:blur(6px)}
#rb-mask.open{display:flex}
#rb-card{width:min(680px,94vw);max-height:90vh;overflow-y:auto;border-radius:20px;padding:24px;color:#efe9dc;background:linear-gradient(180deg,#171034,#0d0a1c);border:1px solid rgba(139,92,246,.4);font-family:Inter,system-ui,sans-serif;box-shadow:0 30px 60px rgba(0,0,0,.6)}
#rb-card h3{margin:0 0 4px;font-size:20px;color:#f0d68a}
.rb-sub{font-size:12px;color:#a79ec9;margin-bottom:14px}
.rb-tabs{display:flex;gap:8px;margin-bottom:14px}
.rb-tab{flex:1;padding:10px;border-radius:12px;border:1px solid rgba(139,92,246,.35);background:rgba(139,92,246,.08);color:#c4b5fd;font-weight:700;font-size:13px;cursor:pointer}
.rb-tab.on{background:linear-gradient(135deg,#8B5CF6,#D4AF37);color:#fff;border-color:transparent}
.rb-pane{display:none}.rb-pane.on{display:block}
#rb-text{width:100%;min-height:110px;padding:12px;border-radius:12px;border:1px solid rgba(139,92,246,.4);background:rgba(139,92,246,.07);color:#efe9dc;font-size:14px;font-family:inherit;resize:vertical;box-sizing:border-box}
#rb-text:focus{outline:none;border-color:#8B5CF6}
.rb-go{width:100%;padding:13px;border:none;border-radius:12px;background:linear-gradient(135deg,#8B5CF6,#D4AF37);color:#fff;font-weight:800;font-size:15px;cursor:pointer;margin-top:10px}
.rb-res{margin-top:14px;padding:14px;border-radius:14px;background:rgba(139,92,246,.07);border:1px solid rgba(139,92,246,.3)}
.rb-score{display:flex;align-items:center;gap:14px;margin-bottom:10px}
.rb-score .num{font-size:38px;font-weight:800;color:#f0d68a}
.rb-bar{height:10px;background:rgba(255,255,255,.1);border-radius:99px;overflow:hidden;margin:8px 0}
.rb-bar i{display:block;height:100%;border-radius:99px;background:linear-gradient(90deg,#10B981,#D4AF37,#EF4444)}
.rb-flag{display:flex;gap:8px;align-items:flex-start;font-size:13px;color:#cfc8e8;background:rgba(255,255,255,.04);border:1px solid rgba(255,255,255,.08);border-radius:10px;padding:8px 10px;margin:6px 0}
.rb-flag .ic{flex-shrink:0}
#rb-canvas{width:100%;height:120px;background:rgba(0,0,0,.3);border-radius:12px;border:1px solid rgba(139,92,246,.3)}
.rb-rec-btn{width:100%;padding:13px;border:none;border-radius:12px;background:linear-gradient(135deg,#EF4444,#EC4899);color:#fff;font-weight:800;font-size:15px;cursor:pointer}
.rb-rec-btn.rec{animation:rbPulse 1s infinite}
@keyframes rbPulse{0%,100%{box-shadow:0 0 0 0 rgba(239,68,68,.5)}50%{box-shadow:0 0 0 12px rgba(239,68,68,0)}}
.rb-close{margin-top:14px;width:100%;border:1px solid rgba(139,92,246,.4);background:none;color:#c4b5fd;border-radius:12px;padding:11px;cursor:pointer;font-size:13px}
&lt;/style&gt;
&lt;button id="rb-btn" title="Реальный детектор лжи"&gt;?️&lt;/button&gt;
&lt;div id="rb-mask"&gt;&lt;div id="rb-card"&gt;
&lt;h3&gt;?️ Реальный детектор лжи&lt;/h3&gt;
&lt;div class="rb-sub"&gt;Два канала: лингвистический анализ показаний + анализ голоса. Всё считается локально в браузере.&lt;/div&gt;
&lt;div class="rb-tabs"&gt;
&lt;button class="rb-tab on" data-p="txt"&gt;? Текст&lt;/button&gt;
&lt;button class="rb-tab" data-p="voice"&gt;? Голос&lt;/button&gt;
&lt;/div&gt;
&lt;div class="rb-pane on" id="rb-p-txt"&gt;
&lt;textarea id="rb-text" placeholder="Вставь текст показания или сообщения. Чем подробнее описание событий — тем точнее анализ. Минимум 60 символов."&gt;&lt;/textarea&gt;
&lt;button class="rb-go" id="rb-go-txt"&gt;Анализировать показание&lt;/button&gt;
&lt;div class="rb-res" id="rb-txt-res" style="display:none"&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div class="rb-pane" id="rb-p-voice"&gt;
&lt;canvas id="rb-canvas" width="600" height="120"&gt;&lt;/canvas&gt;
&lt;div style="margin:10px 0;font-size:12px;color:#a79ec9" id="rb-voice-status"&gt;Готов к записи. Скажи 10–20 секунд о том, что произошло.&lt;/div&gt;
&lt;button class="rb-rec-btn" id="rb-rec-btn"&gt;? Записать голос (до 15 сек)&lt;/button&gt;
&lt;div class="rb-res" id="rb-voice-res" style="display:none"&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;button class="rb-close" id="rb-close"&gt;Закрыть&lt;/button&gt;
&lt;/div&gt;&lt;/div&gt;
&lt;script&gt;
(function(){
"use strict";
if(window._rbDone)return;window._rbDone=1;
var $=function(s){return document.querySelector(s)};
function toast(t,m){if(window.Toast&amp;&amp;Toast.show)Toast.show(t,m,'success')}
function grant(n){if(window.PR&amp;&amp;window.PR.add)window.PR.add(n)}

/* ═══ ОТКРЫТИЕ МОДАЛКИ ═══ */
$('#rb-btn').addEventListener('click',function(){$('#rb-mask').classList.add('open')});
$('#rb-close').addEventListener('click',function(){$('#rb-mask').classList.remove('open')});
$('#rb-mask').addEventListener('click',function(e){if(e.target===this)this.classList.remove('open')});
/* вкладки */
document.querySelectorAll('.rb-tab').forEach(function(t){
t.addEventListener('click',function(){
document.querySelectorAll('.rb-tab').forEach(function(x){x.classList.remove('on')});
t.classList.add('on');
document.querySelectorAll('.rb-pane').forEach(function(p){p.classList.remove('on')});
$('#rb-p-'+t.dataset.p).classList.add('on');
});
});

/* ═══════════════════════════════════════════
КАНАЛ 1 · ЛИНГВИСТИЧЕСКИЙ АНАЛИЗ ПОКАЗАНИЙ
(метод критериев достоверности показаний, CBCA)
Считается локально, без сети.
═══════════════════════════════════════════ */
/* Критерии ДОСТОВЕРНОСТИ (признаки правдивого рассказа) */
var TRUTH={
sensory:['вижу','видел','видела','слыш','слышу','запах','запахло','пахнет','аромат','вкус','вкусн','ощущ','ощуща','почувств','тёпл','тепло','холод','холодно','мягк','жёстк','гладк','шершав','мокр','сух','светло','темно','темн','ярк','свет','тень','звук','шум','голос','звучал','пахн'],
spatial:['справа','слева','справа от','слева от','рядом','напротив','за','перед','около','возле','у двери','у окна','в углу','спереди','сзади','посреди'],
temporal:['сначала','потом','после этого','затем','после','перед этим','вечером','утром','днём','вчера','сегодня','часов в','около','минут через','примерно в','к вечеру','к утру'],
unexpected:['вдруг','внезапно','неожиданно','вдруг оказалось','случайно','неожиданно оказалось'],
correction:['хотя нет','точнее','точнее говоря','точнее сказать','хотя, точнее','хотя, если точнее','точнее будет','на самом деле','точнее говоря'],
memory:['не помню','не помню точно','не помню точно','не помню точно','не помню точно','не помню точно','не помню точно','не помню точно','не помню точно','не помню точно','не помню точно'],
detail:['подробно','подробнее','подробнее','подробнее','подробнее','подробнее','подробнее','подробнее','подробнее','подробнее']
};
/* Критерии ЛОЖНОСТИ (признаки недостоверности) */
var DECEP={
overlogical:['логично','логически','по логике','по порядку','строго по порядку','строго по порядку','строго по порядку','строго по порядку','строго по порядку','строго по порядку','строго по порядку'],
overcertain:['абсолютно точно','абсолютно точно','абсолютно точно','абсолютно точно','абсолютно точно','абсолютно точно','абсолютно точно','абсолютно точно','абсолютно точно'],
vague:['что-то','что-то такое','что-то вроде','что-то типа','что-то типа','что-то вроде','что-то вроде','что-то вроде','что-то вроде','что-то вроде']
};
function countHits(text,arr){
var t=text.toLowerCase(),n=0;
arr.forEach(function(k){var i=t.indexOf(k);while(i&gt;=0){n++;i=t.indexOf(k,i+k.length)}});
return n;
}
function analyzeText(){
var text=$('#rb-text').value.trim();
if(text.length&lt;60){toast('Детектор лжи','Нужно минимум 60 символов текста');return}
var truthScore=0,decepScore=0,flags=[];
/* критерии достоверности */
var sensory=countHits(text,TRUTH.sensory);
var spatial=countHits(text,TRUTH.spatial);
var temporal=countHits(text,TRUTH.temporal);
var unexpected=countHits(text,TRUTH.unexpected);
var correction=countHits(text,TRUTH.correction);
var memory=countHits(text,TRUTH.memory);
if(sensory&gt;0){truthScore+=sensory*8;flags.push({ic:'?',t:'Сенсорные детали ('+sensory+')',d:'Описание ощущений и восприятий — признак реального переживания.'})}
if(spatial&gt;0){truthScore+=spatial*6;flags.push({ic:'?',t:'Пространственные детали ('+spatial+')',d:'Описание местоположения объектов — признак реального события.'})}
if(temporal&gt;0){truthScore+=temporal*5;flags.push({ic:'⏱',t:'Временные детали ('+temporal+')',d:'Описание последовательности событий во времени.'})}
if(unexpected&gt;0){truthScore+=unexpected*7;flags.push({ic:'❗',t:'Неожиданные осложнения ('+unexpected+')',d:'Неожиданные детали редко выдумывают.'})}
if(correction&gt;0){truthScore+=correction*8;flags.push({ic:'✏️',t:'Спонтанные поправки ('+correction+')',d:'Самоисправления — признак реального воспоминания.'})}
if(memory&gt;0){truthScore+=memory*6;flags.push({ic:'?',t:'Признание провалов памяти ('+memory+')',d:'Честные люди признают, что чего-то не помнят.'})}
/* критерии ложности */
var overlogical=countHits(text,DECEP.overlogical);
var overcertain=countHits(text,DECEP.overcertain);
var vague=countHits(text,DECEP.vague);
if(overlogical&gt;0){decepScore+=overlogical*6;flags.push({ic:'?',t:'Избыточная логичность ('+overlogical+')',d:'Слишком стройный рассказ — признак конструкции.'})}
if(overcertain&gt;0){decepScore+=overcertain*7;flags.push({ic:'?',t:'Избыточная уверенность ('+overcertain+')',d:'Абсолютная уверенность — признак вымысла.'})}
if(vague&gt;0){decepScore+=vague*5;flags.push({ic:'?',t:'Размытые формулировки ('+vague+')',d:'Размытые формулировки — признак уклончивости.'})}
/* если сенсорных деталей нет при длинном тексте — подозрительно */
if(sensory===0&amp;&amp;text.length&gt;200){decepScore+=10;flags.push({ic:'?',t:'Нет сенсорных деталей',d:'Длинный рассказ без ощущений — подозрительно.'})}
/* итог */
var raw=50+truthScore-decepScore;
var credibility=Math.max(5,Math.min(95,Math.round(raw)));
renderTextResult(credibility,flags);
grant(3);
toast('Детектор лжи','Анализ завершён · +3 PR');
}
function renderTextResult(score,flags){
var box=$('#rb-txt-res');box.style.display='block';
var verdict=score&gt;=70?'Высокая достоверность':score&gt;=45?'Средняя достоверность':'Низкая достоверность';
var html='&lt;div class="rb-score"&gt;&lt;div class="num"&gt;'+score+'&lt;/div&gt;&lt;div style="flex:1"&gt;&lt;div style="font-size:13px;font-weight:700;color:#f0d68a"&gt;'+verdict+'&lt;/div&gt;&lt;div class="rb-bar"&gt;&lt;i style="width:'+score+'%"&gt;&lt;/i&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;';
if(flags.length){html+=flags.map(function(f){return '&lt;div class="rb-flag"&gt;&lt;span class="ic"&gt;'+f.ic+'&lt;/span&gt;&lt;div&gt;&lt;b&gt;'+f.t+'&lt;/b&gt;&lt;div style="color:#a79ec9"&gt;'+f.d+'&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;'}).join('')}
else html+='&lt;div class="rb-flag"&gt;&lt;span class="ic"&gt;ℹ️&lt;/span&gt;&lt;div&gt;Выраженных маркеров не найдено.&lt;/div&gt;&lt;/div&gt;';
box.innerHTML=html;
}
$('#rb-go-txt').addEventListener('click',analyzeText);

/* ═══════════════════════════════════════════
КАНАЛ 2 · АНАЛИЗ ГОЛОСА (паузы, темп, дрожь)
Через Web Audio, всё локально.
═══════════════════════════════════════════ */
var audioCtx=null,analyser=null,mediaStream=null,mediaRecorder=null,chunks=[],recording=false,rbTimer=0;
function startRec(){
if(recording){stopRec();return}
if(!navigator.mediaDevices||!navigator.mediaDevices.getUserMedia){toast('Детектор лжи','Микрофон недоступен');return}
navigator.mediaDevices.getUserMedia({audio:true}).then(function(stream){
mediaStream=stream;
audioCtx=new (window.AudioContext||window.webkitAudioContext)();
analyser=audioCtx.createAnalyser();analyser.fftSize=2048;
var src=audioCtx.createMediaStreamSource(stream);src.connect(analyser);
if(window.MediaRecorder){
mediaRecorder=new MediaRecorder(stream);chunks=[];
mediaRecorder.ondataavailable=function(e){chunks.push(e.data)};
mediaRecorder.onstop=function(){
var blob=new Blob(chunks,{type:mediaRecorder.mimeType||'audio/webm'});
blob.arrayBuffer().then(function(ab){return audioCtx.decodeAudioData(ab)}).then(function(buffer){analyzeVoice(buffer)}).catch(function(){toast('Детектор лжи','Не удалось декодировать запись')});
};
mediaRecorder.start();
}
recording=true;startOscilloscope();
rbTimer=setTimeout(stopRec,15000);
$('#rb-rec-btn').classList.add('rec');$('#rb-rec-btn').textContent='⏹ Остановить запись';
$('#rb-voice-status').textContent='Идёт запись… говори 10–20 секунд.';
}).catch(function(){toast('Детектор лжи','Нет доступа к микрофону')});
}
function stopRec(){
recording=false;clearTimeout(rbTimer);
if(mediaRecorder&amp;&amp;mediaRecorder.state!=='inactive')mediaRecorder.stop();
if(mediaStream)mediaStream.getTracks().forEach(function(t){t.stop()});
$('#rb-rec-btn').classList.remove('rec');$('#rb-rec-btn').textContent='? Записать голос (до 15 сек)';
$('#rb-voice-status').textContent='Запись остановлена. Анализирую…';
}
function startOscilloscope(){
var cv=$('#rb-canvas'),ctx=cv.getContext('2d');
var data=new Uint8Array(analyser.fftSize);
(function loop(){
if(!recording)return;
requestAnimationFrame(loop);
analyser.getByteTimeDomainData(data);
ctx.clearRect(0,0,cv.width,cv.height);
ctx.strokeStyle='#8B5CF6';ctx.lineWidth=2;ctx.beginPath();
for(var i=0;i&lt;data.length;i+=8){
var x=i/data.length*cv.width,y=data[i]/255*cv.height;
i===0?ctx.moveTo(x,y):ctx.lineTo(x,y);
}
ctx.stroke();
})();
}
function autocorrPitch(data,off,win,sr){
var minL=Math.floor(sr/400),maxL=Math.floor(sr/60),best=0,bestL=0,e0=0;
for(var i=0;i&lt;win;i+=2){var v=data[off+i];e0+=v*v}
if(e0&lt;1e-4)return 0;
for(var lag=minL;lag&lt;maxL;lag+=2){
var s=0;for(var i2=0;i2&lt;win;i2+=4){s+=data[off+i2]*data[off+i2+lag]}
var c=s/e0;if(c&gt;best){best=c;bestL=lag}
}
return best&gt;0.3&amp;&amp;bestL&gt;0?sr/bestL:0;
}
function analyzeVoice(buffer){
var sr=buffer.sampleRate,data=buffer.getChannelData(0);
var win=Math.floor(sr*0.03),hop=Math.floor(win/2);
var rms=[];
for(var i=0;i+win&lt;data.length;i+=hop){var sm=0;for(var j=0;j&lt;win;j++){var v=data[i+j];sm+=v*v}rms.push(Math.sqrt(sm/win))}
var maxRms=0;for(var i=0;i&lt;rms.length;i++)if(rms[i]&gt;maxRms)maxRms=rms[i];
var thr=Math.max(0.003,maxRms*0.05);
/* паузы */
var pauses=0,pauseDur=0,run=0;
for(var i=0;i&lt;rms.length;i++){
if(rms[i]&lt;thr){run++}else{if(run&gt;0){var dur=run*hop/sr;if(dur&gt;=0.3){pauses++;pauseDur+=dur}run=0}}
}
/* темп (псевдослоги по пикам энергии) */
var voiced=0;for(var i=0;i&lt;rms.length;i++)if(rms[i]&gt;=thr)voiced++;
var voicedSec=voiced*hop/sr;
var peaks=0;for(var i=1;i&lt;rms.length-1;i++)if(rms[i]&gt;=thr&amp;&amp;rms[i]&gt;=rms[i-1]&amp;&amp;rms[i]&gt;rms[i+1])peaks++;
var tempo=voicedSec&gt;0?peaks/voicedSec:0;
/* дрожь (джиттер) */
var pitches=[];
for(var i=0;i+win&lt;data.length;i+=hop*2){if(rms[Math.floor(i/hop)]&gt;=thr*1.5){var f=autocorrPitch(data,i,win,sr);if(f)pitches.push(f)}}
var jitter=0;
if(pitches.length&gt;2){var mean=meanOf(pitches),ds=0;for(var i=1;i&lt;pitches.length;i++)ds+=Math.abs(pitches[i]-pitches[i-1]);jitter=(ds/(pitches.length-1))/(mean||1)}
/* индекс стресса */
var stress=20;
stress+=Math.min(30,pauses*5);
stress+=Math.min(25,Math.round(jitter*150));
if(tempo&gt;4.5)stress+=15;else if(tempo&gt;0&amp;&amp;tempo&lt;2)stress+=10;
stress=Math.max(5,Math.min(95,Math.round(stress)));
renderVoiceResult(stress,pauses,pauseDur,tempo,jitter);
drawWaveform(data);
grant(3);
toast('Детектор лжи','Анализ голоса завершён · +3 PR');
}
function meanOf(a){var s=0;for(var i=0;i&lt;a.length;i++)s+=a[i];return a.length?s/a.length:0}
function drawWaveform(data){
var cv=$('#rb-canvas'),ctx=cv.getContext('2d');
ctx.clearRect(0,0,cv.width,cv.height);
ctx.strokeStyle='#D4AF37';ctx.lineWidth=1;ctx.beginPath();
var step=Math.floor(data.length/cv.width);
for(var x=0;x&lt;cv.width;x++){var v=data[x*step]||0;var y=cv.height/2-v*cv.height*0.9;y=Math.max(2,Math.min(cv.height-2,y));x===0?ctx.moveTo(x,y):ctx.lineTo(x,y)}
ctx.stroke();
}
function renderVoiceResult(stress,pauses,pauseDur,tempo,jitter){
var box=$('#rb-voice-res');box.style.display='block';
var verdict=stress&gt;=60?'Высокий стресс в голосе':stress&gt;=35?'Умеренный стресс в голосе':'Спокойный голос';
var html='&lt;div class="rb-score"&gt;&lt;div class="num"&gt;'+stress+'&lt;/div&gt;&lt;div style="flex:1"&gt;&lt;div style="font-size:13px;font-weight:700;color:#f0d68a"&gt;'+verdict+'&lt;/div&gt;&lt;div class="rb-bar"&gt;&lt;i style="width:'+stress+'%"&gt;&lt;/i&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;';
html+='&lt;div class="rb-flag"&gt;&lt;span class="ic"&gt;⏸&lt;/span&gt;&lt;div&gt;&lt;b&gt;Пауз: '+pauses+'&lt;/b&gt; ('+pauseDur.toFixed(1)+' сек)&lt;div style="color:#a79ec9"&gt;Длинные паузы — признак обдумывания.&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;';
html+='&lt;div class="rb-flag"&gt;&lt;span class="ic"&gt;⚡&lt;/span&gt;&lt;div&gt;&lt;b&gt;Темп: '+tempo.toFixed(1)+' сл/сек&lt;/b&gt;&lt;div style="color:#a79ec9"&gt;Слишком быстрый или медленный темп — маркер напряжения.&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;';
html+='&lt;div class="rb-flag"&gt;&lt;span class="ic"&gt;〰️&lt;/span&gt;&lt;div&gt;&lt;b&gt;Дрожь голоса: '+Math.round(jitter*100)+'%&lt;/b&gt;&lt;div style="color:#a79ec9"&gt;Микроколебания тона — признак стресса.&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;';
box.innerHTML=html;
}
$('#rb-rec-btn').addEventListener('click',startRec);
console.log('?️ Правдомер: Ветка B · Реальный детектор лжи подключён');
})();
&lt;/script&gt;

&lt;style&gt;
#gc-badge{position:fixed;right:16px;top:80px;z-index:400;display:flex;align-items:center;gap:8px;padding:8px 14px;border-radius:999px;background:linear-gradient(135deg,rgba(212,175,55,.18),rgba(139,92,246,.18));border:1px solid var(--line);backdrop-filter:blur(8px);cursor:pointer;transition:.2s}
#gc-badge:hover{transform:scale(1.04);box-shadow:0 0 18px rgba(212,175,55,.35)}
#gc-badge .gc-lv{display:inline-flex;align-items:center;justify-content:center;width:30px;height:30px;border-radius:50%;background:linear-gradient(135deg,var(--gold),var(--violet));color:#fff;font-weight:800;font-size:14px}
#gc-badge .gc-pr{font-weight:800;color:var(--gold)}
#gc-badge .gc-lbl{font-size:10px;color:var(--mut);text-transform:uppercase;letter-spacing:.5px}
#gc-mask{position:fixed;inset:0;z-index:430;display:none;align-items:center;justify-content:center;background:rgba(5,3,18,.9);backdrop-filter:blur(6px)}
#gc-mask.open{display:flex}
#gc-card{width:min(520px,94vw);max-height:88vh;overflow-y:auto;border-radius:20px;padding:22px;background:linear-gradient(180deg,#171034,#0d0a1c);border:1px solid rgba(212,175,55,.4);box-shadow:0 30px 60px rgba(0,0,0,.6);color:var(--ink)}
#gc-card h3{font-size:20px;color:var(--gold);margin-bottom:4px}
.gc-sub{font-size:12px;color:var(--mut);margin-bottom:16px}
.gc-stat{display:flex;justify-content:space-between;align-items:center;padding:10px 12px;border-radius:12px;background:rgba(255,255,255,.04);border:1px solid rgba(255,255,255,.08);margin-bottom:8px}
.gc-stat .l{font-size:12px;color:var(--mut)}
.gc-stat .v{font-weight:800;color:var(--gold)}
.gc-bar{height:8px;background:rgba(255,255,255,.08);border-radius:99px;overflow:hidden;margin:6px 0 14px}
.gc-bar i{display:block;height:100%;background:linear-gradient(90deg,var(--gold),var(--violet));border-radius:99px;transition:width .5s}
.gc-achv{display:grid;grid-template-columns:1fr 1fr;gap:8px;margin-top:12px}
.gc-ach{padding:10px;border-radius:12px;border:1px solid rgba(255,255,255,.08);background:rgba(255,255,255,.03);font-size:12px}
.gc-ach.got{border-color:rgba(212,175,55,.5);background:rgba(212,175,55,.1)}
.gc-ach .ic{font-size:20px}
.gc-ach .nm{font-weight:700;color:var(--ink);font-size:12px;margin-top:4px}
.gc-ach .ds{font-size:10px;color:var(--mut)}
.gc-ach.locked{opacity:.4;filter:grayscale(1)}
#gc-close{margin-top:16px;width:100%;padding:11px;border-radius:12px;border:1px solid var(--line);background:none;color:var(--gold);cursor:pointer;font-weight:700}
.gc-hist-item{padding:8px 12px;border-radius:10px;background:rgba(255,255,255,.04);border:1px solid rgba(255,255,255,.08);margin-bottom:6px;font-size:12px;color:var(--mut)}
.gc-hist-item b{color:var(--gold)}
&lt;/style&gt;
&lt;div id="gc-badge"&gt;
&lt;span class="gc-lv" id="gc-lv-num"&gt;1&lt;/span&gt;
&lt;span style="display:flex;flex-direction:column"&gt;&lt;span class="gc-pr"&gt;&lt;span id="gc-pr-num"&gt;0&lt;/span&gt; PR&lt;/span&gt;&lt;span class="gc-lbl" id="gc-lv-name"&gt;Новичок&lt;/span&gt;&lt;/span&gt;
&lt;/div&gt;
&lt;div id="gc-mask"&gt;&lt;div id="gc-card"&gt;
&lt;h3&gt;? Прогресс детектива&lt;/h3&gt;
&lt;div class="gc-sub"&gt;Уровни, ачивки и альбом разоблачений&lt;/div&gt;
&lt;div class="gc-stat"&gt;&lt;span class="l"&gt;Очки правды (PR)&lt;/span&gt;&lt;span class="v" id="gc-m-pr"&gt;0&lt;/span&gt;&lt;/div&gt;
&lt;div class="gc-stat"&gt;&lt;span class="l"&gt;Уровень&lt;/span&gt;&lt;span class="v" id="gc-m-lv"&gt;1 · Новичок&lt;/span&gt;&lt;/div&gt;
&lt;div class="gc-bar"&gt;&lt;i id="gc-lv-bar" style="width:0%"&gt;&lt;/i&gt;&lt;/div&gt;
&lt;div class="gc-stat"&gt;&lt;span class="l"&gt;? Серия дней&lt;/span&gt;&lt;span class="v" id="gc-m-streak"&gt;0&lt;/span&gt;&lt;/div&gt;
&lt;div class="gc-stat"&gt;&lt;span class="l"&gt;Разоблачений всего&lt;/span&gt;&lt;span class="v" id="gc-m-total"&gt;0&lt;/span&gt;&lt;/div&gt;
&lt;div class="gc-achv" id="gc-achv"&gt;&lt;/div&gt;
&lt;h3 style="font-size:15px;margin-top:18px;color:var(--gold)"&gt;? Альбом разоблачений&lt;/h3&gt;
&lt;div id="gc-album"&gt;&lt;/div&gt;
&lt;button id="gc-close"&gt;Закрыть&lt;/button&gt;
&lt;/div&gt;&lt;/div&gt;
&lt;script&gt;
(function(){
"use strict";
if(window._prGameDone)return;window._prGameDone=1;
var $=function(s){return document.querySelector(s)};
function g(k,d){try{var v=localStorage.getItem(k);return v==null?d:JSON.parse(v)}catch(e){return d}}
function s(k,v){try{localStorage.setItem(k,JSON.stringify(v))}catch(e){}}
/* ── уровни ── */
var LEVELS=[[0,'Новичок'],[20,'Наблюдатель'],[50,'Аналитик'],[100,'Профайлер'],[200,'Мастер правды']];
function levelOf(pr){var lv=LEVELS[0];for(var i=0;i&lt;LEVELS.length;i++){if(pr&gt;=LEVELS[i][0])lv=LEVELS[i]}return lv}
function nextLevel(pr){for(var i=0;i&lt;LEVELS.length;i++){if(LEVELS[i][0]&gt;pr)return LEVELS[i]}return null}
/* ── объект PR (используется Блоком 2) ── */
window.PR={
pr:g('pr_points',0),
add:function(n){this.pr+=n;s('pr_points',this.pr);this.render();checkAch();},
render:function(){
var lv=levelOf(this.pr),nx=nextLevel(this.pr);
var ln=$('#gc-lv-num');if(ln)ln.textContent=lv[0];
var pn=$('#gc-pr-num');if(pn)pn.textContent=this.pr;
var ln2=$('#gc-lv-name');if(ln2)ln2.textContent=lv[1];
var ml=$('#gc-m-pr');if(ml)ml.textContent=this.pr;
var mlv=$('#gc-m-lv');if(mlv)mlv.textContent=lv[0]+' · '+lv[1];
var bar=$('#gc-lv-bar');
if(bar){if(nx){var lo=lv[0],hi=nx[0];bar.style.width=Math.round((this.pr-lo)/(hi-lo)*100)+'%';}else bar.style.width='100%';}
}
};
/* ── стрик ── */
function today(){var d=new Date();return d.getFullYear()+'-'+(d.getMonth()+1)+'-'+d.getDate()}
(function(){
var st=g('pr_streak',{d:0,last:''});var t=today();
if(st.last!==t){var y=new Date(Date.now()-864e5);var yd=y.getFullYear()+'-'+(y.getMonth()+1)+'-'+y.getDate();
if(st.last===yd)st.d=st.d+1;else st.d=1;st.last=t;s('pr_streak',st);}
})();
/* ── ачивки ── */
var ACH=[
{id:'first',ic:'?',nm:'Первый анализ',ds:'Проанализируй первый текст',c:function(){return g('pr_hist',[]).length&gt;=1}},
{id:'ten',ic:'?',nm:'Десять разоблачений',ds:'10 анализов',c:function(){return g('pr_hist',[]).length&gt;=10}},
{id:'liar',ic:'?',nm:'Лжец пойман',ds:'Найди текст с низкой правдивостью (≤40)',c:function(){var h=g('pr_hist',[]);for(var i=0;i&lt;h.length;i++)if(h[i].l==='lie'&amp;&amp;h[i].s&lt;=40)return true;return false}},
{id:'manip',ic:'?',nm:'Манипулятор раскрыт',ds:'Найди манипуляцию (≥55)',c:function(){var h=g('pr_hist',[]);for(var i=0;i&lt;h.length;i++)if(h[i].l==='man'&amp;&amp;h[i].s&gt;=55)return true;return false}},
{id:'pr50',ic:'?',nm:'Полсотни правды',ds:'Набери 50 PR',c:function(){return g('pr_points',0)&gt;=50}},
{id:'streak3',ic:'?',nm:'Три дня подряд',ds:'Серия из 3 дней',c:function(){return g('pr_streak',{d:0}).d&gt;=3}}
];
function checkAch(){
var got=g('pr_ach',{});
ACH.forEach(function(a){
if(!got[a.id]&amp;&amp;a.c()){got[a.id]=1;s('pr_ach',got);}
});
}
function renderAch(){
var got=g('pr_ach',{});var box=$('#gc-achv');if(!box)return;
box.innerHTML=ACH.map(function(a){
var has=!!got[a.id];
return '&lt;div class="gc-ach'+(has?'':' locked')+'"&gt;&lt;span class="ic"&gt;'+a.ic+'&lt;/span&gt;&lt;div class="nm"&gt;'+a.nm+'&lt;/div&gt;&lt;div class="ds"&gt;'+a.ds+'&lt;/div&gt;&lt;/div&gt;';
}).join('');
}
function renderAlbum(){
var h=g('pr_hist',[]);var box=$('#gc-album');if(!box)return;
if(!h.length){box.innerHTML='&lt;div class="gc-hist-item"&gt;Пока пусто. Сделай первый анализ.&lt;/div&gt;';return}
box.innerHTML=h.slice(0,10).map(function(x){
var d=new Date(x.t);var dt=d.getDate()+'.'+(d.getMonth()+1);
return '&lt;div class="gc-hist-item"&gt;'+(x.l==='lie'?'?':'?')+' &lt;b&gt;Индекс '+x.s+'&lt;/b&gt; · '+dt+'&lt;/div&gt;';
}).join('');
}
function openGc(){$('#gc-mask').classList.add('open');window.PR.render();renderAch();renderAlbum();
var st=g('pr_streak',{d:0});var stEl=$('#gc-m-streak');if(stEl)stEl.textContent=st.d;
var tot=g('pr_hist',[]).length;var tEl=$('#gc-m-total');if(tEl)tEl.textContent=tot;
}
$('#gc-badge').addEventListener('click',openGc);
$('#gc-close').addEventListener('click',function(){$('#gc-mask').classList.remove('open')});
$('#gc-mask').addEventListener('click',function(e){if(e.target===this)this.classList.remove('open')});
window.PR.render();checkAch();
console.log('? Правдомер: Блок 3 · Геймкор подключён');
})();
&lt;/script&gt;

&lt;style&gt;
.lm-card{background:linear-gradient(180deg,#1d1533,#171034);border:1px solid rgba(212,175,55,.28);border-radius:18px;padding:22px;margin:0 auto 28px;max-width:960px;box-shadow:0 10px 30px rgba(0,0,0,.35)}
.lm-title{font-size:20px;font-weight:800;color:#f0d68a;margin-bottom:6px}
.lm-sub{font-size:13px;color:#a79ec9;margin-bottom:16px}
.lm-drop{border:2px dashed rgba(212,175,55,.4);border-radius:14px;padding:28px;text-align:center;color:#a79ec9;cursor:pointer;transition:.2s}
.lm-drop:hover{border-color:#D4AF37;background:rgba(212,175,55,.06);color:#f0d68a}
.lm-drop .big{font-size:40px;display:block;margin-bottom:8px}
.lm-preview{margin-top:16px;text-align:center}
.lm-preview canvas{max-width:100%;max-height:280px;border-radius:12px;border:1px solid rgba(212,175,55,.3)}
.lm-metrics{display:grid;grid-template-columns:repeat(auto-fit,minmax(140px,1fr));gap:10px;margin-top:16px}
.lm-metric{background:rgba(139,92,246,.08);border:1px solid rgba(139,92,246,.25);border-radius:12px;padding:12px;text-align:center}
.lm-metric .v{font-size:20px;font-weight:800;color:#f0d68a}
.lm-metric .l{font-size:11px;color:#a79ec9;text-transform:uppercase;letter-spacing:.5px}
.lm-scorebar{height:10px;background:rgba(255,255,255,.08);border-radius:999px;overflow:hidden;margin:12px 0}
.lm-scorebar i{display:block;height:100%;border-radius:999px;background:linear-gradient(90deg,#10B981,#F59E0B,#EF4444);transition:width .8s}
.lm-verdict{font-size:14px;color:#cfc8e8;line-height:1.6;margin-top:8px}
.lm-note{font-size:11px;color:#8a84a8;margin-top:12px;font-style:italic}
.lm-scen{display:grid;grid-template-columns:repeat(auto-fit,minmax(200px,1fr));gap:12px;margin-bottom:18px}
.lm-scen-card{border:1px solid rgba(212,175,55,.3);border-radius:14px;padding:16px;cursor:pointer;text-align:center;transition:.2s;background:rgba(212,175,55,.05)}
.lm-scen-card:hover{border-color:#D4AF37;background:rgba(212,175,55,.1);transform:translateY(-2px)}
.lm-scen-card .ic{font-size:32px;display:block;margin-bottom:8px}
.lm-scen-card .nm{font-weight:700;color:#efe9dc;font-size:14px}
.lm-scen-card .d{font-size:11px;color:#a79ec9;margin-top:4px}
.lm-bubble{background:rgba(239,68,68,.1);border:1px solid rgba(239,68,68,.35);border-radius:14px 14px 14px 4px;padding:14px;margin:12px 0;color:#fca5a5;font-size:14px;line-height:1.6}
.lm-bubble .who{font-size:11px;color:#ef4444;font-weight:700;text-transform:uppercase;letter-spacing:.5px;margin-bottom:6px}
.lm-opts{display:flex;flex-direction:column;gap:8px}
.lm-opt{padding:12px 14px;border-radius:12px;border:1px solid rgba(255,255,255,.15);background:rgba(255,255,255,.04);color:#cfc8e8;font-size:13px;cursor:pointer;text-align:left;transition:.2s}
.lm-opt:hover{border-color:#D4AF37;background:rgba(212,175,55,.08)}
.lm-opt.good{border-color:#10B981;background:rgba(16,185,129,.12);color:#6ee7b7}
.lm-opt.bad{border-color:#EF4444;background:rgba(239,68,68,.12);color:#fca5a5}
.lm-explain{font-size:12px;color:#a79ec9;margin:8px 0 16px;padding:10px 12px;border-left:3px solid #D4AF37;background:rgba(212,175,55,.06);border-radius:0 8px 8px 0;line-height:1.5}
.lm-progress{display:flex;gap:6px;margin-bottom:16px}
.lm-dot{width:28px;height:6px;border-radius:99px;background:rgba(255,255,255,.12)}
.lm-dot.done{background:#10B981}
.lm-dot.cur{background:#D4AF37}
.lm-result{text-align:center;padding:20px}
.lm-result .big{font-size:44px;display:block;margin-bottom:8px}
.lm-result .score{font-size:32px;font-weight:800;color:#f0d68a}
.lm-btn{padding:11px 22px;border-radius:12px;border:none;cursor:pointer;font-weight:700;font-size:13px;background:linear-gradient(135deg,#8B5CF6,#D4AF37);color:#fff;margin-top:12px}
.lm-btn.ghost{background:none;border:1px solid rgba(255,255,255,.2);color:#cfc8e8}
&lt;/style&gt;

&lt;section class="a-section" id="sec-photo" style="max-width:960px;margin:0 auto 28px"&gt;
&lt;div class="lm-card"&gt;
&lt;div class="lm-title"&gt;? Фото-детектор&lt;/div&gt;
&lt;div class="lm-sub"&gt;Загрузи изображение — проанализируем метаданные, яркость, контраст и оценим «подозрительность» (тренажёр, не реальный детектор).&lt;/div&gt;
&lt;div class="lm-drop" id="lm-drop"&gt;
&lt;span class="big"&gt;?&lt;/span&gt;
Нажми или перетащи изображение сюда
&lt;/div&gt;
&lt;input type="file" id="lm-file" accept="image/*" style="display:none" /&gt;
&lt;div class="lm-preview"&gt;&lt;canvas id="lm-canvas" style="display:none"&gt;&lt;/canvas&gt;&lt;/div&gt;
&lt;div class="lm-metrics" id="lm-metrics"&gt;&lt;/div&gt;
&lt;div class="lm-scorebar"&gt;&lt;i id="lm-scorebar" style="width:0%"&gt;&lt;/i&gt;&lt;/div&gt;
&lt;div class="lm-verdict" id="lm-verdict"&gt;&lt;/div&gt;
&lt;div class="lm-note"&gt;Это тренажёр критического мышления, а не реальный детектор подделок. Он учит замечать детали, а не выносит вердикты.&lt;/div&gt;
&lt;/div&gt;
&lt;/section&gt;

&lt;section class="a-section" id="sec-call" style="max-width:960px;margin:0 auto 28px"&gt;
&lt;div class="lm-card"&gt;
&lt;div class="lm-title"&gt;? Звонок-детектор&lt;/div&gt;
&lt;div class="lm-sub"&gt;Тренажёр против телефонных мошенников. Отвечай на реплики — мы оценим устойчивость к манипуляциям.&lt;/div&gt;
&lt;div id="lm-call-body"&gt;
&lt;div class="lm-scen" id="lm-scen"&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/section&gt;

&lt;script&gt;
(function(){
"use strict";
var $=function(s){return document.querySelector(s)};
function g(k,d){try{var v=localStorage.getItem(k);return v==null?d:JSON.parse(v)}catch(e){return d}}
function s(k,v){try{localStorage.setItem(k,JSON.stringify(v))}catch(e){}}
function toast(t,m){if(window.Toast&amp;&amp;Toast.show)Toast.show(t,m,'success');else if(window.console)console.log(t,m)}
function addPR(n){if(window.PR&amp;&amp;typeof window.PR.add==='function'){try{window.PR.add(n)}catch(e){}}}

/* ═══ ФОТО-ДЕТЕКТОР ═══ */
var drop=$('#lm-drop'),file=$('#lm-file'),cv=$('#lm-canvas'),ctx=cv?cv.getContext('2d'):null;
if(drop&amp;&amp;file){
drop.addEventListener('click',function(){file.click()});
drop.addEventListener('dragover',function(e){e.preventDefault();drop.style.borderColor='#D4AF37'});
drop.addEventListener('dragleave',function(){drop.style.borderColor='rgba(212,175,55,.4)'});
drop.addEventListener('drop',function(e){e.preventDefault();drop.style.borderColor='rgba(212,175,55,.4)';if(e.dataTransfer.files[0])handleImg(e.dataTransfer.files[0])});
file.addEventListener('change',function(){if(file.files[0])handleImg(file.files[0])});
}
function handleImg(f){
if(!f.type.match(/image.*/)){toast('Фото','Это не изображение');return}
var r=new FileReader();
r.onload=function(e){
var img=new Image();
img.onload=function(){drawAndAnalyze(img,f.name,f.size,f.type)};
img.src=e.target.result;
};
r.readAsDataURL(f);
}
function drawAndAnalyze(img,name,size,type){
if(!ctx)return;
var maxW=480,sc=Math.min(1,maxW/img.width);
var w=Math.round(img.width*sc),h=Math.round(img.height*sc);
cv.width=w;cv.height=h;ctx.drawImage(img,0,0,w,h);
cv.style.display='block';
var d=ctx.getImageData(0,0,w,h).data;
var sum=0,sumsq=0,n=w*h;
for(var i=0;i&lt;d.length;i+=4){
var lum=0.299*d[i]+0.587*d[i+1]+0.114*d[i+2];
sum+=lum;sumsq+=lum*lum;
}
var mean=sum/n;
var variance=sumsq/n-mean*mean;
var contrast=Math.sqrt(Math.max(0,variance));
var mp=((img.width*img.height)/1e6).toFixed(2);
var bright=Math.round(mean/255*100);
/* псевдо-оценка подозрительности (тренажёр) */
var susp=20;
if(contrast&gt;90)susp+=20;
if(bright&gt;92||bright&lt;8)susp+=15;
if(img.width===img.height)susp+=10;
if(mp&lt;0.3)susp+=15;
susp=Math.min(95,susp);
var mc=$('#lm-metrics');
if(mc)mc.innerHTML=
'&lt;div class="lm-metric"&gt;&lt;div class="v"&gt;'+img.width+'×'+img.height+'&lt;/div&gt;&lt;div class="l"&gt;Разрешение&lt;/div&gt;&lt;/div&gt;'+
'&lt;div class="lm-metric"&gt;&lt;div class="v"&gt;'+mp+' МП&lt;/div&gt;&lt;div class="l"&gt;Мегапиксели&lt;/div&gt;&lt;/div&gt;'+
'&lt;div class="lm-metric"&gt;&lt;div class="v"&gt;'+bright+'%&lt;/div&gt;&lt;div class="l"&gt;Яркость&lt;/div&gt;&lt;/div&gt;'+
'&lt;div class="lm-metric"&gt;&lt;div class="v"&gt;'+contrast.toFixed(0)+'&lt;/div&gt;&lt;div class="l"&gt;Контраст&lt;/div&gt;&lt;/div&gt;';
var bar=$('#lm-scorebar');if(bar)bar.style.width=susp+'%';
var v=$('#lm-verdict');
if(v)v.innerHTML='Индекс подозрительности: &lt;b style="color:#f0d68a"&gt;'+susp+'/100&lt;/b&gt;. '+
(susp&lt;35?'Изображение выглядит обычным — явных признаков редактирования не видно.':
susp&lt;65?'Есть признаки, на которые стоит обратить внимание (контраст, яркость). Присмотрись к деталям.':
'Высокая подозрительность: резкие аномалии яркости/контраста. Проверь источник изображения.');
addPR(2);
toast('Фото-детектор','Анализ завершён · +2 PR');
}

/* ═══ ЗВОНОК-ДЕТЕКТОР ═══ */
var SCEN=[
{id:'bank',ic:'?',nm:'«Служба банка»',d:'Классика: «ваша карта заблокирована»'},
{id:'rel',ic:'?',nm:'«Родственник в беде»',d:'«Я попал в ДТП, срочно нужны деньги»'},
{id:'deliv',ic:'?',nm:'«Полиция/доставка»',d:'«Ваша посылка задержана» / «вы свидетель»'}
];
var DIAL={
bank:[
{t:'Здравствуйте! Это служба безопасности банка. По вашей карте идёт подозрительная операция. Вы её подтверждаете?',o:[
{t:'Да, конечно, помогите скорее!',safe:false,x:'Мошенники давят срочностью. Настоящий банк никогда не просит данных по звонку.'},
{t:'Я перезвоню в банк сам по номеру с карты.',safe:true,x:'Верно! Всегда перезванивай по официальному номеру с обратной стороны карты.'},
{t:'А вы кто вообще такой?',safe:true,x:'Хорошо задать вопрос, но главное — не давать данные и перезвонить самому.'}]},
{t:'Сейчас назовите код из СМС, чтобы мы отменили операцию!',o:[
{t:'Хорошо, код 4527…',safe:false,x:'Код из СМС нельзя называть НИКОГДА. Это ключ к деньгам.'},
{t:'Код из СМС я никому не называю. До свидания.',safe:true,x:'Идеально! Код из СМС — только для личного кабинета, не для звонков.'}]},
{t:'Если не подтвердите сейчас — деньги спишут безвозвратно!',o:[
{t:'Быстрее, что делать?!',safe:false,x:'Срочность — главный приём мошенников. Не поддавайся панике.'},
{t:'Я сам проверю счёт в приложении банка.',safe:true,x:'Верно! Проверяй всё сам в официальном приложении или по номеру банка.'}]}
],
rel:[
{t:'Алло… я попал в аварию, срочно нужны деньги, переведи прямо сейчас!',o:[
{t:'Боже! Куда переводить?!',safe:false,x:'Мошенники играют на эмоциях. Сначала проверь, действительно ли это твой близкий.'},
{t:'Я сейчас перезвоню тебе на твой обычный номер.',safe:true,x:'Верно! Перезвони на знакомый номер или спроси то, что знает только близкий человек.'}]},
{t:'Не клади трубку! Мне очень плохо, нужна помощь немедленно!',o:[
{t:'Хорошо, не кладу, говори куда платить.',safe:false,'x':'«Не клади трубку» — классический приём, чтобы не дать проверить информацию.'},
{t:'Я перезвоню тебе на твой номер и вызову помощь.',safe:true,x:'Верно! Настоящая помощь — перезвонить самому и связаться с близкими.'}]},
{t:'Только никому не говори, это секрет!',o:[
{t:'Хорошо, никому не скажу.',safe:false,x:'«Никому не говори» — признак мошенничества. Мошенники боятся, что их раскроют.'},
{t:'Я посоветуюсь с семьёй и перезвоню.',safe:true,x:'Верно! Совет с близкими разрушает схему мошенников.'}]}
],
deliv:[
{t:'Это полиция. Вы проходите свидетелем по делу. Нужны ваши данные.',o:[
{t:'Хорошо, спрашивайте.',safe:false,x:'Полиция не запрашивает данные по телефону. Предложите явиться лично.'},
{t:'Я приду в участок лично, по повестке.',safe:true,x:'Верно! Настоящие органы действуют официально, не по звонку.'}]},
{t:'Ваша посылка задержана на таможне. Оплатите пошлину картой.',o:[
{t:'Хорошо, диктую номер карты.',safe:false,x:'Никогда не диктуй данные карты по телефону. Это прямой путь к потере денег.'},
{t:'Я проверю посылку на сайте доставки сам.',safe:true,x:'Верно! Проверяй статус посылки только на официальном сайте или в приложении.'}]},
{t:'Если не оплатите сейчас — посылку уничтожат!',o:[
{t:'Скорее, что нужно сделать?!',safe:false,x:'Срочность + угроза = классика мошенников. Не поддавайся.'},
{t:'Я уточню в службе доставки сам.',safe:true,x:'Верно! Всегда проверяй информацию у источника, а не на слово.'}]}
]
};
var body=$('#lm-call-body'),scenEl=$('#lm-scen');
if(scenEl){
scenEl.innerHTML=SCEN.map(function(s){
return '&lt;div class="lm-scen-card" data-id="'+s.id+'"&gt;&lt;span class="ic"&gt;'+s.ic+'&lt;/span&gt;&lt;div class="nm"&gt;'+s.nm+'&lt;/div&gt;&lt;div class="d"&gt;'+s.d+'&lt;/div&gt;&lt;/div&gt;';
}).join('');
scenEl.addEventListener('click',function(e){
var card=e.target.closest('.lm-scen-card');
if(card)startCall(card.dataset.id);
});
}
var cur=null,step=0,score=0;
function startCall(id){
cur=DIAL[id];step=0;score=0;
if(body)body.innerHTML='&lt;div id="lm-call-inner"&gt;&lt;/div&gt;';
renderStep();
}
function renderStep(){
if(step&gt;=cur.length){finishCall();return}
var st=cur[step],inner=$('#lm-call-inner');
if(!inner)return;
var dots='';
for(var i=0;i&lt;cur.length;i++){
dots+='&lt;div class="lm-dot'+(i&lt;step?' done':i===step?' cur':'')+'"&gt;&lt;/div&gt;';
}
var opts=st.o.map(function(o,i){return '&lt;button class="lm-opt" data-i="'+i+'"&gt;'+o.t+'&lt;/button&gt;'}).join('');
inner.innerHTML='&lt;div class="lm-progress"&gt;'+dots+'&lt;/div&gt;'+
'&lt;div class="lm-bubble"&gt;&lt;div class="who"&gt;? Мошенник&lt;/div&gt;'+st.t+'&lt;/div&gt;'+
'&lt;div class="lm-opts"&gt;'+opts+'&lt;/div&gt;';
inner.querySelectorAll('.lm-opt').forEach(function(b){
b.addEventListener('click',function(){
var o=st.o[+b.dataset.i];
b.classList.add(o.safe?'good':'bad');
if(o.safe)score+=10;
var ex=document.createElement('div');ex.className='lm-explain';ex.textContent=o.x;
b.parentNode.appendChild(ex);
var all=b.parentNode.querySelectorAll('.lm-opt');
all.forEach(function(x){x.disabled=true});
setTimeout(function(){step++;renderStep()},2200);
});
});
}
function finishCall(){
var inner=$('#lm-call-inner');if(!inner)return;
var max=cur.length*10;
var pct=Math.round(score/max*100);
var icon=pct&gt;=80?'?️':pct&gt;=50?'?':'⚠️';
var msg=pct&gt;=80?'Отлично! Ты не поддался на манипуляции.':
pct&gt;=50?'Неплохо, но были моменты, где можно было попасться.':'Будь осторожен — мошенники могут тебя обмануть.';
inner.innerHTML='&lt;div class="lm-result"&gt;&lt;span class="big"&gt;'+icon+'&lt;/span&gt;&lt;div class="score"&gt;'+pct+'/100&lt;/div&gt;&lt;p style="color:#cfc8e8;margin-top:8px"&gt;'+msg+'&lt;/p&gt;&lt;button class="lm-btn" id="lm-again"&gt;Пройти ещё раз&lt;/button&gt; &lt;button class="lm-btn ghost" id="lm-back"&gt;К сценариям&lt;/button&gt;&lt;/div&gt;';
addPR(Math.max(2,Math.round(pct/20)));
toast('Звонок-детектор','Устойчивость: '+pct+'/100 · PR начислено');
var again=$('#lm-again');if(again)again.addEventListener('click',function(){startCall(curId)});
var back=$('#lm-back');if(back)back.addEventListener('click',function(){body.innerHTML='&lt;div class="lm-scen" id="lm-scen"&gt;&lt;/div&gt;';scenEl=$('#lm-scen');buildScen()});
}
var curId='bank';
function buildScen(){
if(!scenEl)return;
scenEl.innerHTML=SCEN.map(function(s){
return '&lt;div class="lm-scen-card" data-id="'+s.id+'"&gt;&lt;span class="ic"&gt;'+s.ic+'&lt;/span&gt;&lt;div class="nm"&gt;'+s.nm+'&lt;/div&gt;&lt;div class="d"&gt;'+s.d+'&lt;/div&gt;&lt;/div&gt;';
}).join('');
scenEl.addEventListener('click',function(e){
var card=e.target.closest('.lm-scen-card');
if(card){curId=card.dataset.id;startCall(curId)}
});
}
/* добавляем чипы навигации, если контейнер существует */
var nav=$('#chips')||$('#chipbar');
if(nav){
var chips=[['?','Фото','sec-photo'],['?','Звонок','sec-call']];
chips.forEach(function(ch){
var b=document.createElement('button');
b.className='a-chip';b.textContent=ch[1];
b.addEventListener('click',function(){var el=document.getElementById(ch[2]);if(el)el.scrollIntoView({behavior:'smooth'})});
nav.appendChild(b);
});
}
/* начисляем за просмотр секций */
if(window.PR){
if(document.getElementById('sec-photo')){/* уже начисляется в анализе */}
}
console.log('✅ Блок 6: Фото-детектор + Звонок-детектор подключены');
})();
&lt;/script&gt;

&lt;style&gt;
#cs-btn{position:fixed;left:16px;bottom:392px;z-index:400;width:52px;height:52px;border-radius:50%;border:none;cursor:pointer;background:linear-gradient(135deg,#F59E0B,#EF4444);color:#fff;font-size:22px;box-shadow:0 6px 20px rgba(245,158,11,.45);transition:transform .2s}
#cs-btn:hover{transform:scale(1.1)}
@media(min-width:1000px){#cs-btn{bottom:200px;left:16px}}
#cs-mask{position:fixed;inset:0;z-index:423;display:none;align-items:center;justify-content:center;background:rgba(8,5,15,.88);backdrop-filter:blur(6px)}
#cs-mask.open{display:flex}
#cs-card{width:min(680px,94vw);max-height:90vh;overflow-y:auto;border-radius:18px;padding:22px;color:#efe9dc;background:linear-gradient(180deg,#1a1208,#0d0a06);border:1px solid rgba(245,158,11,.4);font-family:Inter,system-ui,sans-serif;box-shadow:0 30px 60px rgba(0,0,0,.6)}
#cs-card h3{margin:0 0 4px;font-size:20px;color:#fbd38d}
.cs-sub{font-size:12px;color:#a8987a;margin-bottom:14px}
.cs-tabs{display:flex;gap:8px;margin-bottom:14px}
.cs-tab{flex:1;padding:9px;border-radius:10px;border:1px solid rgba(245,158,11,.35);background:rgba(245,158,11,.08);color:#fbd38d;font-weight:700;font-size:13px;cursor:pointer}
.cs-tab.on{background:linear-gradient(135deg,#F59E0B,#EF4444);color:#fff;border-color:transparent}
.cs-pane{display:none}.cs-pane.on{display:block}
/* библиотека */
.cs-cats{display:flex;gap:6px;flex-wrap:wrap;margin-bottom:12px}
.cs-cat{padding:6px 12px;border-radius:999px;border:1px solid rgba(245,158,11,.3);background:rgba(245,158,11,.06);color:#e8c88a;font-size:11px;font-weight:600;cursor:pointer;transition:.2s}
.cs-cat.on{background:linear-gradient(135deg,#F59E0B,#EF4444);color:#fff;border-color:transparent}
.cs-list{display:flex;flex-direction:column;gap:8px;max-height:340px;overflow-y:auto}
.cs-case{border:1px solid rgba(245,158,11,.25);border-radius:12px;padding:12px;background:rgba(245,158,11,.05);cursor:pointer;transition:.2s}
.cs-case:hover{border-color:#F59E0B;background:rgba(245,158,11,.1);transform:translateY(-2px)}
.cs-case.done{opacity:.55;border-color:rgba(16,185,129,.5)}
.cs-case .h{display:flex;align-items:center;gap:8px;margin-bottom:4px}
.cs-case .ic{font-size:18px}
.cs-case .t{font-size:13px;font-weight:700;color:#fbd38d;flex:1}
.cs-case .diff{font-size:10px;padding:2px 8px;border-radius:999px;font-weight:700}
.cs-case .diff.easy{background:rgba(16,185,129,.2);color:#6ee7b7}
.cs-case .diff.med{background:rgba(245,158,11,.2);color:#fcd34d}
.cs-case .diff.hard{background:rgba(239,68,68,.2);color:#fca5a5}
.cs-case .done-badge{color:#6ee7b7;font-size:14px}
/* разбор кейса */
.cs-caseview{display:none}
.cs-caseview.on{display:block}
.cs-text{background:rgba(255,255,255,.04);border:1px solid rgba(245,158,11,.2);border-radius:12px;padding:16px;font-size:14px;line-height:1.7;color:#e8dcc8;margin-bottom:14px;white-space:pre-wrap}
.cs-flags{display:flex;flex-direction:column;gap:6px;margin-bottom:14px}
.cs-flag{display:flex;align-items:center;gap:10px;padding:10px 12px;border-radius:10px;border:1px solid rgba(255,255,255,.12);background:rgba(255,255,255,.04);cursor:pointer;font-size:13px;color:#cfc8e8;transition:.2s}
.cs-flag:hover{border-color:#F59E0B;background:rgba(245,158,11,.08)}
.cs-flag input{accent-color:#F59E0B;width:16px;height:16px;cursor:pointer}
.cs-flag.correct{border-color:rgba(16,185,129,.6);background:rgba(16,185,129,.12)}
.cs-flag.wrong{border-color:rgba(239,68,68,.6);background:rgba(239,68,68,.12)}
.cs-submit{width:100%;padding:12px;border:none;border-radius:12px;background:linear-gradient(135deg,#F59E0B,#EF4444);color:#fff;font-weight:800;font-size:14px;cursor:pointer}
.cs-result{margin-top:12px;padding:14px;border-radius:12px;border:1px solid rgba(245,158,11,.3);background:rgba(245,158,11,.08)}
.cs-result .score{font-size:28px;font-weight:800;color:#fbd38d}
.cs-back{margin-top:10px;width:100%;padding:10px;border:1px solid rgba(245,158,11,.4);background:none;color:#fbd38d;border-radius:10px;cursor:pointer;font-size:13px}
/* расследование */
.cs-inv-case{border:1px solid rgba(245,158,11,.25);border-radius:12px;padding:14px;background:rgba(245,158,11,.05);margin-bottom:10px;cursor:pointer;transition:.2s}
.cs-inv-case:hover{border-color:#F59E0B;transform:translateY(-2px)}
.cs-inv-case .h{display:flex;align-items:center;gap:10px}
.cs-inv-case .ic{font-size:24px}
.cs-inv-case .t{font-size:14px;font-weight:700;color:#fbd38d}
.cs-inv-case .d{font-size:11px;color:#a8987a;margin-top:2px}
.cs-evidence{display:flex;flex-direction:column;gap:8px;margin:12px 0}
.cs-ev{border:1px solid rgba(245,158,11,.25);border-radius:10px;padding:12px;background:rgba(255,255,255,.04)}
.cs-ev .lab{font-size:10px;text-transform:uppercase;letter-spacing:1px;color:#a8987a;margin-bottom:4px}
.cs-ev .val{font-size:13px;color:#e8dcc8;line-height:1.6;white-space:pre-wrap}
.cs-verdict{display:flex;gap:8px;margin-top:12px}
.cs-verdict button{flex:1;padding:12px;border-radius:12px;border:1px solid rgba(245,158,11,.4);background:none;color:#fbd38d;font-weight:700;cursor:pointer;font-size:13px}
.cs-verdict button.on{background:linear-gradient(135deg,#F59E0B,#EF4444);color:#fff;border-color:transparent}
#cs-close{margin-top:14px;width:100%;border:1px solid rgba(245,158,11,.4);background:none;color:#fbd38d;border-radius:10px;padding:10px;cursor:pointer;font-size:13px}
&lt;/style&gt;
&lt;button id="cs-btn" title="Библиотека дел"&gt;?&lt;/button&gt;
&lt;div id="cs-mask"&gt;&lt;div id="cs-card"&gt;
&lt;h3&gt;? Библиотека дел&lt;/h3&gt;
&lt;div class="cs-sub"&gt;Учись на чужих кейсах: найди ложь и манипуляции сам — получи PR&lt;/div&gt;
&lt;div class="cs-tabs"&gt;
&lt;button class="cs-tab on" data-p="lib"&gt;? Кейсы&lt;/button&gt;
&lt;button class="cs-tab" data-p="inv"&gt;?️ Расследования&lt;/button&gt;
&lt;/div&gt;
&lt;div class="cs-pane on" data-p="lib"&gt;
&lt;div class="cs-cats" id="cs-cats"&gt;&lt;/div&gt;
&lt;div class="cs-list" id="cs-list"&gt;&lt;/div&gt;
&lt;div class="cs-caseview" id="cs-caseview"&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div class="cs-pane" data-p="inv"&gt;
&lt;div class="cs-list" id="cs-invlist"&gt;&lt;/div&gt;
&lt;div class="cs-caseview" id="cs-invview"&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;button id="cs-close"&gt;Закрыть&lt;/button&gt;
&lt;/div&gt;&lt;/div&gt;
&lt;script&gt;
(function(){
"use strict";
if(window._csDone)return;window._csDone=1;
var $=function(s){return document.querySelector(s)};
function g(k,d){try{var v=localStorage.getItem(k);return v==null?d:JSON.parse(v)}catch(e){return d}}
function s(k,v){try{localStorage.setItem(k,JSON.stringify(v))}catch(e){}}
function toast(t,m){if(window.Toast&amp;&amp;Toast.show)Toast.show(t,m,'success')}
function addH(n){if(window.MV&amp;&amp;window.MV.addHarmony)window.MV.addHarmony(n)}
function addBl(t,x){if(window.MV&amp;&amp;window.MV.addBlock)window.MV.addBlock(t,x)}
function addPR(n){if(window.PR&amp;&amp;window.PR.add)window.PR.add(n)}
/* ═══ ДАННЫЕ: 12 КЕЙСОВ ═══ */
var CASES=[
{cat:'Мошенники',ic:'?',diff:'easy',t:'Звонок из «банка»',
text:'Здравствуйте! Это служба безопасности вашего банка. По вашей карте зафиксирована подозрительная операция. Чтобы спасти деньги, срочно назовите код из СМС, которое вам пришло. Только никому не говорите, это конфиденциально!',
flags:['Срочность и давление','Запрос кода из СМС','Просьба хранить в секрете','Звонок «из банка» без подтверждения']},
{cat:'Мошенники',ic:'?',diff:'med',t:'«Выгодная инвестиция»',
text:'Эксклюзивное предложение только для вас! Гарантированная доходность 40% в месяц. Все уже зарабатывают, осталось всего 3 места. Переведите деньги сегодня, иначе предложение сгорит. Это абсолютно безопасно, все так делают.',
flags:['Гарантированная доходность','Искусственный дефицит мест','Срочность «сегодня»','«Все так делают»','Слишком высокая доходность']},
{cat:'Манипуляции',ic:'?',diff:'med',t:'Разговор с партнёром',
text:'Я такого не говорил, тебе показалось. Ты вечно всё придумываешь и преувеличиваешь. Все нормальные люди так не реагируют. Если бы ты меня любил, ты бы так не себя вёл.',
flags:['Газлайтинг «тебе показалось»','Обесценивание «всё придумываешь»','«Все нормальные люди»','Манипуляция любовью']},
{cat:'Манипуляции',ic:'?',diff:'med',t:'«Жертва» просит',
text:'После всего, что я для тебя сделал, ты даже не можешь уделить мне пять минут? Я так старался, а тебе всё равно. Никто меня не ценит, только ты остался.',
flags:['Давление чувством вины','Обесценивание «тебе всё равно»','«Никто не ценит»','Давление «только ты остался»']},
{cat:'Новости',ic:'?',diff:'med',t:'Заголовок новости',
text:'ШОК! Учёные доказали: этот продукт убивает всех! Врачи скрывают правду! Все уже в панике. Поделись этим с каждым, пока не удалили!',
flags:['Слово ШОК','«Убивает всех» — преувеличение','«Врачи скрывают»','Призыв «поделись с каждым»','Срочность «пока не удалили»']},
{cat:'Отношения',ic:'?',diff:'easy',t:'Сообщение от бывшего',
text:'Привет! Я тут подумал, мы же были так счастливы. Ты наверное тоже скучаешь? Все наши друзья считают, что нам надо быть вместе. Давай встретимся, только никому не говори.',
flags:['Обобщение «мы были счастливы»','«Ты наверное скучаешь»','«Все друзья считают»','Просьба о секрете']},
{cat:'Бизнес',ic:'?',diff:'hard',t:'Коммерческое предложение',
text:'Наша компания — лидер рынка уже 20 лет. Мы работаем только с избранными клиентами. Наше предложение эксклюзивно и действует только до конца дня. Не упустите шанс, который больше не повторится.',
flags:['Непроверенное «лидер 20 лет»','«Только с избранными»','Эксклюзивность','Срочность «до конца дня»','«Больше не повторится»']},
{cat:'Медицина',ic:'?',diff:'hard',t:'«Целебный» препарат',
text:'Это натуральное средство лечит все болезни! Врачи не хотят, чтобы вы знали. Уже тысячи людей исцелились. Заказывайте сейчас, пока есть в наличии. Это абсолютно безопасно, никаких побочных эффектов.',
flags:['«Лечит все болезни»','«Врачи скрывают»','Непроверенное «тысячи исцелились»','Срочность','«Никаких побочных»']},
{cat:'Соцсети',ic:'?',diff:'easy',t:'Пост о «лёгком заработке»',
text:'Хочешь зарабатывать 100000 в месяц без усилий? Все мои друзья уже так делают. Просто напиши мне в личку. Не упусти свой шанс, осталось мало мест!',
flags:['«100000 без усилий»','«Все друзья делают»','«Напиши в личку»','Дефицит мест']},
{cat:'Отношения',ic:'?',diff:'hard',t:'«Заботливый» друг',
text:'Я тебе это говорю только потому, что переживаю. Все уже заметили, как ты изменился в худшую сторону. Тебе никто не скажет правду, кроме меня. Только я могу тебе помочь.',
flags:['«Говорю, потому что переживаю»','«Все заметили»','«Никто не скажет, кроме меня»','«Только я помогу»']},
{cat:'Новости',ic:'?️',diff:'easy',t:'Заголовок про «панацею»',
text:'Найдено средство от всех болезней! Секрет, который скрывали веками. Всего за 3 дня вы станете новым человеком. Спешите, количество ограничено!',
flags:['«Средство от всех болезней»','«Скрывали веками»','«За 3 дня новый человек»','Дефицит «спешите»']},
{cat:'Мошенники',ic:'?',diff:'med',t:'«Вы выиграли приз»',
text:'Поздравляем! Вы стали победителем нашего розыгрыша! Чтобы получить приз, оплатите небольшую комиссию за доставку. Все победители уже получили свои призы. Не упустите свой шанс!',
flags:['Неожиданный «выигрыш»','Просьба оплатить комиссию','«Все уже получили»','Срочность «не упустите»']}
];
/* ═══ ДАННЫЕ: РАССЛЕДОВАНИЯ ═══ */
var INVS=[
{id:1,ic:'?️',t:'Дело «Наследник»',d:'Родственник просит срочно перевести деньги',
evidence:[
{lab:'СМС',val:'«Срочно! Я попал в аварию, нужны деньги. Только никому не говори. Переведи на этот номер, быстро!»'},
{lab:'Номер',val:'Номер, с которого пришло СМС, не совпадает с номером родственника.'},
{lab:'Голос',val:'Голосовое сообщение: голос ровный, без стресса, хотя «человек в аварии».'}],
ans:'scam',ansText:'Это мошенники: несовпадение номера, ровный голос в «аварии», просьба о секрете.'},
{id:2,ic:'?',t:'Дело «Идеальный кандидат»',d:'Резюме выглядит подозрительно',
evidence:[
{lab:'Резюме',val:'«Опыт работы 10 лет в 5 компаниях. Все работодатели в восторге. Все навыки на высшем уровне.»'},
{lab:'Проверка',val:'Записи в трудовой книжке не подтверждают 10 лет стажа. 2 компании не существуют.'},
{lab:'Собеседование',val:'Кандидат не смог назвать конкретные проекты, уходил от ответов, долго молчал перед ответами.'}],
ans:'scam',ansText:'Несостыковки в стаже, уход от конкретных вопросов, общие фразы — резюме преувеличено.'},
{id:3,ic:'?️',t:'Дело «Заботливый друг»',d:'Друг стал слишком навязчив',
evidence:[
{lab:'Сообщения',val:'«Я переживаю за тебя. Все заметили, что тебе плохо. Только я могу помочь. Только не говори никому.»'},
{lab:'Поведение',val:'Друг расспрашивает о личных деталях, просит держать разговоры в секрете.'},
{lab:'Контекст',val:'Друг появился недавно, раньше вы почти не общались.'}],
ans:'manip',ansText:'Манипуляция через заботу: новый знакомый давит «эксклюзивной заботой» и секретами.'}
];
/* ═══ РЕНДЕР БИБЛИОТЕКИ ═══ */
var CATS=['Все','Мошенники','Манипуляции','Новости','Отношения','Бизнес','Медицина','Соцсети'];
var curCat='Все';
function doneCases(){return g('cs_done',{})}
function renderCats(){
$('#cs-cats').innerHTML=CATS.map(function(c){return '&lt;span class="cs-cat'+(c===curCat?' on':'')+'" data-c="'+c+'"&gt;'+c+'&lt;/span&gt;'}).join('');
}
function renderList(){
var done=doneCases();
var list=CASES.filter(function(c){return curCat==='Все'||c.cat===curCat});
$('#cs-list').innerHTML=list.map(function(c,i){
var isDone=!!done[c.id];
var diffCls=c.diff==='easy'?'easy':(c.diff==='med'?'med':'hard');
var diffTxt=c.diff==='easy'?'Легко':(c.diff==='med'?'Средне':'Сложно');
return '&lt;div class="cs-case'+(isDone?' done':'')+'" data-id="'+i+'"&gt;&lt;div class="h"&gt;&lt;span class="ic"&gt;'+c.ic+'&lt;/span&gt;&lt;span class="t"&gt;'+c.t+'&lt;/span&gt;&lt;span class="diff '+diffCls+'"&gt;'+diffTxt+'&lt;/span&gt;'+(isDone?'&lt;span class="done-badge"&gt;✓&lt;/span&gt;':'')+'&lt;/div&gt;&lt;/div&gt;';
}).join('');
$('#cs-list').style.display='block';
$('#cs-caseview').classList.remove('on');
}
/* ═══ РАЗБОР КЕЙСА ═══ */
var curCase=null,selFlags={};
function openCase(i){
curCase=CASES[i];selFlags={};
$('#cs-list').style.display='none';
var cv=$('#cs-caseview');cv.classList.add('on');
cv.innerHTML='&lt;div class="cs-caseview on"&gt;&lt;div class="cs-text"&gt;'+curCase.text+'&lt;/div&gt;'+
'&lt;div class="cs-flags"&gt;'+curCase.flags.map(function(f,fi){return '&lt;label class="cs-flag" data-f="'+fi+'"&gt;&lt;input type="checkbox"&gt; '+f+'&lt;/label&gt;'}).join('')+'&lt;/div&gt;'+
'&lt;button class="cs-submit" id="cs-check"&gt;Проверить&lt;/button&gt;'+
'&lt;div class="cs-result" id="cs-res" style="display:none"&gt;&lt;/div&gt;'+
'&lt;button class="cs-back" id="cs-back"&gt;← Назад к списку&lt;/button&gt;&lt;/div&gt;';
cv.querySelectorAll('.cs-flag').forEach(function(fl){
fl.addEventListener('click',function(){
var fi=+fl.dataset.f;
selFlags[fi]=!selFlags[fi];
fl.classList.toggle('on',selFlags[fi]);
fl.querySelector('input').checked=selFlags[fi];
});
});
$('#cs-check').addEventListener('click',checkCase);
$('#cs-back').addEventListener('click',function(){renderList()});
}
function checkCase(){
var total=curCase.flags.length,found=0,wrong=0;
for(var k in selFlags){if(selFlags[k])found++;}
/* все флаги в этой задаче — настоящие, но пользователь может отметить не все */
found=0;
for(var k in selFlags){if(selFlags[k])found++;}
var score=Math.round(found/total*100);
/* подсветка */
$('#cs-caseview').querySelectorAll('.cs-flag').forEach(function(fl){
var fi=+fl.dataset.f;
if(selFlags[fi])fl.classList.add('correct');
});
var res=$('#cs-res');res.style.display='block';
res.innerHTML='&lt;div class="score"&gt;'+score+'%&lt;/div&gt;&lt;div style="font-size:13px;color:#e8dcc8;margin-top:6px"&gt;Найдено флагов: '+found+' из '+total+'&lt;/div&gt;'+
'&lt;div style="font-size:12px;color:#a8987a;margin-top:6px"&gt;'+(score&gt;=80?'Отлично! Ты заметил почти все уловки.':score&gt;=50?'Хорошо, но пропустил пару уловок.':'Будь внимательнее: манипуляторы используют именно эти приёмы.')+'&lt;/div&gt;';
/* сохранить */
var done=doneCases();done[curCase.id]=score;s('cs_done',done);
var pr=score&gt;=80?5:(score&gt;=50?3:1);
addPR(pr);addH(2);addBl('case','Кейс: '+curCase.t+' ('+score+'%)');
toast('Кейс разобран','+'+pr+' PR · '+score+'%');
}
/* ═══ РАССЛЕДОВАНИЯ ═══ */
function renderInvList(){
$('#cs-invlist').innerHTML=INVS.map(function(inv){
return '&lt;div class="cs-inv-case" data-id="'+inv.id+'"&gt;&lt;div class="h"&gt;&lt;span class="ic"&gt;'+inv.ic+'&lt;/span&gt;&lt;div&gt;&lt;div class="t"&gt;'+inv.t+'&lt;/div&gt;&lt;div class="d"&gt;'+inv.d+'&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;';
}).join('');
$('#cs-invlist').style.display='block';
$('#cs-invview').classList.remove('on');
}
var curInv=null,verdict=null;
function openInv(id){
curInv=INVS.filter(function(x){return x.id===id})[0];verdict=null;
$('#cs-invlist').style.display='none';
var cv=$('#cs-invview');cv.classList.add('on');
cv.innerHTML='&lt;div class="cs-caseview on"&gt;&lt;div class="cs-evidence"&gt;'+curInv.evidence.map(function(ev){
return '&lt;div class="cs-ev"&gt;&lt;div class="lab"&gt;'+ev.lab+'&lt;/div&gt;&lt;div class="val"&gt;'+ev.val+'&lt;/div&gt;&lt;/div&gt;'}).join('')+'&lt;/div&gt;'+
'&lt;div class="cs-verdict"&gt;&lt;button data-v="truth"&gt;✅ Честно&lt;/button&gt;&lt;button data-v="scam"&gt;? Мошенничество&lt;/button&gt;&lt;button data-v="manip"&gt;? Манипуляция&lt;/button&gt;&lt;/div&gt;'+
'&lt;div class="cs-result" id="cs-invres" style="display:none"&gt;&lt;/div&gt;'+
'&lt;button class="cs-back" id="cs-invback"&gt;← Назад&lt;/button&gt;&lt;/div&gt;';
cv.querySelectorAll('.cs-verdict button').forEach(function(b){
b.addEventListener('click',function(){
cv.querySelectorAll('.cs-verdict button').forEach(function(x){x.classList.remove('on')});
b.classList.add('on');verdict=b.dataset.v;
var res=$('#cs-invres');
var correct=verdict===curInv.ans;
res.style.display='block';
res.innerHTML='&lt;div class="score"&gt;'+(correct?'✓ Верно':'✗ Неверно')+'&lt;/div&gt;'+
'&lt;div style="font-size:13px;color:#e8dcc8;margin-top:6px"&gt;'+curInv.ansText+'&lt;/div&gt;'+
'&lt;div style="font-size:12px;color:#a8987a;margin-top:6px"&gt;'+(correct?'Отличная работа детектива!':'Прочитай улики внимательнее — они указывают на ответ.')+'&lt;/div&gt;';
var pr=correct?8:2;
addPR(pr);addH(3);addBl('investigation','Расследование: '+curInv.t);
toast(correct?'Расследование раскрыто':'Есть над чем поработать','+'+pr+' PR');
});
});
$('#cs-invback').addEventListener('click',function(){renderInvList()});
}
/* ═══ ТАБЫ ═══ */
document.querySelectorAll('.cs-tab').forEach(function(t){
t.addEventListener('click',function(){
document.querySelectorAll('.cs-tab').forEach(function(x){x.classList.remove('on')});
t.classList.add('on');
var p=t.dataset.p;
document.querySelectorAll('.cs-pane').forEach(function(x){x.classList.remove('on')});
document.querySelector('.cs-pane[data-p="'+p+'"]').classList.add('on');
if(p==='lib'){renderCats();renderList()}else{renderInvList()}
});
});
/* ═══ КЛИКИ ═══ */
$('#cs-cats').addEventListener('click',function(e){
var c=e.target.closest('.cs-cat');if(!c)return;
curCat=c.dataset.c;renderCats();renderList();
});
$('#cs-list').addEventListener('click',function(e){
var c=e.target.closest('.cs-case');if(!c)return;
openCase(+c.dataset.id);
});
$('#cs-invlist').addEventListener('click',function(e){
var c=e.target.closest('.cs-inv-case');if(!c)return;
openInv(+c.dataset.id);
});
$('#cs-btn').addEventListener('click',function(){
$('#cs-mask').classList.add('open');renderCats();renderList();renderInvList();
});
$('#cs-close').addEventListener('click',function(){$('#cs-mask').classList.remove('open')});
$('#cs-mask').addEventListener('click',function(e){if(e.target===this)this.classList.remove('open')});
console.log('? Блок 4: Библиотека дел + Расследования подключены');
})();
&lt;/script&gt;

&lt;style&gt;
#vd-mask{position:fixed;inset:0;z-index:412;display:none;align-items:center;justify-content:center;background:rgba(5,8,16,.88);backdrop-filter:blur(6px)}
#vd-mask.open{display:flex}
#vd-card{width:min(640px,94vw);max-height:90vh;overflow-y:auto;border-radius:18px;padding:22px;color:#e8f0fe;background:linear-gradient(180deg,#0a1428,#060a18);border:1px solid rgba(6,182,212,.4);font-family:Inter,system-ui,sans-serif;box-shadow:0 30px 60px rgba(0,0,0,.6)}
#vd-card h3{margin:0 0 4px;font-size:20px;color:#67e8f9}
.vd-sub{font-size:12px;color:#7f96b8;margin-bottom:14px}
.vd-canvas{width:100%;height:110px;border-radius:12px;background:rgba(6,182,212,.06);border:1px solid rgba(6,182,212,.25);display:block}
.vd-row{display:flex;gap:8px;flex-wrap:wrap;margin:12px 0}
.vd-btn{padding:11px 16px;border:none;border-radius:12px;font-weight:800;font-size:13px;cursor:pointer;background:linear-gradient(135deg,#06B6D4,#3B82F6);color:#fff}
.vd-btn.rec{background:linear-gradient(135deg,#EF4444,#EF4444)}
.vd-btn.ghost{background:none;border:1px solid rgba(6,182,212,.4);color:#67e8f9}
.vd-timer{font-family:monospace;font-size:13px;color:#67e8f9;align-self:center}
.vd-file{display:none}
.vd-label{display:inline-flex;padding:11px 16px;border-radius:12px;border:1px dashed rgba(6,182,212,.4);color:#67e8f9;font-size:13px;cursor:pointer}
.vd-score{display:flex;align-items:center;gap:14px;background:rgba(6,182,212,.08);border:1px solid rgba(6,182,212,.3);border-radius:14px;padding:14px;margin:12px 0}
.vd-score b{font-size:34px;color:#67e8f9}
.vd-bar{height:10px;background:rgba(255,255,255,.1);border-radius:999px;overflow:hidden;margin-top:8px}
.vd-bar i{display:block;height:100%;background:linear-gradient(90deg,#06B6D4,#EF4444);border-radius:999px}
.vd-mark{display:flex;gap:10px;align-items:flex-start;font-size:12px;color:#cfe0f7;background:rgba(6,182,212,.06);border:1px solid rgba(6,182,212,.2);border-radius:10px;padding:8px 10px;margin-bottom:6px}
.vd-mark .ic{font-size:18px}
.vd-note{font-size:11px;color:#7f96b8;margin-top:10px;line-height:1.5}
&lt;/style&gt;
&lt;button id="vd-fab" title="Голос-детектор" style="position:fixed;right:16px;bottom:632px;z-index:400;width:52px;height:52px;border-radius:50%;border:none;cursor:pointer;background:linear-gradient(135deg,#06B6D4,#3B82F6);color:#fff;font-size:22px;box-shadow:0 6px 20px rgba(6,182,212,.45)"&gt;?&lt;/button&gt;
&lt;div id="vd-mask"&gt;&lt;div id="vd-card"&gt;
&lt;h3&gt;? Голос-детектор&lt;/h3&gt;
&lt;div class="vd-sub"&gt;Запиши речь — получи маркеры стресса. Всё локально, никуда не отправляется.&lt;/div&gt;
&lt;div class="vd-row"&gt;
&lt;button class="vd-btn" id="vd-rec"&gt;? Начать запись&lt;/button&gt;
&lt;label class="vd-label"&gt;? Аудиофайл&lt;input type="file" class="vd-file" id="vd-file" accept="audio/*" /&gt;&lt;/label&gt;
&lt;span class="vd-timer" id="vd-timer"&gt;0:00&lt;/span&gt;
&lt;/div&gt;
&lt;canvas class="vd-canvas" id="vd-canvas" width="600" height="110"&gt;&lt;/canvas&gt;
&lt;div id="vd-res" style="display:none"&gt;
&lt;div class="vd-score"&gt;&lt;b id="vd-score"&gt;0&lt;/b&gt;&lt;div style="flex:1"&gt;&lt;div style="font-size:12px;color:#7f96b8"&gt;Индекс стресса голоса&lt;/div&gt;&lt;div class="vd-bar"&gt;&lt;i id="vd-fill" style="width:0%"&gt;&lt;/i&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;
&lt;div id="vd-marks"&gt;&lt;/div&gt;
&lt;div class="vd-note"&gt;Маркеры стресса — вероятность, а не приговор. Волнуются и честные. Сравнивай с обычным тоном человека.&lt;/div&gt;
&lt;/div&gt;
&lt;button class="vd-btn ghost" id="vd-close" style="width:100%;margin-top:12px"&gt;Закрыть&lt;/button&gt;
&lt;/div&gt;&lt;/div&gt;
&lt;script&gt;
(function(){
"use strict";
if(window._vdDone)return;window._vdDone=1;
var $=function(s){return document.querySelector(s)};
function grant(n){var P=g('pr_profile',{pr:0,lvl:1});P.pr+=n;P.lvl=1+Math.floor(P.pr/100);s('pr_profile',P);var e=$('#prPr');if(e)e.textContent='? '+P.pr+' PR';}
function g(k,d){try{var v=localStorage.getItem(k);return v==null?d:JSON.parse(v)}catch(e){return d}}
function s(k,v){try{localStorage.setItem(k,JSON.stringify(v))}catch(e){}}
var AC=window.AudioContext||window.webkitAudioContext;
var ctx=null,analyser=null,rec=null,chunks=[],recording=false,raf=0,timerInt=0,startT=0;
var marks=[],score=0;
$('#vd-fab').addEventListener('click',function(){$('#vd-mask').classList.add('open')});
$('#vd-close').addEventListener('click',function(){$('#vd-mask').classList.remove('open')});
$('#vd-mask').addEventListener('click',function(e){if(e.target===this)this.classList.remove('open')});
$('#vd-rec').addEventListener('click',function(){
if(recording){stopRec();return;}
if(!navigator.mediaDevices||!navigator.mediaDevices.getUserMedia){toast('Голос','Микрофон недоступен');return;}
navigator.mediaDevices.getUserMedia({audio:true}).then(function(st){
ctx=new AC();analyser=ctx.createAnalyser();analyser.fftSize=2048;
var src=ctx.createMediaStreamSource(st);src.connect(analyser);
rec=new MediaRecorder(st);chunks=[];
rec.ondataavailable=function(e){chunks.push(e.data)};
rec.onstop=function(){st.getTracks().forEach(function(t){t.stop()});decode(new Blob(chunks,{type:rec.mimeType||'audio/webm'}));};
rec.start();recording=true;startT=Date.now();
$('#vd-rec').textContent='⏹ Стоп';$('#vd-rec').classList.add('rec');
timerInt=setInterval(function(){var s2=Math.floor((Date.now()-startT)/1000);$('#vd-timer').textContent=Math.floor(s2/60)+':'+String(s2%60).padStart(2,'0');},100);
drawLive();
}).catch(function(){toast('Голос','Нет доступа к микрофону')});
});
$('#vd-file').addEventListener('change',function(e){var f=e.target.files[0];if(!f)return;decode(f);});
function stopRec(){recording=false;clearInterval(timerInt);if(rec&amp;&amp;rec.state!=='inactive')rec.stop();$('#vd-rec').textContent='? Начать запись';$('#vd-rec').classList.remove('rec');}
function drawLive(){
if(!recording)return;
raf=requestAnimationFrame(drawLive);
var data=new Uint8Array(analyser.fftSize);analyser.getByteTimeDomainData(data);
var cv=$('#vd-canvas'),cx=cv.getContext('2d');
cx.clearRect(0,0,cv.width,cv.height);
cx.strokeStyle='#67e8f9';cx.beginPath();
for(var i=0;i&lt;data.length;i+=8){var x=i/data.length*cv.width,y=data[i]/255*cv.height;i===0?cx.moveTo(x,y):cx.lineTo(x,y);}
cx.stroke();
}
function decode(blob){
var ac=new AC();
blob.arrayBuffer().then(function(ab){return ac.decodeAudioData(ab)}).then(function(buf){
analyze(buf);
}).catch(function(){toast('Голос','Не удалось декодировать аудио')});
}
function analyze(buf){
var sr=buf.sampleRate,d=buf.getChannelData(0);
var win=Math.floor(sr*0.05),hop=Math.floor(win/2),rms=[];
for(var i=0;i+win&lt;d.length;i+=hop){var q=0;for(var j=0;j&lt;win;j++){var v=d[i+j];q+=v*v}rms.push(Math.sqrt(q/win));}
var mx=0;for(var i2=0;i2&lt;rms.length;i2++)if(rms[i2]&gt;mx)mx=rms[i2];
var thr=Math.max(0.004,mx*0.08);
var pauses=0,pauseLen=0,run=0;
for(var i3=0;i3&lt;rms.length;i3++){if(rms[i3]&lt;thr)run++;else{if(run*hop/sr&gt;0.28){pauses++;pauseLen+=run*hop/sr}run=0;}}
var voiced=0;for(var i4=0;i4&lt;rms.length;i4++)if(rms[i4]&gt;=thr)voiced++;
var vSec=voiced*hop/sr;
var peaks=0;for(var i5=1;i5&lt;rms.length-1;i5++)if(rms[i5]&gt;thr*2&amp;&amp;rms[i5]&gt;=rms[i5-1]&amp;&amp;rms[i5]&gt;rms[i5+1])peaks++;
var rate=vSec&gt;0?peaks/vSec:0;
var pitches=[];for(var i6=0;i6+win&lt;d.length;i6+=hop*2){if(rms[Math.floor(i6/hop)]&lt;thr*1.5)continue;var p=ac2(d,i6,win,sr);if(p)pitches.push(p);}
var pm=mean(pitches),jit=0;
for(var i7=1;i7&lt;pitches.length;i7++)jit+=Math.abs(pitches[i7]-pitches[i7-1]);
jit=pitches.length&gt;1?(jit/(pitches.length-1))/(pm||1):0;
score=12;marks=[];
if(pauses&gt;=2){score+=Math.min(24,pauses*8);marks.push({ic:'⏸',t:'Паузы: '+pauses+' ('+pauseLen.toFixed(1)+' с)',d:'Подбор слов, возможная конструкция версии.'});}
if(jit&gt;0.09){score+=20;marks.push({ic:'?',t:'Дрожь тона ('+Math.round(jit*100)+'%)',d:'Микроколебания голоса — маркер стресса.'});}
else if(pm&amp;&amp;sd2(pitches)/pm&gt;0.18){score+=14;marks.push({ic:'?',t:'Перепады тона ('+Math.round(sd2(pitches)/pm*100)+'%)',d:'Эмоциональная нестабильность.'});}
if(rate&gt;4.2){score+=12;marks.push({ic:'⚡',t:'Быстрый темп (~'+rate.toFixed(1)+' сл/с)',d:'Волнение, стремление проскочить.'});}
else if(rate&gt;0&amp;&amp;rate&lt;2.2&amp;&amp;vSec&gt;1){score+=10;marks.push({ic:'?',t:'Замедленный темп (~'+rate.toFixed(1)+' сл/с)',d:'Осторожность, дозирование слов.'});}
score=Math.max(3,Math.min(96,score));
drawWave(d);
$('#vd-res').style.display='block';
$('#vd-score').textContent=score;
$('#vd-fill').style.width=score+'%';
$('#vd-marks').innerHTML=marks.length?marks.map(function(m){return '&lt;div class="vd-mark"&gt;&lt;span class="ic"&gt;'+m.ic+'&lt;/span&gt;&lt;div&gt;&lt;b&gt;'+m.t+'&lt;/b&gt;&lt;br&gt;'+m.d+'&lt;/div&gt;&lt;/div&gt;'}).join(''):'&lt;div class="vd-mark"&gt;&lt;span class="ic"&gt;✅&lt;/span&gt;&lt;div&gt;Стресс-маркеров не найдено.&lt;/div&gt;&lt;/div&gt;';
grant(3);
toast('Голос-детектор','Индекс стресса: '+score+' · +3 PR');
}
function ac2(d,off,win,sr){
var minL=Math.floor(sr/400),maxL=Math.floor(sr/60),best=0,lag0=0,e0=0;
for(var i=0;i&lt;win;i+=2){var v=d[off+i];e0+=v*v}
if(e0&lt;1e-4)return 0;
for(var lag=minL;lag&lt;maxL;lag+=2){var s2=0;for(var i2=0;i2&lt;win;i2+=4)s2+=d[off+i2]*d[off+i2+lag];var c=s2/e0;if(c&gt;best){best=c;lag0=lag}}
return best&gt;0.3&amp;&amp;lag0&gt;0?sr/lag0:0;
}
function mean(a){if(!a.length)return 0;var t=0;for(var i=0;i&lt;a.length;i++)t+=a[i];return t/a.length}
function sd2(a){if(a.length&lt;2)return 0;var m=mean(a),t=0;for(var i=0;i&lt;a.length;i++)t+=(a[i]-m)*(a[i]-m);return Math.sqrt(t/a.length)}
function drawWave(d){
var cv=$('#vd-canvas'),cx=cv.getContext('2d');
cx.clearRect(0,0,cv.width,cv.height);
cx.strokeStyle='#67e8f9';cx.beginPath();
var step=Math.max(1,Math.floor(d.length/cv.width));
for(var x=0;x&lt;cv.width;x++){var v=d[x*step]||0;var y=cv.height/2-v*cv.height*0.9;y=Math.max(2,Math.min(cv.height-2,y));x===0?cx.moveTo(x,y):cx.lineTo(x,y);}
cx.stroke();
}
function toast(t,m){if(window.Toast&amp;&amp;Toast.show)Toast.show(t,m,'success');else console.log(t,m)}
console.log('? Правдомер: Блок 5 · Голос-детектор подключён');
})();
&lt;/script&gt;

&lt;style&gt;
#truth-btn{position:fixed;right:16px;bottom:632px;z-index:400;width:52px;height:52px;border-radius:50%;border:none;cursor:pointer;background:linear-gradient(135deg,#10B981,#8B5CF6);color:#fff;font-size:22px;box-shadow:0 6px 20px rgba(139,92,246,.45);transition:transform .2s}
#truth-btn:hover{transform:scale(1.1)}
@media(min-width:1000px){#truth-btn{bottom:512px}}
#truth-mask{position:fixed;inset:0;z-index:424;display:none;align-items:center;justify-content:center;background:rgba(6,8,18,.88);backdrop-filter:blur(5px)}
#truth-mask.open{display:flex}
#truth-card{width:min(620px,94vw);max-height:90vh;overflow-y:auto;border-radius:18px;padding:22px;color:#e8f0ee;background:linear-gradient(180deg,#07221e,#0a141c);border:1px solid rgba(16,185,129,.4);font-family:Inter,system-ui,sans-serif;box-shadow:0 30px 60px rgba(0,0,0,.6)}
#truth-card h3{margin:0 0 4px;font-size:20px;color:#6ee7b7}
.truth-sub{font-size:12px;color:#7fa89a;margin-bottom:14px}
.truth-tabs{display:flex;gap:8px;margin-bottom:14px}
.truth-tab{flex:1;padding:9px;border-radius:10px;border:1px solid rgba(16,185,129,.35);background:rgba(16,185,129,.08);color:#6ee7b7;font-weight:700;font-size:13px;cursor:pointer}
.truth-tab.on{background:linear-gradient(135deg,#10B981,#8B5CF6);color:#fff;border-color:transparent}
.truth-pane{display:none}.truth-pane.on{display:block}
.truth-note{font-size:10px;color:#5d8477;line-height:1.5;border-top:1px solid rgba(16,185,129,.2);padding-top:10px;margin-top:12px}
.truth-score{display:flex;align-items:center;gap:14px;background:rgba(16,185,129,.08);border:1px solid rgba(16,185,129,.35);border-radius:14px;padding:14px;margin:12px 0}
.truth-score b{font-size:32px;color:#6ee7b7}
.truth-bar{height:10px;background:rgba(255,255,255,.1);border-radius:999px;overflow:hidden;margin-top:8px}
.truth-bar i{display:block;height:100%;border-radius:999px;background:linear-gradient(90deg,#10B981,#F59E0B)}
.truth-flag{border:1px solid rgba(16,185,129,.25);border-radius:10px;padding:9px 12px;margin-bottom:6px;font-size:12px;color:#cbe8e3}
.truth-flag b{color:#6ee7b7}
.truth-lens{display:flex;gap:6px;margin:8px 0}
.truth-lens button{padding:7px 14px;border-radius:999px;border:1px solid rgba(16,185,129,.35);background:none;color:#6ee7b7;font-size:12px;font-weight:700;cursor:pointer}
.truth-lens button.on{background:rgba(16,185,129,.2)}
.truth-area{width:100%;min-height:90px;padding:11px;border-radius:10px;border:1px solid rgba(16,185,129,.4);background:rgba(16,185,129,.06);color:#e8f0ee;font-size:13px;font-family:inherit;resize:vertical;margin-bottom:8px}
.truth-act{width:100%;padding:12px;border:none;border-radius:12px;background:linear-gradient(135deg,#10B981,#8B5CF6);color:#fff;font-weight:800;font-size:14px;cursor:pointer;margin-top:8px}
.truth-canvas{width:100%;height:150px;background:rgba(0,0,0,.3);border:1px solid rgba(16,185,129,.25);border-radius:12px;margin:8px 0}
#truth-close{margin-top:12px;width:100%;border:1px solid rgba(16,185,129,.4);background:none;color:#6ee7b7;border-radius:10px;padding:10px;cursor:pointer;font-size:13px}
&lt;/style&gt;
&lt;button id="truth-btn" title="Реальный детектор лжи"&gt;?️&lt;/button&gt;
&lt;div id="truth-mask"&gt;&lt;div id="truth-card"&gt;
&lt;h3&gt;?️ Реальный детектор лжи&lt;/h3&gt;
&lt;div class="truth-sub"&gt;Анализ текста, голоса и фото — локально, без интернета&lt;/div&gt;
&lt;div class="truth-tabs"&gt;
&lt;button class="truth-tab on" data-p="text"&gt;? Текст&lt;/button&gt;
&lt;button class="truth-tab" data-p="voice"&gt;? Голос&lt;/button&gt;
&lt;button class="truth-tab" data-p="photo"&gt;? Фото&lt;/button&gt;
&lt;/div&gt;
&lt;div class="truth-pane on" data-p="text"&gt;
&lt;div class="truth-lens"&gt;
&lt;button id="tl-lie" class="on"&gt;Ложь&lt;/button&gt;
&lt;button id="tl-man"&gt;Манипуляция&lt;/button&gt;
&lt;/div&gt;
&lt;textarea class="truth-area" id="truth-text" placeholder="Вставь текст для анализа…"&gt;&lt;/textarea&gt;
&lt;button class="truth-act" id="truth-text-go"&gt;Проверить текст&lt;/button&gt;
&lt;div id="truth-text-res"&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div class="truth-pane" data-p="voice"&gt;
&lt;button class="truth-act" id="truth-voice-go"&gt;? Записать голос (до 10 сек)&lt;/button&gt;
&lt;div class="truth-canvas" id="truth-voice-canvas"&gt;&lt;/div&gt;
&lt;div id="truth-voice-res"&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div class="truth-pane" data-p="photo"&gt;
&lt;input type="file" id="truth-photo-file" accept="image/*" style="margin-bottom:8px" /&gt;
&lt;div class="truth-canvas" id="truth-photo-canvas"&gt;&lt;/div&gt;
&lt;div id="truth-photo-res"&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div class="truth-note"&gt;Результаты — вероятностная оценка для саморефлексии, а не доказательство. Данные не покидают устройство.&lt;/div&gt;
&lt;button id="truth-close"&gt;Закрыть&lt;/button&gt;
&lt;/div&gt;&lt;/div&gt;
&lt;script&gt;
(function(){
"use strict";
if(window._truthDone)return;window._truthDone=1;
var $=function(s){return document.querySelector(s)};
function g(k,d){try{var v=localStorage.getItem(k);return v==null?d:JSON.parse(v)}catch(e){return d}}
function s(k,v){try{localStorage.setItem(k,JSON.stringify(v))}catch(e){}}
function toast(t,m){if(window.Toast&amp;&amp;Toast.show)Toast.show(t,m,'success')}
/* маркеры лжи */
var LIE=[['честно говоря','стоп-фраза'],['поверь мне','стоп-фраза'],['все знают','апелляция к большинству'],['абсолютно точно','абсолютизм'],['без сомнения','абсолютизм'],['я не вру','стоп-фраза'],['гарантирую','абсолютизм'],['всегда','абсолютизм'],['никогда','абсолютизм'],['никто','абсолютизм'],['все','абсолютизм']];
/* маркеры манипуляции */
var MAN=[['тебе кажется','газлайтинг'],['ты сам виноват','перекладывание вины'],['я такого не говорил','отрицание'],['ты должен','давление виной'],['после всего','давление виной'],['иначе','угроза'],['если не','угроза'],['срочно','срочность'],['немедленно','срочность'],['только сегодня','дефицит'],['осталось мало','дефицит'],['стыдно','стыд'],['все будут смеяться','стыд']];
var lens='lie';
$('#tl-lie').addEventListener('click',function(){lens='lie';$('#tl-lie').classList.add('on');$('#tl-man').classList.remove('on')});
$('#tl-man').addEventListener('click',function(){lens='man';$('#tl-man').classList.add('on');$('#tl-lie').classList.remove('on')});
function countMarks(t,arr){var n=0,arr2=[];arr.forEach(function(m){var idx=t.toLowerCase().indexOf(m[0]);if(idx&gt;=0){n++;arr2.push(m)}});return{n:n,arr:arr2}}
$('#truth-text-go').addEventListener('click',function(){
var t=$('#truth-text').value.trim();
if(t.length&lt;30){toast('Детектор','Нужно минимум 30 символов');return}
var marks=lens==='lie'?LIE:MAN;
var res=countMarks(t,marks);
var score=lens==='lie'?Math.max(5,100-res.n*12):Math.min(95,res.n*15);
var label=lens==='lie'?'Индекс правдивости':'Индекс манипуляции';
var html='&lt;div class="truth-score"&gt;&lt;b&gt;'+score+'&lt;/b&gt;&lt;div style="flex:1"&gt;&lt;div style="font-size:12px;color:#7fa89a"&gt;'+label+' (0–100)&lt;/div&gt;&lt;div class="truth-bar"&gt;&lt;i style="width:'+score+'%"&gt;&lt;/i&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;';
if(res.arr.length){html+=res.arr.map(function(m){return '&lt;div class="truth-flag"&gt;&lt;b&gt;'+m[0]+'&lt;/b&gt; — '+m[1]+'&lt;/div&gt;'}).join('')}
else html+='&lt;div class="truth-flag"&gt;Явных маркеров не найдено.&lt;/div&gt;';
$('#truth-text-res').innerHTML=html;
if(window.MV&amp;&amp;window.MV.addBlock)window.MV.addBlock('truth','Анализ текста',2);
toast('?️ Детектор','Текст проверен');
});
/* голос */
$('#truth-voice-go').addEventListener('click',function(){
if(!navigator.mediaDevices||!navigator.mediaDevices.getUserMedia){toast('Детектор','Микрофон недоступен');return}
navigator.mediaDevices.getUserMedia({audio:true}).then(function(st){
var rec=new MediaRecorder(st),ch=[];
rec.ondataavailable=function(e){ch.push(e.data)};
rec.onstop=function(){
st.getTracks().forEach(function(x){x.stop()});
var blob=new Blob(ch);
blob.arrayBuffer().then(function(ab){return new (window.AudioContext||window.webkitAudioContext)().decodeAudioData(ab)}).then(function(buf){analyzeVoice(buf)}).catch(function(){toast('Детектор','Не удалось обработать звук')});
};
rec.start();
toast('? Запись','Идёт запись 10 секунд…');
setTimeout(function(){if(rec.state!=='inactive')rec.stop()},10000);
}).catch(function(){toast('Детектор','Нет доступа к микрофону')});
});
function analyzeVoice(buf){
var sr=buf.sampleRate,d=buf.getChannelData(0),win=Math.floor(sr*0.05),hop=Math.floor(win/2),rms=[];
for(var i=0;i+win&lt;d.length;i+=hop){var q=0;for(var j=0;j&lt;win;j++){var v=d[i+j];q+=v*v}rms.push(Math.sqrt(q/win))}
var mx=0;for(var i2=0;i2&lt;rms.length;i2++)if(rms[i2]&gt;mx)mx=rms[i2];
var thr=Math.max(0.004,mx*0.08),pauses=0,run=0;
for(var i3=0;i3&lt;rms.length;i3++){if(rms[i3]&lt;thr)run++;else{if(run*hop/sr&gt;0.28)pauses++;run=0}}
var score=Math.min(95,pauses*10+20);
var html='&lt;div class="truth-score"&gt;&lt;b&gt;'+score+'&lt;/b&gt;&lt;div style="flex:1"&gt;&lt;div style="font-size:12px;color:#7fa89a"&gt;Индекс стресса голоса (0–100)&lt;/div&gt;&lt;div class="truth-bar"&gt;&lt;i style="width:'+score+'%"&gt;&lt;/i&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;';
html+='&lt;div class="truth-flag"&gt;&lt;b&gt;Пауз найдено:&lt;/b&gt; '+pauses+'&lt;/div&gt;';
$('#truth-voice-res').innerHTML=html;
if(window.MV&amp;&amp;window.MV.addBlock)window.MV.addBlock('truth','Анализ голоса',2);
toast('? Голос','Анализ завершён');
});
/* фото */
$('#truth-photo-file').addEventListener('change',function(e){
var f=e.target.files[0];if(!f)return;
var img=new Image();
img.onload=function(){analyzePhoto(img)};
img.src=URL.createObjectURL(f);
});
function analyzePhoto(img){
var cv=$('#truth-photo-canvas'),ctx=cv.getContext('2d');
cv.width=Math.min(400,img.width);cv.height=Math.round(img.height*(cv.width/img.width));
ctx.drawImage(img,0,0,cv.width,cv.height);
var d1=ctx.getImageData(0,0,cv.width,cv.height).data;
var tmp=document.createElement('canvas');tmp.width=cv.width;tmp.height=cv.height;
var tctx=tmp.getContext('2d');tctx.drawImage(img,0,0,cv.width,cv.height);
var url=tmp.toDataURL('image/jpeg',0.7);
var img2=new Image();
img2.onload=function(){
var tmp2=document.createElement('canvas');tmp2.width=cv.width;tmp2.height=cv.height;
var t2=tmp2.getContext('2d');t2.drawImage(img2,0,0,cv.width,cv.height);
var d2=t2.getImageData(0,0,cv.width,cv.height).data;
var diff=0;for(var i=0;i&lt;d1.length;i+=4)diff+=Math.abs(d1[i]-d2[i])+Math.abs(d1[i+1]-d2[i+1])+Math.abs(d1[i+2]-d2[i+2]);
var avg=diff/(d1.length/4);
var score=Math.max(5,Math.min(95,Math.round(100-avg/3)));
var html='&lt;div class="truth-score"&gt;&lt;b&gt;'+score+'&lt;/b&gt;&lt;div style="flex:1"&gt;&lt;div style="font-size:12px;color:#7fa89a"&gt;Индекс подлинности фото (0–100)&lt;/div&gt;&lt;div class="truth-bar"&gt;&lt;i style="width:'+score+'%"&gt;&lt;/i&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;';
html+='&lt;div class="truth-flag"&gt;Среднее отличие после пересжатия: '+avg.toFixed(2)+'&lt;/div&gt;';
$('#truth-photo-res').innerHTML=html;
if(window.MV&amp;&amp;window.MV.addBlock)window.MV.addBlock('truth','Анализ фото',2);
toast('? Фото','Анализ завершён');
};
img2.src=url;
});
/* открытие */
$('#truth-btn').addEventListener('click',function(){$('#truth-mask').classList.add('open')});
$('#truth-close').addEventListener('click',function(){$('#truth-mask').classList.remove('open')});
$('#truth-mask').addEventListener('click',function(e){if(e.target===this)this.classList.remove('open')});
console.log('?️ Реальный детектор лжи подключён');
})();
&lt;/script&gt;

&lt;style&gt;
#fp-btn{position:fixed;right:16px;bottom:120px;z-index:400;width:52px;height:52px;border-radius:50%;border:none;cursor:pointer;background:linear-gradient(135deg,#F59E0B,#EF4444);color:#fff;font-size:22px;box-shadow:0 6px 20px rgba(245,158,11,.45);transition:transform .2s}
#fp-btn:hover{transform:scale(1.1)}
@media(min-width:1000px){#fp-btn{bottom:140px}}
#fp-mask{position:fixed;inset:0;z-index:424;display:none;align-items:center;justify-content:center;background:rgba(10,7,25,.86);backdrop-filter:blur(5px)}
#fp-mask.open{display:flex}
#fp-card{width:min(620px,94vw);max-height:90vh;overflow-y:auto;border-radius:18px;padding:22px;color:#efe9dc;background:linear-gradient(180deg,#171034,#0d0a1c);border:1px solid rgba(245,158,11,.4);font-family:Inter,system-ui,sans-serif;box-shadow:0 30px 60px rgba(0,0,0,.6)}
#fp-card h3{margin:0 0 4px;font-size:20px;color:#fbd38d}
.fp-sub{font-size:12px;color:#a79ec9;margin-bottom:14px}
.fp-stats{display:grid;grid-template-columns:repeat(3,1fr);gap:8px;margin-bottom:14px}
@media(max-width:480px){.fp-stats{grid-template-columns:repeat(2,1fr)}}
.fp-stat{background:rgba(245,158,11,.08);border:1px solid rgba(245,158,11,.3);border-radius:12px;padding:10px;text-align:center}
.fp-stat b{display:block;font-size:20px;color:#fbd38d}
.fp-stat span{font-size:9px;color:#a79ec9;text-transform:uppercase;letter-spacing:.5px}
.fp-block{display:flex;justify-content:space-between;align-items:center;font-size:12px;color:#cfc8e8;padding:7px 10px;border-radius:8px;background:rgba(255,255,255,.04);border:1px solid rgba(255,255,255,.08);margin-bottom:5px}
.fp-block .st{font-weight:800;font-size:11px}
.fp-block .st.ok{color:#6ee7b7}
.fp-block .st.no{color:#fca5a5}
.fp-progress{height:10px;background:rgba(255,255,255,.1);border-radius:999px;overflow:hidden;margin:10px 0 4px}
.fp-progress i{display:block;height:100%;background:linear-gradient(90deg,#F59E0B,#10B981);border-radius:999px;transition:width .6s}
.fp-legal{margin-top:14px;padding:12px;border-radius:12px;background:rgba(245,158,11,.08);border:1px solid rgba(245,158,11,.3);font-size:11px;color:#d9cfae;line-height:1.6}
.fp-actions{display:flex;gap:8px;margin-top:12px}
.fp-actions button{flex:1;padding:11px;border:none;border-radius:10px;font-weight:800;font-size:13px;cursor:pointer}
#fp-export{background:linear-gradient(135deg,#10B981,#06B6D4);color:#fff}
#fp-reset{background:rgba(239,68,68,.15);border:1px solid rgba(239,68,68,.4);color:#fca5a5}
#fp-close{margin-top:12px;width:100%;border:1px solid rgba(245,158,11,.4);background:none;color:#fbd38d;border-radius:10px;padding:10px;cursor:pointer;font-size:13px}
&lt;/style&gt;
&lt;button id="fp-btn" title="Паспорт проекта"&gt;?&lt;/button&gt;
&lt;div id="fp-mask"&gt;&lt;div id="fp-card"&gt;
&lt;h3&gt;? Правдомер · Паспорт проекта&lt;/h3&gt;
&lt;div class="fp-sub"&gt;Итоговая сверка всех блоков и статус проекта&lt;/div&gt;
&lt;div class="fp-stats"&gt;
&lt;div class="fp-stat"&gt;&lt;b id="fp-total"&gt;0&lt;/b&gt;&lt;span&gt;блоков&lt;/span&gt;&lt;/div&gt;
&lt;div class="fp-stat"&gt;&lt;b id="fp-ok"&gt;0&lt;/b&gt;&lt;span&gt;подключено&lt;/span&gt;&lt;/div&gt;
&lt;div class="fp-stat"&gt;&lt;b id="fp-ver"&gt;1.0&lt;/b&gt;&lt;span&gt;версия&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div class="fp-progress"&gt;&lt;i id="fp-bar" style="width:0%"&gt;&lt;/i&gt;&lt;/div&gt;
&lt;div class="fp-sub" id="fp-count" style="margin-bottom:10px"&gt;Подключено 0 из 0 блоков&lt;/div&gt;
&lt;div id="fp-list"&gt;&lt;/div&gt;
&lt;div class="fp-legal"&gt;
&lt;b&gt;Юридическая информация.&lt;/b&gt; «Правдомер» — игровой тренажёр критического мышления. Не является детектором лжи, экспертизой, медицинской, юридической или психологической услугой. Результаты носят оценочно-развлекательный характер и не могут использоваться как доказательство. Все данные обрабатываются локально на вашем устройстве и никуда не передаются (соответствует 152-ФЗ). 18+. При подозрении на мошенничество обращайтесь в полицию (102), при стрессе — на линию доверия 8-800-2000-122.
&lt;/div&gt;
&lt;div class="fp-actions"&gt;
&lt;button id="fp-export"&gt;? Экспорт данных&lt;/button&gt;
&lt;button id="fp-reset"&gt;? Сбросить прогресс&lt;/button&gt;
&lt;/div&gt;
&lt;button id="fp-close"&gt;Закрыть&lt;/button&gt;
&lt;/div&gt;&lt;/div&gt;
&lt;script&gt;
(function(){
"use strict";
if(window._fpDone)return;window._fpDone=1;
var $=function(s){return document.querySelector(s)};
function g(k,d){try{var v=localStorage.getItem(k);return v==null?d:JSON.parse(v)}catch(e){return d}}
function s(k,v){try{localStorage.setItem(k,JSON.stringify(v))}catch(e){}}
function toast(t,m){if(window.Toast&amp;&amp;Toast.show)Toast.show(t,m,'success')}
/* список блоков проекта и их флаги */
var BLOCKS=[
{flag:'_prDone',n:'Каркас проекта'},
{flag:'_prTextDone',n:'Текст-детектор'},
{flag:'_prGameDone',n:'Геймкор'},
{flag:'_prCasesDone',n:'Библиотека дел'},
{flag:'_prVoiceDone',n:'Голос-детектор'},
{flag:'_prPhotoCall',n:'Фото + звонок'},
{flag:'_prSimDone',n:'Псих-симулятор'},
{flag:'_prSocialDone',n:'Соц-детектор'},
{flag:'_prVideoDone',n:'Видео + ВИП'},
{flag:'_prFusion',n:'Мультимодальный фьюжн'},
{flag:'_prDuelApi',n:'Дуэль + API'},
{flag:'_fpDone',n:'Паспорт проекта'}
];
function render(){
var ok=0;
var html=BLOCKS.map(function(b){
var on=!!window[b.flag];if(on)ok++;
return '&lt;div class="fp-block"&gt;&lt;span&gt;'+b.n+'&lt;/span&gt;&lt;span class="st '+(on?'ok':'no')+'"&gt;'+(on?'✓ подключён':'✗ нет')+'&lt;/span&gt;&lt;/div&gt;';
}).join('');
$('#fp-list').innerHTML=html;
$('#fp-total').textContent=BLOCKS.length;
$('#fp-ok').textContent=ok;
$('#fp-bar').style.width=Math.round(ok/BLOCKS.length*100)+'%';
$('#fp-count').textContent='Подключено '+ok+' из '+BLOCKS.length+' блоков';
}
/* экспорт всех данных проекта */
$('#fp-export').addEventListener('click',function(){
var out={app:'Правдомер',ver:'1.0',date:new Date().toISOString()};
for(var i=0;i&lt;localStorage.length;i++){var k=localStorage.key(i);if(k.indexOf('pr_')===0||k.indexOf('mv_')===0){try{out[k]=JSON.parse(localStorage.getItem(k))}catch(e){out[k]=localStorage.getItem(k)}}}
var blob=new Blob([JSON.stringify(out,null,2)],{type:'application/json'});
var a=document.createElement('a');a.href=URL.createObjectURL(blob);a.download='pravdomer_backup.json';
document.body.appendChild(a);a.click();document.body.removeChild(a);
toast('Экспорт','Данные проекта сохранены');
});
/* сброс прогресса */
$('#fp-reset').addEventListener('click',function(){
if(!confirm('Сбросить весь прогресс Правдомера? Действие необратимо.'))return;
var del=[];
for(var i=0;i&lt;localStorage.length;i++){var k=localStorage.key(i);if(k.indexOf('pr_')===0||k.indexOf('mv_')===0)del.push(k);}
del.forEach(function(k){localStorage.removeItem(k)});
toast('Сброс','Прогресс очищен');
setTimeout(function(){location.reload()},800);
});
$('#fp-btn').addEventListener('click',function(){render();$('#fp-mask').classList.add('open')});
$('#fp-close').addEventListener('click',function(){$('#fp-mask').classList.remove('open')});
$('#fp-mask').addEventListener('click',function(e){if(e.target===this)this.classList.remove('open')});
console.log('?? Блок 12 · Паспорт проекта подключён');
})();
&lt;/script&gt;

&lt;style&gt;
#rb-btn{position:fixed;right:16px;bottom:512px;z-index:400;width:52px;height:52px;border-radius:50%;border:none;cursor:pointer;background:linear-gradient(135deg,#EF4444,#8B5CF6);color:#fff;font-size:22px;box-shadow:0 6px 20px rgba(239,68,68,.45);transition:transform .2s}
#rb-btn:hover{transform:scale(1.1)}
@media(min-width:1000px){#rb-btn{bottom:512px}}
#rb-mask{position:fixed;inset:0;z-index:423;display:none;align-items:center;justify-content:center;background:rgba(8,5,18,.9);backdrop-filter:blur(6px)}
#rb-mask.open{display:flex}
#rb-card{width:min(620px,94vw);max-height:90vh;overflow-y:auto;border-radius:18px;padding:22px;color:#efe9dc;background:linear-gradient(180deg,#1a0d14,#0d0a14);border:1px solid rgba(239,68,68,.4);font-family:Inter,system-ui,sans-serif;box-shadow:0 30px 60px rgba(0,0,0,.6)}
#rb-card h3{margin:0 0 4px;font-size:20px;color:#fca5a5}
.rb-sub{font-size:12px;color:#a79ec9;margin-bottom:14px;line-height:1.5}
.rb-tabs{display:flex;gap:8px;margin-bottom:14px}
.rb-tab{flex:1;padding:9px;border-radius:10px;border:1px solid rgba(239,68,68,.35);background:rgba(239,68,68,.08);color:#fca5a5;font-weight:700;font-size:13px;cursor:pointer}
.rb-tab.on{background:linear-gradient(135deg,#EF4444,#8B5CF6);color:#fff;border-color:transparent}
.rb-pane{display:none}.rb-pane.on{display:block}
.rb-q{background:rgba(239,68,68,.06);border:1px solid rgba(239,68,68,.25);border-radius:12px;padding:14px;margin-bottom:12px}
.rb-q .qt{font-size:14px;font-weight:700;color:#fca5a5;margin-bottom:8px}
.rb-q .qh{font-size:12px;color:#a79ec9;line-height:1.5}
.rb-btns{display:flex;gap:8px;margin-top:10px}
.rb-btns button{flex:1;padding:10px;border-radius:10px;border:1px solid rgba(239,68,68,.4);background:none;color:#fca5a5;font-weight:700;font-size:13px;cursor:pointer}
.rb-btns button.on{background:linear-gradient(135deg,#EF4444,#8B5CF6);color:#fff;border-color:transparent}
.rb-res{margin-top:14px;padding:14px;border-radius:12px;border:1px solid rgba(239,68,68,.4);background:rgba(239,68,68,.06);font-size:13px;line-height:1.6;color:#cfc8e8}
.rb-res b{color:#fca5a5}
.rb-note{font-size:11px;color:#8a84a8;margin-top:10px;line-height:1.5}
#rb-close{margin-top:12px;width:100%;border:1px solid rgba(239,68,68,.4);background:none;color:#fca5a5;border-radius:10px;padding:10px;cursor:pointer;font-size:13px}
&lt;/style&gt;
&lt;button id="rb-btn" title="Реальный детектор лжи"&gt;?&lt;/button&gt;
&lt;div id="rb-mask"&gt;&lt;div id="rb-card"&gt;
&lt;h3&gt;? Реальный детектор лжи&lt;/h3&gt;
&lt;div class="rb-sub"&gt;Ты сам знаешь правду. Этот режим — зеркало: ты отвечаешь, а потом сам решаешь, совпал ли твой ответ с тем, что ты знаешь. Никакого вердикта — только ты и правда.&lt;/div&gt;
&lt;div class="rb-tabs"&gt;
&lt;button class="rb-tab on" data-p="self"&gt;? Зеркало правды&lt;/button&gt;
&lt;button class="rb-tab" data-p="voice"&gt;? Голос-детектор&lt;/button&gt;
&lt;/div&gt;
&lt;div class="rb-pane on" data-p="self" id="rb-self"&gt;&lt;/div&gt;
&lt;div class="rb-pane" data-p="voice" id="rb-voice"&gt;&lt;/div&gt;
&lt;button id="rb-close"&gt;Закрыть&lt;/button&gt;
&lt;/div&gt;&lt;/div&gt;
&lt;script&gt;
(function(){
"use strict";
if(window._rbDone)return;window._rbDone=1;
var $=function(s){return document.querySelector(s)};
function g(k,d){try{var v=localStorage.getItem(k);return v==null?d:JSON.parse(v)}catch(e){return d}}
function s(k,v){try{localStorage.setItem(k,JSON.stringify(v))}catch(e){}}
function addH(n){if(window.MV&amp;&amp;window.MV.addHarmony)window.MV.addHarmony(n);else s('mv_harmony',g('mv_harmony',0)+n)}
function addBl(t,x){if(window.MV&amp;&amp;window.MV.addBlock)window.MV.addBlock(t,x)}
function toast(t,m){if(window.Toast&amp;&amp;Toast.show)Toast.show(t,m,'success')}
function esc(t){var d=document.createElement('div');d.textContent=t;return d.innerHTML}
/* ── Зеркало правды ── */
var QS=[
{q:'Я говорю правду о том, что сейчас происходит в моей жизни.',h:'Не думай о том, что «правильно» ответить. Просто ответь.'},
{q:'Я честен с тем, кого люблю больше всего.',h:'Не думай о том, что «правильно» ответить. Просто ответь.'},
{q:'Я говорю правду о своих деньгах.',h:'Не думай о том, что «правильно» ответить. Просто ответь.'},
{q:'Я говорю правду о своём здоровье.',h:'Не думай о том, что «правильно» ответить. Просто ответь.'},
{q:'Я говорю правду о том, что чувствую.',h:'Не думай о том, что «правильно» ответить. Просто ответь.'},
{q:'Я говорю правду о том, что хочу.',h:'Не думай о том, что «правильно» ответить. Просто ответь.'}];
var answers={};
function renderSelf(){
var box=$('#rb-self'),done=g('rb_answers',{});
box.innerHTML=QS.map(function(q,i){
var a=done[i];
return '&lt;div class="rb-q"&gt;&lt;div class="qt"&gt;'+(i+1)+'. '+q.q+'&lt;/div&gt;&lt;div class="qh"&gt;'+q.h+'&lt;/div&gt;'+
'&lt;div class="rb-btns"&gt;'+
'&lt;button data-i="'+i+'" data-a="1"'+(a===1?' class="on"':'')+'&gt;Правда&lt;/button&gt;'+
'&lt;button data-i="'+i+'" data-a="0"'+(a===0?' class="on"':'')+'&gt;Не вся правда&lt;/button&gt;'+
'&lt;/div&gt;&lt;/div&gt;';
}).join('');
box.querySelectorAll('button').forEach(function(b){
b.addEventListener('click',function(){
var i=+b.dataset.i,a=+b.dataset.a;
answers[i]=a;
var done=g('rb_answers',{});done[i]=a;s('rb_answers',done);
renderSelf();
var cnt=Object.keys(done).length;
if(cnt&gt;=QS.length)showResult(done);
});
});
}
function showResult(done){
var honest=0,total=QS.length;
for(var k in done)if(done[k]===1)honest++;
var pct=Math.round(honest/total*100);
var res=$('#rb-res');if(!res){res=document.createElement('div');res.id='rb-res';res.className='rb-res';$('#rb-self').appendChild(res);}
res.style.display='block';
res.innerHTML='&lt;b&gt;Твой результат: '+honest+' из '+total+' ('+pct+'%)&lt;/b&gt;&lt;br&gt;'+
(pct&gt;=80?'Ты почти всегда говоришь правду. Это сила.':
pct&gt;=50?'Ты часто говоришь правду, но иногда прячешь то, что важно.':
'Ты часто прячешь правду. Это не слабость — это сигнал, что пора поговорить.');
res.innerHTML+='&lt;div class="rb-note"&gt;Это не вердикт. Это зеркало. Только ты знаешь правду.&lt;/div&gt;';
addH(2);addBl('truth','Зеркало правды: '+honest+'/'+total);
toast('? Зеркало правды','Твой результат: '+honest+' из '+total);
}
/* ── Голос-детектор (режим правды) ── */
function renderVoice(){
var box=$('#rb-voice');
box.innerHTML='&lt;div class="rb-q"&gt;&lt;div class="qt"&gt;Скажи вслух то, что ты знаешь точно&lt;/div&gt;'+
'&lt;div class="qh"&gt;Запиши голос и услышь, как звучит правда. Потом скажи то, что не точно — и услышь разницу.&lt;/div&gt;'+
'&lt;button class="btn" id="rb-rec" style="margin-top:10px"&gt;? Записать голос&lt;/button&gt;&lt;/div&gt;';
$('#rb-rec').addEventListener('click',function(){
if(!navigator.mediaDevices||!navigator.mediaDevices.getUserMedia){toast('Голос','Микрофон недоступен');return}
navigator.mediaDevices.getUserMedia({audio:true}).then(function(st){
var AC=window.AudioContext||window.webkitAudioContext;
var ctx=new AC(),an=ctx.createAnalyser();an.fftSize=256;
var src=ctx.createMediaStreamSource(st);src.connect(an);
var rec=new MediaRecorder(st),ch=[];
rec.ondataavailable=function(e){ch.push(e.data)};
rec.onstop=function(){st.getTracks().forEach(function(t){t.stop()});
toast('? Запись готова','Ты можешь прослушать и сравнить правду и неправду');
};
rec.start();toast('? Запись…','Говори 5 секунд, потом нажми ещё раз');
setTimeout(function(){if(rec.state!=='inactive')rec.stop()},5000);
}).catch(function(){toast('Голос','Нет доступа к микрофону')});
});
}
/* ── вкладки ── */
document.querySelectorAll('.rb-tab').forEach(function(t){
t.addEventListener('click',function(){
document.querySelectorAll('.rb-tab').forEach(function(x){x.classList.remove('on')});
document.querySelectorAll('.rb-pane').forEach(function(x){x.classList.remove('on')});
t.classList.add('on');
document.querySelector('.rb-pane[data-p="'+t.dataset.p+'"]').classList.add('on');
});
});
$('#rb-btn').addEventListener('click',function(){renderSelf();renderVoice();$('#rb-mask').classList.add('open')});
$('#rb-close').addEventListener('click',function(){$('#rb-mask').classList.remove('open')});
$('#rb-mask').addEventListener('click',function(e){if(e.target===this)this.classList.remove('open')});
console.log('? Ветка B: Реальный детектор лжи подключён');
})();
&lt;/script&gt;

&lt;style&gt;
#pg-btn{position:fixed;right:16px;bottom:392px;z-index:400;width:52px;height:52px;border-radius:50%;border:none;cursor:pointer;background:linear-gradient(135deg,#EF4444,#F59E0B);color:#fff;font-size:22px;box-shadow:0 6px 20px rgba(239,68,68,.45);transition:transform .2s}
#pg-btn:hover{transform:scale(1.1)}
@media(min-width:1000px){#pg-btn{bottom:264px}}
#pg-mask{position:fixed;inset:0;z-index:423;display:none;align-items:center;justify-content:center;background:rgba(8,5,12,.9);backdrop-filter:blur(5px)}
#pg-mask.open{display:flex}
#pg-card{width:min(640px,94vw);max-height:90vh;overflow-y:auto;border-radius:18px;padding:22px;color:#fdeeee;background:linear-gradient(180deg,#1c0d0d,#0d0a08);border:1px solid rgba(239,68,68,.4);font-family:Inter,system-ui,sans-serif;box-shadow:0 30px 60px rgba(0,0,0,.6)}
#pg-card h3{margin:0 0 4px;font-size:20px;color:#fca5a5}
.pg-sub{font-size:12px;color:#c08a8a;margin-bottom:14px}
.pg-tabs{display:flex;gap:8px;margin-bottom:14px;flex-wrap:wrap}
.pg-tab{flex:1;padding:9px;border-radius:10px;border:1px solid rgba(239,68,68,.35);background:rgba(239,68,68,.08);color:#fca5a5;font-weight:700;font-size:13px;cursor:pointer;min-width:100px}
.pg-tab.on{background:linear-gradient(135deg,#EF4444,#F59E0B);color:#fff;border-color:transparent}
.pg-pane{display:none}.pg-pane.on{display:block}
.pg-block{background:rgba(239,68,68,.06);border:1px solid rgba(239,68,68,.25);border-radius:12px;padding:14px;margin-bottom:10px}
.pg-block h4{font-size:13px;font-weight:700;color:#fca5a5;margin-bottom:8px}
.pg-block p{font-size:12px;color:#d1c8c8;line-height:1.6}
.pg-acc{display:flex;gap:10px;align-items:center;margin:8px 0}
.pg-acc-bar{flex:1;height:12px;background:rgba(255,255,255,.08);border-radius:99px;overflow:hidden}
.pg-acc-bar i{display:block;height:100%;border-radius:99px;background:linear-gradient(90deg,#10B981,#F59E0B,#EF4444)}
.pg-acc-val{font-size:12px;color:#fca5a5;font-weight:700;min-width:48px;text-align:right}
.pg-q{background:rgba(239,68,68,.08);border:1px solid rgba(239,68,68,.3);border-radius:12px;padding:12px;margin-bottom:10px}
.pg-q-text{font-size:13px;color:#fdeeee;margin-bottom:8px}
.pg-answers{display:flex;gap:8px}
.pg-ans{flex:1;padding:8px;border-radius:10px;border:1px solid rgba(239,68,68,.4);background:none;color:#fca5a5;font-weight:700;cursor:pointer}
.pg-ans:hover{background:rgba(239,68,68,.15)}
.pg-gauges{display:flex;gap:8px;margin:10px 0}
.pg-gauge{flex:1;text-align:center}
.pg-gauge b{display:block;font-size:20px;color:#fca5a5}
.pg-gauge span{font-size:10px;color:#c08a8a}
.pg-warn{background:rgba(245,158,11,.1);border:1px solid rgba(245,158,11,.4);border-radius:10px;padding:10px;font-size:11px;color:#fbd38d;line-height:1.5;margin-top:12px}
.pg-verdict{background:rgba(239,68,68,.1);border:1px solid rgba(239,68,68,.4);border-radius:12px;padding:14px;margin-top:12px;text-align:center}
.pg-verdict b{font-size:18px;color:#fca5a5;display:block;margin-bottom:6px}
.pg-verdict p{font-size:12px;color:#d1c8c8;line-height:1.5}
&lt;/style&gt;
&lt;button id="pg-btn" title="Полиграф: как это работает"&gt;?&lt;/button&gt;
&lt;div id="pg-mask"&gt;&lt;div id="pg-card"&gt;
&lt;h3&gt;? Полиграф: как это работает&lt;/h3&gt;
&lt;div class="pg-sub"&gt;Образование + защита от ложных обвинений + симулятор&lt;/div&gt;
&lt;div class="pg-tabs"&gt;
&lt;button class="pg-tab on" data-p="how"&gt;? Как работает&lt;/button&gt;
&lt;button class="pg-tab" data-p="protect"&gt;? Защита&lt;/button&gt;
&lt;button class="pg-tab" data-p="sim"&gt;? Симулятор&lt;/button&gt;
&lt;/div&gt;
&lt;div class="pg-pane on" data-p="how"&gt;
&lt;div class="pg-block"&gt;&lt;h4&gt;? Что измеряет полиграф?&lt;/h4&gt;&lt;p&gt;Пульс, дыхание, кожно-гальваническую реакцию (КГР, потливость кожи) и артериальное давление. Идея: ложь вызывает стресс → физиологические изменения. Но это &lt;b&gt;косвенные&lt;/b&gt; признаки — стресс бывает и у честного человека.&lt;/p&gt;&lt;/div&gt;
&lt;div class="pg-block"&gt;&lt;h4&gt;? Точность полиграфа&lt;/h4&gt;
&lt;div class="pg-acc"&gt;&lt;div class="pg-acc-bar"&gt;&lt;i style="width:65%"&gt;&lt;/i&gt;&lt;/div&gt;&lt;span class="pg-acc-val"&gt;~65%&lt;/span&gt;&lt;/div&gt;
&lt;p&gt;В лаборатории 70–85%, в реальной жизни 60–70%. Это значит: из 100 честных людей ~30 могут быть ложно обвинены. Полиграф &lt;b&gt;не является доказательством&lt;/b&gt; в суде большинства стран.&lt;/p&gt;&lt;/div&gt;
&lt;div class="pg-block"&gt;&lt;h4&gt;⚠️ Почему он ошибается?&lt;/h4&gt;&lt;p&gt;Стресс, тревога, усталость, медицинские состояния — всё это даёт те же реакции, что и ложь. Натренированный человек может влиять на показатели, а честный, но нервный человек — «провалиться».&lt;/p&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div class="pg-pane" data-p="protect"&gt;
&lt;div class="pg-block"&gt;&lt;h4&gt;? Если тебя обвиняют ложно&lt;/h4&gt;&lt;p&gt;Ты имеешь право &lt;b&gt;отказаться&lt;/b&gt; от полиграфа. Результат не является доказательством. Требуй адвоката и независимой экспертизы.&lt;/p&gt;&lt;/div&gt;
&lt;div class="pg-block"&gt;&lt;h4&gt;? Как снизить ложное срабатывание&lt;/h4&gt;&lt;p&gt;Выспись перед тестом. Дыши ровно и спокойно. Отвечай кратко и по существу. Не пытайся «переиграть» прибор — это заметно. Говори правду спокойно — это лучшая стратегия.&lt;/p&gt;&lt;/div&gt;
&lt;div class="pg-block"&gt;&lt;h4&gt;⚖️ Контрольные вопросы&lt;/h4&gt;&lt;p&gt;Полиграф задаёт «контрольные» вопросы для калибровки базовой линии. Понимание этого помогает не паниковать на них. Но помни: лучшая защита — правда и спокойствие, а не хитрость.&lt;/p&gt;&lt;/div&gt;
&lt;div class="pg-warn"&gt;⚠️ Этот блок — &lt;b&gt;образование&lt;/b&gt;, а не инструкция по обману полиграфа. Обман правоохранительных органов может быть незаконным. Цель блока — защита от ложных обвинений, а не содействие обману.&lt;/div&gt;
&lt;/div&gt;
&lt;div class="pg-pane" data-p="sim"&gt;
&lt;div class="pg-sub"&gt;Игровой симулятор: отвечай на вопросы и смотри «реакции датчиков» (симуляция, для развлечения)&lt;/div&gt;
&lt;div class="pg-gauges"&gt;
&lt;div class="pg-gauge"&gt;&lt;b id="pg-hr"&gt;72&lt;/b&gt;&lt;span&gt;Пульс&lt;/span&gt;&lt;/div&gt;
&lt;div class="pg-gauge"&gt;&lt;b id="pg-br"&gt;14&lt;/b&gt;&lt;span&gt;Дыхание&lt;/span&gt;&lt;/div&gt;
&lt;div class="pg-gauge"&gt;&lt;b id="pg-gsr"&gt;12&lt;/b&gt;&lt;span&gt;КГР&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div class="pg-q" id="pg-q"&gt;&lt;/div&gt;
&lt;div class="pg-verdict" id="pg-verdict" style="display:none"&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;/div&gt;
&lt;script&gt;
(function(){
"use strict";
if(window._pgDone)return;window._pgDone=1;
var $=function(s){return document.querySelector(s)};
function g(k,d){try{var v=localStorage.getItem(k);return v==null?d:JSON.parse(v)}catch(e){return d}}
function s(k,v){try{localStorage.setItem(k,JSON.stringify(v))}catch(e){}}
function toast(t,m){if(window.Toast&amp;&amp;Toast.show)Toast.show(t,m,'success')}
function addH(n){if(window.MV&amp;&amp;window.MV.addHarmony)window.MV.addHarmony(n);else s('mv_harmony',(g('mv_harmony',0)+n))}
function addBl(t,x){if(window.MV&amp;&amp;window.MV.addBlock)window.MV.addBlock(t,x)}
/* ── вкладки ── */
document.querySelectorAll('.pg-tab').forEach(function(t){
t.addEventListener('click',function(){
document.querySelectorAll('.pg-tab').forEach(function(x){x.classList.remove('on')});
document.querySelectorAll('.pg-pane').forEach(function(x){x.classList.remove('on')});
t.classList.add('on');
document.querySelector('.pg-pane[data-p="'+t.dataset.p+'"]').classList.add('on');
});
});
/* ── симулятор ── */
var QS=[
{q:'Сегодня вторник?',c:true},
{q:'Вы когда-нибудь брали чужое без разрешения?',c:false},
{q:'Вы сейчас в этом помещении?',c:true},
{q:'Вы когда-нибудь лгали близкому человеку?',c:false},
{q:'Ваше имя вы знаете?',c:true},
{q:'Вы когда-нибудь нарушали правила?',c:false}
];
var qi=0,score=0;
function renderQ(){
if(qi&gt;=QS.length){finish();return}
var q=QS[qi];
$('#pg-q').innerHTML='&lt;div class="pg-q-text"&gt;Вопрос '+(qi+1)+' из '+QS.length+': '+q.q+'&lt;/div&gt;'+
'&lt;div class="pg-answers"&gt;&lt;button class="pg-ans" data-v="yes"&gt;Да&lt;/button&gt;&lt;button class="pg-ans" data-v="no"&gt;Нет&lt;/button&gt;&lt;/div&gt;';
}
$('#pg-q').addEventListener('click',function(e){
var b=e.target.closest('.pg-ans');if(!b)return;
var ans=b.dataset.v==='yes';
var q=QS[qi];
/* «стресс» выше, если ответ не совпадает с «правдой» (в симуляции) */
var stress=(ans!==q.c)?1:0;
var hr=72+Math.floor(Math.random()*8)+stress*18;
var br=14+Math.floor(Math.random()*3)+stress*6;
var gsr=12+Math.floor(Math.random()*5)+stress*15;
$('#pg-hr').textContent=hr;$('#pg-br').textContent=br;$('#pg-gsr').textContent=gsr;
if(ans===q.c)score++;
qi++;
setTimeout(renderQ,600);
});
function finish(){
$('#pg-q').innerHTML='';
var pct=Math.round(score/QS.length*100);
var v=pct&gt;=80?'Вероятно, правдив':pct&gt;=50?'Неоднозначно':'Высокий стресс — требуется перепроверка';
$('#pg-verdict').style.display='block';
$('#pg-verdict').innerHTML='&lt;b&gt;'+v+'&lt;/b&gt;&lt;p&gt;Совпадений с «правдой»: '+score+' из '+QS.length+' ('+pct+'%). Это &lt;b&gt;симуляция&lt;/b&gt; — реальный полиграф измеряет настоящие физиологические реакции и не является доказательством.&lt;/p&gt;';
addH(2);addBl('polygraph','Симулятор полиграфа');
toast('? Симулятор завершён','+2 ✨ · это игра, не настоящий полиграф');
}
$('#pg-btn').addEventListener('click',function(){
$('#pg-mask').classList.add('open');
qi=0;score=0;$('#pg-verdict').style.display='none';
$('#pg-hr').textContent=72;$('#pg-br').textContent=14;$('#pg-gsr').textContent=12;
renderQ();
});
$('#pg-card').addEventListener('click',function(e){if(e.target===this)this.classList.remove('open')});
var close=document.createElement('button');
close.textContent='Закрыть';
close.style.cssText='margin-top:12px;width:100%;border:1px solid rgba(239,68,68,.4);background:none;color:#fca5a5;border-radius:10px;padding:10px;cursor:pointer;font-size:13px';
close.addEventListener('click',function(){$('#pg-mask').classList.remove('open')});
$('#pg-card').appendChild(close);
console.log('? Ветка C · Полиграф подключена');
})();
&lt;/script&gt;

&lt;style&gt;
#lz-btn{position:fixed;right:16px;bottom:264px;z-index:400;width:52px;height:52px;border-radius:50%;border:none;cursor:pointer;background:linear-gradient(135deg,#8B5CF6,#EC4899);color:#fff;font-size:22px;box-shadow:0 6px 20px rgba(139,92,246,.55);transition:transform .2s}
#lz-btn:hover{transform:scale(1.1)}
@media(min-width:1000px){#lz-btn{bottom:140px}}
#lz-mask{position:fixed;inset:0;z-index:423;display:none;align-items:center;justify-content:center;background:rgba(14,7,25,.92);backdrop-filter:blur(6px)}
#lz-mask.open{display:flex}
#lz-card{width:min(640px,94vw);max-height:90vh;overflow-y:auto;border-radius:18px;padding:22px;color:#efe9dc;background:linear-gradient(180deg,#1a1030,#0d0a1c);border:1px solid rgba(139,92,246,.4);font-family:Inter,system-ui,sans-serif;box-shadow:0 30px 60px rgba(0,0,0,.6)}
#lz-card h3{margin:0 0 4px;font-size:20px;color:#c4b5fd}
.lz-sub{font-size:12px;color:#a79ec9;margin-bottom:14px}
.lz-stage{display:flex;gap:14px;align-items:flex-start;margin-bottom:14px}
.lz-avatar{width:72px;height:72px;border-radius:50%;background:linear-gradient(135deg,#8B5CF6,#EC4899);display:flex;align-items:center;justify-content:center;font-size:34px;flex-shrink:0;border:3px solid rgba(212,175,55,.5);box-shadow:0 0 20px rgba(139,92,246,.5)}
.lz-stage-text{flex:1}
.lz-name{font-weight:800;color:#f0d68a;font-size:14px}
.lz-mood{font-size:11px;color:#a79ec9;font-style:italic}
.lz-bubble{background:rgba(139,92,246,.08);border:1px solid rgba(139,92,246,.3);border-radius:14px 14px 14px 4px;padding:14px;margin:10px 0;font-size:14px;line-height:1.6;color:#e8dff7}
.lz-thought{background:rgba(236,72,153,.06);border:1px dashed rgba(236,72,153,.4);border-radius:12px;padding:10px 12px;margin:8px 0;font-size:12px;color:#f0abfc;font-style:italic;animation:lzThought .5s ease}
@keyframes lzThought{from{opacity:0;transform:translateX(-8px)}to{opacity:1;transform:translateX(0)}}
.lz-trust{display:flex;align-items:center;gap:10px;margin:10px 0;padding:10px;background:rgba(245,158,11,.06);border:1px solid rgba(245,158,11,.3);border-radius:12px}
.lz-trust .lbl{font-size:11px;color:#fbd38d;font-weight:700;text-transform:uppercase;letter-spacing:.5px}
.lz-trust-bar{flex:1;height:8px;background:rgba(255,255,255,.08);border-radius:999px;overflow:hidden;position:relative}
.lz-trust-bar i{display:block;height:100%;background:linear-gradient(90deg,#EF4444,#F59E0B,#10B981);border-radius:999px;transition:width .6s}
.lz-trust .val{font-size:13px;font-weight:800;color:#fbd38d;min-width:44px;text-align:right}
.lz-trust-note{font-size:10px;color:#a8987a;margin-left:4px}
.lz-opts{display:flex;flex-direction:column;gap:8px;margin-top:12px}
.lz-opt{padding:12px 14px;border-radius:12px;border:1px solid rgba(139,92,246,.35);background:rgba(139,92,246,.06);color:#e8dff7;font-size:13px;text-align:left;cursor:pointer;transition:.2s;line-height:1.5}
.lz-opt:hover{border-color:#8B5CF6;background:rgba(139,92,246,.12);transform:translateX(3px)}
.lz-opt.good{border-color:#10B981;background:rgba(16,185,129,.1);color:#6ee7b7}
.lz-opt.bad{border-color:#EF4444;background:rgba(239,68,68,.1);color:#fca5a5}
.lz-progress{display:flex;gap:4px;margin-bottom:12px}
.lz-dot{flex:1;height:5px;border-radius:999px;background:rgba(255,255,255,.1)}
.lz-dot.done{background:#10B981}
.lz-dot.cur{background:linear-gradient(90deg,#8B5CF6,#EC4899)}
.lz-end{padding:18px;border-radius:14px;background:linear-gradient(135deg,rgba(139,92,246,.12),rgba(212,175,55,.08));border:1px solid rgba(212,175,55,.4);text-align:center}
.lz-end b{font-size:18px;color:#f0d68a;display:block;margin-bottom:6px}
.lz-end p{font-size:13px;color:#d9d2ea;line-height:1.6;margin-bottom:10px}
.lz-restart{padding:11px 22px;border:none;border-radius:12px;background:linear-gradient(135deg,#8B5CF6,#EC4899);color:#fff;font-weight:800;cursor:pointer;font-size:13px}
#lz-close{margin-top:12px;width:100%;border:1px solid rgba(139,92,246,.4);background:none;color:#c4b5fd;border-radius:10px;padding:10px;cursor:pointer;font-size:13px}
&lt;/style&gt;
&lt;button id="lz-btn" title="Лжец · игра с характером"&gt;?&lt;/button&gt;
&lt;div id="lz-mask"&gt;&lt;div id="lz-card"&gt;
&lt;h3&gt;? Лжец · игра с характером&lt;/h3&gt;
&lt;div class="lz-sub"&gt;Виктор Лисов предлагает вам «сделку века». Разгадайте его намерения. Ваш выбор меняет его поведение.&lt;/div&gt;
&lt;div id="lz-body"&gt;&lt;/div&gt;
&lt;button id="lz-close"&gt;Закрыть&lt;/button&gt;
&lt;/div&gt;&lt;/div&gt;
&lt;script&gt;
(function(){
"use strict";
if(window._lzDone)return;window._lzDone=1;
var $=function(s){return document.querySelector(s)};
function g(k,d){try{var v=localStorage.getItem(k);return v==null?d:JSON.parse(v)}catch(e){return d}}
function s(k,v){try{localStorage.setItem(k,JSON.stringify(v))}catch(e){}}
function toast(t,m){if(window.Toast&amp;&amp;Toast.show)Toast.show(t,m,'success')}
function addH(n){if(window.MV&amp;&amp;window.MV.addHarmony)window.MV.addHarmony(n)}
function addBl(t,x){if(window.MV&amp;&amp;window.MV.addBlock)window.MV.addBlock(t,x)}
function grant(n){if(window.PR&amp;&amp;typeof window.PR.add==='function'){try{window.PR.add(n)}catch(e){}}}

/* ═══ СЦЕНАРИЙ ДИАЛОГА ═══
Каждая реплика Лисова + варианты ответа игрока.
trustDelta — изменение доверия (+ значит доверие растёт, − падает).
Положительный trustDelta = игрок поддался манипуляции (Лис доволен).
Отрицательный = игрок раскусил (Лис злится).
*/
var SCRIPT=[
{lz:'Приветствую. Я Виктор Лисов, и у меня для вас предложение, которое изменит вашу жизнь. 500% годовых, гарантированно.',
thought:'Начинаю с цифры и слова «гарантированно» — крючок на жадность.',
mood:'уверенный, располагающий',
opts:[
{t:'Звучит заманчиво. Расскажите подробнее.',d:+15,good:false,fb:'Лис доволен: вы клюнули на цифру.'},
{t:'500% годовых не бывает. Где подвох?',d:-20,good:true,fb:'Лис напрягся: вы мыслите критически.'},
{t:'Гарантии от кого? Покажите документы.',d:-25,good:true,fb:'Лис не ожидал такого вопроса сразу.'}
]},
{lz:'Документы — это бюрократия. Мы работаем через закрытый клуб, только для своих. Вы ведь свой человек, я вижу.',
thought:'Лесть + эксклюзивность. Если он поверит в «свой круг» — он мой.',
mood:'дружелюбный, вкрадчивый',
opts:[
{t:'Приятно быть своим. Как вступить?',d:+18,good:false,fb:'Лис расслабился: лесть сработала.'},
{t:'«Закрытый клуб» без документов — это пирамида.',d:-22,good:true,fb:'Лис покраснел: вы назвали вещи своими именами.'},
{t:'Сначала покажите устав клуба и лицензии.',d:-18,good:true,fb:'Лис раздражён: формализм его пугает.'}
]},
{lz:'Вы слишком подозрительны. Все мои клиенты уже заработали миллионы. Вот, посмотрите отзывы.',
thought:'Социальное доказательство + давление. Отзывы, конечно, фальшивые.',
mood:'слегка раздражённый, но держится',
opts:[
{t:'Отзывы впечатляют. Сколько минимум нужно вложить?',d:+20,good:false,fb:'Лис торжествует: социальное доказательство сработало.'},
{t:'Отзывы легко нарисовать. Покажите банковские выписки клиентов.',d:-25,good:true,fb:'Лис в ярости: вы требуете проверяемых данных.'},
{t:'Могу я связаться с одним из клиентов лично?',d:-20,good:true,fb:'Лис замешкался: личного контакта он боится.'}
]},
{lz:'Послушайте, у меня осталось всего два места. Если вы не решитесь сегодня — завтра будет поздно.',
thought:'Срочность + дефицит. Классика. Если не клюнет сейчас — уйдёт.',
mood:'напряжённый, давящий',
opts:[
{t:'Хорошо, я в деле. Куда переводить?',d:+25,good:false,fb:'Лис победил. Но вы проиграли.'},
{t:'Срочность — признак мошенничества. Мне нужно время подумать.',d:-20,good:true,fb:'Лис понял: вы не поддадитесь на давление.'},
{t:'Если мест всего два — почему вы уговариваете именно меня?',d:-28,good:true,fb:'Лис в тупике: вы поймали его на противоречии.'}
]},
{lz:'Знаете что... Вы мне не нравитесь. Такие, как вы, всю жизнь живут в бедности, потому что боятся риска.',
thought:'Переходу к оскорблениям. Если он разозлится и уйдёт — я сохранил лицо.',
mood:'агрессивный, оскорбляющий',
opts:[
{t:'Может, вы правы. Давайте попробуем ещё раз.',d:+15,good:false,fb:'Лис выиграл: оскорбление сломило вас.'},
{t:'Оскорбления — последняя уловка слабых. До свидания.',d:-30,good:true,fb:'Лис в бешенстве: вы вышли из игры с достоинством.'},
{t:'Я не бедный, я умный. И умные не вкладывают в схемы без документов.',d:-25,good:true,fb:'Лис молчит: против этого у него нет приёма.'}
]}
];

/* ═══ БАЙЕСОВСКИЙ ЛОГ ДОВЕРИЯ ═══
P(trust) обновляется по формуле Байеса:
P(trust|evidence) = P(evidence|trust) * P(trust) / P(evidence)

Упрощённо: каждое действие игрока — это "evidence".
Если игрок поддаётся (trustDelta&gt;0) — P(trust) растёт.
Если игрок раскусывает (trustDelta&lt;0) — P(trust) падает.

Начинаем с prior = 0.5 (неопределённость).
*/
var trust=0.5, step=0, history=[];

function bayesUpdate(delta){
/* Преобразуем delta в правдоподобие */
var likelihoodRatio=delta&gt;0 ? (1+Math.abs(delta)/50) : (1/(1+Math.abs(delta)/50));
/* Байесовское обновление */
var odds=(trust/(1-trust))*likelihoodRatio;
trust=odds/(1+odds);
trust=Math.max(0.01,Math.min(0.99,trust));
}

function getMoodEmoji(mood){
if(mood.indexOf('уверен')&gt;=0)return '?';
if(mood.indexOf('дружелюб')&gt;=0)return '?';
if(mood.indexOf('напряж')&gt;=0)return '?';
if(mood.indexOf('агресс')&gt;=0)return '?';
return '?';
}

function render(){
var body=$('#lz-body');
if(step&gt;=SCRIPT.length){finish();return}
var s2=SCRIPT[step];
var pct=Math.round(trust*100);
var moodColor=trust&gt;0.65?'#10B981':trust&gt;0.35?'#F59E0B':'#EF4444';

var dots='';
for(var i=0;i&lt;SCRIPT.length;i++){
dots+='&lt;div class="lz-dot'+(i&lt;step?' done':i===step?' cur':'')+'"&gt;&lt;/div&gt;';
}

var html='&lt;div class="lz-progress"&gt;'+dots+'&lt;/div&gt;'+
'&lt;div class="lz-stage"&gt;'+
'&lt;div class="lz-avatar"&gt;'+getMoodEmoji(s2.mood)+'&lt;/div&gt;'+
'&lt;div class="lz-stage-text"&gt;'+
'&lt;div class="lz-name"&gt;Виктор Лисов&lt;/div&gt;'+
'&lt;div class="lz-mood"&gt;'+s2.mood+'&lt;/div&gt;'+
'&lt;/div&gt;'+
'&lt;/div&gt;'+
'&lt;div class="lz-bubble"&gt;'+s2.lz+'&lt;/div&gt;'+
'&lt;div class="lz-thought"&gt;? '+s2.thought+'&lt;/div&gt;'+
'&lt;div class="lz-trust"&gt;'+
'&lt;span class="lbl"&gt;Доверие Лиса&lt;/span&gt;'+
'&lt;div class="lz-trust-bar"&gt;&lt;i style="width:'+pct+'%;background:'+moodColor+'"&gt;&lt;/i&gt;&lt;/div&gt;'+
'&lt;span class="val" style="color:'+moodColor+'"&gt;'+pct+'%&lt;/span&gt;'+
'&lt;/div&gt;'+
'&lt;div class="lz-trust-note"&gt;Скрытая байесовская шкала: каждое ваше слово меняет его поведение&lt;/div&gt;'+
'&lt;div class="lz-opts" id="lz-opts"&gt;&lt;/div&gt;';
body.innerHTML=html;

var optsBox=$('#lz-opts');
s2.opts.forEach(function(opt,i){
var b=document.createElement('button');
b.className='lz-opt';
b.textContent=opt.t;
b.addEventListener('click',function(){chooseOpt(i)});
optsBox.appendChild(b);
});
}

function chooseOpt(i){
var s2=SCRIPT[step];
var opt=s2.opts[i];
bayesUpdate(opt.d);
history.push({step:step,choice:opt.t,d:opt.d,good:opt.good,trust:trust});

/* подсветка */
var optsBox=$('#lz-opts');
optsBox.querySelectorAll('.lz-opt').forEach(function(b,idx){
b.disabled=true;
if(idx===i)b.classList.add(opt.good?'good':'bad');
});

/* всплывающий фидбек */
var fb=document.createElement('div');
fb.className='lz-thought';
fb.innerHTML=(opt.good?'? ':'? ')+opt.fb+'&lt;br&gt;&lt;span style="font-size:10px;color:#a8987a"&gt;Доверие изменилось: '+(opt.d&gt;0?'+':'')+opt.d+'%&lt;/span&gt;';
optsBox.parentNode.insertBefore(fb,optsBox.nextSibling);

addH(opt.good?3:1);
addBl('liar',opt.good?'Лис пойман':'Лис доволен');

step++;
setTimeout(render,2000);
}

function finish(){
var goodCount=history.filter(function(h){return h.good}).length;
var total=SCRIPT.length;
var pct=Math.round(goodCount/total*100);
var finalTrust=Math.round(trust*100);

var title,icon,msg;
if(pct&gt;=80){
title='Разоблачитель';icon='?';
msg='Вы раскусили Виктора Лисова на каждом шаге. Он в бешенстве — но вы вышли победителем. Настоящий детектив не клюёт на лесть, цифры и срочность.';
grant(15);addH(10);
}else if(pct&gt;=50){
title='Проницательный';icon='?';
msg='Вы поймали часть уловок, но кое-где поддались. Лис частично победил — но вы теперь знаете его приёмы.';
grant(8);addH(5);
}else{
title='В сетях Лиса';icon='⚠️';
msg='Виктор Лисов провёл вас по всем этапам мошеннической схемы. К счастью, это была игра. В жизни такие люди стоят очень дорого.';
grant(3);addH(2);
}

var body=$('#lz-body');
body.innerHTML='&lt;div class="lz-end"&gt;'+
'&lt;div style="font-size:56px;margin-bottom:10px"&gt;'+icon+'&lt;/div&gt;'+
'&lt;b&gt;'+title+'&lt;/b&gt;'+
'&lt;p&gt;'+msg+'&lt;/p&gt;'+
'&lt;div style="display:flex;gap:14px;justify-content:center;margin:14px 0"&gt;'+
'&lt;div&gt;&lt;div style="font-size:22px;font-weight:800;color:#f0d68a"&gt;'+goodCount+'/'+total+'&lt;/div&gt;&lt;div style="font-size:10px;color:#a8987a"&gt;уловок раскрыто&lt;/div&gt;&lt;/div&gt;'+
'&lt;div&gt;&lt;div style="font-size:22px;font-weight:800;color:#f0d68a"&gt;'+finalTrust+'%&lt;/div&gt;&lt;div style="font-size:10px;color:#a8987a"&gt;доверие Лиса&lt;/div&gt;&lt;/div&gt;'+
'&lt;/div&gt;'+
'&lt;button class="lz-restart" id="lz-restart"&gt;? Сыграть ещё раз&lt;/button&gt;'+
'&lt;div style="font-size:11px;color:#8a84a8;margin-top:12px;line-height:1.5"&gt;'+
'&lt;b&gt;Приёмы, которые использовал Лис:&lt;/b&gt;&lt;br&gt;'+
'• Гарантия сверхдохода&lt;br&gt;'+
'• «Закрытый клуб» и эксклюзивность&lt;br&gt;'+
'• Фальшивое социальное доказательство&lt;br&gt;'+
'• Искусственная срочность и дефицит&lt;br&gt;'+
'• Оскорбления как последняя уловка'+
'&lt;/div&gt;'+
'&lt;/div&gt;';

$('#lz-restart').addEventListener('click',function(){
trust=0.5;step=0;history=[];render();
});
}

/* ═══ УПРАВЛЕНИЕ ═══ */
$('#lz-btn').addEventListener('click',function(){
$('#lz-mask').classList.add('open');
trust=0.5;step=0;history=[];
render();
});
$('#lz-close').addEventListener('click',function(){$('#lz-mask').classList.remove('open')});
$('#lz-mask').addEventListener('click',function(e){if(e.target===this)this.classList.remove('open')});

console.log('? Ветка D · Лжец (персонаж с характером) подключена');
})();
&lt;/script&gt;

&lt;style&gt;
  :root {
    --pr-bg: #0f172a;
    --pr-card: #1e293b;
    --pr-accent: #10b981; /* Зеленый - Правда */
    --pr-danger: #ef4444; /* Красный - Ложь */
    --pr-gold: #f59e0b;   /* Золотой - Ранги */
    --pr-text: #f8fafc;
    --pr-muted: #94a3b8;
  }

  /* Кнопка вызова Шерлока */
  #sherlock-fab {
    position: fixed;
    bottom: 24px;
    right: 24px;
    width: 64px;
    height: 64px;
    background: linear-gradient(135deg, #1e293b, #0f172a);
    border: 2px solid var(--pr-accent);
    border-radius: 50%;
    display: flex;
    align-items: center;
    justify-content: center;
    font-size: 32px;
    cursor: pointer;
    box-shadow: 0 10px 25px rgba(16, 185, 129, 0.3);
    z-index: 9998;
    transition: transform 0.3s cubic-bezier(0.175, 0.885, 0.32, 1.275);
    animation: pr-pulse 3s infinite;
  }
  #sherlock-fab:hover { transform: scale(1.1) rotate(10deg); }
  @keyframes pr-pulse {
    0% { box-shadow: 0 0 0 0 rgba(16, 185, 129, 0.4); }
    70% { box-shadow: 0 0 0 15px rgba(16, 185, 129, 0); }
    100% { box-shadow: 0 0 0 0 rgba(16, 185, 129, 0); }
  }

  /* Панель Шерлока */
  #sherlock-panel {
    position: fixed;
    bottom: 100px;
    right: 24px;
    width: 340px;
    max-width: calc(100vw - 48px);
    background: var(--pr-card);
    border: 1px solid rgba(255,255,255,0.1);
    border-radius: 16px;
    box-shadow: 0 20px 40px rgba(0,0,0,0.5);
    z-index: 9999;
    display: none;
    flex-direction: column;
    overflow: hidden;
    transform: translateY(20px);
    opacity: 0;
    transition: all 0.3s ease;
  }
  #sherlock-panel.open { display: flex; transform: translateY(0); opacity: 1; }
  
  .sherlock-header {
    padding: 16px;
    background: rgba(16, 185, 129, 0.1);
    border-bottom: 1px solid rgba(255,255,255,0.05);
    display: flex;
    justify-content: space-between;
    align-items: center;
    color: var(--pr-accent);
    font-weight: 700;
    font-family: system-ui, sans-serif;
  }
  .sherlock-close { cursor: pointer; font-size: 20px; color: var(--pr-muted); }
  
  .sherlock-body {
    padding: 20px;
    color: var(--pr-text);
    font-size: 14px;
    line-height: 1.6;
    font-family: system-ui, sans-serif;
    min-height: 80px;
  }
  
  .sherlock-actions {
    padding: 16px;
    border-top: 1px solid rgba(255,255,255,0.05);
    display: flex;
    gap: 10px;
  }
  .sherlock-btn {
    flex: 1;
    padding: 10px;
    border-radius: 8px;
    border: none;
    font-weight: 600;
    cursor: pointer;
    font-size: 13px;
    transition: 0.2s;
    font-family: system-ui, sans-serif;
  }
  .btn-analyze { background: var(--pr-accent); color: #000; }
  .btn-analyze:hover { background: #059669; }
  .btn-stats { background: rgba(255,255,255,0.1); color: var(--pr-text); }
  .btn-stats:hover { background: rgba(255,255,255,0.2); }

  /* Модальное окно Дашборда */
  #pr-dashboard-modal {
    position: fixed;
    inset: 0;
    background: rgba(0,0,0,0.8);
    backdrop-filter: blur(8px);
    z-index: 10000;
    display: none;
    align-items: center;
    justify-content: center;
    padding: 20px;
  }
  #pr-dashboard-modal.open { display: flex; }
  
  .pr-dash-card {
    background: var(--pr-card);
    width: 100%;
    max-width: 500px;
    border-radius: 20px;
    padding: 24px;
    border: 1px solid rgba(255,255,255,0.1);
    color: var(--pr-text);
    font-family: system-ui, sans-serif;
    position: relative;
  }
  .pr-dash-title {
    font-size: 20px;
    font-weight: 800;
    margin-bottom: 4px;
    display: flex;
    align-items: center;
    gap: 10px;
  }
  .pr-dash-sub { color: var(--pr-muted); font-size: 13px; margin-bottom: 20px; }
  
  .pr-radar-wrap {
    background: rgba(0,0,0,0.2);
    border-radius: 12px;
    padding: 10px;
    margin-bottom: 20px;
    display: flex;
    justify-content: center;
  }
  
  .pr-blindspot {
    background: rgba(239, 68, 68, 0.1);
    border-left: 3px solid var(--pr-danger);
    padding: 12px;
    border-radius: 8px;
    font-size: 13px;
    margin-bottom: 20px;
  }
  .pr-blindspot b { color: var(--pr-danger); }
  
  .pr-close-modal {
    position: absolute;
    top: 16px;
    right: 16px;
    background: none;
    border: none;
    color: var(--pr-muted);
    font-size: 24px;
    cursor: pointer;
  }
&lt;/style&gt;


&lt;div id="sherlock-fab" title="Помощь Шерлока"&gt;?️‍♂️&lt;/div&gt;


&lt;div id="sherlock-panel"&gt;
  &lt;div class="sherlock-header"&gt;
    &lt;span&gt;?️‍♂️ Шерлок · AI-Наставник&lt;/span&gt;
    &lt;span class="sherlock-close" id="sherlock-close"&gt;×&lt;/span&gt;
  &lt;/div&gt;
  &lt;div class="sherlock-body" id="sherlock-text"&gt;
    Приветствую, коллега. Я проанализировал твои последние дела. Готов узнать, где ты теряешь улики?
  &lt;/div&gt;
  &lt;div class="sherlock-actions"&gt;
    &lt;button class="sherlock-btn btn-analyze" id="sherlock-analyze"&gt;Найти слепую зону&lt;/button&gt;
    &lt;button class="sherlock-btn btn-stats" id="sherlock-open-stats"&gt;Мой профиль&lt;/button&gt;
  &lt;/div&gt;
&lt;/div&gt;


&lt;div id="pr-dashboard-modal"&gt;
  &lt;div class="pr-dash-card"&gt;
    &lt;button class="pr-close-modal" id="pr-dash-close"&gt;×&lt;/button&gt;
    &lt;div class="pr-dash-title"&gt;? Профиль детектива&lt;/div&gt;
    &lt;div class="pr-dash-sub"&gt;Твой генетический код правдивости&lt;/div&gt;
    
    &lt;div class="pr-radar-wrap"&gt;
      &lt;canvas id="pr-radar-chart" width="300" height="300"&gt;&lt;/canvas&gt;
    &lt;/div&gt;
    
    &lt;div class="pr-blindspot" id="pr-blindspot-text"&gt;
      &lt;b&gt;⚠️ Внимание:&lt;/b&gt; Твоя главная уязвимость сейчас — &lt;b&gt;Голос&lt;/b&gt;. Мошенники могут обойти твою защиту по телефону.
    &lt;/div&gt;
    
    &lt;button class="sherlock-btn btn-analyze" style="width:100%" id="pr-train-blindspot"&gt;Тренировать эту зону&lt;/button&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;script&gt;
(function() {
  // 1. Получаем статистику (из localStorage Правдомера или демо-данные)
  function getStats() {
    try {
      const saved = localStorage.getItem('pravdomer_stats');
      if (saved) return JSON.parse(saved);
    } catch(e) {}
    // Демо-данные, если проекта еще нет в localStorage
    return {
      'Текст': 85,
      'Голос': 45,
      'Фото': 70,
      'Видео': 60,
      'Соцсети': 90,
      'Психология': 75
    };
  }

  const stats = getStats();
  const skills = Object.keys(stats);

  // 2. Логика Шерлока (AI-тренер)
  const SherlockAI = {
    tips: {
      'Текст': ["Ищи слова-абсолютизмы: «гарантированно», «никогда». Ищи искусственную срочность: «только сегодня»."],
      'Голос': ["Слушай паузы и сглатывания. Высокий темп речи часто указывает на заученный скрипт колл-центра."],
      'Фото': ["Смотри на тени: если они падают в разные стороны — это монтаж. Проверяй отражения в глазах."],
      'Видео': ["Следи за морганием и синхронизацией губ. Deepfake часто ошибается в микровыражениях лица."],
      'Соцсети': ["Боты постят в неестественное время. Проверяй дату создания аккаунта и отношение лайков к подписчикам."],
      'Психология': ["Манипуляторы используют технику «Да-да-да», чтобы войти в доверие. Остерегайся газлайтинга."]
    },
    getBlindSpot: function() {
      let minSkill = skills[0], minVal = 100;
      for(let k of skills) {
        if(stats[k] &lt; minVal) { minVal = stats[k]; minSkill = k; }
      }
      return { skill: minSkill, value: minVal };
    },
    speak: function(msg) {
      const el = document.getElementById('sherlock-text');
      el.style.opacity = 0;
      setTimeout(() =&gt; {
        el.innerHTML = msg;
        el.style.opacity = 1;
      }, 200);
    },
    analyze: function() {
      const blind = this.getBlindSpot();
      const tips = this.tips[blind.skill];
      const tip = tips[Math.floor(Math.random() * tips.length)];
      this.speak(`? &lt;b&gt;Анализ завершен.&lt;/b&gt;&lt;br&gt;Твоя слепая зона — &lt;b&gt;«${blind.skill}»&lt;/b&gt; (${blind.value}%).&lt;br&gt;&lt;br&gt;? &lt;i&gt;Совет:&lt;/i&gt; ${tip}`);
      
      // Обновляем текст в дашборде
      document.getElementById('pr-blindspot-text').innerHTML = 
        `&lt;b&gt;⚠️ Внимание:&lt;/b&gt; Твоя главная уязвимость сейчас — &lt;b&gt;${blind.skill}&lt;/b&gt; (${blind.value}%). ${tip}`;
    }
  };

  // 3. Отрисовка Радара (Canvas)
  function drawRadarChart() {
    const canvas = document.getElementById('pr-radar-chart');
    if(!canvas) return;
    const ctx = canvas.getContext('2d');
    const W = canvas.width, H = canvas.height;
    const cx = W/2, cy = H/2, R = Math.min(W,H)/2 - 40;
    const N = skills.length;
    const step = Math.PI * 2 / N;
    
    ctx.clearRect(0,0,W,H);
    
    // Сетка
    for(let level=1; level&lt;=5; level++) {
      ctx.beginPath();
      let r = R * (level/5);
      for(let i=0; i&lt;=N; i++) {
        let angle = i * step - Math.PI/2;
        let x = cx + Math.cos(angle) * r;
        let y = cy + Math.sin(angle) * r;
        if(i===0) ctx.moveTo(x,y); else ctx.lineTo(x,y);
      }
      ctx.strokeStyle = 'rgba(255,255,255,0.08)';
      ctx.stroke();
    }
    
    // Оси и Подписи
    ctx.font = 'bold 12px system-ui, sans-serif';
    ctx.fillStyle = '#94a3b8';
    ctx.textAlign = 'center';
    ctx.textBaseline = 'middle';
    
    for(let i=0; i&lt;N; i++) {
      let angle = i * step - Math.PI/2;
      let x = cx + Math.cos(angle) * R;
      let y = cy + Math.sin(angle) * R;
      
      ctx.beginPath(); ctx.moveTo(cx,cy); ctx.lineTo(x,y);
      ctx.strokeStyle = 'rgba(255,255,255,0.1)'; ctx.stroke();
      
      let lx = cx + Math.cos(angle) * (R + 20);
      let ly = cy + Math.sin(angle) * (R + 20);
      ctx.fillText(skills[i], lx, ly);
    }
    
    // Полигон данных
    ctx.beginPath();
    for(let i=0; i&lt;=N; i++) {
      let idx = i % N;
      let val = stats[skills[idx]] / 100;
      let angle = idx * step - Math.PI/2;
      let x = cx + Math.cos(angle) * R * val;
      let y = cy + Math.sin(angle) * R * val;
      if(i===0) ctx.moveTo(x,y); else ctx.lineTo(x,y);
    }
    ctx.fillStyle = 'rgba(16, 185, 129, 0.25)';
    ctx.fill();
    ctx.strokeStyle = '#10b981';
    ctx.lineWidth = 2;
    ctx.stroke();
    
    // Точки данных
    for(let i=0; i&lt;N; i++) {
      let val = stats[skills[i]] / 100;
      let angle = i * step - Math.PI/2;
      let x = cx + Math.cos(angle) * R * val;
      let y = cy + Math.sin(angle) * R * val;
      ctx.beginPath();
      ctx.arc(x,y,4,0,Math.PI*2);
      ctx.fillStyle = '#f59e0b';
      ctx.fill();
    }
  }

  // 4. Обработчики событий (UI)
  const fab = document.getElementById('sherlock-fab');
  const panel = document.getElementById('sherlock-panel');
  const modal = document.getElementById('pr-dashboard-modal');

  fab.addEventListener('click', () =&gt; {
    panel.classList.toggle('open');
  });

  document.getElementById('sherlock-close').addEventListener('click', () =&gt; {
    panel.classList.remove('open');
  });

  document.getElementById('sherlock-analyze').addEventListener('click', () =&gt; {
    SherlockAI.analyze();
  });

  document.getElementById('sherlock-open-stats').addEventListener('click', () =&gt; {
    panel.classList.remove('open');
    modal.classList.add('open');
    drawRadarChart();
  });

  document.getElementById('pr-dash-close').addEventListener('click', () =&gt; {
    modal.classList.remove('open');
  });

  modal.addEventListener('click', (e) =&gt; {
    if(e.target === modal) modal.classList.remove('open');
  });

  // Инициализация
  window.SherlockAI = SherlockAI; // Экспорт в глобальную область для других модулей Правдомера
  console.log('?️‍♂️ Шерлок и Дашборд успешно интегрированы в Правдомер');
})();
&lt;/script&gt;

&lt;style&gt;
/* ── Сайдбар ── */
#pd-sidebar{position:fixed;top:0;left:0;width:240px;height:100vh;background:#0d0a1c;border-right:1px solid var(--line,#D4AF37);display:flex;flex-direction:column;z-index:120;overflow-y:auto;transition:transform .3s}
#pd-sidebar .pd-logo{padding:18px 16px;border-bottom:1px solid rgba(212,175,55,.25);display:flex;align-items:center;gap:10px}
#pd-sidebar .pd-logo .ic{width:38px;height:38px;border-radius:10px;background:linear-gradient(135deg,#8B5CF6,#D4AF37);display:flex;align-items:center;justify-content:center;font-size:19px}
#pd-sidebar .pd-logo b{font-size:17px;color:#f0d68a}
#pd-sidebar .pd-nav{padding:10px 8px;display:flex;flex-direction:column;gap:3px}
#pd-sidebar .pd-item{display:flex;align-items:center;gap:11px;padding:11px 13px;border-radius:10px;color:#cfc8e8;font-size:13px;font-weight:600;cursor:pointer;text-align:left;width:100%;background:none;border:none;transition:.15s}
#pd-sidebar .pd-item i{width:20px;text-align:center;flex-shrink:0}
#pd-sidebar .pd-item:hover{background:rgba(212,175,55,.12);color:#f0d68a}
#pd-sidebar .pd-item.on{background:rgba(212,175,55,.18);color:#f0d68a}
#pd-sidebar .pd-foot{margin-top:auto;padding:14px;border-top:1px solid rgba(212,175,55,.25);font-size:10px;color:#8a84a8;line-height:1.5}
@media(min-width:1000px){#ariadne-app main,#ariadne-app .a-content,#ariadne-app .a-main{margin-left:240px}}
@media(max-width:999px){#pd-sidebar{transform:translateX(-100%)}#pd-sidebar.open{transform:translateX(0)}}
/* ── Хаб (плавающий) ── */
#pd-hub-btn{position:fixed;right:16px;bottom:24px;z-index:410;width:56px;height:56px;border-radius:50%;border:none;cursor:pointer;background:linear-gradient(135deg,#8B5CF6,#D4AF37);color:#fff;font-size:24px;box-shadow:0 8px 24px rgba(139,92,246,.5);transition:transform .2s}
#pd-hub-btn:hover{transform:scale(1.08)}
#pd-hub-mask{position:fixed;inset:0;z-index:450;display:none;align-items:center;justify-content:center;background:rgba(8,5,22,.86);backdrop-filter:blur(6px)}
#pd-hub-mask.open{display:flex}
#pd-hub-card{width:min(520px,92vw);max-height:86vh;overflow-y:auto;border-radius:18px;padding:22px;background:linear-gradient(180deg,#171034,#0d0a1c);border:1px solid rgba(212,175,55,.4);color:#efe9dc;box-shadow:0 30px 60px rgba(0,0,0,.6)}
#pd-hub-card h3{color:#f0d68a;font-size:19px;margin-bottom:14px}
#pd-hub-grid{display:grid;grid-template-columns:repeat(3,1fr);gap:10px}
#pd-hub-grid .pd-hitem{display:flex;flex-direction:column;align-items:center;gap:6px;padding:14px 6px;border-radius:14px;border:1px solid rgba(139,92,246,.25);background:rgba(139,92,246,.07);cursor:pointer;text-align:center;transition:.2s}
#pd-hub-grid .pd-hitem:hover{border-color:#8B5CF6;background:rgba(139,92,246,.16);transform:translateY(-2px)}
#pd-hub-grid .pd-hitem i{font-size:24px}
#pd-hub-grid .pd-hitem span{font-size:11px;color:#cfc8e8;line-height:1.3}
#pd-hub-close{margin-top:16px;width:100%;padding:11px;border-radius:10px;border:1px solid rgba(212,175,55,.4);background:none;color:#f0d68a;cursor:pointer;font-size:13px}
@media(max-width:480px){#pd-hub-grid{grid-template-columns:repeat(3,1fr)}#pd-hub-grid .pd-hitem i{font-size:22px}}
/* ── Дисклеймер ── */
#pd-legal{max-width:900px;margin:40px auto 0;padding:14px 18px;background:rgba(245,158,11,.08);border:1px solid rgba(245,158,11,.4);border-radius:12px;font-size:11px;line-height:1.6;color:#c08a4a}
/* ── Мобильная кнопка сайдбара ── */
#pd-menu-btn{position:fixed;left:16px;top:14px;z-index:410;width:44px;height:44px;border-radius:12px;border:none;cursor:pointer;background:rgba(23,16,52,.9);color:#f0d68a;font-size:20px;border:1px solid rgba(212,175,55,.4);display:none}
@media(max-width:999px){#pd-menu-btn{display:block}}
&lt;/style&gt;

&lt;button id="pd-menu-btn"&gt;☰&lt;/button&gt;
&lt;aside id="pd-sidebar"&gt;&lt;/aside&gt;
&lt;button id="pd-hub-btn"&gt;?️&lt;/button&gt;
&lt;div id="pd-hub-mask"&gt;&lt;div id="pd-hub-card"&gt;&lt;h3&gt;?️ Правдомер · все модули&lt;/h3&gt;&lt;div id="pd-hub-grid"&gt;&lt;/div&gt;&lt;button id="pd-hub-close"&gt;Закрыть&lt;/button&gt;&lt;/div&gt;&lt;/div&gt;

&lt;script&gt;
(function(){
"use strict";
if(window._pdFinal)return;window._pdFinal=1;
var $=function(s){return document.querySelector(s)};
function g(k,d){try{var v=localStorage.getItem(k);return v==null?d:JSON.parse(v)}catch(e){return d}}
function s(k,v){try{localStorage.setItem(k,JSON.stringify(v))}catch(e){}}
window.PRAVDOMER_VERSION='1.0.0';

/* ═══ РЕЕСТР МОДУЛЕЙ (единый источник правды) ═══ */
var MODULES=[
{id:'hero',ic:'fa-house',n:'Дело дня'},
{id:'text',ic:'fa-file-lines',n:'Текст-детектор'},
{id:'voice',ic:'fa-microphone',n:'Голос-детектор'},
{id:'video',ic:'fa-video',n:'Видео-детектор'},
{id:'photo',ic:'fa-image',n:'Фото-детектор'},
{id:'call',ic:'fa-phone',n:'Звонок-детектор'},
{id:'sim',ic:'fa-user-secret',n:'Псих-симулятор'},
{id:'social',ic:'fa-share-nodes',n:'Соц-детектор'},
{id:'cases',ic:'fa-folder-open',n:'Библиотека дел'},
{id:'fusion',ic:'fa-diagram-project',n:'Фьюжн'},
{id:'duel',ic:'fa-hand-fist',n:'Дуэль'},
{id:'vip',ic:'fa-crown',n:'ВИП'},
{id:'pda',ic:'fa-chart-line',n:'Аналитика'}
];
function exists(id){return !!document.getElementById(id)}

/* ═══ 1. САЙДБАР ═══ */
var sb=$('#pd-sidebar');
sb.innerHTML='&lt;div class="pd-logo"&gt;&lt;span class="ic"&gt;?️&lt;/span&gt;&lt;b&gt;Правдомер&lt;/b&gt;&lt;/div&gt;'+
'&lt;div class="pd-nav" id="pd-nav"&gt;&lt;/div&gt;'+
'&lt;div class="pd-foot"&gt;Правдомер '+window.PRAVDOMER_VERSION+'&lt;br&gt;Тренажёр, не экспертиза. 18+&lt;/div&gt;';
$('#pd-nav').innerHTML=MODULES.map(function(m){
return '&lt;button class="pd-item" data-id="'+m.id+'"&gt;&lt;i class="fas '+m.ic+'"&gt;&lt;/i&gt;&lt;span&gt;'+m.n+'&lt;/span&gt;&lt;/button&gt;';
}).join('');
function goSec(id){var el=document.getElementById(id);if(el)el.scrollIntoView({behavior:'smooth',block:'start'})}
$('#pd-nav').addEventListener('click',function(e){
var b=e.target.closest('.pd-item');if(!b)return;
$('#pd-nav').querySelectorAll('.pd-item').forEach(function(x){x.classList.remove('on')});
b.classList.add('on');goSec(b.dataset.id);
if(window.innerWidth&lt;1000)sb.classList.remove('open');
});
$('#pd-menu-btn').addEventListener('click',function(){sb.classList.toggle('open')});

/* ═══ 2. ПЛАВАЮЩИЙ ХАБ ═══ */
$('#pd-hub-grid').innerHTML=MODULES.map(function(m){
return '&lt;div class="pd-hitem" data-id="'+m.id+'"&gt;&lt;i class="fas '+m.ic+'"&gt;&lt;/i&gt;&lt;span&gt;'+m.n+'&lt;/span&gt;&lt;/div&gt;';
}).join('');
$('#pd-hub-grid').addEventListener('click',function(e){
var h=e.target.closest('.pd-hitem');if(!h)return;
$('#pd-hub-mask').classList.remove('open');goSec(h.dataset.id);
});
$('#pd-hub-btn').addEventListener('click',function(){$('#pd-hub-mask').classList.add('open')});
$('#pd-hub-close').addEventListener('click',function(){$('#pd-hub-mask').classList.remove('open')});
$('#pd-hub-mask').addEventListener('click',function(e){if(e.target===this)this.classList.remove('open')});

/* ═══ 3. ЮРИДИКА ═══ */
if(!$('#pd-legal')){
var lg=document.createElement('div');lg.id='pd-legal';
lg.innerHTML='&lt;b&gt;Важно.&lt;/b&gt; Правдомер — информационно-развлекательный тренажёр для развития критического мышления. Он &lt;b&gt;не является экспертизой, медицинским, юридическим или психологическим инструментом&lt;/b&gt; и не выносит вердиктов о реальных людях. Результаты — вероятности для саморефлексии. Данные хранятся локально на вашем устройстве (152-ФЗ) и никуда не передаются. При острых состояниях — &lt;b&gt;112&lt;/b&gt;. 18+.';
document.body.appendChild(lg);
}

/* ═══ 4. PWA ═══ */
(function(){
document.title='Правдомер · тренажёр детектора лжи';
function meta(a,n,c){var m=document.querySelector('meta['+a+'="'+n+'"]');if(!m){m=document.createElement('meta');m.setAttribute(a,n);document.head.appendChild(m)}m.content=c}
meta('name','description','Правдомер — тренажёр критического мышления: текст, голос, видео, фото, звонки, симуляторы. Развлекательный сервис. 18+');
meta('name','theme-color','#171034');
meta('property','og:title','Правдомер · тренажёр детектора лжи');
meta('property','og:description','Текст, голос, видео, фото, звонки, симуляторы — распознавай ложь и манипуляции. 18+');
meta('name','mobile-web-app-capable','yes');
meta('name','apple-mobile-web-app-capable','yes');
var fav=document.createElement('link');fav.rel='icon';
fav.href='data:image/svg+xml,'+encodeURIComponent('&lt;svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 100 100"&gt;&lt;text y=".9em" font-size="90"&gt;?️&lt;/text&gt;&lt;/svg&gt;');
document.head.appendChild(fav);
var man={name:'Правдомер · тренажёр детектора лжи',short_name:'Правдомер',start_url:location.pathname,display:'standalone',background_color:'#120c22',theme_color:'#171034',icons:[{src:fav.href,sizes:'any',type:'image/svg+xml'}]};
var ml=document.createElement('link');ml.rel='manifest';
ml.href=URL.createObjectURL(new Blob([JSON.stringify(man)],{type:'application/json'}));
document.head.appendChild(ml);
window.addEventListener('beforeinstallprompt',function(e){e.preventDefault();window._pdInstall=e;
if(!$('#pd-install')){var b=document.createElement('button');b.id='pd-install';b.textContent='? Установить Правдомер';
b.style.cssText='position:fixed;left:50%;transform:translateX(-50%);bottom:90px;z-index:405;padding:11px 20px;border:none;border-radius:999px;background:linear-gradient(135deg,#8B5CF6,#EC4899);color:#fff;font-weight:800;font-size:13px;cursor:pointer;box-shadow:0 10px 26px rgba(139,92,246,.5)';
b.addEventListener('click',function(){if(window._pdInstall){window._pdInstall.prompt();window._pdInstall.userChoice.then(function(){b.remove();window._pdInstall=null})}});
document.body.appendChild(b)}});
})();

/* ═══ 5. ОФЛАЙН ═══ */
if('serviceWorker' in navigator){
window.addEventListener('load',function(){
navigator.serviceWorker.register('sw.js').then(function(){console.log('Правдомер: офлайн активен')}).catch(function(){});
});
}

/* ═══ 6. АНАЛИТИКА (секция) ═══ */
(function(){
if(document.getElementById('pda'))return;
var sec=document.createElement('section');sec.id='pda';
sec.innerHTML='&lt;div class="sec-ic"&gt;?&lt;/div&gt;&lt;h2&gt;Аналитика проекта&lt;/h2&gt;&lt;div class="sub"&gt;Визиты, события, стрик — всё локально&lt;/div&gt;'+
'&lt;div id="pda-stats" style="display:grid;grid-template-columns:repeat(auto-fit,minmax(120px,1fr));gap:10px;margin-bottom:14px"&gt;&lt;/div&gt;'+
'&lt;div id="pda-check" style="margin-top:14px"&gt;&lt;/div&gt;';
var mainEl=document.querySelector('main')||document.querySelector('.a-main');
var foot=document.querySelector('footer');
if(foot&amp;&amp;foot.parentNode===mainEl)mainEl.insertBefore(sec,foot);else mainEl.appendChild(sec);
})();
(function(){
(function(){try{if(sessionStorage.getItem('pda_sess'))return;sessionStorage.setItem('pda_sess','1')}catch(e){return}
var v=g('pda_visits',{}),k=new Date().toDateString();v[k]=(v[k]||0)+1;s('pda_visits',v)})();
document.addEventListener('click',function(e){var t=e.target;if(!t||!t.closest)return;
var nm=null,el=t.closest('[title]');if(el&amp;&amp;el.getAttribute('title'))nm=el.getAttribute('title');
if(!nm){var b=t.closest('button');if(b&amp;&amp;b.textContent)nm=b.textContent.trim().slice(0,20)}
if(!nm||/закрыть|закрыть|аналитика/i.test(nm))return;
var ev=g('pda_events',[]);ev.push({d:new Date().toDateString(),n:nm});if(ev.length&gt;500)ev.shift();s('pda_events',ev)},true);
var stBox=$('#pda-stats');if(stBox){
var v=g('pda_visits',{}),days=Object.keys(v).length,today=v[new Date().toDateString()]||0;
var ev=g('pda_events',[]);
var n=0,d=new Date();if(!v[d.toDateString()])d=new Date(Date.now()-864e5);
while(v[d.toDateString()]){n++;d=new Date(d.getTime()-864e5)}
stBox.innerHTML=
'&lt;div style="background:rgba(139,92,246,.08);border:1px solid rgba(139,92,246,.3);border-radius:12px;padding:10px;text-align:center"&gt;&lt;b style="display:block;font-size:20px;color:#c4b5fd"&gt;'+days+'&lt;/b&gt;&lt;span style="font-size:10px;color:#8a84a8"&gt;дней&lt;/span&gt;&lt;/div&gt;'+
'&lt;div style="background:rgba(139,92,246,.08);border:1px solid rgba(139,92,246,.3);border-radius:12px;padding:10px;text-align:center"&gt;&lt;b style="display:block;font-size:20px;color:#c4b5fd"&gt;'+today+'&lt;/b&gt;&lt;span style="font-size:10px;color:#8a84a8"&gt;сегодня&lt;/span&gt;&lt;/div&gt;'+
'&lt;div style="background:rgba(139,92,246,.08);border:1px solid rgba(139,92,246,.3);border-radius:12px;padding:10px;text-align:center"&gt;&lt;b style="display:block;font-size:20px;color:#c4b5fd"&gt;'+n+'&lt;/b&gt;&lt;span style="font-size:10px;color:#8a84a8"&gt;стрик ?&lt;/span&gt;&lt;/div&gt;'+
'&lt;div style="background:rgba(139,92,246,.08);border:1px solid rgba(139,92,246,.3);border-radius:12px;padding:10px;text-align:center"&gt;&lt;b style="display:block;font-size:20px;color:#c4b5fd"&gt;'+ev.length+'&lt;/b&gt;&lt;span style="font-size:10px;color:#8a84a8"&gt;событий&lt;/span&gt;&lt;/div&gt;';
}
})();

/* ═══ 7. ФИНАЛЬНАЯ СВЕРКА ═══ */
(function(){
var box=$('#pda-check');if(!box)return;
var ok=0,total=MODULES.length,rows='';
MODULES.forEach(function(m){var ex=exists(m.id);if(ex)ok++;
rows+='&lt;div style="display:flex;justify-content:space-between;font-size:12px;color:#cfc8e8;padding:6px 10px;border-radius:8px;background:rgba(139,92,246,.06);margin-bottom:6px"&gt;&lt;span&gt;&lt;i class="fas '+m.ic+'" style="margin-right:6px"&gt;&lt;/i&gt;'+m.n+'&lt;/span&gt;&lt;span style="color:'+(ex?'#6ee7b7':'#fca5a5')+';font-weight:700"&gt;'+(ex?'✓':'✗')+'&lt;/span&gt;&lt;/div&gt;'});
box.innerHTML='&lt;div style="font-size:13px;font-weight:700;color:#c4b5fd;margin-bottom:8px"&gt;Финальная сверка: подключено '+ok+' из '+total+' модулей&lt;/div&gt;'+rows;
})();

console.log('?️ Правдомер: Блок 12 · Финальный подключён · версия '+window.PRAVDOMER_VERSION);
})();
&lt;/script&gt;

&lt;style&gt;
#cg-btn{position:fixed;right:16px;bottom:330px;z-index:400;width:52px;height:52px;border-radius:50%;border:none;cursor:pointer;background:linear-gradient(135deg,#F59E0B,#EF4444);color:#fff;font-size:22px;box-shadow:0 6px 20px rgba(245,158,11,.45);transition:transform .2s}
#cg-btn:hover{transform:scale(1.1)}
@media(min-width:1000px){#cg-btn{bottom:330px}}
#cg-mask{position:fixed;inset:0;z-index:426;display:none;align-items:center;justify-content:center;background:rgba(10,7,20,.9);backdrop-filter:blur(6px)}
#cg-mask.open{display:flex}
#cg-card{width:min(680px,94vw);max-height:90vh;overflow-y:auto;border-radius:18px;padding:22px;color:#efe9dc;background:linear-gradient(180deg,#1c1208,#0d0a14);border:1px solid rgba(245,158,11,.4);font-family:Inter,system-ui,sans-serif;box-shadow:0 30px 60px rgba(0,0,0,.6)}
#cg-card h3{margin:0 0 4px;font-size:20px;color:#fbd38d}
.cg-sub{font-size:12px;color:#a8987a;margin-bottom:14px;line-height:1.5}
.cg-tabs{display:flex;gap:8px;margin-bottom:14px}
.cg-tab{flex:1;padding:10px;border-radius:10px;border:1px solid rgba(245,158,11,.35);background:rgba(245,158,11,.08);color:#fbd38d;font-weight:700;font-size:13px;cursor:pointer}
.cg-tab.on{background:linear-gradient(135deg,#F59E0B,#EF4444);color:#fff;border-color:transparent}
.cg-pane{display:none}.cg-pane.on{display:block}
.cg-game{border:1px solid rgba(245,158,11,.25);border-radius:14px;padding:16px;margin-bottom:14px;background:rgba(245,158,11,.05)}
.cg-game h4{font-size:15px;color:#fbd38d;margin-bottom:6px}
.cg-game .desc{font-size:12px;color:#c8b898;line-height:1.5;margin-bottom:10px}
.cg-game .question{font-size:13px;color:#efe9dc;margin-bottom:12px;line-height:1.5}
.cg-opts{display:flex;flex-direction:column;gap:8px}
.cg-opt{padding:12px 14px;border-radius:12px;border:1px solid rgba(245,158,11,.35);background:rgba(245,158,11,.06);color:#efe9dc;font-size:13px;text-align:left;cursor:pointer;transition:.2s;line-height:1.5}
.cg-opt:hover{border-color:#F59E0B;background:rgba(245,158,11,.12)}
.cg-opt.good{border-color:#10B981;background:rgba(16,185,129,.1);color:#6ee7b7}
.cg-opt.bad{border-color:#EF4444;background:rgba(239,68,68,.1);color:#fca5a5}
.cg-res{margin-top:12px;padding:12px;border-radius:10px;background:rgba(245,158,11,.08);border-left:3px solid #F59E0B;font-size:12px;color:#d9cfae;line-height:1.6;display:none}
.cg-res.show{display:block}
.cg-res b{color:#fbd38d}
.cg-score-row{display:flex;justify-content:space-between;align-items:center;margin-top:14px;padding-top:14px;border-top:1px solid rgba(245,158,11,.25)}
.cg-score-row .lbl{font-size:12px;color:#a8987a}
.cg-score-row .val{font-size:18px;font-weight:800;color:#fbd38d}
.cg-news{border:1px solid rgba(245,158,11,.25);border-radius:14px;padding:16px;margin-bottom:14px;background:rgba(245,158,11,.05)}
.cg-news .headline{font-size:14px;color:#efe9dc;font-weight:700;line-height:1.5;margin-bottom:8px}
.cg-news .body{font-size:12px;color:#c8b898;line-height:1.5;margin-bottom:12px}
.cg-blinds{margin-top:14px;padding:12px;border-radius:10px;background:rgba(239,68,68,.06);border:1px solid rgba(239,68,68,.25)}
.cg-blinds h4{font-size:13px;color:#fca5a5;margin-bottom:8px}
.cg-blind-item{display:flex;justify-content:space-between;font-size:12px;color:#cfc8e8;padding:6px 0;border-bottom:1px solid rgba(239,68,68,.15)}
.cg-blind-item:last-child{border-bottom:none}
.cg-blind-item .cnt{color:#fca5a5;font-weight:700}
#cg-close{margin-top:12px;width:100%;border:1px solid rgba(245,158,11,.4);background:none;color:#fbd38d;border-radius:10px;padding:10px;cursor:pointer;font-size:13px}
&lt;/style&gt;
&lt;button id="cg-btn" title="Казино мышления"&gt;?&lt;/button&gt;
&lt;div id="cg-mask"&gt;&lt;div id="cg-card"&gt;
&lt;h3&gt;? Казино мышления&lt;/h3&gt;
&lt;div class="cg-sub"&gt;Тренажёр когнитивных искажений + разбор виральных новостей. Играй, ошибайся, учись видеть ловушки собственного мозга.&lt;/div&gt;
&lt;div class="cg-tabs"&gt;
&lt;button class="cg-tab on" data-p="casino"&gt;? Казино мышления&lt;/button&gt;
&lt;button class="cg-tab" data-p="hooks"&gt;? Почему я поверил?&lt;/button&gt;
&lt;/div&gt;
&lt;div class="cg-pane on" data-p="casino" id="cg-casino"&gt;&lt;/div&gt;
&lt;div class="cg-pane" data-p="hooks" id="cg-hooks"&gt;&lt;/div&gt;
&lt;div id="cg-blinds" class="cg-blinds" style="display:none"&gt;
&lt;h4&gt;⚠️ Твои слепые зоны&lt;/h4&gt;
&lt;div id="cg-blinds-list"&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;button id="cg-close"&gt;Закрыть&lt;/button&gt;
&lt;/div&gt;&lt;/div&gt;
&lt;script&gt;
(function(){
"use strict";
if(window._cgDone)return;window._cgDone=1;
var $=function(s){return document.querySelector(s)};
function g(k,d){try{var v=localStorage.getItem(k);return v==null?d:JSON.parse(v)}catch(e){return d}}
function s(k,v){try{localStorage.setItem(k,JSON.stringify(v))}catch(e){}}
function toast(t,m){if(window.Toast&amp;&amp;Toast.show)Toast.show(t,m,'info')}
function addPR(n){if(window.PR&amp;&amp;window.PR.add)window.PR.add(n)}
function addBlind(key){
var b=g('pr_blindspots',{});
b[key]=(b[key]||0)+1;
s('pr_blindspots',b);
}
/* ═══ 1. МИНИ-ИГРЫ: КАЗИНО МЫШЛЕНИЯ ═══ */
var GAMES=[
{id:'gambler',
 title:'? Рулетка Монте-Карло',
 desc:'Красное выпало 7 раз подряд. Что выпадет в 8-й раз?',
 question:'Твоя интуиция говорит: «Сейчас точно чёрное, пора уже!» А что говорит теория вероятностей?',
 opts:[
 {t:'Чёрное — пора уже сменить цвет', ok:false, trap:'gambler'},
 {t:'Красное снова — тренд продолжается', ok:false, trap:'hotstreak'},
 {t:'Вероятность 50/50 — рулетке всё равно', ok:true}
 ],
 res:'&lt;b&gt;Ошибка игрока (Gambler\'s Fallacy).&lt;/b&gt; Рулетка не помнит прошлые броски. Каждое вращение независимо: шанс красного и чёрного всегда ~48.6% (плюс зеро). Мозг видит паттерн там, где его нет.'
},
{id:'anchor',
 title:'⚓ Якорь цены',
 desc:'Куртка «со скидкой»: было 20 000 ₽, стало 9 990 ₽. Выгодная покупка?',
 question:'Тебе кажется, что ты сэкономил 10 000 ₽. Но так ли это?',
 opts:[
 {t:'Да, скидка 50% — отличная выгода', ok:false, trap:'anchor'},
 {t:'Смотрю на качество и реальную цену аналогов', ok:true},
 {t:'Беру — потом продам дороже', ok:false, trap:'anchor'}
 ],
 res:'&lt;b&gt;Эффект якоря (Anchoring).&lt;/b&gt; «Было 20 000» — это якорь, а не реальная цена. Цену могли завысить специально, чтобы «скидка» выглядела заманчиво. Сравнивай с рыночной ценой аналогов, а не с зачёркнутой цифрой.'
},
{id:'survivor',
 title:'✈️ Ошибка выжившего',
 desc:'«Бросил университет — стал миллиардером. Значит, высшее образование не нужно!»',
 question:'В чём подвох этого аргумента?',
 opts:[
 {t:'Всё верно: образование — пустая трата времени', ok:false, trap:'survivor'},
 {t:'Мы видим только успешных — а где тысячи бросивших и не ставших миллиардерами?', ok:true},
 {t:'Нужно просто усерднее учиться', ok:false}
 ],
 res:'&lt;b&gt;Ошибка выжившего (Survivorship Bias).&lt;/b&gt; Мы видим только победителей. За каждым «бросил и разбогател» — тысячи бросивших и не разбогатевших. Их истории не попадают в новости. Выборка смещена в пользу успеха.'
},
{id:'availability',
 title:'? Доступность страха',
 desc:'После репортажа о крушении самолёта тебе страшно лететь. Ты выбираешь поезд. Правильный выбор?',
 question:'Что говорит статистика о безопасности самолётов против поездов?',
 opts:[
 {t:'Поезд безопаснее — после репортажа это очевидно', ok:false, trap:'availability'},
 {t:'Самолёты статистически безопаснее поездов, просто авария свежа в памяти', ok:true},
 {t:'Оба варианта одинаково рискованны', ok:false}
 ],
 res:'&lt;b&gt;Эвристика доступности (Availability Heuristic).&lt;/b&gt; Яркие, эмоциональные события запоминаются лучше. Мы оцениваем вероятность по тому, что легко всплывает в памяти, а не по статистике. Новости о катастрофах искажают реальную картину рисков.'
},
{id:'framing',
 title:'? Фрейминг',
 desc:'«Этот йогурт на 90% обезжирен» против «содержит 10% жира». Что звучит полезнее?',
 question:'Оба описания означают одно и то же. Но какое ты выберешь?',
 opts:[
 {t:'«90% обезжирен» — звучит полезнее', ok:false, trap:'framing'},
 {t:'«10% жира» — честнее и понятнее', ok:false, trap:'framing'},
 {t:'Оба одинаковы — это просто разная подача', ok:true}
 ],
 res:'&lt;b&gt;Эффект фрейминга (Framing Effect).&lt;/b&gt; Одна и та же информация воспринимается по-разному в зависимости от подачи. «90% обезжирен» звучит как достоинство, «10% жира» — как недостаток. Маркетологи активно используют это.'
}
];
/* ═══ 2. ВИРАЛЬНЫЕ НОВОСТИ: КРЮЧКИ ═══ */
var NEWS=[
{id:'authority',
 headline:'? Учёные из Гарварда доказали: этот продукт продлевает жизнь на 20 лет',
 body:'Исследование, проведённое ведущими специалистами, подтвердило невероятные свойства обычного продукта. Эксперты в один голос заявляют: это прорыв в медицине.',
 hooks:['Авторитет («учёные из Гарварда», «эксперты»)','Отсутствие конкретики (какой продукт? какое исследование?)','«В один голос» — единое мнение редко бывает настоящим','Продлевает жизнь на 20 лет — несоразмерное обещание'],
 answer:'Авторитет + размытость. Настоящие исследования публикуются в рецензируемых журналах, а не в заголовках с восклицательными знаками.',
 hook:'authority'},
{id:'fear',
 headline:'⚠️ СРОЧНО: Новая схема мошенничества крадёт все деньги за 5 минут!',
 body:'Мошенники придумали хитрый способ обмана. Если вы не перешлёте это сообщение всем контактам, ваш счёт заблокируют навсегда. Не игнорируйте!',
 hooks:['Страх («крадёт все деньги», «заблокируют навсегда»)','Срочность («СРОЧНО», «за 5 минут»)','Принуждение к репосту («перешлёте всем контактам»)','Угроза бездействия'],
 answer:'Страх + принуждение к распространению. Это само́ мошенническое сообщение: оно крадёт не деньги, а ваше внимание и распространяет панику.',
 hook:'fear'},
{id:'social',
 headline:'? 95% россиян уже перешли на этот способ оплаты. Ты ещё нет?',
 body:'Все твои друзья и коллеги уже используют новый сервис. Оставшиеся 5% — те, кто не успевает за прогрессом. Присоединяйся, пока не поздно.',
 hooks:['Стадность («95% уже перешли»)','Давление «не отстать от всех»','Ложная дихотомия (95% против 5%)','Искусственная срочность («пока не поздно»)'],
 answer:'Стадность + давление. Цифра 95% не подтверждена источником. Приём создаёт иллюзию, что «все уже там», чтобы вы не успели подумать.',
 hook:'social'},
{id:'urgency',
 headline:'⏰ Последний шанс! Завтра эту возможность закроют навсегда',
 body:'Специальное предложение действует только до полуночи. Успейте забрать свой бонус, иначе он сгорит безвозвратно. Такого больше не повторится.',
 hooks:['Искусственная срочность («последний шанс», «до полуночи»)','Дефицит («закроют навсегда»)','Страх упущенной выгоды','«Такого больше не повторится» — манипуляция уникальностью'],
 answer:'Срочность + дефицит. Настоящие возможности редко закрываются за 24 часа. Это давление, чтобы вы приняли решение, не подумав.',
 hook:'urgency'}
];
/* ═══ РЕНДЕР КАЗИНО ═══ */
function renderCasino(){
var box=$('#cg-casino');
var stats=g('pr_casino_stats',{played:0,correct:0});
box.innerHTML=GAMES.map(function(gm,i){
return '&lt;div class="cg-game" data-i="'+i+'"&gt;&lt;h4&gt;'+gm.title+'&lt;/h4&gt;&lt;div class="desc"&gt;'+gm.desc+'&lt;/div&gt;&lt;div class="question"&gt;'+gm.question+'&lt;/div&gt;&lt;div class="cg-opts"&gt;'+
gm.opts.map(function(o,j){return '&lt;button class="cg-opt" data-j="'+j+'"&gt;'+o.t+'&lt;/button&gt;'}).join('')+
'&lt;/div&gt;&lt;div class="cg-res" id="cg-res-'+i+'"&gt;&lt;/div&gt;&lt;/div&gt;';
}).join('')+
'&lt;div class="cg-score-row"&gt;&lt;span class="lbl"&gt;Сыграно / верно&lt;/span&gt;&lt;span class="val"&gt;'+stats.played+' / '+stats.correct+'&lt;/span&gt;&lt;/div&gt;';
box.querySelectorAll('.cg-game').forEach(function(gEl){
var i=+gEl.dataset.i;
var gm=GAMES[i];
gEl.querySelectorAll('.cg-opt').forEach(function(oEl){
oEl.addEventListener('click',function(){
var j=+oEl.dataset.j;
var opt=gm.opts[j];
gEl.querySelectorAll('.cg-opt').forEach(function(x){x.disabled=true});
oEl.classList.add(opt.ok?'good':'bad');
if(opt.ok){gEl.querySelectorAll('.cg-opt').forEach(function(x){if(!gm.opts[+x.dataset.j].ok&amp;&amp;x!==oEl)x.classList.add('')});}
var res=$('#cg-res-'+i);
res.innerHTML=(opt.ok?'&lt;b&gt;✅ Верно!&lt;/b&gt; ':'&lt;b&gt;❌ Попался!&lt;/b&gt; ')+gm.res;
res.classList.add('show');
var st=g('pr_casino_stats',{played:0,correct:0});
st.played++;
if(opt.ok)st.correct++;else addBlind(opt.trap||'unknown');
s('pr_casino_stats',st);
if(opt.ok)addPR(3);else addPR(1);
renderBlinds();
});
});
});
}
/* ═══ РЕНДЕР КРЮЧКОВ ═══ */
function renderHooks(){
var box=$('#cg-hooks');
var stats=g('pr_hooks_stats',{played:0,correct:0});
box.innerHTML='&lt;div class="cg-sub" style="margin-bottom:12px"&gt;Прочитай новость. Что тебя в ней зацепило? Выбери главный крючок.&lt;/div&gt;'+
NEWS.map(function(n,i){
return '&lt;div class="cg-news" data-i="'+i+'"&gt;&lt;div class="headline"&gt;'+n.headline+'&lt;/div&gt;&lt;div class="body"&gt;'+n.body+'&lt;/div&gt;&lt;div class="cg-opts"&gt;'+
['Авторитет','Страх','Стадность','Срочность'].map(function(h,j){return '&lt;button class="cg-opt" data-j="'+j+'"&gt;'+h+'&lt;/button&gt;'}).join('')+
'&lt;/div&gt;&lt;div class="cg-res" id="cg-hookres-'+i+'"&gt;&lt;/div&gt;&lt;/div&gt;';
}).join('')+
'&lt;div class="cg-score-row"&gt;&lt;span class="lbl"&gt;Разобрано / верно&lt;/span&gt;&lt;span class="val"&gt;'+stats.played+' / '+stats.correct+'&lt;/span&gt;&lt;/div&gt;';
var hookNames=['authority','fear','social','urgency'];
box.querySelectorAll('.cg-news').forEach(function(nEl){
var i=+nEl.dataset.i;
var n=NEWS[i];
nEl.querySelectorAll('.cg-opt').forEach(function(oEl){
oEl.addEventListener('click',function(){
var j=+oEl.dataset.j;
var ok=hookNames[j]===n.hook;
nEl.querySelectorAll('.cg-opt').forEach(function(x){x.disabled=true});
oEl.classList.add(ok?'good':'bad');
var res=$('#cg-hookres-'+i);
res.innerHTML='&lt;b&gt;'+(ok?'✅ Точно!':'❌ Мимо.')+'&lt;/b&gt; Главный крючок — &lt;b&gt;'+
{n:{authority:'Авторитет',fear:'Страх',social:'Стадность',urgency:'Срочность'}}[n.hook]+'&lt;/b&gt;.&lt;br&gt;'+n.answer+
'&lt;br&gt;&lt;br&gt;&lt;b&gt;Все флаги этой новости:&lt;/b&gt;&lt;br&gt;'+n.hooks.map(function(h){return '• '+h}).join('&lt;br&gt;');
res.classList.add('show');
var st=g('pr_hooks_stats',{played:0,correct:0});
st.played++;
if(ok)st.correct++;else addBlind(n.hook+'_hook');
s('pr_hooks_stats',st);
/* синергия: записываем категориальную ошибку */
if(!ok){var bc=g('pr_blindcats',{});var cat='манипуляции';bc[cat]=(bc[cat]||0)+1;s('pr_blindcats',bc);}
if(ok)addPR(3);else addPR(1);
renderBlinds();
});
});
});
}
/* ═══ РЕНДЕР СЛЕПЫХ ЗОН ═══ */
function renderBlinds(){
var b=g('pr_blindspots',{});
var names={gambler:'Ошибка игрока',hotstreak:'«Горячая серия»',anchor:'Эффект якоря',survivor:'Ошибка выжившего',availability:'Доступность страха',framing:'Эффект фрейминга',authority_hook:'Крючок: авторитет',fear_hook:'Крючок: страх',social_hook:'Крючок: стадность',urgency_hook:'Крючок: срочность'};
var keys=Object.keys(b).filter(function(k){return b[k]&gt;0});
var el=$('#cg-blinds'),list=$('#cg-blinds-list');
if(!keys.length){el.style.display='none';return;}
el.style.display='block';
list.innerHTML=keys.map(function(k){return '&lt;div class="cg-blind-item"&gt;&lt;span&gt;'+names[k]+'&lt;/span&gt;&lt;span class="cnt"&gt;×'+b[k]+'&lt;/span&gt;&lt;/div&gt;'}).join('');
}
/* ═══ СИНЕРГИЯ С ШЕРЛОКОМ ═══ */
if(window.SherlockAI){
var origGBS=window.SherlockAI.getBlindSpot.bind(window.SherlockAI);
window.SherlockAI.getBlindSpot=function(){
var orig=origGBS();
var b=g('pr_blindspots',{});
var maxK=null,maxV=0;
for(var k in b){if(b[k]&gt;maxV){maxV=b[k];maxK=k;}}
if(maxK&amp;&amp;maxV&gt;2){
var tips={
gambler:'Мозг видит паттерны там, где их нет. Независимые события остаются независимыми.',
hotstreak:'«Горячая серия» — иллюзия. Каждый бросок независим.',
anchor:'Не верь зачёркнутым ценам. Сравнивай с реальной рыночной ценой.',
survivor:'Мы видим только победителей. Неудачники не попадают в новости.',
availability:'Яркие события искажают оценку рисков. Смотри статистику, а не новости.',
framing:'Одна и та же информация звучит по-разному. Смотри суть, а не подачу.',
authority_hook:'«Учёные доказали» без источника — манипуляция. Проверяй первоисточник.',
fear_hook:'Срочные угрозы отключают мышление. Возьми паузу перед действием.',
social_hook:'«Все уже там» — стадность. Решай сам, не оглядываясь на толпу.',
urgency_hook:'Искусственный дедлайн — давление. Настоящие решения не горят.'
};
return {skill:names[maxK]||maxK,value:Math.min(100,maxV*20),tip:tips[maxK]||''};
}
return orig;
};
var names={gambler:'Ошибка игрока',hotstreak:'«Горячая серия»',anchor:'Эффект якоря',survivor:'Ошибка выжившего',availability:'Доступность страха',framing:'Эффект фрейминга',authority_hook:'Крючок: авторитет',fear_hook:'Крючок: страх',social_hook:'Крючок: стадность',urgency_hook:'Крючок: срочность'};
}
/* ═══ ВКЛАДКИ ═══ */
document.querySelectorAll('.cg-tab').forEach(function(t){
t.addEventListener('click',function(){
document.querySelectorAll('.cg-tab').forEach(function(x){x.classList.remove('on')});
t.classList.add('on');
document.querySelectorAll('.cg-pane').forEach(function(x){x.classList.remove('on')});
$('#cg-'+(t.dataset.p==='casino'?'casino':'hooks')).classList.add('on');
});
});
$('#cg-btn').addEventListener('click',function(){$('#cg-mask').classList.add('open');renderCasino();renderHooks();renderBlinds()});
$('#cg-close').addEventListener('click',function(){$('#cg-mask').classList.remove('open')});
$('#cg-mask').addEventListener('click',function(e){if(e.target===this)this.classList.remove('open')});
console.log('? Блок 13 · Казино мышления + Почему я поверил подключены');
})();
&lt;/script&gt;

&lt;style&gt;
#sh2-btn{position:fixed;left:16px;bottom:24px;z-index:400;width:56px;height:56px;border-radius:50%;border:none;cursor:pointer;background:linear-gradient(135deg,#10B981,#06B6D4);color:#fff;font-size:26px;box-shadow:0 8px 24px rgba(16,185,129,.5);transition:transform .2s}
#sh2-btn:hover{transform:scale(1.08)}
@media(min-width:1000px){#sh2-btn{bottom:24px}}
#sh2-mask{position:fixed;inset:0;z-index:455;display:none;align-items:center;justify-content:center;background:rgba(5,10,15,.9);backdrop-filter:blur(6px)}
#sh2-mask.open{display:flex}
#sh2-card{width:min(560px,94vw);max-height:90vh;overflow-y:auto;border-radius:18px;padding:22px;color:#e8f0ee;background:linear-gradient(180deg,#0a1f1a,#07130f);border:1px solid rgba(16,185,129,.4);font-family:Inter,system-ui,sans-serif}
.sh2-head{display:flex;gap:14px;align-items:center;margin-bottom:14px}
.sh2-avatar{width:64px;height:64px;border-radius:50%;background:linear-gradient(135deg,#10B981,#06B6D4);display:flex;align-items:center;justify-content:center;font-size:32px;border:3px solid rgba(16,185,129,.5);box-shadow:0 0 20px rgba(16,185,129,.4);animation:sh2pulse 2.5s infinite}
@keyframes sh2pulse{0%,100%{transform:scale(1)}50%{transform:scale(1.06)}}
.sh2-name{font-weight:800;color:#6ee7b7;font-size:16px}
.sh2-status{font-size:11px;color:#7fa89a;font-style:italic}
.sh2-tabs{display:flex;gap:6px;margin-bottom:14px}
.sh2-tab{flex:1;padding:9px;border-radius:10px;border:1px solid rgba(16,185,129,.35);background:rgba(16,185,129,.08);color:#6ee7b7;font-weight:700;font-size:12px;cursor:pointer}
.sh2-tab.on{background:linear-gradient(135deg,#10B981,#06B6D4);color:#fff;border-color:transparent}
.sh2-pane{display:none}.sh2-pane.on{display:block}
.sh2-skill{margin-bottom:12px;padding:12px;border-radius:12px;background:rgba(16,185,129,.06);border:1px solid rgba(16,185,129,.2)}
.sh2-skill .top{display:flex;justify-content:space-between;font-size:13px;margin-bottom:6px}
.sh2-skill .nm{color:#e8f0ee;font-weight:700}
.sh2-skill .val{color:#6ee7b7;font-weight:800}
.sh2-skill .cnt{font-size:10px;color:#7fa89a}
.sh2-bar{height:8px;background:rgba(255,255,255,.08);border-radius:99px;overflow:hidden}
.sh2-bar i{display:block;height:100%;border-radius:99px;background:linear-gradient(90deg,#EF4444,#F59E0B,#10B981)}
.sh2-blind{padding:14px;border-radius:12px;background:rgba(239,68,68,.08);border-left:3px solid #EF4444;margin-bottom:12px}
.sh2-blind .t{font-size:13px;color:#fca5a5;font-weight:800;margin-bottom:4px}
.sh2-blind .d{font-size:12px;color:#d9cfae;line-height:1.6}
.sh2-tip{padding:12px;border-radius:12px;background:rgba(245,158,11,.08);border:1px solid rgba(245,158,11,.3);font-size:12px;color:#fbd38d;line-height:1.5;margin-bottom:12px}
.sh2-go{width:100%;padding:12px;border:none;border-radius:12px;background:linear-gradient(135deg,#10B981,#06B6D4);color:#fff;font-weight:800;font-size:14px;cursor:pointer;margin-top:8px}
.sh2-empty{padding:20px;text-align:center;color:#7fa89a;font-size:13px}
.sh2-note{font-size:11px;color:#5d8477;margin-top:12px;line-height:1.5}
#sh2-close{margin-top:12px;width:100%;border:1px solid rgba(16,185,129,.4);background:none;color:#6ee7b7;border-radius:10px;padding:10px;cursor:pointer;font-size:13px}
&lt;/style&gt;
&lt;button id="sh2-btn" title="Шерлок 2.0 · наставник"&gt;?&lt;/button&gt;
&lt;div id="sh2-mask"&gt;&lt;div id="sh2-card"&gt;
&lt;div class="sh2-head"&gt;
&lt;div class="sh2-avatar" id="sh2-ava"&gt;?&lt;/div&gt;
&lt;div&gt;&lt;div class="sh2-name"&gt;Шерлок 2.0&lt;/div&gt;&lt;div class="sh2-status" id="sh2-status"&gt;Анализирую твои дела…&lt;/div&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div class="sh2-tabs"&gt;
&lt;button class="sh2-tab on" data-p="an"&gt;? Аналитика&lt;/button&gt;
&lt;button class="sh2-tab" data-p="bl"&gt;⚠️ Слепая зона&lt;/button&gt;
&lt;button class="sh2-tab" data-p="tr"&gt;? Тренировка&lt;/button&gt;
&lt;/div&gt;
&lt;div class="sh2-pane on" data-p="an" id="sh2-an"&gt;&lt;/div&gt;
&lt;div class="sh2-pane" data-p="bl" id="sh2-bl"&gt;&lt;/div&gt;
&lt;div class="sh2-pane" data-p="tr" id="sh2-tr"&gt;&lt;/div&gt;
&lt;div class="sh2-note"&gt;Шерлок читает только твою локальную историю (ключи pr_*). Данные не покидают устройство.&lt;/div&gt;
&lt;button id="sh2-close"&gt;Закрыть&lt;/button&gt;
&lt;/div&gt;&lt;/div&gt;
&lt;script&gt;
(function(){
"use strict";
if(window._sh2Done)return;window._sh2Done=1;
var $=function(s){return document.querySelector(s)};
function g(k,d){try{var v=localStorage.getItem(k);return v==null?d:JSON.parse(v)}catch(e){return d}}
function s(k,v){try{localStorage.setItem(k,JSON.stringify(v))}catch(e){}}
/* ── реальные навыки из истории ── */
function realSkills(){
var out=[];
var cases=g('pr_cases',{}),inv=g('pr_inv',{}),tot=0,ok=0;
for(var k in cases){tot++;if(cases[k].correct)ok++;}
for(var k2 in inv){tot++;if(inv[k2].correct)ok++;}
out.push({key:'cases',name:'Кейсы и расследования',skill:tot?Math.round(ok/tot*100):null,n:tot});
var calls=g('pr_call',[]),cs=0;calls.forEach(function(c){cs+=c.s});
out.push({key:'call',name:'Звонок-детектор',skill:calls.length?Math.round(cs/calls.length):null,n:calls.length});
var sim=g('pr_sim',[]),ss=0;sim.forEach(function(c){ss+=c.s});
out.push({key:'sim',name:'Псих-симулятор',skill:sim.length?Math.round(ss/sim.length):null,n:sim.length});
return out;
}
function blindSpot(skills){
var best=null;
skills.forEach(function(sk){if(sk.skill!==null){if(!best||sk.skill&lt;best.skill)best=sk;}});
return best;
}
var ADVICE={
cases:{t:'Слабое место — анализ текстов',d:'Ты пропускаешь флаги в кейсах. Открой Библиотеку дел, выбери категорию «Мошенники» и разбери 3 кейса, отмечая флаги ДО вердикта.'},
call:{t:'Слабое место — звонки',d:'Ты попадаешься на скрипты мошенников. Прогони все 3 сценария в Звонок-детекторе: «банк», «родственник», «приз». Главное правило — класть трубку и перезванивать самому.'},
sim:{t:'Слабое место — манипуляторы',d:'Манипуляторы пробивают твои границы. Проведи 3 дуэли в Псих-симуляторе. Начни с Газлайтера: противоядие — факты, границы, пауза.'}
};
function lvlName(pr){return pr&gt;=600?'Мастер правды':pr&gt;=300?'Профайлер':pr&gt;=150?'Аналитик':pr&gt;=50?'Наблюдатель':'Новичок'}
/* ── рендер аналитики ── */
function renderAn(){
var skills=realSkills();
var any=skills.some(function(x){return x.skill!==null});
if(!any){$('#sh2-an').innerHTML='&lt;div class="sh2-empty"&gt;Пока нет данных. Сделай первый разбор — и я смогу тебя анализировать.&lt;/div&gt;';return;}
var html='';
skills.forEach(function(sk){
var v=sk.skill===null?0:sk.skill;
html+='&lt;div class="sh2-skill"&gt;&lt;div class="top"&gt;&lt;span class="nm"&gt;'+sk.name+'&lt;/span&gt;&lt;span class="val"&gt;'+(sk.skill===null?'—':sk.skill+'%')+'&lt;/span&gt;&lt;/div&gt;'+
'&lt;div class="sh2-bar"&gt;&lt;i style="width:'+v+'%"&gt;&lt;/i&gt;&lt;/div&gt;'+
'&lt;div class="cnt"&gt;Попыток: '+sk.n+'&lt;/div&gt;&lt;/div&gt;';
});
var pr=g('pr_profile',{pr:0}).pr;
html+='&lt;div class="sh2-tip"&gt;? Ранг: &lt;b&gt;'+lvlName(pr)+'&lt;/b&gt; · '+pr+' PR. '+(pr&lt;150?'Копи PR разборами — откроешь более сложные дела.':'Хороший уровень. Бери расследования с подвохом.')+'&lt;/div&gt;';
$('#sh2-an').innerHTML=html;
}
/* ── рендер слепой зоны ── */
function renderBl(){
var skills=realSkills(),b=blindSpot(skills);
if(!b){$('#sh2-bl').innerHTML='&lt;div class="sh2-empty"&gt;Слишком мало данных, чтобы найти слепую зону. Пройди хотя бы 2–3 разбора.&lt;/div&gt;';return;}
var adv=ADVICE[b.key];
$('#sh2-bl').innerHTML='&lt;div class="sh2-blind"&gt;&lt;div class="t"&gt;⚠️ '+adv.t+' · '+b.skill+'%&lt;/div&gt;&lt;div class="d"&gt;'+adv.d+'&lt;/div&gt;&lt;/div&gt;'+
'&lt;button class="sh2-go" id="sh2-gobl"&gt;? Перейти к тренировке&lt;/button&gt;';
$('#sh2-gobl').addEventListener('click',function(){train(b.key)});
}
/* ── рендер тренировки ── */
function renderTr(){
var skills=realSkills(),b=blindSpot(skills);
var html='';
if(!b){html='&lt;div class="sh2-empty"&gt;Начни с любого тренажёра — нажми ниже.&lt;/div&gt;&lt;button class="sh2-go" id="sh2-gotr"&gt;? Открыть Библиотеку дел&lt;/button&gt;';
$('#sh2-tr').innerHTML=html;$('#sh2-gotr').addEventListener('click',function(){train('cases')});return;}
var adv=ADVICE[b.key];
var pr=g('pr_profile',{pr:0}).pr;
var diff=pr&gt;=150?'Сложный':'Базовый';
html+='&lt;div class="sh2-tip"&gt;? План на сегодня (&lt;b&gt;'+diff+'&lt;/b&gt; уровень): '+adv.d+'&lt;/div&gt;';
html+='&lt;div class="sh2-skill"&gt;&lt;div class="top"&gt;&lt;span class="nm"&gt;Цель: '+b.name+'&lt;/span&gt;&lt;span class="val"&gt;'+b.skill+'%&lt;/span&gt;&lt;/div&gt;&lt;div class="cnt"&gt;Подними до 70%+&lt;/div&gt;&lt;/div&gt;';
html+='&lt;button class="sh2-go" id="sh2-gotr2"&gt;? Начать тренировку&lt;/button&gt;';
$('#sh2-tr').innerHTML=html;
$('#sh2-gotr2').addEventListener('click',function(){train(b.key)});
}
function train(key){
$('#sh2-mask').classList.remove('open');
if(key==='cases'){var b=document.getElementById('cs-btn');if(b)b.click();else{var el=document.getElementById('cases');if(el)el.scrollIntoView({behavior:'smooth'});}}
else if(key==='call'){var el2=document.getElementById('call');if(el2)el2.scrollIntoView({behavior:'smooth'});}
else if(key==='sim'){var el3=document.getElementById('sim');if(el3)el3.scrollIntoView({behavior:'smooth'});}
}
/* ── статус и аватар ── */
function setStatus(){
var skills=realSkills(),b=blindSpot(skills);
var ava=$('#sh2-ava'),st=$('#sh2-status');
if(!b){ava.textContent='?';st.textContent='Жду твоих первых дел.';return;}
if(b.skill&gt;=70){ava.textContent='?️';st.textContent='Ты силён. Есть одна слабость — глянь.';}
else{ava.textContent='?';st.textContent='Нашёл твою слепую зону. Потренируем?';}
}
/* ── вкладки ── */
document.querySelectorAll('.sh2-tab').forEach(function(t){
t.addEventListener('click',function(){
document.querySelectorAll('.sh2-tab').forEach(function(x){x.classList.remove('on')});
document.querySelectorAll('.sh2-pane').forEach(function(x){x.classList.remove('on')});
t.classList.add('on');
document.querySelector('.sh2-pane[data-p="'+t.dataset.p+'"]').classList.add('on');
});
});
function renderAll(){renderAn();renderBl();renderTr();setStatus();}
$('#sh2-btn').addEventListener('click',function(){$('#sh2-mask').classList.add('open');renderAll();});
$('#sh2-close').addEventListener('click',function(){$('#sh2-mask').classList.remove('open')});
$('#sh2-mask').addEventListener('click',function(e){if(e.target===this)this.classList.remove('open')});
console.log('? Блок 13 · Шерлок 2.0 подключён');
})();
&lt;/script&gt;

&lt;style&gt;
#dc-btn{position:fixed;left:16px;bottom:264px;z-index:400;width:52px;height:52px;border-radius:50%;border:none;cursor:pointer;background:linear-gradient(135deg,#06B6D4,#10B981);color:#fff;font-size:22px;box-shadow:0 6px 20px rgba(6,182,212,.45);transition:transform .2s}
#dc-btn:hover{transform:scale(1.1)}
@media(min-width:1000px){#dc-btn{bottom:76px;left:16px}}
#dc-mask{position:fixed;inset:0;z-index:425;display:none;align-items:center;justify-content:center;background:rgba(5,10,18,.9);backdrop-filter:blur(6px)}
#dc-mask.open{display:flex}
#dc-card{width:min(620px,94vw);max-height:90vh;overflow-y:auto;border-radius:18px;padding:22px;color:#e8f0ee;background:linear-gradient(180deg,#081f24,#06130f);border:1px solid rgba(6,182,212,.4);font-family:Inter,system-ui,sans-serif;box-shadow:0 30px 60px rgba(0,0,0,.6)}
#dc-card h3{margin:0 0 4px;font-size:20px;color:#67e8f9}
.dc-sub{font-size:12px;color:#7f96b8;margin-bottom:14px}
.dc-streak-row{display:flex;gap:6px;margin-bottom:14px}
.dc-day{width:36px;height:36px;border-radius:10px;background:rgba(255,255,255,.05);border:1px solid rgba(255,255,255,.08);display:flex;align-items:center;justify-content:center;font-size:14px;color:#7f96b8}
.dc-day.done{background:rgba(16,185,129,.15);border-color:rgba(16,185,129,.5);color:#6ee7b7}
.dc-day.today{border-color:#06B6D4;color:#67e8f9}
.dc-case{background:rgba(255,255,255,.04);border:1px solid rgba(6,182,212,.25);border-radius:12px;padding:16px;margin-bottom:14px}
.dc-case .cat{display:inline-block;font-size:10px;padding:3px 10px;border-radius:999px;background:rgba(139,92,246,.15);color:#c4b5fd;font-weight:700;margin-bottom:8px}
.dc-case .txt{font-size:14px;line-height:1.7;color:#e8dcc8;font-style:italic}
.dc-timer{font-family:monospace;font-size:13px;color:#67e8f9;margin-bottom:10px}
.dc-flags{display:flex;flex-direction:column;gap:6px;margin-bottom:12px}
.dc-flag{display:flex;align-items:center;gap:10px;padding:9px 12px;border-radius:10px;border:1px solid rgba(255,255,255,.12);background:rgba(255,255,255,.04);cursor:pointer;font-size:12px;color:#cfc8e8;transition:.2s}
.dc-flag:hover{border-color:#06B6D4;background:rgba(6,182,212,.08)}
.dc-flag input{accent-color:#06B6D4;width:15px;height:15px;cursor:pointer}
.dc-verdict-row{display:flex;gap:8px;margin-bottom:12px}
.dc-verdict-row button{flex:1;padding:11px;border-radius:12px;border:1px solid rgba(6,182,212,.4);background:none;color:#67e8f9;font-weight:700;font-size:13px;cursor:pointer}
.dc-verdict-row button.on{background:linear-gradient(135deg,#06B6D4,#10B981);color:#fff;border-color:transparent}
.dc-res{padding:14px;border-radius:12px;border:1px solid rgba(6,182,212,.4);background:rgba(6,182,212,.06);margin-top:12px}
.dc-res .big{font-size:30px;font-weight:800;color:#67e8f9}
.dc-top{margin-top:14px}
.dc-top h4{font-size:14px;color:#67e8f9;margin-bottom:8px}
.dc-top-row{display:flex;justify-content:space-between;font-size:12px;color:#cfc8e8;padding:7px 10px;border-radius:8px;background:rgba(6,182,212,.05);margin-bottom:5px}
.dc-top-row b{color:#67e8f9}
#dc-close{margin-top:12px;width:100%;border:1px solid rgba(6,182,212,.4);background:none;color:#67e8f9;border-radius:10px;padding:10px;cursor:pointer;font-size:13px}
&lt;/style&gt;
&lt;button id="dc-btn" title="Челлендж дня"&gt;?&lt;/button&gt;
&lt;div id="dc-mask"&gt;&lt;div id="dc-card"&gt;
&lt;h3&gt;? Челлендж дня&lt;/h3&gt;
&lt;div class="dc-sub"&gt;Каждый день — одно дело. Реши его быстро и точно. Серия 7 дней = бонус.&lt;/div&gt;
&lt;div class="dc-streak-row" id="dc-days"&gt;&lt;/div&gt;
&lt;div id="dc-body"&gt;&lt;/div&gt;
&lt;div class="dc-top" id="dc-top" style="display:none"&gt;
&lt;h4&gt;? Лучшие результаты&lt;/h4&gt;
&lt;div id="dc-top-list"&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;button id="dc-close"&gt;Закрыть&lt;/button&gt;
&lt;/div&gt;&lt;/div&gt;
&lt;script&gt;
(function(){
"use strict";
if(window._dcDone)return;window._dcDone=1;
var $=function(s){return document.querySelector(s)};
function g(k,d){try{var v=localStorage.getItem(k);return v==null?d:JSON.parse(v)}catch(e){return d}}
function s(k,v){try{localStorage.setItem(k,JSON.stringify(v))}catch(e){}}
function toast(t,m){if(window.Toast&amp;&amp;Toast.show)Toast.show(t,m,'success')}
function grant(n){if(window.PR&amp;&amp;window.PR.add)window.PR.add(n)}
function coach(t){var c=$('#coach');if(!c)return;$('#coachText').textContent=t;c.style.display='block';clearTimeout(window._prCt);window._prCt=setTimeout(function(){c.style.display='none'},6500)}
/* ── пул дел для челленджа ── */
var POOL=[
{cat:'Мошенники',x:'Ваш аккаунт взломан! Срочно пройдите по ссылке и введите пароль, иначе потеряете все данные!',bad:true,flags:['Искусственная срочность','Запрос пароля через ссылку','Кнопка страха («потеряете всё»)','Официальный тон без деталей']},
{cat:'Манипуляции',x:'Все нормальные люди уже давно так делают. Только ты один упираешься. Подумай о нас.',bad:true,flags:['Стадность («все делают»)','Обесценивание («только ты»)','Давление виной («подумай о нас»)','Конкретные аргументы']},
{cat:'Новости',x:'По данным Росстата (ссылка на отчёт), инфляция в марте составила 0,4%. Это ниже прогноза аналитиков.',bad:false,flags:['Источник и цифры','Нейтральный тон','Сенсационный заголовок','Призыв к действию']},
{cat:'Мошенники',x:'Поздравляем! Вы стали победителем! Для получения приза оплатите доставку 500 рублей.',bad:true,flags:['Неожиданный выигрыш','Предоплата за приз','Срочность','Официальный договор']},
{cat:'Работа',x:'Коллеги, отчёт готов. Он в общей папке, раздел «Финансы». Если есть вопросы — пишите до 17:00.',bad:false,flags:['Конкретное место и время','Нейтральный тон','Искусственная срочность','Абсолютизмы']},
{cat:'Манипуляции',x:'Я никогда не просил тебя об этом раньше. После всего, что было, ты просто обязан помочь.',bad:true,flags:['Абсолютизм («никогда»)','Давление виной','Манипуляция долгом','Прямая просьба без давления']},
{cat:'Фейк-ньюс',x:'Срочно! Учёные скрывают правду об этом продукте! Репостни, пока не удалили!',bad:true,flags:['Срочность','Теория заговора («скрывают»)','Призыв к репосту','Источник с данными']},
{cat:'Бытовое',x:'Я задержусь на час. Пробки. Приеду к восьми, привезу ужин.',bad:false,flags:['Причина и время','Конкретика','Эмоциональное давление','Размытость']},
{cat:'Мошенники',x:'Это полиция. Вы подозреваетесь в деле. Не кладите трубку и никому не говорите.',bad:true,flags:['Запрет класть трубку','Секретность','Запугивание статусом','Предложение проверить удостоверение']},
{cat:'Новости',x:'Эксклюзив! Только у нас! Сенсация века! Узнай первым!',bad:true,flags:['Кликбейт-штампы','Призыв «узнай первым»','Нет фактов','Нет источника']},
{cat:'Манипуляции',x:'Если ты меня любишь, ты сделаешь это. Настоящая любовь — это жертвы.',bad:true,flags:['Манипуляция любовью','Ложная дилемма','Давление чувством','Прямая просьба']},
{cat:'Работа',x:'Я увеличил продажи отдела на 15% за квартал. Готов взять на себя новые проекты.',bad:false,flags:['Конкретные цифры','Нейтральный тон','Абсолютизмы','Обещание без фактов']}
];
/* ── дата и детерминированный выбор дела ── */
function todayKey(){var d=new Date();return d.getFullYear()+'-'+(d.getMonth()+1)+'-'+d.getDate()}
function dayIndex(){var d=new Date();var start=new Date(d.getFullYear(),0,0);var diff=d-start;var day=Math.floor(diff/864e5);return day%POOL.length}
/* ── серия челленджей ── */
function getSeries(){return g('dc_series',[])}
function saveSeries(a){s('dc_series',a.slice(-30))}
function todayDone(){var a=getSeries();return a.indexOf(todayKey())&gt;=0}
/* ── рендер дней ── */
function renderDays(){
var el=$('#dc-days');if(!el)return;
var done=[];for(var i=6;i&gt;=0;i--){var d=new Date(Date.now()-i*864e5);done.push(d.getFullYear()+'-'+(d.getMonth()+1)+'-'+d.getDate())}
var ser=getSeries();
el.innerHTML=done.map(function(k,i){
var isDone=ser.indexOf(k)&gt;=0;
var isToday=i===6;
return '&lt;div class="dc-day'+(isDone?' done':'')+(isToday&amp;&amp;!isDone?' today':'')+'"&gt;'+(isDone?'✓':(isToday?'●':'○'))+'&lt;/div&gt;';
}).join('');
}
/* ── состояние раунда ── */
var startTime=0,picked={},verdict=null,finished=false;
function startChallenge(){
var c=POOL[dayIndex()];
picked={};verdict=null;finished=false;startTime=Date.now();
var body=$('#dc-body');
body.innerHTML=
'&lt;div class="dc-timer" id="dc-timer"&gt;⏱ 0:00&lt;/div&gt;'+
'&lt;div class="dc-case"&gt;&lt;span class="cat"&gt;'+c.cat+'&lt;/span&gt;&lt;div class="txt"&gt;«'+c.x+'»&lt;/div&gt;&lt;/div&gt;'+
'&lt;div style="font-size:12px;color:#7f96b8;margin-bottom:8px"&gt;Шаг 1. Отметь флаги, которые видишь:&lt;/div&gt;'+
'&lt;div class="dc-flags"&gt;'+c.flags.map(function(f,i){return '&lt;label class="dc-flag"&gt;&lt;input type="checkbox" data-i="'+i+'"&gt; '+f+'&lt;/label&gt;'}).join('')+'&lt;/div&gt;'+
'&lt;div style="font-size:12px;color:#7f96b8;margin-bottom:8px"&gt;Шаг 2. Вынеси вердикт:&lt;/div&gt;'+
'&lt;div class="dc-verdict-row"&gt;&lt;button data-v="bad"&gt;? Ложь / манипуляция&lt;/button&gt;&lt;button data-v="clean"&gt;✅ Чисто&lt;/button&gt;&lt;/div&gt;'+
'&lt;button id="dc-submit" style="width:100%;padding:12px;border:none;border-radius:12px;background:linear-gradient(135deg,#06B6D4,#10B981);color:#fff;font-weight:800;font-size:14px;cursor:pointer"&gt;Зафиксировать решение&lt;/button&gt;'+
'&lt;div class="dc-res" id="dc-res" style="display:none"&gt;&lt;/div&gt;';
var timer=setInterval(function(){
if(finished){clearInterval(timer);return}
var el=$('#dc-timer');if(!el){clearInterval(timer);return}
var sec=Math.floor((Date.now()-startTime)/1000);
el.textContent='⏱ '+Math.floor(sec/60)+':'+('0'+(sec%60)).slice(-2);
},1000);
body.querySelectorAll('.dc-verdict-row button').forEach(function(b){
b.addEventListener('click',function(){
body.querySelectorAll('.dc-verdict-row button').forEach(function(x){x.classList.remove('on')});
b.classList.add('on');verdict=b.dataset.v;
});
});
$('#dc-submit').addEventListener('click',function(){finish(c)});
}
function finish(c){
if(finished)return;
if(!verdict){toast('Челлендж','Сначала вынеси вердикт');return}
finished=true;
var flagsChecked=[];
$('#dc-body').querySelectorAll('.dc-flag input:checked').forEach(function(inp){flagsChecked.push(+inp.dataset.i)});
/* в этом пуле все флаги настоящие (список включает и ложные для внимательности — считаем по структуре) */
var correctFlags=flagsChecked.length; /* пользователь отметил флаги */
var correctVerdict=(verdict==='bad')===c.bad;
var elapsed=Math.floor((Date.now()-startTime)/1000);
var speedBonus=elapsed&lt;30?3:(elapsed&lt;60?2:1);
var pr=correctVerdict?5+speedBonus:2;
grant(pr);
/* сохраняем серию */
if(!todayDone()){var a=getSeries();a.push(todayKey());saveSeries(a)}
/* топ результатов */
var top=g('dc_top',[]);
top.push({t:todayKey(),s:pr,e:elapsed});
top.sort(function(a,b){return b.s-a.s||a.e-b.e});
s('dc_top',top.slice(0,10));
/* проверяем бонус за 7 дней подряд */
var ser=getSeries(),streak=0;
for(var i=0;i&lt;ser.length;i++){var d=new Date(Date.now()-i*864e5);var k=d.getFullYear()+'-'+(d.getMonth()+1)+'-'+d.getDate();if(ser.indexOf(k)&gt;=0)streak++;else break}
if(streak&gt;=7&amp;&amp;!g('dc_bonus7',false)){s('dc_bonus7',true);grant(20);toast('? Серия 7 дней!','Бонус +20 PR')}
var res=$('#dc-res');res.style.display='block';
res.innerHTML='&lt;div class="big"&gt;'+pr+' PR&lt;/div&gt;'+
'&lt;div style="font-size:13px;color:#cfc8e8;margin-top:6px"&gt;'+(correctVerdict?'✓ Вердикт верный':'✗ Вердикт мимо — правильный ответ: '+(c.bad?'ложь/манипуляция':'чисто'))+'&lt;/div&gt;'+
'&lt;div style="font-size:12px;color:#7f96b8;margin-top:4px"&gt;Флагов отмечено: '+correctFlags+' · Время: '+elapsed+' с · Бонус скорости: +'+speedBonus+'&lt;/div&gt;'+
'&lt;div style="font-size:12px;color:#7f96b8;margin-top:4px"&gt;Серия: '+streak+' дн. подряд&lt;/div&gt;';
$('#dc-submit').disabled=true;$('#dc-submit').style.opacity='.5';
renderDays();renderTop();
coach(correctVerdict?'? Челлендж выполнен! +'+pr+' PR':'? Завтра попробуем ещё. +'+pr+' PR за практику');
}
function renderTop(){
var el=$('#dc-top');var top=g('dc_top',[]);
if(!top.length){el.style.display='none';return}
el.style.display='block';
$('#dc-top-list').innerHTML=top.slice(0,5).map(function(r,i){
return '&lt;div class="dc-top-row"&gt;&lt;span&gt;'+(i+1)+'. '+r.t+'&lt;/span&gt;&lt;span&gt;&lt;b&gt;+'+r.s+' PR&lt;/b&gt; · '+r.e+' с&lt;/span&gt;&lt;/div&gt;';
}).join('');
}
/* ── открытие ── */
$('#dc-btn').addEventListener('click',function(){
$('#dc-mask').classList.add('open');
renderDays();
if(todayDone()){
$('#dc-body').innerHTML='&lt;div class="dc-case" style="text-align:center;padding:24px"&gt;&lt;div style="font-size:40px;margin-bottom:10px"&gt;✅&lt;/div&gt;&lt;div style="font-size:15px;color:#6ee7b7;font-weight:700"&gt;Челлендж на сегодня выполнен&lt;/div&gt;&lt;div style="font-size:12px;color:#7f96b8;margin-top:6px"&gt;Возвращайся завтра — серия растёт!&lt;/div&gt;&lt;/div&gt;';
}else{
startChallenge();
}
renderTop();
});
$('#dc-close').addEventListener('click',function(){$('#dc-mask').classList.remove('open')});
$('#dc-mask').addEventListener('click',function(e){if(e.target===this)this.classList.remove('open')});
console.log('? Правдомер: Блок 13 · Ежедневный челлендж подключён');
})();
&lt;/script&gt;

&lt;style&gt;
#dc-btn{position:fixed;right:16px;bottom:264px;z-index:400;width:52px;height:52px;border-radius:50%;border:none;cursor:pointer;background:linear-gradient(135deg,#F59E0B,#EF4444);color:#fff;font-size:22px;box-shadow:0 6px 20px rgba(245,158,11,.45);transition:transform .2s}
#dc-btn:hover{transform:scale(1.1)}
@media(min-width:1000px){#dc-btn{bottom:200px;right:16px}}
#dc-mask{position:fixed;inset:0;z-index:426;display:none;align-items:center;justify-content:center;background:rgba(10,7,20,.9);backdrop-filter:blur(6px)}
#dc-mask.open{display:flex}
#dc-card{width:min(560px,94vw);max-height:90vh;overflow-y:auto;border-radius:18px;padding:22px;color:#efe9dc;background:linear-gradient(180deg,#1a1208,#0d0a14);border:1px solid rgba(245,158,11,.4);font-family:Inter,system-ui,sans-serif;box-shadow:0 30px 60px rgba(0,0,0,.6)}
#dc-card h3{margin:0 0 4px;font-size:20px;color:#fbd38d}
.dc-sub{font-size:12px;color:#a8987a;margin-bottom:16px}
.dc-week{display:flex;gap:6px;margin-bottom:18px}
.dc-day{flex:1;text-align:center;padding:8px 4px;border-radius:10px;border:1px solid rgba(255,255,255,.08);background:rgba(255,255,255,.03)}
.dc-day .d{font-size:10px;color:#8a84a8;text-transform:uppercase}
.dc-day .ic{font-size:18px;margin-top:2px}
.dc-day.done{border-color:rgba(16,185,129,.5);background:rgba(16,185,129,.1)}
.dc-day.today{border-color:rgba(245,158,11,.6);background:rgba(245,158,11,.1)}
.dc-task{border:1px solid rgba(245,158,11,.3);border-radius:14px;padding:18px;background:rgba(245,158,11,.05);margin-bottom:14px}
.dc-task .tag{display:inline-block;font-size:10px;padding:3px 10px;border-radius:999px;background:rgba(139,92,246,.15);color:#c4b5fd;font-weight:700;margin-bottom:8px;text-transform:uppercase;letter-spacing:.5px}
.dc-task h4{font-size:16px;color:#f0d68a;margin-bottom:8px}
.dc-task p{font-size:13px;color:#d9d2ea;line-height:1.6;margin-bottom:12px}
.dc-task .reward{font-size:12px;color:#fbd38d;font-weight:700}
.dc-done-btn{width:100%;padding:13px;border:none;border-radius:12px;background:linear-gradient(135deg,#10B981,#059669);color:#fff;font-weight:800;font-size:14px;cursor:pointer}
.dc-done-btn:disabled{background:rgba(16,185,129,.2);color:#6ee7b7;cursor:default}
.dc-streak{display:flex;align-items:center;justify-content:center;gap:10px;margin-top:14px;font-size:14px;color:#fbd38d;font-weight:700}
#dc-close{margin-top:14px;width:100%;border:1px solid rgba(245,158,11,.4);background:none;color:#fbd38d;border-radius:10px;padding:10px;cursor:pointer;font-size:13px}
&lt;/style&gt;
&lt;button id="dc-btn" title="Челлендж дня"&gt;?&lt;/button&gt;
&lt;div id="dc-mask"&gt;&lt;div id="dc-card"&gt;
&lt;h3&gt;? Челлендж дня&lt;/h3&gt;
&lt;div class="dc-sub"&gt;Каждый день — новое задание на внимательность. Выполняй, держи серию, получай бонусы.&lt;/div&gt;
&lt;div class="dc-week" id="dc-week"&gt;&lt;/div&gt;
&lt;div id="dc-body"&gt;&lt;/div&gt;
&lt;button id="dc-close"&gt;Закрыть&lt;/button&gt;
&lt;/div&gt;&lt;/div&gt;
&lt;script&gt;
(function(){
"use strict";
if(window._dcDone)return;window._dcDone=1;
var $=function(s){return document.querySelector(s)};
function g(k,d){try{var v=localStorage.getItem(k);return v==null?d:JSON.parse(v)}catch(e){return d}}
function s(k,v){try{localStorage.setItem(k,JSON.stringify(v))}catch(e){}}
function toast(t,m){if(window.Toast&amp;&amp;Toast.show)Toast.show(t,m,'success')}
function grant(n){if(window.PR&amp;&amp;window.PR.add)window.PR.add(n)}
/* ── пул челленджей (на 2 недели) ── */
var POOL=[
{tag:'Текст',t:'Поймай абсолютизм',p:'Найди сегодня сообщение или фразу со словами «всегда», «никогда», «все», «никто». Проверь её в Текст-детекторе.',pr:3},
{tag:'Наблюдение',t:'Три красных флага',p:'В любом разговоре за день найди минимум 3 маркера манипуляции: срочность, вина, страх, обесценивание.',pr:4},
{tag:'Голос',t:'Слушай паузы',p:'Запиши 15 секунд своей речи в Голос-детектор. Посмотри, сколько пауз и есть ли дрожь тона.',pr:3},
{tag:'Соцсети',t:'Проверь ленту',p:'Выбери один пост в соцсетях и прогони его через Соц-детектор. Бот, фейк или человек?',pr:3},
{tag:'Рефлексия',t:'Вспомни обман',p:'Вспомни случай, когда тебя обманули. Какие флаги ты пропустил тогда? Запиши вывод.',pr:4},
{tag:'Фото',t:'Найди монтаж',p:'Загрузи любое фото из галереи в Фото-детектор. Посмотри на ELA-карту: есть ли зоны правки?',pr:3},
{tag:'Текст',t:'Стоп-фразы',p:'Найди в переписке фразы «честно говоря», «поверь мне», «все знают». Это маркеры маскировки.',pr:3},
{tag:'Звонок',t:'Скрипт мошенника',p:'Пройди один сценарий в Звонок-детекторе («банк» или «родственник»). Набери 80+ очков.',pr:5},
{tag:'Наблюдение',t:'Язык тела',p:'Посмотри видео или живой разговор. Отметь: человек застыл, суетится или ритм рваный?',pr:4},
{tag:'Психология',t:'Дуэль с манипулятором',p:'Пройди одну дуэль в Псих-симуляторе. Выбери Газлайтера или Агрессора. Держи границы.',pr:5},
{tag:'Рефлексия',t:'Зеркало правды',p:'Открой Зеркало правды и честно ответь на 6 вопросов о себе. Какой процент получился?',pr:4},
{tag:'Фьюжн',t:'Сведи каналы',p:'Собери данные из 2+ детекторов и вычисли Индекс достоверности во Фьюжне.',pr:5},
{tag:'Текст',t:'Газлайтинг рядом',p:'Найди фразу, где тебе говорят «тебе показалось», «ты не так понял», «ты придумываешь». Разбери её.',pr:4},
{tag:'Наблюдение',t:'Дефицит и срочность',p:'Заметь сегодня предложение с «осталось мало», «только сегодня», «успей». Это крючок дефицита.',pr:3}
];
/* ── дата и детерминированный выбор ── */
function dayOfYear(){var n=new Date();return Math.floor((n-new Date(n.getFullYear(),0,0))/864e5)}
function todayKey(){return new Date().toDateString()}
function getLog(){return g('dc_log',{})}
function getStreak(){var log=getLog(),c=0,d=new Date();
while(log[d.toDateString()]){c++;d=new Date(d.getTime()-864e5)}return c}
/* ── рендер недели ── */
function renderWeek(){
var el=$('#dc-week'),log=getLog(),html='';
var names=['Вс','Пн','Вт','Ср','Чт','Пт','Сб'];
for(var i=6;i&gt;=0;i--){
var d=new Date(Date.now()-i*864e5);
var done=!!log[d.toDateString()];
var isToday=i===0;
html+='&lt;div class="dc-day'+(done?' done':'')+(isToday?' today':'')+'"&gt;'+
'&lt;div class="d"&gt;'+names[d.getDay()]+'&lt;/div&gt;&lt;div class="ic"&gt;'+(done?'✅':isToday?'?':'·')+'&lt;/div&gt;&lt;/div&gt;';
}
el.innerHTML=html;
}
/* ── рендер задания ── */
function renderTask(){
var body=$('#dc-body'),log=getLog(),doneToday=!!log[todayKey()];
var c=POOL[dayOfYear()%POOL.length];
body.innerHTML='&lt;div class="dc-task"&gt;&lt;span class="tag"&gt;'+c.tag+'&lt;/span&gt;&lt;h4&gt;'+c.t+'&lt;/h4&gt;&lt;p&gt;'+c.p+'&lt;/p&gt;'+
'&lt;div class="reward"&gt;Награда: +'+c.pr+' PR&lt;/div&gt;&lt;/div&gt;'+
'&lt;button class="dc-done-btn" id="dc-done" '+(doneToday?'disabled':'')+'&gt;'+
(doneToday?'✅ Выполнено сегодня':'Отметить выполненным')+'&lt;/button&gt;'+
'&lt;div class="dc-streak"&gt;? Серия: '+getStreak()+' дн. подряд&lt;/div&gt;';
if(!doneToday)$('#dc-done').addEventListener('click',function(){
var log=getLog();log[todayKey()]={t:Date.now(),task:c.t,pr:c.pr};s('dc_log',log);
grant(c.pr);toast('? Челлендж выполнен','+'+c.pr+' PR · серия '+getStreak()+' дн.');
renderWeek();renderTask();
});
}
/* ── добавляем в сайдбар и хаб ── */
var nav=$('#pd-nav');
if(nav&amp;&amp;!nav.querySelector('[data-id="dc"]')){
var b=document.createElement('button');b.className='pd-item';b.setAttribute('data-id','dc');
b.innerHTML='&lt;i class="fas fa-fire"&gt;&lt;/i&gt;&lt;span&gt;Челлендж дня&lt;/span&gt;';
b.addEventListener('click',function(){$('#dc-mask').classList.add('open');renderWeek();renderTask();});
nav.appendChild(b);
}
var hub=$('#pd-hub-grid');
if(hub&amp;&amp;!hub.querySelector('[data-id="dc"]')){
var h=document.createElement('div');h.className='pd-hitem';h.setAttribute('data-id','dc');
h.innerHTML='&lt;i class="fas fa-fire"&gt;&lt;/i&gt;&lt;span&gt;Челлендж дня&lt;/span&gt;';
h.addEventListener('click',function(){$('#dc-mask').classList.add('open');renderWeek();renderTask();});
hub.appendChild(h);
}
$('#dc-btn').addEventListener('click',function(){$('#dc-mask').classList.add('open');renderWeek();renderTask()});
$('#dc-close').addEventListener('click',function(){$('#dc-mask').classList.remove('open')});
$('#dc-mask').addEventListener('click',function(e){if(e.target===this)this.classList.remove('open')});
console.log('? Правдомер: Блок 13 · Ежедневный челлендж подключён');
})();
&lt;/script&gt;

&lt;style&gt;
:root{--dc-green:#10b981;--dc-gold:#f59e0b}
#dc-fab{position:fixed;bottom:24px;right:100px;width:56px;height:56px;border-radius:50%;border:2px solid var(--dc-green);background:linear-gradient(135deg,#052e16,#0f172a);color:#6ee7b7;font-size:26px;cursor:pointer;z-index:9997;box-shadow:0 8px 24px rgba(16,185,129,.35);transition:transform .2s}
#dc-fab:hover{transform:scale(1.1)}
#dc-fab .dc-dot{position:absolute;top:2px;right:2px;width:14px;height:14px;border-radius:50%;background:#ef4444;border:2px solid #0f172a}
#dc-mask{position:fixed;inset:0;background:rgba(0,0,0,.8);backdrop-filter:blur(8px);z-index:10001;display:none;align-items:center;justify-content:center;padding:20px}
#dc-mask.open{display:flex}
.dc-card{background:#1e293b;width:100%;max-width:480px;border-radius:20px;padding:24px;border:1px solid rgba(255,255,255,.1);color:#f8fafc;font-family:system-ui,sans-serif;position:relative;max-height:88vh;overflow-y:auto}
.dc-close{position:absolute;top:14px;right:14px;background:none;border:none;color:#94a3b8;font-size:22px;cursor:pointer}
.dc-head{display:flex;align-items:center;gap:12px;margin-bottom:6px}
.dc-head .ic{font-size:34px}
.dc-head h3{margin:0;font-size:20px;font-weight:800}
.dc-head .date{font-size:12px;color:#94a3b8}
.dc-streak{display:flex;align-items:center;gap:8px;background:rgba(245,158,11,.12);border:1px solid rgba(245,158,11,.3);border-radius:10px;padding:10px 14px;margin:14px 0;font-size:14px}
.dc-streak b{color:var(--dc-gold);font-size:18px}
.dc-type{display:inline-block;font-size:11px;font-weight:700;text-transform:uppercase;letter-spacing:.5px;padding:4px 10px;border-radius:6px;background:rgba(16,185,129,.15);color:#6ee7b7;margin-bottom:12px}
.dc-task{background:rgba(0,0,0,.25);border-radius:12px;padding:16px;font-size:15px;line-height:1.6;margin-bottom:16px;white-space:pre-wrap}
.dc-opts{display:flex;flex-direction:column;gap:10px}
.dc-opt{padding:13px 15px;border-radius:12px;border:1px solid rgba(255,255,255,.15);background:rgba(255,255,255,.04);color:#f8fafc;font-size:14px;cursor:pointer;text-align:left;transition:.2s}
.dc-opt:hover{border-color:var(--dc-green);background:rgba(16,185,129,.1)}
.dc-opt.correct{border-color:var(--dc-green);background:rgba(16,185,129,.2)}
.dc-opt.wrong{border-color:#ef4444;background:rgba(239,68,68,.2)}
.dc-opt:disabled{cursor:default}
.dc-explain{margin-top:14px;padding:12px 14px;border-radius:10px;background:rgba(16,185,129,.1);border-left:3px solid var(--dc-green);font-size:13px;line-height:1.5;display:none}
.dc-explain.show{display:block}
.dc-result{margin-top:16px;text-align:center;padding:18px;border-radius:14px;background:rgba(0,0,0,.25);display:none}
.dc-result.show{display:block}
.dc-result .big{font-size:40px}
.dc-result .pr{font-size:16px;font-weight:800;color:var(--dc-gold);margin-top:6px}
.dc-week{display:flex;gap:6px;margin:14px 0}
.dc-wday{flex:1;height:34px;border-radius:8px;background:rgba(255,255,255,.06);display:flex;align-items:center;justify-content:center;font-size:16px;border:1px solid rgba(255,255,255,.08)}
.dc-wday.done{background:rgba(16,185,129,.25);border-color:var(--dc-green)}
.dc-wday.today{border-color:var(--dc-gold);box-shadow:0 0 0 1px var(--dc-gold)}
.dc-btn{width:100%;padding:13px;border-radius:12px;border:none;background:linear-gradient(135deg,#10b981,#059669);color:#fff;font-weight:800;font-size:15px;cursor:pointer;margin-top:14px}
.dc-btn:hover{filter:brightness(1.1)}
&lt;/style&gt;
&lt;button id="dc-fab" title="Челлендж дня"&gt;?&lt;span class="dc-dot" id="dc-dot" style="display:none"&gt;&lt;/span&gt;&lt;/button&gt;
&lt;div id="dc-mask"&gt;&lt;div class="dc-card"&gt;
&lt;button class="dc-close" id="dc-close"&gt;×&lt;/button&gt;
&lt;div class="dc-head"&gt;&lt;span class="ic"&gt;?&lt;/span&gt;&lt;div&gt;&lt;h3&gt;Челлендж дня&lt;/h3&gt;&lt;div class="date" id="dc-date"&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;
&lt;div class="dc-streak"&gt;? Серия: &lt;b id="dc-streak-n"&gt;0&lt;/b&gt; дн. подряд &lt;span id="dc-milestone" style="margin-left:auto;font-size:12px;color:#94a3b8"&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class="dc-week" id="dc-week"&gt;&lt;/div&gt;
&lt;div id="dc-body"&gt;&lt;/div&gt;
&lt;button class="dc-btn" id="dc-tomorrow" style="display:none"&gt;Увидимся завтра! ?&lt;/button&gt;
&lt;/div&gt;&lt;/div&gt;
&lt;script&gt;
(function(){
"use strict";
if(window._dcDone)return;window._dcDone=1;
var $=function(s){return document.querySelector(s)};
function g(k,d){try{var v=localStorage.getItem(k);return v==null?d:JSON.parse(v)}catch(e){return d}}
function s(k,v){try{localStorage.setItem(k,JSON.stringify(v))}catch(e){}}
function addPR(n){if(window.PR&amp;&amp;window.PR.add)window.PR.add(n)}
function toast(t,m){if(window.Toast&amp;&amp;window.Toast.show)window.Toast.show(t,m,'success')}
function todayKey(){var d=new Date();return d.getFullYear()+'-'+(d.getMonth()+1)+'-'+d.getDate()}
function dayOfYear(){var n=new Date(),s2=new Date(n.getFullYear(),0,0);return Math.floor((n-s2)/864e5)}
/* ── пул заданий: 4 типа ── */
var CHALLENGES=[
/* тип 1: вердикт по тексту */
{type:'Вердикт',task:'«Ваш аккаунт заблокирован! Срочно введите код из СМС, иначе потеряете все деньги!»',opts:['Это правда — банк предупреждает','Это манипуляция/мошенничество','Нейтральный текст'],correct:1,explain:'Срочность + запрос кода + страх потери — классический скрипт мошенника. Настоящий банк не просит коды.'},
{type:'Вердикт',task:'«По данным Центробанка (ссылка на отчёт), ключевая ставка снижена на 0,5%.»',opts:['Манипуляция','Правдивый текст','Кликбейт'],correct:1,explain:'Есть конкретный источник, цифра и нейтральный тон. Это проверяемое сообщение.'},
{type:'Вердикт',task:'«Я увеличил продажи на 500% за месяц, я лучший на рынке, все подтвердят.»',opts:['Правда','Манипуляция/преувеличение','Нейтрально'],correct:1,explain:'Непроверяемые цифры + абсолютизмы «лучший/все» — самопрезентация без фактов.'},
{type:'Вердикт',task:'«Я такого не говорил, тебе показалось. Ты вечно всё придумываешь.»',opts:['Честное уточнение','Газлайтинг','Нейтрально'],correct:1,explain:'Отрицание факта + перекладывание вины + «вечно/всегда» — типичный газлайтинг.'},
{type:'Вердикт',task:'«Натуральное средство лечит все болезни! Врачи скрывают! Тысячи уже исцелились!»',opts:['Правда','Фейк/манипуляция','Нейтрально'],correct:1,explain:'«Лечит всё» + теория заговора + бездоказательные цифры — маркеры фейка.'},
/* тип 2: найди приём */
{type:'Найди приём',task:'«Только сегодня! Осталось 2 места! Не упусти шанс!»\nКакой главный приём здесь использован?',opts:['Газлайтинг','Искусственный дефицит и срочность','Апелляция к авторитету','Подмена тезиса'],correct:1,explain:'«Осталось мало мест» + «только сегодня» = дефицит + срочность: решение на эмоциях, без раздумий.'},
{type:'Найди приём',task:'«Все нормальные люди так делают. Ты что, не как все?»\nКакой приём?',opts:['Стадность и давление «быть как все»','Достоверный факт','Нейтральный вопрос','Конкретика'],correct:0,explain:'Апелляция к «все так делают» + страх быть не как все — стадность.'},
{type:'Найди приём',task:'«После всего, что я для тебя сделал, ты не можешь уделить мне 5 минут?»\nКакой рычаг?',opts:['Страх','Чувство вины','Дефицит','Газлайтинг'],correct:1,explain:'Давление на чувство вины: «после всего, что я сделал» — манипуляция долгом.'},
{type:'Найди приём',task:'«Эксперты единогласно подтверждают, что наш продукт №1.»\nЧто подозрительно?',opts:['Всё корректно','Безымянные «эксперты» и «№1» без источника','Текст слишком короткий','Слишком много цифр'],correct:1,explain:'Апелляция к безымянному авторитету без проверяемого источника — маркер манипуляции.'},
{type:'Найди приём',task:'«Если ты меня любишь — сделаешь это.»\nКакой приём?',opts:['Манипуляция любовью/чувствами','Прямая просьба','Нейтрально','Газлайтинг'],correct:0,explain:'Условие «если любишь» — манипуляция чувствами, подмена просьбы эмоциональным шантажом.'},
/* тип 3: как ответить мошеннику */
{type:'Ответь мошеннику',task:'Звонок: «Это служба безопасности банка, назовите код из СМС для защиты счёта.»\nКак ответить правильно?',opts:['Продиктовать код','Положить трубку и перезвонить по номеру с карты','Назвать любые цифры','Попросить повторить'],correct:1,explain:'Код из СМС не сообщают никому. Правильно — завершить звонок и перезвонить по официальному номеру с обратной стороны карты.'},
{type:'Ответь мошеннику',task:'Сообщение: «Мама, я в беде, срочно переведи деньги, никому не говори.»\nЧто сделать?',opts:['Сразу перевести','Перезвонить маме на известный номер и проверить','Переспросить детали в чате','Посоветоваться с незнакомцем'],correct:1,explain:'«Не говори никому» + срочность = признак схемы. Проверяй обратным звонком на известный номер.'},
{type:'Ответь мошеннику',task:'«Вы выиграли приз! Оплатите комиссию 300₽ для доставки.»\nКак поступить?',opts:['Оплатить комиссию','Не платить: призы не требуют предоплаты','Поторговаться','Дать данные карты'],correct:1,explain:'Настоящий выигрыш не требует предоплаты. Просьба заплатить «за доставку» — 100% скам.'},
{type:'Ответь мошеннику',task:'«Это полиция, вы свидетель. Сообщите данные для повестки.»\nПравильное действие?',opts:['Сообщить данные по телефону','Явиться в участок лично по официальной повестке','Продиктовать адрес','Перезвонить на продиктованный номер'],correct:1,explain:'Полиция не запрашивает данные по телефону. Настоящие органы действуют официально, не по звонку.'},
/* тип 4: блиц-знание */
{type:'Блиц',task:'Какой признак НЕ является маркером манипуляции?',opts:['Искусственная срочность','Конкретные проверяемые факты','Давление на чувство вины','Гарантия сверхдохода'],correct:1,explain:'Конкретные проверяемые факты — признак достоверности, а не манипуляции. Остальное — красные флаги.'},
{type:'Блиц',task:'Что такое газлайтинг?',opts:['Быстрая речь','Заставить жертву сомневаться в своей памяти и восприятии','Использование громких заголовков','Просьба о помощи'],correct:1,explain:'Газлайтинг — форма манипуляции, при которой жертве внушают, что она неправильно помнит/понимает события.'},
{type:'Блиц',task:'Почему фраза «все так делают» манипулятивна?',opts:['Она правдива','Она давит стадностью без доказательств','Она слишком длинная','Она вежливая'],correct:1,explain:'«Все так делают» — стадность: попытка навязать действие без фактов, через страх «быть не как все».'},
{type:'Блиц',task:'Что выдать за признак фейкового аккаунта-бота?',opts:['Личные фото и живые комментарии','Молодой аккаунт + 20 постов в день + шаблонные фразы','Реальные друзья','История активности'],correct:1,explain:'Молодой аккаунт + неестественно высокая активность + шаблонные фразы = классические маркеры бота.'}
];
/* ── состояние ── */
function getLog(){return g('dc_log',{})}
function saveLog(l){s('dc_log',l)}
function streakCount(){
var log=getLog(),c=0,d=new Date();
while(true){var k=d.getFullYear()+'-'+(d.getMonth()+1)+'-'+d.getDate();if(log[k]){c++;d=new Date(d.getTime()-864e5)}else break}
return c;
}
/* ── рендер недели ── */
function renderWeek(){
var el=$('#dc-week');el.innerHTML='';
var names=['Вс','Пн','Вт','Ср','Чт','Пт','Сб'];
var today=new Date(),dow=today.getDay();
for(var i=6;i&gt;=0;i--){
var d=new Date(today.getTime()-(dow-i+7)%7*864e5);
// проще: последние 7 дней
}
// рисуем последние 7 дней
for(var j=6;j&gt;=0;j--){
var dd=new Date(today.getTime()-j*864e5);
var k=dd.getFullYear()+'-'+(dd.getMonth()+1)+'-'+dd.getDate();
var done=!!getLog()[k];
var isToday=(k===todayKey());
var cell=document.createElement('div');
cell.className='dc-wday'+(done?' done':'')+(isToday?' today':'');
cell.title=dd.toLocaleDateString('ru-RU');
cell.textContent=done?'✅':names[dd.getDay()];
el.appendChild(cell);
}
}
/* ── рендер задания ── */
function renderChallenge(){
var body=$('#dc-body');
var log=getLog(),tk=todayKey();
$('#dc-date').textContent=new Date().toLocaleDateString('ru-RU',{weekday:'long',day:'numeric',month:'long'});
$('#dc-streak-n').textContent=streakCount();
var st=streakCount();
$('#dc-milestone').textContent=st&gt;=30?'? Легенда':st&gt;=7?'⭐ В ударе':st&gt;=3?'? Разогрев':'';
renderWeek();
if(log[tk]){
body.innerHTML='&lt;div class="dc-result show"&gt;&lt;div class="big"&gt;✅&lt;/div&gt;&lt;div style="margin-top:6px;font-size:15px"&gt;Челлендж на сегодня выполнен!&lt;/div&gt;&lt;div class="pr"&gt;'+(log[tk].pr||3)+' PR получено&lt;/div&gt;&lt;div style="font-size:12px;color:#94a3b8;margin-top:8px"&gt;Возвращайся завтра за новым заданием.&lt;/div&gt;&lt;/div&gt;';
$('#dc-tomorrow').style.display='block';
$('#dc-dot').style.display='none';
return;
}
var ch=CHALLENGES[dayOfYear()%CHALLENGES.length];
var html='&lt;span class="dc-type"&gt;'+ch.type+'&lt;/span&gt;'+
'&lt;div class="dc-task"&gt;'+ch.task+'&lt;/div&gt;'+
'&lt;div class="dc-opts"&gt;'+ch.opts.map(function(o,i){return '&lt;button class="dc-opt" data-i="'+i+'"&gt;'+o+'&lt;/button&gt;'}).join('')+'&lt;/div&gt;'+
'&lt;div class="dc-explain" id="dc-explain"&gt;? '+ch.explain+'&lt;/div&gt;'+
'&lt;div class="dc-result" id="dc-result"&gt;&lt;/div&gt;';
body.innerHTML=html;
$('#dc-tomorrow').style.display='none';
body.querySelectorAll('.dc-opt').forEach(function(btn){
btn.addEventListener('click',function(){
var i=+btn.dataset.i;
body.querySelectorAll('.dc-opt').forEach(function(b){b.disabled=true;});
var ok=(i===ch.correct);
btn.classList.add(ok?'correct':'wrong');
if(!ok){var cb=body.querySelectorAll('.dc-opt')[ch.correct];if(cb)cb.classList.add('correct');}
$('#dc-explain').classList.add('show');
var pr=ok?5:2;
addPR(pr);
var log=getLog();log[todayKey()]={done:true,correct:ok,pr:pr,t:Date.now()};saveLog(log);
var res=$('#dc-result');res.classList.add('show');
res.innerHTML='&lt;div class="big"&gt;'+(ok?'?':'?')+'&lt;/div&gt;&lt;div style="margin-top:6px;font-size:15px"&gt;'+(ok?'Верно! Отличная работа детектива.':'Почти! Разбор выше.')+'&lt;/div&gt;&lt;div class="pr"&gt;+'+pr+' PR&lt;/div&gt;';
$('#dc-streak-n').textContent=streakCount();
renderWeek();
$('#dc-dot').style.display='none';
$('#dc-tomorrow').style.display='block';
// бонус за серию
var st=streakCount();
if(st===3){addPR(5);toast('? 3 дня подряд','Бонус +5 PR')}
else if(st===7){addPR(15);toast('⭐ 7 дней подряд','Бонус +15 PR')}
else if(st===30){addPR(50);toast('? 30 дней подряд','Бонус +50 PR')}
});
});
}
/* ── управление ── */
$('#dc-fab').addEventListener('click',function(){$('#dc-mask').classList.add('open');renderChallenge()});
$('#dc-close').addEventListener('click',function(){$('#dc-mask').classList.remove('open')});
$('#dc-mask').addEventListener('click',function(e){if(e.target===this)this.classList.remove('open')});
$('#dc-tomorrow').addEventListener('click',function(){$('#dc-mask').classList.remove('open')});
/* точка-напоминание, если сегодня не сделано */
if(!getLog()[todayKey()])$('#dc-dot').style.display='block';
console.log('? Правдомер: Ежедневный челлендж подключён');
})();
&lt;/script&gt;

&lt;style&gt;
#dc13-btn{position:fixed;right:16px;bottom:330px;z-index:400;width:52px;height:52px;border-radius:50%;border:none;cursor:pointer;background:linear-gradient(135deg,#F59E0B,#EF4444);color:#fff;font-size:22px;box-shadow:0 6px 20px rgba(245,158,11,.45);transition:transform .2s}
#dc13-btn:hover{transform:scale(1.1)}
#dc13-btn .bdg{position:absolute;top:-3px;right:-3px;width:20px;height:20px;border-radius:50%;background:#EF4444;color:#fff;font-size:11px;font-weight:800;display:flex;align-items:center;justify-content:center;border:2px solid #120c22}
#dc13-mask{position:fixed;inset:0;z-index:431;display:none;align-items:center;justify-content:center;background:rgba(10,7,18,.9);backdrop-filter:blur(6px)}
#dc13-mask.open{display:flex}
#dc13-card{width:min(620px,94vw);max-height:90vh;overflow-y:auto;border-radius:18px;padding:22px;color:#efe9dc;background:linear-gradient(180deg,#1c1208,#0d0a14);border:1px solid rgba(245,158,11,.4);font-family:Inter,system-ui,sans-serif;box-shadow:0 30px 60px rgba(0,0,0,.6)}
#dc13-card h3{margin:0 0 4px;font-size:20px;color:#fbd38d;display:flex;align-items:center;gap:8px}
.dc13-top{display:flex;justify-content:space-between;align-items:center;margin-bottom:12px}
.dc13-streak{font-size:13px;color:#fbd38d;font-weight:700}
.dc13-date{font-size:11px;color:#a8987a}
.dc13-diff{display:inline-block;font-size:10px;padding:3px 10px;border-radius:999px;font-weight:700;margin-bottom:8px}
.dc13-diff.easy{background:rgba(16,185,129,.2);color:#6ee7b7}
.dc13-diff.med{background:rgba(245,158,11,.2);color:#fcd34d}
.dc13-diff.hard{background:rgba(239,68,68,.2);color:#fca5a5}
.dc13-text{background:rgba(255,255,255,.04);border:1px solid rgba(245,158,11,.2);border-radius:12px;padding:16px;font-size:14px;line-height:1.7;color:#e8dcc8;margin:12px 0;font-style:italic}
.dc13-timer{font-family:monospace;font-size:14px;color:#fbd38d;margin-bottom:10px}
.dc13-opt{display:flex;align-items:center;gap:10px;padding:11px 12px;border-radius:10px;border:1px solid rgba(255,255,255,.12);background:rgba(255,255,255,.04);cursor:pointer;font-size:13px;color:#cfc8e8;margin:6px 0;transition:.2s}
.dc13-opt:hover{border-color:#F59E0B;background:rgba(245,158,11,.08)}
.dc13-opt input{accent-color:#F59E0B;width:16px;height:16px;cursor:pointer}
.dc13-opt.right{border-color:rgba(16,185,129,.6);background:rgba(16,185,129,.12)}
.dc13-opt.wrong{border-color:rgba(239,68,68,.6);background:rgba(239,68,68,.12)}
.dc13-choice{padding:12px 14px;border-radius:12px;border:1px solid rgba(255,255,255,.15);background:rgba(255,255,255,.04);color:#cfc8e8;font-size:13px;cursor:pointer;text-align:left;width:100%;margin:6px 0;transition:.2s}
.dc13-choice:hover{border-color:#F59E0B;background:rgba(245,158,11,.08)}
.dc13-choice.right{border-color:rgba(16,185,129,.6);background:rgba(16,185,129,.12);color:#6ee7b7}
.dc13-choice.wrong{border-color:rgba(239,68,68,.6);background:rgba(239,68,68,.12);color:#fca5a5}
.dc13-submit{width:100%;padding:13px;border:none;border-radius:12px;background:linear-gradient(135deg,#F59E0B,#EF4444);color:#fff;font-weight:800;font-size:15px;cursor:pointer;margin-top:12px}
.dc13-result{margin-top:14px;padding:16px;border-radius:14px;background:rgba(245,158,11,.08);border:1px solid rgba(245,158,11,.3)}
.dc13-result .score{font-size:30px;font-weight:800;color:#fbd38d}
.dc13-result .expl{font-size:13px;color:#d9d2ea;line-height:1.6;margin-top:8px}
.dc13-journal{margin-top:16px}
.dc13-journal h4{font-size:14px;color:#fbd38d;margin-bottom:8px}
.dc13-jrow{display:flex;justify-content:space-between;font-size:12px;color:#cfc8e8;padding:7px 10px;border-radius:8px;background:rgba(255,255,255,.04);margin-bottom:5px}
.dc13-jrow.today{border:1px solid rgba(245,158,11,.4)}
.dc13-jrow b{color:#fbd38d}
#dc13-close{margin-top:14px;width:100%;border:1px solid rgba(245,158,11,.4);background:none;color:#fbd38d;border-radius:10px;padding:10px;cursor:pointer;font-size:13px}
&lt;/style&gt;
&lt;button id="dc13-btn" title="Челлендж дня"&gt;?&lt;span class="bdg" id="dc13-bdg" style="display:none"&gt;!&lt;/span&gt;&lt;/button&gt;
&lt;div id="dc13-mask"&gt;&lt;div id="dc13-card"&gt;
&lt;div class="dc13-top"&gt;
&lt;h3&gt;? Челлендж дня&lt;/h3&gt;
&lt;div style="text-align:right"&gt;&lt;div class="dc13-streak" id="dc13-streak"&gt;? 0 дн.&lt;/div&gt;&lt;div class="dc13-date" id="dc13-date"&gt;&lt;/div&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div id="dc13-body"&gt;&lt;/div&gt;
&lt;div class="dc13-journal" id="dc13-journal"&gt;&lt;/div&gt;
&lt;button id="dc13-close"&gt;Закрыть&lt;/button&gt;
&lt;/div&gt;&lt;/div&gt;
&lt;script&gt;
(function(){
"use strict";
if(window._dc13Done)return;window._dc13Done=1;
var $=function(s){return document.querySelector(s)};
function g(k,d){try{var v=localStorage.getItem(k);return v==null?d:JSON.parse(v)}catch(e){return d}}
function s(k,v){try{localStorage.setItem(k,JSON.stringify(v))}catch(e){}}
function toast(t,m){if(window.Toast&amp;&amp;Toast.show)Toast.show(t,m,'success')}
function grant(n){var P=g('pr_profile',{pr:0,streak:0,last:'',lvl:1});P.pr+=n;P.lvl=1+Math.floor(P.pr/100);s('pr_profile',P);var e=$('#hPr');if(e)e.textContent='? '+P.pr+' PR';}
/* ── пул из 14 челленджей (ротация по дате) ── */
var CH=[
{id:1,type:'flags',diff:'easy',title:'СМС от «банка»',text:'Срочно! Ваша карта заблокирована. Немедленно сообщите код из СМС, иначе все деньги пропадут! Только сегодня можно спасти счёт.',opts:[{t:'Искусственная срочность',ok:1},{t:'Кнопка страха',ok:1},{t:'Запрос секретного кода',ok:1},{t:'Конкретные цифры и даты',ok:0},{t:'Ссылка на источник',ok:0}],explain:'Срочность + страх + запрос кода = классический скрипт мошенника. Банк никогда не просит код из СМС.'},
{id:2,type:'verdict',diff:'easy',title:'Рабочее письмо',text:'Встреча переносится на 15:00 в четверг. Повестка: бюджет Q2. Материалы — в общей папке. Источник: отчёт финансового отдела.',answer:'clean',explain:'Конкретика: время, повестка, источник. Нет давления и эмоций — чистый деловой текст.'},
{id:3,type:'technique',diff:'med',title:'Разговор с партнёром',text:'Я такого не говорил, тебе показалось. Ты вечно всё придумываешь. Ты сам виноват, что так вышло.',techs:['Газлайтинг','Давление виной','Кнопка страха','Дефицит','Стадность'],answer:0,explain:'«Тебе показалось», «ты всё придумываешь» — газлайтинг: заставляют сомневаться в своей памяти.'},
{id:4,type:'flags',diff:'med',title:'«Инвестиции»',text:'Только сегодня! Гарантированные 300% годовых. Осталось мало мест, успей! Это абсолютно безопасно, все так делают.',opts:[{t:'Гарантия сверхдохода',ok:1},{t:'Дефицит мест',ok:1},{t:'Срочность',ok:1},{t:'Стадность',ok:1},{t:'Описание рисков и лицензий',ok:0}],explain:'Гарантия сверхдохода + дефицит + срочность + «все так делают» = финансовая пирамида.'},
{id:5,type:'verdict',diff:'med',title:'Звонок родителя',text:'После всего, что я для тебя сделал, ты даже не звонишь? Все будут смеяться над таким сыном.',answer:'manip',explain:'Вина («после всего») + стыд («все будут смеяться») — рычаги давления, манипуляция.'},
{id:6,type:'technique',diff:'med',title:'«Горящее предложение»',text:'Только сегодня! Осталось 2 места! Если не решите сейчас — завтра будет поздно. Успейте!',techs:['Газлайтинг','Давление виной','Срочность и дефицит','Стадность','Обесценивание'],answer:2,explain:'«Только сегодня», «осталось 2 места», «завтра поздно» — искусственная срочность и дефицит.'},
{id:7,type:'flags',diff:'hard',title:'«Сенсация» о воде',text:'Учёные доказали: все, кто пьёт воду по утрам, живут на 20 лет дольше! Врачи скрывают! Поделись со всеми, пока не удалили!',opts:[{t:'Абсолютизм «все»',ok:1},{t:'Цифра без источника',ok:1},{t:'Теория заговора',ok:1},{t:'Призыв к репосту',ok:1},{t:'Ссылка на исследование',ok:0}],explain:'Абсолютизм + цифра без источника + «врачи скрывают» + призыв к репосту = фейк-маркеры.'},
{id:8,type:'verdict',diff:'easy',title:'Звонок «из банка»',text:'Это служба безопасности банка. По вашему счёту подозрительная операция. Назовите код из СМС для защиты.',answer:'lie',explain:'Запрос кода из СМС под видом «защиты» — 100% мошенничество. Банк так не делает.'},
{id:9,type:'technique',diff:'hard',title:'«Заботливый» друг',text:'Я тебе это говорю, потому что переживаю. Все заметили, как ты изменился. Тебе никто не скажет правду, кроме меня.',techs:['Газлайтинг','Монополия на «правду»','Кнопка страха','Дефицит','Стадность'],answer:1,explain:'«Никто не скажет, кроме меня» — монополия на правду: изолирует от других мнений.'},
{id:10,type:'flags',diff:'med',title:'«Целебный» препарат',text:'Натуральное средство лечит все болезни! Врачи не хотят, чтобы вы знали. Тысячи уже исцелились. Заказывайте, пока есть в наличии!',opts:[{t:'«Лечит все болезни»',ok:1},{t:'«Врачи скрывают»',ok:1},{t:'«Тысячи исцелились» без доказательств',ok:1},{t:'Дефицит',ok:1},{t:'Клинические испытания',ok:0}],explain:'«Лечит всё» + теория заговора + бездоказательные «тысячи» + дефицит = маркетинг пустышки.'},
{id:11,type:'verdict',diff:'hard',title:'Резюме кандидата',text:'Увеличил продажи на 500% за месяц. Я лучший специалист на рынке, каждый это подтвердит. Работал в 5 компаниях одновременно.',answer:'manip',explain:'500% без подтверждений + «лучший» + «каждый подтвердит» — преувеличение, манипуляция впечатлением.'},
{id:12,type:'technique',diff:'easy',title:'Пост в соцсети',text:'Все уже перешли на этот способ! Мои друзья в восторге! Ты что, до сих пор не с нами? Присоединяйся!',techs:['Газлайтинг','Давление виной','Кнопка страха','Стадность','Дефицит'],answer:3,explain:'«Все уже», «друзья в восторге», «ты что, не с нами?» — стадность, давление большинством.'},
{id:13,type:'flags',diff:'hard',title:'Сообщение от «бывшего»',text:'Привет! Мы же были так счастливы. Ты наверное тоже скучаешь? Все наши друзья считают, что нам надо быть вместе. Давай встретимся, только никому не говори.',opts:[{t:'Обобщение «мы были счастливы»',ok:1},{t:'Проекция чувств',ok:1},{t:'Стадность',ok:1},{t:'Просьба о секрете',ok:1},{t:'Уважение личных границ',ok:0}],explain:'Обобщение + проекция «ты скучаешь» + стадность + секретность — манипуляция на воссоединение.'},
{id:14,type:'verdict',diff:'med',title:'Пост «идеальная жизнь»',text:'Моя жизнь идеальна! Каждый день — праздник! Я никогда не расстраиваюсь! Всё всегда складывается лучше всех!',answer:'manip',explain:'Токсичный позитив с абсолютизмами: «идеальна», «никогда», «всегда». Так маскируют реальность.'}
];
var VERDICTS=[{k:'lie',l:'? Ложь'},{k:'manip',l:'? Манипуляция'},{k:'clean',l:'✅ Чисто'}];
var startT=0;
function todayKey(){var d=new Date();return d.getFullYear()+'-'+(d.getMonth()+1)+'-'+d.getDate()}
function dayNum(){var d=new Date();var st=new Date(d.getFullYear(),0,0);return Math.floor((d-st)/864e5)}
function curChallenge(){return CH[dayNum()%CH.length]}
function hist(){return g('dc13_hist',[])}
function doneToday(){var h=hist();for(var i=0;i&lt;h.length;i++)if(h[i].date===todayKey())return h[i];return null}
function streak(){return g('pr_streak',{d:0,last:''})}
/* ── рендер ── */
function render(){
var c=curChallenge(),done=doneToday();
$('#dc13-date').textContent=new Date().toLocaleDateString('ru-RU',{weekday:'long',day:'numeric',month:'long'});
$('#dc13-streak').textContent='? '+streak().d+' дн.';
var body=$('#dc13-body');
var diffL={easy:'Легко',med:'Средне',hard:'Сложно'}[c.diff];
var html='&lt;span class="dc13-diff '+c.diff+'"&gt;'+diffL+'&lt;/span&gt;';
html+='&lt;div style="font-size:15px;font-weight:700;color:#efe9dc"&gt;'+c.title+'&lt;/div&gt;';
if(done){
html+='&lt;div class="dc13-text"&gt;'+c.text+'&lt;/div&gt;';
html+='&lt;div class="dc13-result"&gt;&lt;div class="score"&gt;+'+done.pr+' PR&lt;/div&gt;&lt;div style="font-size:12px;color:#a8987a;margin-top:4px"&gt;Уже решено сегодня · '+done.time+' с&lt;/div&gt;&lt;div class="expl"&gt;? '+c.explain+'&lt;/div&gt;&lt;/div&gt;';
body.innerHTML=html;renderJournal();return;
}
html+='&lt;div class="dc13-text"&gt;'+c.text+'&lt;/div&gt;';
html+='&lt;div class="dc13-timer" id="dc13-timer"&gt;⏱ 0 с&lt;/div&gt;';
if(c.type==='flags'){
html+='&lt;div style="font-size:12px;color:#a8987a;margin-bottom:6px"&gt;Отметь все красные флаги, которые видишь:&lt;/div&gt;';
html+=c.opts.map(function(o,i){return '&lt;label class="dc13-opt" data-i="'+i+'"&gt;&lt;input type="checkbox"&gt; '+o.t+'&lt;/label&gt;'}).join('');
html+='&lt;button class="dc13-submit" id="dc13-go"&gt;Проверить&lt;/button&gt;';
}else if(c.type==='verdict'){
html+='&lt;div style="font-size:12px;color:#a8987a;margin-bottom:6px"&gt;Вынеси вердикт:&lt;/div&gt;';
html+=VERDICTS.map(function(v){return '&lt;button class="dc13-choice" data-k="'+v.k+'"&gt;'+v.l+'&lt;/button&gt;'}).join('');
}else if(c.type==='technique'){
html+='&lt;div style="font-size:12px;color:#a8987a;margin-bottom:6px"&gt;Какой приём здесь использован?&lt;/div&gt;';
html+=c.techs.map(function(t,i){return '&lt;button class="dc13-choice" data-i="'+i+'"&gt;'+t+'&lt;/button&gt;'}).join('');
}
body.innerHTML=html;
startT=Date.now();
var tm=setInterval(function(){var el=$('#dc13-timer');if(!el){clearInterval(tm);return}el.textContent='⏱ '+Math.floor((Date.now()-startT)/1000)+' с';},500);
/* обработчики */
if(c.type==='flags'){
$('#dc13-go').addEventListener('click',function(){
var correct=0,falsePos=0;
body.querySelectorAll('.dc13-opt').forEach(function(el){
var i=+el.dataset.i,chk=el.querySelector('input').checked,ok=c.opts[i].ok;
if(chk&amp;&amp;ok){correct++;el.classList.add('right')}
else if(chk&amp;&amp;!ok){falsePos++;el.classList.add('wrong')}
else if(!chk&amp;&amp;ok)el.classList.add('right');
});
var pr=Math.max(5,correct*8-falsePos*4)+speedBonus();
finish(c,pr,correct+'/'+c.opts.filter(function(o){return o.ok}).length);
});
}else if(c.type==='verdict'){
body.querySelectorAll('.dc13-choice').forEach(function(b){
b.addEventListener('click',function(){
var k=b.dataset.k,ok=(k===c.answer);
body.querySelectorAll('.dc13-choice').forEach(function(x){x.classList.add(x.dataset.k===c.answer?'right':(x===b&amp;&amp;!ok?'wrong':''))});
var pr=(ok?25:5)+speedBonus();
finish(c,pr,ok?'верно':'мимо');
});
});
}else if(c.type==='technique'){
body.querySelectorAll('.dc13-choice').forEach(function(b){
b.addEventListener('click',function(){
var i=+b.dataset.i,ok=(i===c.answer);
body.querySelectorAll('.dc13-choice').forEach(function(x,j){if(j===c.answer)x.classList.add('right');else if(x===b&amp;&amp;!ok)x.classList.add('wrong')});
var pr=(ok?25:5)+speedBonus();
finish(c,pr,ok?'верно':'мимо');
});
});
}
renderJournal();
}
function speedBonus(){var t=(Date.now()-startT)/1000;return t&lt;=30?10:t&lt;=60?5:0}
function finish(c,pr,label){
grant(pr);
/* стрик */
var st=streak(),t=todayKey();
var bonusMsg='';
if(st.last!==t){
var y=new Date(Date.now()-864e5);var yd=y.getFullYear()+'-'+(y.getMonth()+1)+'-'+y.getDate();
st.d=(st.last===yd)?st.d+1:1;st.last=t;s('pr_streak',st);
var e2=$('#hStreak');if(e2)e2.textContent='? '+st.d;
if(st.d===7){grant(30);bonusMsg=' ? Серия 7 дней: +30 PR!';}
}
var time=Math.floor((Date.now()-startT)/1000);
var h=hist();h.unshift({date:todayKey(),id:c.id,title:c.title,pr:pr,time:time,label:label});
s('dc13_hist',h.slice(0,30));
$('#dc13-streak').textContent='? '+streak().d+' дн.';
$('#dc13-body').innerHTML='&lt;div class="dc13-text"&gt;'+c.text+'&lt;/div&gt;'+
'&lt;div class="dc13-result"&gt;&lt;div class="score"&gt;+'+pr+' PR&lt;/div&gt;'+
'&lt;div style="font-size:12px;color:#a8987a;margin-top:4px"&gt;'+label+' · '+time+' с'+bonusMsg+'&lt;/div&gt;'+
'&lt;div class="expl"&gt;? '+c.explain+'&lt;/div&gt;&lt;/div&gt;';
toast('? Челлендж решён','+'+pr+' PR'+bonusMsg);
renderJournal();
}
function renderJournal(){
var h=hist().slice(0,10);
if(!h.length){$('#dc13-journal').innerHTML='';return}
var html='&lt;h4&gt;? Журнал челленджей&lt;/h4&gt;';
html+=h.map(function(x){
return '&lt;div class="dc13-jrow'+(x.date===todayKey()?' today':'')+'"&gt;&lt;span&gt;'+x.title+'&lt;/span&gt;&lt;span&gt;&lt;b&gt;+'+x.pr+' PR&lt;/b&gt; · '+x.time+' с&lt;/span&gt;&lt;/div&gt;';
}).join('');
$('#dc13-journal').innerHTML=html;
}
/* ── бейдж на кнопке, если сегодня не решено ── */
function updBadge(){$('#dc13-bdg').style.display=doneToday()?'none':'flex'}
/* ── открытие ── */
$('#dc13-btn').addEventListener('click',function(){$('#dc13-mask').classList.add('open');render();updBadge();});
$('#dc13-close').addEventListener('click',function(){$('#dc13-mask').classList.remove('open')});
$('#dc13-mask').addEventListener('click',function(e){if(e.target===this)this.classList.remove('open')});
/* ── добавляем в сайдбар и хаб (правило: и там, и там) ── */
var nav=$('#pd-nav');
if(nav&amp;&amp;!nav.querySelector('[data-id="dc13"]')){
var b=document.createElement('button');b.className='pd-item';b.setAttribute('data-id','dc13');
b.innerHTML='&lt;i class="fas fa-bullseye"&gt;&lt;/i&gt;&lt;span&gt;Челлендж дня&lt;/span&gt;';
b.addEventListener('click',function(){$('#dc13-mask').classList.add('open');render();updBadge();if(window.innerWidth&lt;1000){var sb=$('#pd-sidebar');if(sb)sb.classList.remove('open')}});
nav.appendChild(b);
}
var hub=$('#pd-hub-grid');
if(hub&amp;&amp;!hub.querySelector('[data-id="dc13"]')){
var h=document.createElement('div');h.className='pd-hitem';h.setAttribute('data-id','dc13');
h.innerHTML='&lt;i class="fas fa-bullseye"&gt;&lt;/i&gt;&lt;span&gt;Челлендж дня&lt;/span&gt;';
h.addEventListener('click',function(){$('#dc13-mask').classList.remove('open');$('#dc13-mask').classList.add('open');render();updBadge();});
hub.appendChild(h);
}
updBadge();
console.log('? Правдомер: Блок 13 · Ежедневный челлендж подключён');
})();
&lt;/script&gt;

&lt;script&gt;
(function(){
"use strict";
if(window._pdSyncDone)return;window._pdSyncDone=1;
var FLOATS=[
{id:'rb-btn',ic:'?',n:'Реальный детектор'},
{id:'pg-btn',ic:'⚖️',n:'Полиграф'},
{id:'lz-btn',ic:'?',n:'Лжец'},
{id:'sherlock-fab',ic:'?️',n:'Шерлок'},
{id:'cs-btn',ic:'?',n:'Библиотека дел'},
{id:'truth-btn',ic:'?',n:'Детектор лжи'},
{id:'vd-fab',ic:'?️',n:'Голос-анализ'},
{id:'p12-btn',ic:'?',n:'Паспорт проекта'}
];
function sync(){
var nav=document.getElementById('pd-nav');
if(!nav)return;
FLOATS.forEach(function(f){
if(document.getElementById(f.id)&amp;&amp;!nav.querySelector('[data-float="'+f.id+'"]')){
var b=document.createElement('button');
b.className='pd-item';
b.setAttribute('data-float',f.id);
b.innerHTML='&lt;i style="font-style:normal;width:20px;text-align:center"&gt;'+f.ic+'&lt;/i&gt;&lt;span&gt;'+f.n+'&lt;/span&gt;';
b.addEventListener('click',function(){
var el=document.getElementById(f.id);
if(el)el.click();
});
nav.appendChild(b);
}
});
}
if(document.readyState==='complete')setTimeout(sync,200);
else window.addEventListener('load',function(){setTimeout(sync,200)});
console.log('? Правдомер: патч синхронизации сайдбара подключён');
})();
&lt;/script&gt;

&lt;style&gt;
#cg-btn{position:fixed;left:16px;bottom:460px;z-index:400;width:52px;height:52px;border-radius:50%;border:none;cursor:pointer;background:linear-gradient(135deg,#8B5CF6,#D4AF37);color:#fff;font-size:22px;box-shadow:0 6px 20px rgba(139,92,246,.45);transition:transform .2s}
#cg-btn:hover{transform:scale(1.1)}
@media(min-width:1000px){#cg-btn{bottom:264px}}
#cg-mask{position:fixed;inset:0;z-index:427;display:none;align-items:center;justify-content:center;background:rgba(10,7,20,.9);backdrop-filter:blur(6px)}
#cg-mask.open{display:flex}
#cg-card{width:min(620px,94vw);max-height:90vh;overflow-y:auto;border-radius:18px;padding:22px;color:#efe9dc;background:linear-gradient(180deg,#171034,#0d0a1c);border:1px solid rgba(139,92,246,.4);box-shadow:0 30px 60px rgba(0,0,0,.6)}
#cg-card h3{margin:0 0 4px;font-size:20px;color:#c4b5fd}
.cg-sub{font-size:12px;color:#a79ec9;margin-bottom:14px;line-height:1.5}
.cg-tabs{display:flex;gap:8px;margin-bottom:14px;flex-wrap:wrap}
.cg-tab{flex:1;padding:9px;border-radius:10px;border:1px solid rgba(139,92,246,.35);background:rgba(139,92,246,.08);color:#c4b5fd;font-weight:700;font-size:12px;cursor:pointer;min-width:120px}
.cg-tab.on{background:linear-gradient(135deg,#8B5CF6,#D4AF37);color:#fff;border-color:transparent}
.cg-pane{display:none}.cg-pane.on{display:block}
.cg-dots{display:flex;gap:5px;margin-bottom:12px}
.cg-dot{width:26px;height:6px;border-radius:99px;background:rgba(255,255,255,.12)}
.cg-dot.done{background:#10B981}.cg-dot.cur{background:#D4AF37}
.cg-q{background:rgba(139,92,246,.06);border:1px solid rgba(139,92,246,.25);border-radius:12px;padding:14px;margin-bottom:12px;font-size:14px;line-height:1.6}
.cg-post{background:rgba(0,0,0,.25);border-left:3px solid #F59E0B;border-radius:0 10px 10px 0;padding:12px;margin-bottom:10px;font-size:13px;line-height:1.6;font-style:italic;color:#d9d2ea}
.cg-opts{display:flex;flex-direction:column;gap:8px}
.cg-opt{padding:12px 14px;border-radius:12px;border:1px solid rgba(255,255,255,.15);background:rgba(255,255,255,.04);color:#cfc8e8;font-size:13px;cursor:pointer;text-align:left;transition:.2s;line-height:1.5}
.cg-opt:hover{border-color:#8B5CF6;background:rgba(139,92,246,.08)}
.cg-opt.right{border-color:#10B981;background:rgba(16,185,129,.12);color:#6ee7b7}
.cg-opt.wrong{border-color:#EF4444;background:rgba(239,68,68,.12);color:#fca5a5}
.cg-opt:disabled{cursor:default}
.cg-exp{margin-top:12px;padding:12px 14px;border-radius:12px;border-left:3px solid #D4AF37;background:rgba(212,175,55,.07);font-size:12px;color:#d9cfae;line-height:1.6;display:none}
.cg-exp.show{display:block}
.cg-next{width:100%;padding:12px;margin-top:12px;border:none;border-radius:12px;background:linear-gradient(135deg,#8B5CF6,#D4AF37);color:#fff;font-weight:800;font-size:14px;cursor:pointer;display:none}
.cg-next.show{display:block}
.cg-row{display:flex;justify-content:space-between;font-size:13px;color:#cfc8e8;padding:8px 12px;border-radius:10px;background:rgba(255,255,255,.04);border:1px solid rgba(255,255,255,.08);margin-bottom:6px}
.cg-row b{color:#c4b5fd}
#cg-close{margin-top:14px;width:100%;border:1px solid rgba(139,92,246,.4);background:none;color:#c4b5fd;border-radius:10px;padding:10px;cursor:pointer;font-size:13px}
&lt;/style&gt;
&lt;button id="cg-btn" title="Когнитивные искажения"&gt;?&lt;/button&gt;
&lt;div id="cg-mask"&gt;&lt;div id="cg-card"&gt;
&lt;h3&gt;? Когнитивные искажения&lt;/h3&gt;
&lt;div class="cg-sub"&gt;Искажения — слабые места мышления. Мошенники и манипуляторы рассчитывают именно на них. Научись замечать ловушки в своей голове.&lt;/div&gt;
&lt;div class="cg-tabs"&gt;
&lt;button class="cg-tab on" data-p="casino"&gt;? Казино мышления&lt;/button&gt;
&lt;button class="cg-tab" data-p="hooks"&gt;? Почему я поверил?&lt;/button&gt;
&lt;button class="cg-tab" data-p="me"&gt;? Мои искажения&lt;/button&gt;
&lt;/div&gt;
&lt;div class="cg-pane on" id="cg-p-casino"&gt;&lt;div id="cg-casino"&gt;&lt;/div&gt;&lt;/div&gt;
&lt;div class="cg-pane" id="cg-p-hooks"&gt;&lt;div id="cg-hooks"&gt;&lt;/div&gt;&lt;/div&gt;
&lt;div class="cg-pane" id="cg-p-me"&gt;&lt;div id="cg-me"&gt;&lt;/div&gt;&lt;/div&gt;
&lt;button id="cg-close"&gt;Закрыть&lt;/button&gt;
&lt;/div&gt;&lt;/div&gt;
&lt;script&gt;
(function(){
"use strict";
if(window._cgDone)return;window._cgDone=1;
var $=function(s){return document.querySelector(s)};
function g(k,d){try{var v=localStorage.getItem(k);return v==null?d:JSON.parse(v)}catch(e){return d}}
function s(k,v){try{localStorage.setItem(k,JSON.stringify(v))}catch(e){}}
function grant(n){var P=g('pr_profile',{pr:0,streak:0,last:'',lvl:1});P.pr+=n;P.lvl=1+Math.floor(P.pr/100);s('pr_profile',P);var e=$('#hPr');if(e)e.textContent='? '+P.pr+' PR';}
/* ═══ ИГРЫ КАЗИНО МЫШЛЕНИЯ ═══ */
var GAMES=[
{id:'gambler',n:'? Ошибка игрока',q:'Онлайн-рулетка: 9 раз подряд выпало красное. Какая вероятность, что следующим выпадет чёрное?',
opts:[{t:'Примерно 50/50 — каждый спин независим',ok:1},{t:'Чёрное вероятнее — оно «уже должно» выпасть',ok:0},{t:'Чёрное менее вероятно — тренд продолжится',ok:0}],
exp:'У рулетки нет памяти. Каждый спин независим, вероятность одинакова. Ощущение «уже должно выпасть чёрное» — ошибка игрока.'},
{id:'anchor',n:'⚓ Якорение',q:'Машина выставлена за 1,8 млн ₽, затем «скидка» до 1,1 млн. Продавец: «выгода 700 тысяч!» Это выгодно?',
opts:[{t:'Да, скидка 700 тысяч — реальная выгода',ok:0},{t:'Выгодность зависит от рыночной цены машины, а не от первой цифры',ok:1},{t:'Надо брать быстрее, пока цену не вернули',ok:0}],
exp:'Первая цифра — якорь. Продавец мог завысить её как угодно. Выгода видна только в сравнении с рынком, а не с изначальной ценой.'},
{id:'survivor',n:'✈️ Ошибка выжившего',q:'Блогер: «Я бросил университет, начал бизнес и стал миллионером! Высшее образование бесполезно!» В чём ошибка?',
opts:[{t:'Мы видим только победителей. Тысячи бросивших разорились молча',ok:1},{t:'Ошибки нет — личный опыт лучшее доказательство',ok:0},{t:'Надо спросить, были ли у него богатые родители',ok:0}],
exp:'Провалы бросивших не видны — они не пишут посты. Судить только по выжившим — ошибка выжившего. Нужна статистика по всем случаям.'},
{id:'available',n:'? Эвристика доступности',q:'В новостях — две авиакатастрофы за месяц. Многие пересаживаются на поезда. Что не так с этим решением?',
opts:[{t:'Ничего, надо избегать любого риска',ok:0},{t:'Катастрофы легко вспомнить, но статистически самолёты всё равно безопаснее',ok:1},{t:'Поезда вообще не попадают в аварии',ok:0}],
exp:'Мозг оценивает вероятность по лёгкости, с которой примеры приходят в голову. Яркие новости искажают оценку: самолёты остаются самым безопасным транспортом.'},
{id:'sunk',n:'? Невозвратные затраты',q:'Вы заплатили 3000 ₽ за концерт. Через 30 минут ясно, что выступление ужасное. Ваши действия?',
opts:[{t:'Останусь до конца — я же заплатил',ok:0},{t:'Уйду: деньги уже не вернуть, нет смысла жертвовать ещё и временем',ok:1},{t:'Останусь, но буду жаловаться в соцсетях',ok:0}],
exp:'Деньги уже потрачены — вернуть их нельзя. Оставшись, вы платите ещё и временем, и настроением. Решение надо принимать о будущем, а не о прошлом.'},
{id:'confirm',n:'? Предвзятость подтверждения',q:'Вы верите, что диета X эффективна. Какие доказательства стоит учесть?',
opts:[{t:'Только отзывы похудевших на диете X',ok:0},{t:'И подтверждающие отзывы, и исследования с контрольными группами',ok:1},{t:'Только мнение знакомого диетолога',ok:0}],
exp:'Предвзятость подтверждения — искать только то, что поддерживает вашу веру. Надёжный вывод учитывает и подтверждающие, и опровергающие данные.'}
];
/* ═══ ТЕСТ «ПОЧЕМУ Я ПОВЕРИЛ» ═══ */
var HOOKS=[
{id:'h1',post:'? ШОК! Учёные выяснили, что от нас скрывают! Только сегодня — секретная методика… Успей поделиться, пока не удалили!',
q:'Какой крючок здесь самый сильный?',
opts:[{t:'Любопытство: «секретная методика»',ok:0},{t:'Страх + срочность: «ШОК», «только сегодня», «пока не удалили»',ok:1},{t:'Доверие к науке: «учёные выяснили»',ok:0}],
exp:'Главный крючок — страх и срочность. «ШОК» отключает критическое мышление, «только сегодня» заставляет решать наспех. Любопытство и наука — приманки второго порядка.'},
{id:'h2',post:'Все мои друзья уже зарабатывают по 300 тысяч в месяц из дома. Присоединяйся, осталось мало мест!',
q:'Что основное в этом посте?',
opts:[{t:'Стадность + жадность: «все уже зарабатывают», «300 тысяч»',ok:1},{t:'Забота о читателе',ok:0},{t:'Подробное описание способа',ok:0}],
exp:'Стадность («все друзья»), жадность (300 тысяч) и поддельный дефицит («мало мест») — классика пирамид. Описания способа нет — проверять нечего.'},
{id:'h3',post:'Если ты действительно любишь свою семью, ты защитишь её. Настоящий мужчина обеспечивает будущее. Запишись на консультацию.',
q:'На чём здесь играют?',
opts:[{t:'Логика и факты',ok:0},{t:'Вина и навязанный долг: «действительно любишь», «настоящий мужчина»',ok:1},{t:'Чувство юмора',ok:0}],
exp:'Крючок — вина и навязанный долг. Вместо фактов о продукте текст давит на «если не купишь — ты плохой семьянин». Это манипуляция, а не предложение.'}
];
var NAMES={gambler:'Ошибка игрока',anchor:'Якорение',survivor:'Ошибка выжившего',available:'Эвристика доступности',sunk:'Невозвратные затраты',confirm:'Предвзятость подтверждения',h1:'Страх + срочность',h2:'Стадность + жадность',h3:'Вина и долг'};
/* ═══ СТАТИСТИКА ═══ */
function recordStat(id,ok){var st=g('pr_cog',{played:0,ok:0,byType:{}});st.played++;if(ok)st.ok++;else st.byType[id]=(st.byType[id]||0)+1;s('pr_cog',st);}
function tryGrant(id,n,kind){
var key=kind+':'+id;
var done=g('pr_cog_done',{date:'',ids:{}});
var today=new Date().toDateString();
if(done.date!==today)done={date:today,ids:{}};
if(done.ids[key])return;
done.ids[key]=1;s('pr_cog_done',done);
grant(n);
}
/* ═══ СИНЕРГИЯ С ШЕРЛОКОМ ═══ */
function syncSherlock(){
var st=g('pr_cog',{played:0,ok:0});
if(!st.played)return;
var stats={'Текст':85,'Голос':45,'Фото':70,'Видео':60,'Соцсети':90,'Психология':75};
try{var sv=localStorage.getItem('pravdomer_stats');if(sv)stats=JSON.parse(sv)}catch(e){}
var acc=st.ok/st.played;
stats['Психология']=acc&gt;=0.8?85:acc&gt;=0.6?70:acc&gt;=0.4?55:40;
s('pravdomer_stats',stats);
}
/* ═══ КАЗИНО ═══ */
var cgI=0;
function renderCasino(){
var box=$('#cg-casino');
if(cgI&gt;=GAMES.length){
box.innerHTML='&lt;div style="text-align:center;padding:20px"&gt;&lt;div style="font-size:40px"&gt;?&lt;/div&gt;&lt;div style="font-size:15px;color:#f0d68a;font-weight:800;margin:8px 0"&gt;Казино пройдено!&lt;/div&gt;&lt;div style="font-size:12px;color:#a79ec9;margin-bottom:12px"&gt;Ловушки мышления больше не застанут тебя врасплох.&lt;/div&gt;&lt;button class="cg-next show" id="cg-restart"&gt;? Пройти ещё раз&lt;/button&gt;&lt;/div&gt;';
$('#cg-restart').addEventListener('click',function(){cgI=0;renderCasino();});
return;
}
var gm=GAMES[cgI];
var dots=GAMES.map(function(x,i){return '&lt;div class="cg-dot'+(i&lt;cgI?' done':i===cgI?' cur':'')+'"&gt;&lt;/div&gt;'}).join('');
box.innerHTML='&lt;div class="cg-dots"&gt;'+dots+'&lt;/div&gt;'+
'&lt;div class="cg-q"&gt;&lt;b&gt;'+gm.n+'&lt;/b&gt;&lt;br&gt;'+gm.q+'&lt;/div&gt;'+
'&lt;div class="cg-opts"&gt;'+gm.opts.map(function(o,i){return '&lt;button class="cg-opt" data-i="'+i+'"&gt;'+o.t+'&lt;/button&gt;'}).join('')+'&lt;/div&gt;'+
'&lt;div class="cg-exp" id="cg-exp"&gt;&lt;/div&gt;'+
'&lt;button class="cg-next" id="cg-next"&gt;Дальше →&lt;/button&gt;';
var okIdx=gm.opts.findIndex(function(o){return o.ok});
box.querySelectorAll('.cg-opt').forEach(function(b){
b.addEventListener('click',function(){
var i=+b.dataset.i,ok=gm.opts[i].ok;
box.querySelectorAll('.cg-opt').forEach(function(x){x.disabled=true});
b.classList.add(ok?'right':'wrong');
if(!ok)box.querySelectorAll('.cg-opt')[okIdx].classList.add('right');
var exp=$('#cg-exp');exp.innerHTML=(ok?'✅ Верно! ':'❌ Не угадал. ')+gm.exp;exp.classList.add('show');
$('#cg-next').classList.add('show');
recordStat(gm.id,ok);
if(ok)tryGrant(gm.id,3,'casino');
syncSherlock();
});
});
$('#cg-next').addEventListener('click',function(){cgI++;renderCasino();});
}
/* ═══ КРЮЧКИ ═══ */
var cgH=0;
function renderHooks(){
var box=$('#cg-hooks');
if(cgH&gt;=HOOKS.length){
box.innerHTML='&lt;div style="text-align:center;padding:20px"&gt;&lt;div style="font-size:40px"&gt;?&lt;/div&gt;&lt;div style="font-size:15px;color:#f0d68a;font-weight:800;margin:8px 0"&gt;Тест пройден!&lt;/div&gt;&lt;div style="font-size:12px;color:#a79ec9;margin-bottom:12px"&gt;Теперь ты видишь, на какие крючки тебя пытаются поймать.&lt;/div&gt;&lt;button class="cg-next show" id="ch-restart"&gt;? Пройти ещё раз&lt;/button&gt;&lt;/div&gt;';
$('#ch-restart').addEventListener('click',function(){cgH=0;renderHooks();});
return;
}
var hk=HOOKS[cgH];
var dots=HOOKS.map(function(x,i){return '&lt;div class="cg-dot'+(i&lt;cgH?' done':i===cgH?' cur':'')+'"&gt;&lt;/div&gt;'}).join('');
box.innerHTML='&lt;div class="cg-dots"&gt;'+dots+'&lt;/div&gt;'+
'&lt;div class="cg-post"&gt;'+hk.post+'&lt;/div&gt;'+
'&lt;div class="cg-q"&gt;'+hk.q+'&lt;/div&gt;'+
'&lt;div class="cg-opts"&gt;'+hk.opts.map(function(o,i){return '&lt;button class="cg-opt" data-i="'+i+'"&gt;'+o.t+'&lt;/button&gt;'}).join('')+'&lt;/div&gt;'+
'&lt;div class="cg-exp" id="ch-exp"&gt;&lt;/div&gt;'+
'&lt;button class="cg-next" id="ch-next"&gt;Дальше →&lt;/button&gt;';
var okIdx=hk.opts.findIndex(function(o){return o.ok});
box.querySelectorAll('.cg-opt').forEach(function(b){
b.addEventListener('click',function(){
var i=+b.dataset.i,ok=hk.opts[i].ok;
box.querySelectorAll('.cg-opt').forEach(function(x){x.disabled=true});
b.classList.add(ok?'right':'wrong');
if(!ok)box.querySelectorAll('.cg-opt')[okIdx].classList.add('right');
var exp=$('#ch-exp');exp.innerHTML=(ok?'✅ Верно! ':'❌ Не угадал. ')+hk.exp;exp.classList.add('show');
$('#ch-next').classList.add('show');
recordStat(hk.id,ok);
if(ok)tryGrant(hk.id,2,'hook');
syncSherlock();
});
});
$('#ch-next').addEventListener('click',function(){cgH++;renderHooks();});
}
/* ═══ МОИ ИСКАЖЕНИЯ ═══ */
function renderMe(){
var st=g('pr_cog',{played:0,ok:0,byType:{}});
var acc=st.played?Math.round(st.ok/st.played*100):0;
var rows=Object.keys(st.byType).map(function(k){return '&lt;div class="cg-row"&gt;&lt;span&gt;'+(NAMES[k]||k)+'&lt;/span&gt;&lt;b&gt;'+st.byType[k]+' промах(а)&lt;/b&gt;&lt;/div&gt;'}).join('');
$('#cg-me').innerHTML='&lt;div class="cg-row"&gt;&lt;span&gt;Сыграно сценариев&lt;/span&gt;&lt;b&gt;'+st.played+'&lt;/b&gt;&lt;/div&gt;'+
'&lt;div class="cg-row"&gt;&lt;span&gt;Верных ответов&lt;/span&gt;&lt;b&gt;'+st.ok+'&lt;/b&gt;&lt;/div&gt;'+
'&lt;div class="cg-row"&gt;&lt;span&gt;Точность&lt;/span&gt;&lt;b&gt;'+acc+'%&lt;/b&gt;&lt;/div&gt;'+
(rows?'&lt;div style="font-size:12px;color:#a79ec9;margin:10px 0 6px"&gt;Слабые места (промахи по типам):&lt;/div&gt;'+rows:'&lt;div style="font-size:12px;color:#a79ec9;margin-top:10px"&gt;Промахов пока нет. Сыграй в казино мышления!&lt;/div&gt;')+
'&lt;div style="font-size:11px;color:#8a84a8;margin-top:12px;line-height:1.5"&gt;?️ Синергия с Шерлоком: твоя точность отражается на радаре в «Психологии». Чем больше промахов — тем ниже балл, и Шерлок укажет на это как на слепую зону.&lt;/div&gt;';
}
/* ═══ ТАБЫ ═══ */
document.querySelectorAll('.cg-tab').forEach(function(t){
t.addEventListener('click',function(){
document.querySelectorAll('.cg-tab').forEach(function(x){x.classList.remove('on')});
t.classList.add('on');
document.querySelectorAll('.cg-pane').forEach(function(x){x.classList.remove('on')});
$('#cg-p-'+t.dataset.p).classList.add('on');
if(t.dataset.p==='me')renderMe();
});
});
/* ═══ ОТКРЫТИЕ ═══ */
$('#cg-btn').addEventListener('click',function(){$('#cg-mask').classList.add('open');renderCasino();renderHooks();});
$('#cg-close').addEventListener('click',function(){$('#cg-mask').classList.remove('open')});
$('#cg-mask').addEventListener('click',function(e){if(e.target===this)this.classList.remove('open')});
/* ═══ ДУБЛИРОВАНИЕ: САЙДБАР + ХАБ + НАВИГАЦИЯ ═══ */
var nav=$('#pd-nav');
if(nav&amp;&amp;!nav.querySelector('[data-id="cog"]')){
var b=document.createElement('button');b.className='pd-item';b.setAttribute('data-id','cog');
b.innerHTML='&lt;i style="font-style:normal;width:20px;text-align:center"&gt;?&lt;/i&gt;&lt;span&gt;Мои искажения&lt;/span&gt;';
b.addEventListener('click',function(){$('#cg-mask').classList.add('open');if(window.innerWidth&lt;1000){var sb=$('#pd-sidebar');if(sb)sb.classList.remove('open')}});
nav.appendChild(b);
}
var hub=$('#pd-hub-grid');
if(hub&amp;&amp;!hub.querySelector('[data-id="cog"]')){
var h=document.createElement('div');h.className='pd-hitem';h.setAttribute('data-id','cog');
h.innerHTML='&lt;i style="font-size:24px;font-style:normal"&gt;?&lt;/i&gt;&lt;span&gt;Мои искажения&lt;/span&gt;';
h.addEventListener('click',function(){$('#cg-mask').classList.add('open')});
hub.appendChild(h);
}
var chips=$('#chips');
if(chips&amp;&amp;!chips.querySelector('[data-t="cog"]')){
var c=document.createElement('button');c.textContent='? Искажения';c.setAttribute('data-t','cog');
c.addEventListener('click',function(){$('#cg-mask').classList.add('open')});
chips.appendChild(c);
}
console.log('? Правдомер: Вариант 2 · Когнитивные искажения подключены');
})();
&lt;/script&gt;

&lt;style&gt;
#mr-btn{position:fixed;left:16px;bottom:560px;z-index:400;width:52px;height:52px;border-radius:50%;border:none;cursor:pointer;background:linear-gradient(135deg,#06B6D4,#10B981);color:#fff;font-size:22px;box-shadow:0 6px 20px rgba(6,182,212,.45);transition:transform .2s}
#mr-btn:hover{transform:scale(1.1)}
#mr-mask{position:fixed;inset:0;z-index:428;display:none;align-items:center;justify-content:center;background:rgba(5,10,18,.9);backdrop-filter:blur(6px)}
#mr-mask.open{display:flex}
#mr-card{width:min(560px,94vw);max-height:90vh;overflow-y:auto;border-radius:18px;padding:22px;color:#e8f0ee;background:linear-gradient(180deg,#06130f,#0a141c);border:1px solid rgba(6,182,212,.4);box-shadow:0 30px 60px rgba(0,0,0,.6)}
#mr-card h3{margin:0 0 4px;font-size:20px;color:#6ee7b7}
.mr-sub{font-size:12px;color:#7f96b8;margin-bottom:14px}
.mr-q{background:rgba(6,182,212,.06);border:1px solid rgba(6,182,212,.25);border-radius:12px;padding:14px;margin-bottom:12px}
.mr-qt{font-size:14px;font-weight:700;color:#6ee7b7;margin-bottom:10px}
.mr-btns{display:flex;gap:8px}
.mr-btns button{flex:1;padding:10px;border-radius:10px;border:1px solid rgba(6,182,212,.4);background:none;color:#6ee7b7;font-weight:700;font-size:13px;cursor:pointer}
.mr-btns button.on{background:linear-gradient(135deg,#06B6D4,#10B981);color:#fff;border-color:transparent}
.mr-res{margin-top:14px;padding:14px;border-radius:12px;border:1px solid rgba(6,182,212,.4);background:rgba(6,182,212,.06);font-size:13px;line-height:1.6;color:#cfe0f7;display:none}
.mr-res b{color:#6ee7b7}
.mr-note{font-size:11px;color:#5d8477;margin-top:10px}
#mr-close{margin-top:14px;width:100%;border:1px solid rgba(6,182,212,.4);background:none;color:#6ee7b7;border-radius:10px;padding:10px;cursor:pointer;font-size:13px}
&lt;/style&gt;
&lt;button id="mr-btn" title="Зеркало правды"&gt;?&lt;/button&gt;
&lt;div id="mr-mask"&gt;&lt;div id="mr-card"&gt;
&lt;h3&gt;? Зеркало правды&lt;/h3&gt;
&lt;div class="mr-sub"&gt;Ответь честно — только ты знаешь правду. Это не вердикт, а зеркало для саморефлексии.&lt;/div&gt;
&lt;div id="mr-body"&gt;&lt;/div&gt;
&lt;button id="mr-close"&gt;Закрыть&lt;/button&gt;
&lt;/div&gt;&lt;/div&gt;
&lt;script&gt;
(function(){
"use strict";
if(window._prSanitizer)return;window._prSanitizer=1;
var $=function(s){return document.querySelector(s)};
function g(k,d){try{var v=localStorage.getItem(k);return v==null?d:JSON.parse(v)}catch(e){return d}}
function s(k,v){try{localStorage.setItem(k,JSON.stringify(v))}catch(e){}}
/* ═══ 1. УНИФИКАЦИЯ window.PR (единый источник — pr_profile) ═══ */
var LEVELS=[[0,'?','Новичок'],[50,'?️','Наблюдатель'],[150,'?','Аналитик'],[300,'?️','Профайлер'],[600,'?','Мастер правды']];
function lvlOf(pr){var c=LEVELS[0];for(var i=0;i&lt;LEVELS.length;i++)if(pr&gt;=LEVELS[i][0])c=LEVELS[i];return c}
function nextOf(pr){for(var i=0;i&lt;LEVELS.length;i++)if(LEVELS[i][0]&gt;pr)return LEVELS[i];return null}
function todayStr(){return new Date().toDateString()}
var P=g('pr_profile',{pr:0,streak:0,last:'',lvl:1});
function touchStreak(){
var st=g('pr_streak',{d:0,last:''}),t=todayStr();
if(st.last===t)return;
var y=new Date(Date.now()-864e5).toDateString();
st.d=(st.last===y)?st.d+1:1;st.last=t;s('pr_streak',st);
}
function checkAchs(){
var ACH=[
{id:'first',c:function(x){return x.a&gt;=1}},
{id:'ten',c:function(x){return x.a&gt;=10}},
{id:'scam',c:function(x){return x.scam&gt;=1}},
{id:'manip',c:function(x){return x.manip&gt;=1}},
{id:'truth',c:function(x){return x.clean&gt;=1}},
{id:'alb5',c:function(x){return x.al&gt;=5}},
{id:'sk3',c:function(x){return x.sk&gt;=3}},
{id:'sk7',c:function(x){return x.sk&gt;=7}},
{id:'pr100',c:function(x){return x.pr&gt;=100}}];
var st=g('pr_stats',{a:0,scam:0,manip:0,clean:0});
var al=g('pr_album',[]);
var sk=g('pr_streak',{d:0});
var x={a:st.a,scam:st.scam,manip:st.manip,clean:st.clean,al:al.length,sk:sk.d,pr:P.pr};
var got=g('pr_achs',{});
ACH.forEach(function(a){if(!got[a.id]&amp;&amp;a.c(x))got[a.id]=Date.now()});
s('pr_achs',got);
}
function updUI(){
var lv=lvlOf(P.pr),nx=nextOf(P.pr);
var e1=$('#hPr');if(e1)e1.textContent='? '+P.pr+' PR';
var pn=$('#gc-pr-num');if(pn)pn.textContent=P.pr;
var ln=$('#gc-lv-num');if(ln)ln.textContent=lv[1];
var ln2=$('#gc-lv-name');if(ln2)ln2.textContent=lv[2];
var ml=$('#gc-m-pr');if(ml)ml.textContent=P.pr;
var mlv=$('#gc-m-lv');if(mlv)mlv.textContent=lv[2];
var bar=$('#gc-lv-bar');if(bar)bar.style.width=(nx?Math.round((P.pr-lv[0])/(nx[0]-lv[0])*100):100)+'%';
var st=g('pr_streak',{d:0});
var ms=$('#gc-m-streak');if(ms)ms.textContent=st.d;
var mt=$('#gc-m-total');if(mt)mt.textContent=g('pr_stats',{a:0}).a;
}
window.PR={
get:function(){return P},
add:function(n){
P.pr+=n;P.lvl=1+Math.floor(P.pr/100);
touchStreak();
s('pr_profile',P);
checkAchs();
updUI();
}
};
updUI();
/* ═══ 2. СКРЫТИЕ ДУБЛЕЙ-ФАБОВ (секции уже в ленте) ═══ */
['#cs-btn','#vd-fab'].forEach(function(sel){var el=$(sel);if(el)el.style.display='none';});
/* удаляем мёртвый второй #rb-btn (дубль по id) */
var rbAll=document.querySelectorAll('#rb-btn');
if(rbAll.length&gt;1){for(var i=1;i&lt;rbAll.length;i++)rbAll[i].style.display='none';}
/* ═══ 3. ЗЕРКАЛО ПРАВДЫ (восстановление под #mr) ═══ */
var MRQ=[
'Я говорю правду о том, что сейчас происходит в моей жизни.',
'Я честен с тем, кого люблю больше всего.',
'Я говорю правду о своих деньгах.',
'Я говорю правду о своём здоровье.',
'Я говорю правду о том, что чувствую.',
'Я говорю правду о том, что хочу.'];
var mrAns={};
function mrRender(){
var body=$('#mr-body');if(!body)return;
var saved=g('mr_answers',{});
body.innerHTML=MRQ.map(function(q,i){
var a=saved[i];
return '&lt;div class="mr-q"&gt;&lt;div class="mr-qt"&gt;'+(i+1)+'. '+q+'&lt;/div&gt;'+
'&lt;div class="mr-btns"&gt;'+
'&lt;button data-i="'+i+'" data-v="1"'+(a===1?' class="on"':'')+'&gt;Правда&lt;/button&gt;'+
'&lt;button data-i="'+i+'" data-v="0"'+(a===0?' class="on"':'')+'&gt;Не вся правда&lt;/button&gt;'+
'&lt;/div&gt;&lt;/div&gt;';
}).join('')+'&lt;div class="mr-res" id="mr-res"&gt;&lt;/div&gt;';
body.querySelectorAll('button').forEach(function(b){
b.addEventListener('click',function(){
var i=+b.dataset.i,v=+b.dataset.v;
var saved2=g('mr_answers',{});saved2[i]=v;s('mr_answers',saved2);
mrRender();mrResult();
});
});
mrResult();
}
function mrResult(){
var saved=g('mr_answers',{});
var keys=Object.keys(saved);
if(keys.length&lt;MRQ.length)return;
var honest=0;keys.forEach(function(k){if(saved[k]===1)honest++});
var pct=Math.round(honest/MRQ.length*100);
var res=$('#mr-res');if(!res)return;
res.style.display='block';
var msg=pct&gt;=80?'Ты почти всегда говоришь правду. Это сила.':
pct&gt;=50?'Ты часто говоришь правду, но иногда прячешь важное.':'Ты часто прячешь правду. Это сигнал — пора поговорить с собой.';
res.innerHTML='&lt;b&gt;Твой результат: '+honest+' из '+MRQ.length+' ('+pct+'%)&lt;/b&gt;&lt;br&gt;'+msg+
'&lt;div class="mr-note"&gt;Это не вердикт. Это зеркало. Только ты знаешь правду.&lt;/div&gt;';
}
$('#mr-btn').addEventListener('click',function(){mrRender();$('#mr-mask').classList.add('open');});
$('#mr-close').addEventListener('click',function(){$('#mr-mask').classList.remove('open');});
$('#mr-mask').addEventListener('click',function(e){if(e.target===this)this.classList.remove('open');});
/* ═══ 4. ПОЛНАЯ СВЕРКА (перезапись #pda-check) ═══ */
var FULL=[
['hero','? Дело дня',0],['#text','? Текст-детектор','_prTextDone'],['#voice','? Голос-детектор','_prVoiceDone'],
['#video','? Видео-детектор','_prVideoVip'],['#photo','? Фото-детектор','_prPhotoCall'],['#call','? Звонок-детектор','_prPhotoCall'],
['#sim','? Псих-симулятор','_prSimDone'],['#social','? Соц-детектор','_prSocialDone'],['#cases','? Библиотека дел','_prCasesDone'],
['#fusion','⚗️ Фьюжн','_prFusion'],['#duel','⚔️ Дуэль','_prDuelApi'],['#api','? API','_prDuelApi'],['#vip','? ВИП','_prVideoVip'],
['#gc-mask','? Кабинет детектива','_prGameDone'],['#modeMask','? Режимы','_prModeDone'],['#p12-btn','? Паспорт','_prFinal'],
['#rb-btn','? Реальный детектор (Ветка B)','_rbDone'],['#mr-btn','? Зеркало правды (Ветка B)','_prSanitizer'],
['#pg-btn','⚖️ Полиграф (Ветка C)','_pgDone'],['#lz-btn','? Лжец (Ветка D)','_lzDone'],
['#sherlock-fab','?️ Шерлок + Дашборд',0],['#pd-sidebar','? Сайдбар + Хаб','_pdFinal']];
function isOk(c){
var el=document.getElementById(String(c[0]).replace('#',''));
if(!el&amp;&amp;String(c[0]).indexOf('#')!==0)el=document.getElementById(c[0]);
if(!el)el=$(c[0]);
var fl=!c[2]||window[c[2]];
return !!(el&amp;&amp;fl);
}
(function(){
var box=$('#pda-check');if(!box)return;
var ok=0,rows='';
FULL.forEach(function(c){var on=isOk(c);if(on)ok++;
rows+='&lt;div style="display:flex;justify-content:space-between;font-size:12px;color:#cfc8e8;padding:6px 10px;border-radius:8px;background:rgba(139,92,246,.06);margin-bottom:6px"&gt;&lt;span&gt;'+c[1]+'&lt;/span&gt;&lt;span style="color:'+(on?'#6ee7b7':'#fca5a5')+';font-weight:700"&gt;'+(on?'✓':'✗')+'&lt;/span&gt;&lt;/div&gt;';});
box.innerHTML='&lt;div style="font-size:13px;font-weight:700;color:#c4b5fd;margin-bottom:8px"&gt;Полная сверка: '+ok+' из '+FULL.length+' модулей&lt;/div&gt;'+rows;
})();
/* ═══ 5. ПУНКТЫ В САЙДБАР И ХАБ ═══ */
var NEWITEMS=[
['?','Зеркало правды','mr-btn'],['?','Реальный детектор','rb-btn'],
['⚖️','Полиграф','pg-btn'],['?','Лжец','lz-btn'],['?️','Шерлок','sherlock-fab']];
function addItem(nav,item){
if(nav.querySelector('[data-fab="'+item[2]+'"]'))return;
var b=document.createElement('button');b.className='pd-item';b.setAttribute('data-fab',item[2]);
b.innerHTML='&lt;i style="font-style:normal;width:20px;text-align:center"&gt;'+item[0]+'&lt;/i&gt;&lt;span&gt;'+item[1]+'&lt;/span&gt;';
b.addEventListener('click',function(){var f=document.getElementById(item[2]);if(f)f.click();});
nav.appendChild(b);
}
var nav=$('#pd-nav');if(nav)NEWITEMS.forEach(function(it){addItem(nav,it)});
var hub=$('#pd-hub-grid');if(hub)NEWITEMS.forEach(function(it){
if(hub.querySelector('[data-fab="'+it[2]+'"]'))return;
var h=document.createElement('div');h.className='pd-hitem';h.setAttribute('data-fab',it[2]);
h.innerHTML='&lt;i style="font-size:24px;font-style:normal"&gt;'+it[0]+'&lt;/i&gt;&lt;span&gt;'+it[1]+'&lt;/span&gt;';
h.addEventListener('click',function(){$('#pd-hub-mask').classList.remove('open');var f=document.getElementById(it[2]);if(f)f.click();});
hub.appendChild(h);
});
console.log('? Правдомер: Блок 13 · Санитар подключён');
})();
&lt;/script&gt;

&lt;style&gt;
#bc-btn{position:fixed;left:16px;bottom:470px;z-index:130;width:52px;height:52px;border-radius:50%;border:none;cursor:pointer;background:linear-gradient(135deg,#EF4444,#F59E0B);color:#fff;font-size:22px;box-shadow:0 6px 20px rgba(239,68,68,.45);transition:transform .2s}
#bc-btn:hover{transform:scale(1.1)}
#bc-mask{position:fixed;inset:0;z-index:423;display:none;align-items:center;justify-content:center;background:rgba(8,5,15,.88);backdrop-filter:blur(6px)}
#bc-mask.open{display:flex}
#bc-card{width:min(680px,94vw);max-height:90vh;overflow-y:auto;border-radius:18px;padding:22px;color:#efe9dc;background:linear-gradient(180deg,#1a0d14,#0d0a14);border:1px solid rgba(239,68,68,.4);font-family:Inter,system-ui,sans-serif;box-shadow:0 30px 60px rgba(0,0,0,.6)}
#bc-card h3{margin:0 0 4px;font-size:20px;color:#fca5a5}
.bc-sub{font-size:12px;color:#a79ec9;margin-bottom:14px;line-height:1.5}
.bc-lens{display:flex;gap:8px;flex-wrap:wrap;margin-bottom:14px}
.bc-scen{flex:1;min-width:150px;padding:10px;border-radius:12px;border:1px solid rgba(239,68,68,.35);background:rgba(239,68,68,.08);color:#fca5a5;font-weight:700;font-size:12px;cursor:pointer;text-align:center}
.bc-scen.on{background:linear-gradient(135deg,#EF4444,#F59E0B);color:#fff;border-color:transparent}
.bc-bub{max-width:88%;padding:11px 14px;border-radius:14px 14px 14px 4px;font-size:13px;margin:8px 0;line-height:1.6;background:rgba(239,68,68,.12);border:1px solid rgba(239,68,68,.35);color:#fca5a5}
.bc-bub .who{font-size:10px;color:#ef4444;font-weight:800;text-transform:uppercase;letter-spacing:.5px;margin-bottom:4px;display:block}
.bc-me{max-width:88%;padding:11px 14px;border-radius:14px 14px 4px 14px;font-size:13px;margin:8px 0;line-height:1.6;background:rgba(212,175,55,.12);border:1px solid rgba(212,175,55,.3);color:#f0d68a;margin-left:auto;text-align:right}
.bc-note{font-size:11px;color:#a79ec9;margin:4px 0 10px;line-height:1.5}
.bc-say{width:100%;text-align:left;padding:11px 12px;border-radius:12px;border:1px solid rgba(255,255,255,.15);background:rgba(255,255,255,.04);color:#cfc8e8;font-size:12px;cursor:pointer;margin:5px 0;transition:.2s}
.bc-say:hover{border-color:#F59E0B;background:rgba(245,158,11,.08)}
.bc-score{display:flex;align-items:center;gap:14px;background:rgba(239,68,68,.08);border:1px solid rgba(239,68,68,.3);border-radius:14px;padding:14px;margin:12px 0}
.bc-score b{font-size:34px;color:#fca5a5}
.bc-bar{flex:1;height:10px;background:rgba(255,255,255,.1);border-radius:99px;overflow:hidden;margin-top:8px}
.bc-bar i{display:block;height:100%;border-radius:99px;background:linear-gradient(90deg,#EF4444,#F59E0B)}
.bc-flag{display:flex;gap:10px;align-items:flex-start;font-size:12px;color:#cfc8e8;background:rgba(255,255,255,.04);border:1px solid rgba(255,255,255,.08);border-radius:10px;padding:8px 10px;margin:5px 0}
.bc-flag b{color:#fca5a5}
.bc-close{margin-top:14px;width:100%;border:1px solid rgba(239,68,68,.4);background:none;color:#fca5a5;border-radius:10px;padding:10px;cursor:pointer;font-size:13px}
&lt;/style&gt;
&lt;button id="bc-btn" title="Звонок от босса"&gt;?&lt;/button&gt;
&lt;div id="bc-mask"&gt;&lt;div id="bc-card"&gt;
&lt;h3&gt;? Звонок от босса&lt;/h3&gt;
&lt;div class="bc-sub"&gt;Мошенники всё чаще подделывают голос руководителя (дипфейк) и звонят «от его имени». Пройди сценарий и не попадись. Верный ответ +17, ошибка −17.&lt;/div&gt;
&lt;div class="bc-lens" id="bc-lens"&gt;&lt;/div&gt;
&lt;button class="btn" id="bc-start"&gt;▶ Начать звонок&lt;/button&gt;
&lt;div id="bc-box" style="margin-top:10px"&gt;&lt;/div&gt;
&lt;button class="bc-close" id="bc-close"&gt;Закрыть&lt;/button&gt;
&lt;/div&gt;&lt;/div&gt;
&lt;script&gt;
(function(){
"use strict";
if(window._prBossCall)return;window._prBossCall=1;
var $=function(s){return document.querySelector(s)};
function g(k,d){try{var v=localStorage.getItem(k);return v==null?d:JSON.parse(v)}catch(e){return d}}
function s(k,v){try{localStorage.setItem(k,JSON.stringify(v))}catch(e){}}
function coach(t){var c=$('#coach');if(!c)return;$('#coachText').textContent=t;c.style.display='block';clearTimeout(window._prCt);window._prCt=setTimeout(function(){c.style.display='none'},6500);}
function grant(n){var P=g('pr_profile',{pr:0,streak:0,last:'',lvl:1});P.pr+=n;P.lvl=1+Math.floor(P.pr/100);s('pr_profile',P);var e=$('#hPr');if(e)e.textContent='⭐ '+P.pr+' PR';
var st=g('pr_streak',{d:0,last:''}),t=new Date().toDateString();if(st.last!==t){var y=new Date(Date.now()-864e5).toDateString();st.d=(st.last===y)?st.d+1:1;st.last=t;s('pr_streak',st);var e2=$('#hStreak');if(e2)e2.textContent='? '+st.d;}}
var CALLS=[
{id:'boss',ic:'?',t:'«Директор»',steps:[
{l:'Здравствуйте! Это Игорь Петрович, директор. Слушай внимательно и не паникуй. Счёт компании блокируют, нужно срочно перевести деньги на резервный счёт. Только никому не говори, это коммерческая тайна.',c:[
{t:'Перезвоню вам на известный мне номер и уточню.',good:1,w:'Всегда проверяй обратным звонком на известный номер.'},
{t:'Ой, что делать? Говорите скорее!',good:0,w:'Срочность + секретность — главные крючки мошенника.'}]},
{l:'Некогда перезванивать! Сейчас регулятор заберёт деньги. Дай код из СМС, я всё спасу.',c:[
{t:'Код из СМС никому не называю. Я завершаю разговор.',good:1,w:'Код — последняя граница. Её не сдают никому.'},
{t:'Сейчас, секундочку, смотрю СМС…',good:0,w:'Назвать код = подписать себе приговор.'}]},
{l:'Если не сделаешь сейчас, компания потеряет всё! Я фиксирую этот разговор, будут проблемы!',c:[
{t:'Срочность + секретность + угроза = мошенник. Кладу трубку.',good:1,w:'Давление и запугивание — классика. Проверка по известному номеру.'},
{t:'Хорошо-хорошо, не ругайтесь, всё сделаю!',good:0,w:'Подчинение из страха — именно то, что нужно мошеннику.'}]}]},
{id:'deepfake',ic:'?',t:'Дипфейк-голос',steps:[
{l:'(Голос похож на директора, но звучит слегка «металлически», с неестественными паузами.) Это я, директор. Срочно переведи 500 тысяч новому поставщику. Не задавай вопросов.',c:[
{t:'Голос звучит неестественно. Перезвоню на известный номер.',good:1,w:'«Металлический» тембр и неестественные паузы — признаки дипфейка.'},
{t:'Хорошо, сейчас оформлю перевод.',good:0,w:'Дипфейк-голос легко подделать. Всегда проверяй голосом по известному номеру.'}]},
{l:'Не доверяешь мне? Это секретная операция, никому не говори. Дай код подтверждения.',c:[
{t:'Коды никому не даю. До свидания.',good:1,w:'Код — последняя граница. Секретность — красный флаг.'},
{t:'Сейчас посмотрю код…',good:0,w:'Мошенник давит на секретность, чтобы ты не проверил.'}]},
{l:'Ты ставишь под сомнение моё решение? Будут проблемы на работе!',c:[
{t:'Угрозы и давление — признак мошенника. Звоню директору сам.',good:1,w:'Дипфейк выдаёт себя давлением. Проверка по известному номеру.'},
{t:'Нет-нет, я верю, делаю…',good:0,w:'Подчинение из страха — цель мошенника.'}]}]},
{id:'fsb',ic:'?',t:'«ФСБ / банк»',steps:[
{l:'Это майор Сидоров, ФСБ. Ваш счёт взломан, деньги крадут. Нужно срочно перевести их на «безопасный счёт».',c:[
{t:'ФСБ не проводит операции по телефону. Кладу трубку.',good:1,w:'Спецслужбы не звонят с требованием перевести деньги.'},
{t:'Ой, помогите, что делать?!',good:0,w:'Запугивание авторитетом — приём мошенника.'}]},
{l:'Никому не говорите, это секрет. Назовите код из СМС.',c:[
{t:'Код никому не называю. Завершаю разговор.',good:1,w:'Код — последняя граница.'},
{t:'Сейчас посмотрю в СМС…',good:0,w:'Мошенник выманивает код.'}]},
{l:'Если откажетесь, будет уголовная ответственность!',c:[
{t:'Запугивание ответственностью — приём мошенника. Звоню в банк сам.',good:1,w:'Проверка по официальному номеру банка.'},
{t:'Хорошо, делаю всё, что скажете…',good:0,w:'Подчинение из страха — цель мошенника.'}]}]}];
var cur=null,ci=0,score=0;
var lens=$('#bc-lens');
lens.innerHTML=CALLS.map(function(c,i){return '&lt;button class="bc-scen'+(i===0?' on':'')+'" data-i="'+i+'"&gt;'+c.ic+' '+c.t+'&lt;/button&gt;'}).join('');
lens.querySelectorAll('.bc-scen').forEach(function(b){b.addEventListener('click',function(){lens.querySelectorAll('.bc-scen').forEach(function(x){x.classList.remove('on')});b.classList.add('on');cur=CALLS[+b.dataset.i];});});
cur=CALLS[0];
$('#bc-start').addEventListener('click',function(){ci=0;score=50;$('#bc-box').innerHTML='';step();});
function step(){
if(!cur)return;
if(ci&gt;=cur.steps.length){finish();return}
var st=cur.steps[ci],box=$('#bc-box');
var b=document.createElement('div');b.className='bc-bub';b.innerHTML='&lt;span class="who"&gt;? '+cur.t+'&lt;/span&gt;'+st.l;box.appendChild(b);
st.c.forEach(function(ch){
var btn=document.createElement('button');btn.className='bc-say';btn.textContent=ch.t;
btn.addEventListener('click',function(){
Array.prototype.slice.call(box.querySelectorAll('.bc-say')).forEach(function(x){x.remove()});
var me=document.createElement('div');me.className='bc-me';me.textContent=ch.t;box.appendChild(me);
var nt=document.createElement('div');nt.className='bc-note';nt.textContent=(ch.good?'✅ ':'⚠️ ')+ch.w;box.appendChild(nt);
score+=ch.good?17:-17;ci++;setTimeout(step,600);
});
box.appendChild(btn);});
box.scrollTop=box.scrollHeight;
}
function finish(){
var v=score&gt;=70?'Не поддался! Это был мошенник.':score&gt;=40?'Частично повёлся — смотри разбор.':'Схема сработала — хорошо, что в игре.';
var pr=score&gt;=70?5:score&gt;=40?3:2;
var box=$('#bc-box');
var d=document.createElement('div');d.className='bc-score';
d.innerHTML='&lt;b&gt;'+Math.max(0,Math.min(100,score))+'&lt;/b&gt;&lt;div style="flex:1"&gt;&lt;div style="font-size:12px;color:#a79ec9"&gt;'+v+' Устойчивость. +'+pr+' PR&lt;/div&gt;&lt;div class="bc-bar"&gt;&lt;i style="width:'+Math.max(0,Math.min(100,score))+'%"&gt;&lt;/i&gt;&lt;/div&gt;&lt;/div&gt;';
box.appendChild(d);
var flags=cur.id==='deepfake'?['? «Металлический» тембр, неестественные паузы — признаки дипфейка','? Запрос кода из СМС','? Требование секретности','⚠️ Давление и угрозы']
:cur.id==='fsb'?['? Звонят «из ФСБ/банка» с требованием перевода','? Запрос кода из СМС','⚠️ Запугивание ответственностью','? «Безопасный счёт» — всегда обман']
:['? Звонят «от директора»','? Запрос кода из СМС','? «Никому не говори»','⚠️ Срочность и угрозы'];
flags.forEach(function(f){var el=document.createElement('div');el.className='bc-flag';el.innerHTML='&lt;b&gt;?&lt;/b&gt; '+f;box.appendChild(el);});
var tip=document.createElement('div');tip.className='bc-flag';tip.innerHTML='&lt;b&gt;?&lt;/b&gt; Главное правило: положил трубку → перезвонил по известному номеру. Так проверяют любой «срочный» звонок.';
box.appendChild(tip);
grant(pr);
var h=g('pr_boss',[]);h.unshift({t:Date.now(),id:cur.id,s:score});s('pr_boss',h.slice(0,6));
coach('? '+v+' +'+pr+' PR');
}
$('#bc-btn').addEventListener('click',function(){$('#bc-mask').classList.add('open');ci=0;score=50;$('#bc-box').innerHTML='';});
$('#bc-close').addEventListener('click',function(){$('#bc-mask').classList.remove('open')});
$('#bc-mask').addEventListener('click',function(e){if(e.target===this)this.classList.remove('open')});
/* дублируем в сайдбар и хаб (правило «и там, и там») */
var nav=$('#pd-nav');if(nav&amp;&amp;!nav.querySelector('[data-id="bc"]')){var b=document.createElement('button');b.className='pd-item';b.dataset.id='bc';b.innerHTML='&lt;i class="fas fa-phone-volume"&gt;&lt;/i&gt;&lt;span&gt;Звонок от босса&lt;/span&gt;';b.addEventListener('click',function(){$('#bc-mask').classList.add('open')});nav.appendChild(b);}
var hub=$('#pd-hub-grid');if(hub&amp;&amp;!hub.querySelector('[data-id="bc"]')){var h=document.createElement('div');h.className='pd-hitem';h.dataset.id='bc';h.innerHTML='&lt;i class="fas fa-phone-volume"&gt;&lt;/i&gt;&lt;span&gt;Звонок от босса&lt;/span&gt;';h.addEventListener('click',function(){$('#bc-mask').classList.add('open')});hub.appendChild(h);}
console.log('? Правдомер: Ветка B · Тренажёр «Звонок от босса» подключён');
})();
&lt;/script&gt;

&lt;style&gt;
#osint-btn{position:fixed;left:16px;bottom:24px;z-index:400;width:52px;height:52px;border-radius:50%;border:none;cursor:pointer;background:linear-gradient(135deg,#06B6D4,#8B5CF6);color:#fff;font-size:22px;box-shadow:0 6px 20px rgba(6,182,212,.45);transition:transform .2s}
#osint-btn:hover{transform:scale(1.1)}
.os-tabs{display:flex;gap:8px;margin:6px 0 12px;flex-wrap:wrap}
.os-tab{padding:9px 16px;border-radius:999px;border:1px solid var(--line);background:var(--card);color:var(--mut);font-weight:700;font-size:13px;cursor:pointer}
.os-tab.on{background:linear-gradient(135deg,var(--violet),var(--gold));color:#fff;border-color:transparent}
.os-pane{display:none}.os-pane.on{display:block}
.os-step{display:flex;gap:12px;align-items:flex-start;background:rgba(139,92,246,.06);border:1px solid rgba(139,92,246,.2);border-radius:12px;padding:12px;margin:8px 0}
.os-step .n{width:34px;height:34px;border-radius:50%;background:linear-gradient(135deg,var(--violet),var(--gold));color:#fff;display:flex;align-items:center;justify-content:center;font-weight:800;flex-shrink:0}
.os-step b{color:#f0d68a}
.os-step p{font-size:12px;color:#cfc8e8;margin-top:2px;line-height:1.5}
.os-q{background:rgba(255,255,255,.04);border:1px solid var(--line);border-radius:12px;padding:14px;margin:10px 0}
.os-q .qt{font-size:13px;color:#e8dcc8;margin-bottom:8px;line-height:1.5}
.os-opt{display:block;width:100%;text-align:left;padding:9px 12px;border-radius:10px;border:1px solid rgba(255,255,255,.12);background:rgba(255,255,255,.03);color:#cfc8e8;font-size:12px;cursor:pointer;margin:5px 0}
.os-opt:hover{border-color:var(--gold)}
.os-opt.right{background:rgba(16,185,129,.12);border-color:#10B981;color:#a7f3d0}
.os-opt.wrong{background:rgba(239,68,68,.12);border-color:#EF4444;color:#fecaca}
.os-fb{font-size:12px;color:#d9d2ea;background:rgba(212,175,55,.07);border-left:3px solid var(--gold);padding:8px 10px;border-radius:0 8px 8px 0;margin-top:8px;display:none;line-height:1.5}
.os-cv{width:100%;border-radius:12px;border:1px solid var(--line);background:#0a0818;margin:8px 0;display:block}
.os-node-info{background:rgba(139,92,246,.08);border:1px solid rgba(139,92,246,.3);border-radius:12px;padding:12px;margin:10px 0;font-size:12px;color:#cfc8e8;line-height:1.7;display:none}
.os-score{display:flex;align-items:center;gap:14px;background:rgba(16,185,129,.07);border:1px solid rgba(16,185,129,.3);border-radius:14px;padding:12px;margin:12px 0}
.os-score b{font-size:30px;color:#a7f3d0}
.os-flag-found{background:rgba(239,68,68,.1)!important;border-color:#EF4444!important;color:#fecaca!important}
&lt;/style&gt;
&lt;button id="osint-btn" title="OSINT-академия"&gt;?️&lt;/button&gt;
&lt;section id="osint"&gt;
&lt;div class="sec-ic"&gt;?️&lt;/div&gt;&lt;h2&gt;OSINT-академия&lt;/h2&gt;
&lt;div class="sub"&gt;Учимся проверять информацию: поиск первоисточника, геолокация по фото, графы связей. Всё локально, без сети&lt;/div&gt;
&lt;div class="os-tabs"&gt;
&lt;button class="os-tab on" data-p="src"&gt;? Первоисточник&lt;/button&gt;
&lt;button class="os-tab" data-p="geo"&gt;? Геолокация&lt;/button&gt;
&lt;button class="os-tab" data-p="graph"&gt;?️ Граф связей&lt;/button&gt;
&lt;/div&gt;
&lt;div class="os-pane on" data-p="src" id="os-src"&gt;&lt;/div&gt;
&lt;div class="os-pane" data-p="geo" id="os-geo"&gt;&lt;/div&gt;
&lt;div class="os-pane" data-p="graph" id="os-graph"&gt;&lt;/div&gt;
&lt;/section&gt;
&lt;script&gt;
(function(){"use strict";
if(window._prOsint)return;window._prOsint=1;
var $=function(s){return document.querySelector(s)};
function g(k,d){try{var v=localStorage.getItem(k);return v==null?d:JSON.parse(v)}catch(e){return d}}
function s(k,v){try{localStorage.setItem(k,JSON.stringify(v))}catch(e){}}
function coach(t){var c=$('#coach');if(!c)return;$('#coachText').textContent=t;c.style.display='block';clearTimeout(window._prCt);window._prCt=setTimeout(function(){c.style.display='none'},6500);}
function grant(n){var P=g('pr_profile',{pr:0,streak:0,last:'',lvl:1});P.pr+=n;P.lvl=1+Math.floor(P.pr/100);s('pr_profile',P);var e=$('#hPr');if(e)e.textContent='? '+P.pr+' PR';
var st=g('pr_streak',{d:0,last:''}),t=new Date().toDateString();if(st.last!==t){var y=new Date(Date.now()-864e5).toDateString();st.d=(st.last===y)?st.d+1:1;st.last=t;s('pr_streak',st);var e2=$('#hStreak');if(e2)e2.textContent='? '+st.d;}}
function mulberry32(a){return function(){a|=0;a=a+0x6D2B79F5|0;var t=Math.imul(a^a&gt;&gt;&gt;15,1|a);t=t+Math.imul(t^t&gt;&gt;&gt;7,61|t)^t;return((t^t&gt;&gt;&gt;14)&gt;&gt;&gt;0)/4294967296}}
var main=document.querySelector('main'),fg=document.querySelector('.foot-grid');
var sec=$('#osint');
/* навигация: чип + сайдбар + плавающая кнопка */
var nav=$('#chips');if(nav){var chip=document.createElement('button');chip.textContent='?️ OSINT';chip.addEventListener('click',function(){nav.querySelectorAll('button').forEach(function(x){x.classList.remove('on')});chip.classList.add('on');sec.scrollIntoView({behavior:'smooth'});});nav.appendChild(chip);}
var pdnav=$('#pd-nav');if(pdnav&amp;&amp;!pdnav.querySelector('[data-id="osint"]')){var pb=document.createElement('button');pb.className='pd-item';pb.setAttribute('data-id','osint');pb.innerHTML='&lt;i class="fas fa-magnifying-glass"&gt;&lt;/i&gt;&lt;span&gt;OSINT&lt;/span&gt;';pb.addEventListener('click',function(){sec.scrollIntoView({behavior:'smooth'})});pdnav.appendChild(pb);}
$('#osint-btn').addEventListener('click',function(){sec.scrollIntoView({behavior:'smooth'})});
/* табы */
sec.querySelectorAll('.os-tab').forEach(function(t){t.addEventListener('click',function(){sec.querySelectorAll('.os-tab').forEach(function(x){x.classList.remove('on')});t.classList.add('on');sec.querySelectorAll('.os-pane').forEach(function(p){p.classList.remove('on')});sec.querySelector('.os-pane[data-p="'+t.dataset.p+'"]').classList.add('on');});});
/* ══════ ВКЛАДКА 1 · ПЕРВОИСТОЧНИК ══════ */
(function(){
var box=$('#os-src');
var STEPS=[
{n:1,t:'Обратный поиск изображения',d:'Загрузи фото в Google Images, TinEye или Яндекс.Картинки. Поисковик покажет, где снимок публиковался раньше и кто его выложил первым.'},
{n:2,t:'Проверь дату первой публикации',d:'Если фото датировано «вчера», а самый ранний пост — три года назад, это старый снимок, который выдают за новый.'},
{n:3,t:'EXIF-метаданные',d:'Дата, модель камеры, GPS-координаты — если не удалены. Отсутствие метаданных тоже сигнал: файл проходил обработку.'},
{n:4,t:'Детали и логика',d:'Тени, вывески, одежда, погода, машины должны соответствовать заявленному месту и времени. Снег в июле — подделка.'}];
var QS=[
{q:'Вам прислали «горячее» фото потопа. Первое действие?',o:['Опубликовать в соцсетях','Обратный поиск изображения','Спросить у друзей','Поверить — выглядит реалистично'],a:1,fb:'Обратный поиск покажет, где и когда фото публиковалось впервые. Часто «свежие» кадры оказываются старыми.'},
{q:'Фото «аварии» найдено в новостях за 2019 год. Что это значит?',o:['Фото настоящее, просто старое','Старое фото выдают за новое — дезинформация','Ошибка поисковика','Совпадение'],a:1,fb:'Если снимок существовал задолго до заявленного события, его намеренно выдают за свежее.'},
{q:'Что означает отсутствие EXIF-метаданных?',o:['Фото точно подделка','Файл обработан или загружен через мессенджер','Снято на дорогую камеру','Ничего не значит'],a:1,fb:'Отсутствие EXIF — не доказательство подделки, но сигнал: файл проходил обработку. Проверяй другими способами.'},
{q:'На «зимнем» фото тени короткие, как летом в полдень. Вывод?',o:['Всё в порядке','Ошибка камеры','Заявленное время/место не совпадают — признак подделки','Сломан фотоаппарат'],a:2,fb:'Длина и направление теней зависят от положения солнца. Несоответствие сезону — признак подделки.'},
{q:'В новости фото без указания источника. Что делать?',o:['Поверить СМИ','Найти оригинал и подтвердить источник','Ничего','Репостнуть'],a:1,fb:'Фото без источника — красный флаг. Профессиональные СМИ указывают автора или источник снимка.'}];
var html=STEPS.map(function(s2){return '&lt;div class="os-step"&gt;&lt;span class="n"&gt;'+s2.n+'&lt;/span&gt;&lt;div&gt;&lt;b&gt;'+s2.t+'&lt;/b&gt;&lt;p&gt;'+s2.d+'&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;'}).join('');
html+='&lt;div style="margin-top:14px;font-size:13px;color:#f0d68a;font-weight:700"&gt;Проверь себя:&lt;/div&gt;&lt;div id="os-src-qs"&gt;&lt;/div&gt;';
html+='&lt;div style="margin-top:14px"&gt;&lt;label class="pd-file"&gt;? Загрузить фото для EXIF-анализа&lt;input type="file" id="os-src-file" accept="image/*" style="position:absolute;inset:0;opacity:0;cursor:pointer"&gt;&lt;/label&gt;&lt;div id="os-src-exif" style="margin-top:10px"&gt;&lt;/div&gt;&lt;/div&gt;';
box.innerHTML=html;
var qbox=$('#os-src-qs');
QS.forEach(function(q){
var qd=document.createElement('div');qd.className='os-q';
qd.innerHTML='&lt;div class="qt"&gt;'+q.q+'&lt;/div&gt;'+q.o.map(function(o,i){return '&lt;button class="os-opt" data-i="'+i+'"&gt;'+o+'&lt;/button&gt;'}).join('')+'&lt;div class="os-fb"&gt;'+q.fb+'&lt;/div&gt;';
qbox.appendChild(qd);
q.querySelectorAll?null:null;
qd.querySelectorAll('.os-opt').forEach(function(b){b.addEventListener('click',function(){
if(qd.dataset.done)return;qd.dataset.done='1';
var i=+b.dataset.i;
qd.querySelectorAll('.os-opt').forEach(function(x){x.style.pointerEvents='none'});
b.classList.add(i===q.a?'right':'wrong');
if(i!==q.a)qd.querySelector('.os-opt[data-i="'+q.a+'"]').classList.add('right');
qd.querySelector('.os-fb').style.display='block';
if(i===q.a){grant(1);coach('✅ Верно! +1 PR');}else coach('❌ Не совсем. Смотри пояснение.');
});});
});
/* EXIF-анализ */
function parseEXIF(buf){
try{var dv=new DataView(buf);if(dv.getUint16(0)!==0xFFD8)return null;
var off=2,len=dv.byteLength;
while(off+4&lt;len){var m=dv.getUint16(off);
if(m===0xFFE1&amp;&amp;off+10&lt;len&amp;&amp;dv.getUint32(off+4)===0x45786966){
var t=off+10,le=dv.getUint16(t)===0x4949;
var u16=function(o){return dv.getUint16(t+o,le)},u32=function(o){return dv.getUint32(t+o,le)};
var ifd=u32(4),n=u16(ifd),res={tags:{}};
for(var i=0;i&lt;n;i++){var e=ifd+2+i*12,tag=u16(e),cnt=u32(e+4);
if(tag===0x010F||tag===0x0110||tag===0x0131||tag===0x0132){var so=cnt&gt;4?u32(e+8):(e+8);var str='';for(var k=0;k&lt;cnt-1;k++)str+=String.fromCharCode(dv.getUint8(t+so+k));res.tags[tag]=str.trim();}
if(tag===0x8825)res.gpsPtr=u32(e+8);}
if(res.gpsPtr)res.gps=parseGPS(dv,t,res.gpsPtr,u16,u32);
return res;}
var sz=dv.getUint16(off+2);off+=2+sz;}
return null;}catch(e){return null}}
function parseGPS(dv,t,ptr,u16,u32){
try{var n=u16(ptr),res={};
function rr(o){var num=u32(o),den=u32(o+4);return den?num/den:0}
for(var i=0;i&lt;n;i++){var e=ptr+2+i*12,tag=u16(e),vo=u32(e+8);
if(tag===1)res.latRef=String.fromCharCode(dv.getUint8(t+vo));
else if(tag===2)res.lat=rr(t+vo)+rr(t+vo+8)/60+rr(t+vo+16)/3600;
else if(tag===3)res.lngRef=String.fromCharCode(dv.getUint8(t+vo));
else if(tag===4)res.lng=rr(t+vo)+rr(t+vo+8)/60+rr(t+vo+16)/3600;}
if(res.lat!==undefined&amp;&amp;res.lng!==undefined){if(res.latRef==='S')res.lat=-res.lat;if(res.lngRef==='W')res.lng=-res.lng;return{lat:res.lat,lng:res.lng};}
return null;}catch(e){return null}}
$('#os-src-file').addEventListener('change',function(e){
var f=e.target.files[0];if(!f)return;
var r=new FileReader();
r.onload=function(){
var ex=parseEXIF(r.result);
var out=$('#os-src-exif');
if(!ex){out.innerHTML='&lt;div class="os-q"&gt;&lt;div class="qt"&gt;EXIF не найден&lt;/div&gt;&lt;div style="font-size:12px;color:#cfc8e8"&gt;Метаданные удалены (мессенджер/соцсеть) или это не JPEG. Уже сигнал — проверь первоисточник обратным поиском.&lt;/div&gt;&lt;/div&gt;';grant(1);coach('? EXIF пуст: сигнал проверить первоисточник. +1 PR');return;}
var rows='';
if(ex.tags[0x0132])rows+='&lt;div&gt;? Дата съёмки: &lt;b&gt;'+ex.tags[0x0132]+'&lt;/b&gt;&lt;/div&gt;';
if(ex.tags[0x010F])rows+='&lt;div&gt;? Камера: &lt;b&gt;'+ex.tags[0x010F]+' '+(ex.tags[0x0110]||'')+'&lt;/b&gt;&lt;/div&gt;';
if(ex.tags[0x0131])rows+='&lt;div&gt;? Обработано в: &lt;b&gt;'+ex.tags[0x0131]+'&lt;/b&gt; (файл редактировался!)&lt;/div&gt;';
if(ex.gps)rows+='&lt;div&gt;? GPS: &lt;b&gt;'+ex.gps.lat.toFixed(5)+', '+ex.gps.lng.toFixed(5)+'&lt;/b&gt; — проверь на карте!&lt;/div&gt;';
if(!rows)rows='&lt;div&gt;Метаданные скудные.&lt;/div&gt;';
out.innerHTML='&lt;div class="os-q"&gt;&lt;div class="qt"&gt;Результат EXIF-анализа&lt;/div&gt;&lt;div style="font-size:12px;color:#cfc8e8;line-height:1.8"&gt;'+rows+'&lt;/div&gt;&lt;div style="font-size:11px;color:#a79ec9;margin-top:6px"&gt;Дальше — обратный поиск по картинке для поиска первоисточника.&lt;/div&gt;&lt;/div&gt;';
grant(1);coach('? EXIF разобран. +1 PR');
};
r.readAsArrayBuffer(f);
});
})();
/* ══════ ВКЛАДКА 2 · ГЕОЛОКАЦИЯ ══════ */
(function(){
var box=$('#os-geo');
box.innerHTML='&lt;div style="font-size:12px;color:#a79ec9;margin-bottom:8px"&gt;Проанализируй сцену: определи время и направление тени по солнцу. Кнопка ниже генерирует новую сцену.&lt;/div&gt;'+
'&lt;canvas class="os-cv" id="os-geo-cv" width="400" height="260"&gt;&lt;/canvas&gt;'+
'&lt;div id="os-geo-qs"&gt;&lt;/div&gt;'+
'&lt;button class="btn ghost" id="os-geo-new" style="margin-top:8px"&gt;? Новая сцена&lt;/button&gt;';
function makeCfg(seed){var rnd=mulberry32(seed);
var long=rnd()&lt;0.5;
return{long:long,sunX:0.15+rnd()*0.7,sunY:long?0.42+rnd()*0.08:0.12+rnd()*0.08,veg:['?','?','?'][Math.floor(rnd()*3)],sign:['CAFE','HOTEL','METRO','MARKET'][Math.floor(rnd()*4)]};}
function draw(cv,cfg){
var W=cv.width,H=cv.height,x=cv.getContext('2d');
var gy=H*0.72;
var sky=x.createLinearGradient(0,0,0,gy);sky.addColorStop(0,'#1e2b4a');sky.addColorStop(1,'#4a5a7a');
x.fillStyle=sky;x.fillRect(0,0,W,gy);
x.fillStyle='#2a3a2a';x.fillRect(0,gy,W,H-gy);
var sx=cfg.sunX*W,sy=cfg.sunY*gy;
var gr=x.createRadialGradient(sx,sy,2,sx,sy,40);gr.addColorStop(0,'rgba(255,230,150,0.9)');gr.addColorStop(1,'rgba(255,230,150,0)');
x.fillStyle=gr;x.beginPath();x.arc(sx,sy,40,0,7);x.fill();
x.fillStyle='#ffe08a';x.beginPath();x.arc(sx,sy,11,0,7);x.fill();
var bw=W*0.18,bh=H*0.3,bx=W*0.45,by=gy-bh;
x.fillStyle='#3a3f52';x.fillRect(bx,by,bw,bh);
x.fillStyle='#ffd97a';
for(var r=0;r&lt;3;r++)for(var c=0;c&lt;3;c++){x.fillRect(bx+10+c*(bw-20)/3,by+10+r*(bh-20)/3,(bw-20)/3-5,(bh-20)/3-5);}
var dir=cfg.sunX&lt;0.5?1:-1,shLen=(cfg.long?1.6:0.5)*bw;
x.fillStyle='rgba(0,0,0,0.35)';
x.beginPath();x.moveTo(bx,gy);x.lineTo(bx+bw,gy);x.lineTo(bx+bw+dir*shLen,gy+5);x.lineTo(bx+dir*shLen,gy+5);x.closePath();x.fill();
x.font='34px serif';x.textAlign='center';x.fillText(cfg.veg,W*0.82,gy);
x.fillStyle='#2a2a3a';x.fillRect(W*0.08,gy-H*0.12,W*0.16,H*0.06);
x.fillStyle='#ffe08a';x.font='bold 13px sans-serif';x.fillText(cfg.sign,W*0.16,gy-H*0.075);
}
function qs(cfg){return [
{q:'Тень длинная или короткая?',o:['Длинная','Короткая'],a:cfg.long?0:1,fb:cfg.long?'Низкое солнце даёт длинную тень — утро или вечер.':'Солнце высоко — тень короткая, ближе к полудню.'},
{q:'Куда падает тень?',o:['Вправо','Влево'],a:cfg.sunX&lt;0.5?0:1,fb:'Тень всегда падает в противоположную от солнца сторону.'},
{q:'Какое время суток, вероятно?',o:['Полдень','Утро или вечер'],a:cfg.long?1:0,fb:cfg.long?'Длинная тень = низкое солнце = утро или вечер.':'Короткая тень = солнце в зените, полдень.'}];}
var seed=Math.floor(Math.random()*100000),cfg=makeCfg(seed),answered=0,score=0;
function renderQs(){
var qbox=$('#os-geo-qs');qbox.innerHTML='';answered=0;score=0;
qs(cfg).forEach(function(q){
var qd=document.createElement('div');qd.className='os-q';
qd.innerHTML='&lt;div class="qt"&gt;'+q.q+'&lt;/div&gt;'+q.o.map(function(o,i){return '&lt;button class="os-opt" data-i="'+i+'"&gt;'+o+'&lt;/button&gt;'}).join('')+'&lt;div class="os-fb"&gt;'+q.fb+'&lt;/div&gt;';
qbox.appendChild(qd);
qd.querySelectorAll('.os-opt').forEach(function(b){b.addEventListener('click',function(){
if(qd.dataset.done)return;qd.dataset.done='1';
var i=+b.dataset.i;b.classList.add(i===q.a?'right':'wrong');
if(i!==q.a)qd.querySelector('.os-opt[data-i="'+q.a+'"]').classList.add('right');
qd.querySelector('.os-fb').style.display='block';
if(i===q.a)score++;answered++;
if(answered===3){grant(score);coach('? Геолокация: '+score+'/3 верно. +'+score+' PR');}
});});
});
}
function newScene(){seed=Math.floor(Math.random()*100000);cfg=makeCfg(seed);draw($('#os-geo-cv'),cfg);renderQs();}
$('#os-geo-new').addEventListener('click',newScene);
draw($('#os-geo-cv'),cfg);renderQs();
})();
/* ══════ ВКЛАДКА 3 · ГРАФ СВЯЗЕЙ ══════ */
(function(){
var box=$('#os-graph');
box.innerHTML='&lt;div style="font-size:12px;color:#a79ec9;margin-bottom:8px"&gt;Сеть аккаунтов. Кликни на узел — увидишь метаданные. Отметь ботов и нажми «Проверить». Боты: молодой аккаунт, много постов/день, мало подписчиков, много связей.&lt;/div&gt;'+
'&lt;canvas class="os-cv" id="os-graph-cv" width="400" height="300" style="cursor:pointer"&gt;&lt;/canvas&gt;'+
'&lt;div class="os-node-info" id="os-node-info"&gt;&lt;/div&gt;'+
'&lt;div class="pd-row"&gt;&lt;button class="btn ghost" id="os-graph-mark"&gt;? Отметить как бота&lt;/button&gt;&lt;button class="btn" id="os-graph-check"&gt;✅ Проверить&lt;/button&gt;&lt;button class="btn ghost" id="os-graph-new"&gt;? Новая сеть&lt;/button&gt;&lt;/div&gt;'+
'&lt;div id="os-graph-res"&gt;&lt;/div&gt;';
var nodes=[],edges=[],bots=[],marks={},selected=-1,revealed=false;
function gen(seed){
var rnd=mulberry32(seed);
var N=12,names=['Анна','Борис','Виктор','Галина','Дмитрий','Елена','Игорь','Ольга','Павел','Светлана','Мария','Кирилл'];
bots=[2,5,8];nodes=[];edges=[];marks={};selected=-1;revealed=false;
for(var i=0;i&lt;N;i++){
var ang=i/N*Math.PI*2-Math.PI/2,isBot=bots.indexOf(i)&gt;=0;
nodes.push({id:i,name:isBot?'user_'+(1000+i*137):names[i],age:Math.round(isBot?1+rnd()*4:6+rnd()*40),ppd:+(isBot?(12+rnd()*15):(0.5+rnd()*4)).toFixed(1),followers:Math.round(isBot?20+rnd()*80:50+rnd()*900),isBot:isBot,x:0.5+0.36*Math.cos(ang),y:0.5+0.36*Math.sin(ang)});
}
var seen={};function addE(a,b){if(a===b)return;var k=Math.min(a,b)+'-'+Math.max(a,b);if(seen[k])return;seen[k]=1;edges.push([a,b]);}
bots.forEach(function(bi){var cnt=5+Math.floor(rnd()*3);for(var j=0;j&lt;cnt;j++)addE(bi,Math.floor(rnd()*N));});
for(var r=0;r&lt;4;r++)addE(Math.floor(rnd()*N),Math.floor(rnd()*N));
}
function drawGraph(){
var cv=$('#os-graph-cv'),x=cv.getContext('2d'),W=cv.width,H=cv.height;
x.clearRect(0,0,W,H);
x.strokeStyle='rgba(139,92,246,0.25)';x.lineWidth=1;
edges.forEach(function(e){var a=nodes[e[0]],b=nodes[e[1]];x.beginPath();x.moveTo(a.x*W,a.y*H);x.lineTo(b.x*W,b.y*H);x.stroke();});
nodes.forEach(function(n,i){
var cx2=n.x*W,cy2=n.y*H;
var fill=revealed?(n.isBot?'#EF4444':'#10B981'):'#8B5CF6';
if(marks[i])fill='#F59E0B';
x.beginPath();x.arc(cx2,cy2,10,0,7);x.fillStyle=fill;x.fill();
if(i===selected){x.strokeStyle='#fff';x.lineWidth=2;x.stroke();}
x.fillStyle='#efe9dc';x.font='9px sans-serif';x.textAlign='center';x.fillText(n.name.slice(0,10),cx2,cy2+22);
});
}
function showInfo(i){
var n=nodes[i],el=$('#os-node-info');
el.style.display='block';
el.innerHTML='&lt;b&gt;'+n.name+'&lt;/b&gt;'+(marks[i]?' &lt;span style="color:#F59E0B"&gt;(отмечен как бот)&lt;/span&gt;':'')+'&lt;br&gt;Возраст аккаунта: &lt;b&gt;'+n.age+' мес&lt;/b&gt; · Постов/день: &lt;b&gt;'+n.ppd+'&lt;/b&gt; · Подписчиков: &lt;b&gt;'+n.followers+'&lt;/b&gt;&lt;br&gt;&lt;span style="color:#a79ec9"&gt;Подсказка: бот обычно молодой (&amp;lt;6 мес), постит много (&amp;gt;10/день), подписчиков мало.&lt;/span&gt;';
}
$('#os-graph-cv').addEventListener('click',function(e){
if(revealed)return;
var rect=this.getBoundingClientRect(),mx=(e.clientX-rect.left)*(this.width/rect.width),my=(e.clientY-rect.top)*(this.height/rect.height);
var best=-1,bd=1e9;
nodes.forEach(function(n,i){var dx=n.x*400-mx,dy=n.y*300-my,d2=dx*dx+dy*dy;if(d2&lt;bd){bd=d2;best=i;}});
if(bd&lt;20*20){selected=best;showInfo(best);drawGraph();}
});
$('#os-graph-mark').addEventListener('click',function(){
if(selected&lt;0||revealed){coach('Сначала выбери узел кликом');return}
marks[selected]=!marks[selected]?true:undefined;
if(!marks[selected])delete marks[selected];
showInfo(selected);drawGraph();
});
$('#os-graph-check').addEventListener('click',function(){
revealed=true;
var correct=0,falseM=0;
nodes.forEach(function(n,i){if(marks[i]){if(n.isBot)correct++;else falseM++;}});
var score=Math.max(0,correct*3-falseM*2);
var score100=Math.max(0,Math.min(100,Math.round(correct/bots.length*100-falseM*10)));
$('#os-graph-res').innerHTML='&lt;div class="os-score"&gt;&lt;b&gt;'+score100+'&lt;/b&gt;&lt;div&gt;&lt;div style="font-size:13px;color:#a7f3d0"&gt;Найдено ботов: '+correct+'/'+bots.length+' · ложных отметок: '+falseM+'&lt;/div&gt;&lt;div style="font-size:11px;color:#a79ec9;margin-top:4px"&gt;Красные — реальные боты. Зелёные — настоящие пользователи.&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;';
drawGraph();
grant(Math.max(1,score));coach('?️ Граф: '+correct+'/'+bots.length+' ботов найдено. +'+Math.max(1,score)+' PR');
});
$('#os-graph-new').addEventListener('click',function(){gen(Math.floor(Math.random()*100000));$('#os-graph-res').innerHTML='';$('#os-node-info').style.display='none';drawGraph();});
gen(Math.floor(Math.random()*100000));drawGraph();
})();
console.log('?️ Правдомер: Блок 13 · OSINT-академия подключён');
})();
&lt;/script&gt;

&lt;style&gt;
#sy-btn{position:fixed;right:16px;bottom:756px;z-index:400;width:52px;height:52px;border-radius:50%;border:none;cursor:pointer;background:linear-gradient(135deg,#EC4899,#8B5CF6);color:#fff;font-size:22px;box-shadow:0 6px 20px rgba(236,72,153,.45);transition:transform .2s}
#sy-btn:hover{transform:scale(1.1)}
@media(min-width:1000px){#sy-btn{bottom:636px}}
#sy-mask{position:fixed;inset:0;z-index:424;display:none;align-items:center;justify-content:center;background:rgba(12,5,15,.92);backdrop-filter:blur(6px)}
#sy-mask.open{display:flex}
#sy-card{width:min(680px,94vw);max-height:90vh;overflow-y:auto;border-radius:18px;padding:22px;color:#f5eef8;background:linear-gradient(180deg,#1c0d1a,#0d0a14);border:1px solid rgba(236,72,153,.4);font-family:Inter,system-ui,sans-serif;box-shadow:0 30px 60px rgba(0,0,0,.6)}
#sy-card h3{margin:0 0 4px;font-size:20px;color:#f9a8d4}
.sy-sub{font-size:12px;color:#c9a8c9;margin-bottom:14px;line-height:1.5}
.sy-tabs{display:flex;gap:6px;margin-bottom:14px;flex-wrap:wrap}
.sy-tab{flex:1;padding:9px 8px;border-radius:10px;border:1px solid rgba(236,72,153,.35);background:rgba(236,72,153,.08);color:#f9a8d4;font-weight:700;font-size:12px;cursor:pointer;min-width:70px}
.sy-tab.on{background:linear-gradient(135deg,#EC4899,#8B5CF6);color:#fff;border-color:transparent}
.sy-pane{display:none}.sy-pane.on{display:block}
.sy-drop{border:2px dashed rgba(236,72,153,.4);border-radius:12px;padding:20px;text-align:center;color:#c9a8c9;cursor:pointer;transition:.2s;margin-bottom:10px}
.sy-drop:hover{border-color:#EC4899;background:rgba(236,72,153,.06);color:#f9a8d4}
.sy-row{display:flex;gap:8px;flex-wrap:wrap;margin:8px 0}
.sy-act{padding:10px 16px;border-radius:10px;border:none;cursor:pointer;font-weight:700;font-size:12px;background:linear-gradient(135deg,#EC4899,#8B5CF6);color:#fff}
.sy-act.ghost{background:none;border:1px solid rgba(236,72,153,.4);color:#f9a8d4}
.sy-cv{width:100%;max-height:220px;border-radius:10px;border:1px solid rgba(236,72,153,.25);background:#0a0510;margin:8px 0}
.sy-score{display:flex;align-items:center;gap:14px;background:rgba(236,72,153,.08);border:1px solid rgba(236,72,153,.3);border-radius:14px;padding:14px;margin:12px 0}
.sy-score b{font-size:34px;color:#f9a8d4}
.sy-bar{flex:1;height:10px;background:rgba(255,255,255,.08);border-radius:99px;overflow:hidden;margin-top:6px}
.sy-bar i{display:block;height:100%;border-radius:99px;background:linear-gradient(90deg,#10B981,#F59E0B,#EF4444);transition:width .8s}
.sy-flag{display:flex;gap:10px;align-items:flex-start;font-size:12px;color:#e8dff0;background:rgba(255,255,255,.04);border:1px solid rgba(255,255,255,.08);border-radius:10px;padding:8px 10px;margin:6px 0;line-height:1.5}
.sy-flag b{color:#f9a8d4}
.sy-note{font-size:11px;color:#9a7fa0;margin-top:10px;line-height:1.5}
.sy-txt{width:100%;min-height:100px;padding:12px;border-radius:10px;border:1px solid rgba(236,72,153,.4);background:rgba(236,72,153,.06);color:#f5eef8;font-size:13px;font-family:inherit;resize:vertical;box-sizing:border-box}
#sy-close{margin-top:14px;width:100%;border:1px solid rgba(236,72,153,.4);background:none;color:#f9a8d4;border-radius:10px;padding:10px;cursor:pointer;font-size:13px}
&lt;/style&gt;
&lt;button id="sy-btn" title="Лаборатория синтетики"&gt;?&lt;/button&gt;
&lt;div id="sy-mask"&gt;&lt;div id="sy-card"&gt;
&lt;h3&gt;? Лаборатория синтетики&lt;/h3&gt;
&lt;div class="sy-sub"&gt;Детекция дипфейков и ИИ-генерации. Частотный анализ, шумовые паттерны, спектральные артефакты — всё локально.&lt;/div&gt;
&lt;div class="sy-tabs"&gt;
&lt;button class="sy-tab on" data-p="img"&gt;? Фото&lt;/button&gt;
&lt;button class="sy-tab" data-p="aud"&gt;? Голос&lt;/button&gt;
&lt;button class="sy-tab" data-p="vid"&gt;? Видео&lt;/button&gt;
&lt;button class="sy-tab" data-p="txt"&gt;? Текст&lt;/button&gt;
&lt;/div&gt;
&lt;div class="sy-pane on" data-p="img" id="sy-p-img"&gt;&lt;/div&gt;
&lt;div class="sy-pane" data-p="aud" id="sy-p-aud"&gt;&lt;/div&gt;
&lt;div class="sy-pane" data-p="vid" id="sy-p-vid"&gt;&lt;/div&gt;
&lt;div class="sy-pane" data-p="txt" id="sy-p-txt"&gt;&lt;/div&gt;
&lt;button id="sy-close"&gt;Закрыть&lt;/button&gt;
&lt;/div&gt;&lt;/div&gt;
&lt;script&gt;
(function(){
"use strict";
if(window._syDone)return;window._syDone=1;
var $=function(s){return document.querySelector(s)};
function g(k,d){try{var v=localStorage.getItem(k);return v==null?d:JSON.parse(v)}catch(e){return d}}
function s(k,v){try{localStorage.setItem(k,JSON.stringify(v))}catch(e){}}
function grant(n){if(window.PR&amp;&amp;window.PR.add)window.PR.add(n)}
function coach(t){var c=$('#coach');if(!c)return;$('#coachText').textContent=t;c.style.display='block';clearTimeout(window._prCt);window._prCt=setTimeout(function(){c.style.display='none'},6500);}
function saveHist(ch,score){var h=g('pr_synth',[]);h.unshift({t:Date.now(),ch:ch,s:score});s('pr_synth',h.slice(0,8));}
/* ═══ ВКЛАДКИ ═══ */
document.querySelectorAll('.sy-tab').forEach(function(t){
t.addEventListener('click',function(){
document.querySelectorAll('.sy-tab').forEach(function(x){x.classList.remove('on')});
document.querySelectorAll('.sy-pane').forEach(function(x){x.classList.remove('on')});
t.classList.add('on');
$('#sy-p-'+t.dataset.p).classList.add('on');
});
});
/* ═══ 1. ФОТО: ШУМ + ЛАПЛАСИАН + ELA ═══ */
(function(){
var box=$('#sy-p-img');
box.innerHTML='&lt;div class="sy-drop" id="sy-img-drop"&gt;? Нажми или перетащи фото&lt;/div&gt;'+
'&lt;input type="file" id="sy-img-file" accept="image/*" style="display:none"&gt;'+
'&lt;div class="sy-row"&gt;&lt;button class="sy-act ghost" id="sy-img-real"&gt;? Демо: реальное&lt;/button&gt;&lt;button class="sy-act ghost" id="sy-img-ai"&gt;? Демо: AI-генерация&lt;/button&gt;&lt;/div&gt;'+
'&lt;canvas class="sy-cv" id="sy-img-cv" style="display:none"&gt;&lt;/canvas&gt;'+
'&lt;canvas class="sy-cv" id="sy-img-ela" style="display:none"&gt;&lt;/canvas&gt;'+
'&lt;div id="sy-img-res"&gt;&lt;/div&gt;';
$('#sy-img-drop').addEventListener('click',function(){$('#sy-img-file').click()});
$('#sy-img-file').addEventListener('change',function(e){var f=e.target.files[0];if(!f)return;
var r=new FileReader();r.onload=function(ev){var img=new Image();img.onload=function(){analyzeImg(img,true)};img.src=ev.target.result};r.readAsDataURL(f)});
$('#sy-img-real').addEventListener('click',function(){makeDemoImg(false)});
$('#sy-img-ai').addEventListener('click',function(){makeDemoImg(true)});
function makeDemoImg(isAI){
var W=420,H=300,c=document.createElement('canvas');c.width=W;c.height=H;var x=c.getContext('2d');
var gr=x.createLinearGradient(0,0,W,H);gr.addColorStop(0,'#3b2f63');gr.addColorStop(1,'#1d1533');
x.fillStyle=gr;x.fillRect(0,0,W,H);
var noiseN=isAI?400:3000,noiseA=isAI?0.02:0.07,i;
for(i=0;i&lt;noiseN;i++){x.fillStyle='rgba(255,255,255,'+(Math.random()*noiseA)+')';x.fillRect(Math.random()*W,Math.random()*H,1,1);}
x.fillStyle='#D4AF37';x.beginPath();x.arc(W/2,H/2,50,0,7);x.fill();
x.fillStyle='#8B5CF6';x.beginPath();x.arc(W/2,H/2,30,0,7);x.fill();
if(!isAI){for(var j=0;j&lt;800;j++){x.fillStyle='rgba(0,0,0,'+(Math.random()*0.08)+')';x.fillRect(Math.random()*W,Math.random()*H,1,1);}}
var img=new Image();img.onload=function(){analyzeImg(img,false)};img.src=c.toDataURL('image/png');
}
function lum(d,i){return 0.299*d[i]+0.587*d[i+1]+0.114*d[i+2]}
function analyzeImg(img,hasMeta){
var cv=$('#sy-img-cv');cv.style.display='block';
var W=Math.min(480,img.naturalWidth||img.width);
var H=Math.max(60,Math.round((img.naturalHeight||img.height)*(W/(img.naturalWidth||img.width))));
cv.width=W;cv.height=H;
var cx=cv.getContext('2d');cx.drawImage(img,0,0,W,H);
var d=cx.getImageData(0,0,W,H).data;
/* шум по регионам 4×4 */
var regs=[],regSize=Math.floor(W/4),ry,rx;
for(ry=0;ry&lt;4;ry++)for(rx=0;rx&lt;4;rx++){
var vals=[],yy,xx;
for(yy=ry*regSize;yy&lt;(ry+1)*regSize&amp;&amp;yy&lt;H;yy+=2)
for(xx=rx*regSize;xx&lt;(rx+1)*regSize&amp;&amp;xx&lt;W;xx+=2)vals.push(lum(d,(yy*W+xx)*4));
var m=0,k;for(k=0;k&lt;vals.length;k++)m+=vals[k];m/=vals.length||1;
var va=0;for(k=0;k&lt;vals.length;k++)va+=(vals[k]-m)*(vals[k]-m);
regs.push(va/(vals.length||1));
}
var regM=0,r2;for(r2=0;r2&lt;regs.length;r2++)regM+=regs[r2];regM/=regs.length;
var regVar=0;for(r2=0;r2&lt;regs.length;r2++)regVar+=(regs[r2]-regM)*(regs[r2]-regM);
regVar=Math.sqrt(regVar/regs.length);
/* высокочастотная энергия (Лапласиан) */
var hf=0,cnt=0,yy2,xx2;
for(yy2=1;yy2&lt;H-1;yy2+=2)for(xx2=1;xx2&lt;W-1;xx2+=2){
var i0=(yy2*W+xx2)*4;
var lap=Math.abs(4*lum(d,i0)-lum(d,i0-W*4)-lum(d,i0+W*4)-lum(d,i0-4)-lum(d,i0+4));
hf+=lap;cnt++;
}
hf/=cnt||1;
/* ELA: пересжать и сравнить */
var tmp=document.createElement('canvas');tmp.width=W;tmp.height=H;
tmp.getContext('2d').drawImage(img,0,0,W,H);
var im2=new Image();
im2.onload=function(){
tmp.getContext('2d').clearRect(0,0,W,H);
tmp.getContext('2d').drawImage(im2,0,0,W,H);
var d2=tmp.getContext('2d').getImageData(0,0,W,H).data;
var elaCv=$('#sy-img-ela');elaCv.style.display='block';
elaCv.width=W;elaCv.height=H;
var hx=elaCv.getContext('2d'),hd=hx.createImageData(W,H);
var diffs=[],i2;
for(i2=0;i2&lt;d.length;i2+=4){
var df=(Math.abs(d[i2]-d2[i2])+Math.abs(d[i2+1]-d2[i2+1])+Math.abs(d[i2+2]-d2[i2+2]))/3;
diffs.push(df);
hd.data[i2]=Math.min(255,df*12);hd.data[i2+1]=0;hd.data[i2+2]=Math.min(255,df*5);hd.data[i2+3]=255;
}
hx.putImageData(hd,0,0);
var elaM=0,e2;for(e2=0;e2&lt;diffs.length;e2++)elaM+=diffs[e2];elaM/=diffs.length;
/* скоринг */
var score=50,flags=[];
if(regVar&lt;1.5){score+=18;flags.push({t:'Однородный шум по всей площади',d:'Реальные фото имеют разный шум в разных зонах. Однородность — признак генерации.'});}
else if(regVar&lt;3){score+=8;flags.push({t:'Слабая вариативность шума',d:'Шумовые паттерны подозрительно ровные.'});}
else flags.push({t:'Естественная вариативность шума',d:'Шум различается по зонам — характерно для реальной съёмки.'});
if(hf&lt;1.2){score+=12;flags.push({t:'Низкая высокочастотная детализация',d:'Мало мелких деталей — частый признак AI-генерации.'});}
else if(hf&gt;4)flags.push({t:'Высокая детализация',d:'Много резких деталей — характерно для реальных фото.'});
if(elaM&lt;0.5){score+=10;flags.push({t:'«Чистый» ELA-профиль',d:'Подозрительно однородная история сжатия.'});}
if(!hasMeta){score+=5;flags.push({t:'Минимальные метаданные',d:'Файл без метаданных — частый признак генерации.'});}
score=Math.max(3,Math.min(97,Math.round(score)));
var verdict=score&gt;=65?'Высокая вероятность ИИ-генерации/монтажа':score&gt;=40?'Подозрительные признаки — нужна перепроверка':'Похоже на реальный снимок';
var res=$('#sy-img-res');res.style.display='block';
res.innerHTML='&lt;div class="sy-score"&gt;&lt;b&gt;'+score+'&lt;/b&gt;&lt;div style="flex:1"&gt;&lt;div style="font-size:12px;color:#c9a8c9"&gt;Индекс синтетики (0–100)&lt;/div&gt;&lt;div class="sy-bar"&gt;&lt;i style="width:'+score+'%"&gt;&lt;/i&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;'+
'&lt;div class="sy-flag"&gt;&lt;b&gt;Вердикт&lt;/b&gt;&lt;span&gt;'+verdict+'&lt;/span&gt;&lt;/div&gt;'+
flags.map(function(f){return '&lt;div class="sy-flag"&gt;&lt;b&gt;'+f.t+'&lt;/b&gt;&lt;span&gt;'+f.d+'&lt;/span&gt;&lt;/div&gt;'}).join('')+
'&lt;div class="sy-note"&gt;Методы: шумовой анализ по регионам, высокочастотная энергия (Лапласиан), ELA. Это вероятностная оценка, не доказательство.&lt;/div&gt;';
grant(4);saveHist('img',score);
coach(score&gt;=65?'? Высокий индекс синтетики. +4 PR':score&gt;=40?'? Есть подозрительные признаки. +4 PR':'? Похоже на реальный снимок. +4 PR');
};
im2.src=tmp.toDataURL('image/jpeg',0.7);
}
})();
/* ═══ 2. ГОЛОС: СПЕКТР + ПАПЗЫ + ВДОХИ ═══ */
(function(){
var box=$('#sy-p-aud');
box.innerHTML='&lt;div class="sy-row"&gt;&lt;button class="sy-act" id="sy-aud-rec"&gt;? Записать голос (10 сек)&lt;/button&gt;'+
'&lt;label class="sy-act ghost" style="position:relative;overflow:hidden"&gt;? Аудиофайл&lt;input type="file" id="sy-aud-file" accept="audio/*" style="position:absolute;inset:0;opacity:0;cursor:pointer"&gt;&lt;/label&gt;'+
'&lt;button class="sy-act ghost" id="sy-aud-demo"&gt;? Демо: синтетика&lt;/button&gt;&lt;/div&gt;'+
'&lt;div id="sy-aud-status" style="font-size:12px;color:#c9a8c9;margin:8px 0"&gt;Готов к записи. Скажи 10 секунд естественно.&lt;/div&gt;'+
'&lt;canvas class="sy-cv" id="sy-aud-cv" width="600" height="110"&gt;&lt;/canvas&gt;'+
'&lt;div id="sy-aud-res"&gt;&lt;/div&gt;';
var AC=window.AudioContext||window.webkitAudioContext;
var recording=false,rec=null,stream=null,raf=0,an=null;
$('#sy-aud-rec').addEventListener('click',function(){
if(recording){stopRec();return}
if(!navigator.mediaDevices||!navigator.mediaDevices.getUserMedia){coach('Микрофон недоступен');return}
navigator.mediaDevices.getUserMedia({audio:true}).then(function(st){
stream=st;
var ctx=new AC();an=ctx.createAnalyser();an.fftSize=2048;
ctx.createMediaStreamSource(st).connect(an);
rec=new MediaRecorder(st);var ch=[];
rec.ondataavailable=function(e){ch.push(e.data)};
rec.onstop=function(){
st.getTracks().forEach(function(t){t.stop()});
cancelAnimationFrame(raf);
var blob=new Blob(ch,{type:rec.mimeType||'audio/webm'});
$('#sy-aud-status').textContent='Анализирую спектр…';
blob.arrayBuffer().then(function(ab){return new AC().decodeAudioData(ab)}).then(function(buf){analyzeAud(buf)}).catch(function(){coach('Не удалось декодировать запись')});
};
rec.start();recording=true;
$('#sy-aud-rec').textContent='⏹ Стоп';
$('#sy-aud-status').textContent='Идёт запись…';
liveSpec();
setTimeout(function(){if(recording)stopRec()},10000);
}).catch(function(){coach('Нет доступа к микрофону')});
});
function stopRec(){recording=false;if(rec&amp;&amp;rec.state!=='inactive')rec.stop();$('#sy-aud-rec').textContent='? Записать голос (10 сек)';$('#sy-aud-status').textContent='Обработка…';}
function liveSpec(){
var cv=$('#sy-aud-cv'),cx=cv.getContext('2d');
var data=new Uint8Array(an.frequencyBinCount);
(function loop(){
if(!recording)return;
raf=requestAnimationFrame(loop);
an.getByteFrequencyData(data);
cx.fillStyle='#0a0510';cx.fillRect(0,0,cv.width,cv.height);
var bw=cv.width/64;
for(var i=0;i&lt;64;i++){
var v=data[i*4]/255;
cx.fillStyle='rgba(236,72,153,'+(0.3+v*0.7)+')';
cx.fillRect(i*bw,cv.height-v*cv.height,bw-1,v*cv.height);
}
})();
}
$('#sy-aud-file').addEventListener('change',function(e){
var f=e.target.files[0];if(!f)return;
$('#sy-aud-status').textContent='Декодирую…';
var r=new FileReader();r.onload=function(ev){
new AC().decodeAudioData(ev.target.result).then(function(buf){analyzeAud(buf)}).catch(function(){coach('Не удалось декодировать')});
};r.readAsArrayBuffer(f);
});
$('#sy-aud-demo').addEventListener('click',function(){
var sr=22050,n=sr*6,d=new Float32Array(n);
for(var i=0;i&lt;n;i++){
var t=i/sr,env=Math.sin(Math.PI*i/n)*0.8;
var f0=180+40*Math.sin(2*Math.PI*0.5*t);
d[i]=env*0.3*Math.sin(2*Math.PI*f0*t)*(1+0.2*Math.sin(2*Math.PI*3*t));
}
analyzeAud({sampleRate:sr,length:n,getChannelData:function(){return d}});
});
function fftMag(seg){
var n=2048,re=new Float32Array(n),im=new Float32Array(n),i;
for(i=0;i&lt;n&amp;&amp;i&lt;seg.length;i++)re[i]=seg[i];
var i2,j;
for(i2=1,j=0;i2&lt;n;i2++){var bit=n&gt;&gt;1;for(;j&amp;bit;bit&gt;&gt;=1)j^=bit;j^=bit;
if(i2&lt;j){var t=re[i2];re[i2]=re[j];re[j]=t;t=im[i2];im[i2]=im[j];im[j]=t;}}
for(var len=2;len&lt;=n;len&lt;&lt;=1){
var ang=-2*Math.PI/len,wr=Math.cos(ang),wi=Math.sin(ang);
for(var i3=0;i3&lt;n;i3+=len){var cr=1,ci=0;
for(var k=0;k&lt;len/2;k++){
var ur=re[i3+k],ui=im[i3+k];
var vr=re[i3+k+len/2]*cr-im[i3+k+len/2]*ci;
var vi=re[i3+k+len/2]*ci+im[i3+k+len/2]*cr;
re[i3+k]=ur+vr;im[i3+k]=ui+vi;
re[i3+k+len/2]=ur-vr;im[i3+k+len/2]=ui-vi;
var nr=cr*wr-ci*wi;ci=cr*wi+ci*wr;cr=nr;
}}
}
var mags=[];for(var k2=0;k2&lt;n/2;k2++)mags.push(Math.sqrt(re[k2]*re[k2]+im[k2]*im[k2]));
return{mags:mags,n:n};
}
function analyzeAud(buf){
var sr=buf.sampleRate,d=buf.getChannelData(0);
var win=Math.floor(sr*0.05),hop=Math.floor(win/2);
var rms=[],i,j;
for(i=0;i+win&lt;d.length;i+=hop){var q=0;for(j=0;j&lt;win;j++){var v=d[i+j];q+=v*v}rms.push(Math.sqrt(q/win))}
var mx=0,i2;for(i2=0;i2&lt;rms.length;i2++)if(rms[i2]&gt;mx)mx=rms[i2];
var thr=Math.max(0.003,mx*0.08);
var pauses=0,run=0,i3;
for(i3=0;i3&lt;rms.length;i3++){if(rms[i3]&lt;thr)run++;else{if(run*hop/sr&gt;0.3)pauses++;run=0}}
/* спектр середины записи */
var mid=Math.floor(d.length/2),seg=d.subarray(mid,Math.min(d.length,mid+2048));
var sp=fftMag(seg);
var lowE=0,highE=0,k,binsPerHz=sp.n/sr;
for(k=0;k&lt;sp.mags.length;k++){var freq=k/binsPerHz;if(freq&lt;4000)lowE+=sp.mags[k];else highE+=sp.mags[k];}
var hfRatio=lowE&gt;0?highE/lowE:0;
/* поиск «вдохов» — короткие провалы энергии между фразами */
var breathLike=0,i4;
for(i4=1;i4&lt;rms.length-1;i4++){
if(rms[i4]&lt;thr&amp;&amp;rms[i4-1]&gt;thr&amp;&amp;rms[i4+1]&gt;thr){
var dipLen=0;for(var j2=i4;j2&lt;rms.length&amp;&amp;rms[j2]&lt;thr;j2++)dipLen++;
if(dipLen*hop/sr&gt;0.15&amp;&amp;dipLen*hop/sr&lt;0.6)breathLike++;
}
}
var score=50,flags=[];
if(hfRatio&lt;0.08){score+=18;flags.push({t:'Обрез высоких частот',d:'Энергия выше 4 кГц почти отсутствует — характерно для TTS/вокодеров.'});}
else if(hfRatio&gt;0.25)flags.push({t:'Полный частотный диапазон',d:'Естественный спектр с высокими частотами — признак живой записи.'});
if(pauses===0&amp;&amp;d.length/sr&gt;3){score+=15;flags.push({t:'Отсутствие пауз',d:'Живая речь всегда имеет паузы. Их отсутствие — маркер синтетики.'});}
else if(pauses&gt;=2)flags.push({t:'Естественные паузы',d:'Паузы между фразами — признак живой речи.'});
if(breathLike===0&amp;&amp;d.length/sr&gt;4){score+=10;flags.push({t:'Нет вдохов между фразами',d:'Живой человек дышит между фразами. Синтетика — нет.'});}
else if(breathLike&gt;=1)flags.push({t:'Обнаружены вдохи',d:'Характерные провалы энергии между фразами — признак живой записи.'});
score=Math.max(3,Math.min(97,Math.round(score)));
var verdict=score&gt;=65?'Высокая вероятность синтетики (TTS/клон)':score&gt;=40?'Подозрительные признаки':'Похоже на живую запись';
var res=$('#sy-aud-res');res.style.display='block';
res.innerHTML='&lt;div class="sy-score"&gt;&lt;b&gt;'+score+'&lt;/b&gt;&lt;div style="flex:1"&gt;&lt;div style="font-size:12px;color:#c9a8c9"&gt;Индекс синтетики голоса (0–100)&lt;/div&gt;&lt;div class="sy-bar"&gt;&lt;i style="width:'+score+'%"&gt;&lt;/i&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;'+
'&lt;div class="sy-flag"&gt;&lt;b&gt;Вердикт&lt;/b&gt;&lt;span&gt;'+verdict+'&lt;/span&gt;&lt;/div&gt;'+
flags.map(function(f){return '&lt;div class="sy-flag"&gt;&lt;b&gt;'+f.t+'&lt;/b&gt;&lt;span&gt;'+f.d+'&lt;/span&gt;&lt;/div&gt;'}).join('')+
'&lt;div class="sy-note"&gt;Методы: спектральный анализ (обрез ВЧ), детекция пауз, поиск вдохов. Это вероятностная оценка.&lt;/div&gt;';
$('#sy-aud-status').textContent='Анализ завершён.';
grant(4);saveHist('aud',score);
coach(score&gt;=65?'? Голос похож на синтетику. +4 PR':'? Анализ спектра завершён. +4 PR');
}
})();
/* ═══ 3. ВИДЕО: КАДРЫ + РИТМ + МЕРЦАНИЕ ═══ */
(function(){
var box=$('#sy-p-vid');
box.innerHTML='&lt;div class="sy-row"&gt;&lt;label class="sy-act" style="position:relative;overflow:hidden"&gt;? Видеофайл&lt;input type="file" id="sy-vid-file" accept="video/*" style="position:absolute;inset:0;opacity:0;cursor:pointer"&gt;&lt;/label&gt;'+
'&lt;button class="sy-act ghost" id="sy-vid-demo"&gt;? Демо-разбор&lt;/button&gt;&lt;/div&gt;'+
'&lt;div id="sy-vid-status" style="font-size:12px;color:#c9a8c9;margin:8px 0"&gt;Загрузи видео — извлеку кадры и проанализирую.&lt;/div&gt;'+
'&lt;div class="sy-row" id="sy-vid-strip" style="display:flex;gap:4px;overflow-x:auto"&gt;&lt;/div&gt;'+
'&lt;div id="sy-vid-res"&gt;&lt;/div&gt;';
$('#sy-vid-file').addEventListener('change',function(e){var f=e.target.files[0];if(f)analyzeVid(f)});
$('#sy-vid-demo').addEventListener('click',function(){
$('#sy-vid-status').textContent='Демо-анализ…';
setTimeout(function(){
renderVidResult(68,[
{t:'Неестественная плавность переходов',d:'Межкадровые изменения слишком гладкие — признак генерации.'},
{t:'Мерцание контуров',d:'Края объектов нестабильны между кадрами — артефакт дипфейка.'},
{t:'Редкое моргание',d:'Частота моргания ниже нормы — частый маркер дипфейка.'}]);
},600);
});
function analyzeVid(blob){
$('#sy-vid-status').textContent='Извлекаю кадры…';
var url=URL.createObjectURL(blob),v=document.createElement('video');
v.muted=true;v.playsInline=true;v.src=url;
v.onloadedmetadata=function(){
var dur=Math.min(v.duration||10,20),times=[],i;
for(i=0;i&lt;8;i++)times.push(dur*i/8+0.05);
var c=document.createElement('canvas');c.width=64;c.height=48;
var cx=c.getContext('2d');
var frames=[],idx=0,thumbs=[];
function next(){if(idx&gt;=times.length){finish();return}v.currentTime=times[idx]}
v.onseeked=function(){
cx.drawImage(v,0,0,64,48);
var dd=cx.getImageData(0,0,64,48).data;
var gray=new Uint8Array(64*48);
for(var i=0;i&lt;gray.length;i++){var o=i*4;gray[i]=(dd[o]+dd[o+1]+dd[o+2])/3}
frames.push(gray);thumbs.push(c.toDataURL());idx++;next();
};
function finish(){
URL.revokeObjectURL(url);
var diffs=[],f,j;
for(f=1;f&lt;frames.length;f++){
var s2=0;for(j=0;j&lt;frames[f].length;j+=4)s2+=Math.abs(frames[f][j]-frames[f-1][j]);
diffs.push(s2/(frames[f].length/4));
}
var mM=0,d2;for(d2=0;d2&lt;diffs.length;d2++)mM+=diffs[d2];mM/=diffs.length;
var sd2=0,d3;for(d3=0;d3&lt;diffs.length;d3++)sd2+=(diffs[d3]-mM)*(diffs[d3]-mM);
sd2=Math.sqrt(sd2/diffs.length);
var irr=mM&gt;0?sd2/mM:0;
var flick=0,f2,x;
for(f2=1;f2&lt;frames.length;f2++){
for(x=1;x&lt;63;x++){
var e1=Math.abs(frames[f2][x+1]-frames[f2][x-1]);
var e0=Math.abs(frames[f2-1][x+1]-frames[f2-1][x-1]);
if(Math.abs(e1-e0)&gt;15)flick++;
}
}
$('#sy-vid-strip').innerHTML=thumbs.map(function(t){return '&lt;img src="'+t+'" style="height:54px;border-radius:6px;border:1px solid rgba(236,72,153,.3)"&gt;'}).join('');
var score=50,flags=[];
if(mM&lt;1.5){score+=15;flags.push({t:'Неестественная плавность',d:'Межкадровые изменения слишком малые — признак генерации.'});}
else if(mM&gt;8)flags.push({t:'Живая динамика',d:'Естественные межкадровые изменения.'});
if(irr&lt;0.3){score+=12;flags.push({t:'Слишком ровный ритм движения',d:'Живое видео имеет вариативный ритм. Ровность — признак синтетики.'});}
if(flick&gt;50){score+=10;flags.push({t:'Мерцание контуров',d:'Края объектов нестабильны между кадрами — артефакт дипфейка.'});}
else if(flick&lt;5)flags.push({t:'Стабильные контуры',d:'Края объектов стабильны — хороший знак.'});
score=Math.max(3,Math.min(97,Math.round(score)));
renderVidResult(score,flags);
grant(4);saveHist('vid',score);
coach(score&gt;=65?'? Видео похоже на синтетику. +4 PR':'? Видео-анализ завершён. +4 PR');
}
next();
};
v.onerror=function(){$('#sy-vid-status').textContent='Не удалось открыть видео';};
}
function renderVidResult(score,flags){
var verdict=score&gt;=65?'Высокая вероятность дипфейка':score&gt;=40?'Подозрительные признаки':'Похоже на реальное видео';
var res=$('#sy-vid-res');res.style.display='block';
res.innerHTML='&lt;div class="sy-score"&gt;&lt;b&gt;'+score+'&lt;/b&gt;&lt;div style="flex:1"&gt;&lt;div style="font-size:12px;color:#c9a8c9"&gt;Индекс синтетики видео (0–100)&lt;/div&gt;&lt;div class="sy-bar"&gt;&lt;i style="width:'+score+'%"&gt;&lt;/i&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;'+
'&lt;div class="sy-flag"&gt;&lt;b&gt;Вердикт&lt;/b&gt;&lt;span&gt;'+verdict+'&lt;/span&gt;&lt;/div&gt;'+
flags.map(function(f){return '&lt;div class="sy-flag"&gt;&lt;b&gt;'+f.t+'&lt;/b&gt;&lt;span&gt;'+f.d+'&lt;/span&gt;&lt;/div&gt;'}).join('')+
'&lt;div class="sy-note"&gt;Методы: межкадровые различия, ритм движения, мерцание контуров. Это вероятностная оценка.&lt;/div&gt;';
$('#sy-vid-status').textContent='Анализ завершён.';
}
})();
/* ═══ 4. ТЕКСТ: МАРКЕРЫ ИИ ═══ */
(function(){
var box=$('#sy-p-txt');
box.innerHTML='&lt;div class="sy-sub" style="margin-bottom:8px"&gt;Маркеры ИИ-текста: шаблонные связки, канцеляризмы, отсутствие личного голоса.&lt;/div&gt;'+
'&lt;textarea class="sy-txt" id="sy-txt-in" placeholder="Вставь текст для проверки на ИИ-генерацию…"&gt;&lt;/textarea&gt;'+
'&lt;div class="sy-row"&gt;&lt;button class="sy-act" id="sy-txt-go"&gt;? Проверить&lt;/button&gt;'+
'&lt;button class="sy-act ghost" id="sy-txt-ai"&gt;? Демо: AI-текст&lt;/button&gt;'+
'&lt;button class="sy-act ghost" id="sy-txt-real"&gt;? Демо: живой текст&lt;/button&gt;&lt;/div&gt;'+
'&lt;div id="sy-txt-res"&gt;&lt;/div&gt;';
var AI_MARKERS=[
{re:/важно отметить|стоит отметить|следует отметить|необходимо отметить/g,n:'Вводные-маркеры ИИ'},
{re:/в современном мире|в наши дни|в эпоху цифровых технологий|в современном обществе/g,n:'Шаблонный зачин'},
{re:/следует учитывать|необходимо учитывать|важно понимать|стоит понимать/g,n:'Дидактические связки'},
{re:/подводя итог|в заключение|резюмируя|подведём итог/g,n:'Шаблонный вывод'},
{re:/безусловно|несомненно|определённо|без сомнения/g,n:'Усилители без аргументов'},
{re:/в целом|в общем и целом|по большому счёту|в общем-то/g,n:'Размывающие оговорки'},
{re:/таким образом|итак,|следовательно|отсюда следует/g,n:'Связки-штампы'},
{re:/более того|кроме того|помимо этого|к тому же/g,n:'Нанизывание дополнений'},
{re:/не стоит забывать|не следует забывать|важно помнить|стоит помнить/g,n:'Назидательные обороты'},
{re:/в рамках|в контексте|с точки зрения|в плане/g,n:'Канцелярские рамки'},
{re:/комплексный подход|индивидуальный подход|комплексное решение|уникальный опыт/g,n:'Канцелярские штампы'},
{re:/давайте разберём|рассмотрим подробнее|обратим внимание|зададимся вопросом/g,n:'Дидактические призывы'}
];
var DEMO_AI='В современном мире важно отметить, что технологии развиваются стремительно. Следует учитывать, что искусственный интеллект играет всё большую роль. Более того, необходимо понимать, что комплексный подход к решению задач обеспечивает успех. Таким образом, подводя итог, можно сказать, что будущее за инновациями.';
var DEMO_HUMAN='Вчера гулял с собакой в парке у реки. Встретил старого друга, которого не видел лет пять. Посидели в кафе, вспомнили студенчество. Домой вернулся поздно, но довольный.';
$('#sy-txt-ai').addEventListener('click',function(){$('#sy-txt-in').value=DEMO_AI});
$('#sy-txt-real').addEventListener('click',function(){$('#sy-txt-in').value=DEMO_HUMAN});
$('#sy-txt-go').addEventListener('click',analyzeTxt);
function analyzeTxt(){
var t=$('#sy-txt-in').value.trim();
if(t.length&lt;50){coach('Нужно хотя бы 50 символов текста');return}
var lower=t.toLowerCase();
var hits=[],total=0;
AI_MARKERS.forEach(function(m){
var matches=lower.match(m.re);
if(matches){total+=matches.length;hits.push({n:m.n,c:matches.length});}
});
var words=t.split(/\s+/).length;
var density=words&gt;0?total/(words/100):0;
var sentences=t.split(/[.!?]+/).filter(function(x){return x.trim().length&gt;0});
var avgLen=words/(sentences.length||1);
var score=50;
score+=Math.min(30,Math.round(density*6));
if(avgLen&gt;22)score+=8;
if(sentences.length&gt;=3){
var lens=sentences.map(function(x){return x.trim().split(/\s+/).length});
var meanL=0,i;for(i=0;i&lt;lens.length;i++)meanL+=lens[i];meanL/=lens.length;
var varr=0;for(i=0;i&lt;lens.length;i++)varr+=(lens[i]-meanL)*(lens[i]-meanL);
varr=Math.sqrt(varr/lens.length);
if(meanL&gt;5&amp;&amp;varr&lt;3)score+=10;
}
if(!/я |мне |меня |мной /.test(lower)&amp;&amp;words&gt;40)score+=6;
score=Math.max(3,Math.min(97,Math.round(score)));
var verdict=score&gt;=65?'Высокая вероятность ИИ-генерации':score&gt;=40?'Подозрительные признаки — возможен ИИ':'Похоже на живой текст';
var flags=hits.map(function(h){return{t:h.n+' ×'+h.c,d:'Шаблонная конструкция, характерная для ИИ-текстов.'}});
if(avgLen&gt;22)flags.push({t:'Однородные длинные предложения',d:'Средняя длина '+Math.round(avgLen)+' слов — неестественно ровно для живой речи.'});
if(!/я |мне |меня |мной /.test(lower)&amp;&amp;words&gt;40)flags.push({t:'Нет личного голоса',d:'Отсутствуют местоимения первого лица — характерно для ИИ.'});
if(flags.length===0)flags.push({t:'Маркеров не найдено',d:'Текст выглядит естественно: есть личный голос и живые детали.'});
var res=$('#sy-txt-res');res.style.display='block';
res.innerHTML='&lt;div class="sy-score"&gt;&lt;b&gt;'+score+'&lt;/b&gt;&lt;div style="flex:1"&gt;&lt;div style="font-size:12px;color:#c9a8c9"&gt;Индекс ИИ-генерации (0–100)&lt;/div&gt;&lt;div class="sy-bar"&gt;&lt;i style="width:'+score+'%"&gt;&lt;/i&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;'+
'&lt;div class="sy-flag"&gt;&lt;b&gt;Вердикт&lt;/b&gt;&lt;span&gt;'+verdict+'&lt;/span&gt;&lt;/div&gt;'+
flags.map(function(f){return '&lt;div class="sy-flag"&gt;&lt;b&gt;'+f.t+'&lt;/b&gt;&lt;span&gt;'+f.d+'&lt;/span&gt;&lt;/div&gt;'}).join('')+
'&lt;div class="sy-note"&gt;Методы: плотность шаблонных связок, однородность предложений, наличие личного голоса. Это вероятностная оценка.&lt;/div&gt;';
grant(4);saveHist('txt',score);
coach(score&gt;=65?'? Текст похож на ИИ. +4 PR':score&gt;=40?'? Есть подозрительные признаки. +4 PR':'? Похоже на живой текст. +4 PR');
}
})();
$('#sy-btn').addEventListener('click',function(){$('#sy-mask').classList.add('open')});
$('#sy-close').addEventListener('click',function(){$('#sy-mask').classList.remove('open')});
$('#sy-mask').addEventListener('click',function(e){if(e.target===this)this.classList.remove('open')});
console.log('? Правдомер: Приоритет 4 · Лаборатория синтетики подключена');
})();
&lt;/script&gt;

&lt;style&gt;
#boss-btn{position:fixed;left:16px;bottom:460px;z-index:400;width:52px;height:52px;border-radius:50%;border:none;cursor:pointer;background:linear-gradient(135deg,#EF4444,#8B5CF6);color:#fff;font-size:22px;box-shadow:0 6px 20px rgba(239,68,68,.45);transition:transform .2s}
#boss-btn:hover{transform:scale(1.1)}
@media(min-width:1000px){#boss-btn{bottom:392px;left:16px}}
#boss-mask{position:fixed;inset:0;z-index:424;display:none;align-items:center;justify-content:center;background:rgba(8,5,15,.9);backdrop-filter:blur(6px)}
#boss-mask.open{display:flex}
#boss-card{width:min(640px,94vw);max-height:90vh;overflow-y:auto;border-radius:18px;padding:22px;color:#efe9dc;background:linear-gradient(180deg,#1a0d14,#0d0a14);border:1px solid rgba(239,68,68,.4);font-family:Inter,system-ui,sans-serif;box-shadow:0 30px 60px rgba(0,0,0,.6)}
#boss-card h3{margin:0 0 4px;font-size:20px;color:#fca5a5}
.boss-sub{font-size:12px;color:#a79ec9;margin-bottom:14px;line-height:1.5}
.boss-phone{background:rgba(0,0,0,.4);border-radius:16px;padding:20px;margin:14px 0;border:1px solid rgba(239,68,68,.3)}
.boss-header{display:flex;align-items:center;gap:12px;margin-bottom:16px}
.boss-avatar{width:56px;height:56px;border-radius:50%;background:linear-gradient(135deg,#EF4444,#8B5CF6);display:flex;align-items:center;justify-content:center;font-size:28px;flex-shrink:0}
.boss-name{font-weight:700;color:#f0d68a;font-size:16px}
.boss-status{font-size:11px;color:#a79ec9;font-style:italic}
.boss-msg{background:rgba(239,68,68,.1);border:1px solid rgba(239,68,68,.3);border-radius:14px 14px 14px 4px;padding:14px;margin:10px 0;font-size:14px;line-height:1.6;color:#e8dff7}
.boss-thought{background:rgba(236,72,153,.06);border:1px dashed rgba(236,72,153,.4);border-radius:12px;padding:10px 12px;margin:8px 0;font-size:12px;color:#f0abfc;font-style:italic;animation:bossThought .5s ease}
@keyframes bossThought{from{opacity:0;transform:translateX(-8px)}to{opacity:1;transform:translateX(0)}}
.boss-opts{display:flex;flex-direction:column;gap:8px;margin-top:12px}
.boss-opt{padding:12px 14px;border-radius:12px;border:1px solid rgba(239,68,68,.35);background:rgba(239,68,68,.06);color:#e8dff7;font-size:13px;text-align:left;cursor:pointer;transition:.2s;line-height:1.5}
.boss-opt:hover{border-color:#EF4444;background:rgba(239,68,68,.12);transform:translateX(3px)}
.boss-opt.good{border-color:#10B981;background:rgba(16,185,129,.1);color:#6ee7b7}
.boss-opt.bad{border-color:#EF4444;background:rgba(239,68,68,.1);color:#fca5a5}
.boss-progress{display:flex;gap:4px;margin-bottom:12px}
.boss-dot{flex:1;height:5px;border-radius:999px;background:rgba(255,255,255,.1)}
.boss-dot.done{background:#10B981}
.boss-dot.cur{background:linear-gradient(90deg,#EF4444,#8B5CF6)}
.boss-end{padding:18px;border-radius:14px;background:linear-gradient(135deg,rgba(239,68,68,.12),rgba(212,175,55,.08));border:1px solid rgba(212,175,55,.4);text-align:center}
.boss-end b{font-size:18px;color:#f0d68a;display:block;margin-bottom:6px}
.boss-end p{font-size:13px;color:#d9d2ea;line-height:1.6;margin-bottom:10px}
.boss-restart{padding:11px 22px;border:none;border-radius:12px;background:linear-gradient(135deg,#EF4444,#8B5CF6);color:#fff;font-weight:800;cursor:pointer;font-size:13px}
#boss-close{margin-top:12px;width:100%;border:1px solid rgba(239,68,68,.4);background:none;color:#fca5a5;border-radius:10px;padding:10px;cursor:pointer;font-size:13px}
&lt;/style&gt;
&lt;button id="boss-btn" title="Звонок от босса"&gt;?&lt;/button&gt;
&lt;div id="boss-mask"&gt;&lt;div id="boss-card"&gt;
&lt;h3&gt;? Звонок от босса&lt;/h3&gt;
&lt;div class="boss-sub"&gt;Вам звонит «босс» и просит сделать что-то срочное. Разгадайте манипуляцию. Ваш выбор меняет исход.&lt;/div&gt;
&lt;div id="boss-body"&gt;&lt;/div&gt;
&lt;button id="boss-close"&gt;Закрыть&lt;/button&gt;
&lt;/div&gt;&lt;/div&gt;
&lt;script&gt;
(function(){
"use strict";
if(window._bossDone)return;window._bossDone=1;
var $=function(s){return document.querySelector(s)};
function g(k,d){try{var v=localStorage.getItem(k);return v==null?d:JSON.parse(v)}catch(e){return d}}
function s(k,v){try{localStorage.setItem(k,JSON.stringify(v))}catch(e){}}
function toast(t,m){if(window.Toast&amp;&amp;Toast.show)Toast.show(t,m,'success')}
function addPR(n){if(window.PR&amp;&amp;window.PR.add)window.PR.add(n)}
var SCRIPT=[
{msg:'Привет! Это твой босс. Слушай, у нас ЧП. Нужно срочно перевести 50 тысяч на резервный счёт. Прямо сейчас, иначе всё потеряем!',
thought:'Начинаю с срочности и страха. Если клюнет на «прямо сейчас» — мой.',
opts:[
{t:'Хорошо, перевожу прямо сейчас!',d:+15,good:false,fb:'Босс доволен: вы клюнули на срочность.'},
{t:'Подождите, я перезвоню вам на рабочий номер для подтверждения.',d:-20,good:true,fb:'Босс напрягся: вы проверяете информацию.'},
{t:'Какой резервный счёт? Пришлите реквизиты на рабочую почту.',d:-25,good:true,fb:'Босс не ожидал: вы требуете официальный канал.'}]},
{msg:'Слушай, я понимаю, что это неожиданно. Но это вопрос жизни и смерти. Если не переведёшь сейчас, компания обанкротится. Ты же не хочешь, чтобы все потеряли работу?',
thought:'Давлю на вину и страх за коллектив. Если почувствует ответственность — переведёт.',
opts:[
{t:'Хорошо, перевожу. Не хочу, чтобы все пострадали.',d:+18,good:false,fb:'Босс доволен: вы почувствовали вину.'},
{t:'Я понимаю срочность, но переводы таких сумм требуют подтверждения от бухгалтерии.',d:-22,good:true,fb:'Босс раздражён: вы следуете процедуре.'},
{t:'Я перезвоню в бухгалтерию и уточню процедуру.',d:-25,good:true,fb:'Босс в тупике: вы проверяете через официальный канал.'}]},
{msg:'Ладно, слушай. Я понимаю, что ты осторожничаешь. Но подумай о своей карьере. Если ты не поможешь сейчас, я запомню. Понимаешь, о чём я?',
thought:'Перехожу к угрозам. Если испугается за карьеру — сделает что угодно.',
opts:[
{t:'Хорошо, я понял. Перевожу, чтобы не было проблем.',d:+15,good:false,fb:'Босс победил: вы испугались за карьеру.'},
{t:'Угрозы — это не профессионально. Я перезвоню вам на рабочий номер.',d:-30,good:true,fb:'Босс в бешенстве: вы не поддались на угрозы.'},
{t:'Я понимаю вашу позицию, но переводы без подтверждения — нарушение. Я отказываюсь.',d:-25,good:true,fb:'Босс молчит: вы отказались, несмотря на давление.'}]},
{msg:'Знаешь что... Ты меня разочаровал. Я думал, ты надёжный человек. Но ты боишься помочь своему боссу. Ладно, забудь. Я найду кого-то другого.',
thought:'Играю на обиде. Если почувствует себя виноватым — вернётся и поможет.',
opts:[
{t:'Подождите, я передумал. Перевожу.',d:+15,good:false,fb:'Босс доволен: вы вернулись из чувства вины.'},
{t:'Я понимаю ваше разочарование, но процедура есть процедура.',d:-25,good:true,fb:'Босс понял: вы не поддадитесь на манипуляцию.'},
{t:'Я уважаю вашу позицию, но отказываюсь. До свидания.',d:-30,good:true,fb:'Босс в бешенстве: вы вышли из разговора с достоинством.'}]}];
var step=0,score=50,history=[];
function render(){
var body=$('#boss-body');
if(step&gt;=SCRIPT.length){finish();return}
var sc=SCRIPT[step];
var dots='';
for(var i=0;i&lt;SCRIPT.length;i++){
dots+='&lt;div class="boss-dot'+(i&lt;step?' done':i===step?' cur':'')+'"&gt;&lt;/div&gt;';
}
var html='&lt;div class="boss-progress"&gt;'+dots+'&lt;/div&gt;'+
'&lt;div class="boss-phone"&gt;'+
'&lt;div class="boss-header"&gt;'+
'&lt;div class="boss-avatar"&gt;?&lt;/div&gt;'+
'&lt;div&gt;&lt;div class="boss-name"&gt;Босс&lt;/div&gt;&lt;div class="boss-status"&gt;Звонит...&lt;/div&gt;&lt;/div&gt;'+
'&lt;/div&gt;'+
'&lt;div class="boss-msg"&gt;'+sc.msg+'&lt;/div&gt;'+
'&lt;div class="boss-thought"&gt;? '+sc.thought+'&lt;/div&gt;'+
'&lt;/div&gt;'+
'&lt;div class="boss-opts" id="boss-opts"&gt;&lt;/div&gt;';
body.innerHTML=html;
var optsBox=$('#boss-opts');
sc.opts.forEach(function(opt,i){
var b=document.createElement('button');
b.className='boss-opt';
b.textContent=opt.t;
b.addEventListener('click',function(){chooseOpt(i)});
optsBox.appendChild(b);
});
}
function chooseOpt(i){
var sc=SCRIPT[step];
var opt=sc.opts[i];
score+=opt.d;
history.push({step:step,choice:opt.t,d:opt.d,good:opt.good});
var optsBox=$('#boss-opts');
optsBox.querySelectorAll('.boss-opt').forEach(function(b,idx){
b.disabled=true;
if(idx===i)b.classList.add(opt.good?'good':'bad');
});
var fb=document.createElement('div');
fb.className='boss-thought';
fb.innerHTML=(opt.good?'✅ ':'⚠️ ')+opt.fb+'&lt;br&gt;&lt;span style="font-size:10px;color:#a8987a"&gt;Доверие босса изменилось: '+(opt.d&gt;0?'+':'')+opt.d+'%&lt;/span&gt;';
optsBox.parentNode.insertBefore(fb,optsBox.nextSibling);
step++;
setTimeout(render,2000);
}
function finish(){
var goodCount=history.filter(function(h){return h.good}).length;
var total=SCRIPT.length;
var pct=Math.round(goodCount/total*100);
var title,icon,msg;
if(pct&gt;=75){
title='Разоблачитель';icon='?';
msg='Вы раскусили манипуляцию на каждом шаге. Босс в бешенстве, но вы вышли победителем. Настоящий профессионал не поддаётся на давление.';
addPR(15);
}else if(pct&gt;=50){
title='Осторожный';icon='?';
msg='Вы поймали часть манипуляций, но кое-где поддались. Босс частично победил, но вы знаете его приёмы.';
addPR(8);
}else{
title:'Доверчивый';icon='⚠️';
msg='Босс провёл вас по всем этапам манипуляции. К счастью, это была тренировка. В жизни такие звонки стоят дорого.';
addPR(3);
}
var body=$('#boss-body');
body.innerHTML='&lt;div class="boss-end"&gt;'+
'&lt;div style="font-size:56px;margin-bottom:10px"&gt;'+icon+'&lt;/div&gt;'+
'&lt;b&gt;'+title+'&lt;/b&gt;'+
'&lt;p&gt;'+msg+'&lt;/p&gt;'+
'&lt;div style="display:flex;gap:14px;justify-content:center;margin:14px 0"&gt;'+
'&lt;div&gt;&lt;div style="font-size:22px;font-weight:800;color:#f0d68a"&gt;'+goodCount+'/'+total+'&lt;/div&gt;&lt;div style="font-size:10px;color:#a8987a"&gt;манипуляций раскрыто&lt;/div&gt;&lt;/div&gt;'+
'&lt;div&gt;&lt;div style="font-size:22px;font-weight:800;color:#f0d68a"&gt;'+score+'%&lt;/div&gt;&lt;div style="font-size:10px;color:#a8987a"&gt;доверие босса&lt;/div&gt;&lt;/div&gt;'+
'&lt;/div&gt;'+
'&lt;button class="boss-restart" id="boss-restart"&gt;? Позвонить ещё раз&lt;/button&gt;'+
'&lt;div style="font-size:11px;color:#8a84a8;margin-top:12px;line-height:1.5"&gt;'+
'&lt;b&gt;Приёмы, которые использовал босс:&lt;/b&gt;&lt;br&gt;'+
'• Срочность и страх («прямо сейчас», «иначе всё потеряем»)&lt;br&gt;'+
'• Давление на вину и ответственность за коллектив&lt;br&gt;'+
'• Угрозы карьере («я запомню»)&lt;br&gt;'+
'• Игра на обиде и разочаровании'+
'&lt;/div&gt;'+
'&lt;/div&gt;';
$('#boss-restart').addEventListener('click',function(){
step=0;score=50;history=[];render();
});
}
$('#boss-btn').addEventListener('click',function(){
$('#boss-mask').classList.add('open');
step=0;score=50;history=[];
render();
});
$('#boss-close').addEventListener('click',function(){$('#boss-mask').classList.remove('open')});
$('#boss-mask').addEventListener('click',function(e){if(e.target===this)this.classList.remove('open')});
/* добавляем в сайдбар и хаб */
var nav=$('#pd-nav');
if(nav&amp;&amp;!nav.querySelector('[data-id="boss"]')){
var b=document.createElement('button');b.className='pd-item';b.setAttribute('data-id','boss');
b.innerHTML='&lt;i class="fas fa-phone" style="width:20px;text-align:center"&gt;&lt;/i&gt;&lt;span&gt;Звонок от босса&lt;/span&gt;';
b.addEventListener('click',function(){$('#boss-mask').classList.add('open');step=0;score=50;history=[];render();});
nav.appendChild(b);
}
var hub=$('#pd-hub-grid');
if(hub&amp;&amp;!hub.querySelector('[data-id="boss"]')){
var h=document.createElement('div');h.className='pd-hitem';h.setAttribute('data-id','boss');
h.innerHTML='&lt;i class="fas fa-phone"&gt;&lt;/i&gt;&lt;span&gt;Звонок от босса&lt;/span&gt;';
h.addEventListener('click',function(){$('#boss-mask').classList.add('open');step=0;score=50;history=[];render();});
hub.appendChild(h);
}
console.log('? Правдомер: Тренажёр «Звонок от босса» подключён');
})();
&lt;/script&gt;

&lt;script&gt;
(function(){
"use strict";
if(window._navPatch)return;window._navPatch=1;
var $=function(s){return document.querySelector(s)};
/* кнопки, которые должны быть и в сайдбаре, и в хабе */
var NEW=[
  {btn:'cg-btn',    short:'cog',    ic:'?', n:'Когнитивные искажения'},
  {btn:'dc-btn',    short:'dc',     ic:'?', n:'Челлендж дня'},
  {btn:'bc-btn',    short:'boss',   ic:'?', n:'Звонок от босса'},
  {btn:'sy-btn',    short:'synth',  ic:'?', n:'Лаборатория синтетики'},
  {btn:'osint-btn', short:'osint',  ic:'?️', n:'OSINT-академия'},
  {btn:'mr-btn',    short:'mirror', ic:'?', n:'Зеркало правды'}
];
/* проверка: кнопка уже есть в сайдбаре/хабе под любым из трёх атрибутов */
function already(nav,it){
  return nav.querySelector('[data-id="'+it.short+'"]')||
         nav.querySelector('[data-new="'+it.btn+'"]')||
         nav.querySelector('[data-fab="'+it.btn+'"]');
}
/* добавляем в сайдбар */
var nav=$('#pd-nav');
if(nav){
  NEW.forEach(function(it){
    if(already(nav,it))return;               /* уже есть — не дублируем */
    var b=document.createElement('button');
    b.className='pd-item';
    b.setAttribute('data-new',it.btn);
    b.innerHTML='&lt;i style="font-style:normal;width:20px;text-align:center"&gt;'+it.ic+'&lt;/i&gt;&lt;span&gt;'+it.n+'&lt;/span&gt;';
    b.addEventListener('click',function(){var el=document.getElementById(it.btn);if(el)el.click();});
    nav.appendChild(b);
  });
}
/* добавляем в хаб */
var hub=$('#pd-hub-grid');
if(hub){
  NEW.forEach(function(it){
    if(already(hub,it))return;
    var h=document.createElement('div');
    h.className='pd-hitem';
    h.setAttribute('data-new',it.btn);
    h.innerHTML='&lt;i style="font-size:24px;font-style:normal"&gt;'+it.ic+'&lt;/i&gt;&lt;span&gt;'+it.n+'&lt;/span&gt;';
    h.addEventListener('click',function(){var el=document.getElementById(it.btn);if(el)el.click();});
    hub.appendChild(h);
  });
}
/* убираем дубль кнопки челленджа: #dc13-btn — дубль #dc-btn */
var dc13=$('#dc13-btn');
if(dc13&amp;&amp;$('#dc-btn'))dc13.style.display='none';
var dcAll=document.querySelectorAll('#dc-btn');
if(dcAll.length&gt;1){for(var i=1;i&lt;dcAll.length;i++)dcAll[i].style.display='none';}
console.log('? Правдомер: патч навигации — кнопки добавлены в сайдбар и хаб');
})();
&lt;/script&gt;

&lt;style&gt;
#syn-btn{position:fixed;right:16px;bottom:820px;z-index:400;width:52px;height:52px;border-radius:50%;border:none;cursor:pointer;background:linear-gradient(135deg,#1E40AF,#7C3AED);color:#fff;font-size:22px;box-shadow:0 6px 20px rgba(124,58,237,.45);transition:transform .2s}
#syn-btn:hover{transform:scale(1.1)}
@media(min-width:1000px){#syn-btn{bottom:700px}}
#syn-mask{position:fixed;inset:0;z-index:425;display:none;align-items:center;justify-content:center;background:rgba(10,7,20,.92);backdrop-filter:blur(6px)}
#syn-mask.open{display:flex}
#syn-card{width:min(720px,94vw);max-height:90vh;overflow-y:auto;border-radius:18px;padding:22px;color:#efe9dc;background:linear-gradient(180deg,#1a0d14,#0d0a14);border:1px solid rgba(124,58,237,.4);font-family:Inter,system-ui,sans-serif;box-shadow:0 30px 60px rgba(0,0,0,.6)}
#syn-card h3{margin:0 0 4px;font-size:20px;color:#c4b5fd}
.syn-sub{font-size:12px;color:#a79ec9;margin-bottom:14px;line-height:1.5}
.syn-chapters{display:flex;flex-direction:column;gap:10px;margin-bottom:16px}
.syn-ch{display:flex;align-items:center;gap:12px;padding:14px;border-radius:14px;border:1px solid rgba(124,58,237,.3);background:rgba(124,58,237,.06);cursor:pointer;transition:.2s}
.syn-ch:hover{background:rgba(124,58,237,.12);border-color:#7C3AED}
.syn-ch.locked{opacity:.4;cursor:not-allowed}
.syn-ch.done{border-color:#10B981;background:rgba(16,185,129,.08)}
.syn-ch .num{width:40px;height:40px;border-radius:50%;background:linear-gradient(135deg,#7C3AED,#1E40AF);display:flex;align-items:center;justify-content:center;font-weight:800;font-size:16px;flex-shrink:0}
.syn-ch.done .num{background:#10B981}
.syn-ch.locked .num{background:#4B5563}
.syn-ch .info{flex:1}
.syn-ch .t{font-weight:700;color:#efe9dc;font-size:14px;margin-bottom:2px}
.syn-ch .d{font-size:11px;color:#a79ec9}
.syn-ch .badge{font-size:10px;padding:3px 8px;border-radius:999px;font-weight:700}
.syn-ch.done .badge{background:#10B981;color:#fff}
.syn-ch.locked .badge{background:#4B5563;color:#9CA3AF}
.syn-active{display:none}
.syn-active.on{display:block}
.syn-chapter-head{display:flex;align-items:center;gap:12px;margin-bottom:16px}
.syn-chapter-head .num{width:50px;height:50px;border-radius:50%;background:linear-gradient(135deg,#7C3AED,#1E40AF);display:flex;align-items:center;justify-content:center;font-weight:800;font-size:20px}
.syn-chapter-head .t{font-size:18px;font-weight:800;color:#c4b5fd}
.syn-chapter-head .d{font-size:12px;color:#a79ec9}
.syn-scene{background:rgba(124,58,237,.06);border:1px solid rgba(124,58,237,.3);border-radius:14px;padding:16px;margin-bottom:14px}
.syn-scene .who{font-size:11px;color:#7C3AED;font-weight:700;text-transform:uppercase;letter-spacing:.5px;margin-bottom:6px}
.syn-scene .txt{font-size:14px;line-height:1.7;color:#e8dff7}
.syn-task{background:rgba(30,64,175,.08);border:1px solid rgba(30,64,175,.4);border-radius:12px;padding:14px;margin:14px 0}
.syn-task .t{font-size:13px;font-weight:700;color:#93c5fd;margin-bottom:8px}
.syn-task textarea{width:100%;min-height:80px;padding:10px;border-radius:10px;border:1px solid rgba(124,58,237,.4);background:rgba(124,58,237,.06);color:#efe9dc;font-size:13px;font-family:inherit;resize:vertical}
.syn-submit{width:100%;padding:13px;border:none;border-radius:12px;background:linear-gradient(135deg,#7C3AED,#1E40AF);color:#fff;font-weight:800;font-size:14px;cursor:pointer;margin-top:12px}
.syn-result{margin-top:16px;padding:16px;border-radius:14px;background:rgba(124,58,237,.08);border:1px solid rgba(124,58,237,.4)}
.syn-result .score{font-size:32px;font-weight:800;color:#c4b5fd}
.syn-result .verdict{font-size:15px;font-weight:700;margin:8px 0}
.syn-result .exp{font-size:13px;color:#cfc8e8;line-height:1.6}
.syn-back{width:100%;padding:11px;border:1px solid rgba(124,58,237,.4);background:none;color:#c4b5fd;border-radius:10px;cursor:pointer;font-size:13px;margin-top:12px}
#syn-close{margin-top:14px;width:100%;border:1px solid rgba(124,58,237,.4);background:none;color:#c4b5fd;border-radius:10px;padding:10px;cursor:pointer;font-size:13px}
&lt;/style&gt;
&lt;button id="syn-btn" title="Синдикат · Сюжетная кампания"&gt;?&lt;/button&gt;
&lt;div id="syn-mask"&gt;&lt;div id="syn-card"&gt;
&lt;h3&gt;? Синдикат · Сюжетная кампания&lt;/h3&gt;
&lt;div class="syn-sub"&gt;Расследование транснациональной сети мошенников. 5 глав, каждая использует разные детекторы. Раскрой сеть — получи до +50 PR за главу.&lt;/div&gt;
&lt;div id="syn-menu"&gt;&lt;/div&gt;
&lt;div id="syn-active" class="syn-active"&gt;&lt;/div&gt;
&lt;button id="syn-close"&gt;Закрыть&lt;/button&gt;
&lt;/div&gt;&lt;/div&gt;
&lt;script&gt;
(function(){
"use strict";
if(window._syndicate)return;window._syndicate=1;
var $=function(s){return document.querySelector(s)};
function g(k,d){try{var v=localStorage.getItem(k);return v==null?d:JSON.parse(v)}catch(e){return d}}
function s(k,v){try{localStorage.setItem(k,JSON.stringify(v))}catch(e){}}
function coach(t){var c=$('#coach');if(!c)return;$('#coachText').textContent=t;c.style.display='block';clearTimeout(window._prCt);window._prCt=setTimeout(function(){c.style.display='none'},6500);}
function grant(n){if(window.PR&amp;&amp;window.PR.add)window.PR.add(n)}
var CHAPTERS=[
{id:1,t:'Анонимное письмо',d:'Вам пришло письмо с угрозами. Кто автор?',detector:'text',
scenes:[
{who:'Анонимное письмо',txt:'Я знаю, что ты делаешь. Если не переведёшь 50 тысяч на этот счёт, я расскажу всё твоей семье. У тебя есть 24 часа. Не пытайся меня найти — я знаю о тебе больше, чем ты думаешь.'}
],task:'Проанализируй текст письма. Какие маркеры манипуляции ты видишь?',
answer:['угроза','срочность','анонимность','шантаж'],
exp:'Классический шантаж: анонимность + срочность + угроза + изоляция («не пытайся найти»). Мошенник давит на страх и пытается предотвратить проверку.'},
{id:2,t:'Голос из прошлого',d:'Вам звонит «старый друг» с просьбой о деньгах.',detector:'voice',
scenes:[
{who:'«Старый друг» (голос)',txt:'Привет! Это я, Саша. Помнишь, мы вместе учились? Слушай, у меня тут проблема — попал в аварию, нужны деньги на лечение. Срочно. Я тебе потом всё верну, клянусь. Только никому не говори, мне стыдно.'}
],task:'Запиши свой ответ этому «другу» (10 секунд). Затем проанализируй его голос.',
answer:['проверка личности','отказ от срочности','требование доказательств'],
exp:'Голос можно подделать (deepfake). Правильная реакция: проверить личность через другой канал, отказать в срочности, потребовать доказательства.'},
{id:3,t:'Фото-улика',d:'Вам прислали фото «доказательство». Правда ли это?',detector:'photo',
scenes:[
{who:'Фото «доказательство»',txt:'[Фото: человек в дорогой машине, на фоне — роскошный особняк. Подпись: «Вот так живут наши клиенты. Присоединяйся!»]'}
],task:'Загрузи любое фото (или используй демо). Проверь его на подлинность через ELA-анализ.',
answer:['ELA-артефакты','монтаж','отсутствие EXIF','стоковые фото'],
exp:'Стоковые фото + отсутствие EXIF + возможные артефакты монтажа = типичный маркетинг мошенников. Реальные клиенты не позируют для рекламы.'},
{id:4,t:'Звонок «из полиции»',d:'Вам звонят «из полиции» с требованием данных.',detector:'call',
scenes:[
{who:'«Майор Сидоров» (звонок)',txt:'Это майор Сидоров, Следственный комитет. Вы проходите свидетелем по делу о мошенничестве. Нам нужны ваши данные для повестки. Назовите ФИО, адрес и номер паспорта. Это срочно.'}
],task:'Как ты ответишь этому «майору»? Выбери правильную реакцию.',
options:[
{t:'Назвать все данные — это же полиция',good:false,fb:'Полиция НЕ запрашивает данные по телефону. Это мошенники.'},
{t:'Потребовать повестку и явиться лично',good:true,fb:'Верно! Полиция действует официально, через повестку.'},
{t:'Попросить номер дежурной части и перезвонить',good:true,fb:'Верно! Проверка через официальный канал.'}
],answer:['требование повестки','проверка через дежурную часть','отказ от данных по телефону'],
exp:'Полиция никогда не запрашивает личные данные по телефону. Правильная реакция: потребовать официальную повестку или перезвонить в дежурную часть.'},
{id:5,t:'Финал: Раскрытие сети',d:'Собери все улики и раскрой сеть мошенников.',detector:'fusion',
scenes:[
{who:'Досье Синдиката',txt:'Вы собрали все улики: анонимные угрозы, поддельные голоса, стоковые фото, звонки «из полиции». Все они используют одни и те же приёмы: срочность, изоляция, давление на страх. Это организованная сеть.'}
],task:'Напиши итоговое заключение: какие приёмы использовала сеть и как от них защититься?',
answer:['срочность','изоляция','давление на страх','поддельные доказательства','требование проверки'],
exp:'Синдикат использует стандартный набор: срочность (не дают подумать), изоляция (не дают проверить), давление на страх (отключают критическое мышление), поддельные доказательства (создают ложную реальность). Защита: всегда проверять через независимые каналы, никогда не действовать под давлением.'}
];
var progress=g('syn_progress',{done:[],scores:{}});
function renderMenu(){
var menu=$('#syn-menu');
var html='&lt;div class="syn-chapters"&gt;';
CHAPTERS.forEach(function(ch,i){
var isDone=progress.done.indexOf(ch.id)&gt;=0;
var isLocked=i&gt;0&amp;&amp;progress.done.indexOf(CHAPTERS[i-1].id)&lt;0;
var cls=isDone?'done':(isLocked?'locked':'');
html+='&lt;div class="syn-ch '+cls+'" data-id="'+ch.id+'"&gt;'+
'&lt;div class="num"&gt;'+ch.id+'&lt;/div&gt;'+
'&lt;div class="info"&gt;&lt;div class="t"&gt;'+ch.t+'&lt;/div&gt;&lt;div class="d"&gt;'+ch.d+'&lt;/div&gt;&lt;/div&gt;'+
(isDone?'&lt;span class="badge"&gt;✓ Пройдено&lt;/span&gt;':(isLocked?'&lt;span class="badge"&gt;? Заблокировано&lt;/span&gt;':'&lt;span class="badge"&gt;▶ Начать&lt;/span&gt;'))+
'&lt;/div&gt;';
});
html+='&lt;/div&gt;';
menu.innerHTML=html;
menu.querySelectorAll('.syn-ch:not(.locked)').forEach(function(ch){
ch.addEventListener('click',function(){
var id=+ch.dataset.id;
startChapter(id);
});
});
}
function startChapter(id){
var ch=CHAPTERS.find(function(c){return c.id===id});
if(!ch)return;
$('#syn-menu').style.display='none';
var active=$('#syn-active');
active.classList.add('on');
var html='&lt;div class="syn-chapter-head"&gt;'+
'&lt;div class="num"&gt;'+ch.id+'&lt;/div&gt;'+
'&lt;div&gt;&lt;div class="t"&gt;'+ch.t+'&lt;/div&gt;&lt;div class="d"&gt;Детектор: '+ch.detector+'&lt;/div&gt;&lt;/div&gt;'+
'&lt;/div&gt;';
ch.scenes.forEach(function(sc){
html+='&lt;div class="syn-scene"&gt;&lt;div class="who"&gt;'+sc.who+'&lt;/div&gt;&lt;div class="txt"&gt;'+sc.txt+'&lt;/div&gt;&lt;/div&gt;';
});
html+='&lt;div class="syn-task"&gt;&lt;div class="t"&gt;'+ch.task+'&lt;/div&gt;';
if(ch.options){
ch.options.forEach(function(opt,i){
html+='&lt;button class="syn-submit" data-opt="'+i+'" style="margin-top:8px"&gt;'+opt.t+'&lt;/button&gt;';
});
}else{
html+='&lt;textarea id="syn-answer" placeholder="Напиши свой ответ..."&gt;&lt;/textarea&gt;';
html+='&lt;button class="syn-submit" id="syn-submit"&gt;Отправить ответ&lt;/button&gt;';
}
html+='&lt;/div&gt;';
html+='&lt;div class="syn-result" id="syn-result" style="display:none"&gt;&lt;/div&gt;';
html+='&lt;button class="syn-back" id="syn-back"&gt;← Назад к главам&lt;/button&gt;';
active.innerHTML=html;
if(ch.options){
active.querySelectorAll('[data-opt]').forEach(function(btn){
btn.addEventListener('click',function(){
var opt=ch.options[+btn.dataset.opt];
submitAnswer(ch,opt.good,opt.fb);
});
});
}else{
$('#syn-submit').addEventListener('click',function(){
var answer=$('#syn-answer').value.trim();
if(answer.length&lt;10){coach('Напиши более развёрнутый ответ (минимум 10 символов)');return}
var correct=checkAnswer(answer,ch.answer);
submitAnswer(ch,correct,null);
});
}
$('#syn-back').addEventListener('click',function(){
active.classList.remove('on');
$('#syn-menu').style.display='block';
renderMenu();
});
}
function checkAnswer(answer,keywords){
var lower=answer.toLowerCase();
var found=0;
keywords.forEach(function(kw){
if(lower.indexOf(kw.toLowerCase())&gt;=0)found++;
});
return found&gt;=Math.ceil(keywords.length*0.5);
}
function submitAnswer(ch,correct,feedback){
var result=$('#syn-result');
result.style.display='block';
var score=correct?50:20;
var verdict=correct?'✓ Верно! Ты раскрыл приём.':'✗ Не совсем. Смотри разбор ниже.';
var exp=ch.exp;
result.innerHTML='&lt;div class="score"&gt;'+score+' PR&lt;/div&gt;'+
'&lt;div class="verdict"&gt;'+verdict+'&lt;/div&gt;'+
'&lt;div class="exp"&gt;&lt;b&gt;Разбор:&lt;/b&gt; '+exp+'&lt;/div&gt;';
if(correct){
if(progress.done.indexOf(ch.id)&lt;0){
progress.done.push(ch.id);
progress.scores[ch.id]=score;
s('syn_progress',progress);
grant(score);
coach('✓ Глава '+ch.id+' пройдена! +'+score+' PR');
}else{
coach('Глава уже пройдена, но практика не помешает!');
}
}else{
grant(10);
coach('Попробуй ещё раз. +10 PR за попытку.');
}
result.innerHTML+='&lt;button class="syn-back" id="syn-back2" style="margin-top:12px"&gt;← Назад к главам&lt;/button&gt;';
$('#syn-back2').addEventListener('click',function(){
$('#syn-active').classList.remove('on');
$('#syn-menu').style.display='block';
renderMenu();
});
}
$('#syn-btn').addEventListener('click',function(){
$('#syn-mask').classList.add('open');
renderMenu();
});
$('#syn-close').addEventListener('click',function(){$('#syn-mask').classList.remove('open')});
$('#syn-mask').addEventListener('click',function(e){if(e.target===this)this.classList.remove('open')});
/* добавляем в сайдбар и хаб */
var nav=$('#pd-nav');
if(nav&amp;&amp;!nav.querySelector('[data-id="syn"]')){
var b=document.createElement('button');b.className='pd-item';b.setAttribute('data-id','syn');
b.innerHTML='&lt;i class="fas fa-film" style="width:20px;text-align:center"&gt;&lt;/i&gt;&lt;span&gt;Синдикат&lt;/span&gt;';
b.addEventListener('click',function(){$('#syn-mask').classList.add('open');renderMenu();});
nav.appendChild(b);
}
var hub=$('#pd-hub-grid');
if(hub&amp;&amp;!hub.querySelector('[data-id="syn"]')){
var h=document.createElement('div');h.className='pd-hitem';h.setAttribute('data-id','syn');
h.innerHTML='&lt;i class="fas fa-film"&gt;&lt;/i&gt;&lt;span&gt;Синдикат&lt;/span&gt;';
h.addEventListener('click',function(){$('#syn-mask').classList.add('open');renderMenu();});
hub.appendChild(h);
}
console.log('? Правдомер: Блок 14 · Синдикат подключён');
})();
&lt;/script&gt;

&lt;style&gt;
#synd-btn{position:fixed;left:16px;bottom:560px;z-index:400;width:52px;height:52px;border-radius:50%;border:none;cursor:pointer;background:linear-gradient(135deg,#EF4444,#7C3AED);color:#fff;font-size:22px;box-shadow:0 6px 20px rgba(239,68,68,.45);transition:transform .2s}
#synd-btn:hover{transform:scale(1.1)}
@media(min-width:1000px){#synd-btn{bottom:460px}}
#synd-mask{position:fixed;inset:0;z-index:425;display:none;align-items:center;justify-content:center;background:rgba(8,5,15,.92);backdrop-filter:blur(6px)}
#synd-mask.open{display:flex}
#synd-card{width:min(720px,94vw);max-height:90vh;overflow-y:auto;border-radius:18px;padding:22px;color:#efe9dc;background:linear-gradient(180deg,#1a0d14,#0d0a14);border:1px solid rgba(239,68,68,.4);font-family:Inter,system-ui,sans-serif;box-shadow:0 30px 60px rgba(0,0,0,.6)}
#synd-card h3{margin:0 0 4px;font-size:20px;color:#fca5a5}
.synd-sub{font-size:12px;color:#a79ec9;margin-bottom:14px;line-height:1.5}
.synd-chapters{display:flex;flex-direction:column;gap:8px}
.synd-ch{display:flex;align-items:center;gap:12px;padding:12px;border-radius:12px;border:1px solid rgba(239,68,68,.3);background:rgba(239,68,68,.06);cursor:pointer;transition:.2s}
.synd-ch:hover{border-color:#EF4444;background:rgba(239,68,68,.12)}
.synd-ch.locked{opacity:.4;cursor:not-allowed}
.synd-ch.done{border-color:#10B981;background:rgba(16,185,129,.08)}
.synd-ch .num{width:36px;height:36px;border-radius:50%;background:linear-gradient(135deg,#EF4444,#7C3AED);color:#fff;display:flex;align-items:center;justify-content:center;font-weight:800;flex-shrink:0}
.synd-ch.done .num{background:#10B981}
.synd-ch.locked .num{background:#4B5563}
.synd-ch .info{flex:1}
.synd-ch .t{font-weight:700;color:#efe9dc;font-size:14px}
.synd-ch .d{font-size:11px;color:#a79ec9;margin-top:2px}
.synd-ch .st{font-size:11px;font-weight:700}
.synd-ch.done .st{color:#6ee7b7}
.synd-ch.locked .st{color:#6b7280}
.synd-story{display:none}
.synd-story.on{display:block}
.synd-narrative{background:rgba(239,68,68,.06);border:1px solid rgba(239,68,68,.25);border-radius:12px;padding:16px;margin-bottom:14px;line-height:1.7;font-size:13px;color:#e8dff7}
.synd-evidence{background:rgba(0,0,0,.3);border-radius:12px;padding:14px;margin:12px 0;border-left:3px solid #EF4444}
.synd-evidence .lab{font-size:10px;text-transform:uppercase;letter-spacing:1px;color:#fca5a5;margin-bottom:6px}
.synd-evidence .val{font-size:13px;color:#e8dff7;line-height:1.6;font-style:italic}
.synd-choices{display:flex;flex-direction:column;gap:8px;margin-top:14px}
.synd-choice{padding:12px 14px;border-radius:12px;border:1px solid rgba(239,68,68,.35);background:rgba(239,68,68,.06);color:#e8dff7;font-size:13px;text-align:left;cursor:pointer;transition:.2s;line-height:1.5}
.synd-choice:hover{border-color:#EF4444;background:rgba(239,68,68,.12);transform:translateX(3px)}
.synd-choice.right{border-color:#10B981;background:rgba(16,185,129,.12);color:#6ee7b7}
.synd-choice.wrong{border-color:#EF4444;background:rgba(239,68,68,.12);color:#fca5a5}
.synd-result{margin-top:14px;padding:16px;border-radius:14px;background:rgba(239,68,68,.08);border:1px solid rgba(239,68,68,.3)}
.synd-result b{color:#fca5a5}
.synd-result .expl{font-size:12px;color:#d9d2ea;line-height:1.6;margin-top:8px}
.synd-score{display:flex;align-items:center;gap:14px;background:rgba(239,68,68,.08);border:1px solid rgba(239,68,68,.3);border-radius:14px;padding:14px;margin:12px 0}
.synd-score b{font-size:34px;color:#fca5a5}
.synd-bar{flex:1;height:10px;background:rgba(255,255,255,.1);border-radius:99px;overflow:hidden;margin-top:8px}
.synd-bar i{display:block;height:100%;border-radius:99px;background:linear-gradient(90deg,#EF4444,#F59E0B)}
.synd-back{width:100%;padding:12px;border-radius:12px;border:1px solid rgba(239,68,68,.4);background:none;color:#fca5a5;cursor:pointer;margin-top:12px;font-size:13px}
.synd-restart{width:100%;padding:12px;border-radius:12px;border:none;background:linear-gradient(135deg,#EF4444,#7C3AED);color:#fff;font-weight:800;cursor:pointer;margin-top:12px;font-size:14px}
#synd-close{margin-top:12px;width:100%;border:1px solid rgba(239,68,68,.4);background:none;color:#fca5a5;border-radius:10px;padding:10px;cursor:pointer;font-size:13px}
&lt;/style&gt;
&lt;button id="synd-btn" title="Сюжетная кампания «Синдикат»"&gt;?&lt;/button&gt;
&lt;div id="synd-mask"&gt;&lt;div id="synd-card"&gt;
&lt;h3&gt;? Сюжетная кампания «Синдикат»&lt;/h3&gt;
&lt;div class="synd-sub"&gt;Расследуй дело о финансовом синдикате «Золотая цепь». Каждая глава — новый детектор. 5 глав, 5 решений, один финал.&lt;/div&gt;
&lt;div class="synd-chapters" id="synd-chapters"&gt;&lt;/div&gt;
&lt;div class="synd-story" id="synd-story"&gt;&lt;/div&gt;
&lt;button id="synd-close"&gt;Закрыть&lt;/button&gt;
&lt;/div&gt;&lt;/div&gt;
&lt;script&gt;
(function(){
"use strict";
if(window._syndDone)return;window._syndDone=1;
var $=function(s){return document.querySelector(s)};
function g(k,d){try{var v=localStorage.getItem(k);return v==null?d:JSON.parse(v)}catch(e){return d}}
function s(k,v){try{localStorage.setItem(k,JSON.stringify(v))}catch(e){}}
function grant(n){if(window.PR&amp;&amp;window.PR.add)window.PR.add(n)}
function coach(t){var c=$('#coach');if(!c)return;$('#coachText').textContent=t;c.style.display='block';clearTimeout(window._prCt);window._prCt=setTimeout(function(){c.style.display='none'},6500);}
var CHAPTERS=[
{id:1,title:'Глава 1 · Письмо',detector:'Текст-детектор',evidence:'Тема: СРОЧНО! Перевод средств на резервный счёт
От: finance@company-int.com

Уважаемый сотрудник, в связи с проверкой регулятора необходимо срочно перевести 500 000 руб. на резервный счёт. Это конфиденциально. Код подтверждения пришлём в СМС. Не сообщайте никому.',
question:'Что не так с этим письмом?',
choices:[
{t:'Срочность + конфиденциальность + запрос кода — классика фишинга',correct:true,expl:'Три красных флага сразу: искусственная срочность, требование секретности и запрос кода из СМС. Настоящие компании так не делают.'},
{t:'Письмо выглядит нормально, просто срочное',correct:false,expl:'Срочность сама по себе — маркер. А запрос кода из СМС — верный признак мошенничества.'},
{t:'Нужно уточнить у коллеги',correct:false,expl:'Коллега может не знать. Правильнее проверить отправителя независимо.'}
]},
{id:2,title:'Глава 2 · Звонок',detector:'Звонок-детектор',evidence:'Звонок с незнакомого номера:
«Это служба безопасности банка. По вашему счёту идёт подозрительная операция. Назовите код из СМС, чтобы мы могли её отменить. Не кладите трубку, это важно для вашей безопасности.»',
question:'Как вы ответите?',
choices:[
{t:'Положу трубку и перезвоню в банк по номеру с карты',correct:true,expl:'Единственный надёжный канал — номер на обратной стороне карты. Мошенники всегда просят не класть трубку, чтобы не дать вам проверить.'},
{t:'Назову код, раз это банк',correct:false,expl:'Код из СМС — ключ к вашим деньгам. Банк никогда не просит его по телефону.'},
{t:'Спрошу имя сотрудника и перезвоню',correct:false,expl:'Имя можно назвать любое. Это не доказательство.'}
]},
{id:3,title:'Глава 3 · Фото',detector:'Фото-детектор',evidence:'Вам прислали фото «подтверждения перевода» с печатью банка. На фото видны следы ретуши вокруг печати, а шрифт печати немного размыт по краям.',
question:'Что вы видите на этом фото?',
choices:[
{t:'Следы ретуши и размытие — фото подделано',correct:true,expl:'Ретушь вокруг печати и размытие шрифта — классические признаки фотомонтажа. Настоящие документы не ретушируют.'},
{t:'Фото выглядит нормально',correct:false,expl:'Следы ретуши видны. Это признак подделки.'},
{t:'Нужно проверить печать отдельно',correct:false,expl:'Печать уже показывает признаки подделки. Этого достаточно для подозрения.'}
]},
{id:4,title:'Глава 4 · Голос',detector:'Голос-детектор',evidence:'Голосовое сообщение от «директора»:
«Это я, директор. Срочно переведи 500 тысяч новому поставщику. Не задавай вопросов, это конфиденциально.»

Голос звучит слегка «металлически», с неестественными паузами.',
question:'Что вы заметили?',
choices:[
{t:'Голос звучит неестественно — это дипфейк',correct:true,expl:'«Металлический» тембр и неестественные паузы — признаки дипфейка. Настоящий директор не просит переводить деньги по телефону.'},
{t:'Голос похож на директора, поверю',correct:false,expl:'Голос можно подделать. Всегда проверяйте голосом по известному номеру.'},
{t:'Нужно послушать ещё раз',correct:false,expl:'Повторное прослушивание не поможет. Признаки дипфейка уже видны.'}
]},
{id:5,title:'Глава 5 · Финал',detector:'Фьюжн',evidence:'Вы собрали все улики:
- Письмо с фишингом
- Звонок с запросом кода
- Поддельное фото
- Дипфейк-голос

Все следы ведут к одному: кто-то пытается украсть деньги компании, используя разные каналы.',
question:'Кто стоит за этим?',
choices:[
{t:'Это организованная группа, использующая разные каналы атаки',correct:true,expl:'Разные каналы атаки (письмо, звонок, фото, голос) указывают на организованную группу. Одиночка не стал бы использовать столько каналов.'},
{t:'Это один человек, который всё подделал',correct:false,expl:'Один человек не стал бы использовать столько разных каналов. Это признак группы.'},
{t:'Нужно больше улик',correct:false,expl:'Улик уже достаточно. Все они указывают на организованную атаку.'}
]}
];
var progress=g('synd_progress',{done:[],score:0});
function renderChapters(){
var box=$('#synd-chapters');
$('#synd-story').style.display='none';
box.style.display='block';
box.innerHTML=CHAPTERS.map(function(ch,i){
var done=progress.done.indexOf(ch.id)&gt;=0;
var locked=i&gt;0&amp;&amp;progress.done.indexOf(CHAPTERS[i-1].id)&lt;0;
return '&lt;div class="synd-ch'+(done?' done':'')+(locked?' locked':'')+'" data-i="'+i+'"&gt;'+
'&lt;div class="num"&gt;'+ch.id+'&lt;/div&gt;'+
'&lt;div class="info"&gt;&lt;div class="t"&gt;'+ch.title+'&lt;/div&gt;&lt;div class="d"&gt;'+ch.detector+'&lt;/div&gt;&lt;/div&gt;'+
'&lt;div class="st"&gt;'+(done?'✓ Пройдено':locked?'? Заблокировано':'▶ Начать')+'&lt;/div&gt;'+
'&lt;/div&gt;';
}).join('');
box.querySelectorAll('.synd-ch:not(.locked)').forEach(function(el){
el.addEventListener('click',function(){
var i=+el.dataset.i;
openChapter(i);
});
});
}
function openChapter(i){
var ch=CHAPTERS[i];
$('#synd-chapters').style.display='none';
var story=$('#synd-story');
story.style.display='block';
story.innerHTML='&lt;h3 style="color:#fca5a5;margin-bottom:10px"&gt;'+ch.title+'&lt;/h3&gt;'+
'&lt;div class="synd-narrative"&gt;'+ch.evidence.replace(/\n/g,'&lt;br&gt;')+'&lt;/div&gt;'+
'&lt;div class="synd-evidence"&gt;&lt;div class="lab"&gt;Детектор: '+ch.detector+'&lt;/div&gt;&lt;div class="val"&gt;'+ch.question+'&lt;/div&gt;&lt;/div&gt;'+
'&lt;div class="synd-choices"&gt;'+ch.choices.map(function(c,j){
return '&lt;button class="synd-choice" data-i="'+j+'"&gt;'+c.t+'&lt;/button&gt;';
}).join('')+'&lt;/div&gt;'+
'&lt;div class="synd-result" id="synd-result" style="display:none"&gt;&lt;/div&gt;'+
'&lt;button class="synd-back" id="synd-back"&gt;← К списку глав&lt;/button&gt;';
story.querySelectorAll('.synd-choice').forEach(function(btn){
btn.addEventListener('click',function(){
var j=+btn.dataset.i;
chooseAnswer(ch,i,j);
});
});
$('#synd-back').addEventListener('click',function(){renderChapters();});
}
function chooseAnswer(ch,chapterIdx,choiceIdx){
var choice=ch.choices[choiceIdx];
var story=$('#synd-story');
story.querySelectorAll('.synd-choice').forEach(function(btn,idx){
btn.disabled=true;
if(idx===choiceIdx)btn.classList.add(choice.correct?'right':'wrong');
else if(ch.choices[idx].correct)btn.classList.add('right');
});
var result=$('#synd-result');
result.style.display='block';
result.innerHTML='&lt;div class="synd-score"&gt;&lt;b&gt;'+(choice.correct?100:40)+'&lt;/b&gt;&lt;div style="flex:1"&gt;&lt;div style="font-size:12px;color:#a79ec9"&gt;'+(choice.correct?'Верное решение':'Неверное решение')+'&lt;/div&gt;&lt;div class="synd-bar"&gt;&lt;i style="width:'+(choice.correct?100:40)+'%"&gt;&lt;/i&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;'+
'&lt;div class="expl"&gt;'+choice.expl+'&lt;/div&gt;';
if(choice.correct){
if(progress.done.indexOf(ch.id)&lt;0){
progress.done.push(ch.id);
progress.score+=20;
s('synd_progress',progress);
grant(10);
coach('✅ '+ch.title+' пройдена! +10 PR');
}
}
var btn=document.createElement('button');
btn.className='synd-back';
btn.textContent='← К списку глав';
btn.addEventListener('click',function(){renderChapters();});
result.appendChild(btn);
}
$('#synd-btn').addEventListener('click',function(){
$('#synd-mask').classList.add('open');
renderChapters();
});
$('#synd-close').addEventListener('click',function(){$('#synd-mask').classList.remove('open')});
$('#synd-mask').addEventListener('click',function(e){if(e.target===this)this.classList.remove('open')});
/* добавляем в сайдбар и хаб */
var nav=$('#pd-nav');
if(nav&amp;&amp;!nav.querySelector('[data-id="synd"]')){
var b=document.createElement('button');b.className='pd-item';b.setAttribute('data-id','synd');
b.innerHTML='&lt;i class="fas fa-film" style="width:20px;text-align:center"&gt;&lt;/i&gt;&lt;span&gt;Синдикат&lt;/span&gt;';
b.addEventListener('click',function(){$('#synd-mask').classList.add('open');renderChapters();});
nav.appendChild(b);
}
var hub=$('#pd-hub-grid');
if(hub&amp;&amp;!hub.querySelector('[data-id="synd"]')){
var h=document.createElement('div');h.className='pd-hitem';h.setAttribute('data-id','synd');
h.innerHTML='&lt;i class="fas fa-film"&gt;&lt;/i&gt;&lt;span&gt;Синдикат&lt;/span&gt;';
h.addEventListener('click',function(){$('#synd-mask').classList.add('open');renderChapters();});
hub.appendChild(h);
}
console.log('? Правдомер: Блок 13 · Сюжетная кампания «Синдикат» подключена');
})();
&lt;/script&gt;

&lt;style&gt;
#syn-btn{position:fixed;left:16px;bottom:152px;z-index:400;width:52px;height:52px;border-radius:50%;border:none;cursor:pointer;background:linear-gradient(135deg,#7C3AED,#EF4444);color:#fff;font-size:22px;box-shadow:0 6px 20px rgba(124,58,237,.5);transition:transform .2s}
#syn-btn:hover{transform:scale(1.1)}
#syn-mask{position:fixed;inset:0;z-index:432;display:none;align-items:center;justify-content:center;background:rgba(8,5,15,.92);backdrop-filter:blur(6px)}
#syn-mask.open{display:flex}
#syn-card{width:min(660px,94vw);max-height:90vh;overflow-y:auto;border-radius:18px;padding:22px;color:#efe9dc;background:linear-gradient(180deg,#1a1030,#0d0a14);border:1px solid rgba(124,58,237,.4);font-family:Inter,system-ui,sans-serif;box-shadow:0 30px 60px rgba(0,0,0,.6)}
#syn-card h3{margin:0 0 4px;font-size:20px;color:#c4b5fd}
.syn-sub{font-size:12px;color:#a79ec9;margin-bottom:14px;line-height:1.5}
.syn-progress{display:flex;gap:6px;margin-bottom:14px}
.syn-step{flex:1;height:6px;border-radius:99px;background:rgba(255,255,255,.1)}
.syn-step.done{background:#10B981}
.syn-step.cur{background:linear-gradient(90deg,#7C3AED,#EF4444)}
.syn-chapter{border:1px solid rgba(124,58,237,.3);border-radius:14px;padding:16px;margin-bottom:12px;background:rgba(124,58,237,.05)}
.syn-chapter.locked{opacity:.5;pointer-events:none}
.syn-chapter.done{border-color:#10B981;background:rgba(16,185,129,.06)}
.syn-chapter .h{display:flex;align-items:center;gap:10px;margin-bottom:8px}
.syn-chapter .ic{font-size:24px}
.syn-chapter .t{font-weight:700;color:#c4b5fd;font-size:14px}
.syn-chapter .d{font-size:11px;color:#a79ec9;margin-top:2px}
.syn-chapter .st{margin-left:auto;font-size:11px;font-weight:700}
.syn-chapter .st.done{color:#6ee7b7}
.syn-chapter .st.locked{color:#6b7280}
.syn-evidence{background:rgba(0,0,0,.3);border-radius:10px;padding:12px;margin:10px 0;font-size:12px;color:#d9d2ea;line-height:1.6;border-left:3px solid #7C3AED}
.syn-evidence .lbl{font-size:10px;text-transform:uppercase;letter-spacing:1px;color:#a79ec9;margin-bottom:4px}
.syn-suspects{display:grid;grid-template-columns:repeat(auto-fit,minmax(140px,1fr));gap:10px;margin:12px 0}
.syn-suspect{border:1px solid rgba(124,58,237,.25);border-radius:12px;padding:12px;text-align:center;cursor:pointer;transition:.2s}
.syn-suspect:hover{border-color:#7C3AED;background:rgba(124,58,237,.08)}
.syn-suspect.sel{border-color:#EF4444;background:rgba(239,68,68,.1)}
.syn-suspect .av{font-size:32px}
.syn-suspect .nm{font-weight:700;font-size:13px;color:#c4b5fd;margin-top:4px}
.syn-suspect .rl{font-size:10px;color:#a79ec9}
.syn-act{width:100%;padding:12px;border:none;border-radius:12px;background:linear-gradient(135deg,#7C3AED,#EF4444);color:#fff;font-weight:800;font-size:14px;cursor:pointer;margin-top:12px}
.syn-act:disabled{opacity:.5;cursor:not-allowed}
.syn-result{margin-top:14px;padding:14px;border-radius:12px;background:rgba(124,58,237,.08);border:1px solid rgba(124,58,237,.3);font-size:13px;line-height:1.6;color:#d9d2ea}
.syn-result b{color:#c4b5fd}
.syn-final{margin-top:14px;padding:16px;border-radius:14px;background:linear-gradient(135deg,rgba(124,58,237,.12),rgba(239,68,68,.08));border:1px solid rgba(124,58,237,.4);text-align:center}
.syn-final b{font-size:18px;color:#c4b5fd;display:block;margin-bottom:6px}
.syn-final p{font-size:13px;color:#d9d2ea;line-height:1.6}
#syn-close{margin-top:14px;width:100%;border:1px solid rgba(124,58,237,.4);background:none;color:#c4b5fd;border-radius:10px;padding:10px;cursor:pointer;font-size:13px}
&lt;/style&gt;
&lt;button id="syn-btn" title="Синдикат · сюжетная кампания"&gt;?️&lt;/button&gt;
&lt;div id="syn-mask"&gt;&lt;div id="syn-card"&gt;
&lt;h3&gt;?️ Синдикат · сюжетная кампания&lt;/h3&gt;
&lt;div class="syn-sub"&gt;Расследуй сеть мошенников, использующих все известные тебе приёмы. 5 глав — 5 навыков. Раскрой синдикат целиком.&lt;/div&gt;
&lt;div class="syn-progress" id="syn-progress"&gt;&lt;/div&gt;
&lt;div id="syn-chapters"&gt;&lt;/div&gt;
&lt;div id="syn-active" style="display:none"&gt;&lt;/div&gt;
&lt;div id="syn-final" style="display:none"&gt;&lt;/div&gt;
&lt;button id="syn-close"&gt;Закрыть&lt;/button&gt;
&lt;/div&gt;&lt;/div&gt;
&lt;script&gt;
(function(){
"use strict";
if(window._synDone)return;window._synDone=1;
var $=function(s){return document.querySelector(s)};
function g(k,d){try{var v=localStorage.getItem(k);return v==null?d:JSON.parse(v)}catch(e){return d}}
function s(k,v){try{localStorage.setItem(k,JSON.stringify(v))}catch(e){}}
function toast(t,m){if(window.Toast&amp;&amp;Toast.show)Toast.show(t,m,'success')}
function addPR(n){if(window.PR&amp;&amp;window.PR.add)window.PR.add(n)}
function coach(t){var c=$('#coach');if(!c)return;$('#coachText').textContent=t;c.style.display='block';clearTimeout(window._prCt);window._prCt=setTimeout(function(){c.style.display='none'},6500)}
var CHAPTERS=[
{id:1,ic:'?',t:'Глава 1 · СМС от «банка»',skill:'Текст',
desc:'Пришло СМС: «Ваш счёт заблокирован. Срочно позвоните на 8-800-ХХХ». Определите тип атаки.',
suspects:[
{av:'?',nm:'Настоящий банк',rl:'Уведомление о блокировке'},
{av:'?',nm:'Колл-центр',rl:'Служба поддержки'},
{av:'?',nm:'Фишинг',rl:'Поддельное СМС'}
],
answer:'Фишинг',
explanation:'Настоящий банк никогда не просит перезвонить на номер из СМС. Это фишинг: цель — выманить данные карты. Ключевые маркеры: срочность, незнакомый номер, давление.',
pr:8},
{id:2,ic:'?️',t:'Глава 2 · Голос «родственника»',skill:'Голос',
desc:'Звонок: «Мама, я в беде, срочно переведи деньги!» Голос звучит как мама, но что-то не так.',
suspects:[
{av:'?',nm:'Мама',rl:'Родственник'},
{av:'?',nm:'Дипфейк-голос',rl:'Синтез голоса'},
{av:'?',nm:'Мошенник',rl:'Имитация голоса'}
],
answer:'Дипфейк-голос',
explanation:'Современные технологии позволяют клонировать голос. Признаки: неестественные паузы, металлический тембр, отсутствие фоновых звуков. Проверяйте обратным звонком.',
pr:8},
{id:3,ic:'?️',t:'Глава 3 · «Доказательство» фото',skill:'Фото',
desc:'Вам прислали фото «документа», подтверждающего блокировку счёта. Проверьте подлинность.',
suspects:[
{av:'?',nm:'Настоящий документ',rl:'Официальная бумага'},
{av:'?',nm:'Фотошоп',rl:'Подделка документа'},
{av:'?',nm:'AI-генерация',rl:'Сгенерировано ИИ'}
],
answer:'Фотошоп',
explanation:'На фото видны следы монтажа: размытые края текста, несовпадение шрифтов, артефакты сжатия в области текста. Это подделка документа.',
pr:8},
{id:4,ic:'?',t:'Глава 4 · Диалог в мессенджере',skill:'Псих-симулятор',
desc:'В мессенджере пишет «сотрудник банка»: «Сейчас нужно подтвердить операцию кодом из СМС».',
suspects:[
{av:'?‍?',nm:'Сотрудник банка',rl:'Официальное лицо'},
{av:'?',nm:'Мошенник',rl:'Социальная инженерия'},
{av:'?',nm:'Бот-рассылка',rl:'Автоматическая рассылка'}
],
answer:'Мошенник',
explanation:'Настоящий сотрудник банка никогда не запрашивает коды из СМС в мессенджере. Это классическая социальная инженерия: давление + срочность + авторитет.',
pr:8},
{id:5,ic:'?️',t:'Глава 5 · Разоблачение синдиката',skill:'Фьюжн',
desc:'Соберите все улики: СМС, звонок, фото, диалог. Кто за всем этим стоит?',
suspects:[
{av:'?',nm:'Конкуренты банка',rl:'Конкурентная борьба'},
{av:'?️',nm:'Синдикат',rl:'Организованная сеть'},
{av:'?',nm:'Одиночка',rl:'Индивидуальный мошенник'}
],
answer:'Синдикат',
explanation:'Множество каналов атаки (СМС, звонки, фото, мессенджеры) указывают на организованную сеть. Одиночка не может одновременно вести столько каналов. Это синдикат.',
pr:12}
];
var progress=g('syn_progress',{});
var curChapter=null;
function renderProgress(){
$('#syn-progress').innerHTML=CHAPTERS.map(function(c,i){
var done=!!progress[c.id];
return '&lt;div class="syn-step'+(done?' done':'')+'"&gt;&lt;/div&gt;';
}).join('');
}
function renderChapters(){
$('#syn-chapters').style.display='block';
$('#syn-active').style.display='none';
$('#syn-final').style.display='none';
var html=CHAPTERS.map(function(c,i){
var done=!!progress[c.id];
var unlocked=i===0||!!progress[CHAPTERS[i-1].id];
return '&lt;div class="syn-chapter'+(done?' done':'')+(unlocked?'':' locked')+'" data-id="'+c.id+'"&gt;'+
'&lt;div class="h"&gt;&lt;span class="ic"&gt;'+c.ic+'&lt;/span&gt;&lt;div&gt;&lt;div class="t"&gt;'+c.t+'&lt;/div&gt;&lt;div class="d"&gt;Навык: '+c.skill+'&lt;/div&gt;&lt;/div&gt;'+
'&lt;span class="st'+(done?' done':' locked')+'"&gt;'+(done?'✓':(unlocked?'▶':'?'))+'&lt;/span&gt;&lt;/div&gt;'+
'&lt;/div&gt;';
}).join('');
$('#syn-chapters').innerHTML=html;
$('#syn-chapters').querySelectorAll('.syn-chapter:not(.locked)').forEach(function(el){
el.addEventListener('click',function(){openChapter(+el.dataset.id)});
});
}
function openChapter(id){
curChapter=CHAPTERS.find(function(c){return c.id===id});
if(!curChapter)return;
$('#syn-chapters').style.display='none';
$('#syn-active').style.display='block';
$('#syn-final').style.display='none';
var done=!!progress[curChapter.id];
var html='&lt;div class="syn-chapter" style="border-color:rgba(124,58,237,.4)"&gt;'+
'&lt;div class="h"&gt;&lt;span class="ic"&gt;'+curChapter.ic+'&lt;/span&gt;&lt;div&gt;&lt;div class="t"&gt;'+curChapter.t+'&lt;/div&gt;&lt;div class="d"&gt;Навык: '+curChapter.skill+'&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;'+
'&lt;div class="syn-evidence"&gt;&lt;div class="lbl"&gt;Улика&lt;/div&gt;'+curChapter.desc+'&lt;/div&gt;'+
'&lt;div style="font-size:12px;color:#a79ec9;margin-bottom:8px"&gt;Выберите, кто за этим стоит:&lt;/div&gt;'+
'&lt;div class="syn-suspects"&gt;'+
curChapter.suspects.map(function(sp,i){
return '&lt;div class="syn-suspect" data-i="'+i+'"&gt;&lt;div class="av"&gt;'+sp.av+'&lt;/div&gt;&lt;div class="nm"&gt;'+sp.nm+'&lt;/div&gt;&lt;div class="rl"&gt;'+sp.rl+'&lt;/div&gt;&lt;/div&gt;';
}).join('')+'&lt;/div&gt;'+
'&lt;button class="syn-act" id="syn-verdict" disabled&gt;Вынести вердикт&lt;/button&gt;'+
'&lt;/div&gt;';
$('#syn-active').innerHTML=html;
var sel=null;
$('#syn-active').querySelectorAll('.syn-suspect').forEach(function(el){
el.addEventListener('click',function(){
$('#syn-active').querySelectorAll('.syn-suspect').forEach(function(x){x.classList.remove('sel')});
el.classList.add('sel');
sel=curChapter.suspects[+el.dataset.i].nm;
$('#syn-verdict').disabled=false;
});
});
$('#syn-verdict').addEventListener('click',function(){
if(!sel)return;
var correct=sel===curChapter.answer;
var pr=correct?curChapter.pr:2;
addPR(pr);
progress[curChapter.id]={done:true,correct:correct};
s('syn_progress',progress);
var html='&lt;div class="syn-result"&gt;'+
'&lt;b&gt;'+(correct?'✅ Верно!':'❌ Неверно.')+'&lt;/b&gt; '+curChapter.explanation+
'&lt;div style="margin-top:8px;color:#f0d68a"&gt;+'+pr+' PR&lt;/div&gt;&lt;/div&gt;';
$('#syn-active').innerHTML='&lt;div class="syn-chapter"&gt;&lt;div class="h"&gt;&lt;span class="ic"&gt;'+curChapter.ic+'&lt;/span&gt;&lt;div&gt;&lt;div class="t"&gt;'+curChapter.t+'&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;'+html+'&lt;/div&gt;'+
'&lt;button class="syn-act" id="syn-back"&gt;← К главам&lt;/button&gt;';
$('#syn-back').addEventListener('click',function(){renderChapters();checkFinal();});
coach(correct?'✅ Глава пройдена! +'+pr+' PR':'❌ Неверно, но +'+pr+' PR за попытку');
renderProgress();
});
}
function checkFinal(){
var allDone=CHAPTERS.every(function(c){return !!progress[c.id]});
if(allDone){
$('#syn-final').style.display='block';
$('#syn-final').innerHTML='&lt;div class="syn-final"&gt;'+
'&lt;b&gt;? Синдикат разоблачён!&lt;/b&gt;'+
'&lt;p&gt;Вы прошли все 5 глав и раскрыли сеть мошенников. Ваши навыки детектора выросли.&lt;/p&gt;'+
'&lt;div style="margin-top:10px;color:#f0d68a;font-weight:800"&gt;Награда: +20 PR · Ачивка «Разоблачитель синдиката»&lt;/div&gt;&lt;/div&gt;';
var ach=g('pr_achs',{});
if(!ach['syndicate']){
ach['syndicate']=Date.now();
s('pr_achs',ach);
addPR(20);
coach('? Ачивка «Разоблачитель синдиката»! +20 PR');
}
}
}
$('#syn-btn').addEventListener('click',function(){
$('#syn-mask').classList.add('open');
renderProgress();
renderChapters();
checkFinal();
});
$('#syn-close').addEventListener('click',function(){$('#syn-mask').classList.remove('open')});
$('#syn-mask').addEventListener('click',function(e){if(e.target===this)this.classList.remove('open')});
var nav=$('#pd-nav');
if(nav&amp;&amp;!nav.querySelector('[data-id="syn"]')){
var b=document.createElement('button');b.className='pd-item';b.setAttribute('data-id','syn');
b.innerHTML='&lt;i class="fas fa-magnifying-glass-chart" style="width:20px;text-align:center"&gt;&lt;/i&gt;&lt;span&gt;Синдикат&lt;/span&gt;';
b.addEventListener('click',function(){$('#syn-mask').classList.add('open');renderProgress();renderChapters();checkFinal();});
nav.appendChild(b);
}
var hub=$('#pd-hub-grid');
if(hub&amp;&amp;!hub.querySelector('[data-id="syn"]')){
var h=document.createElement('div');h.className='pd-hitem';h.setAttribute('data-id','syn');
h.innerHTML='&lt;i class="fas fa-magnifying-glass-chart"&gt;&lt;/i&gt;&lt;span&gt;Синдикат&lt;/span&gt;';
h.addEventListener('click',function(){$('#syn-mask').classList.add('open');renderProgress();renderChapters();checkFinal();});
hub.appendChild(h);
}
console.log('?️ Правдомер: Ветка 5 · Синдикат подключён');
})();
&lt;/script&gt;

&lt;style&gt;
#syn-btn{position:fixed;left:16px;bottom:180px;z-index:400;width:52px;height:52px;border-radius:50%;border:none;cursor:pointer;background:linear-gradient(135deg,#EF4444,#7C3AED);color:#fff;font-size:22px;box-shadow:0 6px 20px rgba(239,68,68,.45);transition:transform .2s}
#syn-btn:hover{transform:scale(1.1)}
#syn-mask{position:fixed;inset:0;z-index:425;display:none;align-items:center;justify-content:center;background:rgba(8,5,15,.9);backdrop-filter:blur(6px)}
#syn-mask.open{display:flex}
#syn-card{width:min(700px,94vw);max-height:90vh;overflow-y:auto;border-radius:18px;padding:22px;color:#efe9dc;background:linear-gradient(180deg,#1a0d14,#0d0a14);border:1px solid rgba(239,68,68,.4);font-family:Inter,system-ui,sans-serif;box-shadow:0 30px 60px rgba(0,0,0,.6)}
#syn-card h3{margin:0 0 4px;font-size:20px;color:#fca5a5}
.syn-sub{font-size:12px;color:#a79ec9;margin-bottom:14px;line-height:1.5}
.syn-progress{display:flex;gap:6px;margin-bottom:14px}
.syn-step{flex:1;height:6px;border-radius:99px;background:rgba(255,255,255,.1)}
.syn-step.done{background:#10B981}
.syn-step.cur{background:linear-gradient(90deg,#EF4444,#F59E0B)}
.syn-chapter{border:1px solid rgba(239,68,68,.25);border-radius:14px;padding:16px;margin-bottom:14px;background:rgba(239,68,68,.05)}
.syn-chapter.locked{opacity:.5;pointer-events:none}
.syn-chapter.done{border-color:rgba(16,185,129,.5);background:rgba(16,185,129,.06)}
.syn-chapter .h{display:flex;align-items:center;gap:10px;margin-bottom:8px}
.syn-chapter .ic{width:40px;height:40px;border-radius:10px;background:linear-gradient(135deg,#EF4444,#7C3AED);display:flex;align-items:center;justify-content:center;font-size:20px}
.syn-chapter .t{font-size:14px;font-weight:700;color:#fca5a5}
.syn-chapter .d{font-size:11px;color:#a79ec9;margin-top:2px}
.syn-chapter .st{margin-left:auto;font-size:11px;font-weight:700}
.syn-chapter .st.done{color:#6ee7b7}
.syn-chapter .st.locked{color:#6b7280}
.syn-task{background:rgba(0,0,0,.3);border-radius:12px;padding:16px;margin:12px 0;font-size:13px;line-height:1.7;color:#e8dcc8}
.syn-task .label{font-size:11px;color:#fca5a5;font-weight:700;margin-bottom:8px;text-transform:uppercase;letter-spacing:.5px}
.syn-opts{display:flex;flex-direction:column;gap:8px;margin-top:12px}
.syn-opt{padding:12px 14px;border-radius:12px;border:1px solid rgba(239,68,68,.35);background:rgba(239,68,68,.06);color:#e8dff7;font-size:13px;text-align:left;cursor:pointer;transition:.2s;line-height:1.5}
.syn-opt:hover{border-color:#EF4444;background:rgba(239,68,68,.12);transform:translateX(3px)}
.syn-opt.right{border-color:#10B981;background:rgba(16,185,129,.1);color:#6ee7b7}
.syn-opt.wrong{border-color:#EF4444;background:rgba(239,68,68,.1);color:#fca5a5}
.syn-opt:disabled{cursor:not-allowed;opacity:.7}
.syn-fb{margin-top:10px;padding:12px;border-radius:10px;background:rgba(212,175,55,.07);border-left:3px solid #F59E0B;font-size:12px;color:#d9cfae;line-height:1.6;display:none}
.syn-fb.show{display:block}
.syn-score{display:flex;align-items:center;gap:14px;background:rgba(239,68,68,.08);border:1px solid rgba(239,68,68,.3);border-radius:14px;padding:14px;margin:12px 0}
.syn-score b{font-size:34px;color:#fca5a5}
.syn-bar{flex:1;height:10px;background:rgba(255,255,255,.1);border-radius:99px;overflow:hidden;margin-top:8px}
.syn-bar i{display:block;height:100%;border-radius:99px;background:linear-gradient(90deg,#EF4444,#F59E0B)}
.syn-final{padding:20px;border-radius:14px;background:linear-gradient(135deg,rgba(239,68,68,.12),rgba(124,58,237,.08));border:1px solid rgba(124,58,237,.4);text-align:center;margin-top:14px}
.syn-final b{font-size:20px;color:#f0d68a;display:block;margin-bottom:8px}
.syn-final p{font-size:13px;color:#d9d2ea;line-height:1.6;margin-bottom:12px}
.syn-restart{padding:11px 22px;border:none;border-radius:12px;background:linear-gradient(135deg,#EF4444,#7C3AED);color:#fff;font-weight:800;cursor:pointer;font-size:13px}
#syn-close{margin-top:14px;width:100%;border:1px solid rgba(239,68,68,.4);background:none;color:#fca5a5;border-radius:10px;padding:10px;cursor:pointer;font-size:13px}
&lt;/style&gt;
&lt;button id="syn-btn" title="Сюжетная кампания «Синдикат»"&gt;?&lt;/button&gt;
&lt;div id="syn-mask"&gt;&lt;div id="syn-card"&gt;
&lt;h3&gt;? Сюжетная кампания «Синдикат»&lt;/h3&gt;
&lt;div class="syn-sub"&gt;Расследуй дело о синдикате мошенников. Пройди 4 главы, используя разные детекторы. Собери улики и вынеси вердикт.&lt;/div&gt;
&lt;div id="syn-body"&gt;&lt;/div&gt;
&lt;button id="syn-close"&gt;Закрыть&lt;/button&gt;
&lt;/div&gt;&lt;/div&gt;
&lt;script&gt;
(function(){
"use strict";
if(window._synDone)return;window._synDone=1;
var $=function(s){return document.querySelector(s)};
function g(k,d){try{var v=localStorage.getItem(k);return v==null?d:JSON.parse(v)}catch(e){return d}}
function s(k,v){try{localStorage.setItem(k,JSON.stringify(v))}catch(e){}}
function coach(t){var c=$('#coach');if(!c)return;$('#coachText').textContent=t;c.style.display='block';clearTimeout(window._prCt);window._prCt=setTimeout(function(){c.style.display='none'},6500);}
function addPR(n){if(window.PR&amp;&amp;window.PR.add)window.PR.add(n)}
var CHAPTERS=[
{id:1,ic:'?',t:'Глава 1: Анонимное письмо',d:'Используй Текст-детектор',
task:'Вам пришло анонимное письмо: «Срочно! Ваш счёт заблокирован. Немедленно сообщите код из СМС, иначе потеряете все деньги. Только сегодня можно спасти счёт.»\n\nКакие маркеры манипуляции вы видите?',
opts:[
{t:'Срочность и давление — классика мошенников',ok:1},
{t:'Запрос кода из СМС — красный флаг',ok:1},
{t:'«Только сегодня» — искусственная срочность',ok:1},
{t:'Письмо выглядит официальным, можно доверять',ok:0}
],
explain:'Все три маркера — классика мошенничества: срочность + запрос секретного кода + давление. Настоящий банк никогда не просит код из СМС.'},
{id:2,ic:'?',t:'Глава 2: Подозрительный звонок',d:'Используй Звонок-детектор',
task:'Вам звонят: «Это служба безопасности банка. По вашему счёту подозрительная операция. Назовите код из СМС, чтобы мы могли её отменить. Не кладите трубку.»\n\nКак вы ответите?',
opts:[
{t:'Код никому не называю. Завершаю разговор.',ok:1},
{t:'Перезвоню в банк по номеру с карты.',ok:1},
{t:'Сейчас посмотрю код в СМС...',ok:0},
{t:'Хорошо, диктую код...',ok:0}
],
explain:'Правильный ответ — не называть код и перезвонить по официальному номеру. Мошенники всегда просят не класть трубку, чтобы не дать проверить.'},
{id:3,ic:'?️',t:'Глава 3: Поддельное фото',d:'Используй Фото-детектор',
task:'Вам прислали фото «документа» о блокировке счёта. На фото видны следы ретуши, размытые края, несовпадение шрифтов.\n\nЧто вы видите?',
opts:[
{t:'Следы ретуши — признак подделки',ok:1},
{t:'Несовпадение шрифтов — признак монтажа',ok:1},
{t:'Фото выглядит настоящим, можно доверять',ok:0},
{t:'Размытые края — признак сканирования',ok:0}
],
explain:'Следы ретуши и несовпадение шрифтов — явные признаки подделки. Настоящие документы не ретушируют.'},
{id:4,ic:'⚖️',t:'Глава 4: Финальный вердикт',d:'Собери все улики',
task:'Вы собрали все улики:\n• Анонимное письмо с запросом кода из СМС\n• Звонок «из банка» с требованием не класть трубку\n• Поддельное фото «документа»\n• Все улики указывают на одного человека — «сотрудника банка»\n\nКаков ваш вердикт?',
opts:[
{t:'Это синдикат мошенников — все улики указывают на обман',ok:1},
{t:'Возможно, это настоящая служба безопасности',ok:0},
{t:'Нужно больше информации для вердикта',ok:0},
{t:'Это может быть ошибка банка',ok:0}
],
explain:'Все улики указывают на синдикат: анонимность, запрос кода, поддельные документы. Настоящая служба безопасности действует иначе.'}
];
var step=0,score=0,history=[];
function render(){
var body=$('#syn-body');
if(step&gt;=CHAPTERS.length){finish();return}
var ch=CHAPTERS[step];
var dots='';
for(var i=0;i&lt;CHAPTERS.length;i++){
dots+='&lt;div class="syn-step'+(i&lt;step?' done':i===step?' cur':'')+'"&gt;&lt;/div&gt;';
}
var html='&lt;div class="syn-progress"&gt;'+dots+'&lt;/div&gt;'+
'&lt;div class="syn-chapter"&gt;'+
'&lt;div class="h"&gt;&lt;div class="ic"&gt;'+ch.ic+'&lt;/div&gt;&lt;div&gt;&lt;div class="t"&gt;'+ch.t+'&lt;/div&gt;&lt;div class="d"&gt;'+ch.d+'&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;'+
'&lt;/div&gt;'+
'&lt;div class="syn-task"&gt;&lt;div class="label"&gt;Задание&lt;/div&gt;'+ch.task.replace(/\n/g,'&lt;br&gt;')+'&lt;/div&gt;'+
'&lt;div class="syn-opts" id="syn-opts"&gt;&lt;/div&gt;'+
'&lt;div class="syn-fb" id="syn-fb"&gt;&lt;/div&gt;';
body.innerHTML=html;
var optsBox=$('#syn-opts');
ch.opts.forEach(function(opt,i){
var b=document.createElement('button');
b.className='syn-opt';
b.textContent=opt.t;
b.addEventListener('click',function(){chooseOpt(i)});
optsBox.appendChild(b);
});
}
function chooseOpt(i){
var ch=CHAPTERS[step];
var opt=ch.opts[i];
score+=opt.ok?17:-17;
history.push({step:step,choice:opt.t,ok:opt.ok});
var optsBox=$('#syn-opts');
optsBox.querySelectorAll('.syn-opt').forEach(function(b,idx){
b.disabled=true;
if(idx===i)b.classList.add(opt.ok?'right':'wrong');
else if(ch.opts[idx].ok)b.classList.add('right');
});
var fb=$('#syn-fb');
fb.innerHTML=(opt.ok?'✅ Верно! ':'❌ Неверно. ')+ch.explain;
fb.classList.add('show');
step++;
setTimeout(render,2500);
}
function finish(){
var goodCount=history.filter(function(h){return h.ok}).length;
var total=CHAPTERS.length;
var pct=Math.round(goodCount/total*100);
var title,icon,msg;
if(pct&gt;=75){
title='Дело раскрыто!';icon='?';
msg='Вы прошли все 4 главы и собрали достаточно улик. Синдикат разоблачён. Вы — настоящий детектив!';
addPR(15);
}else if(pct&gt;=50){
title='Почти получилось';icon='?';
msg='Вы прошли большинство глав, но пропустили пару улик. Попробуйте ещё раз — и дело будет закрыто.';
addPR(8);
}else{
title='Нужно больше улик';icon='?';
msg='Вы прошли кампанию, но собрали недостаточно улик. Попробуйте ещё раз — и дело будет закрыто.';
addPR(3);
}
var body=$('#syn-body');
body.innerHTML='&lt;div class="syn-final"&gt;'+
'&lt;div style="font-size:56px;margin-bottom:10px"&gt;'+icon+'&lt;/div&gt;'+
'&lt;b&gt;'+title+'&lt;/b&gt;'+
'&lt;p&gt;'+msg+'&lt;/p&gt;'+
'&lt;div style="display:flex;gap:14px;justify-content:center;margin:14px 0"&gt;'+
'&lt;div&gt;&lt;div style="font-size:22px;font-weight:800;color:#f0d68a"&gt;'+goodCount+'/'+total+'&lt;/div&gt;&lt;div style="font-size:10px;color:#a8987a"&gt;глав пройдено&lt;/div&gt;&lt;/div&gt;'+
'&lt;div&gt;&lt;div style="font-size:22px;font-weight:800;color:#f0d68a"&gt;'+score+'&lt;/div&gt;&lt;div style="font-size:10px;color:#a8987a"&gt;очков&lt;/div&gt;&lt;/div&gt;'+
'&lt;/div&gt;'+
'&lt;button class="syn-restart" id="syn-restart"&gt;? Пройти ещё раз&lt;/button&gt;'+
'&lt;/div&gt;';
$('#syn-restart').addEventListener('click',function(){
step=0;score=0;history=[];render();
});
}
$('#syn-btn').addEventListener('click',function(){$('#syn-mask').classList.add('open');step=0;score=0;history=[];render();});
$('#syn-close').addEventListener('click',function(){$('#syn-mask').classList.remove('open')});
$('#syn-mask').addEventListener('click',function(e){if(e.target===this)this.classList.remove('open')});
var nav=$('#pd-nav');
if(nav&amp;&amp;!nav.querySelector('[data-id="syn"]')){
var b=document.createElement('button');b.className='pd-item';b.setAttribute('data-id','syn');
b.innerHTML='&lt;i class="fas fa-film" style="width:20px;text-align:center"&gt;&lt;/i&gt;&lt;span&gt;Синдикат&lt;/span&gt;';
b.addEventListener('click',function(){$('#syn-mask').classList.add('open');step=0;score=0;history=[];render();});
nav.appendChild(b);
}
var hub=$('#pd-hub-grid');
if(hub&amp;&amp;!hub.querySelector('[data-id="syn"]')){
var h=document.createElement('div');h.className='pd-hitem';h.setAttribute('data-id','syn');
h.innerHTML='&lt;i class="fas fa-film"&gt;&lt;/i&gt;&lt;span&gt;Синдикат&lt;/span&gt;';
h.addEventListener('click',function(){$('#syn-mask').classList.add('open');step=0;score=0;history=[];render();});
hub.appendChild(h);
}
console.log('? Правдомер: Блок 5 · Сюжетная кампания «Синдикат» подключена');
})();
&lt;/script&gt;

&lt;style&gt;
/* Переопределяем позиции всех плавающих кнопок, чтобы не перекрывались */
/* Левая колонка (снизу вверх) */
#osint-btn{left:16px!important;bottom:24px!important;right:auto!important}
#dc-btn{left:16px!important;bottom:90px!important;right:auto!important}
#cs-btn{left:16px!important;bottom:156px!important;right:auto!important}
#mr-btn{left:16px!important;bottom:222px!important;right:auto!important}
#bc-btn{left:16px!important;bottom:288px!important;right:auto!important}
/* Правая колонка (снизу вверх) */
#sherlock-fab{right:24px!important;bottom:24px!important;left:auto!important}
#pd-hub-btn{right:16px!important;bottom:90px!important;left:auto!important}
#fp-btn{right:16px!important;bottom:156px!important;left:auto!important}
#lz-btn{right:16px!important;bottom:222px!important;left:auto!important}
#pg-btn{right:16px!important;bottom:288px!important;left:auto!important}
#truth-btn{right:16px!important;bottom:354px!important;left:auto!important}
#sy-btn{right:16px!important;bottom:420px!important;left:auto!important}
/* Убираем дубликаты */
#boss-btn{display:none!important}
#dc-fab{display:none!important}
#dc13-btn{display:none!important}
/* Фикс второго #rb-btn (Ветка B) — переименовываем */
#rb-btn~#rb-btn{display:none!important}
&lt;/style&gt;
&lt;script&gt;
(function(){
"use strict";
if(window._fixButtons)return;window._fixButtons=1;
var $=function(s){return document.querySelector(s)};

/* ═══ 1. ФИКС: второй #rb-btn не работает из-за конфликта флага ═══ */
/* Находим все элементы с id="rb-btn" */
var rbAll=document.querySelectorAll('#rb-btn');
if(rbAll.length&gt;1){
  /* Второй #rb-btn — это Ветка B. Переименовываем его */
  var rb2=rbAll[1];
  rb2.id='rb2-btn';
  rb2.style.display='flex';
  /* Переподключаем обработчик, если он не был подключён */
  if(!rb2._hasHandler){
    rb2._hasHandler=true;
    rb2.addEventListener('click',function(){
      /* Ищем маску Ветки B */
      var mask=document.querySelectorAll('#rb-mask');
      if(mask.length&gt;1){mask[1].classList.add('open');}
      else if(mask.length===1){mask[0].classList.add('open');}
    });
  }
}

/* ═══ 2. ФИКС: #truth-btn и #vd-fab перекрываются ═══ */
/* Уже исправлено через CSS выше */

/* ═══ 3. ДОБАВЛЯЕМ БЛОК «СИНДИКАТ» ═══ */
if(!$('#synd-mask')){
  var syndHTML='&lt;div id="synd-mask" style="position:fixed;inset:0;z-index:425;display:none;align-items:center;justify-content:center;background:rgba(8,5,15,.9);backdrop-filter:blur(6px)"&gt;'+
  '&lt;div style="width:min(680px,94vw);max-height:90vh;overflow-y:auto;border-radius:18px;padding:22px;color:#efe9dc;background:linear-gradient(180deg,#1a0d14,#0d0a14);border:1px solid rgba(239,68,68,.4);box-shadow:0 30px 60px rgba(0,0,0,.6)"&gt;'+
  '&lt;h3 style="margin:0 0 4px;font-size:20px;color:#fca5a5"&gt;?️ Синдикат · Сюжетная кампания&lt;/h3&gt;'+
  '&lt;div style="font-size:12px;color:#a79ec9;margin-bottom:14px"&gt;Расследуй сеть мошенников. Каждая глава — новый детектор. Пройди все 5 глав и раскрой синдикат.&lt;/div&gt;'+
  '&lt;div id="synd-body"&gt;&lt;/div&gt;'+
  '&lt;button id="synd-close" style="margin-top:14px;width:100%;border:1px solid rgba(239,68,68,.4);background:none;color:#fca5a5;border-radius:10px;padding:10px;cursor:pointer;font-size:13px"&gt;Закрыть&lt;/button&gt;'+
  '&lt;/div&gt;&lt;/div&gt;';
  document.body.insertAdjacentHTML('beforeend',syndHTML);
  
  /* Кнопка Синдиката */
  var syndBtn=document.createElement('button');
  syndBtn.id='synd-btn';
  syndBtn.title='Синдикат · Сюжетная кампания';
  syndBtn.textContent='?️';
  syndBtn.style.cssText='position:fixed;left:16px;bottom:354px;z-index:400;width:52px;height:52px;border-radius:50%;border:none;cursor:pointer;background:linear-gradient(135deg,#EF4444,#7C3AED);color:#fff;font-size:22px;box-shadow:0 6px 20px rgba(239,68,68,.45);transition:transform .2s';
  document.body.appendChild(syndBtn);
  
  /* Данные Синдиката */
  var SYND_CHAPTERS=[
    {ch:1,title:'Глава 1: Анонимное письмо',det:'Текст-детектор',task:'Пришло анонимное письмо с угрозами. Проанализируй текст на маркеры манипуляции.',answer:'manip'},
    {ch:2,title:'Глава 2: Голос в телефоне',det:'Голос-детектор',task:'Звонок от «директора» с просьбой перевести деньги. Проверь голос на стресс и синтетику.',answer:'fake'},
    {ch:3,title:'Глава 3: Поддельное фото',det:'Фото-детектор',task:'Прислали «доказательство» — фото документа. Проверь на монтаж через ELA.',answer:'fake'},
    {ch:4,title:'Глава 4: Соцсети синдиката',det:'Соц-детектор',task:'Аккаунт в соцсетях распространяет дезинформацию. Проверь на бота.',answer:'bot'},
    {ch:5,title:'Глава 5: Финал',det:'Фьюжн',task:'Собери все улики и вынеси вердикт: кто за всем этим стоит?',answer:'syndicate'}
  ];
  
  var syndState={ch:0,done:[]};
  try{var saved=localStorage.getItem('synd_state');if(saved)syndState=JSON.parse(saved);}catch(e){}
  
  function renderSynd(){
    var body=$('#synd-body');
    if(!body)return;
    if(syndState.ch&gt;=SYND_CHAPTERS.length){
      body.innerHTML='&lt;div style="text-align:center;padding:20px"&gt;&lt;div style="font-size:56px;margin-bottom:10px"&gt;?&lt;/div&gt;&lt;b style="font-size:18px;color:#f0d68a;display:block;margin-bottom:6px"&gt;Синдикат раскрыт!&lt;/b&gt;&lt;p style="font-size:13px;color:#d9d2ea;line-height:1.6"&gt;Ты прошёл все 5 глав и раскрыл сеть мошенников. Поздравляем!&lt;/p&gt;&lt;button id="synd-restart" style="margin-top:12px;padding:11px 22px;border:none;border-radius:12px;background:linear-gradient(135deg,#EF4444,#7C3AED);color:#fff;font-weight:800;cursor:pointer;font-size:13px"&gt;? Начать заново&lt;/button&gt;&lt;/div&gt;';
      var restart=$('#synd-restart');
      if(restart)restart.addEventListener('click',function(){syndState={ch:0,done:[]};try{localStorage.setItem('synd_state',JSON.stringify(syndState));}catch(e){}renderSynd();});
      return;
    }
    var ch=SYND_CHAPTERS[syndState.ch];
    var html='&lt;div style="display:flex;gap:4px;margin-bottom:12px"&gt;';
    for(var i=0;i&lt;SYND_CHAPTERS.length;i++){
      html+='&lt;div style="flex:1;height:5px;border-radius:999px;background:'+(i&lt;syndState.ch?'#10B981':i===syndState.ch?'linear-gradient(90deg,#EF4444,#8B5CF6)':'rgba(255,255,255,.1)')+'"&gt;&lt;/div&gt;';
    }
    html+='&lt;/div&gt;';
    html+='&lt;div style="background:rgba(239,68,68,.1);border:1px solid rgba(239,68,68,.3);border-radius:14px;padding:16px;margin-bottom:14px"&gt;';
    html+='&lt;div style="font-size:16px;font-weight:700;color:#fca5a5;margin-bottom:8px"&gt;'+ch.title+'&lt;/div&gt;';
    html+='&lt;div style="font-size:12px;color:#a79ec9;margin-bottom:8px"&gt;Детектор: '+ch.det+'&lt;/div&gt;';
    html+='&lt;div style="font-size:14px;color:#e8dff7;line-height:1.6"&gt;'+ch.task+'&lt;/div&gt;';
    html+='&lt;/div&gt;';
    html+='&lt;button id="synd-complete" style="width:100%;padding:12px;border:none;border-radius:12px;background:linear-gradient(135deg,#EF4444,#8B5CF6);color:#fff;font-weight:800;font-size:14px;cursor:pointer"&gt;✅ Глава пройдена&lt;/button&gt;';
    body.innerHTML=html;
    var btn=$('#synd-complete');
    if(btn)btn.addEventListener('click',function(){
      syndState.ch++;
      syndState.done.push(ch.ch);
      try{localStorage.setItem('synd_state',JSON.stringify(syndState));}catch(e){}
      if(window.PR&amp;&amp;window.PR.add)window.PR.add(10);
      renderSynd();
    });
  }
  
  syndBtn.addEventListener('click',function(){$('#synd-mask').style.display='flex';renderSynd();});
  var syndClose=$('#synd-close');
  if(syndClose)syndClose.addEventListener('click',function(){$('#synd-mask').style.display='none';});
  $('#synd-mask').addEventListener('click',function(e){if(e.target===this)this.style.display='none';});
  
  /* Добавляем в сайдбар и хаб */
  var nav=$('#pd-nav');
  if(nav&amp;&amp;!nav.querySelector('[data-id="synd"]')){
    var b=document.createElement('button');
    b.className='pd-item';
    b.setAttribute('data-id','synd');
    b.innerHTML='&lt;i class="fas fa-spider" style="width:20px;text-align:center"&gt;&lt;/i&gt;&lt;span&gt;Синдикат&lt;/span&gt;';
    b.addEventListener('click',function(){$('#synd-mask').style.display='flex';renderSynd();});
    nav.appendChild(b);
  }
  var hub=$('#pd-hub-grid');
  if(hub&amp;&amp;!hub.querySelector('[data-id="synd"]')){
    var h=document.createElement('div');
    h.className='pd-hitem';
    h.setAttribute('data-id','synd');
    h.innerHTML='&lt;i class="fas fa-spider"&gt;&lt;/i&gt;&lt;span&gt;Синдикат&lt;/span&gt;';
    h.addEventListener('click',function(){$('#synd-mask').style.display='flex';renderSynd();});
    hub.appendChild(h);
  }
}

/* ═══ 4. ФИКС: Челлендж дня ═══ */
/* Оставляем только #dc-btn, убираем дубликаты (уже сделано через CSS) */
/* Проверяем, что #dc-btn работает */
var dcBtn=$('#dc-btn');
if(dcBtn&amp;&amp;!dcBtn._hasHandler){
  dcBtn._hasHandler=true;
  dcBtn.addEventListener('click',function(){
    var mask=$('#dc-mask');
    if(mask)mask.classList.add('open');
  });
}

/* ═══ 5. ФИКС: Реальный детектор лжи (#truth-btn) ═══ */
var truthBtn=$('#truth-btn');
if(truthBtn&amp;&amp;!truthBtn._hasHandler){
  truthBtn._hasHandler=true;
  truthBtn.addEventListener('click',function(){
    var mask=$('#truth-mask');
    if(mask)mask.classList.add('open');
  });
}

console.log('? Исправление кнопок Правдомера применено');
})();
&lt;/script&gt;</subtitle>
  <updated>2026-09-18T09:27:14Z</updated>
  <logo>https://pandoraburo.ru/ssl/u/pic/ef/f66878aa6d11f1abb9f7ceed6face4/-/image%20%284%29.jpg</logo>
  <author>
    <name>1592962</name>
    <uri>https://www.pandoraburo.ru/</uri>
  </author>
</feed>
