<?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/igra</id>
  <link href="https://www.pandoraburo.ru/igra.xml" rel="self"/>
  <title>Игра</title>
  <subtitle type="html">&lt;p&gt;&lt;/p&gt;
&lt;style&gt;
:root{--pt-bg:#070A0F;--pt-panel:#121A26;--pt-panel2:#0e1520;--pt-txt:#E7EDF5;--pt-dim:#8D99AC;--pt-line:rgba(160,180,220,.14);--pt-green:#3DDC84;--pt-gold:#F5B301;--pt-red:#FF5C5C;}
body{margin:0;background:radial-gradient(900px 500px at 80% -10%,rgba(61,220,132,.07),transparent 60%),var(--pt-bg);color:var(--pt-txt);font-family:'Manrope',sans-serif}
*{box-sizing:border-box}
.pt-gate{position:fixed;inset:0;z-index:1000;background:rgba(4,7,12,.96);display:flex;align-items:center;justify-content:center;padding:20px}
/* ФИКС: оверлей «Это игра» должен скрываться */
#pt-gate[hidden],#pt-legal-banner[hidden]{display:none !important;}
.pt-gate-box{max-width:560px;background:var(--pt-panel);border:2px solid var(--pt-green);border-radius:16px;padding:32px;box-shadow:0 0 60px rgba(61,220,132,.25)}
.pt-gate-ico{font-size:40px;margin-bottom:12px}
.pt-gate-box h2{font-family:'Unbounded';font-size:1.5rem;margin:0 0 12px;color:var(--pt-green)}
.pt-gate-box p{color:var(--pt-dim);line-height:1.5;margin:8px 0}
.pt-gate-list{color:var(--pt-dim);line-height:1.6;padding-left:20px;margin:12px 0}
.pt-gate-list b{color:var(--pt-txt)}
.pt-gate-small{font-size:.8rem;color:var(--pt-dim)}
.pt-gate-btn{width:100%;margin-top:16px;padding:14px}
.pt-legal-banner{position:sticky;top:0;z-index:900;background:rgba(245,181,1,.12);border-bottom:1px solid rgba(245,181,1,.4);color:#FFD98A;font-size:.75rem;padding:8px 16px;display:flex;align-items:center;gap:10px;text-align:left}
.pt-banner-x{margin-left:auto;background:none;border:1px solid rgba(245,181,1,.5);color:#FFD98A;width:20px;height:20px;border-radius:50%;cursor:pointer;font-size:11px}
.pt-head{border-bottom:1px solid var(--pt-line);padding:14px 20px}
.pt-head-in{max-width:1100px;margin:0 auto;display:flex;align-items:center;gap:16px;flex-wrap:wrap}
.pt-logo{font-family:'Unbounded';font-weight:800;font-size:1.2rem;letter-spacing:.05em}
.pt-logo em{font-style:normal;color:var(--pt-green);margin:0 6px}
.pt-logo-sub{font-size:.65rem;color:var(--pt-dim);text-transform:uppercase;letter-spacing:.15em}
.pt-head-stats{margin-left:auto;display:flex;gap:14px}
.pt-stat{background:var(--pt-panel);border:1px solid var(--pt-line);border-radius:10px;padding:6px 14px;text-align:center}
.pt-stat-l{display:block;font-size:.6rem;color:var(--pt-dim);text-transform:uppercase;letter-spacing:.1em}
.pt-stat b{font-size:1.05rem;color:var(--pt-gold)}
.pt-stat:nth-child(2) b{color:var(--pt-green)}
.pt-stat:nth-child(3) b{color:#7AB8FF}
.pt-btn{font-family:'Manrope';font-weight:700;background:var(--pt-panel);color:var(--pt-txt);border:1px solid var(--pt-line);border-radius:10px;padding:9px 16px;cursor:pointer;transition:.2s;font-size:.85rem}
.pt-btn:hover{border-color:var(--pt-green);transform:translateY(-1px)}
.pt-btn-acc{background:var(--pt-green);color:#05261a;border-color:var(--pt-green)}
.pt-btn-acc:hover{box-shadow:0 0 18px rgba(61,220,132,.5)}
.pt-btn-sm{padding:6px 12px;font-size:.75rem}
.pt-btn:disabled{opacity:.5;cursor:not-allowed;transform:none}
.pt-nav{max-width:1100px;margin:16px auto 0;padding:0 20px;display:flex;gap:8px;flex-wrap:wrap}
.pt-tab{background:var(--pt-panel);border:1px solid var(--pt-line);color:var(--pt-dim);border-radius:10px;padding:10px 18px;cursor:pointer;font-weight:600;font-size:.85rem;transition:.2s}
.pt-tab.act{color:var(--pt-green);border-color:var(--pt-green)}
.pt-main{max-width:1100px;margin:0 auto;padding:20px}
.pt-sec{display:none;animation:pt-fade .3s ease}
.pt-sec.act{display:block}
@keyframes pt-fade{from{opacity:0;transform:translateY(8px)}to{opacity:1;transform:none}}
.pt-sec-head{display:flex;align-items:center;justify-content:space-between;gap:14px;margin-bottom:18px;flex-wrap:wrap}
.pt-sec-head h2{font-family:'Unbounded';font-size:1.2rem;margin:0}
.pt-subhead{font-family:'Unbounded';font-size:.9rem;margin:18px 0 12px}
.pt-note{font-size:.7rem;color:var(--pt-dim);margin-top:12px;text-align:center}
.pt-summary{display:grid;grid-template-columns:repeat(auto-fit,minmax(150px,1fr));gap:12px;margin-bottom:20px}
.pt-sum-card{background:var(--pt-panel);border:1px solid var(--pt-line);border-radius:12px;padding:14px;text-align:center}
.pt-sum-card span{display:block;font-size:.65rem;color:var(--pt-dim);text-transform:uppercase;letter-spacing:.1em;margin-bottom:6px}
.pt-sum-card b{font-size:1.3rem;color:var(--pt-txt)}
.pt-sum-card b.pt-accent{color:var(--pt-green)}
.pt-assets{display:grid;grid-template-columns:repeat(auto-fill,minmax(230px,1fr));gap:14px}
.pt-asset{background:var(--pt-panel);border:1px solid var(--pt-line);border-radius:14px;padding:16px;transition:.2s;display:flex;flex-direction:column;gap:8px}
.pt-asset:hover{transform:translateY(-3px);border-color:var(--pt-green);box-shadow:0 8px 24px rgba(0,0,0,.4)}
.pt-asset-top{display:flex;align-items:center;gap:10px}
.pt-asset-ico{font-size:28px}
.pt-asset-name{font-weight:700;font-size:.95rem}
.pt-asset-cat{font-size:.6rem;color:var(--pt-dim);text-transform:uppercase;letter-spacing:.1em}
.pt-asset-desc{font-size:.78rem;color:var(--pt-dim);line-height:1.4;flex:1}
.pt-asset-meta{display:flex;justify-content:space-between;align-items:center;font-size:.8rem}
.pt-asset-income{color:var(--pt-green);font-weight:700}
.pt-asset-cost{color:var(--pt-gold);font-weight:700}
.pt-asset .pt-btn{width:100%}
.pt-empty{grid-column:1/-1;text-align:center;color:var(--pt-dim);padding:40px;background:var(--pt-panel);border:1px dashed var(--pt-line);border-radius:14px}
.pt-filters{display:flex;gap:8px;flex-wrap:wrap}
.pt-chip{background:var(--pt-panel);border:1px solid var(--pt-line);color:var(--pt-dim);border-radius:999px;padding:6px 14px;cursor:pointer;font-size:.75rem;font-weight:600;transition:.2s}
.pt-chip.act{color:#05261a;background:var(--pt-green);border-color:var(--pt-green)}
.pt-cd{height:6px;background:var(--pt-panel2);border-radius:3px;overflow:hidden;margin-top:4px}
.pt-cd i{display:block;height:100%;background:var(--pt-gold);width:0%;transition:width .5s linear}
.pt-toast{position:fixed;bottom:24px;right:24px;z-index:950;background:var(--pt-panel);border:1px solid var(--pt-green);border-left:4px solid var(--pt-green);color:var(--pt-txt);padding:12px 18px;border-radius:10px;box-shadow:0 8px 24px rgba(0,0,0,.5);font-size:.85rem;max-width:320px;animation:pt-toast .3s ease}
.pt-toast.err{border-color:var(--pt-red);border-left-color:var(--pt-red)}
@keyframes pt-toast{from{opacity:0;transform:translateX(30px)}to{opacity:1;transform:none}}
.pt-foot{border-top:1px solid var(--pt-line);margin-top:30px;padding:20px;text-align:center}
.pt-foot p{max-width:800px;margin:0 auto 8px;font-size:.7rem;color:var(--pt-dim);line-height:1.5}
.pt-foot-small{font-size:.62rem;opacity:.7}
.pt-mine-box{background:var(--pt-panel);border:1px solid var(--pt-line);border-radius:12px;padding:14px;margin-bottom:18px}
.pt-mine-label{display:block;font-size:.7rem;color:var(--pt-dim);margin-bottom:8px;text-transform:uppercase;letter-spacing:.08em}
.pt-mine-display{display:block;font-family:'JetBrains Mono',monospace;font-size:.8rem;color:var(--pt-green);word-break:break-all;min-height:1.2em}
.pt-ledger-cols{display:grid;grid-template-columns:1.2fr 1fr;gap:20px}
.pt-chain{display:flex;flex-direction:column;max-height:520px;overflow-y:auto;padding-right:6px}
.pt-block{background:var(--pt-panel);border:1px solid var(--pt-line);border-left:3px solid var(--pt-green);border-radius:10px;padding:12px}
.pt-block-bad{border-left-color:var(--pt-red);background:rgba(255,92,92,.06)}
.pt-block-head{display:flex;justify-content:space-between;align-items:center;margin-bottom:8px}
.pt-block-head b{font-size:.9rem}
.pt-block-badge{font-size:.62rem;padding:2px 8px;border-radius:999px;font-weight:700}
.pt-block-badge.ok{background:rgba(61,220,132,.15);color:var(--pt-green)}
.pt-block-badge.bad{background:rgba(255,92,92,.15);color:var(--pt-red)}
.pt-block-row{display:flex;justify-content:space-between;gap:10px;font-size:.7rem;margin:3px 0}
.pt-block-row span{color:var(--pt-dim);flex:0 0 42px}
.pt-block-row code{font-family:'JetBrains Mono',monospace;color:var(--pt-txt);word-break:break-all;text-align:right}
.pt-link{text-align:center;color:var(--pt-green);font-size:.9rem;line-height:1;padding:2px 0}
.pt-txs{display:flex;flex-direction:column;gap:8px;max-height:520px;overflow-y:auto}
.pt-tx{background:var(--pt-panel);border:1px solid var(--pt-line);border-radius:10px;padding:10px;display:flex;flex-direction:column;gap:4px}
.pt-tx-type{font-size:.6rem;color:var(--pt-gold);text-transform:uppercase;letter-spacing:.1em}
.pt-tx-main{font-size:.78rem}
.pt-tx-amt{font-size:.8rem;color:var(--pt-green);font-weight:700}
.pt-ledger-actions{display:flex;gap:8px;flex-wrap:wrap}
.pt-btn-warn{background:transparent;border:1px solid var(--pt-red);color:var(--pt-red)}
.pt-btn-warn:hover{background:rgba(255,92,92,.12)}
.pt-quest-list{display:grid;grid-template-columns:repeat(auto-fill,minmax(260px,1fr));gap:12px}
.pt-quest{background:var(--pt-panel);border:1px solid var(--pt-line);border-radius:12px;padding:14px;display:flex;gap:12px;align-items:center;transition:.2s;opacity:.45}
.pt-quest.done{opacity:1;border-color:var(--pt-gold);background:rgba(245,179,1,.06)}
.pt-quest-ico{font-size:28px;flex:0 0 auto}
.pt-quest-body{flex:1}
.pt-quest-top{display:flex;justify-content:space-between;align-items:center;gap:8px}
.pt-quest-top b{font-size:.9rem;color:var(--pt-txt)}
.pt-quest-reward{font-size:.7rem;color:var(--pt-gold);font-weight:700;white-space:nowrap}
.pt-quest-desc{font-size:.72rem;color:var(--pt-dim);margin-top:2px}
.pt-quest-status{font-size:1.2rem;color:var(--pt-green);font-weight:700}
.pt-constructor{background:var(--pt-panel);border:1px solid var(--pt-line);border-radius:12px;padding:18px;margin-bottom:14px;display:flex;flex-direction:column;gap:12px;max-width:640px}
.pt-constr-row{display:flex;align-items:center;gap:12px}
.pt-constr-kw{font-family:'Unbounded';font-size:.75rem;font-weight:700;flex:0 0 70px;text-align:right}
.pt-kw-when{color:#7AB8FF}.pt-kw-then{color:var(--pt-green)}.pt-kw-else{color:var(--pt-gold)}
.pt-select{flex:1;background:var(--pt-panel2);border:1px solid var(--pt-line);color:var(--pt-txt);padding:10px;border-radius:8px;font-size:.85rem;outline:none}
.pt-constr-actions{display:flex;justify-content:flex-end}
.pt-code{background:#0a0e14;border:1px solid var(--pt-line);border-radius:10px;padding:14px;font-family:'JetBrains Mono',monospace;font-size:.78rem;color:#9fd8b0;white-space:pre-wrap;margin:0 0 20px;overflow-x:auto;max-width:640px}
.pt-c-list{display:flex;flex-direction:column;gap:12px;max-width:640px}
.pt-contract{background:var(--pt-panel);border:1px solid var(--pt-line);border-left:3px solid #7AB8FF;border-radius:10px;padding:14px}
.pt-contract.done{border-left-color:var(--pt-green)}
.pt-contract-head{display:flex;justify-content:space-between;align-items:center;margin-bottom:8px;gap:10px}
.pt-contract-head code{font-family:'JetBrains Mono',monospace;font-size:.75rem;color:var(--pt-dim)}
.pt-contract-status{font-size:.7rem;color:var(--pt-green);font-weight:700}
.pt-contract-line{font-size:.8rem;margin:4px 0;line-height:1.45}
.pt-contract-line .pt-kw-when,.pt-contract-line .pt-kw-then,.pt-contract-line .pt-kw-else{font-family:'Unbounded';font-size:.62rem;font-weight:700;margin-right:6px}
.pt-templates{display:flex;align-items:center;gap:8px;flex-wrap:wrap;margin-bottom:12px}
.pt-templates-label{font-size:.7rem;color:var(--pt-dim);text-transform:uppercase;letter-spacing:.1em}
.pt-feed{background:var(--pt-panel);border:1px solid var(--pt-line);border-radius:12px;padding:12px;max-height:200px;overflow-y:auto;margin-bottom:16px;display:flex;flex-direction:column;gap:6px}
.pt-feed-item{display:flex;gap:10px;font-size:.78rem;color:var(--pt-dim);padding:6px 8px;background:var(--pt-panel2);border-radius:6px}
.pt-feed-time{color:var(--pt-green);font-family:'JetBrains Mono',monospace;font-size:.68rem;flex:0 0 auto}
.pt-auctions{display:grid;grid-template-columns:repeat(auto-fill,minmax(280px,1fr));gap:14px;margin-bottom:20px}
.pt-auction{background:var(--pt-panel);border:1px solid var(--pt-line);border-radius:14px;padding:16px;display:flex;flex-direction:column;gap:10px}
.pt-auction.done{opacity:.75}
.pt-auction-top{display:flex;align-items:center;gap:10px}
.pt-auction-ico{font-size:26px}
.pt-auction-name{font-weight:700;font-size:.95rem}
.pt-auction-cat{font-size:.62rem;color:var(--pt-dim)}
.pt-auction-timer{margin-left:auto;font-family:'JetBrains Mono',monospace;color:var(--pt-gold);font-size:.8rem;white-space:nowrap}
.pt-auction-meta{display:flex;justify-content:space-between;font-size:.75rem;color:var(--pt-dim);flex-wrap:wrap;gap:6px}
.pt-auction-meta b{color:var(--pt-gold)}
.pt-auction-bidrow{display:flex;gap:8px}
.pt-auction-in{flex:1;background:var(--pt-panel2);border:1px solid var(--pt-line);color:var(--pt-txt);padding:8px;border-radius:8px;font-size:.85rem;outline:none;min-width:0}
.pt-auction-status{font-size:.8rem;color:var(--pt-green);font-weight:700;text-align:center;padding:8px}
.pt-corps{display:grid;grid-template-columns:repeat(auto-fill,minmax(280px,1fr));gap:14px}
.pt-corp{background:var(--pt-panel);border:1px solid var(--pt-line);border-radius:14px;padding:16px;display:flex;flex-direction:column;gap:10px}
.pt-corp.member{border-color:var(--pt-green)}
.pt-corp.own{border-color:var(--pt-gold)}
.pt-corp-top{display:flex;justify-content:space-between;align-items:center;gap:10px;flex-wrap:wrap}
.pt-corp-top b{font-size:.95rem}
.pt-corp-status{font-size:.72rem;color:var(--pt-green);font-weight:700}
.pt-corp-meta{display:flex;flex-direction:column;gap:4px;font-size:.75rem;color:var(--pt-dim)}
.pt-corp-create{display:flex;gap:8px}
.pt-corp-name{flex:1;background:var(--pt-panel2);border:1px solid var(--pt-line);color:var(--pt-txt);padding:8px;border-radius:8px;font-size:.85rem;outline:none;min-width:0}
#pt-fx-canvas{position:fixed;inset:0;pointer-events:none;z-index:9999}
@media(max-width:820px){.pt-ledger-cols{grid-template-columns:1fr}}
@media(max-width:640px){.pt-head-stats{margin-left:0;width:100%;justify-content:space-between}.pt-summary{grid-template-columns:1fr 1fr}}
&lt;/style&gt;
&lt;div class="pt-gate" id="pt-gate"&gt;
&lt;div class="pt-gate-box"&gt;
&lt;div class="pt-gate-ico"&gt;⚠️&lt;/div&gt;
&lt;h2&gt;Это игра. Тренировочная модель.&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;PANDO Tycoon&lt;/strong&gt; &amp;mdash; развлекательная игра и образовательный симулятор блокчейн-экономики.&lt;/p&gt;
&lt;ul class="pt-gate-list"&gt;
&lt;li&gt;Все активы, монеты PDC и сделки &amp;mdash; &lt;strong&gt;виртуальные игровые объекты без денежной стоимости&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Их &lt;strong&gt;нельзя обменять&lt;/strong&gt; на реальные деньги или имущество.&lt;/li&gt;
&lt;li&gt;Игра &lt;strong&gt;не является&lt;/strong&gt; финансовой услугой, инвестицией или средством платежа.&lt;/li&gt;
&lt;li&gt;&amp;laquo;Другие игроки&amp;raquo; &amp;mdash; симуляция (NPC), не реальные люди.&lt;/li&gt;
&lt;/ul&gt;
&lt;p class="pt-gate-small"&gt;Продолжая, вы подтверждаете, что понимаете: это игра. 18+&lt;/p&gt;
&lt;button class="pt-btn pt-btn-acc pt-gate-btn" id="pt-gate-accept"&gt;Я понимаю, это игра &amp;mdash; начать&lt;/button&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div class="pt-legal-banner" id="pt-legal-banner"&gt;? Это игра и учебный симулятор. Все активы и PDC &amp;mdash; виртуальные, без реальной стоимости. Не финансовая услуга. 18+ &lt;button class="pt-banner-x" id="pt-banner-more" title="Подробнее"&gt;?&lt;/button&gt;&lt;/div&gt;
&lt;div id="pt-app"&gt;&lt;header class="pt-head"&gt;
&lt;div class="pt-head-in"&gt;&lt;span class="pt-logo"&gt;PANDO&lt;em&gt;◆&lt;/em&gt;TYCOON&lt;/span&gt; &lt;span class="pt-logo-sub"&gt;блокчейн-песочница &amp;middot; игра&lt;/span&gt;
&lt;div class="pt-head-stats"&gt;
&lt;div class="pt-stat"&gt;&lt;span class="pt-stat-l"&gt;PDC&lt;/span&gt;&lt;strong id="pt-pdc"&gt;0&lt;/strong&gt;&lt;/div&gt;
&lt;div class="pt-stat"&gt;&lt;span class="pt-stat-l"&gt;Уровень&lt;/span&gt;&lt;strong id="pt-level"&gt;1&lt;/strong&gt;&lt;/div&gt;
&lt;div class="pt-stat"&gt;&lt;span class="pt-stat-l"&gt;Репутация&lt;/span&gt;&lt;strong id="pt-rep"&gt;0&lt;/strong&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;button class="pt-btn pt-btn-sm" id="pt-reset"&gt;Сброс&lt;/button&gt;&lt;/div&gt;
&lt;/header&gt;&lt;nav class="pt-nav"&gt;&lt;button class="pt-tab act" data-t="dash"&gt;? Империя&lt;/button&gt; &lt;button class="pt-tab" data-t="shop"&gt;? Магазин&lt;/button&gt; &lt;button class="pt-tab" data-t="ledger"&gt;⛓️ Реестр&lt;/button&gt; &lt;button class="pt-tab" data-t="quests"&gt;? Квесты&lt;/button&gt; &lt;button class="pt-tab" data-t="contracts"&gt;? Договоры&lt;/button&gt; &lt;button class="pt-tab" data-t="mp"&gt;? Мультиплеер&lt;/button&gt;&lt;/nav&gt;&lt;main class="pt-main"&gt;
&lt;section id="pt-dash" class="pt-sec act"&gt;
&lt;div class="pt-sec-head"&gt;
&lt;h2&gt;Моя империя&lt;/h2&gt;
&lt;button class="pt-btn pt-btn-acc" id="pt-collect-all"&gt;? Собрать весь доход&lt;/button&gt;&lt;/div&gt;
&lt;div class="pt-summary"&gt;
&lt;div class="pt-sum-card"&gt;&lt;span&gt;Активов&lt;/span&gt;&lt;strong id="pt-assets-count"&gt;0&lt;/strong&gt;&lt;/div&gt;
&lt;div class="pt-sum-card"&gt;&lt;span&gt;Доход / цикл&lt;/span&gt;&lt;strong id="pt-income-rate"&gt;0 PDC&lt;/strong&gt;&lt;/div&gt;
&lt;div class="pt-sum-card"&gt;&lt;span&gt;Заработано всего&lt;/span&gt;&lt;strong id="pt-total-earned"&gt;0 PDC&lt;/strong&gt;&lt;/div&gt;
&lt;div class="pt-sum-card"&gt;&lt;span&gt;Готово к сбору&lt;/span&gt;&lt;strong id="pt-ready-count" class="pt-accent"&gt;0&lt;/strong&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div class="pt-assets" id="pt-my-assets"&gt;
&lt;div class="pt-empty"&gt;Пока пусто. Купите первый актив в &amp;laquo;Магазине&amp;raquo; &amp;rarr;&lt;/div&gt;
&lt;/div&gt;
&lt;/section&gt;
&lt;section id="pt-shop" class="pt-sec"&gt;
&lt;div class="pt-sec-head"&gt;
&lt;h2&gt;Магазин активов&lt;/h2&gt;
&lt;div class="pt-filters" id="pt-filters"&gt;&lt;button class="pt-chip act" data-cat="all"&gt;Все&lt;/button&gt; &lt;button class="pt-chip" data-cat="Производство"&gt;? Производство&lt;/button&gt; &lt;button class="pt-chip" data-cat="Транспорт"&gt;? Транспорт&lt;/button&gt; &lt;button class="pt-chip" data-cat="Недвижимость"&gt;? Недвижимость&lt;/button&gt; &lt;button class="pt-chip" data-cat="Бизнес"&gt;? Бизнес&lt;/button&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div class="pt-assets" id="pt-catalog"&gt;&lt;/div&gt;
&lt;p class="pt-note"&gt;Покупка за виртуальные PDC. Редкие активы &amp;mdash; на &amp;laquo;Чёрном рынке&amp;raquo;.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="pt-ledger" class="pt-sec"&gt;
&lt;div class="pt-sec-head"&gt;
&lt;h2&gt;Игровой реестр&lt;/h2&gt;
&lt;div class="pt-ledger-actions"&gt;&lt;button class="pt-btn pt-btn-acc" id="pt-mine-btn"&gt;⛏️ Добыть блок&lt;/button&gt; &lt;button class="pt-btn" id="pt-verify-btn"&gt;? Проверить цепь&lt;/button&gt; &lt;button class="pt-btn pt-btn-warn" id="pt-attack-btn"&gt;? Подделать блок&lt;/button&gt; &lt;button class="pt-btn" id="pt-repair-btn"&gt;? Восстановить&lt;/button&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div class="pt-summary" id="pt-ledger-stats"&gt;&lt;/div&gt;
&lt;div class="pt-mine-box"&gt;&lt;span class="pt-mine-label"&gt;Поиск nonce &amp;middot; proof-of-work &amp;middot; правило: хеш должен начинаться с &amp;laquo;0&amp;raquo;&lt;/span&gt; &lt;code id="pt-mine-display" class="pt-mine-display"&gt;нажмите &amp;laquo;Добыть блок&amp;raquo;&amp;hellip;&lt;/code&gt;&lt;/div&gt;
&lt;div class="pt-ledger-cols"&gt;
&lt;div&gt;
&lt;h3 class="pt-subhead"&gt;⛓️ Цепь блоков&lt;/h3&gt;
&lt;div class="pt-chain" id="pt-chain"&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;h3 class="pt-subhead"&gt;? Последние транзакции&lt;/h3&gt;
&lt;div class="pt-txs" id="pt-txs"&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p class="pt-note"&gt;Учебная имитация блокчейна внутри игры. Подделка любого блока сразу видна. Никакой реальной криптовалюты.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="pt-quests" class="pt-sec"&gt;
&lt;div class="pt-sec-head"&gt;
&lt;h2&gt;Квесты&lt;/h2&gt;
&lt;div class="pt-quest-summary" id="pt-quest-summary"&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p class="pt-note"&gt;Выполняйте квесты, чтобы освоить механику блокчейн-экономики и получить награды в PDC. Прогресс сохраняется.&lt;/p&gt;
&lt;div class="pt-quest-list" id="pt-quest-list"&gt;&lt;/div&gt;
&lt;/section&gt;
&lt;section id="pt-contracts" class="pt-sec"&gt;
&lt;div class="pt-sec-head"&gt;
&lt;h2&gt;Смарт-договоры&lt;/h2&gt;
&lt;/div&gt;
&lt;p class="pt-note"&gt;Смарт-договор автоматически исполняет условия сделки. Соберите &amp;laquo;КОГДА &amp;rarr; ТОГДА &amp;rarr; ИНАЧЕ&amp;raquo;, разверните в реестре (газ 5 PDC) и исполните. Всё внутри игры.&lt;/p&gt;
&lt;div class="pt-templates"&gt;&lt;span class="pt-templates-label"&gt;Шаблоны:&lt;/span&gt; &lt;button class="pt-chip" data-tpl="escrow"&gt;? Эскроу-сделка&lt;/button&gt; &lt;button class="pt-chip" data-tpl="rent"&gt;? Авто-аренда&lt;/button&gt; &lt;button class="pt-chip" data-tpl="buy"&gt;? Условная покупка&lt;/button&gt;&lt;/div&gt;
&lt;div class="pt-constructor"&gt;
&lt;div class="pt-constr-row"&gt;&lt;span class="pt-constr-kw pt-kw-when"&gt;КОГДА&lt;/span&gt;&lt;select id="pt-c-when" class="pt-select"&gt;&lt;/select&gt;&lt;/div&gt;
&lt;div class="pt-constr-row"&gt;&lt;span class="pt-constr-kw pt-kw-then"&gt;ТОГДА&lt;/span&gt;&lt;select id="pt-c-then" class="pt-select"&gt;&lt;/select&gt;&lt;/div&gt;
&lt;div class="pt-constr-row"&gt;&lt;span class="pt-constr-kw pt-kw-else"&gt;ИНАЧЕ&lt;/span&gt;&lt;select id="pt-c-else" class="pt-select"&gt;&lt;/select&gt;&lt;/div&gt;
&lt;div class="pt-constr-actions"&gt;&lt;button class="pt-btn pt-btn-acc" id="pt-c-deploy"&gt;? Развернуть договор &amp;middot; газ 5 PDC&lt;/button&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;pre id="pt-c-code" class="pt-code"&gt;&amp;nbsp;&lt;/pre&gt;
&lt;h3 class="pt-subhead"&gt;? Развёрнутые договоры&lt;/h3&gt;
&lt;div class="pt-c-list" id="pt-c-list"&gt;&lt;/div&gt;
&lt;/section&gt;
&lt;section id="pt-mp" class="pt-sec"&gt;
&lt;div class="pt-sec-head"&gt;
&lt;h2&gt;Мультиплеер&lt;/h2&gt;
&lt;/div&gt;
&lt;p class="pt-note"&gt;Симуляция онлайн-игры: другие игроки делают ставки, вступают в корпорации &amp;mdash; их действия видны в &amp;laquo;Эфире&amp;raquo;. Всё внутри игры, никакой реальной криптовалюты.&lt;/p&gt;
&lt;h3 class="pt-subhead"&gt;? Эфир активности&lt;/h3&gt;
&lt;div class="pt-feed" id="pt-feed"&gt;&lt;/div&gt;
&lt;h3 class="pt-subhead"&gt;? Аукционы редких активов&lt;/h3&gt;
&lt;div class="pt-auctions" id="pt-auctions"&gt;&lt;/div&gt;
&lt;h3 class="pt-subhead"&gt;?️ Корпорации&lt;/h3&gt;
&lt;div class="pt-corps" id="pt-corps"&gt;&lt;/div&gt;
&lt;/section&gt;
&lt;/main&gt;&lt;footer class="pt-foot"&gt;
&lt;p&gt;&lt;strong&gt;PANDO Tycoon&lt;/strong&gt; &amp;mdash; развлекательная игра и образовательный симулятор. Все активы, валюта PDC и сделки &amp;mdash; виртуальные игровые объекты без денежной стоимости. Не является финансовой услугой, инвестиционным инструментом или средством платежа. &amp;laquo;Другие игроки&amp;raquo; &amp;mdash; симуляция. 18+&lt;/p&gt;
&lt;p class="pt-foot-small"&gt;Тренировочная модель до легализации. После изменения законодательства возможна миграция на реальный протокол PANDO.&lt;/p&gt;
&lt;/footer&gt;&lt;/div&gt;
&lt;p&gt;&lt;canvas id="pt-fx-canvas"&gt;&lt;/canvas&gt;&lt;/p&gt;
&lt;script&gt;
window.PT=(function(){
  var KEY='pt_state_v1';var COLLECT_CD=20000;
  var state={accepted:false,pdc:1000,level:1,xp:0,rep:0,assets:[],txs:[],blocks:[],quests:{},totalEarned:0};
  var CATALOG=[
    {id:'shop1',cat:'Бизнес',icon:'?',name:'Магазин у дома',cost:300,income:3,desc:'Розничная торговля у дома.'},
    {id:'farm1',cat:'Производство',icon:'?',name:'Ферма',cost:400,income:4,desc:'Выращивает урожай каждый цикл.'},
    {id:'factory1',cat:'Производство',icon:'?',name:'Мини-завод',cost:500,income:5,desc:'Производит детали на продажу.'},
    {id:'land1',cat:'Недвижимость',icon:'?️',name:'Земельный участок',cost:600,income:6,desc:'Земля, которая приносит аренду.'},
    {id:'ship1',cat:'Транспорт',icon:'?',name:'Пароход «Пионер»',cost:800,income:9,desc:'Перевозит грузы по реке.'},
    {id:'mine1',cat:'Производство',icon:'⛏️',name:'Шахта',cost:1000,income:12,desc:'Добывает руду круглосуточно.'},
    {id:'estate1',cat:'Недвижимость',icon:'?',name:'Офис-центр',cost:1200,income:14,desc:'Сдаётся в аренду компаниям.'},
    {id:'plane1',cat:'Транспорт',icon:'✈️',name:'Грузовой самолёт',cost:1500,income:18,desc:'Быстрые авиаперевозки.'}
  ];
  function save(){try{localStorage.setItem(KEY,JSON.stringify(state));}catch(e){}}
  function load(){try{var raw=localStorage.getItem(KEY);if(raw){var s=JSON.parse(raw);for(var k in s){if(state.hasOwnProperty(k))state[k]=s[k];}}}catch(e){}}
  function hash(str){var h=0x811c9dc5;for(var i=0;i&lt;str.length;i++){h^=str.charCodeAt(i);h=Math.imul(h,0x01000193);}var hex=('0000000'+(h&gt;&gt;&gt;0).toString(16)).slice(-8);return (hex+hex+hex+hex+hex).slice(0,40);}
  function addTx(from,to,amount,type){
    var tx={id:state.txs.length+1,from:from,to:to,amount:amount,type:type,ts:Date.now()};
    state.txs.unshift(tx);if(state.txs.length&gt;50)state.txs.pop();
    if(state.txs.length%3===0){
      var prev=state.blocks.length?state.blocks[0].hash:hash('genesis');
      var b={height:state.blocks.length+1,prevHash:prev,hash:hash(prev+tx.id+Date.now()),txCount:3,ts:Date.now()};
      state.blocks.unshift(b);if(state.blocks.length&gt;30)state.blocks.pop();
    }
    save();return tx;
  }
  function addXP(n){state.xp+=n;state.level=1+Math.floor(state.xp/100);save();}
  load();
  return {state:state,CATALOG:CATALOG,COLLECT_CD:COLLECT_CD,save:save,load:load,addTx:addTx,addXP:addXP,hash:hash,
    reset:function(){if(confirm('Сбросить весь прогресс игры?')){localStorage.removeItem(KEY);location.reload();}}};
})();
&lt;/script&gt;
&lt;script&gt;
(function(){
  var PT=window.PT,S=PT.state;
  function $(id){return document.getElementById(id);}
  function fmt(n){return new Intl.NumberFormat('ru-RU').format(Math.round(n));}
  function toast(msg,isErr){
    var old=document.querySelector('.pt-toast');if(old)old.remove();
    var t=document.createElement('div');t.className='pt-toast'+(isErr?' err':'');t.textContent=msg;
    document.body.appendChild(t);setTimeout(function(){t.remove();},2600);
  }
  function showGate(){$('pt-gate').hidden=false;$('pt-legal-banner').hidden=false;}
  function hideGate(){$('pt-gate').hidden=true;$('pt-legal-banner').hidden=false;}
  $('pt-gate-accept').onclick=function(){S.accepted=true;PT.save();hideGate();toast('Добро пожаловать в PANDO Tycoon! Это игра ?');};
  $('pt-banner-more').onclick=function(){showGate();};
  if(!S.accepted){showGate();}else{$('pt-legal-banner').hidden=false;}

  document.querySelectorAll('.pt-tab').forEach(function(t){
    t.onclick=function(){
      document.querySelectorAll('.pt-tab').forEach(function(x){x.classList.remove('act');});
      document.querySelectorAll('.pt-sec').forEach(function(x){x.classList.remove('act');});
      t.classList.add('act');
      var map={dash:'pt-dash',shop:'pt-shop',ledger:'pt-ledger',quests:'pt-quests',contracts:'pt-contracts',mp:'pt-mp'};
      $(map[t.dataset.t]).classList.add('act');
    };
  });

  function totalAssets(){return S.assets.reduce(function(n,a){return n+a.count;},0);}
  function incomeRate(){return S.assets.reduce(function(r,a){return r+a.income*a.count;},0);}
  function readyCount(){var now=Date.now();return S.assets.filter(function(a){return now-a.lastCollect&gt;=PT.COLLECT_CD;}).length;}
  function renderHead(){
    $('pt-pdc').textContent=fmt(S.pdc);
    $('pt-level').textContent=S.level;
    $('pt-rep').textContent=S.rep;
    $('pt-assets-count').textContent=totalAssets();
    $('pt-income-rate').textContent=fmt(incomeRate())+' PDC';
    $('pt-total-earned').textContent=fmt(S.totalEarned)+' PDC';
    $('pt-ready-count').textContent=readyCount();
  }
  function renderMyAssets(){
    var box=$('pt-my-assets');
    if(!S.assets.length){box.innerHTML='&lt;div class="pt-empty"&gt;Пока пусто. Купите первый актив в «Магазине» &amp;#8594;&lt;/div&gt;';return;}
    box.innerHTML='';
    S.assets.forEach(function(a,idx){
      var now=Date.now(),ready=now-a.lastCollect&gt;=PT.COLLECT_CD,left=Math.max(0,PT.COLLECT_CD-(now-a.lastCollect));
      var pct=ready?100:Math.round((1-left/PT.COLLECT_CD)*100);
      var el=document.createElement('div');el.className='pt-asset';
      el.innerHTML='&lt;div class="pt-asset-top"&gt;&lt;span class="pt-asset-ico"&gt;'+a.icon+'&lt;/span&gt;&lt;div&gt;&lt;div class="pt-asset-name"&gt;'+a.name+'&lt;/div&gt;&lt;div class="pt-asset-cat"&gt;'+a.cat+'&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;'
        +'&lt;div class="pt-asset-desc"&gt;'+a.desc+'&lt;/div&gt;'
        +'&lt;div class="pt-asset-meta"&gt;&lt;span class="pt-asset-income"&gt;+'+(a.income*a.count)+' PDC&lt;/span&gt;&lt;span&gt;'+a.count+' шт.&lt;/span&gt;&lt;/div&gt;'
        +'&lt;div class="pt-cd"&gt;&lt;i style="width:'+pct+'%"&gt;&lt;/i&gt;&lt;/div&gt;'
        +'&lt;button class="pt-btn '+(ready?'pt-btn-acc':'')+'" data-i="'+idx+'" '+(ready?'':'disabled')+'&gt;Собрать '+(ready?a.income*a.count+' PDC':Math.ceil(left/1000)+' сек')+'&lt;/button&gt;';
      box.appendChild(el);
    });
    box.querySelectorAll('button[data-i]').forEach(function(b){b.onclick=function(){collect(+b.dataset.i);};});
  }
  function collect(i){
    var a=S.assets[i];if(!a)return;
    var now=Date.now();if(now-a.lastCollect&lt;PT.COLLECT_CD)return;
    var gain=a.income*a.count;
    S.pdc+=gain;S.totalEarned+=gain;a.lastCollect=now;
    PT.addXP(gain);PT.addTx('Актив «'+a.name+'»','Вы',gain,'доход');
    PT.save();renderAll();toast('+'+fmt(gain)+' PDC с «'+a.name+'» ?');
  }
  $('pt-collect-all').onclick=function(){
    var now=Date.now(),total=0,any=false;
    S.assets.forEach(function(a){if(now-a.lastCollect&gt;=PT.COLLECT_CD){var g=a.income*a.count;S.pdc+=g;S.totalEarned+=g;a.lastCollect=now;total+=g;PT.addXP(g);any=true;}});
    if(any){PT.addTx('Активы','Вы',total,'доход');PT.save();renderAll();toast('Собрано '+fmt(total)+' PDC со всех активов ?');}
    else toast('Пока ничего не готово к сбору',true);
  };
  var curCat='all';
  function renderCatalog(){
    var box=$('pt-catalog');box.innerHTML='';
    PT.CATALOG.filter(function(c){return curCat==='all'||c.cat===curCat;}).forEach(function(c){
      var owned=0;S.assets.forEach(function(a){if(a.id===c.id)owned=a.count;});
      var can=S.pdc&gt;=c.cost;
      var el=document.createElement('div');el.className='pt-asset';
      el.innerHTML='&lt;div class="pt-asset-top"&gt;&lt;span class="pt-asset-ico"&gt;'+c.icon+'&lt;/span&gt;&lt;div&gt;&lt;div class="pt-asset-name"&gt;'+c.name+'&lt;/div&gt;&lt;div class="pt-asset-cat"&gt;'+c.cat+'&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;'
        +'&lt;div class="pt-asset-desc"&gt;'+c.desc+'&lt;/div&gt;'
        +'&lt;div class="pt-asset-meta"&gt;&lt;span class="pt-asset-income"&gt;+'+c.income+' PDC/цикл&lt;/span&gt;&lt;span class="pt-asset-cost"&gt;'+fmt(c.cost)+' PDC&lt;/span&gt;&lt;/div&gt;'
        +'&lt;button class="pt-btn pt-btn-acc" data-id="'+c.id+'" '+(can?'':'disabled')+'&gt;'+((owned?'Ещё один · ':'Купить · ')+fmt(c.cost)+' PDC')+'&lt;/button&gt;';
      box.appendChild(el);
    });
    box.querySelectorAll('button[data-id]').forEach(function(b){b.onclick=function(){buy(b.dataset.id);};});
  }
  function buy(id){
    var c=null;PT.CATALOG.forEach(function(x){if(x.id===id)c=x;});
    if(!c||S.pdc&lt;c.cost){toast('Недостаточно PDC',true);return;}
    S.pdc-=c.cost;
    var found=null;S.assets.forEach(function(a){if(a.id===id)found=a;});
    if(found){found.count++;}else{S.assets.push({id:c.id,name:c.name,icon:c.icon,cat:c.cat,income:c.income,desc:c.desc,count:1,lastCollect:Date.now()});}
    PT.addXP(Math.round(c.cost/10));S.rep++;PT.addTx('Вы','Магазин',c.cost,'покупка:'+c.name);
    PT.save();renderAll();toast('Куплено: '+c.name+' ? (игровая сделка)');
  }
  $('pt-filters').querySelectorAll('.pt-chip').forEach(function(ch){
    ch.onclick=function(){
      $('pt-filters').querySelectorAll('.pt-chip').forEach(function(x){x.classList.remove('act');});
      ch.classList.add('act');curCat=ch.dataset.cat;renderCatalog();
    };
  });
  $('pt-reset').onclick=PT.reset;
  function renderAll(){renderHead();renderMyAssets();renderCatalog();}
  renderAll();
  setInterval(function(){if(S.accepted){renderHead();renderMyAssets();}},1000);
})();
&lt;/script&gt;
&lt;script&gt;
(function(){
  var PT=window.PT,S=PT.state;
  function $(id){return document.getElementById(id);}
  function fmt(n){return new Intl.NumberFormat('ru-RU').format(Math.round(n));}
  var mining=false;
  function toastLedger(msg,isErr){
    var old=document.querySelector('.pt-toast');if(old)old.remove();
    var t=document.createElement('div');t.className='pt-toast'+(isErr?' err':'');t.textContent=msg;
    document.body.appendChild(t);setTimeout(function(){t.remove();},2600);
  }
  function verifyChain(){
    var res=[];
    for(var i=0;i&lt;S.blocks.length;i++){
      var b=S.blocks[i];
      if(i===S.blocks.length-1){res[i]=(b.prevHash===PT.hash('genesis'));}
      else{res[i]=(b.prevHash===S.blocks[i+1].hash);}
    }
    return res;
  }
  function renderLedger(){
    var results=verifyChain();
    var allValid=results.length===0||results.every(function(r){return r;});
    $('pt-ledger-stats').innerHTML=
      '&lt;div class="pt-sum-card"&gt;&lt;span&gt;Высота цепи&lt;/span&gt;&lt;b&gt;'+S.blocks.length+'&lt;/b&gt;&lt;/div&gt;'+
      '&lt;div class="pt-sum-card"&gt;&lt;span&gt;Транзакций&lt;/span&gt;&lt;b&gt;'+S.txs.length+'&lt;/b&gt;&lt;/div&gt;'+
      '&lt;div class="pt-sum-card"&gt;&lt;span&gt;Награда за блок&lt;/span&gt;&lt;b&gt;25 PDC&lt;/b&gt;&lt;/div&gt;'+
      '&lt;div class="pt-sum-card"&gt;&lt;span&gt;Статус цепи&lt;/span&gt;&lt;b class="'+(allValid?'pt-ok':'pt-bad')+'"&gt;'+(allValid?'Целостна ✓':'Нарушена ✗')+'&lt;/b&gt;&lt;/div&gt;';
    var chain=$('pt-chain');
    if(!S.blocks.length){chain.innerHTML='&lt;div class="pt-empty"&gt;Цепь пуста. Нажмите «⛏️ Добыть блок».&lt;/div&gt;';}
    else{
      chain.innerHTML='';
      S.blocks.forEach(function(b,i){
        var bad=(results[i]===false)||b._orig;
        var el=document.createElement('div');el.className='pt-block'+(bad?' pt-block-bad':'');
        var rows='&lt;div class="pt-block-row"&gt;&lt;span&gt;hash&lt;/span&gt;&lt;code&gt;'+b.hash.slice(0,20)+'…&lt;/code&gt;&lt;/div&gt;'
          +'&lt;div class="pt-block-row"&gt;&lt;span&gt;prev&lt;/span&gt;&lt;code&gt;'+(b.prevHash?b.prevHash.slice(0,20)+'…':'GENESIS')+'&lt;/code&gt;&lt;/div&gt;';
        if(b.nonce!==undefined)rows+='&lt;div class="pt-block-row"&gt;&lt;span&gt;nonce&lt;/span&gt;&lt;code&gt;'+b.nonce+'&lt;/code&gt;&lt;/div&gt;';
        rows+='&lt;div class="pt-block-row"&gt;&lt;span&gt;время&lt;/span&gt;&lt;code&gt;'+new Date(b.ts).toLocaleTimeString('ru-RU')+'&lt;/code&gt;&lt;/div&gt;';
        el.innerHTML='&lt;div class="pt-block-head"&gt;&lt;b&gt;Блок #'+b.height+'&lt;/b&gt;&lt;span class="pt-block-badge '+(bad?'bad':'ok')+'"&gt;'+(bad?'✗ разрыв':'✓ связан')+'&lt;/span&gt;&lt;/div&gt;'+rows;
        chain.appendChild(el);
        if(i&lt;S.blocks.length-1){var lk=document.createElement('div');lk.className='pt-link';lk.textContent='⬆';chain.appendChild(lk);}
      });
    }
    var txs=$('pt-txs');
    if(!S.txs.length){txs.innerHTML='&lt;div class="pt-empty"&gt;Транзакций пока нет.&lt;/div&gt;';}
    else{
      txs.innerHTML='';
      S.txs.slice(0,12).forEach(function(t){
        var el=document.createElement('div');el.className='pt-tx';
        el.innerHTML='&lt;span class="pt-tx-type"&gt;'+t.type+'&lt;/span&gt;&lt;span class="pt-tx-main"&gt;&lt;b&gt;'+t.from+'&lt;/b&gt; → &lt;b&gt;'+t.to+'&lt;/b&gt;&lt;/span&gt;&lt;span class="pt-tx-amt"&gt;+'+t.amount+' PDC&lt;/span&gt;';
        txs.appendChild(el);
      });
    }
  }
  $('pt-mine-btn').onclick=function(){
    if(mining)return;mining=true;
    var reward=25;
    var prev=S.blocks.length?S.blocks[0].hash:PT.hash('genesis');
    var height=S.blocks.length+1;
    S.txs.unshift({id:S.txs.length+1,from:'Сеть (эмиссия)',to:'Майнер',amount:reward,type:'награда за блок',ts:Date.now()});
    if(S.txs.length&gt;50)S.txs.pop();
    var txData=S.txs.slice(0,3).map(function(t){return t.id;}).join(',');
    var nonce=0,display=$('pt-mine-display');
    var timer=setInterval(function(){
      for(var b=0;b&lt;15;b++){
        var h=PT.hash(prev+'|'+txData+'|'+height+'|'+nonce);
        display.textContent='nonce '+nonce+'  →  '+h;
        if(h.charAt(0)==='0'){
          clearInterval(timer);
          S.blocks.unshift({height:height,prevHash:prev,hash:h,nonce:nonce,txCount:3,ts:Date.now()});
          if(S.blocks.length&gt;30)S.blocks.pop();
          S.pdc+=reward;PT.save();
          var pdcEl=$('pt-pdc');if(pdcEl)pdcEl.textContent=fmt(S.pdc);
          mining=false;renderLedger();
          toastLedger('Блок #'+height+' найден! nonce='+nonce+', награда +'+reward+' PDC ⛏️');
          return;
        }
        nonce++;
      }
    },40);
  };
  $('pt-verify-btn').onclick=function(){
    renderLedger();
    var res=verifyChain();
    if(res.length===0){toastLedger('Цепь пуста — нечего проверять');return;}
    var ok=res.every(function(r){return r;});
    toastLedger(ok?'Цепь целостна: все блоки связаны ✓':'Обнаружен разрыв цепи! См. красные блоки ✗',!ok);
  };
  $('pt-attack-btn').onclick=function(){
    if(S.blocks.length&lt;2){toastLedger('Нужно минимум 2 блока',true);return;}
    var idx=S.blocks.length-2,b=S.blocks[idx];
    if(!b._orig)b._orig=b.hash;
    b.hash=PT.hash('TAMPERED'+Date.now());
    PT.save();renderLedger();
    toastLedger('Блок #'+b.height+' подделан. Нажмите «Проверить цепь» ?',true);
  };
  $('pt-repair-btn').onclick=function(){
    var changed=false;
    S.blocks.forEach(function(b){if(b._orig){b.hash=b._orig;delete b._orig;changed=true;}});
    if(changed){PT.save();renderLedger();toastLedger('Цепь восстановлена ✓');}
    else toastLedger('Подделанных блоков нет');
  };
  var tab=document.querySelector('.pt-tab[data-t="ledger"]');
  if(tab)tab.addEventListener('click',renderLedger);
  renderLedger();
})();
&lt;/script&gt;
&lt;script&gt;
(function(){
  var PT=window.PT,S=PT.state;
  function $(id){return document.getElementById(id);}
  function fmt(n){return new Intl.NumberFormat('ru-RU').format(Math.round(n));}
  if(!S.quests)S.quests={};
  function totalAssets(){return S.assets.reduce(function(n,a){return n+a.count;},0);}
  function totalCats(){var c={};S.assets.forEach(function(a){c[a.cat]=1;});return Object.keys(c).length;}
  var QUESTS=[
    {id:'first_asset',icon:'?',name:'Первый актив',desc:'Купите свой первый актив',reward:50,check:function(){var n=totalAssets();return{done:n&gt;=1,cur:n,goal:1};}},
    {id:'first_income',icon:'?',name:'Первый доход',desc:'Соберите первый доход',reward:50,check:function(){var n=S.totalEarned&gt;=1?1:0;return{done:S.totalEarned&gt;=1,cur:n,goal:1};}},
    {id:'tycoon',icon:'?️',name:'Магнат',desc:'Владейте 3 активами',reward:100,check:function(){var n=totalAssets();return{done:n&gt;=3,cur:n,goal:3};}},
    {id:'empire',icon:'?',name:'Империя',desc:'Владейте 6 активами',reward:200,check:function(){var n=totalAssets();return{done:n&gt;=6,cur:n,goal:6};}},
    {id:'diversify',icon:'?',name:'Диверсификация',desc:'Активы в 3 категориях',reward:100,check:function(){var n=totalCats();return{done:n&gt;=3,cur:n,goal:3};}},
    {id:'first_block',icon:'⛓️',name:'Первый блок',desc:'Добудьте первый блок',reward:75,check:function(){var n=S.blocks.length;return{done:n&gt;=1,cur:n,goal:1};}},
    {id:'chain3',icon:'?',name:'Цепочка',desc:'Цепь из 3 блоков',reward:100,check:function(){var n=S.blocks.length;return{done:n&gt;=3,cur:n,goal:3};}},
    {id:'rep3',icon:'⭐',name:'Репутация',desc:'3 очка репутации',reward:75,check:function(){var n=S.rep;return{done:n&gt;=3,cur:n,goal:3};}},
    {id:'saver',icon:'?',name:'Накопитель',desc:'Накопите 2 000 PDC',reward:100,check:function(){var n=Math.floor(S.pdc);return{done:S.pdc&gt;=2000,cur:n,goal:2000};}},
    {id:'level3',icon:'?',name:'Опытный',desc:'Достигните 3 уровня',reward:150,check:function(){var n=S.level;return{done:n&gt;=3,cur:n,goal:3};}}
  ];
  function toastQuest(msg){
    var old=document.querySelector('.pt-toast');if(old)old.remove();
    var t=document.createElement('div');t.className='pt-toast';t.textContent=msg;
    document.body.appendChild(t);setTimeout(function(){t.remove();},2800);
  }
  function renderQuests(){
    var list=$('pt-quest-list');list.innerHTML='';
    var doneCount=0;
    QUESTS.forEach(function(q){
      var done=!!S.quests[q.id];if(done)doneCount++;
      var r=q.check();
      var pct=Math.min(100,Math.round((r.cur/r.goal)*100));
      var el=document.createElement('div');el.className='pt-quest'+(done?' done':'');
      el.innerHTML='&lt;div class="pt-quest-ico"&gt;'+(done?q.icon:'?')+'&lt;/div&gt;'
        +'&lt;div class="pt-quest-body"&gt;'
        +'&lt;div class="pt-quest-top"&gt;&lt;b&gt;'+q.name+'&lt;/b&gt;&lt;span class="pt-quest-reward"&gt;+'+q.reward+' PDC&lt;/span&gt;&lt;/div&gt;'
        +'&lt;div class="pt-quest-desc"&gt;'+q.desc+'&lt;/div&gt;'
        +'&lt;div class="pt-quest-prog" style="font-size:.66rem;color:'+(done?'#3DDC84':'#8D99AC')+';margin-top:4px"&gt;'+(done?'Выполнено ✓':fmt(r.cur)+' / '+fmt(r.goal))+'&lt;/div&gt;'
        +'&lt;/div&gt;'
        +'&lt;div class="pt-quest-status"&gt;'+(done?'✓':'')+'&lt;/div&gt;';
      list.appendChild(el);
    });
    var sum=$('pt-quest-summary');
    if(sum)sum.innerHTML='&lt;span style="font-family:Unbounded;font-size:1.15rem;color:#3DDC84"&gt;'+doneCount+' / '+QUESTS.length+'&lt;/span&gt;&lt;span style="font-size:.68rem;color:#8D99AC;text-transform:uppercase;letter-spacing:.1em;margin-left:8px"&gt;выполнено&lt;/span&gt;';
  }
  function update(){
    var newly=[];
    QUESTS.forEach(function(q){
      if(S.quests[q.id])return;
      if(q.check().done){S.quests[q.id]=true;S.pdc+=q.reward;PT.addXP(q.reward);newly.push(q);}
    });
    if(newly.length){
      PT.save();
      var pdcEl=$('pt-pdc');if(pdcEl)pdcEl.textContent=fmt(S.pdc);
      var lvlEl=$('pt-level');if(lvlEl)lvlEl.textContent=S.level;
      newly.forEach(function(q){toastQuest(q.icon+' Квест выполнен: '+q.name+' · +'+q.reward+' PDC');});
    }
    renderQuests();
  }
  var qtab=document.querySelector('.pt-tab[data-t="quests"]');
  if(qtab)qtab.addEventListener('click',renderQuests);
  update();
  setInterval(function(){if(S.accepted)update();},1500);
})();
&lt;/script&gt;
&lt;script&gt;
(function(){
  var PT=window.PT,S=PT.state;
  function $(id){return document.getElementById(id);}
  function fmt(n){return new Intl.NumberFormat('ru-RU').format(Math.round(n));}
  var CKEY='pt_contracts_v1',contracts=[];
  function loadC(){try{var raw=localStorage.getItem(CKEY);if(raw)contracts=JSON.parse(raw);}catch(e){contracts=[];}}
  function saveC(){try{localStorage.setItem(CKEY,JSON.stringify(contracts));}catch(e){}}
  loadC();
  var WHEN_OPTS=['баланс достиг 500 PDC','игрок владеет 3 активами','добыт новый блок','наступил срок платежа','покупатель перевёл 100 PDC в эскроу'];
  var THEN_OPTS=['перевести 100 PDC продавцу и раскрыть эскроу','начислить бонус 25 PDC','автоматически купить актив «Ферма»','разделить прибыль 50/50 между партнёрами','передать актив покупателю'];
  var ELSE_OPTS=['вернуть средства покупателю','ждать следующего цикла','начислить пеню 1 PDC','отменить сделку и уведомить стороны'];
  var TPL={
    escrow:{when:'покупатель перевёл 100 PDC в эскроу',then:'передать актив покупателю',otherwise:'вернуть средства покупателю'},
    rent:{when:'наступил срок платежа',then:'разделить прибыль 50/50 между партнёрами',otherwise:'начислить пеню 1 PDC'},
    buy:{when:'баланс достиг 500 PDC',then:'автоматически купить актив «Ферма»',otherwise:'ждать следующего цикла'}
  };
  function fill(id,opts){var el=$(id);el.innerHTML='';opts.forEach(function(o){var op=document.createElement('option');op.value=o;op.textContent=o;el.appendChild(op);});}
  fill('pt-c-when',WHEN_OPTS);fill('pt-c-then',THEN_OPTS);fill('pt-c-else',ELSE_OPTS);
  function toastC(msg,isErr){
    var old=document.querySelector('.pt-toast');if(old)old.remove();
    var t=document.createElement('div');t.className='pt-toast'+(isErr?' err':'');t.textContent=msg;
    document.body.appendChild(t);setTimeout(function(){t.remove();},2800);
  }
  function renderCode(){
    var w=$('pt-c-when').value,t=$('pt-c-then').value,o=$('pt-c-else').value;
    $('pt-c-code').textContent='contract PandoDeal {\n  when  : '+w+'\n  then  : '+t+'\n  else  : '+o+'\n  // автоисполнение в игровом реестре PANDO\n}';
  }
  ['pt-c-when','pt-c-then','pt-c-else'].forEach(function(id){$(id).addEventListener('change',renderCode);});
  renderCode();
  document.querySelectorAll('.pt-chip[data-tpl]').forEach(function(ch){
    ch.onclick=function(){
      var t=TPL[ch.dataset.tpl];
      $('pt-c-when').value=t.when;$('pt-c-then').value=t.then;$('pt-c-else').value=t.otherwise;
      renderCode();
    };
  });
  function renderList(){
    var box=$('pt-c-list');
    if(!contracts.length){box.innerHTML='&lt;div class="pt-empty"&gt;Развёрнутых договоров пока нет. Соберите договор выше.&lt;/div&gt;';return;}
    box.innerHTML='';
    contracts.forEach(function(c){
      var el=document.createElement('div');el.className='pt-contract'+(c.status==='executed'?' done':'');
      var btn=c.status==='executed'
        ?'&lt;span class="pt-contract-status"&gt;✓ исполнен автоматически&lt;/span&gt;'
        :'&lt;button class="pt-btn pt-btn-acc pt-btn-sm" data-h="'+c.hash+'"&gt;▶ Исполнить&lt;/button&gt;';
      el.innerHTML='&lt;div class="pt-contract-head"&gt;&lt;code&gt;'+c.hash.slice(0,18)+'…&lt;/code&gt;'+btn+'&lt;/div&gt;'
        +'&lt;div class="pt-contract-line"&gt;&lt;span class="pt-kw-when"&gt;КОГДА&lt;/span&gt;'+c.when+'&lt;/div&gt;'
        +'&lt;div class="pt-contract-line"&gt;&lt;span class="pt-kw-then"&gt;ТОГДА&lt;/span&gt;'+c.then+'&lt;/div&gt;'
        +'&lt;div class="pt-contract-line"&gt;&lt;span class="pt-kw-else"&gt;ИНАЧЕ&lt;/span&gt;'+c.otherwise+'&lt;/div&gt;';
      box.appendChild(el);
    });
    box.querySelectorAll('button[data-h]').forEach(function(b){b.onclick=function(){execute(b.dataset.h);};});
  }
  $('pt-c-deploy').onclick=function(){
    if(S.pdc&lt;5){toastC('Недостаточно PDC для газа (нужно 5 PDC)',true);return;}
    var w=$('pt-c-when').value,t=$('pt-c-then').value,o=$('pt-c-else').value;
    var hash=PT.hash('contract|'+w+'|'+t+'|'+o+'|'+Date.now());
    contracts.unshift({hash:hash,when:w,then:t,otherwise:o,ts:Date.now(),status:'deployed'});
    saveC();
    S.pdc-=5;PT.save();
    var pdcEl=$('pt-pdc');if(pdcEl)pdcEl.textContent=fmt(S.pdc);
    PT.addTx('Игрок','Реестр',5,'газ: развёртывание '+hash.slice(0,8));
    renderList();
    toastC('Договор развёрнут в реестре (газ 5 PDC): '+hash.slice(0,10)+'… ?');
  };
  function execute(hash){
    var c=null;contracts.forEach(function(x){if(x.hash===hash)c=x;});
    if(!c||c.status==='executed')return;
    c.status='executed';c.execTs=Date.now();
    saveC();
    S.pdc+=10;PT.save();
    var pdcEl=$('pt-pdc');if(pdcEl)pdcEl.textContent=fmt(S.pdc);
    PT.addTx('Смарт-контракт','Игрок',10,'исполнение '+hash.slice(0,8));
    renderList();
    toastC('Договор исполнен автоматически ✓ ТОГДА: '+c.then+' · +10 PDC');
  }
  var ctab=document.querySelector('.pt-tab[data-t="contracts"]');
  if(ctab)ctab.addEventListener('click',renderList);
  renderList();
})();
&lt;/script&gt;
&lt;script&gt;
(function(){
  var PT=window.PT,S=PT.state;
  function $(id){return document.getElementById(id);}
  function fmt(n){return new Intl.NumberFormat('ru-RU').format(Math.round(n));}
  function rnd(n){return Math.floor(Math.random()*n);}
  function pick(arr){return arr[rnd(arr.length)];}
  var NPCS=['Neo_77','Kira_X','Volna','Magnat_01','Orbita','Zarya','Atom_9','Titan_HQ'];
  function toastMP(msg,isErr){
    var old=document.querySelector('.pt-toast');if(old)old.remove();
    var t=document.createElement('div');t.className='pt-toast'+(isErr?' err':'');t.textContent=msg;
    document.body.appendChild(t);setTimeout(function(){t.remove();},2800);
  }
  var feed=[];
  function pushFeed(text){feed.unshift({t:Date.now(),text:text});if(feed.length&gt;12)feed.pop();renderFeed();}
  function renderFeed(){
    var box=$('pt-feed');if(!box)return;
    if(!feed.length){box.innerHTML='&lt;div class="pt-empty"&gt;Эфир пуст. Действия других игроков появятся здесь.&lt;/div&gt;';return;}
    box.innerHTML='';
    feed.forEach(function(f){
      var el=document.createElement('div');el.className='pt-feed-item';
      el.innerHTML='&lt;span class="pt-feed-time"&gt;'+new Date(f.t).toLocaleTimeString('ru-RU')+'&lt;/span&gt;&lt;span&gt;'+f.text+'&lt;/span&gt;';
      box.appendChild(el);
    });
  }
  var AMBIENT=['{n} купил актив «Ферма»','{n} добыл блок в реестре','{n} развернул смарт-договор','{n} пополнил казну корпорации','{n} выполнил квест «Магнат»','{n} сделал ставку на аукционе'];
  function ambientTick(){pushFeed(pick(AMBIENT).replace('{n}',pick(NPCS)));}
  var AUCTIONS=[
    {id:'gold_mine',icon:'⚜️',name:'Золотая шахта',cat:'Производство',income:40,start:2000,minInc:50,dur:90},
    {id:'sky_port',icon:'?',name:'Космопорт',cat:'Транспорт',income:55,start:3000,minInc:100,dur:120},
    {id:'tower',icon:'?️',name:'Небоскрёб «Пандора»',cat:'Недвижимость',income:70,start:5000,minInc:150,dur:150}
  ];
  var auctionState={};
  function initAuctions(){AUCTIONS.forEach(function(a){auctionState[a.id]={bid:a.start,bidder:null,endsAt:Date.now()+a.dur*1000,playerBid:0,closed:false};});}
  function renderAuctions(){
    var box=$('pt-auctions');if(!box)return;box.innerHTML='';
    AUCTIONS.forEach(function(a){
      var st=auctionState[a.id];
      var left=Math.max(0,Math.ceil((st.endsAt-Date.now())/1000));
      var el=document.createElement('div');el.className='pt-auction'+(st.closed?' done':'');
      var btnHtml=st.closed
        ?'&lt;span class="pt-auction-status"&gt;'+(st.bidder==='Вы'?'✓ Вы выиграли!':'Выиграл '+(st.bidder||'никто'))+'&lt;/span&gt;'
        :'&lt;div class="pt-auction-bidrow"&gt;&lt;input type="number" class="pt-auction-in" id="pt-bid-'+a.id+'" min="'+(st.bid+a.minInc)+'" step="'+a.minInc+'" placeholder="'+(st.bid+a.minInc)+'"&gt;&lt;button class="pt-btn pt-btn-acc pt-btn-sm" data-bid="'+a.id+'"&gt;Ставка&lt;/button&gt;&lt;/div&gt;';
      el.innerHTML='&lt;div class="pt-auction-top"&gt;&lt;span class="pt-auction-ico"&gt;'+a.icon+'&lt;/span&gt;&lt;div&gt;&lt;div class="pt-auction-name"&gt;'+a.name+'&lt;/div&gt;&lt;div class="pt-auction-cat"&gt;'+a.cat+' · доход +'+a.income+' PDC/цикл&lt;/div&gt;&lt;/div&gt;&lt;span class="pt-auction-timer"&gt;'+(st.closed?'завершён':left+' сек')+'&lt;/span&gt;&lt;/div&gt;'
        +'&lt;div class="pt-auction-meta"&gt;&lt;span&gt;Ставка: &lt;b&gt;'+fmt(st.bid)+' PDC&lt;/b&gt;&lt;/span&gt;&lt;span&gt;'+(st.bidder?('Лидер: '+st.bidder):'Ставок нет')+'&lt;/span&gt;&lt;/div&gt;'+btnHtml;
      box.appendChild(el);
    });
    box.querySelectorAll('button[data-bid]').forEach(function(b){b.onclick=function(){placeBid(b.dataset.bid);};});
  }
  function placeBid(id){
    var a=null;AUCTIONS.forEach(function(x){if(x.id===id)a=x;});
    var st=auctionState[id];if(!a||st.closed)return;
    var inp=$('pt-bid-'+id);var amt=parseInt(inp.value,10);
    if(isNaN(amt))amt=st.bid+a.minInc;
    if(amt&lt;st.bid+a.minInc){toastMP('Минимальная ставка: '+fmt(st.bid+a.minInc)+' PDC',true);return;}
    if(S.pdc&lt;amt){toastMP('Недостаточно PDC',true);return;}
    if(st.playerBid&gt;0){S.pdc+=st.playerBid;}
    S.pdc-=amt;st.playerBid=amt;st.bid=amt;st.bidder='Вы';
    PT.save();var pdcEl=$('pt-pdc');if(pdcEl)pdcEl.textContent=fmt(S.pdc);
    pushFeed('Вы сделали ставку '+fmt(amt)+' PDC на «'+a.name+'»');
    renderAuctions();toastMP('Ставка принята: '+fmt(amt)+' PDC на «'+a.name+'»');
  }
  function auctionTick(){
    var now=Date.now();var changed=false;
    AUCTIONS.forEach(function(a){
      var st=auctionState[a.id];if(st.closed)return;
      var left=st.endsAt-now;
      if(left&lt;=0){
        st.closed=true;changed=true;
        if(st.bidder==='Вы'){
          S.assets.push({id:a.id,name:a.name,icon:a.icon,cat:a.cat,income:a.income,desc:'Редкий актив с аукциона',count:1,lastCollect:Date.now()});
          PT.save();pushFeed('? Вы выиграли аукцион «'+a.name+'» за '+fmt(st.bid)+' PDC!');
          toastMP('Вы выиграли «'+a.name+'»! Актив добавлен в империю ?');
        } else if(st.bidder){pushFeed('? '+st.bidder+' выиграл аукцион «'+a.name+'» за '+fmt(st.bid)+' PDC');if(st.playerBid&gt;0){S.pdc+=st.playerBid;st.playerBid=0;PT.save();}}
        else{pushFeed('Аукцион «'+a.name+'» завершился без ставок');}
      } else if(Math.random()&lt;0.12){
        var npc=pick(NPCS);var npcAmt=st.bid+a.minInc*(1+rnd(2));
        if(st.bidder==='Вы'&amp;&amp;st.playerBid&gt;0){S.pdc+=st.playerBid;st.playerBid=0;PT.save();}
        st.bid=npcAmt;st.bidder=npc;changed=true;
        pushFeed(npc+' сделал ставку '+fmt(npcAmt)+' PDC на «'+a.name+'»');
      }
    });
    if(changed){renderAuctions();var pdcEl=$('pt-pdc');if(pdcEl)pdcEl.textContent=fmt(S.pdc);}
    else{
      AUCTIONS.forEach(function(a,i){
        var st=auctionState[a.id];if(st.closed)return;
        var left=Math.max(0,Math.ceil((st.endsAt-Date.now())/1000));
        var box=$('pt-auctions');var items=box.querySelectorAll('.pt-auction');
        var tEl=items[i]?items[i].querySelector('.pt-auction-timer'):null;
        if(tEl)tEl.textContent=left+' сек';
      });
    }
  }
  var CORPS=[
    {id:'titan',name:'Корпорация «Титан»',members:12,treasury:15000,income:800,joinCost:500},
    {id:'orbita',name:'Корпорация «Орбита»',members:8,treasury:9000,income:500,joinCost:300}
  ];
  var corpKey='pt_corp_v1';
  var corpState={type:null,npcId:null,ownName:'',ownMembers:1,ownTreasury:0,ownIncome:100};
  function loadCorp(){try{var raw=localStorage.getItem(corpKey);if(raw)corpState=JSON.parse(raw);}catch(e){}}
  function saveCorp(){try{localStorage.setItem(corpKey,JSON.stringify(corpState));}catch(e){}}
  loadCorp();
  function renderCorps(){
    var box=$('pt-corps');if(!box)return;box.innerHTML='';
    CORPS.forEach(function(c){
      var isMember=corpState.type==='npc'&amp;&amp;corpState.npcId===c.id;
      var dividend=Math.floor(c.income/c.members);
      var el=document.createElement('div');el.className='pt-corp'+(isMember?' member':'');
      var btn=isMember?'&lt;span class="pt-corp-status"&gt;✓ Вы участник · +'+dividend+' PDC/цикл&lt;/span&gt;'
        :(corpState.type?'&lt;span class="pt-corp-status" style="color:#8D99AC"&gt;Вы в другой корпорации&lt;/span&gt;'
        :'&lt;button class="pt-btn pt-btn-acc pt-btn-sm" data-join="'+c.id+'"&gt;Вступить · '+c.joinCost+' PDC&lt;/button&gt;');
      el.innerHTML='&lt;div class="pt-corp-top"&gt;&lt;b&gt;'+c.name+'&lt;/b&gt;'+btn+'&lt;/div&gt;'
        +'&lt;div class="pt-corp-meta"&gt;&lt;span&gt;? '+c.members+' участников&lt;/span&gt;&lt;span&gt;? Казна '+fmt(c.treasury)+' PDC&lt;/span&gt;&lt;span&gt;? Доход '+fmt(c.income)+' PDC/цикл&lt;/span&gt;&lt;/div&gt;';
      box.appendChild(el);
    });
    if(corpState.type==='own'){
      var div=Math.floor(corpState.ownIncome/Math.max(1,corpState.ownMembers));
      var el2=document.createElement('div');el2.className='pt-corp member own';
      el2.innerHTML='&lt;div class="pt-corp-top"&gt;&lt;b&gt;'+corpState.ownName+' (ваша)&lt;/b&gt;&lt;span class="pt-corp-status"&gt;✓ Вы — CEO · +'+div+' PDC/цикл&lt;/span&gt;&lt;/div&gt;'
        +'&lt;div class="pt-corp-meta"&gt;&lt;span&gt;? '+corpState.ownMembers+' участников&lt;/span&gt;&lt;span&gt;? Казна '+fmt(corpState.ownTreasury)+' PDC&lt;/span&gt;&lt;span&gt;? Доход '+fmt(corpState.ownIncome)+' PDC/цикл&lt;/span&gt;&lt;/div&gt;';
      box.appendChild(el2);
    } else if(!corpState.type){
      var el3=document.createElement('div');el3.className='pt-corp create';
      el3.innerHTML='&lt;div class="pt-corp-top"&gt;&lt;b&gt;Основать свою корпорацию&lt;/b&gt;&lt;/div&gt;'
        +'&lt;div class="pt-corp-create"&gt;&lt;input type="text" class="pt-corp-name" id="pt-corp-name" placeholder="Название корпорации"&gt;&lt;button class="pt-btn pt-btn-acc pt-btn-sm" id="pt-corp-create"&gt;Основать · 1000 PDC&lt;/button&gt;&lt;/div&gt;'
        +'&lt;div class="pt-corp-meta"&gt;&lt;span&gt;Станьте CEO, привлекайте участников, получайте дивиденды&lt;/span&gt;&lt;/div&gt;';
      box.appendChild(el3);
      var cbtn=$('pt-corp-create');if(cbtn)cbtn.onclick=createCorp;
    }
    box.querySelectorAll('button[data-join]').forEach(function(b){b.onclick=function(){joinCorp(b.dataset.join);};});
  }
  function joinCorp(id){
    if(corpState.type){toastMP('Вы уже в корпорации',true);return;}
    var c=null;CORPS.forEach(function(x){if(x.id===id)c=x;});if(!c)return;
    if(S.pdc&lt;c.joinCost){toastMP('Недостаточно PDC',true);return;}
    S.pdc-=c.joinCost;PT.save();
    corpState.type='npc';corpState.npcId=id;saveCorp();
    var pdcEl=$('pt-pdc');if(pdcEl)pdcEl.textContent=fmt(S.pdc);
    pushFeed('Вы вступили в '+c.name);toastMP('Вы вступили в '+c.name+'! Дивиденды начнут приходить.');
    renderCorps();
  }
  function createCorp(){
    if(corpState.type){toastMP('Вы уже в корпорации',true);return;}
    var name=$('pt-corp-name').value.trim();
    if(!name){toastMP('Введите название корпорации',true);return;}
    if(S.pdc&lt;1000){toastMP('Нужно 1000 PDC для основания',true);return;}
    S.pdc-=1000;PT.save();
    corpState.type='own';corpState.ownName=name;corpState.ownMembers=1;corpState.ownTreasury=0;corpState.ownIncome=100;saveCorp();
    var pdcEl=$('pt-pdc');if(pdcEl)pdcEl.textContent=fmt(S.pdc);
    pushFeed('Вы основали корпорацию «'+name+'»');toastMP('Корпорация «'+name+'» основана! Вы — CEO.');
    renderCorps();
  }
  function corpTick(){
    var changed=false;
    if(corpState.type==='own'){
      if(Math.random()&lt;0.2&amp;&amp;corpState.ownMembers&lt;20){
        corpState.ownMembers++;corpState.ownIncome+=50+rnd(50);corpState.ownTreasury+=100+rnd(100);
        pushFeed(pick(NPCS)+' вступил в вашу корпорацию «'+corpState.ownName+'»');
        changed=true;saveCorp();
      }
    }
    if(changed)renderCorps();
  }
  function dividendTick(){
    if(corpState.type==='npc'){
      var c=null;CORPS.forEach(function(x){if(x.id===corpState.npcId)c=x;});
      if(c){var div=Math.floor(c.income/c.members);if(div&gt;0){S.pdc+=div;PT.save();var pdcEl=$('pt-pdc');if(pdcEl)pdcEl.textContent=fmt(S.pdc);pushFeed('? '+c.name+' выплатила дивиденд +'+div+' PDC');}}
    } else if(corpState.type==='own'){
      var div2=Math.floor(corpState.ownIncome/Math.max(1,corpState.ownMembers));
      if(div2&gt;0){S.pdc+=div2;PT.save();var pdcEl=$('pt-pdc');if(pdcEl)pdcEl.textContent=fmt(S.pdc);pushFeed('? Ваша корпорация «'+corpState.ownName+'» выплатила дивиденд +'+div2+' PDC');}
    }
  }
  var mptab=document.querySelector('.pt-tab[data-t="mp"]');
  if(mptab)mptab.addEventListener('click',function(){renderFeed();renderAuctions();renderCorps();});
  initAuctions();renderFeed();renderAuctions();renderCorps();
  pushFeed('Эфир запущен. Добро пожаловать в PANDO Tycoon!');
  setInterval(function(){if(S.accepted)auctionTick();},1000);
  setInterval(function(){if(S.accepted)corpTick();},5000);
  setInterval(function(){if(S.accepted)dividendTick();},20000);
  setInterval(function(){if(S.accepted)ambientTick();},8000);
})();
&lt;/script&gt;
&lt;script&gt;
(function(){
  var PT=window.PT,S=PT.state;
  if(!PT)return;
  function fmt(n){return new Intl.NumberFormat('ru-RU').format(Math.round(n));}
  var css=`
  .pt-achv-summary{display:flex;align-items:baseline;gap:8px}
  .pt-achv-count{font-family:'Unbounded';font-size:1.15rem;color:#F5B301}
  .pt-achv-label{font-size:.68rem;color:#8D99AC;text-transform:uppercase;letter-spacing:.1em}
  .pt-achv-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(280px,1fr));gap:12px}
  .pt-achv{background:#121A26;border:1px solid rgba(160,180,220,.14);border-radius:12px;padding:14px;display:flex;gap:12px;align-items:center;transition:.2s;opacity:.45}
  .pt-achv.done{opacity:1;border-color:#F5B301;background:rgba(245,179,1,.06)}
  .pt-achv.done:hover{transform:translateY(-2px);box-shadow:0 6px 18px rgba(245,179,1,.2)}
  .pt-achv-ico{font-size:28px;flex:0 0 auto}
  .pt-achv-body{flex:1}
  .pt-achv-top{display:flex;justify-content:space-between;align-items:center;gap:8px}
  .pt-achv-top b{font-size:.9rem;color:#E7EDF5}
  .pt-achv-reward{font-size:.7rem;color:#F5B301;font-weight:700;white-space:nowrap}
  .pt-achv-desc{font-size:.72rem;color:#8D99AC;margin-top:2px}
  .pt-achv-status{font-size:1.2rem;color:#3DDC84;font-weight:700}
  `;
  var styleEl=document.createElement('style');styleEl.textContent=css;document.head.appendChild(styleEl);
  function totalAssets(){return S.assets.reduce(function(n,a){return n+a.count;},0);}
  function totalCats(){var c={};S.assets.forEach(function(a){c[a.cat]=1;});return Object.keys(c).length;}
  function questCount(){return Object.keys(S.quests||{}).length;}
  function readContracts(){try{var raw=localStorage.getItem('pt_contracts_v1');if(raw)return JSON.parse(raw);}catch(e){}return [];}
  function contractsCount(){return readContracts().length;}
  function executedCount(){return readContracts().filter(function(x){return x.status==='executed';}).length;}
  function getCorpType(){try{var raw=localStorage.getItem('pt_corp_v1');if(raw)return JSON.parse(raw).type;}catch(e){}return null;}
  var A=[
    {id:'first_asset',icon:'?️',name:'Первый актив',desc:'Купите свой первый актив',reward:50,check:function(){return totalAssets()&gt;=1;}},
    {id:'magnate',icon:'?️',name:'Магнат',desc:'Владейте 5 активами одновременно',reward:100,check:function(){return totalAssets()&gt;=5;}},
    {id:'empire',icon:'?',name:'Империя',desc:'Владейте 10 активами',reward:200,check:function(){return totalAssets()&gt;=10;}},
    {id:'first_capital',icon:'?',name:'Первый капитал',desc:'Накопите 1 000 PDC',reward:50,check:function(){return S.pdc&gt;=1000;}},
    {id:'rich',icon:'?',name:'Толстосум',desc:'Накопите 10 000 PDC',reward:200,check:function(){return S.pdc&gt;=10000;}},
    {id:'gold_mine',icon:'⛏️',name:'Золотая жила',desc:'Заработайте всего 5 000 PDC',reward:100,check:function(){return S.totalEarned&gt;=5000;}},
    {id:'diversify',icon:'?',name:'Диверсификация',desc:'Активы во всех 4 категориях',reward:100,check:function(){return totalCats()&gt;=4;}},
    {id:'first_block',icon:'⛓️',name:'Первый блок',desc:'Добудьте первый блок',reward:75,check:function(){return S.blocks.length&gt;=1;}},
    {id:'miner',icon:'?',name:'Шахтёр',desc:'Цепь из 5 блоков',reward:100,check:function(){return S.blocks.length&gt;=5;}},
    {id:'cryptographer',icon:'?',name:'Криптограф',desc:'Цепь из 10 блоков',reward:150,check:function(){return S.blocks.length&gt;=10;}},
    {id:'long_chain',icon:'?',name:'Долгая цепь',desc:'Цепь из 20 блоков',reward:200,check:function(){return S.blocks.length&gt;=20;}},
    {id:'active_network',icon:'?',name:'Активная сеть',desc:'10 транзакций в реестре',reward:75,check:function(){return S.txs.length&gt;=10;}},
    {id:'quest_seeker',icon:'?',name:'Искатель квестов',desc:'Выполните 3 квеста',reward:75,check:function(){return questCount()&gt;=3;}},
    {id:'quester',icon:'?',name:'Квестовик',desc:'Выполните 5 квестов',reward:100,check:function(){return questCount()&gt;=5;}},
    {id:'quest_legend',icon:'?',name:'Легенда квестов',desc:'Выполните все 10 квестов',reward:300,check:function(){return questCount()&gt;=10;}},
    {id:'level3',icon:'?',name:'Опытный',desc:'Достигните 3 уровня',reward:75,check:function(){return S.level&gt;=3;}},
    {id:'level5',icon:'?',name:'Профессионал',desc:'Достигните 5 уровня',reward:150,check:function(){return S.level&gt;=5;}},
    {id:'rep5',icon:'⭐',name:'Уважаемый',desc:'Заработайте 5 репутации',reward:75,check:function(){return S.rep&gt;=5;}},
    {id:'rep10',icon:'?',name:'Авторитет',desc:'Заработайте 10 репутации',reward:150,check:function(){return S.rep&gt;=10;}},
    {id:'lawyer',icon:'?',name:'Юрист',desc:'Разверните первый смарт-контракт',reward:75,check:function(){return contractsCount()&gt;=1;}},
    {id:'contractor',icon:'⚖️',name:'Контрактник',desc:'Разверните 3 смарт-контракта',reward:100,check:function(){return contractsCount()&gt;=3;}},
    {id:'executor',icon:'▶️',name:'Исполнитель',desc:'Исполните смарт-контракт',reward:75,check:function(){return executedCount()&gt;=1;}},
    {id:'corporate',icon:'?',name:'Корпорат',desc:'Вступите в корпорацию',reward:100,check:function(){return getCorpType()!==null;}},
    {id:'ceo',icon:'?',name:'CEO',desc:'Основать свою корпорацию',reward:200,check:function(){return getCorpType()==='own';}}
  ];
  var AKEY='pt_achv_v1',earned={};
  function loadEarned(){try{var raw=localStorage.getItem(AKEY);if(raw)earned=JSON.parse(raw);}catch(e){earned={};}}
  function saveEarned(){try{localStorage.setItem(AKEY,JSON.stringify(earned));}catch(e){}}
  loadEarned();
  function toastA(msg){
    var old=document.querySelector('.pt-toast');if(old)old.remove();
    var t=document.createElement('div');t.className='pt-toast';t.textContent=msg;
    document.body.appendChild(t);setTimeout(function(){t.remove();},3000);
  }
  var sec,tab;
  function setup(){
    var nav=document.querySelector('.pt-nav'),main=document.querySelector('.pt-main');
    if(!nav||!main)return;
    tab=document.createElement('button');tab.className='pt-tab';tab.dataset.t='achv';
    tab.innerHTML='&amp;#127942; Достижения';
    nav.appendChild(tab);
    sec=document.createElement('section');sec.className='pt-sec';sec.id='pt-achv';
    sec.innerHTML='&lt;div class="pt-sec-head"&gt;&lt;h2&gt;Достижения&lt;/h2&gt;&lt;div class="pt-achv-summary" id="pt-achv-summary"&gt;&lt;/div&gt;&lt;/div&gt;'
      +'&lt;p class="pt-note"&gt;Открывайте достижения, играя. Каждое приносит награду в PDC. Прогресс сохраняется.&lt;/p&gt;'
      +'&lt;div id="pt-achv-grid" class="pt-achv-grid"&gt;&lt;/div&gt;';
    main.appendChild(sec);
    tab.onclick=function(){
      document.querySelectorAll('.pt-tab').forEach(function(x){x.classList.remove('act');});
      document.querySelectorAll('.pt-sec').forEach(function(x){x.classList.remove('act');});
      tab.classList.add('act');sec.classList.add('act');render();
    };
  }
  function render(){
    var grid=document.getElementById('pt-achv-grid');if(!grid)return;
    grid.innerHTML='';var done=0;
    A.forEach(function(a){
      var isDone=!!earned[a.id];if(isDone)done++;
      var el=document.createElement('div');el.className='pt-achv'+(isDone?' done':'');
      el.innerHTML='&lt;div class="pt-achv-ico"&gt;'+(isDone?a.icon:'?')+'&lt;/div&gt;'
        +'&lt;div class="pt-achv-body"&gt;&lt;div class="pt-achv-top"&gt;&lt;b&gt;'+a.name+'&lt;/b&gt;&lt;span class="pt-achv-reward"&gt;+'+a.reward+' PDC&lt;/span&gt;&lt;/div&gt;'
        +'&lt;div class="pt-achv-desc"&gt;'+a.desc+'&lt;/div&gt;&lt;/div&gt;'
        +'&lt;div class="pt-achv-status"&gt;'+(isDone?'✓':'')+'&lt;/div&gt;';
      grid.appendChild(el);
    });
    var sum=document.getElementById('pt-achv-summary');
    if(sum)sum.innerHTML='&lt;span class="pt-achv-count"&gt;'+done+' / '+A.length+'&lt;/span&gt;&lt;span class="pt-achv-label"&gt;открыто&lt;/span&gt;';
  }
  function check(){
    var newly=[];
    A.forEach(function(a){if(earned[a.id])return;if(a.check()){earned[a.id]=true;S.pdc+=a.reward;PT.save();newly.push(a);}});
    if(newly.length){
      saveEarned();
      var pdcEl=document.getElementById('pt-pdc');if(pdcEl)pdcEl.textContent=fmt(S.pdc);
      newly.forEach(function(a){toastA('? Достижение открыто: '+a.name+' · +'+a.reward+' PDC');});
      render();
    }
  }
  setup();render();check();
  setInterval(function(){if(S.accepted)check();},1500);
})();
&lt;/script&gt;
&lt;script&gt;
(function(){
  var PT=window.PT,S=PT.state;
  if(!PT)return;
  function fmt(n){return new Intl.NumberFormat('ru-RU').format(Math.round(n));}
  function rnd(n){return Math.floor(Math.random()*n);}
  function pick(arr){return arr[rnd(arr.length)];}
  var css=`
  .pt-mkt-active{background:#121A26;border:1px solid rgba(160,180,220,.14);border-radius:12px;padding:14px;margin-bottom:16px;display:flex;align-items:center;gap:12px}
  .pt-mkt-active .mi{font-size:26px}
  .pt-mkt-active .mt{flex:1}
  .pt-mkt-active .mt b{color:#E7EDF5;font-size:.9rem}
  .pt-mkt-active .mt span{display:block;font-size:.72rem;color:#8D99AC}
  .pt-mkt-active.boom{border-color:#3DDC84;background:rgba(61,220,132,.06)}
  .pt-mkt-active.crisis{border-color:#FF5C5C;background:rgba(255,92,92,.06)}
  .pt-mkt-timer{font-family:'JetBrains Mono',monospace;color:#F5B301;font-size:.85rem}
  .pt-mkt-list{display:flex;flex-direction:column;gap:8px}
  .pt-mkt-item{background:#121A26;border:1px solid rgba(160,180,220,.14);border-radius:10px;padding:10px 12px;display:flex;gap:10px;align-items:center;animation:pt-fade .3s ease}
  .pt-mkt-item .mi{font-size:20px}
  .pt-mkt-item .mt{flex:1}
  .pt-mkt-item .mt b{color:#E7EDF5;font-size:.82rem}
  .pt-mkt-item .mt span{display:block;font-size:.7rem;color:#8D99AC}
  .pt-mkt-item .mtime{font-family:'JetBrains Mono',monospace;font-size:.65rem;color:#8D99AC}
  `;
  var styleEl=document.createElement('style');styleEl.textContent=css;document.head.appendChild(styleEl);
  function updatePdc(){var el=document.getElementById('pt-pdc');if(el)el.textContent=fmt(S.pdc);}
  function toastM(msg){
    var old=document.querySelector('.pt-toast');if(old)old.remove();
    var t=document.createElement('div');t.className='pt-toast';t.textContent=msg;
    document.body.appendChild(t);setTimeout(function(){t.remove();},3200);
  }
  var multUntil=0,multVal=1;
  function resetIncome(){S.assets.forEach(function(a){if(a.baseIncome!==undefined){a.income=a.baseIncome;delete a.baseIncome;}});PT.save();}
  function applyMult(){S.assets.forEach(function(a){if(a.baseIncome===undefined)a.baseIncome=a.income;a.income=Math.round(a.baseIncome*multVal);});PT.save();}
  function setMult(m,dur){multVal=m;multUntil=Date.now()+dur*1000;applyMult();}
  function clearMult(){multVal=1;multUntil=0;S.assets.forEach(function(a){if(a.baseIncome!==undefined){a.income=a.baseIncome;delete a.baseIncome;}});PT.save();}
  resetIncome();
  function gain(n){S.pdc+=n;PT.save();updatePdc();}
  function lose(n){S.pdc=Math.max(0,S.pdc-n);PT.save();updatePdc();}
  function giftAsset(){
    var c=pick(PT.CATALOG);
    var found=null;S.assets.forEach(function(a){if(a.id===c.id)found=a;});
    if(found){found.count++;}else{S.assets.push({id:c.id,name:c.name,icon:c.icon,cat:c.cat,income:c.income,desc:c.desc,count:1,lastCollect:Date.now()});}
    PT.save();
  }
  var EVENTS=[
    {id:'bonus',icon:'?',name:'Бонус рынка',desc:'Рынок благосклонен',weight:20,run:function(){gain(100+rnd(100));}},
    {id:'bigbonus',icon:'?',name:'Удачная сделка',desc:'Крупный приток капитала',weight:8,run:function(){gain(300+rnd(200));}},
    {id:'tax',icon:'?️',name:'Налоговая проверка',desc:'Небольшой штраф',weight:12,run:function(){lose(50+rnd(50));}},
    {id:'gift',icon:'?',name:'Подарок',desc:'Бесплатный актив',weight:6,run:function(){giftAsset();}},
    {id:'boom',icon:'?',name:'Рыночный бум',desc:'Доход активов ×2 на 30 сек',weight:10,mult:true,run:function(){setMult(2,30);}},
    {id:'crisis',icon:'?',name:'Кризис',desc:'Доход активов ×0.5 на 30 сек',weight:10,mult:true,run:function(){setMult(0.5,30);}},
    {id:'invest',icon:'?',name:'Инвест-бум',desc:'Приток инвестиций',weight:10,run:function(){gain(200+rnd(150));}},
    {id:'season',icon:'?',name:'Сезон производства',desc:'Производство на подъёме',weight:8,run:function(){gain(150);}}
  ];
  var history=[];
  function addHistory(ev,extra){history.unshift({t:Date.now(),icon:ev.icon,name:ev.name,desc:extra||ev.desc});if(history.length&gt;15)history.pop();}
  function triggerEvent(){
    var total=0;EVENTS.forEach(function(e){total+=e.weight;});
    var r=rnd(total),acc=0,ev=EVENTS[0];
    for(var i=0;i&lt;EVENTS.length;i++){acc+=EVENTS[i].weight;if(r&lt;acc){ev=EVENTS[i];break;}}
    ev.run();
    var extra=ev.id==='gift'?'Подарок: '+pick(PT.CATALOG).name:ev.desc;
    addHistory(ev,extra);toastM(ev.icon+' '+ev.name+' — '+ev.desc);renderMarket();
  }
  function scheduleNext(){var delay=25000+rnd(20000);setTimeout(function(){if(S.accepted)triggerEvent();scheduleNext();},delay);}
  var sec,tab;
  function setup(){
    var nav=document.querySelector('.pt-nav'),main=document.querySelector('.pt-main');
    if(!nav||!main)return;
    tab=document.createElement('button');tab.className='pt-tab';tab.dataset.t='mkt';
    tab.innerHTML='&amp;#128202; Рынок';
    nav.appendChild(tab);
    sec=document.createElement('section');sec.className='pt-sec';sec.id='pt-mkt';
    sec.innerHTML='&lt;div class="pt-sec-head"&gt;&lt;h2&gt;Рынок&lt;/h2&gt;&lt;/div&gt;'
      +'&lt;p class="pt-note"&gt;Случайные события влияют на вашу империю: бонусы, кризисы, подарки. Следите за активными эффектами.&lt;/p&gt;'
      +'&lt;div id="pt-mkt-active"&gt;&lt;/div&gt;'
      +'&lt;h3 class="pt-subhead"&gt;История событий&lt;/h3&gt;'
      +'&lt;div id="pt-mkt-list" class="pt-mkt-list"&gt;&lt;/div&gt;';
    main.appendChild(sec);
    tab.onclick=function(){
      document.querySelectorAll('.pt-tab').forEach(function(x){x.classList.remove('act');});
      document.querySelectorAll('.pt-sec').forEach(function(x){x.classList.remove('act');});
      tab.classList.add('act');sec.classList.add('act');renderMarket();
    };
  }
  function renderMarket(){
    var act=document.getElementById('pt-mkt-active');if(!act)return;
    if(multUntil&gt;Date.now()){
      var left=Math.ceil((multUntil-Date.now())/1000);
      var isBoom=multVal&gt;1;
      act.innerHTML='&lt;div class="pt-mkt-active '+(isBoom?'boom':'crisis')+'"&gt;'
        +'&lt;span class="mi"&gt;'+(isBoom?'?':'?')+'&lt;/span&gt;'
        +'&lt;div class="mt"&gt;&lt;b&gt;'+(isBoom?'Рыночный бум':'Кризис')+'&lt;/b&gt;&lt;span&gt;Доход активов ×'+multVal+'&lt;/span&gt;&lt;/div&gt;'
        +'&lt;span class="pt-mkt-timer"&gt;'+left+' сек&lt;/span&gt;&lt;/div&gt;';
    }else{act.innerHTML='&lt;div class="pt-mkt-active"&gt;&lt;span class="mi"&gt;⚖️&lt;/span&gt;&lt;div class="mt"&gt;&lt;b&gt;Рынок стабилен&lt;/b&gt;&lt;span&gt;Активных эффектов нет&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;';}
    var list=document.getElementById('pt-mkt-list');
    if(!history.length){list.innerHTML='&lt;div class="pt-empty"&gt;Событий пока не было. Подождите — рынок оживёт сам.&lt;/div&gt;';return;}
    list.innerHTML='';
    history.forEach(function(h){
      var el=document.createElement('div');el.className='pt-mkt-item';
      el.innerHTML='&lt;span class="mi"&gt;'+h.icon+'&lt;/span&gt;&lt;div class="mt"&gt;&lt;b&gt;'+h.name+'&lt;/b&gt;&lt;span&gt;'+h.desc+'&lt;/span&gt;&lt;/div&gt;&lt;span class="mtime"&gt;'+new Date(h.t).toLocaleTimeString('ru-RU')+'&lt;/span&gt;';
      list.appendChild(el);
    });
  }
  setInterval(function(){
    if(multUntil&gt;0&amp;&amp;Date.now()&gt;multUntil){clearMult();toastM('⚖️ Рынок стабилизировался');renderMarket();}
    else if(multUntil&gt;0){renderMarket();}
  },1000);
  setup();renderMarket();scheduleNext();
})();
&lt;/script&gt;
&lt;script&gt;
(function(){
  var PT=window.PT,S=PT.state;
  if(!PT)return;
  var canvas=document.getElementById('pt-fx-canvas'),ctx=canvas.getContext('2d');
  var parts=[];
  function resize(){canvas.width=window.innerWidth;canvas.height=window.innerHeight;}
  resize();window.addEventListener('resize',resize);
  var COLORS=['#3DDC84','#F5B301','#FF2E88','#7AB8FF','#FFFFFF'];
  function spawn(x,y,n){
    for(var i=0;i&lt;n;i++){
      var a=Math.random()*Math.PI*2,sp=2+Math.random()*4;
      parts.push({x:x,y:y,vx:Math.cos(a)*sp,vy:Math.sin(a)*sp-2,life:1,size:3+Math.random()*4,c:COLORS[Math.floor(Math.random()*COLORS.length)]});
    }
  }
  function spawnAtPdc(){
    var el=document.getElementById('pt-pdc');if(!el)return;
    var r=el.getBoundingClientRect();
    spawn(r.left+r.width/2,r.top+r.height/2,18);
  }
  function loop(){
    ctx.clearRect(0,0,canvas.width,canvas.height);
    for(var i=parts.length-1;i&gt;=0;i--){
      var p=parts[i];
      p.x+=p.vx;p.y+=p.vy;p.vy+=0.15;p.life-=0.02;
      if(p.life&lt;=0){parts.splice(1,1);continue;}
      ctx.globalAlpha=p.life;ctx.fillStyle=p.c;
      ctx.beginPath();ctx.arc(p.x,p.y,p.size,0,Math.PI*2);ctx.fill();
    }
    ctx.globalAlpha=1;requestAnimationFrame(loop);
  }
  loop();
  var lastPdc=S.pdc;
  setInterval(function(){if(S.pdc&gt;lastPdc){spawnAtPdc();}lastPdc=S.pdc;},600);
  var THEMES=[
    {id:'',name:'Неон',color:'#3DDC84'},
    {id:'pt-theme-gold',name:'Золото',color:'#F5B301'},
    {id:'pt-theme-cyber',name:'Кибер',color:'#7C6BFF'}
  ];
  var themeIdx=0;
  try{themeIdx=parseInt(localStorage.getItem('pt_theme')||'0',10);}catch(e){themeIdx=0;}
  var btn=document.createElement('button');
  btn.className='pt-theme-btn';
  btn.style.cssText='background:#121A26;border:1px solid rgba(160,180,220,.25);color:#E7EDF5;border-radius:8px;padding:7px 12px;cursor:pointer;font-size:.8rem;transition:.2s;display:flex;align-items:center;gap:6px';
  function updBtn(){btn.innerHTML='&lt;span style="width:12px;height:12px;border-radius:50%;background:'+THEMES[themeIdx].color+'"&gt;&lt;/span&gt;'+THEMES[themeIdx].name;}
  updBtn();
  btn.onclick=function(){themeIdx=(themeIdx+1)%THEMES.length;try{localStorage.setItem('pt_theme',String(themeIdx));}catch(e){}applyTheme();updBtn();};
  var headIn=document.querySelector('.pt-head-in');
  if(headIn){headIn.insertBefore(btn,headIn.querySelector('#pt-reset'));}
  function applyTheme(){
    document.body.classList.remove('pt-theme-gold','pt-theme-cyber');
    if(THEMES[themeIdx].id)document.body.classList.add(THEMES[themeIdx].id);
  }
  applyTheme();
})();
&lt;/script&gt;
&lt;script&gt;
(function(){
  var PT=window.PT,S=PT.state;
  if(!PT)return;
  function fmt(n){return new Intl.NumberFormat('ru-RU').format(Math.round(n));}
  function rnd(n){return Math.floor(Math.random()*n);}
  var css=`
  .pt-bm-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(240px,1fr));gap:14px}
  .pt-bm-card{background:#121A26;border:2px solid rgba(160,180,220,.14);border-radius:14px;padding:16px;display:flex;flex-direction:column;gap:8px;transition:.2s}
  .pt-bm-card.rare{border-color:#4FC3F7}
  .pt-bm-card.epic{border-color:#B388FF}
  .pt-bm-card.legendary{border-color:#FFD700;box-shadow:0 0 18px rgba(255,215,0,.25)}
  .pt-bm-card:hover{transform:translateY(-3px)}
  .pt-bm-top{display:flex;align-items:center;gap:10px}
  .pt-bm-ico{font-size:30px}
  .pt-bm-name{font-weight:700;font-size:.95rem;color:#E7EDF5}
  .pt-bm-cat{font-size:.7rem;color:#8D99AC}
  .pt-bm-rarity{font-family:'JetBrains Mono',monospace;font-size:.62rem;letter-spacing:.08em;padding:2px 8px;border-radius:999px;font-weight:700}
  .pt-bm-rarity.rare{color:#4FC3F7;border:1px solid #4FC3F7}
  .pt-bm-rarity.epic{color:#B388FF;border:1px solid #B388FF}
  .pt-bm-rarity.legendary{color:#FFD700;border:1px solid #FFD700}
  .pt-bm-income{font-size:.82rem;color:#3DDC84;font-weight:700}
  .pt-bm-buy{margin-top:auto;background:#121A26;border:1px solid #3DDC84;color:#3DDC84;border-radius:8px;padding:10px;cursor:pointer;font-weight:700;font-size:.85rem;transition:.2s}
  .pt-bm-buy:hover:not(:disabled){background:#3DDC84;color:#05261a;box-shadow:0 0 14px rgba(61,220,132,.5)}
  .pt-bm-buy:disabled{opacity:.45;cursor:not-allowed;border-color:rgba(160,180,220,.25);color:#8D99AC}
  .pt-bm-timer{font-family:'JetBrains Mono',monospace;font-size:.8rem;color:#F5B301;margin-bottom:14px}
  `;
  var styleEl=document.createElement('style');styleEl.textContent=css;document.head.appendChild(styleEl);
  var RARE=[
    {id:'r_drone',name:'Дрон-доставщик',icon:'?',cat:'Транспорт',income:26,rarity:'rare',cost:2000},
    {id:'r_lab',name:'Лаборатория',icon:'?',cat:'Производство',income:28,rarity:'rare',cost:2500},
    {id:'r_cafe',name:'Кофейня премиум',icon:'☕',cat:'Бизнес',income:22,rarity:'rare',cost:1800},
    {id:'e_datacenter',name:'Дата-центр',icon:'?️',cat:'Производство',income:50,rarity:'epic',cost:6000},
    {id:'e_yacht',name:'Яхта',icon:'?️',cat:'Транспорт',income:45,rarity:'epic',cost:5500},
    {id:'e_mall',name:'Торговый центр',icon:'?',cat:'Недвижимость',income:55,rarity:'epic',cost:7000},
    {id:'l_spaceport',name:'Космопорт',icon:'?',cat:'Транспорт',income:100,rarity:'legendary',cost:20000},
    {id:'l_ai',name:'ИИ-корпорация',icon:'?',cat:'Производство',income:110,rarity:'legendary',cost:25000},
    {id:'l_island',name:'Частный остров',icon:'?️',cat:'Недвижимость',income:90,rarity:'legendary',cost:22000}
  ];
  var RARITY_NAME={rare:'РЕДКИЙ',epic:'ЭПИЧЕСКИЙ',legendary:'ЛЕГЕНДАРНЫЙ'};
  var RARITY_WEIGHT={rare:60,epic:30,legendary:10};
  function toastBM(msg,isErr){
    var old=document.querySelector('.pt-toast');if(old)old.remove();
    var t=document.createElement('div');t.className='pt-toast'+(isErr?' err':'');t.textContent=msg;
    document.body.appendChild(t);setTimeout(function(){t.remove();},3200);
  }
  var offer=[];
  var refreshAt=Date.now()+120000;
  function pickRarity(){
    var total=RARITY_WEIGHT.rare+RARITY_WEIGHT.epic+RARITY_WEIGHT.legendary;
    var r=rnd(total);
    if(r&lt;RARITY_WEIGHT.rare)return 'rare';
    if(r&lt;RARITY_WEIGHT.rare+RARITY_WEIGHT.epic)return 'epic';
    return 'legendary';
  }
  function genOffer(){
    offer=[];
    for(var i=0;i&lt;3;i++){
      var rar=pickRarity();
      var pool=RARE.filter(function(a){return a.rarity===rar;});
      offer.push(pool[rnd(pool.length)]);
    }
    refreshAt=Date.now()+120000;
  }
  genOffer();
  function buy(idx){
    var a=offer[idx];if(!a)return;
    if(S.pdc&lt;a.cost){toastBM('Недостаточно PDC (нужно '+fmt(a.cost)+')',true);return;}
    S.pdc-=a.cost;
    var found=null;S.assets.forEach(function(x){if(x.id===a.id)found=x;});
    if(found){found.count++;}
    else{S.assets.push({id:a.id,name:a.name,icon:a.icon,cat:a.cat,income:a.income,desc:'Редкий актив с Чёрного рынка ('+RARITY_NAME[a.rarity]+')',count:1,lastCollect:Date.now()});}
    PT.save();
    var pdcEl=document.getElementById('pt-pdc');if(pdcEl)pdcEl.textContent=fmt(S.pdc);
    toastBM(a.icon+' Куплено: '+a.name+' ('+RARITY_NAME[a.rarity]+')!');
    renderBM();
  }
  var sec,tab;
  function setup(){
    var nav=document.querySelector('.pt-nav'),main=document.querySelector('.pt-main');
    if(!nav||!main)return;
    tab=document.createElement('button');tab.className='pt-tab';tab.dataset.t='bm';
    tab.innerHTML='&amp;#128142; Чёрный рынок';
    nav.appendChild(tab);
    sec=document.createElement('section');sec.className='pt-sec';sec.id='pt-bm';
    sec.innerHTML='&lt;div class="pt-sec-head"&gt;&lt;h2&gt;Чёрный рынок&lt;/h2&gt;&lt;/div&gt;'
      +'&lt;p class="pt-note"&gt;Здесь появляются редкие и легендарные активы с повышенной доходностью. Ассортимент обновляется каждые 2 минуты. Успейте купить!&lt;/p&gt;'
      +'&lt;div class="pt-bm-timer" id="pt-bm-timer"&gt;Обновление через 120 сек&lt;/div&gt;'
      +'&lt;div id="pt-bm-grid" class="pt-bm-grid"&gt;&lt;/div&gt;';
    main.appendChild(sec);
    tab.onclick=function(){
      document.querySelectorAll('.pt-tab').forEach(function(x){x.classList.remove('act');});
      document.querySelectorAll('.pt-sec').forEach(function(x){x.classList.remove('act');});
      tab.classList.add('act');sec.classList.add('act');renderBM();
    };
  }
  function renderBM(){
    var grid=document.getElementById('pt-bm-grid');if(!grid)return;
    grid.innerHTML='';
    offer.forEach(function(a,idx){
      var el=document.createElement('div');
      el.className='pt-bm-card '+a.rarity;
      el.innerHTML='&lt;div class="pt-bm-top"&gt;&lt;span class="pt-bm-ico"&gt;'+a.icon+'&lt;/span&gt;'
        +'&lt;div&gt;&lt;div class="pt-bm-name"&gt;'+a.name+'&lt;/div&gt;&lt;div class="pt-bm-cat"&gt;'+a.cat+'&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;'
        +'&lt;span class="pt-bm-rarity '+a.rarity+'"&gt;'+RARITY_NAME[a.rarity]+'&lt;/span&gt;'
        +'&lt;div class="pt-bm-income"&gt;+'+a.income+' PDC / цикл&lt;/div&gt;'
        +'&lt;button class="pt-bm-buy" data-i="'+idx+'" '+(S.pdc&lt;a.cost?'disabled':'')+'&gt;Купить · '+fmt(a.cost)+' PDC&lt;/button&gt;';
      grid.appendChild(el);
    });
    grid.querySelectorAll('.pt-bm-buy').forEach(function(b){b.onclick=function(){buy(+b.dataset.i);};});
  }
  setInterval(function(){
    var left=Math.max(0,Math.ceil((refreshAt-Date.now())/1000));
    var timerEl=document.getElementById('pt-bm-timer');
    if(timerEl)timerEl.textContent='Обновление через '+left+' сек';
    if(left&lt;=0){genOffer();renderBM();}
  },1000);
  setup();renderBM();
})();
&lt;/script&gt;
&lt;script&gt;
(function(){
  var PT=window.PT,S=PT.state;
  if(!PT)return;
  var audioCtx=null,soundOn=true;
  try{soundOn=localStorage.getItem('pt_sound')!=='0';}catch(e){soundOn=true;}
  var btn=document.createElement('button');
  btn.title='Звук вкл/выкл';
  btn.style.cssText='background:#121A26;border:1px solid rgba(160,180,220,.25);color:#E7EDF5;border-radius:8px;padding:7px 12px;cursor:pointer;font-size:.8rem;transition:.2s';
  function updBtn(){btn.innerHTML=soundOn?'&amp;#128266; Звук':'&amp;#128263; Тихо';}
  updBtn();
  btn.onclick=function(){soundOn=!soundOn;try{localStorage.setItem('pt_sound',soundOn?'1':'0');}catch(e){}updBtn();if(soundOn)playCoin();};
  var headIn=document.querySelector('.pt-head-in');
  if(headIn){headIn.insertBefore(btn,headIn.querySelector('#pt-reset'));}
  function ensureCtx(){
    if(!audioCtx){try{audioCtx=new (window.AudioContext||window.webkitAudioContext)();}catch(e){return null;}}
    if(audioCtx.state==='suspended')audioCtx.resume();
    return audioCtx;
  }
  document.addEventListener('click',ensureCtx,{once:true});
  function tone(freq,dur,type,gain){
    if(!soundOn)return;
    var ctx=ensureCtx();if(!ctx)return;
    var o=ctx.createOscillator(),g=ctx.createGain();
    o.type=type||'sine';o.frequency.value=freq;
    g.gain.setValueAtTime(gain||0.12,ctx.currentTime);
    g.gain.exponentialRampToValueAtTime(0.001,ctx.currentTime+dur);
    o.connect(g);g.connect(ctx.destination);
    o.start();o.stop(ctx.currentTime+dur);
  }
  function playCoin(){tone(1046,0.12,'sine',0.12);setTimeout(function(){tone(1568,0.14,'sine',0.1);},80);}
  var lastPdc=S.pdc,cooldown=0;
  setInterval(function(){
    if(S.pdc&gt;lastPdc){
      var now=Date.now();
      if(now-cooldown&gt;700){playCoin();cooldown=now;}
    }
    lastPdc=S.pdc;
  },600);
})();
&lt;/script&gt;
&lt;script&gt;
(function(){
  var PT=window.PT,S=PT.state;
  if(!PT)return;
  function fmt(n){return new Intl.NumberFormat('ru-RU').format(Math.round(n));}
  var css=`
  .pt-pr-box{background:#121A26;border:2px solid rgba(255,46,136,.4);border-radius:14px;padding:22px;max-width:560px}
  .pt-pr-level{font-family:'Unbounded';font-size:2rem;color:#FF2E88;margin:8px 0}
  .pt-pr-mult{font-size:1rem;color:#F5B301;font-weight:700;margin-bottom:14px}
  .pt-pr-desc{font-size:.85rem;color:#8D99AC;line-height:1.5;margin-bottom:16px}
  .pt-pr-btn{background:#FF2E88;color:#fff;border:none;border-radius:10px;padding:13px 22px;cursor:pointer;font-weight:700;font-size:.9rem;transition:.2s}
  .pt-pr-btn:hover:not(:disabled){box-shadow:0 0 20px rgba(255,46,136,.6);transform:translateY(-2px)}
  .pt-pr-btn:disabled{opacity:.45;cursor:not-allowed}
  .pt-pr-req{font-size:.78rem;color:#8D99AC;margin-top:12px}
  `;
  var styleEl=document.createElement('style');styleEl.textContent=css;document.head.appendChild(styleEl);
  var PKEY='pt_prestige_v1';
  var pr={level:0,totalEarnedAllTime:S.totalEarned||0};
  try{var raw=localStorage.getItem(PKEY);if(raw)pr=JSON.parse(raw);}catch(e){}
  function savePr(){try{localStorage.setItem(PKEY,JSON.stringify(pr));}catch(e){}}
  function mult(){return 1+pr.level*0.5;}
  var PRESTIGE_REQ=50000;
  function toastPr(msg,isErr){
    var old=document.querySelector('.pt-toast');if(old)old.remove();
    var t=document.createElement('div');t.className='pt-toast'+(isErr?' err':'');t.textContent=msg;
    document.body.appendChild(t);setTimeout(function(){t.remove();},3200);
  }
  function applyMult(){
    S.assets.forEach(function(a){
      if(a.baseIncome===undefined)a.baseIncome=a.income;
      a.income=Math.round(a.baseIncome*mult());
    });
    PT.save();
  }
  applyMult();
  function doPrestige(){
    if(S.totalEarned&lt;PRESTIGE_REQ){toastPr('Нужно заработать '+fmt(PRESTIGE_REQ)+' PDC всего',true);return;}
    if(!confirm('Переродить империю? Активы и PDC будут сброшены, но вы получите постоянный множитель дохода ×'+(1+(pr.level+1)*0.5).toFixed(1)+'.'))return;
    pr.level++;
    pr.totalEarnedAllTime+=S.totalEarned;
    savePr();
    S.assets=[];
    S.pdc=1000*pr.level;
    S.totalEarned=0;
    PT.save();
    var pdcEl=document.getElementById('pt-pdc');if(pdcEl)pdcEl.textContent=fmt(S.pdc);
    toastPr('? Перерождение! Уровень престижа '+pr.level+', множитель ×'+mult().toFixed(1));
    renderPr();
  }
  var sec,tab;
  function setup(){
    var nav=document.querySelector('.pt-nav'),main=document.querySelector('.pt-main');
    if(!nav||!main)return;
    tab=document.createElement('button');tab.className='pt-tab';tab.dataset.t='pr';
    tab.innerHTML='&amp;#127775; Престиж';
    nav.appendChild(tab);
    sec=document.createElement('section');sec.className='pt-sec';sec.id='pt-pr';
    sec.innerHTML='&lt;div class="pt-sec-head"&gt;&lt;h2&gt;Престиж&lt;/h2&gt;&lt;/div&gt;'
      +'&lt;p class="pt-note"&gt;Переродите империю, чтобы получить постоянный множитель дохода. Чем выше уровень престижа, тем быстрее растёт доход.&lt;/p&gt;'
      +'&lt;div class="pt-pr-box" id="pt-pr-box"&gt;&lt;/div&gt;';
    main.appendChild(sec);
    tab.onclick=function(){
      document.querySelectorAll('.pt-tab').forEach(function(x){x.classList.remove('act');});
      document.querySelectorAll('.pt-sec').forEach(function(x){x.classList.remove('act');});
      tab.classList.add('act');sec.classList.add('act');renderPr();
    };
  }
  function renderPr(){
    var box=document.getElementById('pt-pr-box');if(!box)return;
    var can=S.totalEarned&gt;=PRESTIGE_REQ;
    box.innerHTML='&lt;div class="pt-pr-level"&gt;Уровень престижа: '+pr.level+'&lt;/div&gt;'
      +'&lt;div class="pt-pr-mult"&gt;Текущий множитель дохода: ×'+mult().toFixed(1)+'&lt;/div&gt;'
      +'&lt;div class="pt-pr-desc"&gt;При перерождении активы и PDC сбрасываются, но вы получаете постоянный множитель дохода ×'+(1+(pr.level+1)*0.5).toFixed(1)+' и стартовый бонус '+fmt(1000*(pr.level+1))+' PDC.&lt;/div&gt;'
      +'&lt;button class="pt-pr-btn" id="pt-pr-btn" '+(can?'':'disabled')+'&gt;? Переродиться&lt;/button&gt;'
      +'&lt;div class="pt-pr-req"&gt;Заработано всего: '+fmt(S.totalEarned)+' / '+fmt(PRESTIGE_REQ)+' PDC&lt;/div&gt;';
    var btn=document.getElementById('pt-pr-btn');
    if(btn)btn.onclick=doPrestige;
  }
  setInterval(function(){
    if(S.assets.length)applyMult();
    if(sec&amp;&amp;sec.classList.contains('act'))renderPr();
  },2000);
  setup();renderPr();
})();
&lt;/script&gt;
&lt;script&gt;
(function(){
  var PT=window.PT,S=PT.state;
  if(!PT)return;
  function fmt(n){return new Intl.NumberFormat('ru-RU').format(Math.round(n));}
  var css=`
  .pt-daily-list{display:flex;flex-direction:column;gap:12px;max-width:560px}
  .pt-daily-item{background:#121A26;border:1px solid rgba(160,180,220,.14);border-radius:12px;padding:16px;display:flex;align-items:center;gap:14px;transition:.2s}
  .pt-daily-item.done{border-color:#3DDC84;background:rgba(61,220,132,.06)}
  .pt-daily-ico{font-size:26px;flex:0 0 auto}
  .pt-daily-body{flex:1}
  .pt-daily-name{font-weight:700;font-size:.9rem;color:#E7EDF5}
  .pt-daily-desc{font-size:.75rem;color:#8D99AC;margin-top:2px}
  .pt-daily-prog{font-size:.72rem;color:#F5B301;margin-top:4px}
  .pt-daily-reward{font-family:'JetBrains Mono',monospace;font-size:.75rem;color:#F5B301;font-weight:700;white-space:nowrap;background:none;border:1px solid #F5B301;border-radius:8px;padding:8px 12px;cursor:pointer}
  .pt-daily-check{font-size:1.3rem;color:#3DDC84;font-weight:700}
  .pt-daily-reset{font-size:.75rem;color:#8D99AC;margin-top:16px}
  `;
  var styleEl=document.createElement('style');styleEl.textContent=css;document.head.appendChild(styleEl);
  var DKEY='pt_daily_v1';
  function todayStr(){var d=new Date();return d.getFullYear()+'-'+(d.getMonth()+1)+'-'+d.getDate();}
  var daily={date:todayStr(),goals:[],claimed:{}};
  try{var raw=localStorage.getItem(DKEY);if(raw)daily=JSON.parse(raw);}catch(e){}
  function saveDaily(){try{localStorage.setItem(DKEY,JSON.stringify(daily));}catch(e){}}
  function genGoals(){
    daily.date=todayStr();
    daily.claimed={};
    daily.goals=[
      {id:'collect',icon:'?',name:'Собери доход 5 раз',desc:'Соберите доход с активов 5 раз',target:5,progress:0,reward:200},
      {id:'assets',icon:'?️',name:'Получи 2 актива',desc:'Купите или получите 2 новых актива',target:2,progress:0,reward:300},
      {id:'blocks',icon:'⛓️',name:'Добудь 2 блока',desc:'Добудьте 2 блока в реестре',target:2,progress:0,reward:250}
    ];
    saveDaily();
  }
  if(daily.date!==todayStr()||!daily.goals||!daily.goals.length){genGoals();}
  function toastD(msg,isErr){
    var old=document.querySelector('.pt-toast');if(old)old.remove();
    var t=document.createElement('div');t.className='pt-toast'+(isErr?' err':'');t.textContent=msg;
    document.body.appendChild(t);setTimeout(function(){t.remove();},3200);
  }
  var lastEarned=S.totalEarned||0;
  var lastAssetCount=S.assets.reduce(function(n,a){return n+a.count;},0);
  var lastBlocks=S.blocks.length;
  function track(){
    var changed=false;
    if(S.totalEarned&gt;lastEarned){
      var g=daily.goals.find(function(x){return x.id==='collect';});
      if(g&amp;&amp;g.progress&lt;g.target){g.progress++;changed=true;}
      lastEarned=S.totalEarned;
    }
    var curAssets=S.assets.reduce(function(n,a){return n+a.count;},0);
    if(curAssets&gt;lastAssetCount){
      var g2=daily.goals.find(function(x){return x.id==='assets';});
      if(g2&amp;&amp;g2.progress&lt;g2.target){g2.progress+=(curAssets-lastAssetCount);if(g2.progress&gt;g2.target)g2.progress=g2.target;changed=true;}
      lastAssetCount=curAssets;
    }
    if(S.blocks.length&gt;lastBlocks){
      var g3=daily.goals.find(function(x){return x.id==='blocks';});
      if(g3&amp;&amp;g3.progress&lt;g3.target){g3.progress+=(S.blocks.length-lastBlocks);if(g3.progress&gt;g3.target)g3.progress=g3.target;changed=true;}
      lastBlocks=S.blocks.length;
    }
    if(changed){saveDaily();renderDaily();}
  }
  function claim(idx){
    var g=daily.goals[idx];
    if(!g||daily.claimed[g.id]||g.progress&lt;g.target)return;
    daily.claimed[g.id]=true;
    S.pdc+=g.reward;PT.save();
    saveDaily();
    var pdcEl=document.getElementById('pt-pdc');if(pdcEl)pdcEl.textContent=fmt(S.pdc);
    toastD('? Цель выполнена: '+g.name+' · +'+g.reward+' PDC');
    renderDaily();
  }
  var sec,tab;
  function setup(){
    var nav=document.querySelector('.pt-nav'),main=document.querySelector('.pt-main');
    if(!nav||!main)return;
    tab=document.createElement('button');tab.className='pt-tab';tab.dataset.t='daily';
    tab.innerHTML='&amp;#127873; Цели';
    nav.appendChild(tab);
    sec=document.createElement('section');sec.className='pt-sec';sec.id='pt-daily';
    sec.innerHTML='&lt;div class="pt-sec-head"&gt;&lt;h2&gt;Ежедневные цели&lt;/h2&gt;&lt;/div&gt;'
      +'&lt;p class="pt-note"&gt;Выполняйте цели каждый день и получайте награды. Цели обновляются в полночь.&lt;/p&gt;'
      +'&lt;div class="pt-daily-list" id="pt-daily-list"&gt;&lt;/div&gt;'
      +'&lt;div class="pt-daily-reset" id="pt-daily-reset"&gt;&lt;/div&gt;';
    main.appendChild(sec);
    tab.onclick=function(){
      document.querySelectorAll('.pt-tab').forEach(function(x){x.classList.remove('act');});
      document.querySelectorAll('.pt-sec').forEach(function(x){x.classList.remove('act');});
      tab.classList.add('act');sec.classList.add('act');renderDaily();
    };
  }
  function renderDaily(){
    var list=document.getElementById('pt-daily-list');if(!list)return;
    list.innerHTML='';
    daily.goals.forEach(function(g,idx){
      var done=g.progress&gt;=g.target;
      var claimed=daily.claimed[g.id];
      var el=document.createElement('div');
      el.className='pt-daily-item'+(done?' done':'');
      el.innerHTML='&lt;span class="pt-daily-ico"&gt;'+g.icon+'&lt;/span&gt;'
        +'&lt;div class="pt-daily-body"&gt;'
        +'&lt;div class="pt-daily-name"&gt;'+g.name+'&lt;/div&gt;'
        +'&lt;div class="pt-daily-desc"&gt;'+g.desc+'&lt;/div&gt;'
        +'&lt;div class="pt-daily-prog"&gt;'+g.progress+' / '+g.target+'&lt;/div&gt;'
        +'&lt;/div&gt;'
        +(claimed?'&lt;span class="pt-daily-check"&gt;✓&lt;/span&gt;'
          :done?'&lt;button class="pt-daily-reward" data-i="'+idx+'"&gt;Забрать +'+g.reward+'&lt;/button&gt;'
          :'&lt;span class="pt-daily-reward" style="border:none;cursor:default"&gt;+'+g.reward+' PDC&lt;/span&gt;');
      list.appendChild(el);
    });
    list.querySelectorAll('button[data-i]').forEach(function(b){b.onclick=function(){claim(+b.dataset.i);};});
    var resetEl=document.getElementById('pt-daily-reset');
    if(resetEl)resetEl.textContent='Цели обновятся в полночь. Сегодня: '+todayStr();
  }
  setInterval(function(){
    if(daily.date!==todayStr()){genGoals();renderDaily();}
    track();
  },2000);
  setup();renderDaily();
})();
&lt;/script&gt;
&lt;script&gt;
(function(){
  var PT=window.PT,S=PT.state;
  if(!PT)return;
  function fmt(n){return new Intl.NumberFormat('ru-RU').format(Math.round(n));}
  function shuffle(a){var r=a.slice();for(var i=r.length-1;i&gt;0;i--){var j=Math.floor(Math.random()*(i+1));var t=r[i];r[i]=r[j];r[j]=t;}return r;}
  var css=`
  .pt-ac-progress{font-size:.85rem;color:#8D99AC;margin-bottom:16px}
  .pt-ac-list{display:grid;grid-template-columns:repeat(auto-fill,minmax(230px,1fr));gap:12px}
  .pt-ac-item{background:#121A26;border:1px solid rgba(160,180,220,.14);border-radius:12px;padding:16px;cursor:pointer;transition:.2s;display:flex;flex-direction:column;gap:6px}
  .pt-ac-item:hover{transform:translateY(-2px);border-color:#7C6BFF}
  .pt-ac-item.done{border-color:#3DDC84;background:rgba(61,220,132,.05)}
  .pt-ac-item-top{display:flex;align-items:center;gap:10px}
  .pt-ac-item-top .ico{font-size:24px}
  .pt-ac-item-top .ttl{font-weight:700;font-size:.9rem;color:#E7EDF5;flex:1}
  .pt-ac-item .st{font-size:.7rem;color:#8D99AC}
  .pt-ac-item.done .st{color:#3DDC84}
  .pt-ac-item .rw{font-family:'JetBrains Mono',monospace;font-size:.7rem;color:#F5B301}
  .pt-ac-view{max-width:620px;background:#121A26;border:1px solid rgba(124,107,255,.4);border-radius:14px;padding:22px}
  .pt-ac-back{background:none;border:none;color:#7C6BFF;cursor:pointer;font-size:.8rem;margin-bottom:12px;padding:0}
  .pt-ac-title{font-family:'Unbounded';font-size:1.1rem;color:#E7EDF5;margin-bottom:10px}
  .pt-ac-text{font-size:.88rem;color:#8D99AC;line-height:1.6;margin-bottom:18px;border-left:3px solid #7C6BFF;padding-left:12px}
  .pt-ac-q{font-weight:700;color:#E7EDF5;margin-bottom:12px}
  .pt-ac-opt{display:block;width:100%;text-align:left;background:#0e1520;border:1px solid rgba(160,180,220,.2);color:#E7EDF5;border-radius:8px;padding:11px 14px;margin-bottom:8px;cursor:pointer;font-size:.85rem;transition:.15s}
  .pt-ac-opt:hover{border-color:#7C6BFF;background:#1a1630}
  .pt-ac-opt.wrong{border-color:#FF5C5C;background:rgba(255,92,92,.12)}
  .pt-ac-opt.right{border-color:#3DDC84;background:rgba(61,220,132,.15)}
  .pt-ac-diploma{max-width:620px;margin-top:18px;background:#121A26;border:2px solid #FFD700;border-radius:14px;padding:20px;text-align:center;cursor:pointer}
  .pt-ac-diploma b{color:#FFD700;font-size:1rem}
  `;
  var styleEl=document.createElement('style');styleEl.textContent=css;document.head.appendChild(styleEl);
  var LESSONS=[
    {id:'blockchain',icon:'⛓️',title:'Что такое блокчейн',reward:100,
     text:'Блокчейн — распределённый реестр: цепочка блоков, где каждый блок хранит данные и хеш предыдущего. Изменить старый блок незаметно нельзя — это сломает всю цепочку.',
     question:'Что связывает блоки в цепочку?',
     options:['Хеш предыдущего блока','Имя создателя','Время создания','Номер счёта'],
     answer:'Хеш предыдущего блока'},
    {id:'hash',icon:'#️⃣',title:'Что такое хеш',reward:100,
     text:'Хеш — уникальный «отпечаток» данных. Даже крошечное изменение данных полностью меняет хеш. Ты видел это в реестре PANDO Tycoon.',
     question:'Что случится с хешем, если изменить данные?',
     options:['Полностью изменится','Останется прежним','Поменяется один символ','Хеш удалится'],
     answer:'Полностью изменится'},
    {id:'consensus',icon:'?',title:'Консенсус и Proof-of-Work',reward:120,
     text:'Консенсус — правило, по которому сеть решает, какие транзакции верны. Proof-of-Work требует вычислений (майнинг), Proof-of-Stake — доли в сети.',
     question:'Что нужно для Proof-of-Work?',
     options:['Вычислительная работа','Голосование','Подпись директора','Звонок в банк'],
     answer:'Вычислительная работа'},
    {id:'smartcontract',icon:'?',title:'Смарт-контракты',reward:120,
     text:'Смарт-контракт — программа, которая сама исполняет условия договора, когда они выполнены. Остановить или изменить её исполнение никто не может.',
     question:'Что делает смарт-контракт?',
     options:['Автоматически исполняет условия','Собирает подписи','Печатает договор','Отправляет факс'],
     answer:'Автоматически исполняет условия'},
    {id:'token',icon:'?',title:'Токены',reward:100,
     text:'Токен — цифровая единица учёта в блокчейне. Он может быть средством оплаты, правом голоса или игровым предметом.',
     question:'Чем может быть токен?',
     options:['Всем сразу: оплатой, голосом, предметом','Только деньгами','Только картинкой','Только паролем'],
     answer:'Всем сразу: оплатой, голосом, предметом'},
    {id:'defi',icon:'?',title:'DeFi — децентрализованные финансы',reward:140,
     text:'DeFi — займы, обмен и доход на смарт-контрактах, без банков и посредников. Правила задаёт код, а не организация.',
     question:'Кто посредник в DeFi?',
     options:['Никто — только смарт-контракты','Банк','Биржа','Государство'],
     answer:'Никто — только смарт-контракты'},
    {id:'nft',icon:'?️',title:'NFT',reward:120,
     text:'NFT — невзаимозаменяемый токен: он подтверждает уникальность цифрового объекта — искусства, предмета, права.',
     question:'Чем NFT отличается от обычной монеты?',
     options:['Уникальностью','Ценой','Цветом','Ничем'],
     answer:'Уникальностью'},
    {id:'decentral',icon:'?',title:'Децентрализация',reward:140,
     text:'Децентрализация — сеть из множества независимых узлов вместо одного сервера. Такую сеть сложно остановить или подделать.',
     question:'В чём сила децентрализации?',
     options:['Нет единой точки отказа','Дешёвый хостинг','Быстрый интернет','Красивый дизайн'],
     answer:'Нет единой точки отказа'}
  ];
  var DIPLOMA_REWARD=500;
  var AKEY='pt_academy_v1';
  var prog={passed:{},diploma:false};
  try{var raw=localStorage.getItem(AKEY);if(raw)prog=JSON.parse(raw);}catch(e){}
  function saveProg(){try{localStorage.setItem(AKEY,JSON.stringify(prog));}catch(e){}}
  function toastAc(msg,isErr){
    var old=document.querySelector('.pt-toast');if(old)old.remove();
    var t=document.createElement('div');t.className='pt-toast'+(isErr?' err':'');t.textContent=msg;
    document.body.appendChild(t);setTimeout(function(){t.remove();},3200);
  }
  var current=null,currentOpts=[],wrong=null;
  function openLesson(id){
    current=null;wrong=null;
    for(var i=0;i&lt;LESSONS.length;i++){if(LESSONS[i].id===id){current=LESSONS[i];break;}}
    if(!current)return;
    currentOpts=shuffle(current.options);
    renderView();
  }
  function pickOpt(opt){
    if(!current)return;
    if(opt===current.answer){
      if(!prog.passed[current.id]){
        prog.passed[current.id]=true;
        S.pdc+=current.reward;PT.save();saveProg();
        var pdcEl=document.getElementById('pt-pdc');if(pdcEl)pdcEl.textContent=fmt(S.pdc);
        toastAc('? Верно! Урок пройден: '+current.title+' · +'+current.reward+' PDC');
      }
      wrong=null;renderView();
    } else {
      wrong=opt;renderView();
      toastAc('Неверно, попробуй ещё раз',true);
    }
  }
  function claimDiploma(){
    if(prog.diploma)return;
    prog.diploma=true;
    S.pdc+=DIPLOMA_REWARD;PT.save();saveProg();
    var pdcEl=document.getElementById('pt-pdc');if(pdcEl)pdcEl.textContent=fmt(S.pdc);
    toastAc('? Диплом Академии PANDO! +'+DIPLOMA_REWARD+' PDC');
    renderList();
  }
  var sec,tab,view;
  function setup(){
    var nav=document.querySelector('.pt-nav'),main=document.querySelector('.pt-main');
    if(!nav||!main)return;
    tab=document.createElement('button');tab.className='pt-tab';tab.dataset.t='academy';
    tab.innerHTML='&amp;#127891; Академия';
    nav.appendChild(tab);
    sec=document.createElement('section');sec.className='pt-sec';sec.id='pt-academy';
    sec.innerHTML='&lt;div class="pt-sec-head"&gt;&lt;h2&gt;Академия PANDO&lt;/h2&gt;&lt;/div&gt;'
      +'&lt;p class="pt-note"&gt;Пройди уроки о блокчейне, консенсусе, смарт-контрактах и DeFi. Верный ответ — награда. Пройди все — получи диплом.&lt;/p&gt;'
      +'&lt;div class="pt-ac-progress" id="pt-ac-progress"&gt;&lt;/div&gt;'
      +'&lt;div id="pt-ac-body"&gt;&lt;/div&gt;';
    main.appendChild(sec);
    view=document.getElementById('pt-ac-body');
    tab.onclick=function(){
      document.querySelectorAll('.pt-tab').forEach(function(x){x.classList.remove('act');});
      document.querySelectorAll('.pt-sec').forEach(function(x){x.classList.remove('act');});
      tab.classList.add('act');sec.classList.add('act');
      current=null;renderList();
    };
  }
  function passedCount(){var n=0;for(var k in prog.passed){if(prog.passed[k])n++;}return n;}
  function renderList(){
    if(!view)return;
    var pc=passedCount();
    var pe=document.getElementById('pt-ac-progress');
    if(pe)pe.textContent='Пройдено уроков: '+pc+' / '+LESSONS.length;
    var h='&lt;div class="pt-ac-list"&gt;';
    LESSONS.forEach(function(l){
      var done=!!prog.passed[l.id];
      h+='&lt;div class="pt-ac-item'+(done?' done':'')+'" data-id="'+l.id+'"&gt;'
        +'&lt;div class="pt-ac-item-top"&gt;&lt;span class="ico"&gt;'+l.icon+'&lt;/span&gt;&lt;span class="ttl"&gt;'+l.title+'&lt;/span&gt;&lt;/div&gt;'
        +'&lt;span class="st"&gt;'+(done?'✓ Пройден':'Нажми, чтобы начать')+'&lt;/span&gt;'
        +'&lt;span class="rw"&gt;+'+l.reward+' PDC&lt;/span&gt;&lt;/div&gt;';
    });
    h+='&lt;/div&gt;';
    if(pc===LESSONS.length&amp;&amp;!prog.diploma){
      h+='&lt;div class="pt-ac-diploma" id="pt-ac-diploma"&gt;&lt;b&gt;? Все уроки пройдены!&lt;/b&gt;&lt;br&gt;Забери диплом Академии PANDO +'+DIPLOMA_REWARD+' PDC&lt;/div&gt;';
    } else if(prog.diploma){
      h+='&lt;div class="pt-ac-diploma" style="cursor:default"&gt;&lt;b&gt;? Диплом получен. Ты — выпускник Академии PANDO!&lt;/b&gt;&lt;/div&gt;';
    }
    view.innerHTML=h;
    view.querySelectorAll('.pt-ac-item').forEach(function(el){el.onclick=function(){openLesson(el.dataset.id);};});
    var dEl=document.getElementById('pt-ac-diploma');
    if(dEl)dEl.onclick=claimDiploma;
  }
  function renderView(){
    if(!view)return;
    if(!current){renderList();return;}
    var h='&lt;div class="pt-ac-view"&gt;'
      +'&lt;button class="pt-ac-back"&gt;← К списку уроков&lt;/button&gt;'
      +'&lt;div class="pt-ac-title"&gt;'+current.icon+' '+current.title+'&lt;/div&gt;'
      +'&lt;div class="pt-ac-text"&gt;'+current.text+'&lt;/div&gt;'
      +'&lt;div class="pt-ac-q"&gt;'+current.question+'&lt;/div&gt;';
    currentOpts.forEach(function(opt){
      var cls='pt-ac-opt';
      if(wrong===opt)cls+=' wrong';
      if(prog.passed[current.id]&amp;&amp;opt===current.answer)cls+=' right';
      h+='&lt;button class="'+cls+'" data-opt="'+opt.replace(/"/g,'&amp;quot;')+'"&gt;'+opt+'&lt;/button&gt;';
    });
    h+='&lt;/div&gt;';
    view.innerHTML=h;
    view.querySelector('.pt-ac-back').onclick=function(){current=null;renderList();};
    view.querySelectorAll('.pt-ac-opt').forEach(function(b){b.onclick=function(){pickOpt(b.dataset.opt);};});
  }
  setup();renderList();
})();
&lt;/script&gt;
&lt;script&gt;
(function(){
  var PT=window.PT,S=PT.state;
  if(!PT)return;
  function fmt(n){return new Intl.NumberFormat('ru-RU').format(Math.round(n));}
  function fmtShort(v){var a=Math.abs(v);if(a&gt;=1e6)return (v/1e6).toFixed(1)+'M';if(a&gt;=1e3)return (v/1e3).toFixed(1)+'K';return Math.round(v);}
  var css=`
  .pt-stat-kpis{display:grid;grid-template-columns:repeat(auto-fill,minmax(150px,1fr));gap:12px;margin-bottom:20px}
  .pt-stat-kpi{background:#121A26;border:1px solid rgba(160,180,220,.14);border-radius:12px;padding:14px;text-align:center}
  .pt-stat-kpi .lbl{font-size:.65rem;color:#8D99AC;text-transform:uppercase;letter-spacing:.1em;display:block;margin-bottom:6px}
  .pt-stat-kpi .val{font-family:'Unbounded';font-size:1.15rem;color:#3DDC84}
  .pt-stat-kpi.gold .val{color:#F5B301}
  .pt-stat-kpi.pink .val{color:#FF2E88}
  .pt-stat-kpi.blue .val{color:#7AB8FF}
  .pt-stat-panel{background:#121A26;border:1px solid rgba(160,180,220,.14);border-radius:14px;padding:18px;margin-bottom:18px}
  .pt-stat-panel h3{font-size:.9rem;color:#E7EDF5;margin-bottom:12px;font-weight:700}
  .pt-stat-catrow{display:flex;align-items:center;gap:10px;margin-bottom:8px}
  .pt-stat-catname{width:130px;font-size:.78rem;color:#8D99AC;flex:0 0 130px}
  .pt-stat-cattrack{flex:1;height:14px;background:#0e1520;border-radius:4px;overflow:hidden}
  .pt-stat-catfill{height:100%;background:linear-gradient(90deg,#3DDC84,#7AB8FF);border-radius:4px}
  .pt-stat-catval{width:80px;text-align:right;font-family:'JetBrains Mono',monospace;font-size:.75rem;color:#3DDC84;flex:0 0 80px}
  .pt-stat-clear{background:none;border:1px solid rgba(255,92,92,.4);color:#FF5C5C;border-radius:8px;padding:8px 14px;cursor:pointer;font-size:.78rem}
  .pt-stat-clear:hover{background:rgba(255,92,92,.1)}
  `;
  var styleEl=document.createElement('style');styleEl.textContent=css;document.head.appendChild(styleEl);
  var KEY='pt_stats_v1';
  var st={history:[],maxPdc:0};
  try{var raw=localStorage.getItem(KEY);if(raw)st=JSON.parse(raw);}catch(e){}
  function saveSt(){try{localStorage.setItem(KEY,JSON.stringify(st));}catch(e){}}
  function getPrestige(){try{var r=localStorage.getItem('pt_prestige_v1');if(r){var p=JSON.parse(r);return p.level||0;}}catch(e){}return 0;}
  function sample(){
    st.history.push({t:Date.now(),v:S.pdc});
    if(st.history.length&gt;300)st.history.shift();
    if(S.pdc&gt;st.maxPdc)st.maxPdc=S.pdc;
    saveSt();
  }
  setInterval(sample,5000);
  function drawChart(el,pts){
    if(!pts||pts.length&lt;2){el.innerHTML='&lt;div class="pt-empty"&gt;Пока мало данных. Поиграйте — график наполнится.&lt;/div&gt;';return;}
    var W=600,H=200,pad=34;
    var minV=Infinity,maxV=-Infinity;
    pts.forEach(function(p){if(p.v&lt;minV)minV=p.v;if(p.v&gt;maxV)maxV=p.v;});
    if(maxV===minV)maxV=minV+1;
    var n=pts.length;
    function x(i){return pad+(W-2*pad)*(n&gt;1?i/(n-1):0);}
    function y(v){return H-pad-(H-2*pad)*((v-minV)/(maxV-minV));}
    var d='';pts.forEach(function(p,i){d+=(i?'L':'M')+x(i).toFixed(1)+' '+y(p.v).toFixed(1)+' ';});
    var svg='&lt;svg viewBox="0 0 '+W+' '+H+'" style="width:100%;height:auto"&gt;';
    for(var g=0;g&lt;=4;g++){
      var gv=minV+(maxV-minV)*g/4,gy=y(gv);
      svg+='&lt;line x1="'+pad+'" y1="'+gy.toFixed(1)+'" x2="'+(W-pad)+'" y2="'+gy.toFixed(1)+'" stroke="rgba(160,180,220,.15)"/&gt;';
      svg+='&lt;text x="'+(pad-5)+'" y="'+(gy+3).toFixed(1)+'" font-size="9" fill="#8D99AC" text-anchor="end"&gt;'+fmtShort(gv)+'&lt;/text&gt;';
    }
    svg+='&lt;path d="'+d+'" fill="none" stroke="#3DDC84" stroke-width="2.5" stroke-linejoin="round"/&gt;';
    svg+='&lt;/svg&gt;';
    el.innerHTML=svg;
  }
  function drawCats(el){
    var cats={};
    S.assets.forEach(function(a){var d=a.income*a.count;cats[a.cat]=(cats[a.cat]||0)+d;});
    var keys=Object.keys(cats);
    if(!keys.length){el.innerHTML='&lt;div class="pt-empty"&gt;Активов пока нет.&lt;/div&gt;';return;}
    var max=0;keys.forEach(function(k){if(cats[k]&gt;max)max=cats[k];});
    var h='';
    keys.forEach(function(k){
      var pct=max&gt;0?Math.round(cats[k]/max*100):0;
      h+='&lt;div class="pt-stat-catrow"&gt;&lt;span class="pt-stat-catname"&gt;'+k+'&lt;/span&gt;&lt;div class="pt-stat-cattrack"&gt;&lt;div class="pt-stat-catfill" style="width:'+pct+'%"&gt;&lt;/div&gt;&lt;/div&gt;&lt;span class="pt-stat-catval"&gt;'+fmt(cats[k])+'&lt;/span&gt;&lt;/div&gt;';
    });
    el.innerHTML=h;
  }
  var sec,tab;
  function setup(){
    var nav=document.querySelector('.pt-nav'),main=document.querySelector('.pt-main');
    if(!nav||!main)return;
    tab=document.createElement('button');tab.className='pt-tab';tab.dataset.t='stats';
    tab.innerHTML='&amp;#128200; Статистика';
    nav.appendChild(tab);
    sec=document.createElement('section');sec.className='pt-sec';sec.id='pt-stats';
    sec.innerHTML='&lt;div class="pt-sec-head"&gt;&lt;h2&gt;Статистика&lt;/h2&gt;&lt;button class="pt-stat-clear" id="pt-stat-clear"&gt;Очистить график&lt;/button&gt;&lt;/div&gt;'
      +'&lt;div class="pt-stat-kpis" id="pt-stat-kpis"&gt;&lt;/div&gt;'
      +'&lt;div class="pt-stat-panel"&gt;&lt;h3&gt;Динамика баланса PDC&lt;/h3&gt;&lt;div id="pt-stat-chart"&gt;&lt;/div&gt;&lt;/div&gt;'
      +'&lt;div class="pt-stat-panel"&gt;&lt;h3&gt;Доход по категориям активов&lt;/h3&gt;&lt;div id="pt-stat-cats"&gt;&lt;/div&gt;&lt;/div&gt;';
    main.appendChild(sec);
    tab.onclick=function(){
      document.querySelectorAll('.pt-tab').forEach(function(x){x.classList.remove('act');});
      document.querySelectorAll('.pt-sec').forEach(function(x){x.classList.remove('act');});
      tab.classList.add('act');sec.classList.add('act');
      renderStats();
    };
    var clr=document.getElementById('pt-stat-clear');
    if(clr)clr.onclick=function(){st.history=[];st.maxPdc=0;saveSt();renderStats();};
  }
  function renderStats(){
    var k=document.getElementById('pt-stat-kpis');if(!k)return;
    var income=S.assets.reduce(function(r,a){return r+a.income*a.count;},0);
    var totalAssets=S.assets.reduce(function(n,a){return n+a.count;},0);
    var pl=getPrestige();
    k.innerHTML=
      '&lt;div class="pt-stat-kpi"&gt;&lt;span class="lbl"&gt;Баланс&lt;/span&gt;&lt;span class="val"&gt;'+fmt(S.pdc)+'&lt;/span&gt;&lt;/div&gt;'+
      '&lt;div class="pt-stat-kpi gold"&gt;&lt;span class="lbl"&gt;Всего заработано&lt;/span&gt;&lt;span class="val"&gt;'+fmt(S.totalEarned)+'&lt;/span&gt;&lt;/div&gt;'+
      '&lt;div class="pt-stat-kpi"&gt;&lt;span class="lbl"&gt;Доход / цикл&lt;/span&gt;&lt;span class="val"&gt;'+fmt(income)+'&lt;/span&gt;&lt;/div&gt;'+
      '&lt;div class="pt-stat-kpi blue"&gt;&lt;span class="lbl"&gt;Активов&lt;/span&gt;&lt;span class="val"&gt;'+totalAssets+'&lt;/span&gt;&lt;/div&gt;'+
      '&lt;div class="pt-stat-kpi blue"&gt;&lt;span class="lbl"&gt;Блоков&lt;/span&gt;&lt;span class="val"&gt;'+S.blocks.length+'&lt;/span&gt;&lt;/div&gt;'+
      '&lt;div class="pt-stat-kpi blue"&gt;&lt;span class="lbl"&gt;Транзакций&lt;/span&gt;&lt;span class="val"&gt;'+S.txs.length+'&lt;/span&gt;&lt;/div&gt;'+
      '&lt;div class="pt-stat-kpi pink"&gt;&lt;span class="lbl"&gt;Уровень&lt;/span&gt;&lt;span class="val"&gt;'+S.level+'&lt;/span&gt;&lt;/div&gt;'+
      '&lt;div class="pt-stat-kpi pink"&gt;&lt;span class="lbl"&gt;Престиж&lt;/span&gt;&lt;span class="val"&gt;×'+(1+pl*0.5).toFixed(1)+'&lt;/span&gt;&lt;/div&gt;'+
      '&lt;div class="pt-stat-kpi gold"&gt;&lt;span class="lbl"&gt;Рекорд баланса&lt;/span&gt;&lt;span class="val"&gt;'+fmt(st.maxPdc)+'&lt;/span&gt;&lt;/div&gt;';
    drawChart(document.getElementById('pt-stat-chart'),st.history.slice(-80));
    drawCats(document.getElementById('pt-stat-cats'));
  }
  setup();renderStats();
})();
&lt;/script&gt;
&lt;script&gt;
(function(){
  var PT=window.PT;
  if(!PT)return;
  var KEYS=['pt_state_v1','pt_contracts_v1','pt_corp_v1','pt_achv_v1','pt_prestige_v1','pt_daily_v1','pt_academy_v1','pt_stats_v1','pt_theme','pt_sound'];
  var css=`
  .pt-data-box{max-width:620px;background:#121A26;border:1px solid rgba(160,180,220,.14);border-radius:14px;padding:22px;display:flex;flex-direction:column;gap:12px}
  .pt-data-btn{background:#0e1520;border:1px solid rgba(160,180,220,.25);color:#E7EDF5;border-radius:8px;padding:12px 16px;cursor:pointer;font-size:.88rem;text-align:left;transition:.15s}
  .pt-data-btn:hover{border-color:#3DDC84;background:#1a1630}
  .pt-data-btn.acc{border-color:#3DDC84;color:#3DDC84}
  .pt-data-btn.warn{border-color:#FF5C5C;color:#FF5C5C}
  .pt-data-ta{width:100%;height:120px;background:#0e1520;border:1px solid rgba(160,180,220,.25);color:#E7EDF5;border-radius:8px;padding:10px;font-family:'JetBrains Mono',monospace;font-size:.72rem;resize:vertical}
  .pt-data-sep{border:none;border-top:1px solid rgba(160,180,220,.14);margin:6px 0}
  .pt-data-note{font-size:.72rem;color:#8D99AC}
  `;
  var styleEl=document.createElement('style');styleEl.textContent=css;document.head.appendChild(styleEl);
  function toastD(msg,isErr){
    var old=document.querySelector('.pt-toast');if(old)old.remove();
    var t=document.createElement('div');t.className='pt-toast'+(isErr?' err':'');t.textContent=msg;
    document.body.appendChild(t);setTimeout(function(){t.remove();},3200);
  }
  function collect(){
    var d={_pandoSave:1,version:1,date:new Date().toISOString()};
    KEYS.forEach(function(k){try{var v=localStorage.getItem(k);if(v!==null)d[k]=JSON.parse(v);}catch(e){}});
    return d;
  }
  function exportFile(){
    var d=collect();
    var blob=new Blob([JSON.stringify(d,null,2)],{type:'application/json'});
    var url=URL.createObjectURL(blob);
    var a=document.createElement('a');a.href=url;a.download='pando-tycoon-save-'+Date.now()+'.json';
    document.body.appendChild(a);a.click();a.remove();
    setTimeout(function(){URL.revokeObjectURL(url);},1000);
    toastD('? Сохранение скачано');
  }
  function importData(d){
    if(!d||!d._pandoSave){toastD('Неверный формат сохранения',true);return;}
    KEYS.forEach(function(k){if(d[k]!==undefined){try{localStorage.setItem(k,JSON.stringify(d[k]));}catch(e){}}});
    toastD('✅ Сохранение загружено. Перезагрузка...');
    setTimeout(function(){location.reload();},900);
  }
  function fallbackShow(s){
    var ta=document.getElementById('pt-data-ta');
    if(ta){ta.value=s;toastD('Текст сохранения в поле ниже — скопируйте вручную');}
  }
  function copyToClipboard(){
    var s=JSON.stringify(collect());
    if(navigator.clipboard&amp;&amp;navigator.clipboard.writeText){
      navigator.clipboard.writeText(s).then(function(){toastD('? Скопировано в буфер');},function(){fallbackShow(s);});
    }else{fallbackShow(s);}
  }
  function pasteFromClipboard(){
    if(navigator.clipboard&amp;&amp;navigator.clipboard.readText){
      navigator.clipboard.readText().then(function(s){
        var ta=document.getElementById('pt-data-ta');if(ta)ta.value=s;
        toastD('? Вставлено из буфера. Нажмите «Импортировать из текста»');
      },function(){toastD('Нет доступа к буферу — вставьте вручную',true);});
    }else{toastD('Нет доступа к буферу — вставьте вручную',true);}
  }
  function importFromText(){
    var ta=document.getElementById('pt-data-ta');
    if(!ta||!ta.value.trim()){toastD('Вставьте код сохранения в поле',true);return;}
    try{importData(JSON.parse(ta.value));}catch(e){toastD('Ошибка: неверный JSON',true);}
  }
  function fullReset(){
    if(!confirm('Полностью сбросить ВСЮ игру? Это удалит всё безвозвратно.'))return;
    KEYS.forEach(function(k){try{localStorage.removeItem(k);}catch(e){}});
    location.reload();
  }
  var sec,tab;
  function setup(){
    var nav=document.querySelector('.pt-nav'),main=document.querySelector('.pt-main');
    if(!nav||!main)return;
    tab=document.createElement('button');tab.className='pt-tab';tab.dataset.t='data';
    tab.innerHTML='&amp;#128190; Данные';
    nav.appendChild(tab);
    sec=document.createElement('section');sec.className='pt-sec';sec.id='pt-data';
    sec.innerHTML='&lt;div class="pt-sec-head"&gt;&lt;h2&gt;Сохранение&lt;/h2&gt;&lt;/div&gt;'
      +'&lt;p class="pt-note"&gt;Экспортируйте игру в файл или буфер, чтобы не потерять прогресс. Импортируйте на этом или другом устройстве.&lt;/p&gt;'
      +'&lt;div class="pt-data-box"&gt;'
      +'&lt;button class="pt-data-btn acc" id="pt-data-export"&gt;? Экспорт в файл (скачать)&lt;/button&gt;'
      +'&lt;button class="pt-data-btn" id="pt-data-copy"&gt;? Копировать в буфер обмена&lt;/button&gt;'
      +'&lt;hr class="pt-data-sep"&gt;'
      +'&lt;button class="pt-data-btn" id="pt-data-paste"&gt;? Вставить из буфера в поле&lt;/button&gt;'
      +'&lt;textarea class="pt-data-ta" id="pt-data-ta" placeholder="Вставьте сюда код сохранения (JSON)…"&gt;&lt;/textarea&gt;'
      +'&lt;button class="pt-data-btn acc" id="pt-data-import"&gt;✅ Импортировать из текста&lt;/button&gt;'
      +'&lt;button class="pt-data-btn" id="pt-data-file"&gt;? Импортировать из файла…&lt;/button&gt;'
      +'&lt;input type="file" id="pt-data-fileinput" accept=".json,application/json" style="display:none"&gt;'
      +'&lt;hr class="pt-data-sep"&gt;'
      +'&lt;button class="pt-data-btn warn" id="pt-data-reset"&gt;?️ Полный сброс игры&lt;/button&gt;'
      +'&lt;span class="pt-data-note"&gt;Экспорт включает: империю, реестр, контракты, корпорации, достижения, престиж, цели, академию, статистику, тему и звук.&lt;/span&gt;'
      +'&lt;/div&gt;';
    main.appendChild(sec);
    tab.onclick=function(){
      document.querySelectorAll('.pt-tab').forEach(function(x){x.classList.remove('act');});
      document.querySelectorAll('.pt-sec').forEach(function(x){x.classList.remove('act');});
      tab.classList.add('act');sec.classList.add('act');
    };
    document.getElementById('pt-data-export').onclick=exportFile;
    document.getElementById('pt-data-copy').onclick=copyToClipboard;
    document.getElementById('pt-data-paste').onclick=pasteFromClipboard;
    document.getElementById('pt-data-import').onclick=importFromText;
    document.getElementById('pt-data-reset').onclick=fullReset;
    var fi=document.getElementById('pt-data-fileinput');
    document.getElementById('pt-data-file').onclick=function(){fi.click();};
    fi.onchange=function(){
      var f=fi.files[0];if(!f)return;
      var r=new FileReader();
      r.onload=function(){try{importData(JSON.parse(r.result));}catch(e){toastD('Ошибка: неверный файл',true);}};
      r.readAsText(f);
      fi.value='';
    };
  }
  setup();
})();
&lt;/script&gt;</subtitle>
  <updated>2026-08-19T16:16:38Z</updated>
  <logo>https://pandoraburo.ru/ssl/u/pic/f1/ddc6349a4311f19817f9045e951988/-/logo.png</logo>
  <author>
    <name>1592962</name>
    <uri>https://www.pandoraburo.ru/</uri>
  </author>
</feed>
