{"id":1095,"date":"2026-03-13T21:56:17","date_gmt":"2026-03-13T21:56:17","guid":{"rendered":"https:\/\/cortexorigin.com\/?page_id=1095"},"modified":"2026-03-25T10:07:06","modified_gmt":"2026-03-25T10:07:06","slug":"test","status":"publish","type":"page","link":"https:\/\/cortexorigin.com\/index.php\/test\/","title":{"rendered":""},"content":{"rendered":"\n\n\n<!DOCTYPE html>\n<html lang=\"fr\">\n<head>\n<meta charset=\"UTF-8\">\n<meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n<title>Menu Cortex ORIGIN\u2122<\/title>\n<style>\n@import url('https:\/\/fonts.googleapis.com\/css2?family=DM+Sans:wght@400;500;600;700&family=JetBrains+Mono:wght@400;500&display=swap');\n \nbody { margin: 0; padding: 0; background: #F4F0EB; font-family: 'DM Sans', sans-serif; }\n \n.menu-bar {\n  width: 100%;\n  background: #0C1829;\n  padding: 0 2rem;\n  display: flex;\n  align-items: center;\n  justify-content: space-between;\n  position: relative;\n  z-index: 100;\n  box-sizing: border-box;\n}\n.menu-logo {\n  font-family: 'DM Sans', sans-serif; font-weight: 700; font-size: 0.95rem;\n  color: #fff; padding: 1rem 0; letter-spacing: 0.03em; white-space: nowrap;\n}\n.menu-logo span { color: #C9A96E; }\n.menu-items { display: flex; align-items: center; gap: 0; }\n \n\/* \u2500\u2500 AETZU ARROW AI BUTTON \u2500\u2500 *\/\n.menu-aetzu {\n  display: flex; align-items: center;\n  padding: 0.45rem 1rem;\n  margin-right: 0.5rem;\n  background: rgba(201,169,110,0.12);\n  border: 1px solid rgba(201,169,110,0.35);\n  border-radius: 3px;\n  font-family: 'JetBrains Mono', monospace;\n  font-size: 0.65rem; font-weight: 500;\n  letter-spacing: 0.08em; text-transform: uppercase;\n  color: #C9A96E;\n  text-decoration: none;\n  transition: all 0.25s;\n  white-space: nowrap;\n  gap: 0.5rem;\n}\n.menu-aetzu::before {\n  content: '\u2b21';\n  font-size: 0.75rem;\n  opacity: 0.7;\n}\n.menu-aetzu:hover {\n  background: rgba(201,169,110,0.25);\n  border-color: rgba(201,169,110,0.6);\n  color: #fff;\n}\n \n\/* \u2500\u2500 BENCHMARK BUTTON \u2500\u2500 *\/\n.menu-benchmark {\n  display: flex; align-items: center;\n  padding: 0.45rem 1rem;\n  margin-right: 0.5rem;\n  background: rgba(74,144,217,0.10);\n  border: 1px solid rgba(74,144,217,0.30);\n  border-radius: 3px;\n  font-family: 'JetBrains Mono', monospace;\n  font-size: 0.65rem; font-weight: 500;\n  letter-spacing: 0.08em; text-transform: uppercase;\n  color: rgba(184,212,240,0.85);\n  text-decoration: none;\n  transition: all 0.25s;\n  white-space: nowrap;\n  gap: 0.5rem;\n}\n.menu-benchmark::before {\n  content: '\u25c8';\n  font-size: 0.7rem;\n  opacity: 0.65;\n}\n.menu-benchmark:hover {\n  background: rgba(74,144,217,0.22);\n  border-color: rgba(74,144,217,0.55);\n  color: #fff;\n}\n \n.menu-item {\n  position: relative; padding: 1rem 1rem;\n  font-size: 0.78rem; font-weight: 500; color: rgba(184,212,240,0.75);\n  cursor: pointer; letter-spacing: 0.02em; transition: color 0.2s;\n  white-space: nowrap;\n}\n.menu-item:hover { color: #fff; }\n.menu-item::after {\n  content: '\u25be'; margin-left: 0.3rem; font-size: 0.6rem; opacity: 0.5;\n}\n.menu-item.no-drop::after { content: ''; }\n.menu-cta {\n  font-family: 'JetBrains Mono', monospace; font-size: 0.65rem; font-weight: 500;\n  letter-spacing: 0.08em; text-transform: uppercase;\n  padding: 0.5rem 1.2rem; border-radius: 2px;\n  background: rgba(201,169,110,0.15); color: #C9A96E; border: 1px solid rgba(201,169,110,0.3);\n  cursor: pointer; transition: all 0.3s; white-space: nowrap;\n}\n.menu-cta:hover { background: rgba(201,169,110,0.25); color: #fff; }\n \n.menu-dropdown {\n  display: none; position: absolute; top: 100%; left: 0;\n  background: #0C1829; border: 1px solid rgba(74,144,217,0.15);\n  border-top: 2px solid #C9A96E; border-radius: 0 0 4px 4px;\n  min-width: 320px; padding: 0.8rem 0; z-index: 200;\n  box-shadow: 0 12px 40px rgba(0,0,0,0.4);\n}\n.menu-item:hover .menu-dropdown { display: block; }\n.menu-dropdown a {\n  display: block; padding: 0.5rem 1.5rem; font-size: 0.8rem; color: rgba(184,212,240,0.6);\n  text-decoration: none; transition: all 0.2s; line-height: 1.5;\n}\n.menu-dropdown a:hover { color: #fff; background: rgba(74,144,217,0.08); }\n.menu-dropdown .drop-label {\n  font-family: 'JetBrains Mono', monospace; font-size: 0.58rem; font-weight: 600;\n  letter-spacing: 0.15em; color: #C9A96E; text-transform: uppercase;\n  padding: 0.6rem 1.5rem 0.3rem; display: block;\n}\n.menu-dropdown .drop-sep {\n  border: none; border-top: 1px solid rgba(74,144,217,0.08);\n  margin: 0.5rem 1.5rem;\n}\n \n.menu-dropdown a.drop-highlight {\n  display: flex; align-items: center; justify-content: space-between;\n  margin: 0.4rem 0.8rem 0.2rem;\n  padding: 0.55rem 1rem;\n  background: rgba(201,169,110,0.08);\n  border: 1px solid rgba(201,169,110,0.2);\n  border-radius: 3px;\n  color: #C9A96E;\n  font-weight: 600; font-size: 0.78rem;\n  transition: all 0.2s;\n}\n.menu-dropdown a.drop-highlight:hover {\n  background: rgba(201,169,110,0.18); color: #fff; border-color: rgba(201,169,110,0.45);\n}\n.drop-highlight-arrow { font-size: 0.65rem; opacity: 0.6; margin-left: 8px; }\n \n.menu-dropdown a.drop-sim {\n  display: flex; align-items: center; justify-content: space-between;\n  margin: 0.25rem 0.8rem;\n  padding: 0.5rem 1rem;\n  background: rgba(74,144,217,0.06);\n  border: 1px solid rgba(74,144,217,0.18);\n  border-radius: 3px;\n  color: rgba(184,212,240,0.85);\n  font-size: 0.78rem;\n  transition: all 0.2s;\n}\n.menu-dropdown a.drop-sim:hover {\n  background: rgba(74,144,217,0.14); color: #fff; border-color: rgba(74,144,217,0.4);\n}\n.drop-sim-icon { font-size: 0.7rem; opacity: 0.55; margin-left: 8px; }\n \n.mega-dropdown {\n  display: none; position: absolute; top: 100%; left: -100px;\n  background: #0C1829; border: 1px solid rgba(74,144,217,0.15);\n  border-top: 2px solid #C9A96E; border-radius: 0 0 4px 4px;\n  width: 640px; padding: 1.5rem; z-index: 200;\n  box-shadow: 0 12px 40px rgba(0,0,0,0.4);\n}\n.menu-item:hover .mega-dropdown { display: block; }\n.mega-cols { display: grid; grid-template-columns: 1fr 1fr; gap: 0 2rem; }\n.mega-col .drop-label { padding: 0 0 0.3rem; }\n.mega-col a {\n  display: block; padding: 0.35rem 0; font-size: 0.78rem; color: rgba(184,212,240,0.6);\n  text-decoration: none; transition: color 0.2s;\n}\n.mega-col a:hover { color: #fff; }\n.mega-col a.drop-highlight {\n  margin: 0.5rem 0 0.2rem; padding: 0.5rem 0.8rem;\n  background: rgba(201,169,110,0.08); border: 1px solid rgba(201,169,110,0.2);\n  border-radius: 3px; color: #C9A96E; font-weight: 600;\n  display: flex; align-items: center; justify-content: space-between;\n}\n.mega-col a.drop-highlight:hover {\n  background: rgba(201,169,110,0.18); color: #fff; border-color: rgba(201,169,110,0.45);\n}\n<\/style>\n<\/head>\n<body>\n \n<div class=\"menu-bar\">\n  <div class=\"menu-logo\">CORTEX <span>ORIGIN\u2122<\/span><\/div>\n  <div class=\"menu-items\">\n \n    <!-- AETZU ARROW AI -->\n    <a href=\"https:\/\/cortexorigin.com\/index.php\/aetzu-arrow-ai\/\" class=\"menu-aetzu\">\n      AETZU ARROW AI\u2122\n    <\/a>\n \n    <!-- BENCHMARK -->\n    <a href=\"https:\/\/cortexorigin.com\/index.php\/mttd-benchmark-v2-0-aetzu-arrow-ai\/\" class=\"menu-benchmark\">\n      Benchmark\n    <\/a>\n \n    <!-- 1. ARCHITECTURE -->\n    <div class=\"menu-item\">\n      Architecture\n      <div class=\"mega-dropdown\">\n        <div class=\"mega-cols\">\n          <div class=\"mega-col\">\n            <span class=\"drop-label\">Socle critique (TCB)<\/span>\n            <a href=\"https:\/\/cortexorigin.com\/index.php\/larchitecture-cortex-origin\/\">CORTEX ORIGIN\u2122 \u2014 Vue d&rsquo;ensemble<\/a>\n            <a href=\"https:\/\/cortexorigin.com\/index.php\/cortex-core\/\">Cortex Core\u2122<\/a>\n            <a href=\"https:\/\/cortexorigin.com\/index.php\/omega-gouvernance-decisionnelle\/\">OMEGA\u2122 \u2014 Gouvernance<\/a>\n            <a href=\"https:\/\/cortexorigin.com\/index.php\/180-2\/\">PRISM\u2122 \u2014 Preuve<\/a>\n            <a href=\"https:\/\/cortexorigin.com\/index.php\/cortex-aegis\/\">AEGIS\u2122 \u2014 Ex\u00e9cution<\/a>\n            <a href=\"https:\/\/cortexorigin.com\/index.php\/cortex-fulcrum\/\">FULCRUM\u2122<\/a>\n            <hr class=\"drop-sep\" style=\"margin:0.5rem 0\">\n            <span class=\"drop-label\" style=\"padding:0.4rem 0 0.3rem\">S\u00e9curit\u00e9 &amp; Confinement<\/span>\n            <a href=\"https:\/\/cortexorigin.com\/index.php\/2026\/01\/02\/sentinel-securite-active-et-gouvernance-des-signaux\/\">SENTINEL\u2122 \u2014 S\u00e9curit\u00e9 active<\/a>\n            <a href=\"https:\/\/cortexorigin.com\/index.php\/wall-dome-les-4-formules-de-confinement-et-gouvernance-runtime\/\">WALL-DOME\u2122 \u2014 Confinement<\/a>\n            <a href=\"https:\/\/cortexorigin.com\/index.php\/cortex-cerbere\/\">CERB\u00c8RE\u2122<\/a>\n            <a href=\"https:\/\/cortexorigin.com\/index.php\/cortex-cerbere-decision-guard\/\">Decision Guard\u2122<\/a>\n            <a href=\"https:\/\/cortexorigin.com\/index.php\/1241-2\/\" class=\"drop-highlight\">\n              CMS CORTEX MORPHIC SHIELD\u2122\n              <span class=\"drop-highlight-arrow\">\u2197<\/span>\n            <\/a>\n          <\/div>\n          <div class=\"mega-col\">\n            <span class=\"drop-label\">Interface &amp; Orchestration<\/span>\n            <a href=\"https:\/\/cortexorigin.com\/index.php\/2026\/01\/02\/ava-cpl\/\">AVA\u2122 &amp; CPL\u2122 \u2014 Interface<\/a>\n            <a href=\"https:\/\/cortexorigin.com\/index.php\/multi-lcm-trm-engine-orchestration-gouvernee-multi-modeles-ia\/\">Multi LCM \/ TRM Engine\u2122<\/a>\n            <a href=\"https:\/\/cortexorigin.com\/index.php\/trm-contrain-nano\/\">TRM Contrain Nano\u2122<\/a>\n            <a href=\"https:\/\/cortexorigin.com\/index.php\/cortex-ecoflux\/\">EcoFlux\u2122 \u2014 Frugalit\u00e9<\/a>\n            <a href=\"https:\/\/cortexorigin.com\/index.php\/morph-gates\/\">MORPH GATES\u2122 \u2014 CI\/CD<\/a>\n            <hr class=\"drop-sep\" style=\"margin:0.5rem 0\">\n            <span class=\"drop-label\" style=\"padding:0.4rem 0 0.3rem\">Capacit\u00e9s avanc\u00e9es<\/span>\n            <a href=\"https:\/\/cortexorigin.com\/index.php\/cortex-quantum-ready\/\">Quantum-Ready\u2122<\/a>\n            <a href=\"https:\/\/cortexorigin.com\/index.php\/cortex-cyber-orion-3\/\">CYBER-ORION\u2122<\/a>\n            <a href=\"https:\/\/cortexorigin.com\/index.php\/cortex-labcode\/\">LabCode\u2122<\/a>\n            <a href=\"https:\/\/cortexorigin.com\/index.php\/cortex-chameleon\/\">CHAMELEON\u2122<\/a>\n            <a href=\"https:\/\/cortexorigin.com\/index.php\/cortex-mirror-lab\/\">MIRROR LAB\u2122<\/a>\n          <\/div>\n        <\/div>\n      <\/div>\n    <\/div>\n \n    <!-- 2. APPLICATIONS -->\n    <div class=\"menu-item\">\n      Applications\n      <div class=\"menu-dropdown\">\n        <span class=\"drop-label\">Verticales technologiques<\/span>\n        <a href=\"https:\/\/cortexorigin.com\/index.php\/imcortex-2\/\">IMCORTEX\u2122 \u0394IMC \u2014 Architecture cognitive<\/a>\n        <a href=\"https:\/\/cortexorigin.com\/index.php\/space-ai-autonomie-gouvernee\/\">Space AI \u2014 Autonomie gouvern\u00e9e<\/a>\n        <a href=\"https:\/\/cortexorigin.com\/index.php\/quantum-assurance-architecture-quantum-ready\/\">Quantum Assurance<\/a>\n        <a href=\"https:\/\/cortexorigin.com\/index.php\/wall-dome-drones-systemes-autonomes\/\">Drones &amp; Syst\u00e8mes autonomes<\/a>\n        <hr class=\"drop-sep\">\n        <span class=\"drop-label\">IAG par secteur<\/span>\n        <a href=\"https:\/\/cortexorigin.com\/index.php\/cortex-origin-iag-pour-la-banque-la-finance-les-oiv\/\">Banque, Finance &amp; OIV<\/a>\n        <a href=\"https:\/\/cortexorigin.com\/index.php\/cortex-origin-iag-pour-la-defense-la-securite-le-cyber\/\">D\u00e9fense &amp; Cybers\u00e9curit\u00e9<\/a>\n        <a href=\"https:\/\/cortexorigin.com\/index.php\/cortex-origin-iag-pour-letat-le-regalien\/\">\u00c9tat &amp; R\u00e9galien<\/a>\n        <a href=\"https:\/\/cortexorigin.com\/index.php\/592-2\/\">Tous les secteurs<\/a>\n      <\/div>\n    <\/div>\n \n    <!-- 3. V\u00c9RIFICATION -->\n    <div class=\"menu-item\">\n      V\u00e9rification\n      <div class=\"menu-dropdown\">\n        <span class=\"drop-label\">CFVL \u2014 Laboratoire formel<\/span>\n        <a href=\"https:\/\/cortexorigin.com\/index.php\/689-2\/\">CFVL \u2014 Page principale<\/a>\n        <a href=\"https:\/\/cortexorigin.com\/index.php\/841-2\/\">Journal R&amp;D<\/a>\n        <a href=\"https:\/\/cortexorigin.com\/index.php\/833-2\/\">Publications &amp; \u00e9valuations<\/a>\n        <a href=\"https:\/\/cortexorigin.com\/index.php\/827-2\/\">M\u00e9thodologie<\/a>\n        <hr class=\"drop-sep\">\n        <span class=\"drop-label\">Recherche<\/span>\n        <a href=\"https:\/\/cortexorigin.com\/index.php\/604-2\/\">Cortex AGI Exp\u00e9rimental<\/a>\n        <a href=\"https:\/\/cortexorigin.com\/index.php\/cortex-origin-2\/\">MVP CORTEX\u2122<\/a>\n        <a href=\"https:\/\/cortexorigin.com\/index.php\/814-2\/\">IA expliqu\u00e9e simplement<\/a>\n      <\/div>\n    <\/div>\n \n    <!-- 4. SECTEURS -->\n    <div class=\"menu-item\">\n      Secteurs\n      <div class=\"menu-dropdown\">\n        <span class=\"drop-label\">Audiences<\/span>\n        <a href=\"https:\/\/cortexorigin.com\/index.php\/investisseurs-partenaires\/\">Investisseurs &amp; partenaires<\/a>\n        <a href=\"https:\/\/cortexorigin.com\/index.php\/industriels-integrateurs\/\">Industriels &amp; int\u00e9grateurs<\/a>\n        <a href=\"https:\/\/cortexorigin.com\/index.php\/decideurs-publics-autorites\/\">D\u00e9cideurs publics &amp; autorit\u00e9s<\/a>\n        <hr class=\"drop-sep\">\n        <span class=\"drop-label\">Packs Applications (paC)<\/span>\n        <a href=\"https:\/\/cortexorigin.com\/index.php\/cortex-origin-iag-pour-la-banque-la-finance-les-oiv\/\">Finance &amp; Banque<\/a>\n        <a href=\"https:\/\/cortexorigin.com\/index.php\/cortex-origin-iag-pour-la-defense-la-securite-le-cyber\/\">D\u00e9fense &amp; Cyber<\/a>\n        <a href=\"https:\/\/cortexorigin.com\/index.php\/cortex-origin-iag-pour-letat-le-regalien\/\">\u00c9tat &amp; R\u00e9galien<\/a>\n      <\/div>\n    <\/div>\n \n    <!-- 5. CFVL -->\n    <div class=\"menu-item\">\n      CFVL\n      <div class=\"menu-dropdown\" style=\"min-width:300px\">\n        <span class=\"drop-label\">Programme de certification<\/span>\n        <a href=\"https:\/\/cortexorigin.com\/index.php\/689-2\/\">CFVL \u2014 Page principale<\/a>\n        <a href=\"https:\/\/cortexorigin.com\/index.php\/841-2\/\">Journal R&amp;D<\/a>\n        <a href=\"https:\/\/cortexorigin.com\/index.php\/833-2\/\">Publications<\/a>\n        <a href=\"https:\/\/cortexorigin.com\/index.php\/rapport-mttd-mttb\/\">Rapport MTTD \/ MTTB<\/a>\n        <hr class=\"drop-sep\">\n        <span class=\"drop-label\">Simulations interactives<\/span>\n        <a href=\"https:\/\/cortexorigin.com\/index.php\/test\/\" class=\"drop-sim\">\n          Simulations Attaque\n          <span class=\"drop-sim-icon\">\u26a1<\/span>\n        <\/a>\n        <a href=\"https:\/\/cortexorigin.com\/index.php\/simulation\/\" class=\"drop-sim\">\n          Sch\u00e9ma &amp; Simulations\n          <span class=\"drop-sim-icon\">\u25ce<\/span>\n        <\/a>\n        <hr class=\"drop-sep\">\n        <a href=\"https:\/\/cortexorigin.com\/index.php\/mttd-benchmark-v2-0-aetzu-arrow-ai\/\" class=\"drop-highlight\">\n          MTTD Benchmark v2.0\n          <span class=\"drop-highlight-arrow\">\u2197<\/span>\n        <\/a>\n        <a href=\"https:\/\/cortexorigin.com\/index.php\/1043-2\/\" class=\"drop-highlight\">\n          Evaluation Dashboard\n          <span class=\"drop-highlight-arrow\">\u2197<\/span>\n        <\/a>\n      <\/div>\n    <\/div>\n \n    <!-- CTA -->\n    <a href=\"mailto:press@cortexorigin.com\" style=\"text-decoration:none\">\n      <div class=\"menu-cta\">Contact<\/div>\n    <\/a>\n \n  <\/div>\n<\/div>\n \n<\/body>\n<\/html>\n\n\n\n\n\n<!DOCTYPE html>\n<html lang=\"fr\">\n<head>\n<meta charset=\"UTF-8\">\n<meta name=\"viewport\" content=\"width=device-width,initial-scale=1\">\n<title>CORTEX ORIGIN\u2122 \u2014 Solar Defense v3.1 + CMS MORPHIC SHIELD\u2122<\/title>\n<style>\n \n\/* \u2550\u2550 WORDPRESS OVERRIDES \u2550\u2550 *\/\n.entry-title, h1.entry-title, h1.page-title, .page-title,\n.wp-block-post-title, .post-title, h1 {\n  background: transparent !important;\n  background-color: transparent !important;\n  color: #00e5ff !important;\n  font-family: 'JetBrains Mono', monospace !important;\n  font-size: 1rem !important;\n  letter-spacing: .2em !important;\n  text-transform: uppercase !important;\n  opacity: .5 !important;\n  padding: 0 !important;\n  margin: 0 !important;\n}\n.site-header, .wp-site-identity, .site-title, .site-title a,\n.wp-block-site-title, header, .header, .site-branding {\n  background: transparent !important;\n  background-color: transparent !important;\n  color: #C9A96E !important;\n}\n.entry-header, .page-header, .wp-block-post-content,\narticle, .entry, .post, .page {\n  background: transparent !important;\n  background-color: transparent !important;\n  padding: 0 !important;\n  margin: 0 !important;\n}\n\/* Force page background dark *\/\nhtml, body, #page, #content, #primary, #main,\n.site, .site-content, main[id], main[class] {\n  background: #0c1527 !important;\n  background-color: #0c1527 !important;\n}\n \n*{box-sizing:border-box;margin:0;padding:0}\n:root{\n  --bg:#0c1527;--bg2:#111f38;--bg3:#162140;\n  --cyan:#00e5ff;--cyan2:#00bcd4;\n  --green:#00ff88;--green2:#10b981;\n  --orange:#D97706;--gold:#f59e0b;\n  --purple:#7c3aed;--purple2:#c8a0ff;\n  --red:#ef4444;--red2:#dc2626;\n  --tcb:#818cf8;--tcb2:#4f46e5;\n  --gray:#4a5568;--gray2:#6b7280;--gray3:#9ca3af;\n  --mono:'JetBrains Mono',monospace;\n}\nbody{background:#0c1527!important;font-family:var(--mono);color:#e2e8f0;-webkit-font-smoothing:antialiased;overflow-x:hidden}\n@keyframes blink{0%,100%{opacity:1}50%{opacity:.15}}\n@keyframes fadein{from{opacity:0;transform:translateX(-4px)}to{opacity:1}}\n@keyframes pulse-ring{0%{transform:scale(1);opacity:.6}100%{transform:scale(2.2);opacity:0}}\n \n\/* \u2550\u2550\u2550 SOLAR PANEL \u2550\u2550\u2550 *\/\n#panel-solar{background:#0c1527!important;padding:.8rem .8rem .4rem}\n.sol-hdr{max-width:1100px;margin:0 auto .5rem;display:flex;justify-content:space-between;align-items:center;flex-wrap:wrap;gap:.4rem}\n.sol-hdr-title{font-size:.56rem;letter-spacing:.2em;color:#6b7280;text-transform:uppercase}\n.sol-hdr-sub{font-size:.42rem;color:#4a5568;margin-top:1px}\n.dot{width:6px;height:6px;border-radius:50%;flex-shrink:0}\n.sol-modes{display:flex;gap:.35rem;flex-wrap:wrap;justify-content:center;margin-bottom:.5rem}\n.mbtn{font-family:var(--mono);font-size:.42rem;padding:.22rem .5rem;border-radius:3px;cursor:pointer;letter-spacing:.04em;border:1px solid;background:transparent;transition:all .2s}\n.mbtn-n{border-color:#D97706;color:#D97706}.mbtn-n.active{background:#D97706;color:#000;box-shadow:0 0 8px rgba(217,119,6,.5)}\n.mbtn-z{border-color:var(--red);color:var(--red)}.mbtn-z.active{background:var(--red);color:#fff;box-shadow:0 0 8px rgba(239,68,68,.5)}\n.mbtn-e{border-color:var(--green2);color:var(--green2)}.mbtn-e.active{background:var(--green2);color:#000;box-shadow:0 0 8px rgba(16,185,129,.5)}\n.mbtn-h{border-color:var(--tcb);color:var(--tcb)}.mbtn-h.active{background:var(--tcb);color:#000;box-shadow:0 0 8px rgba(129,140,248,.5)}\n.mbtn-c{border-color:var(--gray);color:var(--gray2)}.mbtn-c.active{border-color:#aaa;color:#ccc}\n.sol-met{display:flex;gap:.9rem;flex-wrap:wrap;justify-content:center;margin-bottom:.4rem}\n.met{text-align:center;min-width:52px}\n.met-v{font-size:1.1rem;font-style:italic;font-weight:700;line-height:1;transition:color .35s}\n.met-l{font-size:.36rem;letter-spacing:.1em;color:var(--gray);margin-top:2px;text-transform:uppercase}\n#solar{width:100%;max-width:500px;height:auto;display:block;margin:0 auto}\n.atk-card{max-width:1100px;margin:.4rem auto 0;background:#0f2035!important;border:.5px solid rgba(255,255,255,.07);border-radius:4px;padding:.45rem .7rem;display:flex;gap:.5rem;align-items:center;min-height:36px;transition:border-color .3s}\n.atk-icon{font-size:1.1rem;flex-shrink:0}\n.atk-name{font-size:.64rem;font-weight:700;transition:color .3s}\n.atk-sub{font-size:.4rem;color:var(--gray2);line-height:1.4;margin-top:1px}\n.atk-right{margin-left:auto;text-align:right;flex-shrink:0}\n.atk-lat{font-size:.88rem;font-style:italic;font-weight:700;transition:color .3s}\n.atk-lay{font-size:.38rem;color:var(--gray2);margin-top:1px}\n.sol-log{max-width:1100px;margin:.4rem auto 0;background:#0a1525!important;border:.5px solid rgba(255,255,255,.05);border-radius:4px;padding:.45rem .7rem;height:75px;overflow-y:auto}\n.sol-log::-webkit-scrollbar{width:2px}.sol-log::-webkit-scrollbar-thumb{background:rgba(255,255,255,.08)}\n.ll{font-size:.44rem;line-height:1.9;display:flex;gap:.35rem}\n.lt{color:var(--gray);min-width:52px}.lok{color:var(--green2);min-width:48px}.lwn{color:#B45309;min-width:48px}.lcr{color:var(--red);min-width:48px}\n.lm{color:var(--gray2)}.lip{color:var(--tcb);font-weight:700}\n.ll-new{animation:fadein .2s ease}\n \n\/* \u2550\u2550\u2550 DIVIDER \u2550\u2550\u2550 *\/\n.divider{width:100%;padding:.4rem 1rem;background:#0c1527!important;border-top:1px solid rgba(0,229,255,.12);border-bottom:1px solid rgba(0,229,255,.12);border-top:1px solid rgba(0,229,255,.12);border-bottom:1px solid rgba(0,229,255,.12);display:flex;align-items:center;justify-content:center;gap:.8rem}\n.divider span{font-size:.46rem;letter-spacing:.28em;color:rgba(0,229,255,.35);text-transform:uppercase}\n.div-line{flex:1;height:1px;background:linear-gradient(90deg,transparent,rgba(0,229,255,.18),transparent)}\n \n\/* \u2550\u2550\u2550 CMS CONTROLS BAR \u2550\u2550\u2550 *\/\n#cms-controls{background:#0d1a30!important;border-bottom:1px solid rgba(0,229,255,.08);padding:.5rem .8rem;display:flex;align-items:center;gap:.8rem;flex-wrap:wrap}\n.ctrl-group{display:flex;align-items:center;gap:.3rem;flex-wrap:wrap}\n.ctrl-label{font-size:.36rem;letter-spacing:.14em;color:rgba(0,229,255,.35);text-transform:uppercase;white-space:nowrap;padding-right:.3rem;border-right:1px solid rgba(0,229,255,.1)}\n.cms-btn{display:flex;align-items:center;gap:.2rem;padding:.2rem .45rem;border-radius:3px;cursor:pointer;font-size:.4rem;letter-spacing:.03em;border:1px solid rgba(0,229,255,.2);color:var(--gray3);background:transparent;transition:all .18s;font-family:var(--mono);white-space:nowrap}\n.cms-btn:hover{color:var(--cyan);border-color:rgba(0,229,255,.4);background:rgba(0,229,255,.05)}\n.cms-btn.active{color:var(--cyan);border-color:rgba(0,229,255,.5);background:rgba(0,229,255,.09)}\n.cbtn-dot{width:5px;height:5px;border-radius:50%;border:1.5px solid currentColor;flex-shrink:0}\n.cms-btn.active .cbtn-dot{background:var(--cyan)}\n.cms-atk-btn{display:flex;align-items:center;gap:.2rem;padding:.2rem .45rem;border-radius:3px;cursor:pointer;font-size:.4rem;letter-spacing:.03em;color:#ef4444;border:1px solid rgba(239,68,68,.28);background:rgba(239,68,68,.04);transition:all .16s;font-family:var(--mono);white-space:nowrap}\n.cms-atk-btn:hover{background:rgba(239,68,68,.12);border-color:rgba(239,68,68,.6)}\n.cms-atk-btn.firing{background:rgba(239,68,68,.22);border-color:var(--red);color:#fff;box-shadow:0 0 10px rgba(239,68,68,.4)}\n.cms-full-sim{display:flex;align-items:center;gap:.2rem;padding:.2rem .5rem;border-radius:3px;cursor:pointer;font-size:.4rem;font-weight:700;letter-spacing:.03em;color:#ffc107;border:1px solid rgba(255,193,7,.4);background:rgba(255,193,7,.05);transition:all .18s;font-family:var(--mono);white-space:nowrap}\n.cms-full-sim:hover{background:rgba(255,193,7,.15)}\n.cms-full-sim.firing{background:#ffc107;color:#000}\n.ctrl-sep{width:1px;height:20px;background:rgba(0,229,255,.08);flex-shrink:0}\n.ctrl-slider{display:flex;align-items:center;gap:.4rem;white-space:nowrap}\n.ctrl-slider-label{font-size:.4rem;color:var(--gray2)}\n.ctrl-slider-val{font-size:.42rem;color:var(--cyan);font-weight:700;min-width:22px}\ninput[type=range]{width:60px;height:3px;-webkit-appearance:none;background:rgba(0,229,255,.15);border-radius:2px;outline:none}\ninput[type=range]::-webkit-slider-thumb{-webkit-appearance:none;width:9px;height:9px;border-radius:50%;background:var(--cyan);cursor:pointer}\n.cms-sys-btn{padding:.2rem .4rem;border-radius:3px;font-size:.4rem;letter-spacing:.04em;font-family:var(--mono);cursor:pointer;border:1px solid rgba(0,229,255,.28);color:var(--cyan);background:rgba(0,229,255,.04);transition:all .16s;white-space:nowrap}\n.cms-sys-btn:hover{background:rgba(0,229,255,.1)}\n \n\/* \u2550\u2550\u2550 LAYER BAR \u2550\u2550\u2550 *\/\n#layer-bar{background:#0d1a30!important;border-bottom:1px solid rgba(0,229,255,.06);padding:.3rem .6rem;display:flex;gap:.3rem;flex-wrap:nowrap;align-items:stretch;overflow-x:auto}\n.lcard{background:#0f2035!important;border:1px solid rgba(0,51,64,.8);padding:3px 5px;cursor:pointer;display:flex;gap:3px;min-width:0;flex:1;transition:border-color .2s}\n.lcard:hover{border-color:rgba(0,229,255,.5)}\n.lbadge{min-width:18px;height:18px;display:flex;align-items:center;justify-content:center;font-size:8px;font-weight:bold;color:#fff;border-radius:2px;font-family:var(--mono)}\n.lname{color:#00e5ff;font-size:7.5px;letter-spacing:0;font-weight:bold;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}\n.ldesc{display:none}\n.lstat{color:#10b981;font-size:6.5px;margin-top:1px;font-weight:bold}\n \n\/* \u2550\u2550\u2550 CMS TOPOLOGY \u2550\u2550\u2550 *\/\n#cms-topo-wrap{width:100%;background:#0c1527!important;position:relative;overflow:hidden}\n#cms-topo{width:100%;display:block}\n \n\/* Overlays on topology *\/\n.ov-tl{position:absolute;top:8px;left:8px;background:rgba(0,0,0,.85);border:1px solid rgba(0,51,64,.8);padding:5px 9px}\n.ov-tr{position:absolute;top:8px;right:8px;background:rgba(0,0,0,.85);border:1px solid #26a69a;padding:5px 10px;text-align:center}\n.ov-bl{position:absolute;bottom:8px;left:8px;background:rgba(0,0,0,.85);border:1px solid rgba(0,51,64,.8);padding:5px 9px;font-size:9px}\n.ov-br{position:absolute;bottom:8px;right:8px;background:rgba(0,0,0,.85);border:1px solid rgba(0,51,64,.8);padding:5px 9px;font-size:9px;cursor:pointer}\n.ovr{display:flex;justify-content:space-between;gap:18px;margin:2px 0;font-size:9px}\n.ovl{opacity:.5;font-family:var(--mono)}.ovc{color:#00e5ff;font-weight:bold;font-family:var(--mono)}\n.cembar-wrap{width:160px}\n.cembar-track{height:3px;background:#0a2030;margin-top:3px}\n.cembar-fill{height:100%;background:linear-gradient(90deg,#00e5ff,#ffc107);transition:width .8s}\n \n\/* \u2550\u2550\u2550 TRAFFIC + AGENT + ROT ROW \u2550\u2550\u2550 *\/\n.row2{display:grid;grid-template-columns:1fr 1fr 1fr;border-top:1px solid rgba(0,229,255,.08);height:150px;background:#0d1a30!important}\n.rpanel{border-right:1px solid rgba(0,229,255,.06);overflow:hidden;display:flex;flex-direction:column;background:#0d1a30!important}\n.rpanel:last-child{border-right:none}\n.ph{background:#0f2035!important;border-bottom:1px solid rgba(0,229,255,.06);padding:4px 10px;display:flex;justify-content:space-between}\n.pt{font-size:9px;letter-spacing:2px;color:rgba(0,229,255,.5);font-family:var(--mono)}\n#trafficSvg{width:100%;flex:1}\n.agrid{display:grid;grid-template-columns:repeat(3,1fr);gap:3px;padding:5px}\n.abox{background:#0a1525!important;border:1px solid #0a2030;padding:3px;text-align:center;transition:all .3s}\n.abox.v{border-color:#ffc107}.abox.d{border-color:#10b981}\n.al{color:#00e5ff;font-size:8px;opacity:.7;font-family:var(--mono)}.at{color:#555;font-size:7px;font-family:var(--mono)}\n.aa{color:#ffc107;font-size:9px;font-weight:bold;margin:2px 0;font-family:var(--mono)}.ac{color:#10b981;font-size:7px;font-family:var(--mono)}\n.l10dec{font-size:9px;border-top:1px solid #0a2030;margin-top:2px;padding:3px 5px;font-family:var(--mono)}\n#rotHistory{font-size:9px;overflow-y:auto;height:115px;padding:4px 8px}\n.rentry{border-bottom:1px solid rgba(0,229,255,.04);padding:2px 0;display:grid;grid-template-columns:50px 1fr 55px;gap:3px;font-family:var(--mono)}\n \n\/* \u2550\u2550\u2550 CMS STATS BOTTOM \u2550\u2550\u2550 *\/\n#cms-stats{background:#0d1a30!important;border-top:1px solid rgba(0,229,255,.1);display:grid;grid-template-columns:1fr 1fr 2fr 2fr;gap:0}\n.stats-col{padding:.7rem 1rem;border-right:1px solid rgba(0,229,255,.06);background:#0d1a30!important}\n.stats-col:last-child{border-right:none}\n.stats-title{font-size:.4rem;letter-spacing:.2em;color:rgba(0,229,255,.38);text-transform:uppercase;margin-bottom:.5rem;padding-bottom:.25rem;border-bottom:1px solid rgba(0,229,255,.06);font-family:var(--mono)}\n.cms-kv{display:flex;justify-content:space-between;align-items:center;margin-bottom:.28rem}\n.cms-kv-key{font-size:.42rem;color:var(--gray2);font-family:var(--mono)}\n.cms-kv-val{font-size:.44rem;font-weight:700;font-family:var(--mono)}\n.ok{color:var(--green2)}.warn{color:#f59e0b}.crit{color:var(--red);animation:blink .8s ease-in-out infinite}\n.bar-row{margin-bottom:.35rem}\n.bar-label{display:flex;justify-content:space-between;margin-bottom:.18rem;font-size:.4rem;color:var(--gray2);font-family:var(--mono)}\n.bar-bg{height:3px;background:rgba(0,229,255,.08)!important;border-radius:2px;overflow:hidden}\n.bar-fg{height:100%;border-radius:2px;transition:width .7s ease}\n.cbmc-grid{display:grid;grid-template-columns:repeat(5,1fr);gap:2px}\n.cbmc-badge{font-size:.36rem;padding:2px 3px;border-radius:2px;text-align:center;letter-spacing:.03em;font-weight:700;transition:all .25s;cursor:default;font-family:var(--mono)}\n.cbmc-badge.pass{background:rgba(16,185,129,.1);color:#10b981;border:.5px solid rgba(16,185,129,.25)}\n.cbmc-badge.active{background:rgba(0,229,255,.18);color:var(--cyan);border:.5px solid var(--cyan);box-shadow:0 0 4px rgba(0,229,255,.35)}\n.cms-log-box{background:#0a1525!important;border-radius:3px;padding:.45rem .5rem;height:160px;overflow-y:auto;margin-top:.25rem}\n.cms-log-box::-webkit-scrollbar{width:2px}.cms-log-box::-webkit-scrollbar-thumb{background:rgba(0,229,255,.12)}\n.cll{font-size:.4rem;line-height:2;display:flex;gap:.35rem;flex-wrap:wrap}\n.clt{color:rgba(0,229,255,.3);min-width:50px;font-family:var(--mono)}\n.clok{color:var(--green2);min-width:46px;font-family:var(--mono)}.clwn{color:#f59e0b;min-width:46px;font-family:var(--mono)}.clcr{color:var(--red);min-width:46px;font-family:var(--mono)}\n.clm{color:rgba(148,163,184,.55);font-family:var(--mono)}.clip{color:var(--cyan);font-weight:700;font-family:var(--mono)}\n \n@media(max-width:800px){\n  #cms-stats{grid-template-columns:1fr 1fr}\n  .cbmc-grid{grid-template-columns:repeat(4,1fr)}\n  .row2{grid-template-columns:1fr}\n}\n \n \n \n \n \n\/* \u2550\u2550 KILL WHITE HEADER BLOCK \u2550\u2550 *\/\n.entry-header, .page-header, .post-header,\n.wp-block-post-title, .entry-title-wrapper,\n.wp-block-cover, .wp-block-cover__inner-container,\n.page-title-wrap, .page-intro, .breadcrumb,\n[class*=\"entry-header\"], [class*=\"page-header\"] {\n  background: #0c1527 !important;\n  background-color: #0c1527 !important;\n  background-image: none !important;\n  box-shadow: none !important;\n  border: none !important;\n  padding: 0 !important;\n  margin: 0 !important;\n  min-height: 0 !important;\n  height: auto !important;\n}\n\/* Hide title if it creates a white block *\/\n.entry-title, h1.entry-title, h1.page-title {\n  background: transparent !important;\n  background-color: transparent !important;\n  display: none !important;\n}\n \n\/* \u2550\u2550 WORDPRESS WIDTH FIX \u2550\u2550 *\/\n\/* Target common WP content wrappers *\/\n.entry-content, .wp-block-post-content, .wp-block-group,\n.wp-block-column, article .entry-content,\n.site-content, .content-area, #content, #primary,\n.wp-container-core-post-content, .is-layout-constrained > *,\n[class*=\"wp-container\"] {\n  max-width: none !important;\n  width: 100% !important;\n  padding-left: 0 !important;\n  padding-right: 0 !important;\n  margin-left: 0 !important;\n  margin-right: 0 !important;\n}\n\/* Alignwide\/alignfull *\/\n.alignfull, .alignwide { max-width: none !important; width: 100% !important; }\n\/* \u2500\u2500 OVERLAY ROW OVERRIDES \u2500\u2500 *\/\n#cms-overlay-row .ov-tl,\n#cms-overlay-row .ov-tr,\n#cms-overlay-row .ov-bl,\n#cms-overlay-row .ov-br {\n  position:relative !important;\n  top:auto !important; left:auto !important;\n  bottom:auto !important; right:auto !important;\n  background:#0d1a30 !important;\n  border-color:rgba(0,229,255,.12) !important;\n  padding:8px 12px !important;\n  flex:1 !important;\n  min-width:170px !important;\n  font-size:9px !important;\n}\n#cms-overlay-row .ov-tr {\n  flex:0 0 auto !important;\n  border-color:#26a69a !important;\n  text-align:center !important;\n  min-width:100px !important;\n}\n#cms-overlay-row .cembar-wrap { width:180px !important; }\n \n<\/style>\n<\/head>\n<body style=\"background:#0c1527!important\">\n<div id=\"dark-wrapper\" style=\"background:#0c1527;min-height:100vh\">\n \n<!-- \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550 -->\n<!-- PANEL 1 : SOLAR DEFENSE v3.1          -->\n<!-- \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550 -->\n<div id=\"panel-solar\">\n  <div class=\"sol-hdr\">\n    <div>\n      <div class=\"sol-hdr-title\">CORTEX ORIGIN\u2122 \u2014 Architecture solaire \u00b7 v3.1<\/div>\n      <div class=\"sol-hdr-sub\">Les attaques ne p\u00e9n\u00e8trent jamais la TCB \u2014 stopp\u00e9es en orbite \u00b7 14 modules \u00b7 AVA-VAN.5 evidence-grade EAL7<\/div>\n    <\/div>\n    <div style=\"display:flex;align-items:center;gap:6px;font-size:.48rem;letter-spacing:.1em\">\n      <span class=\"dot\" id=\"sim-dot\" style=\"background:#10b981;animation:blink 1.2s ease-in-out infinite\"><\/span>\n      <span id=\"sim-label\" style=\"color:#10b981\">ACTIF<\/span>\n    <\/div>\n  <\/div>\n  <div class=\"sol-modes\">\n    <button class=\"mbtn mbtn-n active\" id=\"btn-norm\"   onclick=\"setMode('normal')\">\u26a1 STD<\/button>\n    <button class=\"mbtn mbtn-z\"        id=\"btn-zd\"     onclick=\"setMode('zeroday')\">\ud83d\udc80 0-DAY<\/button>\n    <button class=\"mbtn mbtn-e\"        id=\"btn-exante\" onclick=\"setMode('exante')\">\u2131 EX ANTE<\/button>\n    <button class=\"mbtn mbtn-h\"        id=\"btn-hybrid\" onclick=\"setMode('hybrid')\">\ud83e\udd16 IA+HUM<\/button>\n    <button class=\"mbtn mbtn-c active\" id=\"btn-auto\"   onclick=\"toggleAuto()\" style=\"margin-left:.3rem\">\u23f5 Auto<\/button>\n    <button class=\"mbtn mbtn-c\"        onclick=\"simReset()\">\u21ba<\/button>\n  <\/div>\n  <div class=\"sol-met\">\n    <div class=\"met\"><div class=\"met-v\" id=\"m-blocked\" style=\"color:#10b981\">0<\/div><div class=\"met-l\">Bloqu\u00e9es<\/div><\/div>\n    <div class=\"met\"><div class=\"met-v\" id=\"m-mode\" style=\"color:#D97706\">STD<\/div><div class=\"met-l\">Mode<\/div><\/div>\n    <div class=\"met\"><div class=\"met-v\" id=\"m-lat\" style=\"color:var(--tcb)\">\u2014<\/div><div class=\"met-l\">Latence<\/div><\/div>\n    <div class=\"met\"><div class=\"met-v\" id=\"m-layer\" style=\"color:var(--gray2)\">\u2014<\/div><div class=\"met-l\">Couche<\/div><\/div>\n    <div class=\"met\"><div class=\"met-v\" style=\"color:var(--red)\">~940<\/div><div class=\"met-l\">CWE couverts<\/div><\/div>\n    <div class=\"met\"><div class=\"met-v\" style=\"color:var(--purple2)\">14<\/div><div class=\"met-l\">Modules<\/div><\/div>\n  <\/div>\n  <svg id=\"solar\" viewBox=\"0 0 500 500\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\">\n  <rect width=\"500\" height=\"500\" fill=\"#0c1527\" rx=\"5\"\/>\n  <defs>\n    <filter id=\"gs\"><feGaussianBlur stdDeviation=\"6\" result=\"b\"\/><feMerge><feMergeNode in=\"b\"\/><feMergeNode in=\"SourceGraphic\"\/><\/feMerge><\/filter>\n    <filter id=\"gm\"><feGaussianBlur stdDeviation=\"2\" result=\"b\"\/><feMerge><feMergeNode in=\"b\"\/><feMergeNode in=\"SourceGraphic\"\/><\/feMerge><\/filter>\n    <radialGradient id=\"tcb-g\" cx=\"50%\" cy=\"50%\" r=\"50%\"><stop offset=\"0%\" stop-color=\"#a5b4fc\"\/><stop offset=\"50%\" stop-color=\"#4f46e5\"\/><stop offset=\"100%\" stop-color=\"#1e1b4b\"\/><\/radialGradient>\n    <radialGradient id=\"halo\" cx=\"50%\" cy=\"50%\" r=\"50%\"><stop offset=\"0%\" stop-color=\"#4f46e5\" stop-opacity=\".1\"\/><stop offset=\"100%\" stop-color=\"#4f46e5\" stop-opacity=\"0\"\/><\/radialGradient>\n  <\/defs>\n  <circle cx=\"250\" cy=\"250\" r=\"220\" fill=\"none\" stroke=\"rgba(153,60,29,.15)\" stroke-width=\".6\" stroke-dasharray=\"3,8\"\/>\n  <circle cx=\"250\" cy=\"250\" r=\"157\" fill=\"none\" stroke=\"rgba(217,119,6,.22)\" stroke-width=\".6\" stroke-dasharray=\"2,5\"\/>\n  <circle cx=\"250\" cy=\"250\" r=\"100\" fill=\"none\" stroke=\"rgba(15,110,86,.16)\" stroke-width=\".6\" stroke-dasharray=\"2,6\"\/>\n  <circle cx=\"250\" cy=\"250\" r=\"52\"  fill=\"rgba(79,70,229,.04)\" stroke=\"rgba(83,74,183,.22)\" stroke-width=\".6\"\/>\n  <rect id=\"bg-exante\" x=\"2\" y=\"120\" width=\"68\" height=\"260\" rx=\"3\" fill=\"#065F46\" opacity=\"0\" style=\"transition:opacity .3s\"\/>\n  <path id=\"arc-exante\" d=\"M 68 122 A 170 170 0 0 0 68 378\" fill=\"none\" stroke=\"#065F46\" stroke-width=\"3\" opacity=\".5\" stroke-linecap=\"round\" style=\"transition:all .3s\"\/>\n  <text transform=\"translate(52,250) rotate(-90)\" text-anchor=\"middle\" font-size=\"5.5\" font-family=\"'JetBrains Mono',monospace\" fill=\"#065F46\" font-weight=\"bold\" letter-spacing=\"2\" opacity=\".85\">EX ANTE \u00b7 \u2131 HOL \u00b7 0 CVE<\/text>\n  <rect id=\"bg-m24\" x=\"430\" y=\"120\" width=\"68\" height=\"260\" rx=\"3\" fill=\"#534AB7\" opacity=\"0\" style=\"transition:opacity .3s\"\/>\n  <path id=\"arc-m24\" d=\"M 432 122 A 170 170 0 0 1 432 378\" fill=\"none\" stroke=\"#4338ca\" stroke-width=\"3\" opacity=\".5\" stroke-linecap=\"round\" style=\"transition:all .3s\"\/>\n  <text id=\"txt-m24\" transform=\"translate(448,250) rotate(90)\" text-anchor=\"middle\" font-size=\"5\" font-family=\"'JetBrains Mono',monospace\" fill=\"#3C3489\" font-weight=\"bold\" letter-spacing=\"1.6\" opacity=\".88\" style=\"transition:all .3s\">M24 OFFLINE\u2122 \u00b7 CBMC 13\/13 \u00b7 halt_path 3,02 ns<\/text>\n  <circle id=\"wall-ring\" cx=\"250\" cy=\"250\" r=\"157\" fill=\"none\" stroke=\"#D97706\" stroke-width=\"2.5\" opacity=\".22\"\/>\n  <g><animateTransform attributeName=\"transform\" type=\"rotate\" from=\"0 250 250\" to=\"360 250 250\" dur=\"30s\" repeatCount=\"indefinite\"\/>\n    <circle cx=\"250\" cy=\"93\" r=\"3.5\" fill=\"#D97706\" opacity=\".48\"\/><circle cx=\"362\" cy=\"139\" r=\"2.5\" fill=\"#D97706\" opacity=\".35\"\/>\n    <circle cx=\"407\" cy=\"250\" r=\"3.5\" fill=\"#D97706\" opacity=\".48\"\/><circle cx=\"362\" cy=\"361\" r=\"2.5\" fill=\"#D97706\" opacity=\".35\"\/>\n    <circle cx=\"250\" cy=\"407\" r=\"3.5\" fill=\"#D97706\" opacity=\".48\"\/><circle cx=\"138\" cy=\"361\" r=\"2.5\" fill=\"#D97706\" opacity=\".35\"\/>\n    <circle cx=\"93\"  cy=\"250\" r=\"3.5\" fill=\"#D97706\" opacity=\".48\"\/><circle cx=\"138\" cy=\"139\" r=\"2.5\" fill=\"#D97706\" opacity=\".35\"\/>\n  <\/g>\n  <text x=\"250\" y=\"87\" text-anchor=\"middle\" font-size=\"5.5\" font-family=\"'JetBrains Mono',monospace\" fill=\"#92400E\" font-weight=\"bold\" letter-spacing=\"1.5\" opacity=\".82\">WALL-DOME\u2122<\/text>\n  <text x=\"250\" y=\"95\" text-anchor=\"middle\" font-size=\"4\" font-family=\"'JetBrains Mono',monospace\" fill=\"#B45309\" opacity=\".7\">100\/100 \u00b7 15\/15 CWE \u00b7 TNR 100%<\/text>\n  <circle cx=\"250\" cy=\"250\" r=\"72\" fill=\"url(#halo)\"\/>\n  <circle cx=\"250\" cy=\"250\" r=\"48\" fill=\"url(#tcb-g)\" filter=\"url(#gs)\"\/>\n  <circle cx=\"250\" cy=\"250\" r=\"48\" fill=\"none\" stroke=\"rgba(165,180,252,.22)\" stroke-width=\"1\"\/>\n  <circle cx=\"250\" cy=\"250\" r=\"48\" fill=\"none\" stroke=\"#818cf8\" stroke-width=\".8\" opacity=\".18\"><animate attributeName=\"r\" from=\"48\" to=\"68\" dur=\"2s\" repeatCount=\"indefinite\"\/><animate attributeName=\"opacity\" from=\".14\" to=\"0\" dur=\"2s\" repeatCount=\"indefinite\"\/><\/circle>\n  <text x=\"250\" y=\"244\" text-anchor=\"middle\" font-size=\"9\" font-family=\"'JetBrains Mono',monospace\" fill=\"#1e1b4b\" font-weight=\"bold\">TCB<\/text>\n  <text x=\"250\" y=\"255\" text-anchor=\"middle\" font-size=\"6.5\" font-family=\"'JetBrains Mono',monospace\" fill=\"#4338ca\">seL4 EAL7<\/text>\n  <text x=\"250\" y=\"264\" text-anchor=\"middle\" font-size=\"4.5\" font-family=\"'JetBrains Mono',monospace\" fill=\"rgba(67,56,202,.65)\">PRISM \u00b7 OMEGA<\/text>\n  <text x=\"250\" y=\"272\" text-anchor=\"middle\" font-size=\"4\" font-family=\"'JetBrains Mono',monospace\" fill=\"rgba(67,56,202,.45)\">421 ns \u00b7 T1..T8<\/text>\n  <circle id=\"tf1\" cx=\"250\" cy=\"250\" r=\"48\" fill=\"none\" stroke=\"#818cf8\" stroke-width=\"3.5\" opacity=\"0\" style=\"transition:opacity .08s\"\/>\n  <circle id=\"tf2\" cx=\"250\" cy=\"250\" r=\"58\" fill=\"none\" stroke=\"#4f46e5\" stroke-width=\"2\" opacity=\"0\" style=\"transition:opacity .14s\"\/>\n  <g id=\"mod-walld\"><circle cx=\"250\" cy=\"150\" r=\"19\" fill=\"rgba(15,110,86,.14)\" stroke=\"#0F6E56\" stroke-width=\"1.8\" filter=\"url(#gm)\"\/><text x=\"250\" y=\"147\" text-anchor=\"middle\" font-size=\"5\" font-family=\"'JetBrains Mono',monospace\" fill=\"#085041\" font-weight=\"bold\">WALL<\/text><text x=\"250\" y=\"155\" text-anchor=\"middle\" font-size=\"4\" font-family=\"'JetBrains Mono',monospace\" fill=\"#0F6E56\">DOME<\/text><\/g>\n  <g id=\"mod-aegis\"><circle cx=\"321\" cy=\"179\" r=\"19\" fill=\"rgba(15,110,86,.14)\" stroke=\"#0F6E56\" stroke-width=\"1.8\" filter=\"url(#gm)\"\/><text x=\"321\" y=\"176\" text-anchor=\"middle\" font-size=\"5\" font-family=\"'JetBrains Mono',monospace\" fill=\"#085041\" font-weight=\"bold\">AEGIS<\/text><text x=\"321\" y=\"184\" text-anchor=\"middle\" font-size=\"4\" font-family=\"'JetBrains Mono',monospace\" fill=\"#0F6E56\">94\/100<\/text><\/g>\n  <g id=\"mod-cms\"><circle cx=\"345\" cy=\"214\" r=\"17\" fill=\"rgba(124,58,237,.14)\" stroke=\"#5B2D8E\" stroke-width=\"1.8\" filter=\"url(#gm)\"\/><text x=\"345\" y=\"211\" text-anchor=\"middle\" font-size=\"4.5\" font-family=\"'JetBrains Mono',monospace\" fill=\"#c8a0ff\" font-weight=\"bold\">CMS\u2122<\/text><text x=\"345\" y=\"219\" text-anchor=\"middle\" font-size=\"3.5\" font-family=\"'JetBrains Mono',monospace\" fill=\"#7c3aed\">MTD<\/text><\/g>\n  <g id=\"mod-m09\"><circle cx=\"350\" cy=\"250\" r=\"19\" fill=\"rgba(15,110,86,.14)\" stroke=\"#0F6E56\" stroke-width=\"1.8\" filter=\"url(#gm)\"\/><text x=\"350\" y=\"247\" text-anchor=\"middle\" font-size=\"5\" font-family=\"'JetBrains Mono',monospace\" fill=\"#085041\" font-weight=\"bold\">M09<\/text><text x=\"350\" y=\"255\" text-anchor=\"middle\" font-size=\"3.5\" font-family=\"'JetBrains Mono',monospace\" fill=\"#0F6E56\">100\/100<\/text><\/g>\n  <g id=\"mod-sent\"><circle cx=\"321\" cy=\"321\" r=\"19\" fill=\"rgba(15,110,86,.14)\" stroke=\"#0F6E56\" stroke-width=\"1.8\" filter=\"url(#gm)\"\/><text x=\"321\" y=\"318\" text-anchor=\"middle\" font-size=\"5\" font-family=\"'JetBrains Mono',monospace\" fill=\"#085041\" font-weight=\"bold\">SENT.<\/text><text x=\"321\" y=\"326\" text-anchor=\"middle\" font-size=\"3.5\" font-family=\"'JetBrains Mono',monospace\" fill=\"#0F6E56\">100\/100<\/text><\/g>\n  <g id=\"mod-atlas\"><circle cx=\"250\" cy=\"350\" r=\"19\" fill=\"rgba(15,110,86,.14)\" stroke=\"#0F6E56\" stroke-width=\"1.8\" filter=\"url(#gm)\"\/><text x=\"250\" y=\"347\" text-anchor=\"middle\" font-size=\"5\" font-family=\"'JetBrains Mono',monospace\" fill=\"#085041\" font-weight=\"bold\">ATLAS\u2122<\/text><text x=\"250\" y=\"355\" text-anchor=\"middle\" font-size=\"3.5\" font-family=\"'JetBrains Mono',monospace\" fill=\"#22c55e\">97\/100<\/text><\/g>\n  <g id=\"mod-m11\"><circle cx=\"179\" cy=\"321\" r=\"19\" fill=\"rgba(15,110,86,.14)\" stroke=\"#0F6E56\" stroke-width=\"1.8\" filter=\"url(#gm)\"\/><text x=\"179\" y=\"318\" text-anchor=\"middle\" font-size=\"5\" font-family=\"'JetBrains Mono',monospace\" fill=\"#085041\" font-weight=\"bold\">M11<\/text><text x=\"179\" y=\"326\" text-anchor=\"middle\" font-size=\"3.5\" font-family=\"'JetBrains Mono',monospace\" fill=\"#0F6E56\">100\/100<\/text><\/g>\n  <g id=\"mod-prism\"><circle cx=\"150\" cy=\"250\" r=\"19\" fill=\"rgba(79,70,229,.14)\" stroke=\"#818cf8\" stroke-width=\"1.8\" filter=\"url(#gm)\"\/><text x=\"150\" y=\"247\" text-anchor=\"middle\" font-size=\"5\" font-family=\"'JetBrains Mono',monospace\" fill=\"#3C3489\" font-weight=\"bold\">PRISM<\/text><text x=\"150\" y=\"255\" text-anchor=\"middle\" font-size=\"3.5\" font-family=\"'JetBrains Mono',monospace\" fill=\"#534AB7\">100\/100<\/text><\/g>\n  <g id=\"mod-m00\"><circle cx=\"179\" cy=\"179\" r=\"19\" fill=\"rgba(79,70,229,.14)\" stroke=\"#818cf8\" stroke-width=\"1.8\" filter=\"url(#gm)\"\/><text x=\"179\" y=\"176\" text-anchor=\"middle\" font-size=\"5\" font-family=\"'JetBrains Mono',monospace\" fill=\"#3C3489\" font-weight=\"bold\">M00<\/text><text x=\"179\" y=\"184\" text-anchor=\"middle\" font-size=\"3.5\" font-family=\"'JetBrains Mono',monospace\" fill=\"#534AB7\">RoT<\/text><\/g>\n  <g id=\"cwe-INJECT\"><circle cx=\"250\" cy=\"30\" r=\"16\" fill=\"rgba(239,68,68,.07)\" stroke=\"#ef4444\" stroke-width=\"1.4\"\/><text x=\"250\" y=\"27\" text-anchor=\"middle\" font-size=\"4.5\" font-family=\"'JetBrains Mono',monospace\" fill=\"#7B2800\" font-weight=\"bold\">INJECT.<\/text><text x=\"250\" y=\"34\" text-anchor=\"middle\" font-size=\"3.2\" font-family=\"'JetBrains Mono',monospace\" fill=\"#993C1D\">89\u00b778<\/text><\/g>\n  <g id=\"cwe-MEM\"><circle cx=\"341\" cy=\"49\" r=\"16\" fill=\"rgba(239,68,68,.07)\" stroke=\"#ef4444\" stroke-width=\"1.4\"\/><text x=\"341\" y=\"46\" text-anchor=\"middle\" font-size=\"4.5\" font-family=\"'JetBrains Mono',monospace\" fill=\"#7B2800\" font-weight=\"bold\">MEM<\/text><text x=\"341\" y=\"53\" text-anchor=\"middle\" font-size=\"3.2\" font-family=\"'JetBrains Mono',monospace\" fill=\"#993C1D\">119\u00b7787<\/text><\/g>\n  <g id=\"cwe-AUTH\"><circle cx=\"414\" cy=\"101\" r=\"16\" fill=\"rgba(239,68,68,.07)\" stroke=\"#ef4444\" stroke-width=\"1.4\"\/><text x=\"414\" y=\"98\" text-anchor=\"middle\" font-size=\"4.5\" font-family=\"'JetBrains Mono',monospace\" fill=\"#7B2800\" font-weight=\"bold\">AUTH.<\/text><text x=\"414\" y=\"105\" text-anchor=\"middle\" font-size=\"3.2\" font-family=\"'JetBrains Mono',monospace\" fill=\"#993C1D\">287\u00b7522<\/text><\/g>\n  <g id=\"cwe-ACCES\"><circle cx=\"462\" cy=\"174\" r=\"16\" fill=\"rgba(239,68,68,.07)\" stroke=\"#ef4444\" stroke-width=\"1.4\"\/><text x=\"462\" y=\"171\" text-anchor=\"middle\" font-size=\"4.5\" font-family=\"'JetBrains Mono',monospace\" fill=\"#7B2800\" font-weight=\"bold\">ACC\u00c8S<\/text><text x=\"462\" y=\"178\" text-anchor=\"middle\" font-size=\"3.2\" font-family=\"'JetBrains Mono',monospace\" fill=\"#993C1D\">269<\/text><\/g>\n  <g id=\"cwe-CRYPTO\"><circle cx=\"470\" cy=\"263\" r=\"16\" fill=\"rgba(239,68,68,.07)\" stroke=\"#ef4444\" stroke-width=\"1.4\"\/><text x=\"470\" y=\"260\" text-anchor=\"middle\" font-size=\"4.5\" font-family=\"'JetBrains Mono',monospace\" fill=\"#7B2800\" font-weight=\"bold\">CRYPTO<\/text><text x=\"470\" y=\"267\" text-anchor=\"middle\" font-size=\"3.2\" font-family=\"'JetBrains Mono',monospace\" fill=\"#993C1D\">327<\/text><\/g>\n  <g id=\"cwe-CONFIG\"><circle cx=\"441\" cy=\"361\" r=\"16\" fill=\"rgba(239,68,68,.07)\" stroke=\"#ef4444\" stroke-width=\"1.4\"\/><text x=\"441\" y=\"358\" text-anchor=\"middle\" font-size=\"4.5\" font-family=\"'JetBrains Mono',monospace\" fill=\"#7B2800\" font-weight=\"bold\">CONFIG<\/text><text x=\"441\" y=\"365\" text-anchor=\"middle\" font-size=\"3.2\" font-family=\"'JetBrains Mono',monospace\" fill=\"#993C1D\">16<\/text><\/g>\n  <g id=\"cwe-CONC\"><circle cx=\"380\" cy=\"432\" r=\"16\" fill=\"rgba(239,68,68,.07)\" stroke=\"#ef4444\" stroke-width=\"1.4\"\/><text x=\"380\" y=\"429\" text-anchor=\"middle\" font-size=\"4.5\" font-family=\"'JetBrains Mono',monospace\" fill=\"#7B2800\" font-weight=\"bold\">RACE<\/text><text x=\"380\" y=\"436\" text-anchor=\"middle\" font-size=\"3.2\" font-family=\"'JetBrains Mono',monospace\" fill=\"#993C1D\">362<\/text><\/g>\n  <g id=\"cwe-DOS\"><circle cx=\"296\" cy=\"468\" r=\"16\" fill=\"rgba(239,68,68,.07)\" stroke=\"#ef4444\" stroke-width=\"1.4\"\/><text x=\"296\" y=\"465\" text-anchor=\"middle\" font-size=\"4.5\" font-family=\"'JetBrains Mono',monospace\" fill=\"#7B2800\" font-weight=\"bold\">DoS<\/text><text x=\"296\" y=\"472\" text-anchor=\"middle\" font-size=\"3.2\" font-family=\"'JetBrains Mono',monospace\" fill=\"#993C1D\">400<\/text><\/g>\n  <g id=\"cwe-DESER\"><circle cx=\"204\" cy=\"468\" r=\"16\" fill=\"rgba(239,68,68,.07)\" stroke=\"#ef4444\" stroke-width=\"1.4\"\/><text x=\"204\" y=\"465\" text-anchor=\"middle\" font-size=\"4.5\" font-family=\"'JetBrains Mono',monospace\" fill=\"#7B2800\" font-weight=\"bold\">D\u00c9S\u00c9R.<\/text><text x=\"204\" y=\"472\" text-anchor=\"middle\" font-size=\"3.2\" font-family=\"'JetBrains Mono',monospace\" fill=\"#993C1D\">502<\/text><\/g>\n  <g id=\"cwe-SC\"><circle cx=\"120\" cy=\"432\" r=\"16\" fill=\"rgba(239,68,68,.07)\" stroke=\"#ef4444\" stroke-width=\"1.4\"\/><text x=\"120\" y=\"429\" text-anchor=\"middle\" font-size=\"4.5\" font-family=\"'JetBrains Mono',monospace\" fill=\"#7B2800\" font-weight=\"bold\">SUPPLY<\/text><text x=\"120\" y=\"436\" text-anchor=\"middle\" font-size=\"3.2\" font-family=\"'JetBrains Mono',monospace\" fill=\"#993C1D\">1104<\/text><\/g>\n  <g id=\"cwe-INFO\"><circle cx=\"59\" cy=\"361\" r=\"16\" fill=\"rgba(239,68,68,.07)\" stroke=\"#ef4444\" stroke-width=\"1.4\"\/><text x=\"59\" y=\"358\" text-anchor=\"middle\" font-size=\"4.5\" font-family=\"'JetBrains Mono',monospace\" fill=\"#7B2800\" font-weight=\"bold\">INFO<\/text><text x=\"59\" y=\"365\" text-anchor=\"middle\" font-size=\"3.2\" font-family=\"'JetBrains Mono',monospace\" fill=\"#993C1D\">918<\/text><\/g>\n  <g id=\"cwe-SIDE\"><circle cx=\"30\" cy=\"263\" r=\"16\" fill=\"rgba(239,68,68,.07)\" stroke=\"#ef4444\" stroke-width=\"1.4\"\/><text x=\"30\" y=\"260\" text-anchor=\"middle\" font-size=\"4.5\" font-family=\"'JetBrains Mono',monospace\" fill=\"#7B2800\" font-weight=\"bold\">SIDE<\/text><text x=\"30\" y=\"267\" text-anchor=\"middle\" font-size=\"3.2\" font-family=\"'JetBrains Mono',monospace\" fill=\"#993C1D\">208<\/text><\/g>\n  <g id=\"cwe-LOG\"><circle cx=\"38\" cy=\"174\" r=\"16\" fill=\"rgba(239,68,68,.07)\" stroke=\"#ef4444\" stroke-width=\"1.4\"\/><text x=\"38\" y=\"171\" text-anchor=\"middle\" font-size=\"4.5\" font-family=\"'JetBrains Mono',monospace\" fill=\"#7B2800\" font-weight=\"bold\">LOGIC<\/text><text x=\"38\" y=\"178\" text-anchor=\"middle\" font-size=\"3.2\" font-family=\"'JetBrains Mono',monospace\" fill=\"#993C1D\">840<\/text><\/g>\n  <g id=\"cwe-AI\"><circle cx=\"86\" cy=\"101\" r=\"16\" fill=\"rgba(239,68,68,.07)\" stroke=\"#ef4444\" stroke-width=\"1.4\"\/><text x=\"86\" y=\"98\" text-anchor=\"middle\" font-size=\"4.5\" font-family=\"'JetBrains Mono',monospace\" fill=\"#7B2800\" font-weight=\"bold\">IA\u00b7ADV.<\/text><text x=\"86\" y=\"105\" text-anchor=\"middle\" font-size=\"3.2\" font-family=\"'JetBrains Mono',monospace\" fill=\"#993C1D\">20<\/text><\/g>\n  <g id=\"cwe-ZD\"><circle cx=\"159\" cy=\"49\" r=\"17\" fill=\"rgba(220,38,38,.1)\" stroke=\"#dc2626\" stroke-width=\"1.8\"\/><circle cx=\"159\" cy=\"49\" r=\"17\" fill=\"none\" stroke=\"#dc2626\" stroke-width=\"1\" opacity=\".3\"><animate attributeName=\"r\" from=\"17\" to=\"28\" dur=\"0.9s\" repeatCount=\"indefinite\"\/><animate attributeName=\"opacity\" from=\".3\" to=\"0\" dur=\"0.9s\" repeatCount=\"indefinite\"\/><\/circle><text x=\"159\" y=\"46\" text-anchor=\"middle\" font-size=\"5\" font-family=\"'JetBrains Mono',monospace\" fill=\"#7B0000\" font-weight=\"bold\">0-DAY<\/text><text x=\"159\" y=\"53\" text-anchor=\"middle\" font-size=\"3.5\" font-family=\"'JetBrains Mono',monospace\" fill=\"#993C1D\">CVE:???<\/text><\/g>\n  <g id=\"anim-g\"><\/g>\n  <\/svg>\n  <div class=\"atk-card\" id=\"atk-card\">\n    <span class=\"atk-icon\" id=\"atk-icon\">\u23f3<\/span>\n    <div><div class=\"atk-name\" id=\"atk-name\" style=\"color:var(--gray2)\">En attente\u2026<\/div><div class=\"atk-sub\" id=\"atk-sub\">Simulation automatique active<\/div><\/div>\n    <div class=\"atk-right\"><div class=\"atk-lat\" id=\"atk-lat\" style=\"color:var(--gray2)\">\u2014<\/div><div class=\"atk-lay\" id=\"atk-lay\">\u2014<\/div><\/div>\n  <\/div>\n  <div class=\"sol-log\" id=\"sol-log\">\n    <div class=\"ll\"><span class=\"lt\">&#8211;:&#8211;.&#8212;<\/span><span class=\"lok\">[ OK ]<\/span><span class=\"lm\">TCB seL4 EAL7 inviolable \u2014 <span class=\"lip\">T1..T8<\/span> \u2014 421 ns<\/span><\/div>\n    <div class=\"ll\"><span class=\"lt\">&#8211;:&#8211;.&#8212;<\/span><span class=\"lok\">[ OK ]<\/span><span class=\"lm\">WALL-DOME\u2122 r=220 \u2014 <span class=\"lip\">15\/15 CWE<\/span> \u2014 TNR 100%<\/span><\/div>\n    <div class=\"ll\"><span class=\"lt\">&#8211;:&#8211;.&#8212;<\/span><span class=\"lok\">[ OK ]<\/span><span class=\"lm\">CMS MORPHIC SHIELD\u2122 MTD actif \u2014 <span class=\"lip\">CBMC 60\/60<\/span> \u00b7 2,97 ns<\/span><\/div>\n  <\/div>\n<\/div>\n \n<!-- DIVIDER -->\n<div class=\"divider\">\n  <div class=\"div-line\"><\/div>\n  <span>\u27c1 CMS CORTEX MORPHIC SHIELD\u2122 \u00b7 EVAL-016 v5.2 \u00b7 Moving Target Defence \u00b7 Fisher-Yates \u00b7 CBMC 60\/60 \u00b7 ~125 Mds+<\/span>\n  <div class=\"div-line\"><\/div>\n<\/div>\n \n<!-- \u2550\u2550 CMS CONTROLS BAR \u2550\u2550 -->\n<div id=\"cms-controls\">\n  <div class=\"ctrl-group\">\n    <span class=\"ctrl-label\">\/\/ MORPHING<\/span>\n    <button class=\"cms-btn active\" id=\"cms-auto-morph\" onclick=\"this.classList.toggle('active')\"><span class=\"cbtn-dot\"><\/span>AUTO-MORPHING<\/button>\n    <button class=\"cms-btn active\" id=\"cms-rotation-ip\" onclick=\"this.classList.toggle('active')\"><span class=\"cbtn-dot\"><\/span>ROTATION IP (RFC 6598)<\/button>\n    <button class=\"cms-btn\" onclick=\"this.classList.toggle('active')\"><span class=\"cbtn-dot\"><\/span>REMAP PORTS<\/button>\n    <button class=\"cms-btn\" onclick=\"this.classList.toggle('active')\"><span class=\"cbtn-dot\"><\/span>TOPO SHUFFLE<\/button>\n    <button class=\"cms-btn\" onclick=\"triggerFullMorph()\"><span class=\"cbtn-dot\"><\/span>FULL SURFACE MORPH<\/button>\n  <\/div>\n  <div class=\"ctrl-sep\"><\/div>\n  <div class=\"ctrl-group\">\n    <span class=\"ctrl-label\">\/\/ ATTAQUES<\/span>\n    <button class=\"cms-atk-btn\" id=\"ba-scan\"  onclick=\"cmsAttack('portscan',this)\">\u26a1 PORT SCAN<\/button>\n    <button class=\"cms-atk-btn\" id=\"ba-brute\" onclick=\"cmsAttack('brute',this)\">\u26a1 BRUTEFORCE<\/button>\n    <button class=\"cms-atk-btn\" id=\"ba-recon\" onclick=\"cmsAttack('recon',this)\">\u26a1 RECONNAISSANCE<\/button>\n    <button class=\"cms-atk-btn\" id=\"ba-ddos\"  onclick=\"cmsAttack('ddos',this)\">\u26a1 DDoS FLOOD<\/button>\n    <button class=\"cms-atk-btn\" id=\"ba-apt\"   onclick=\"cmsAttack('apt',this)\">\u26a1 APT INFILTRATION<\/button>\n    <button class=\"cms-atk-btn\" id=\"ba-zero\"  onclick=\"cmsAttack('zero',this)\">\u26a1 ZERO-DAY<\/button>\n    <button class=\"cms-full-sim\" id=\"ba-full\" onclick=\"fullSim()\">\u26a1 SIMULATION AI+HUMAIN<\/button>\n  <\/div>\n  <div class=\"ctrl-sep\"><\/div>\n  <div class=\"ctrl-group\">\n    <span class=\"ctrl-label\">\/\/ PARAMS<\/span>\n    <div class=\"ctrl-slider\"><span class=\"ctrl-slider-label\">Morph rate<\/span><input type=\"range\" min=\"1\" max=\"20\" value=\"2\" oninput=\"morphRateVal.textContent=this.value+'s';morphInterval=parseInt(this.value)*1000\"><span class=\"ctrl-slider-val\" id=\"morphRateVal\">2s<\/span><\/div>\n    <div class=\"ctrl-slider\"><span class=\"ctrl-slider-label\">Nodes<\/span><input type=\"range\" min=\"5\" max=\"40\" value=\"16\" oninput=\"nodesVal.textContent=this.value;rebuildNodes(parseInt(this.value))\"><span class=\"ctrl-slider-val\" id=\"nodesVal\">16<\/span><\/div>\n    <div class=\"ctrl-slider\"><span class=\"ctrl-slider-label\">Threat<\/span><input type=\"range\" min=\"1\" max=\"4\" value=\"4\" oninput=\"updateThreat(this.value)\"><span class=\"ctrl-slider-val\" id=\"threatVal\" style=\"color:var(--red)\">CRIT<\/span><\/div>\n  <\/div>\n  <div class=\"ctrl-sep\"><\/div>\n  <div class=\"ctrl-group\">\n    <button class=\"cms-sys-btn\" onclick=\"startCmsSim()\">\u25b6 START<\/button>\n    <button class=\"cms-sys-btn\" id=\"cms-pause-btn\" onclick=\"pauseCmsSim()\">\u23f8 PAUSE<\/button>\n    <button class=\"cms-sys-btn\" onclick=\"resetCmsSim()\">\u21ba RESET<\/button>\n  <\/div>\n<\/div>\n \n<!-- \u2550\u2550 LAYER BAR L4\u2192L10 \u2550\u2550 -->\n<div id=\"layer-bar\">\n  <span class=\"ctrl-label\" style=\"padding-top:5px\">\/\/ COUCHES<\/span>\n  <div class=\"lcard\" onclick=\"clickLayer('l4',this)\"><div class=\"lbadge\" style=\"background:#1565c0\">L4<\/div><div><div class=\"lname\">Byzantine Consensus<\/div><div class=\"ldesc\">PBFT N=4 \u00b7 anti-replay \u00b7 HKDF<\/div><div class=\"lstat\">EAL6+ \u00b7 99%<\/div><\/div><\/div>\n  <div class=\"lcard\" onclick=\"clickLayer('l5',this)\"><div class=\"lbadge\" style=\"background:#1b5e20\">L5<\/div><div><div class=\"lname\">HON Adaptatif<\/div><div class=\"ldesc\">DomainDRBG \u00b7 HKDF poison \u00b7 audit chain<\/div><div class=\"lstat\">EAL6+ \u00b7 99%<\/div><\/div><\/div>\n  <div class=\"lcard\" onclick=\"clickLayer('l6',this)\"><div class=\"lbadge\" style=\"background:#6a1b9a\">L6<\/div><div><div class=\"lname\">Memory Guard<\/div><div class=\"ldesc\">Canaris head\/mid\/tail \u00b7 fail-closed<\/div><div class=\"lstat\">EAL5+ \u00b7 97%<\/div><\/div><\/div>\n  <div class=\"lcard\" onclick=\"clickLayer('l7',this)\"><div class=\"lbadge\" style=\"background:#0d47a1\">L7<\/div><div><div class=\"lname\">ZK Topology v8<\/div><div class=\"ldesc\">HKDF 96B \u00b7 chain_state 16B \u00b7 commitment<\/div><div class=\"lstat\" id=\"l7stat\">morph 1.000<\/div><\/div><\/div>\n  <div class=\"lcard\" onclick=\"clickLayer('l8',this)\"><div class=\"lbadge\" style=\"background:#e65100\">L8<\/div><div><div class=\"lname\">Adversarial ML<\/div><div class=\"ldesc\">noise 0.55 \u00b7 degradation 0.967 \u00b7 F-L8-01<\/div><div class=\"lstat\">EAL5+ \u00b7 95%<\/div><\/div><\/div>\n  <div class=\"lcard\" onclick=\"clickLayer('l9',this)\"><div class=\"lbadge\" style=\"background:#006064\">L9<\/div><div><div class=\"lname\">Temporal Morphism v4<\/div><div class=\"ldesc\">HMAC-DRBG \u00d7 3 \u00b7 jitter [500\u00b5s,8ms]<\/div><div class=\"lstat\" id=\"l9stat\">pred 0.194<\/div><\/div><\/div>\n  <div class=\"lcard\" style=\"border-color:rgba(255,193,7,.25)\" onclick=\"clickLayer('l10',this)\"><div class=\"lbadge\" style=\"background:#f57f17\">L10<\/div><div><div class=\"lname\">Orchestrateur Cognitif v5<\/div><div class=\"ldesc\">argmax DRBG \u00b7 4 mod\u00e8les \u00b7 bypass 0\/300<\/div><div class=\"lstat\" style=\"color:#ffc107\">EAL7 cand \u00b7 100%<\/div><\/div><\/div>\n<\/div>\n \n<!-- \u2550\u2550 CMS TOPOLOGY \u2550\u2550 -->\n<div id=\"cms-topo-wrap\">\n  <svg id=\"cms-topo\" viewBox=\"0 0 1200 520\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" preserveAspectRatio=\"xMidYMid meet\" style=\"width:100%;display:block;background:#0c1527\">\n  <defs>\n    <filter id=\"cglow\"><feGaussianBlur stdDeviation=\"5\" result=\"b\"\/><feMerge><feMergeNode in=\"b\"\/><feMergeNode in=\"SourceGraphic\"\/><\/feMerge><\/filter>\n    <filter id=\"cglow-sm\"><feGaussianBlur stdDeviation=\"2.5\" result=\"b\"\/><feMerge><feMergeNode in=\"b\"\/><feMergeNode in=\"SourceGraphic\"\/><\/feMerge><\/filter>\n    <radialGradient id=\"core-g\" cx=\"50%\" cy=\"50%\" r=\"50%\"><stop offset=\"0%\" stop-color=\"#ff9500\"\/><stop offset=\"60%\" stop-color=\"#d97706\"\/><stop offset=\"100%\" stop-color=\"#7c2d12\"\/><\/radialGradient>\n  <\/defs>\n  <line x1=\"0\" y1=\"260\" x2=\"1200\" y2=\"260\" stroke=\"rgba(0,229,255,.03)\" stroke-width=\"1\"\/>\n  <line x1=\"600\" y1=\"0\" x2=\"600\" y2=\"520\" stroke=\"rgba(0,229,255,.03)\" stroke-width=\"1\"\/>\n  <g id=\"cms-links\"><\/g>\n  <g id=\"cms-nodes\"><\/g>\n  <g id=\"cms-ips\"><\/g>\n  <g id=\"cms-effects\"><\/g>\n  <g id=\"cms-labels\"><\/g>\n  <g id=\"cms-tips\"><\/g>\n  <g id=\"cms-attacks\"><\/g>\n  <!-- CORE -->\n  <circle cx=\"600\" cy=\"260\" r=\"36\" fill=\"url(#core-g)\" filter=\"url(#cglow)\" opacity=\".92\"\/>\n  <circle cx=\"600\" cy=\"260\" r=\"36\" fill=\"none\" stroke=\"#ff9500\" stroke-width=\"1.5\" opacity=\".55\"><animate attributeName=\"r\" from=\"36\" to=\"54\" dur=\"1.4s\" repeatCount=\"indefinite\"\/><animate attributeName=\"opacity\" from=\".45\" to=\"0\" dur=\"1.4s\" repeatCount=\"indefinite\"\/><\/circle>\n  <text x=\"600\" y=\"255\" text-anchor=\"middle\" font-size=\"10\" font-family=\"'JetBrains Mono',monospace\" fill=\"#fff\" font-weight=\"bold\">CORE<\/text>\n  <text x=\"600\" y=\"268\" text-anchor=\"middle\" font-size=\"6.5\" font-family=\"'JetBrains Mono',monospace\" fill=\"rgba(255,200,100,.85)\">CHON \u00b7 TCB<\/text>\n  <\/svg>\n  \n \n<!-- \u2550\u2550 TRAFFIC + AGENT VOTE + ROTATION HISTORY \u2550\u2550 -->\n<div class=\"row2\">\n  <div class=\"rpanel\">\n    <div class=\"ph\"><span class=\"pt\">\/\/ TRAFIC PAQUETS\/S<\/span><span style=\"color:#00e5ff;font-size:9px;font-family:var(--mono)\" id=\"pps-v\">0 p\/s<\/span><\/div>\n    <svg id=\"trafficSvg\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\"><polyline id=\"traf-line\" fill=\"none\" stroke=\"#00e5ff\" stroke-width=\"1.5\"\/><polygon id=\"traf-fill\" fill=\"#00e5ff\" fill-opacity=\"0.06\" stroke=\"none\"\/><\/svg>\n  <\/div>\n  <div class=\"rpanel\">\n    <div class=\"ph\"><span class=\"pt\">\/\/ L10 MULTI-AGENT VOTE<\/span><span style=\"color:#ffc107;font-size:9px;font-family:var(--mono)\">DIV 1.000<\/span><\/div>\n    <div class=\"agrid\">\n      <div class=\"abox\" id=\"ag-a\"><div class=\"al\">ENGINE A<\/div><div class=\"at\">seuil:20<\/div><div class=\"aa\" id=\"aa-act\">\u2014<\/div><div class=\"ac\" id=\"aa-conf\">\u2014<\/div><\/div>\n      <div class=\"abox\" id=\"ag-b\"><div class=\"al\">ENGINE B<\/div><div class=\"at\">seuil:30<\/div><div class=\"aa\" id=\"ab-act\">\u2014<\/div><div class=\"ac\" id=\"ab-conf\">\u2014<\/div><\/div>\n      <div class=\"abox\" id=\"ag-c\"><div class=\"al\">ENGINE C<\/div><div class=\"at\">seuil:45<\/div><div class=\"aa\" id=\"ac-act\">\u2014<\/div><div class=\"ac\" id=\"ac-conf\">\u2014<\/div><\/div>\n    <\/div>\n    <div class=\"l10dec\"><span style=\"color:#00e5ff;opacity:.5\">DECISION<\/span><span id=\"l10-dec\" style=\"color:#ffc107;font-weight:bold;margin-left:8px\">NONE<\/span><span id=\"l10-ent\" style=\"color:#10b981;margin-left:10px\">H=\u2014<\/span><\/div>\n  <\/div>\n  <div class=\"rpanel\">\n    <div class=\"ph\"><span class=\"pt\">\/\/ HISTORIQUE ROTATIONS<\/span><span style=\"color:#ffc107;font-size:9px;font-family:var(--mono)\" id=\"rot-cnt\">0<\/span><\/div>\n    <div id=\"rotHistory\"><\/div>\n  <\/div>\n<\/div>\n \n<!-- \u2550\u2550 CMS STATS BOTTOM \u2550\u2550 -->\n<div id=\"cms-stats\">\n  <div class=\"stats-col\">\n    <div class=\"stats-title\">\/\/ STATS EXPOSITION<\/div>\n    <div class=\"cms-kv\"><span class=\"cms-kv-key\">TAUX SUCC\u00c8S ATT.<\/span><span class=\"cms-kv-val ok\" id=\"stat-succ\">0%<\/span><\/div>\n    <div class=\"cms-kv\"><span class=\"cms-kv-key\">THREAT LEVEL<\/span><span class=\"cms-kv-val crit\" id=\"stat-threat\">CRITICAL<\/span><\/div>\n    <div class=\"cms-kv\"><span class=\"cms-kv-key\">STRAT\u00c9GIE MTD<\/span><span class=\"cms-kv-val warn\" id=\"stat-strat\">LOCKDOWN<\/span><\/div>\n    <div class=\"cms-kv\"><span class=\"cms-kv-key\">UPTIME<\/span><span class=\"cms-kv-val\" id=\"stat-uptime\" style=\"color:var(--cyan)\">00:00:00<\/span><\/div>\n    <div class=\"cms-kv\"><span class=\"cms-kv-key\">ROTATIONS<\/span><span class=\"cms-kv-val\" id=\"stat-rot\" style=\"color:var(--purple2)\">0<\/span><\/div>\n    <div class=\"cms-kv\"><span class=\"cms-kv-key\">HOT PATH<\/span><span class=\"cms-kv-val\" style=\"color:var(--purple2)\">2,97 ns<\/span><\/div>\n    <div class=\"cms-kv\"><span class=\"cms-kv-key\">FUZZING<\/span><span class=\"cms-kv-val ok\">~125 Mds+ \u00b7 0 crash<\/span><\/div>\n  <\/div>\n  <div class=\"stats-col\">\n    <div class=\"stats-title\">\/\/ SCORE EXPOSITION<\/div>\n    <div class=\"bar-row\"><div class=\"bar-label\"><span>PORT SCAN<\/span><span id=\"bar-ps-v\" style=\"color:var(--red)\">85%<\/span><\/div><div class=\"bar-bg\"><div class=\"bar-fg\" id=\"bar-ps\" style=\"width:85%;background:var(--red)\"><\/div><\/div><\/div>\n    <div class=\"bar-row\"><div class=\"bar-label\"><span>BRUTEFORCE<\/span><span id=\"bar-bf-v\" style=\"color:#f59e0b\">38%<\/span><\/div><div class=\"bar-bg\"><div class=\"bar-fg\" id=\"bar-bf\" style=\"width:38%;background:#f59e0b\"><\/div><\/div><\/div>\n    <div class=\"bar-row\"><div class=\"bar-label\"><span>RECON<\/span><span id=\"bar-rc-v\" style=\"color:var(--green2)\">57%<\/span><\/div><div class=\"bar-bg\"><div class=\"bar-fg\" id=\"bar-rc\" style=\"width:57%;background:var(--green2)\"><\/div><\/div><\/div>\n    <div class=\"bar-row\"><div class=\"bar-label\"><span>DDoS<\/span><span id=\"bar-dd-v\" style=\"color:var(--red)\">88%<\/span><\/div><div class=\"bar-bg\"><div class=\"bar-fg\" id=\"bar-dd\" style=\"width:88%;background:var(--red)\"><\/div><\/div><\/div>\n    <div class=\"bar-row\"><div class=\"bar-label\"><span>APT<\/span><span id=\"bar-apt-v\" style=\"color:#9c27b0\">0%<\/span><\/div><div class=\"bar-bg\"><div class=\"bar-fg\" id=\"bar-apt\" style=\"width:0%;background:#9c27b0\"><\/div><\/div><\/div>\n    <div class=\"bar-row\"><div class=\"bar-label\"><span>ZERO-DAY<\/span><span id=\"bar-zd-v\" style=\"color:var(--red)\">0%<\/span><\/div><div class=\"bar-bg\"><div class=\"bar-fg\" id=\"bar-zd\" style=\"width:0%;background:var(--red)\"><\/div><\/div><\/div>\n    <div style=\"margin-top:.5rem;padding-top:.4rem;border-top:1px solid rgba(0,229,255,.06)\">\n      <div class=\"cms-kv\"><span class=\"cms-kv-key\">CEM BRUT<\/span><span class=\"cms-kv-val warn\" id=\"cms-cem-val\">66\/57 (+9)<\/span><\/div>\n      <div class=\"cms-kv\"><span class=\"cms-kv-key\">AVA_VAN.5<\/span><span class=\"cms-kv-val ok\">+35 pts marge<\/span><\/div>\n      <div class=\"cms-kv\"><span class=\"cms-kv-key\">VUL-009\u2192012<\/span><span class=\"cms-kv-val ok\">NON EXPLOIT<\/span><\/div>\n    <\/div>\n  <\/div>\n  <div class=\"stats-col\">\n    <div class=\"stats-title\">\/\/ PREUVES CBMC \u2014 P01-P60 \u00b7 60\/60 PASS<\/div>\n    <div class=\"cbmc-grid\" id=\"cbmc-grid\"><\/div>\n  <\/div>\n  <div class=\"stats-col\" style=\"display:flex;flex-direction:column\">\n    <div class=\"stats-title\">\/\/ LOG HMAC CHAIN<\/div>\n    <div class=\"cms-log-box\" id=\"cms-log\">\n      <div class=\"cll\"><span class=\"clt\">&#8211;:&#8211;.&#8212;<\/span><span class=\"clok\">[ OK ]<\/span><span class=\"clm\">CMS MORPHIC SHIELD\u2122 initialis\u00e9 \u2014 EVAL-016 v5.2<\/span><\/div>\n      <div class=\"cll\"><span class=\"clt\">&#8211;:&#8211;.&#8212;<\/span><span class=\"clok\">[ OK ]<\/span><span class=\"clm\">Fisher-Yates MTD \u2014 rotation <span class=\"clip\">IP\/PORT<\/span> \u00b7 RFC 6598<\/span><\/div>\n      <div class=\"cll\"><span class=\"clt\">&#8211;:&#8211;.&#8212;<\/span><span class=\"clok\">[ OK ]<\/span><span class=\"clm\">CBMC <span class=\"clip\">60\/60 PASS<\/span> \u00b7 P01\u2013P60 \u00b7 0 failed<\/span><\/div>\n    <\/div>\n  <\/div>\n<\/div>\n \n<script>\n\/\/ \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\n\/\/ SOLAR DEFENSE ENGINE (unchanged from original)\n\/\/ \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\nconst NS='http:\/\/www.w3.org\/2000\/svg';\nconst CX=250,CY=250,R_CWE=220,R_WALL=157,R_L1B=100;\nconst CWE_IDS=['INJECT','MEM','AUTH','ACCES','CRYPTO','CONFIG','CONC','DOS','DESER','SC','INFO','SIDE','LOG','AI','ZD'];\nconst CWE_POS={};\nCWE_IDS.forEach((id,i)=>{const a=(-90+i*24)*Math.PI\/180;CWE_POS[id]=[CX+R_CWE*Math.cos(a),CY+R_CWE*Math.sin(a)];});\nfunction onRing(cx,cy,r){const dx=CX-cx,dy=CY-cy,d=Math.hypot(dx,dy);return[cx+dx*(1-r\/d),cy+dy*(1-r\/d)];}\nconst NORMAL=[\n  {cwe:'INJECT',icon:'\ud83d\udee1',name:'MTD \u2014 Reconnaissance r\u00e9seau',sub:'CMS MORPHIC SHIELD\u2122 \u00b7 Fisher-Yates \u00b7 2,97 ns',blocked:'CMS\u2122',mods:['cms'],lat:'2,97 ns',layer:'L1b+ MTD',color:'#7c3aed',stopAt:'WALL',isMTD:true,steps:[{d:0,t:'warn',m:'CMS MORPHIC\u2122',l:'Scan r\u00e9seau \u00b7 Fisher-Yates \u00b7 rotation IP\/port <30s'},{d:220,t:'warn',m:'CMS MORPHIC\u2122',l:'Honeypots TCP actifs \u00b7 topologie fant\u00f4me'},{d:440,t:'ok',m:'CMS MORPHIC\u2122',l:'Reconnaissance impossible \u00b7 2,97 ns \u00b7 EVAL-016'}]},\n  {cwe:'INJECT',icon:'\ud83d\udc89',name:'Injection SQL\/OS',sub:'CWE-089 \u00b7 WALL-DOME r=220',blocked:'WALL-DOME\u2122',mods:['walld'],lat:'~2,1 \u00b5s',layer:'L1b',color:'#f97316',stopAt:'WALL',steps:[{d:0,t:'warn',m:'WALL-DOME\u2122',l:'CWE-089 SQL \u2014 payload analys\u00e9'},{d:380,t:'warn',m:'AEGIS\u2122',l:'Pattern injection \u2014 WP goals actifs'},{d:750,t:'ok',m:'WALL-DOME\u2122',l:'Bloqu\u00e9 r=220 \u00b7 2,1 \u00b5s'}]},\n  {cwe:'DOS',icon:'\ud83c\udf0a',name:'DoS flood adaptatif',sub:'CWE-400 \u00b7 M09-CB L1b',blocked:'M09 CB',mods:['m09'],lat:'~2,1 \u00b5s',layer:'L1b',color:'#06b6d4',stopAt:'L1B',steps:[{d:0,t:'warn',m:'M09-CB',l:'CWE-400 saturation \u2014 circuit ouvert'},{d:380,t:'warn',m:'AEGIS\u2122',l:'Playbook d\u00e9fensif \u2014 isolation'},{d:750,t:'ok',m:'M09-CB',l:'DoS neutralis\u00e9 \u00b7 r=140 \u00b7 100\/100'}]},\n  {cwe:'AUTH',icon:'\ud83d\udd11',name:'Brute-force SSH',sub:'CWE-307 \u00b7 SENTINEL',blocked:'SENTINEL',mods:['sent','m09'],lat:'~2,1 \u00b5s',layer:'L1b',color:'#f59e0b',stopAt:'L1B',steps:[{d:0,t:'warn',m:'SENTINEL',l:'CWE-307 \u2014 8 tentatives\/3s'},{d:380,t:'warn',m:'M09-CB',l:'Rate limiting \u00b7 9,0 ns'},{d:750,t:'ok',m:'SENTINEL',l:'IP bannie \u00b7 alerte PRISM'}]},\n  {cwe:'SC',icon:'\ud83d\udd17',name:'Supply Chain',sub:'CWE-1104 \u00b7 ATLAS\u2122',blocked:'ATLAS\u2122',mods:['atlas'],lat:'~2,1 \u00b5s',layer:'L1b',color:'#84cc16',stopAt:'L1B',steps:[{d:0,t:'warn',m:'ATLAS\u2122',l:'CWE-1104 \u2014 composant non-v\u00e9rifi\u00e9'},{d:380,t:'warn',m:'OMEGA',l:'PolicyForge \u2014 propagation bloqu\u00e9e'},{d:750,t:'ok',m:'ATLAS\u2122',l:'Supply chain bloqu\u00e9e \u00b7 97\/100'}]},\n];\nconst ZERODAY=[\n  {cwe:'ZD',icon:'\ud83d\udc80',name:'Zero-Day kernel (CVE inconnu)',sub:'0-DAY \u2014 L1b \u00b7 421 ns',blocked:'seL4 EAL7',mods:['m00'],lat:'421 ns',layer:'TCB\u2192L1b',color:'#dc2626',stopAt:'L1B',steps:[{d:0,t:'warn',m:'seL4 EAL7',l:'Zero-Day \u2014 T1\/T2 actif \u00b7 0 CVE'},{d:330,t:'warn',m:'M00 RoT',l:'Capability integrity \u2014 escalade impossible'},{d:660,t:'ok',m:'seL4 EAL7',l:'Arr\u00eat\u00e9 L1b \u00b7 HOL \u00b7 421 ns'}]},\n  {cwe:'MEM',icon:'\ud83d\udcbe',name:'Buffer Overflow 0-day',sub:'CWE-119 \u2014 T1\/T6',blocked:'seL4 EAL7',mods:['m00'],lat:'421 ns',layer:'TCB\u2192L1b',color:'#b91c1c',stopAt:'L1B',steps:[{d:0,t:'warn',m:'seL4 EAL7',l:'CWE-119 variant 0-day \u2014 T1\/T6'},{d:330,t:'warn',m:'M00 RoT',l:'Capability \u00b7 HOL T1\/T6'},{d:660,t:'ok',m:'seL4 EAL7',l:'Classe m\u00e9moire couverte \u00b7 421 ns'}]},\n  {cwe:'CONC',icon:'\ud83d\udd04',name:'Race Condition 0-day',sub:'CWE-362 \u00b7 T3 IPC',blocked:'seL4 T3',mods:['prism'],lat:'421 ns',layer:'TCB\u2192L1b',color:'#7c3aed',stopAt:'L1B',steps:[{d:0,t:'warn',m:'seL4 EAL7',l:'Race 0-day \u2014 T3 IPC atomique'},{d:330,t:'warn',m:'PRISM',l:'FSM \u2014 \u00e9tat ill\u00e9gitime'},{d:660,t:'ok',m:'seL4 EAL7',l:'Race impossible \u00b7 T3 \u00b7 421 ns'}]},\n];\nconst EXANTE=[\n  {cwe:'SIDE',icon:'\u23f1',name:'Side-Channel (ex ante)',sub:'CWE-208 \u00b7 preuve HOL',blocked:'seL4 EAL7',mods:['prism','m00'],lat:'421 ns',layer:'TCB',color:'#0891b2',stopAt:'EXANTE',steps:[{d:0,t:'warn',m:'seL4 EAL7',l:'CWE-208 \u2014 classe timing \u00b7 T3 remonte'},{d:300,t:'warn',m:'M00 RoT',l:'Uniformit\u00e9 temporelle \u00b7 0 fuite'},{d:600,t:'ok',m:'seL4 EAL7',l:'Side-channel impossible \u00b7 HOL \u00b7 421 ns'}]},\n  {cwe:'INFO',icon:'\ud83d\udce1',name:'Non-interference (ex ante)',sub:'CWE-918 \u00b7 T8 HOL',blocked:'seL4 T8',mods:['prism'],lat:'421 ns',layer:'TCB',color:'#7c3aed',stopAt:'EXANTE',steps:[{d:0,t:'warn',m:'PRISM',l:'CWE-918 \u2014 T8 non-interference'},{d:300,t:'warn',m:'seL4 EAL7',l:'Isolation domaines \u2014 \u00e9tanche'},{d:600,t:'ok',m:'PRISM',l:'0 octet sorti \u00b7 T8 \u00b7 421 ns'}]},\n  {cwe:'ACCES',icon:'\u2b06',name:'Escalade privil\u00e8ge (ex ante)',sub:'CWE-269 \u00b7 T2',blocked:'seL4 T2',mods:['m00'],lat:'421 ns',layer:'TCB',color:'#059669',stopAt:'EXANTE',steps:[{d:0,t:'warn',m:'seL4 EAL7',l:'Escalade \u2014 T2 capability HOL'},{d:300,t:'warn',m:'M00 RoT',l:'Escalade impossible par construction'},{d:600,t:'ok',m:'seL4 EAL7',l:'Bloqu\u00e9e ex ante \u00b7 T2 \u00b7 421 ns'}]},\n];\nconst HYBRID=[\n  {cwe:['INJECT','DOS','MEM','AUTH'],icon:'\ud83e\udd16',name:'APT IA \u2014 4 vecteurs',sub:'<12 ms \u00b7 mutation payload \u00b7 bloqu\u00e9s orbite',blocked:'WALL-DOME+L1b',mods:['walld','aegis','m09','m00'],lat:'421 ns',layer:'TCB+L1b',color:'#f97316',stopAt:'WALL',steps:[{d:0,t:'warn',m:'seL4 EAL7',l:'APT IA \u2014 4 vecteurs \u00b7 <12 ms'},{d:240,t:'warn',m:'WALL-DOME\u2122',l:'Vecteurs 1+2 intercept\u00e9s r=220'},{d:460,t:'warn',m:'M09-CB',l:'Vecteurs 3+4 stopp\u00e9s r=140'},{d:680,t:'ok',m:'TCB',l:'4\/4 bloqu\u00e9s \u00b7 TCB inviol\u00e9e \u00b7 421 ns'}]},\n  {cwe:['ZD','SC','AI'],icon:'\u26a1',name:'LLM Supply chain + 0-day',sub:'<18 ms \u00b7 exploit combin\u00e9',blocked:'M00+ATLAS\u2122',mods:['m00','atlas','walld','cms'],lat:'~2,5 ns',layer:'TCB\u2192L1b',color:'#7c3aed',stopAt:'L1B',steps:[{d:0,t:'warn',m:'ATLAS\u2122',l:'LLM exploit \u00b7 supply+0-day \u00b7 <18 ms'},{d:260,t:'warn',m:'M00 RoT',l:'Boot attestation \u2014 non-certifi\u00e9 bloqu\u00e9'},{d:500,t:'warn',m:'seL4 EAL7',l:'Zero-day \u2014 T1\/T2 ex ante'},{d:720,t:'ok',m:'TCB',l:'Exploit LLM stopp\u00e9 \u00b7 TCB inviol\u00e9e'}]},\n  {cwe:['DOS','CONC','CRYPTO','CONFIG'],icon:'\ud83c\udf0a',name:'DDoS adaptatif IA \u2014 1,2M req\/s',sub:'<5 ms switch \u00b7 botnet IA',blocked:'M09+WALL-DOME',mods:['m09','aegis','walld'],lat:'~2,1 \u00b5s',layer:'L1b',color:'#0891b2',stopAt:'WALL',steps:[{d:0,t:'warn',m:'M09-CB',l:'DDoS 1,2M req\/s \u00b7 circuit ouvert'},{d:240,t:'warn',m:'AEGIS\u2122',l:'D\u00e9fense \u2014 596\/640 WP goals'},{d:460,t:'warn',m:'WALL-DOME\u2122',l:'Flood stopp\u00e9 r=220'},{d:680,t:'ok',m:'M09-CB',l:'DDoS neutralis\u00e9 \u00b7 TCB inviol\u00e9e'}]},\n];\nfunction svgEl(tag,attrs,html=''){const e=document.createElementNS(NS,tag);Object.entries(attrs).forEach(([k,v])=>e.setAttribute(k,v));if(html)e.innerHTML=html;return e;}\nfunction clearAnim(){document.getElementById('anim-g').innerHTML='';}\nfunction tsNow(){const n=new Date();return`${String(n.getHours()).padStart(2,'0')}:${String(n.getMinutes()).padStart(2,'0')}.${String(n.getMilliseconds()).padStart(3,'0')}`;}\nfunction solLog(t,m,msg){\n  const cls=t==='ok'?'lok':t==='warn'?'lwn':'lcr';const lbl=t==='ok'?'[ OK ]':t==='warn'?'[ WARN ]':'[ CRIT ]';\n  const d=document.createElement('div');d.className='ll ll-new';\n  d.innerHTML=`<span class=\"lt\">${tsNow()}<\/span><span class=\"${cls}\">${lbl}<\/span><span class=\"lm\"><span class=\"lip\">${m}<\/span> \u2014 ${msg}<\/span>`;\n  const el=document.getElementById('sol-log');el.appendChild(d);\n  while(el.children.length>40)el.removeChild(el.firstChild);el.scrollTop=el.scrollHeight;\n}\nfunction flashMod(id,color){const g=document.getElementById('mod-'+id);if(!g)return;const c=g.querySelector('circle');if(!c)return;c.style.cssText=`fill:${color}1e;stroke:${color};stroke-width:3;filter:drop-shadow(0 0 7px ${color})`;setTimeout(()=>c.style.cssText='',550);}\nfunction flashTCB(color){const f1=document.getElementById('tf1'),f2=document.getElementById('tf2');if(f1){f1.setAttribute('stroke',color);f1.style.opacity='1';setTimeout(()=>f1.style.opacity='0',80);}if(f2){f2.setAttribute('stroke',color);f2.style.opacity='1';setTimeout(()=>f2.style.opacity='0',160);}}\nfunction flashWall(color){const w=document.getElementById('wall-ring');if(!w)return;w.setAttribute('stroke',color);w.style.cssText=`opacity:.8;stroke-width:4.5;filter:drop-shadow(0 0 10px ${color})`;setTimeout(()=>{w.setAttribute('stroke','#D97706');w.style.cssText='opacity:.22;stroke-width:2.5';},280);}\nfunction activateExAnte(){const arc=document.getElementById('arc-exante'),bg=document.getElementById('bg-exante');if(arc){arc.style.opacity='1';arc.style.strokeWidth='5.5';arc.style.filter='drop-shadow(0 0 7px #10b981)';}if(bg)bg.style.opacity='.09';setTimeout(()=>{if(arc){arc.style.opacity='.5';arc.style.strokeWidth='3';arc.style.filter='';}if(bg)bg.style.opacity='0';},900);}\nfunction activateM24(){const arc=document.getElementById('arc-m24'),txt=document.getElementById('txt-m24'),bg=document.getElementById('bg-m24');if(arc){arc.style.opacity='1';arc.style.strokeWidth='5.5';arc.style.filter='drop-shadow(0 0 7px #818cf8)';}if(txt){txt.style.opacity='1';txt.setAttribute('fill','#1e1b4b');}if(bg)bg.style.opacity='.08';setTimeout(()=>{if(arc){arc.style.opacity='.5';arc.style.strokeWidth='3';arc.style.filter='';}if(txt){txt.style.opacity='.88';txt.setAttribute('fill','#3C3489');}if(bg)bg.style.opacity='0';},900);}\nfunction pulseCWE(id,color){const g=document.getElementById('cwe-'+id);if(!g)return;const c=g.querySelector('circle:first-child');if(!c)return;c.style.cssText=`stroke:${color};stroke-width:2.5;fill:${color}1a;filter:drop-shadow(0 0 7px ${color})`;setTimeout(()=>c.style.cssText='',650);}\nfunction shoot(x1,y1,x2,y2,color,dur,uid){\n  const g=document.getElementById('anim-g');const dist=Math.hypot(x2-x1,y2-y1);const pid=`pt-${uid}`;\n  g.appendChild(svgEl('line',{x1,y1,x2,y2,stroke:color,'stroke-width':'1.6','stroke-dasharray':'7 4',opacity:'.55'},`<animate attributeName=\"stroke-dashoffset\" from=\"${dist}\" to=\"0\" dur=\"${dur}ms\" repeatCount=\"indefinite\"\/>`));\n  const ph=svgEl('path',{id:pid,d:`M${x1},${y1} L${x2},${y2}`,fill:'none',stroke:'none'});g.appendChild(ph);\n  g.appendChild(svgEl('circle',{r:'5',fill:color,opacity:'.88'},`<animateMotion dur=\"${dur}ms\" repeatCount=\"indefinite\" calcMode=\"linear\"><mpath href=\"#${pid}\"\/><\/animateMotion>`));\n  [0,300,600].forEach((b,i)=>g.appendChild(svgEl('circle',{cx:x1,cy:y1,r:'8',fill:'none',stroke:color,'stroke-width':String(2-i*.5),opacity:String(.55-i*.16)},`<animate attributeName=\"r\" from=\"8\" to=\"${20+i*5}\" dur=\"1s\" begin=\"${b}ms\" repeatCount=\"indefinite\"\/><animate attributeName=\"opacity\" from=\"${.55-i*.16}\" to=\"0\" dur=\"1s\" begin=\"${b}ms\" repeatCount=\"indefinite\"\/>`)));\n}\nfunction impactAt(x,y,color,label){\n  const g=document.getElementById('anim-g');\n  [0,200,400].forEach(d=>g.appendChild(svgEl('circle',{cx:x,cy:y,r:'6',fill:'none',stroke:color,'stroke-width':'2.2',opacity:'.8'},`<animate attributeName=\"r\" from=\"6\" to=\"26\" dur=\"0.42s\" begin=\"${d}ms\" repeatCount=\"1\"\/><animate attributeName=\"opacity\" from=\".8\" to=\"0\" dur=\"0.42s\" begin=\"${d}ms\" repeatCount=\"1\"\/>`)));\n  const t=svgEl('text',{x,y:String(Number(y)+8),fill:color,'font-size':'20','text-anchor':'middle','font-weight':'bold',opacity:'1'});t.textContent='\u2298';t.style.cssText='transition:opacity .45s';setTimeout(()=>t.style.opacity='0',650);g.appendChild(t);\n  if(label){const tl=svgEl('text',{x,y:String(Number(y)-10),fill:color,'font-size':'5','text-anchor':'middle','font-family':'monospace','letter-spacing':'1',opacity:'.75'});tl.textContent=label;tl.style.cssText='transition:opacity .45s';setTimeout(()=>tl.style.opacity='0',650);g.appendChild(tl);}\n}\nfunction exAnteWaves(tx,ty,color){\n  const g=document.getElementById('anim-g');\n  [0,180,360].forEach(d=>g.appendChild(svgEl('circle',{cx:'250',cy:'250',r:'48',fill:'none',stroke:'#10b981','stroke-width':'1.8',opacity:'.65'},`<animate attributeName=\"r\" from=\"48\" to=\"212\" dur=\"0.5s\" begin=\"${d}ms\" repeatCount=\"1\"\/><animate attributeName=\"opacity\" from=\".65\" to=\"0\" dur=\"0.5s\" begin=\"${d}ms\" repeatCount=\"1\"\/>`)));\n  const t=svgEl('text',{x:'250',y:'253',fill:'#10b981','font-size':'8','text-anchor':'middle','font-weight':'bold',opacity:'0'});t.textContent='\u2131 EX ANTE';t.style.cssText='transition:opacity .18s';g.appendChild(t);\n  setTimeout(()=>t.style.opacity='1',140);setTimeout(()=>{t.style.transition='opacity .35s';t.style.opacity='0';},500);\n  flashTCB(color);setTimeout(()=>impactAt((CX+tx)\/2,(CY+ty)\/2,color,'EX ANTE'),340);\n}\nfunction runAtk(atk){\n  clearAnim();const cwes=Array.isArray(atk.cwe)?atk.cwe:[atk.cwe];const c=atk.color;\n  const isHybrid=cwes.length>1,isExAnte=atk.stopAt==='EXANTE';\n  document.getElementById('atk-icon').textContent=atk.icon;\n  const nm=document.getElementById('atk-name');nm.textContent=atk.name;nm.style.color=c;\n  document.getElementById('atk-sub').textContent=atk.sub;\n  const latEl=document.getElementById('atk-lat');latEl.textContent=atk.lat;latEl.style.color=atk.layer.includes('TCB')?'#818cf8':'#10b981';\n  document.getElementById('atk-lay').textContent=atk.blocked+' \u00b7 '+atk.layer;\n  document.getElementById('atk-card').style.borderColor=c+'44';\n  document.getElementById('m-lat').textContent=atk.lat;document.getElementById('m-lat').style.color=atk.layer.includes('TCB')?'#818cf8':'#10b981';\n  document.getElementById('m-layer').textContent=atk.layer;\n  cwes.forEach(id=>pulseCWE(id,c));\n  if(atk.isMTD||atk.mods.includes('cms'))cmsReact('mtd',c);\n  if(atk.name.includes('DDoS')||atk.name.includes('flood'))cmsReact('ddos',c);\n  if(isExAnte){\n    cwes.forEach((cid,i)=>{const[cx,cy]=CWE_POS[cid]||[250,30];const mx=(CX+cx)\/2,my=(CY+cy)\/2;setTimeout(()=>shoot(cx,cy,mx,my,c,220,`ex-${cid}-${i}`),i*50);});\n    setTimeout(()=>{activateExAnte();const[cx,cy]=CWE_POS[cwes[0]]||[250,30];exAnteWaves(cx,cy,c);atk.mods.forEach((mid,j)=>setTimeout(()=>flashMod(mid,c),j*80));},260);\n  }else if(isHybrid){\n    if(atk.stopAt==='L1B')setTimeout(()=>{activateExAnte();activateM24();},80);else setTimeout(()=>activateM24(),80);\n    cwes.forEach((cid,i)=>{const[cx,cy]=CWE_POS[cid]||[250,30];const[wx,wy]=onRing(cx,cy,R_WALL);setTimeout(()=>shoot(cx,cy,wx,wy,c,280,`hy-${cid}-${i}`),i*80);});\n    setTimeout(()=>{flashWall(c);atk.mods.forEach((mid,j)=>setTimeout(()=>flashMod(mid,c),j*80));flashTCB(c);},480);\n  }else{\n    const[cx,cy]=CWE_POS[cwes[0]]||[250,30];const stopR=atk.stopAt==='WALL'?R_WALL:R_L1B;const[ix,iy]=onRing(cx,cy,stopR);\n    shoot(cx,cy,ix,iy,c,280,'p1');\n    if(atk.stopAt==='L1B'){activateM24();setTimeout(()=>{const w=document.getElementById('wall-ring');if(w){w.setAttribute('stroke',c);w.style.opacity='.38';setTimeout(()=>{w.setAttribute('stroke','#D97706');w.style.opacity='.22';},300);}},240);}\n    atk.mods.forEach((mid,j)=>setTimeout(()=>flashMod(mid,c),340+j*80));\n    if(atk.stopAt==='L1B')setTimeout(()=>activateExAnte(),160);\n    setTimeout(()=>flashTCB(c),370);if(atk.stopAt==='WALL')setTimeout(()=>flashWall(c),360);\n  }\n  atk.steps.forEach(s=>setTimeout(()=>solLog(s.t,s.m,s.l),s.d));\n  const impD=isExAnte?380:isHybrid?380:280;\n  setTimeout(()=>{\n    if(isExAnte)return;\n    if(isHybrid){clearAnim();cwes.slice(0,3).forEach((cid,i)=>{const[cx,cy]=CWE_POS[cid]||[250,30];const[wx,wy]=onRing(cx,cy,R_WALL);setTimeout(()=>impactAt(wx,wy,c,''),i*80);});}\n    else{clearAnim();const[cx,cy]=CWE_POS[Array.isArray(atk.cwe)?atk.cwe[0]:atk.cwe]||[250,30];const stopR=atk.stopAt==='WALL'?R_WALL:R_L1B;const[ix,iy]=onRing(cx,cy,stopR);impactAt(ix,iy,c,atk.stopAt==='L1B'&&atk.layer.includes('TCB')?'0-DAY':'BLOQU\u00c9');if(atk.stopAt==='WALL')flashWall(c);}\n    blocked++;document.getElementById('m-blocked').textContent=blocked;document.getElementById('m-blocked').style.color=c;setTimeout(()=>document.getElementById('m-blocked').style.color='#10b981',280);\n  },impD);\n  setTimeout(()=>{clearAnim();document.getElementById('atk-card').style.borderColor='rgba(255,255,255,.07)';},1100);\n}\nconst MODES={normal:NORMAL,zeroday:ZERODAY,exante:EXANTE,hybrid:HYBRID};\nconst MODE_LABELS={normal:'STD',zeroday:'0-DAY',exante:'\u2131 EX ANTE',hybrid:'IA+HUM'};\nconst MODE_COLORS={normal:'#D97706',zeroday:'#ef4444',exante:'#10b981',hybrid:'#818cf8'};\nconst BTN_MAP={normal:'norm',zeroday:'zd',exante:'exante',hybrid:'hybrid'};\nlet mode='normal',autoOn=true,simTimer=null,blocked=0,simIdx=0;\nfunction next(){if(!autoOn)return;const arr=MODES[mode];runAtk(arr[simIdx%arr.length]);simIdx++;simTimer=setTimeout(next,mode==='hybrid'?1600:1400);}\nfunction setMode(m){if(simTimer)clearTimeout(simTimer);mode=m;simIdx=0;Object.keys(BTN_MAP).forEach(k=>document.getElementById('btn-'+BTN_MAP[k]).classList.remove('active'));document.getElementById('btn-'+BTN_MAP[m]).classList.add('active');document.getElementById('m-mode').textContent=MODE_LABELS[m];document.getElementById('m-mode').style.color=MODE_COLORS[m];runAtk(MODES[m][0]);simIdx=1;autoOn=true;document.getElementById('btn-auto').classList.add('active');simTimer=setTimeout(next,mode==='hybrid'?1600:1400);}\nfunction toggleAuto(){const btn=document.getElementById('btn-auto'),dot=document.getElementById('sim-dot'),lbl=document.getElementById('sim-label');if(autoOn){autoOn=false;if(simTimer)clearTimeout(simTimer);btn.classList.remove('active');dot.style.background='#374151';dot.style.animation='none';lbl.textContent='PAUSE';lbl.style.color='#6b7280';}else{autoOn=true;btn.classList.add('active');dot.style.background='#10b981';dot.style.animation='blink 1.2s ease-in-out infinite';lbl.textContent='ACTIF';lbl.style.color='#10b981';next();}}\nfunction simReset(){if(simTimer)clearTimeout(simTimer);autoOn=false;simIdx=0;blocked=0;clearAnim();mode='normal';Object.keys(BTN_MAP).forEach(k=>document.getElementById('btn-'+BTN_MAP[k]).classList.remove('active'));document.getElementById('btn-norm').classList.add('active');document.getElementById('m-blocked').textContent='0';document.getElementById('m-mode').textContent='STD';document.getElementById('m-mode').style.color='#D97706';document.getElementById('m-lat').textContent='\u2014';document.getElementById('m-layer').textContent='\u2014';document.getElementById('atk-icon').textContent='\u23f3';document.getElementById('atk-name').textContent='R\u00e9initialis\u00e9';document.getElementById('atk-name').style.color='#6b7280';document.getElementById('sol-log').innerHTML='<div class=\"ll\"><span class=\"lt\">--:--.---<\/span><span class=\"lok\">[ OK ]<\/span><span class=\"lm\">R\u00e9initialis\u00e9 \u2014 TCB inviol\u00e9e<\/span><\/div>';autoOn=true;document.getElementById('btn-auto').classList.add('active');document.getElementById('sim-dot').style.cssText='background:#10b981;animation:blink 1.2s ease-in-out infinite';document.getElementById('sim-label').textContent='ACTIF';document.getElementById('sim-label').style.color='#10b981';setTimeout(next,500);}\nsetTimeout(next,600);\n \n\/\/ \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\n\/\/ CMS TOPOLOGY ENGINE \u2014 SVG BROWNIAN MOTION\n\/\/ \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\nconst TCX=600,TCY=260;\nfunction randIP(){return`100.${Math.floor(Math.random()*64)}.${Math.floor(Math.random()*256)}.${Math.floor(Math.random()*256)}`;}\nfunction randPort(){return 1024+Math.floor(Math.random()*63511);}\nconst NT={\n  CORE:{r:34,stroke:'#00e5ff',fill:'rgba(0,229,255,.12)',label:'CORE',sub:'CHON',color:'#00e5ff'},\n  GW:  {r:22,stroke:'#00e5ff',fill:'rgba(0,180,230,.1)',label:'GW',color:'#00e5ff'},\n  HON: {r:16,stroke:'#ff9500',fill:'rgba(255,149,0,.12)',label:'oHON',color:'#ff9500'},\n  EP:  {r:13,stroke:'rgba(0,229,255,.75)',fill:'rgba(0,140,180,.07)',label:'EP',color:'rgba(0,229,255,.75)'},\n};\nlet nodes=[],morphInterval=2000,cmsTimer=null,cmsUptime=0,cmsUptimeTimer=null,rotations=0,cmsPaused=false,animFrame=null;\nlet cemScore=66,pktsPerSec=0,lastMorphT=Date.now();\n \nfunction buildNodes(epCount){\n  epCount=epCount||parseInt(document.getElementById('nodesVal').textContent)||12;\n  nodes=[];\n  nodes.push({type:'CORE',id:'core',x:TCX,y:TCY,vx:0,vy:0,ip:randIP(),port:randPort(),links:[]});\n  [215,335,85].forEach((a,i)=>{const rad=a*Math.PI\/180,r=130+Math.random()*30;nodes.push({type:'GW',id:`gw${i}`,x:TCX+r*Math.cos(rad),y:TCY+r*Math.sin(rad)*0.85,vx:(Math.random()-.5)*.3,vy:(Math.random()-.5)*.3,ip:randIP(),port:randPort(),links:['core']});});\n  \/\/ 6 HON honeypots\n  for(let i=0;i<6;i++){const angle=(i*60+30+Math.random()*30)*Math.PI\/180,r=90+Math.random()*60;nodes.push({type:'HON',id:`hon${i}`,x:TCX+r*Math.cos(angle),y:TCY+r*Math.sin(angle)*0.85,vx:(Math.random()-.5)*.4,vy:(Math.random()-.5)*.4,ip:randIP(),port:randPort(),links:[`gw${i%3}`]});}\n  for(let i=0;i<epCount;i++){const a=(i\/epCount)*2*Math.PI-Math.PI\/2+(Math.random()-.5)*.4,r=210+Math.random()*60;nodes.push({type:'EP',id:`ep${i}`,x:TCX+r*Math.cos(a),y:TCY+r*Math.sin(a)*0.82,vx:(Math.random()-.5)*.5,vy:(Math.random()-.5)*.5,ip:randIP(),port:randPort(),links:[`gw${i%3}`]});}\n}\nconst BOUNDS={x0:60,x1:1140,y0:20,y1:500};\nfunction physicsStep(){\n  nodes.forEach(n=>{\n    if(n.type==='CORE')return;\n    const ks=n.type==='HON'?0.22:n.type==='GW'?0.14:0.28;\n    n.vx+=(Math.random()-.5)*ks; n.vy+=(Math.random()-.5)*ks;\n    const damp=n.type==='GW'?0.90:0.88; n.vx*=damp; n.vy*=damp;\n    const maxV=n.type==='EP'?2.0:1.4,speed=Math.hypot(n.vx,n.vy);\n    if(speed>maxV){n.vx=n.vx\/speed*maxV;n.vy=n.vy\/speed*maxV;}\n    n.x+=n.vx; n.y+=n.vy;\n    const nt=NT[n.type];\n    if(n.x<BOUNDS.x0+nt.r){n.x=BOUNDS.x0+nt.r;n.vx=Math.abs(n.vx)*.6;}\n    if(n.x>BOUNDS.x1-nt.r){n.x=BOUNDS.x1-nt.r;n.vx=-Math.abs(n.vx)*.6;}\n    if(n.y<BOUNDS.y0+nt.r){n.y=BOUNDS.y0+nt.r;n.vy=Math.abs(n.vy)*.6;}\n    if(n.y>BOUNDS.y1-nt.r){n.y=BOUNDS.y1-nt.r;n.vy=-Math.abs(n.vy)*.6;}\n    const home=getHome(n),dx=home.x-n.x,dy=home.y-n.y,dist=Math.hypot(dx,dy);\n    if(dist>(n.type==='EP'?180:100)){n.vx+=dx*.0008;n.vy+=dy*.0008;}\n  });\n  const core=nodes.find(n=>n.id==='core');\n  if(core){core.vx+=(Math.random()-.5)*.07;core.vy+=(Math.random()-.5)*.07;core.vx*=.96;core.vy*=.96;const sc=Math.hypot(core.vx,core.vy);if(sc>.55){core.vx=core.vx\/sc*.55;core.vy=core.vy\/sc*.55;}core.x+=core.vx;core.y+=core.vy;core.x=Math.max(TCX-60,Math.min(TCX+60,core.x));core.y=Math.max(TCY-50,Math.min(TCY+50,core.y));}\n}\nfunction getHome(n){\n  if(n.type==='GW'){const i=parseInt(n.id.replace('gw',''));const a=[215,335,85][i]*Math.PI\/180;return{x:TCX+130*Math.cos(a),y:TCY+110*Math.sin(a)};}\n  if(n.type==='HON'){const i=parseInt(n.id.replace('hon',''));const a=i*60*Math.PI\/180;return{x:TCX+110*Math.cos(a),y:TCY+90*Math.sin(a)};}\n  if(n.type==='EP'){const i=parseInt(n.id.replace('ep',''));const total=nodes.filter(x=>x.type==='EP').length;const a=(i\/total)*2*Math.PI-Math.PI\/2;return{x:TCX+220*Math.cos(a),y:TCY+180*Math.sin(a)};}\n  return{x:TCX,y:TCY};\n}\nfunction renderTopo(){\n  const linksG=document.getElementById('cms-links'),nodesG=document.getElementById('cms-nodes'),ipsG=document.getElementById('cms-ips');\n  linksG.innerHTML='';nodesG.innerHTML='';ipsG.innerHTML='';\n  const core=nodes.find(n=>n.id==='core');\n  nodes.forEach(n=>{\n    (n.links||[]).forEach(lid=>{\n      const target=lid==='core'?core:nodes.find(m=>m.id===lid);if(!target)return;\n      const line=document.createElementNS(NS,'line');\n      line.setAttribute('x1',n.x);line.setAttribute('y1',n.y);line.setAttribute('x2',target.x);line.setAttribute('y2',target.y);\n      const isHON=n.type==='HON';\n      line.setAttribute('stroke',isHON?'rgba(255,149,0,.2)':n.type==='GW'?'rgba(0,229,255,.2)':'rgba(0,180,200,.1)');\n      line.setAttribute('stroke-width',n.type==='GW'?'1.2':'0.7');\n      line.setAttribute('stroke-dasharray',n.type==='GW'?'5,8':isHON?'3,6':'3,8');\n      linksG.appendChild(line);\n      if(n.type==='GW'){const mx=(n.x+target.x)\/2,my=(n.y+target.y)\/2;const t=document.createElementNS(NS,'text');t.setAttribute('x',mx);t.setAttribute('y',my-3);t.setAttribute('text-anchor','middle');t.setAttribute('font-size','5');t.setAttribute('font-family',\"'JetBrains Mono',monospace\");t.setAttribute('fill','rgba(0,229,255,.28)');t.textContent=n.ip;ipsG.appendChild(t);}\n    });\n  });\n  ['EP','HON','GW','CORE'].forEach(type=>{\n    nodes.filter(n=>n.type===type).forEach(n=>{\n      const nt=NT[n.type],g=document.createElementNS(NS,'g');\n      const glow=document.createElementNS(NS,'circle');\n      glow.setAttribute('cx',n.x);glow.setAttribute('cy',n.y);glow.setAttribute('r',nt.r+5);glow.setAttribute('fill','none');glow.setAttribute('stroke',nt.stroke);glow.setAttribute('stroke-width','1');glow.setAttribute('opacity',n.type==='CORE'?'.35':n.type==='GW'?'.25':n.type==='HON'?'.3':'.18');g.appendChild(glow);\n      const circle=document.createElementNS(NS,'circle');circle.setAttribute('cx',n.x);circle.setAttribute('cy',n.y);circle.setAttribute('r',nt.r);circle.setAttribute('fill',nt.fill);circle.setAttribute('stroke',nt.stroke);circle.setAttribute('stroke-width',n.type==='CORE'?'2':n.type==='GW'?'1.8':'1.2');if(n.type!=='EP')circle.setAttribute('filter','url(#cglow-sm)');g.appendChild(circle);\n      const dot=document.createElementNS(NS,'circle');dot.setAttribute('cx',n.x);dot.setAttribute('cy',n.y);dot.setAttribute('r',n.type==='CORE'?10:n.type==='GW'?7:n.type==='HON'?6:5);dot.setAttribute('fill',n.type==='HON'?'#ff9500':n.type==='CORE'?'#00e5ff':'#00c8e0');dot.setAttribute('opacity',n.type==='EP'?'.7':'1');if(n.type==='CORE'||n.type==='GW')dot.setAttribute('filter','url(#cglow-sm)');g.appendChild(dot);\n      const label=document.createElementNS(NS,'text');label.setAttribute('x',n.x);label.setAttribute('y',n.y-nt.r-3);label.setAttribute('text-anchor','middle');label.setAttribute('font-size',n.type==='CORE'?'9':n.type==='GW'?'7.5':n.type==='HON'?'6.5':'6');label.setAttribute('font-family',\"'JetBrains Mono',monospace\");label.setAttribute('fill',nt.color);label.setAttribute('font-weight','bold');label.setAttribute('opacity',n.type==='EP'?'.7':'1');label.textContent=nt.label;g.appendChild(label);\n      const epIdx=n.type==='EP'?parseInt(n.id.replace('ep','')):-1;\n      if(n.type!=='EP'||epIdx%3===0){const ipT=document.createElementNS(NS,'text');ipT.setAttribute('x',n.x);ipT.setAttribute('y',n.y+nt.r+10);ipT.setAttribute('text-anchor','middle');ipT.setAttribute('font-size',n.type==='EP'?'4.5':'5.5');ipT.setAttribute('font-family',\"'JetBrains Mono',monospace\");ipT.setAttribute('fill',n.type==='HON'?'rgba(255,149,0,.55)':n.type==='CORE'?'rgba(0,229,255,.45)':'rgba(0,200,230,.4)');ipT.textContent=n.ip;g.appendChild(ipT);}\n      nodesG.appendChild(g);\n    });\n  });\n}\nfunction animLoop(){if(!cmsPaused){physicsStep();renderTopo();}animFrame=requestAnimationFrame(animLoop);}\nfunction rebuildNodes(count){buildNodes(count);}\n \n\/\/ \u2550\u2550 CMS SVG ANIMATION HELPERS \u2550\u2550\nfunction cspawnPkt(sx,sy,tx,ty,color,cb){\n  const g=document.getElementById('cms-effects');\n  const c=document.createElementNS(NS,'circle');c.setAttribute('r','4');c.setAttribute('fill',color);c.setAttribute('cx',sx);c.setAttribute('cy',sy);c.setAttribute('opacity','1');g.appendChild(c);\n  pktsPerSec++;\n  let prog=0;const speed=0.025+Math.random()*.02;\n  const tick=()=>{prog=Math.min(1,prog+speed);c.setAttribute('cx',sx+(tx-sx)*prog);c.setAttribute('cy',sy+(ty-sy)*prog);c.setAttribute('opacity',String(1-prog));if(prog>=1){c.remove();if(cb)cb();}else requestAnimationFrame(tick);};\n  requestAnimationFrame(tick);\n}\nfunction carcFlash(x,y,color,maxR){\n  const g=document.getElementById('cms-effects');\n  const c=document.createElementNS(NS,'circle');c.setAttribute('cx',x);c.setAttribute('cy',y);c.setAttribute('r','10');c.setAttribute('fill','none');c.setAttribute('stroke',color);c.setAttribute('stroke-width','1.5');c.setAttribute('opacity','.7');g.appendChild(c);\n  let r=10;const mR=maxR||100;\n  const t=()=>{r+=3;const op=Math.max(0,(mR-r)\/mR*.7);c.setAttribute('r',r);c.setAttribute('opacity',op);if(r<mR)requestAnimationFrame(t);else c.remove();};\n  requestAnimationFrame(t);\n}\nfunction cfloatLabel(x,y,text,color){\n  const g=document.getElementById('cms-labels');\n  const t=document.createElementNS(NS,'text');t.setAttribute('x',x);t.setAttribute('y',y);t.setAttribute('text-anchor','middle');t.setAttribute('fill',color);t.setAttribute('font-size','11');t.setAttribute('font-family',\"'JetBrains Mono',monospace\");t.setAttribute('font-weight','bold');t.setAttribute('opacity','.9');t.textContent=text;g.appendChild(t);\n  let vy=-0.8,op=1,cy=y;\n  const tick=()=>{cy+=vy;op=Math.max(0,op-.018);t.setAttribute('y',cy);t.setAttribute('opacity',op);if(op>0)requestAnimationFrame(tick);else t.remove();};\n  requestAnimationFrame(tick);\n}\nfunction edgePt(){\n  const W=1200,H=520,s=Math.floor(Math.random()*4);\n  if(s===0)return{x:Math.random()*W,y:0};if(s===1)return{x:W,y:Math.random()*H};\n  if(s===2)return{x:Math.random()*W,y:H};return{x:0,y:Math.random()*H};\n}\nfunction getCore(){return nodes.find(n=>n.id==='core')||{x:TCX,y:TCY};}\nfunction getGWs(){return nodes.filter(n=>n.type==='GW');}\nfunction getHONs(){return nodes.filter(n=>n.type==='HON');}\nfunction getEPs(){return nodes.filter(n=>n.type==='EP');}\nfunction ri(a,b){return Math.floor(Math.random()*(b-a+1))+a;}\nfunction rf(a,b){return Math.random()*(b-a)+a;}\n \n\/\/ Node tooltips on canvas\nconst NDESCS={CORE:'Noyau TCB \u2014 PRISM\/OMEGA\/M00 seulement',GW:'Gateway \u2014 consensus PBFT L4 \u2014 routage s\u00e9curis\u00e9',EP:'Endpoint morphique \u2014 IP+port rotatifs L7 \u2014 cible leurre',HON:'Honeypot actif \u2014 capture + empoisonne L5 \u2014 leurre adaptatif'};\nfunction showTips(types){\n  const g=document.getElementById('cms-tips');g.innerHTML='';\n  nodes.filter(n=>types.includes(n.type)).forEach(n=>{\n    const T=NT[n.type];\n    const bg=document.createElementNS(NS,'rect');const desc=NDESCS[n.type]||'';\n    const lines=[n.type+' \u2014 '+desc.split('\u2014')[0].trim(),desc.split('\u2014').slice(1).join('\u2014').trim()];\n    bg.setAttribute('x',n.x+14);bg.setAttribute('y',n.y-40);bg.setAttribute('width','155');bg.setAttribute('height','30');bg.setAttribute('fill','#000');bg.setAttribute('stroke',T.color);bg.setAttribute('stroke-width','1');bg.setAttribute('rx','2');bg.setAttribute('opacity','.92');g.appendChild(bg);\n    const ln=document.createElementNS(NS,'line');ln.setAttribute('x1',n.x);ln.setAttribute('y1',n.y);ln.setAttribute('x2',n.x+14);ln.setAttribute('y2',n.y-25);ln.setAttribute('stroke',T.color+'88');ln.setAttribute('stroke-width','.5');g.appendChild(ln);\n    const t1=document.createElementNS(NS,'text');t1.setAttribute('x',n.x+20);t1.setAttribute('y',n.y-26);t1.setAttribute('fill',T.color);t1.setAttribute('font-size','10');t1.setAttribute('font-family',\"'JetBrains Mono',monospace\");t1.setAttribute('font-weight','bold');t1.textContent=lines[0].slice(0,22);g.appendChild(t1);\n    const t2=document.createElementNS(NS,'text');t2.setAttribute('x',n.x+20);t2.setAttribute('y',n.y-14);t2.setAttribute('fill','#888');t2.setAttribute('font-size','8');t2.setAttribute('font-family',\"'JetBrains Mono',monospace\");t2.textContent=lines[1].slice(0,26);g.appendChild(t2);\n  });\n  setTimeout(()=>g.innerHTML='',3500);\n}\nlet legendIdx=0;\nconst LEG_TYPES=[['CORE'],['GW'],['EP'],['HON'],['CORE','GW','EP','HON']];\nfunction cycleLegend(){showTips(LEG_TYPES[legendIdx%LEG_TYPES.length]);legendIdx++;}\n \n\/\/ \u2550\u2550 LAYER ANIMATIONS L4\u2192L10 \u2550\u2550\nconst LCOLS={l4:'#1565c0',l5:'#1b5e20',l6:'#6a1b9a',l7:'#0d47a1',l8:'#e65100',l9:'#006064',l10:'#f57f17'};\nconst LNODES={l4:['CORE','GW'],l5:['HON','EP'],l6:['CORE','GW','EP'],l7:['GW','EP'],l8:['EP','CORE'],l9:['EP','GW'],l10:['CORE','GW','HON']};\n \nfunction animL4(){\n  const core=getCore(),gws=getGWs();\n  const p=edgePt();\n  cspawnPkt(p.x,p.y,core.x,core.y,'#f44336',()=>{\n    cfloatLabel(core.x,core.y-32,'INJECT ATTEMPT','#f44336');\n    let done=0;\n    gws.forEach((gw,i)=>setTimeout(()=>{\n      cspawnPkt(core.x,core.y,gw.x,gw.y,'#00e5ff',()=>{\n        cfloatLabel(gw.x,gw.y-22,'PREPARE','#00e5ff');\n        carcFlash(gw.x,gw.y,'#00e5ff',40);\n        cspawnPkt(gw.x,gw.y,core.x,core.y,'#10b981',()=>{done++;if(done>=gws.length){cfloatLabel(core.x,core.y-48,'\u2713 COMMIT N=4','#10b981');carcFlash(core.x,core.y,'#10b981',70);}});\n      });\n    },i*220));\n  });\n  cmsLog('ok','L4 PBFT','preprepare \u2192 prepare \u2192 commit OK (3\/4)');\n}\nfunction animL5(){\n  const hons=getHONs(),core=getCore();\n  hons.forEach((h,i)=>setTimeout(()=>{\n    carcFlash(h.x,h.y,'#ff6d00',35);cfloatLabel(h.x,h.y-24,'oHON ACTIVE','#ff6d00');\n    const p=edgePt();\n    cspawnPkt(p.x,p.y,core.x,core.y,'#ef4444',()=>{\n      cfloatLabel(core.x,core.y-24,'REDIRECT \u2192 HON','#ff9800');\n      cspawnPkt(core.x,core.y,h.x,h.y,'#ff9800',()=>{\n        cfloatLabel(h.x,h.y-36,'PROBE CAPTURED','#ff9800');carcFlash(h.x,h.y,'#10b981',30);\n        setTimeout(()=>{cspawnPkt(h.x,h.y,p.x,p.y,'#10b981');cfloatLabel(h.x,h.y-50,'POISON INJECT','#10b981');},350);\n      });\n    });\n  },i*300));\n  cmsLog('detect','L5 HON','attaquant ext\u00e9rieur \u2192 redirection honeypot \u00b7 HKDF poison');\n}\nfunction animL6(){\n  const core=getCore();const x=core.x+140;\n  [[-58,'HEAD CANARY','#ce93d8'],[-18,'ZONE LIBRE','#10b981'],[+15,'MID CANARY','#ce93d8'],[+48,'ZONE LIBRE','#10b981'],[+80,'TAIL CANARY','#ce93d8']].forEach(([dy,lbl,col],i)=>{setTimeout(()=>{cfloatLabel(x,core.y+dy,lbl,col);carcFlash(x,core.y+dy,col,20);},i*180);});\n  setTimeout(()=>{cfloatLabel(x,core.y-95,'\u2713 check_all OK','#10b981');carcFlash(x,core.y,'#10b981',70);cmsLog('ok','L6 MemGuard','head+mid+tail canaris intacts \u00b7 0 corruption');},1200);\n}\nfunction animL7(){\n  const core=getCore(),gws=getGWs();\n  getEPs().forEach((n,i)=>setTimeout(()=>{n.ip=randIP();n.port=randPort();if(i%7===0)cfloatLabel(n.x,n.y-20,'\u21ba ROTATED','#00e5ff');},i*25));\n  gws.forEach((gw,i)=>setTimeout(()=>{gw.ip=randIP();carcFlash(gw.x,gw.y,'#00bcd4',45);cfloatLabel(gw.x,gw.y-30,'chain_state \u21ba','#00bcd4');},i*280+150));\n  setTimeout(()=>{cfloatLabel(core.x,core.y-58,'COMMITMENT OK','#10b981');carcFlash(core.x,core.y,'#00e5ff',80);cmsLog('morph','L7 v8','HKDF 96B \u00b7 morph_rate=1.000 \u00b7 H1=0.000 BLOQU\u00c9');doMorph();},1500);\n}\nfunction animL8(){\n  const core=getCore(),gws=getGWs();\n  for(let i=0;i<8;i++){const p=edgePt(),t=i%3===0?core:(gws[i%gws.length]||core);setTimeout(()=>cspawnPkt(p.x,p.y,t.x,t.y,'#ef4444',()=>{cfloatLabel(t.x+rf(-25,25),t.y-24,'PERTURBED','#ff9800');carcFlash(t.x,t.y,'#ff9800',28);}),i*160);}\n  setTimeout(()=>{cfloatLabel(core.x,core.y-55,'noise=0.55','#ff9800');cfloatLabel(core.x,core.y-70,'delta=0.967','#10b981');cmsLog('ok','L8 ML','fingerprint bloqu\u00e9 \u00b7 degradation_delta=0.967 > 0.30');},1700);\n}\nfunction animL9(){\n  const core=getCore(),gws=getGWs();const p=edgePt();\n  cspawnPkt(p.x,p.y,core.x,core.y,'#ff9800');cfloatLabel((p.x+core.x)\/2,(p.y+core.y)\/2,'TIMING PROBE','#ff9800');\n  [{t:300,type:'BURST',col:'#00e5ff',dst:gws[0]||core},{t:550,type:'JITTER',col:'#26c6da',dst:gws[1]||core},{t:750,type:'SILENCE',col:'#546e7a',dst:null},{t:1000,type:'BURST',col:'#00e5ff',dst:gws[2%gws.length]||core},{t:1200,type:'DECOY',col:'#ab47bc',dst:{x:p.x,y:p.y}}].forEach(({t,type,col,dst})=>{setTimeout(()=>{if(dst)cspawnPkt(core.x,core.y,dst.x,dst.y,col);cfloatLabel(core.x+rf(-55,55),core.y-42+Math.random()*12,type,col);},t);});\n  setTimeout(()=>{cmsLog('morph','L9 HMAC-DRBG','jitter='+ri(500,8000)+'\u00b5s \u00b7 3 flux ind\u00e9p \u00b7 pred=0.194 < 0.25');},1600);\n}\nfunction animL10(){\n  const core=getCore(),gws=getGWs();\n  const cols=['#42a5f5','#66bb6a','#ffa726'];\n  gws.forEach((gw,i)=>{\n    carcFlash(gw.x,gw.y,cols[i]||'#42a5f5',32);cfloatLabel(gw.x,gw.y-30,'AGENT '+'ABC'[i],cols[i]||'#42a5f5');\n    setTimeout(()=>{const act=['ROTATE_TOPO','VARY_L9','ACTIVATE_L5','VARY_L8'][ri(0,3)];cfloatLabel(gw.x,gw.y-46,act,cols[i]||'#42a5f5');cspawnPkt(gw.x,gw.y,core.x,core.y,cols[i]||'#42a5f5');},i*380+280);\n  });\n  setTimeout(()=>{const act=['ROTATE_TOPO','VARY_L9','ACTIVATE_L5','VARY_L8'][ri(0,3)];carcFlash(core.x,core.y,'#ffc107',85);cfloatLabel(core.x,core.y-62,'DECISION: '+act,'#ffc107');cmsLog('ok','L10 argmax','HMAC-DRBG \u00b7 INV1\/2\/3\/4 PASS \u00b7 bypass=0\/300');cmsLog('ok','L10','entropy=1.92b \u00b7 dominant=0.54 \u00b7 model_resist=0.3769');},1500);\n}\nconst LANIMS={l4:animL4,l5:animL5,l6:animL6,l7:animL7,l8:animL8,l9:animL9,l10:animL10};\nfunction clickLayer(id,el){\n  el.style.borderColor=LCOLS[id]||'#00e5ff';setTimeout(()=>el.style.borderColor='',2000);\n  showTips(LNODES[id]||['CORE']);\n  if(LANIMS[id])LANIMS[id]();\n}\n \n\/\/ \u2550\u2550 ALL DEFENSES TRIGGER \u2550\u2550\nfunction allDefenses(type){\n  document.querySelectorAll('.lcard').forEach((c,i)=>setTimeout(()=>{c.style.borderColor=LCOLS['l'+(4+i)]||'#00e5ff';setTimeout(()=>c.style.borderColor='',1200);},i*100));\n  [animL4,animL5,animL6,animL7,animL8,animL9,animL10].forEach((fn,i)=>setTimeout(fn,i*300));\n  const t0=performance.now();\n  setTimeout(()=>{const ms=performance.now()-t0;const display=ms<0.1?(ms*1e6).toFixed(0)+'ns':ms<1?(ms*1000).toFixed(1)+'\u00b5s':ms.toFixed(2)+'ms';document.getElementById('ov-mttd').textContent=display;},200+Math.random()*300);\n  cemScore=Math.min(89,cemScore+2);updateCEM();\n}\n \n\/\/ \u2550\u2550 MORPH &#038; CEM \u2550\u2550\nfunction doMorph(){\n  getEPs().forEach(n=>{n.ip=randIP();n.port=randPort();});\n  nodes.forEach(n=>{if(n.type!=='CORE'){n.vx+=(Math.random()-.5)*2.8;n.vy+=(Math.random()-.5)*2.8;}});\n  rotations++;\n  document.getElementById('stat-rot').textContent=rotations;\n  document.getElementById('ov-rots').textContent=rotations;\n  lastMorphT=Date.now();\n  \/\/ L7 hash\n  const h='0123456789abcdef';let hash='';for(let i=0;i<16;i++)hash+=h[ri(0,15)];\n  document.getElementById('ov-hash').textContent=hash.slice(0,8)+'\u2026';\n  \/\/ Add to rotation history\n  const ep=getEPs()[0];if(ep)addRotEntry(ep.ip,ep.port);\n  cemScore=Math.min(89,cemScore+1);updateCEM();\n  cmsLog('ok','MORPH','Fisher-Yates IP rotate \u2192 '+(getEPs()[0]||{ip:'\u2014'}).ip+':'+randPort());\n}\nfunction updateCEM(){\n  document.getElementById('cem-v').textContent=cemScore+'\/57';\n  document.getElementById('cem-bar').style.width=Math.min(100,(cemScore\/89)*100)+'%';\n  document.getElementById('cms-cem-val').textContent=cemScore+'\/57 (+9)';\n  const eal=document.getElementById('eal-lv'),sc=document.getElementById('eal-sc');\n  if(cemScore>=79){eal.textContent='EAL7';eal.style.color='#10b981';}\n  else if(cemScore>=66){eal.textContent='EAL6+';eal.style.color='#ffc107';}\n  else{eal.textContent='EAL6';eal.style.color='#26a69a';}\n  sc.textContent=cemScore+'\/57 CEM';\n}\nfunction addRotEntry(ip,port){\n  const h=document.getElementById('rotHistory');\n  const d=document.createElement('div');d.className='rentry';\n  d.innerHTML=`<span style=\"color:rgba(0,229,255,.4)\">${tsNow()}<\/span><span style=\"color:#00e5ff\">${ip}<\/span><span style=\"color:#ffc107\">:${port}<\/span>`;\n  h.insertBefore(d,h.firstChild);while(h.children.length>20)h.removeChild(h.lastChild);\n  document.getElementById('rot-cnt').textContent=rotations;\n}\n \n\/\/ \u2550\u2550 TRAFFIC GRAPH \u2550\u2550\nlet trafData=new Array(50).fill(0);\nfunction updateTrafficGraph(v){\n  trafData.push(v);if(trafData.length>50)trafData.shift();\n  const svg=document.getElementById('trafficSvg');if(!svg)return;\n  const W=svg.clientWidth||400,H=svg.clientHeight||120;\n  const max=Math.max(...trafData,1);\n  const pts=trafData.map((d,i)=>`${(i\/49)*W},${H-(d\/max)*H*.85}`).join(' ');\n  const fill=trafData.map((d,i)=>`${(i\/49)*W},${H-(d\/max)*H*.85}`).join(' ')+` ${W},${H} 0,${H}`;\n  document.getElementById('traf-line').setAttribute('points',pts);\n  document.getElementById('traf-fill').setAttribute('points',fill);\n}\nlet lastPpsT=Date.now();\n \n\/\/ \u2550\u2550 AGENT VOTE \u2550\u2550\nconst ACTS=['ROTATE_TOPO','VARY_L9_JIT','ACTIVATE_L5','VARY_L8_NOI','INC_DECEP','NONE'];\nfunction updateAgents(){\n  if(!cmsTimer)return;\n  const ha=false;const ids=['a','b','c'];\n  const picks=ids.map(id=>{const act=ACTS[ri(0,ACTS.length-1)];const conf=ri(10,35);document.getElementById('ag-'+id).className='abox';document.getElementById('a'+id+'-act').textContent=act.replace('_',' ');document.getElementById('a'+id+'-conf').textContent='conf:'+conf+'%';return{act,conf,id};});\n  const best=picks.reduce((a,b)=>a.conf>b.conf?a:b);document.getElementById('l10-dec').textContent=best.act.replace('_',' ');document.getElementById('l10-ent').textContent='H='+(1.2+Math.random()*.8).toFixed(2)+'b';const w=document.getElementById('ag-'+best.id);if(w){w.className='abox d';setTimeout(()=>w.className='abox',700);}\n}\n \n\/\/ \u2550\u2550 CMS LOG \u2550\u2550\nfunction cmsLog(t,m,msg){\n  const cls=t==='ok'?'clok':t==='warn'?'clwn':'clcr';const lbl=t==='ok'?'[ OK ]':t==='warn'?'[ WARN ]':'[ CRIT ]';\n  const d=document.createElement('div');d.className='cll ll-new';\n  d.innerHTML=`<span class=\"clt\">${tsNow()}<\/span><span class=\"${cls}\">${lbl}<\/span><span class=\"clm\"><span class=\"clip\">${m}<\/span> \u2014 ${msg}<\/span>`;\n  d.style.borderLeft='2px solid #00e5ff';setTimeout(()=>{d.style.borderLeft='';},400);\n  const el=document.getElementById('cms-log');el.appendChild(d);while(el.children.length>80)el.removeChild(el.firstChild);el.scrollTop=el.scrollHeight;\n}\n \n\/\/ \u2550\u2550 ATTACK HANDLING \u2550\u2550\nfunction morphIPs(full){\n  const ips=nodes.map(n=>n.ip);for(let i=ips.length-1;i>0;i--){const j=Math.floor(Math.random()*(i+1));[ips[i],ips[j]]=[ips[j],ips[i]];}\n  nodes.forEach((n,i)=>{n.ip=full?randIP():ips[i];n.port=randPort();if(n.type!=='CORE'){n.vx+=(Math.random()-.5)*2.8;n.vy+=(Math.random()-.5)*2.8;}});\n  doMorph();updateExposureBars(true);\n}\nfunction updateExposureBars(m){if(m)setBars(Math.max(2,parseInt(document.getElementById('bar-ps-v').textContent)-ri(16,28)),Math.max(1,parseInt(document.getElementById('bar-bf-v').textContent)-ri(7,14)),Math.max(1,parseInt(document.getElementById('bar-rc-v').textContent)-ri(12,20)),Math.max(2,parseInt(document.getElementById('bar-dd-v').textContent)-ri(16,28)));}\nfunction setBars(ps,bf,rc,dd){[['ps',ps],['bf',bf],['rc',rc],['dd',dd]].forEach(([k,v])=>{v=Math.max(0,Math.min(100,v));document.getElementById(`bar-${k}`).style.width=v+'%';const vEl=document.getElementById(`bar-${k}-v`);vEl.textContent=v+'%';vEl.style.color=v>60?'var(--red)':v>30?'#f59e0b':'var(--green2)';document.getElementById(`bar-${k}`).style.background=v>60?'var(--red)':v>30?'#f59e0b':'var(--green2)';});}\nfunction cmsReact(type,color){\n  const hons=getHONs();\n  if(type==='mtd'||type==='recon'){setTimeout(()=>{morphIPs(false);cmsLog('warn','DETECT','Reconnaissance \u2192 Fisher-Yates \u00b7 surface fant\u00f4me');},80);}\n  else if(type==='ddos'){setBars(88,38,57,96);cmsLog('crit','DETECT','DDoS FLOOD \u2192 '+Math.floor(1.2e6+Math.random()*3e5)+' req\/s');\n    hons.forEach(h=>{const p=edgePt();cspawnPkt(p.x,p.y,h.x,h.y,'#ef4444',()=>{cfloatLabel(h.x,h.y-22,'CAPTURED','#ff9800');cspawnPkt(h.x,h.y,p.x,p.y,'#10b981');});});\n    setTimeout(()=>{morphIPs(false);cmsLog('ok','ISOLATE','Surface morph\u00e9e \u00b7 flux bloqu\u00e9');},180);setTimeout(()=>setBars(8,18,14,10),650);}\n}\nfunction cmsAttack(type,btn){\n  const labels={portscan:'PORT SCAN',brute:'BRUTEFORCE',recon:'RECONNAISSANCE',ddos:'DDoS FLOOD',apt:'APT INFILTRATION',zero:'ZERO-DAY'};\n  cmsLog('crit','ATTAQUE',labels[type]+' \u00b7 MTD r\u00e9actif \u00b7 toutes couches activ\u00e9es');\n  btn.classList.add('firing');setTimeout(()=>btn.classList.remove('firing'),700);\n  \/\/ Spawn attack packets toward HON\n  const hons=getHONs();\n  for(let j=0;j<4;j++)setTimeout(()=>{const p=edgePt(),h=hons.length?hons[ri(0,hons.length-1)]:getCore();cspawnPkt(p.x,p.y,h.x,h.y,'#ef4444',()=>{cfloatLabel(h.x,h.y-22,'TRAPPED','#ff9800');cspawnPkt(h.x,h.y,p.x,p.y,'#10b981');});},j*200);\n  if(type==='portscan')setBars(94,38,57,88);else if(type==='brute')setBars(85,88,57,88);else if(type==='recon')setBars(85,38,94,88);else if(type==='ddos')setBars(85,38,57,96);\n  \/\/ APT specific\n  if(type==='apt'){const gws=getGWs();if(gws.length>1){cspawnPkt(gws[0].x,gws[0].y,gws[1].x,gws[1].y,'#9c27b0',()=>{cfloatLabel(gws[1].x,gws[1].y-28,'LATERAL MOVE','#ef4444');carcFlash(gws[1].x,gws[1].y,'#9c27b0',35);setTimeout(()=>{cfloatLabel(gws[1].x,gws[1].y-44,'QUARANTINED','#ef4444');carcFlash(gws[1].x,gws[1].y,'#10b981',50);},600);});}document.getElementById('bar-apt').style.width='60%';document.getElementById('bar-apt-v').textContent='60%';}\n  if(type==='zero'){const core=getCore();carcFlash(core.x,core.y,'#ef4444',80);cfloatLabel(core.x,core.y-70,'ZERO-DAY STOPP\u00c9','#10b981');document.getElementById('bar-zd').style.width='70%';document.getElementById('bar-zd-v').textContent='70%';}\n  allDefenses(type);\n  setTimeout(()=>{morphIPs(type==='portscan');cmsLog('ok','NEUTRALIS\u00c9','Surface morph\u00e9e \u00b7 '+randIP()+':'+randPort()+' \u00b7 bypass=0');if(type==='recon')cmsReact('recon','#7c3aed');else if(type==='ddos')cmsReact('ddos','#0891b2');},280);\n  setTimeout(()=>{if(type==='apt'){document.getElementById('bar-apt').style.width='5%';document.getElementById('bar-apt-v').textContent='5%';}if(type==='zero'){document.getElementById('bar-zd').style.width='5%';document.getElementById('bar-zd-v').textContent='5%';}},3000);\n}\n \n\/\/ \u2550\u2550 FULL SIMULATION \u2550\u2550\nlet fullRunning=false;\nfunction fullSim(){\n  if(fullRunning)return;fullRunning=true;\n  const btn=document.getElementById('ba-full');btn.classList.add('firing');btn.textContent='\u26a1 EN COURS\u2026';\n  cmsLog('crit','SIM','\u2550\u2550\u2550 SIMULATION AI+HUMAIN D\u00c9MARR\u00c9E \u2550\u2550\u2550');\n  cmsLog('warn','SIM','S\u00e9quence: SCAN\u2192RECON\u2192BRUTE\u2192APT\u2192DDoS\u2192ZERO-DAY');\n  \/\/ Flash CBMC rapidly\n  let ci=0;const cbInt=setInterval(()=>{for(let i=0;i<3;i++){const b=document.getElementById('cbmc-'+(((ci+i)%40)+1));if(b){b.classList.add('active');setTimeout(()=>b.classList.remove('active'),350);}}ci=(ci+3)%40;},180);\n  const seq=[{t:'portscan',d:0},{t:'recon',d:2000},{t:'brute',d:3800},{t:'apt',d:5500},{t:'ddos',d:7000},{t:'zero',d:9000},{t:'portscan',d:11000},{t:'brute',d:12500}];\n  seq.forEach((a,i)=>setTimeout(()=>{\n    cmsLog('detect','\u25b6 Phase '+(i+1),a.t.toUpperCase());\n    const hons=getHONs();\n    for(let j=0;j<4;j++)setTimeout(()=>{const p=edgePt(),h=hons.length?hons[ri(0,hons.length-1)]:getCore();cspawnPkt(p.x,p.y,h.x,h.y,'#ef4444',()=>{cfloatLabel(h.x,h.y-22,'TRAPPED','#ff9800');cspawnPkt(h.x,h.y,p.x,p.y,'#10b981');});},j*180);\n    allDefenses(a.t);\n    \/\/ Update agents during sim\n    document.querySelectorAll('.abox').forEach(b=>b.classList.add('v'));setTimeout(()=>document.querySelectorAll('.abox').forEach(b=>b.classList.remove('v')),800);\n  },a.d));\n  setTimeout(()=>{\n    clearInterval(cbInt);fullRunning=false;btn.classList.remove('firing');btn.textContent='\u26a1 SIMULATION AI+HUMAIN';\n    cmsLog('ok','SIM','\u2550\u2550\u2550 SIMULATION TERMIN\u00c9E \u2550\u2550\u2550');cmsLog('ok','SIM','8\/8 attaques neutralis\u00e9es \u00b7 bypass=0\/300');cmsLog('ok','SIM','CEM BRUT 66\/57 (+9) \u00b7 VUL-009-012 NON EXPLOIT');\n    carcFlash(getCore().x,getCore().y,'#10b981',130);cfloatLabel(getCore().x,getCore().y-95,'SYST\u00c8ME INVAINCU','#10b981');\n    cemScore=79;updateCEM();\n  },14500);\n}\nfunction triggerFullMorph(){morphIPs(true);nodes.forEach(n=>{if(n.type!=='CORE'){n.vx+=(Math.random()-.5)*5.5;n.vy+=(Math.random()-.5)*5.5;}});cmsLog('warn','FULL MORPH','Surface compl\u00e8te \u00b7 toutes IPs r\u00e9g\u00e9n\u00e9r\u00e9es \u00b7 burst cin\u00e9tique');}\nfunction updateThreat(v){const labels={1:'LOW',2:'MEDIUM',3:'HIGH',4:'CRITICAL'};const colors={1:'#10b981',2:'#f59e0b',3:'#f97316',4:'#ef4444'};const el=document.getElementById('threatVal');el.textContent=labels[v];el.style.color=colors[v];const s=document.getElementById('stat-threat');if(s){s.textContent=labels[v];s.className='cms-kv-val '+( parseInt(v)>2?'crit':'warn');}}\n \n\/\/ \u2550\u2550 SIM LIFECYCLE \u2550\u2550\nfunction startCmsSim(){\n  if(cmsTimer)clearInterval(cmsTimer);buildNodes();cmsPaused=false;\n  document.getElementById('cms-pause-btn').textContent='\u23f8 PAUSE';\n  if(animFrame)cancelAnimationFrame(animFrame);animLoop();\n  cmsLog('ok','INIT','CMS MORPHIC SHIELD\u2122 v8.0 \u2014 brownian MTD actif \u00b7 6 oHON \u00b7 CBMC 60\/60');\n  cmsTimer=setInterval(()=>{if(!cmsPaused){morphIPs(false);updateAgents();}},morphInterval);\n  if(cmsUptimeTimer)clearInterval(cmsUptimeTimer);cmsUptime=0;\n  cmsUptimeTimer=setInterval(()=>{cmsUptime++;const h=String(Math.floor(cmsUptime\/3600)).padStart(2,'0'),m=String(Math.floor((cmsUptime%3600)\/60)).padStart(2,'0'),s=String(cmsUptime%60).padStart(2,'0');document.getElementById('stat-uptime').textContent=`${h}:${m}:${s}`;\n    \/\/ Countdown\n    const cd=Math.max(0,morphInterval\/1000-(Date.now()-lastMorphT)\/1000);document.getElementById('ov-cd').textContent=cd.toFixed(0)+'s';\n    \/\/ PPS\n    const now2=Date.now();if(now2-lastPpsT>=1000){document.getElementById('pps-v').textContent=pktsPerSec+' p\/s';updateTrafficGraph(pktsPerSec);pktsPerSec=0;lastPpsT=now2;}\n    \/\/ L7\/L9 stats\n    document.getElementById('l7stat').textContent='morph '+(0.995+Math.random()*.005).toFixed(3);\n    document.getElementById('l9stat').textContent='pred '+(0.17+Math.random()*.06).toFixed(3);\n  },1000);\n}\nfunction resetCmsSim(){if(cmsTimer)clearInterval(cmsTimer);if(cmsUptimeTimer)clearInterval(cmsUptimeTimer);cmsUptime=0;rotations=0;cemScore=66;document.getElementById('stat-uptime').textContent='00:00:00';document.getElementById('stat-rot').textContent='0';document.getElementById('ov-rots').textContent='0';setBars(85,38,57,88);document.getElementById('cms-log').innerHTML='<div class=\"cll\"><span class=\"clt\">--:--.---<\/span><span class=\"clok\">[ OK ]<\/span><span class=\"clm\">CMS r\u00e9initialis\u00e9<\/span><\/div>';document.getElementById('rotHistory').innerHTML='';buildNodes();updateCEM();}\nfunction pauseCmsSim(){cmsPaused=!cmsPaused;document.getElementById('cms-pause-btn').textContent=cmsPaused?'\u25b6 RESUME':'\u23f8 PAUSE';cmsLog('ok',cmsPaused?'PAUSE':'RESUME',cmsPaused?'Simulation suspendue':'Reprise');}\n \n\/\/ \u2550\u2550 CBMC GRID \u2550\u2550\nfunction buildCBMC(){\n  const grid=document.getElementById('cbmc-grid');grid.innerHTML='';\n  const labels=['P01 SHA256','P02 HMAC','P03 FSM','P04 FAIL-CL','P05 RING+','P06 RING-','P07 RFC6598','P08 PORT','P09 LRU','P10 SEG','P11 CHAIN','P12 LEDGER','P13 ROUTES','P14 FIREWALL','P15 NAT','P16 SESSION','P17 ENCRYPT','P18 SCORE','P19 ISO','P20 SCHED','P21 PRIO','P22 SDQ','P23 RISK','P24 CONSIST','P25 MORPH','P26 FISHER','P27 MICROFLX','P28 ZEROTRUST','P29 DECOY','P30 QUARANT','P31 BLOCKED','P32 RECORDS','P33 EXMA','P34 GOV','P35 FORENSIC','P36 LOGSEQ','P37 ROTATE','P38 COLLECT','P39 HEALTH','P40 PACKET'];\n  labels.forEach((l,i)=>{const b=document.createElement('div');b.className='cbmc-badge pass';b.id=`cbmc-${i+1}`;b.textContent=l;b.title=l+' \u2014 PASS';grid.appendChild(b);});\n}\nfunction animateCBMC(){const badges=document.querySelectorAll('.cbmc-badge');if(!badges.length)return;const idx=Math.floor(Math.random()*badges.length);badges[idx].classList.add('active');setTimeout(()=>badges[idx].classList.remove('active'),380);}\n \n\/\/ \u2550\u2550 BOOT \u2550\u2550\nbuildCBMC();buildNodes();\nsetTimeout(()=>startCmsSim(),200);\nsetInterval(animateCBMC,160);\n<\/script>\n \n \n<!-- \u2550\u2550 OVERLAYS CMS \u2014 EN BAS \u2550\u2550 -->\n<div id=\"cms-overlay-row\" style=\"background:#0d1a30;border-top:1px solid rgba(0,229,255,.12);display:flex;flex-wrap:nowrap;gap:0;font-family:'JetBrains Mono',monospace;width:100%;box-sizing:border-box\">\n \n  <!-- SCORE CEM BRUT -->\n  <div style=\"background:#0d1a30;border:1px solid rgba(0,51,64,.8);border-top:none;border-left:none;padding:8px 14px;flex:1;min-width:180px\">\n    <div style=\"color:#00e5ff;font-size:9px;opacity:.5;letter-spacing:1px;margin-bottom:4px\">SCORE CEM BRUT<\/div>\n    <div style=\"display:flex;justify-content:space-between;font-size:9px;margin-bottom:3px\">\n      <span id=\"cem-v2\" style=\"color:#ffc107;font-weight:bold\">66\/57<\/span>\n      <span style=\"color:#10b981;font-size:8px\">marge +35<\/span>\n    <\/div>\n    <div style=\"height:3px;background:#0a2030;border-radius:2px\">\n      <div id=\"cem-bar2\" style=\"height:100%;width:66%;background:linear-gradient(90deg,#00e5ff,#ffc107);border-radius:2px;transition:width .8s\"><\/div>\n    <\/div>\n    <div style=\"display:flex;justify-content:space-between;font-size:7px;color:#333;margin-top:2px\">\n      <span>0<\/span><span style=\"color:#10b981\">31\u2713<\/span><span>57<\/span><span>79<\/span>\n    <\/div>\n  <\/div>\n \n  <!-- HOT PATH \/ MTTD \/ ROTATIONS -->\n  <div style=\"background:#0d1a30;border:1px solid rgba(0,51,64,.8);border-top:none;border-left:none;padding:8px 14px;flex:1;min-width:180px\">\n    <div style=\"color:rgba(0,229,255,.4);font-size:8px;letter-spacing:1px;margin-bottom:4px\">M\u00c9TRIQUES RUNTIME<\/div>\n    <div style=\"display:flex;justify-content:space-between;margin:2px 0;font-size:9px\"><span style=\"opacity:.5\">HOT PATH<\/span><span style=\"color:#00e5ff;font-weight:bold\">2,97 ns<\/span><\/div>\n    <div style=\"display:flex;justify-content:space-between;margin:2px 0;font-size:9px\"><span style=\"opacity:.5\">MTTD LIVE<\/span><span id=\"ov-mttd2\" style=\"color:#00e5ff;font-weight:bold\">\u2014 ns<\/span><\/div>\n    <div style=\"display:flex;justify-content:space-between;margin:2px 0;font-size:9px\"><span style=\"opacity:.5\">ROTATIONS<\/span><span id=\"ov-rots2\" style=\"color:#00e5ff;font-weight:bold\">0<\/span><\/div>\n    <div style=\"display:flex;justify-content:space-between;margin:2px 0;font-size:9px\"><span style=\"opacity:.5\">MORPH DANS<\/span><span id=\"ov-cd2\" style=\"color:#00e5ff;font-weight:bold\">\u2014s<\/span><\/div>\n    <div style=\"display:flex;justify-content:space-between;margin:2px 0;font-size:9px\"><span style=\"opacity:.5\">COMMIT L7<\/span><span id=\"ov-hash2\" style=\"color:#00e5ff;font-weight:bold;font-size:8px\">\u2014<\/span><\/div>\n  <\/div>\n \n  <!-- L\u00c9GENDE -->\n  <div style=\"background:#0d1a30;border:1px solid rgba(0,51,64,.8);border-top:none;border-left:none;padding:8px 14px;flex:1;min-width:180px;cursor:pointer\" onclick=\"cycleLegend()\">\n    <div style=\"color:#00e5ff;opacity:.5;font-size:8px;letter-spacing:1px;margin-bottom:4px\">\/\/ L\u00c9GENDE (cliquer)<\/div>\n    <div style=\"color:#ff9800;font-size:9px;margin:1px 0\">\u2b24 CORE \u2014 Noyau TCB (PRISM\/OMEGA)<\/div>\n    <div style=\"color:#26a69a;font-size:9px;margin:1px 0\">\u2b24 GW \u2014 Gateway consensus PBFT<\/div>\n    <div style=\"color:#00e5ff;font-size:9px;margin:1px 0\">\u2b24 EP \u2014 Endpoint IP\/port rotatifs<\/div>\n    <div style=\"color:#ff6d00;font-size:9px;margin:1px 0\">\u2b24 oHON \u2014 Honeypot actif L5<\/div>\n  <\/div>\n \n  <!-- NIVEAU EAL -->\n  <div id=\"eal-badge2\" style=\"background:#0d1a30;border:1px solid #26a69a;border-top:none;border-right:none;padding:8px 18px;text-align:center;flex:0 0 auto;min-width:100px\">\n    <div style=\"color:#26a69a;font-size:8px;letter-spacing:2px;margin-bottom:4px\">NIVEAU<\/div>\n    <div id=\"eal-lv2\" style=\"color:#ffc107;font-size:22px;font-weight:bold;letter-spacing:2px;line-height:1\">EAL6+<\/div>\n    <div id=\"eal-sc2\" style=\"color:#10b981;font-size:9px;margin-top:4px\">57\/57 CEM<\/div>\n  <\/div>\n \n<\/div>\n \n<script>\n\/\/ Sync bottom overlays with top ones\nsetInterval(()=>{\n  const v=document.getElementById('cem-v');if(v&&document.getElementById('cem-v2'))document.getElementById('cem-v2').textContent=v.textContent;\n  const b=document.getElementById('cem-bar');if(b&&document.getElementById('cem-bar2'))document.getElementById('cem-bar2').style.width=b.style.width;\n  const r=document.getElementById('ov-rots');if(r&&document.getElementById('ov-rots2'))document.getElementById('ov-rots2').textContent=r.textContent;\n  const m=document.getElementById('ov-mttd');if(m&&document.getElementById('ov-mttd2'))document.getElementById('ov-mttd2').textContent=m.textContent;\n  const cd=document.getElementById('ov-cd');if(cd&&document.getElementById('ov-cd2'))document.getElementById('ov-cd2').textContent=cd.textContent;\n  const h=document.getElementById('ov-hash');if(h&&document.getElementById('ov-hash2'))document.getElementById('ov-hash2').textContent=h.textContent;\n  const el=document.getElementById('eal-lv');if(el&&document.getElementById('eal-lv2')){document.getElementById('eal-lv2').textContent=el.textContent;document.getElementById('eal-lv2').style.color=el.style.color;}\n  const es=document.getElementById('eal-sc');if(es&&document.getElementById('eal-sc2'))document.getElementById('eal-sc2').textContent=es.textContent;\n},500);\n<\/script>\n<\/body>\n<\/html>\n\n\n\n\n\n<!DOCTYPE html>\n<html lang=\"fr\">\n<head>\n<meta charset=\"UTF-8\">\n<meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n<title>CORTEX ORIGIN\u2122 \u2014 Architecture IA Souveraine Formellement V\u00e9rifi\u00e9e<\/title>\n<style>\n:root {\n  --bg:    #f5f4f1;\n  --bg2:   #ffffff;\n  --bg3:   #f0eeeb;\n  --bg4:   #e8e6e1;\n  --text:  #1a1a18;\n  --text2: #6b6966;\n  --text3: #9e9b98;\n  --border: rgba(0,0,0,0.08);\n  --borderem: rgba(0,0,0,0.18);\n  --tcb:   #534AB7;\n  --tcb-bg:#EEEDFE;\n  --tcb-lt:#7B74D4;\n  --sec:   #0F6E56;\n  --sec-bg:#E1F5EE;\n  --safe:  #1a7a4a;\n  --warn:  #854F0B;\n  --crit:  #993C1D;\n  --gold:  #8B6914;\n  --r: 8px; --r-sm: 5px;\n  --font-mono: 'JetBrains Mono', 'Fira Code', ui-monospace, monospace;\n  --font-serif: Georgia, 'Times New Roman', serif;\n}\n*,*::before,*::after{box-sizing:border-box;margin:0;padding:0}\nhtml{scroll-behavior:smooth}\nbody{background:var(--bg);color:var(--text);font-family:var(--font-serif);font-size:15px;line-height:1.6;-webkit-font-smoothing:antialiased;overflow-x:hidden}\n \n\/* \u2500\u2500 NAV \u2500\u2500 *\/\nnav{position:fixed;top:0;left:0;right:0;z-index:200;height:58px;display:flex;align-items:center;justify-content:space-between;padding:0 3rem;background:rgba(245,244,241,0.92);backdrop-filter:blur(16px);border-bottom:.5px solid var(--border)}\n.nav-logo{display:flex;align-items:center;gap:10px;text-decoration:none;font-size:.85rem;color:var(--text)}\n.nav-logo strong{font-weight:700;letter-spacing:-.01em}\n.nav-logo .sup{font-size:.55em;vertical-align:super;color:var(--text3);font-weight:400}\n.nav-logo .badge{font-family:var(--font-mono);font-size:.5rem;letter-spacing:.1em;padding:2px 7px;background:var(--tcb-bg);color:var(--tcb);border-radius:3px;font-weight:700}\n.nav-links{display:flex;gap:2rem;list-style:none}\n.nav-links a{font-family:var(--font-mono);font-size:.58rem;letter-spacing:.12em;text-transform:uppercase;color:var(--text2);text-decoration:none;transition:color .2s}\n.nav-links a:hover{color:var(--text)}\n.nav-cta{font-family:var(--font-mono);font-size:.58rem;letter-spacing:.14em;text-transform:uppercase;padding:8px 20px;background:var(--tcb);color:#fff;text-decoration:none;border-radius:3px;transition:background .2s}\n.nav-cta:hover{background:var(--tcb-lt)}\n \n\/* \u2500\u2500 HERO \u2500\u2500 *\/\n.hero{min-height:100vh;padding:100px 3rem 80px;display:grid;grid-template-columns:1fr 1fr;gap:5rem;align-items:center;position:relative;overflow:hidden}\n.hero-bg{position:absolute;inset:0;pointer-events:none;z-index:0}\n.hero-bg::before{content:'';position:absolute;inset:0;background:repeating-linear-gradient(0deg,transparent,transparent 39px,rgba(83,74,183,.025) 40px),repeating-linear-gradient(90deg,transparent,transparent 39px,rgba(83,74,183,.025) 40px)}\n.hero-glow{position:absolute;width:700px;height:500px;border-radius:50%;background:radial-gradient(ellipse,rgba(83,74,183,.07) 0%,transparent 65%);top:-100px;right:-150px;filter:blur(60px)}\n \n.hero-left{position:relative;z-index:1}\n.eyebrow{display:inline-flex;align-items:center;gap:8px;font-family:var(--font-mono);font-size:.52rem;letter-spacing:.22em;text-transform:uppercase;color:var(--tcb);border:.5px solid rgba(83,74,183,.25);padding:5px 14px;border-radius:3px;margin-bottom:2.2rem;opacity:0;animation:fu .5s ease both .1s}\n.eyebrow::before{content:'';width:5px;height:5px;border-radius:50%;background:var(--sec);box-shadow:0 0 6px var(--sec);animation:blink 2s ease-in-out infinite}\n@keyframes blink{0%,100%{opacity:1}50%{opacity:.25}}\n \n.hero-title{font-size:clamp(3rem,5.5vw,6rem);font-weight:400;line-height:.9;letter-spacing:-.025em;margin-bottom:1.6rem;opacity:0;animation:fu .6s ease both .2s}\n.hero-title em{font-style:italic;color:var(--tcb)}\n.hero-title .sub{display:block;font-size:.38em;color:var(--text2);font-weight:400;letter-spacing:0;margin-top:.4rem;line-height:1.4}\n \n.hero-desc{font-size:.95rem;color:var(--text2);line-height:1.85;max-width:480px;margin-bottom:2.2rem;padding-left:1.2rem;border-left:2px solid rgba(83,74,183,.25);opacity:0;animation:fu .6s ease both .35s}\n.hero-desc strong{color:var(--text);font-weight:600}\n \n\/* \u2500\u2500 M\u00c9TRIQUES HERO \u2500\u2500 *\/\n.hero-metrics{display:grid;grid-template-columns:repeat(3,1fr);gap:1px;background:var(--border);margin-bottom:2.2rem;opacity:0;animation:fu .6s ease both .5s}\n.hm{background:var(--bg2);padding:.9rem 1rem;border-bottom:2px solid transparent;transition:border-color .25s}\n.hm:hover{border-color:var(--tcb)}\n.hm-v{font-size:1.7rem;font-style:italic;font-family:var(--font-serif);color:var(--text);line-height:1}\n.hm-v sup{font-size:.42em;font-style:normal;color:var(--tcb);vertical-align:super}\n.hm-l{font-family:var(--font-mono);font-size:.5rem;color:var(--text3);letter-spacing:.05em;margin-top:.3rem;line-height:1.5}\n \n\/* \u2500\u2500 CTA \u2500\u2500 *\/\n.hero-cta{display:flex;gap:.8rem;flex-wrap:wrap;margin-bottom:1.2rem;opacity:0;animation:fu .6s ease both .65s}\n.btn-primary{font-family:var(--font-mono);font-size:.64rem;letter-spacing:.16em;text-transform:uppercase;padding:14px 36px;background:var(--tcb);color:#fff;text-decoration:none;border:none;cursor:pointer;display:inline-flex;align-items:center;gap:10px;transition:background .2s,transform .15s;border-radius:3px}\n.btn-primary:hover{background:var(--tcb-lt);transform:translateY(-1px)}\n.btn-sec{font-family:var(--font-mono);font-size:.64rem;letter-spacing:.16em;text-transform:uppercase;padding:13px 28px;color:var(--tcb);background:transparent;border:.5px solid rgba(83,74,183,.4);text-decoration:none;cursor:pointer;display:inline-flex;align-items:center;gap:8px;transition:all .2s;border-radius:3px}\n.btn-sec:hover{background:var(--tcb-bg);border-color:var(--tcb)}\n.hero-note{font-family:var(--font-mono);font-size:.52rem;color:var(--text3);letter-spacing:.1em;opacity:0;animation:fu .6s ease both .8s}\n.hero-note span+span::before{content:' \u00b7 '}\n \n\/* \u2500\u2500 HERO DROITE : TERMINAL \u2500\u2500 *\/\n.hero-right{position:relative;z-index:1;opacity:0;animation:fu .8s ease both .45s}\n.terminal{background:var(--bg2);border:.5px solid var(--borderem);border-radius:var(--r);overflow:hidden;box-shadow:0 1px 3px rgba(0,0,0,.05),0 20px 60px rgba(0,0,0,.08)}\n.term-bar{display:flex;align-items:center;justify-content:space-between;padding:.7rem 1.2rem;border-bottom:.5px solid var(--border);background:var(--bg3)}\n.term-dots{display:flex;gap:5px}\n.td{width:9px;height:9px;border-radius:50%}\n.td-r{background:#ff6059}.td-y{background:#ffbe2e}.td-g{background:#28c940}\n.term-label{font-family:var(--font-mono);font-size:.48rem;letter-spacing:.18em;text-transform:uppercase;color:var(--text3)}\n.term-live{display:flex;align-items:center;gap:5px;font-family:var(--font-mono);font-size:.48rem;color:var(--sec)}\n.live-dot{width:5px;height:5px;border-radius:50%;background:var(--sec);animation:blink 1.8s ease-in-out infinite}\n.term-body{padding:1rem 1.2rem;font-family:var(--font-mono);font-size:.6rem;line-height:1.95;max-height:300px;overflow:hidden;position:relative}\n.term-body::after{content:'';position:absolute;bottom:0;left:0;right:0;height:40px;background:linear-gradient(transparent,var(--bg2))}\n.tl{display:flex;gap:.7rem}\n.tt{color:var(--text3);width:72px;flex-shrink:0;font-size:.56rem}\n.tok{color:var(--sec);width:52px;flex-shrink:0}\n.twn{color:var(--warn);width:52px;flex-shrink:0}\n.tcr{color:var(--crit);width:52px;flex-shrink:0}\n.tm{color:var(--text2);flex:1}\n.tip{color:var(--tcb);font-weight:700}\n.tl-new{animation:lineIn .2s ease}\n@keyframes lineIn{from{opacity:0}to{opacity:1}}\n.term-stats{display:grid;grid-template-columns:repeat(3,1fr);border-top:.5px solid var(--border)}\n.ts{padding:.7rem .9rem;text-align:center;border-right:.5px solid var(--border)}\n.ts:last-child{border-right:none}\n.ts-v{font-family:var(--font-serif);font-size:1.05rem;font-style:italic;color:var(--text)}\n.ts-l{font-family:var(--font-mono);font-size:.44rem;letter-spacing:.1em;text-transform:uppercase;color:var(--text3);margin-top:2px}\n \n\/* \u2500\u2500 S\u00c9PARATEUR \u2500\u2500 *\/\n.sep{width:1px;height:60px;background:linear-gradient(var(--border),transparent);margin:0 auto}\n \n\/* \u2500\u2500 SECTIONS \u2500\u2500 *\/\nsection{padding:90px 3rem;position:relative}\n.s-lbl{font-family:var(--font-mono);font-size:.54rem;letter-spacing:.28em;text-transform:uppercase;color:var(--tcb);margin-bottom:1.2rem}\n.s-ttl{font-size:clamp(2rem,3.5vw,2.8rem);font-weight:400;line-height:1.1;letter-spacing:-.015em;margin-bottom:1.1rem}\n.s-ttl em{font-style:italic;color:var(--tcb)}\n.s-dsc{font-size:.88rem;color:var(--text2);max-width:520px;line-height:1.9;margin-bottom:3rem}\n \n\/* \u2500\u2500 PROOF SECTION \u2500\u2500 *\/\n.proof-wrap{background:var(--bg2);border-top:.5px solid var(--border);border-bottom:.5px solid var(--border)}\n.proof-grid{display:grid;grid-template-columns:repeat(4,1fr);gap:1px;background:var(--border);margin-bottom:3rem}\n.proof-card{background:var(--bg2);padding:2rem 1.6rem}\n.proof-score{font-size:2.8rem;font-style:italic;font-family:var(--font-serif);color:var(--tcb);line-height:1}\n.proof-score sup{font-size:.35em;font-style:normal;color:var(--text3)}\n.proof-name{font-size:.8rem;font-weight:700;margin:.5rem 0 .25rem;color:var(--text)}\n.proof-sub{font-family:var(--font-mono);font-size:.52rem;color:var(--text3);line-height:1.6}\n.proof-badge{display:inline-flex;align-items:center;gap:5px;margin-top:.8rem;font-family:var(--font-mono);font-size:.48rem;letter-spacing:.08em;text-transform:uppercase;padding:3px 8px;border-radius:3px;background:var(--sec-bg);color:var(--sec)}\n \n\/* \u2500\u2500 STACK ARCH \u2500\u2500 *\/\n.arch-wrap{display:grid;grid-template-columns:1fr 1fr;gap:6rem;align-items:start}\n.arch-stack{display:flex;flex-direction:column;gap:1px}\n.arch-row{display:flex;align-items:center;gap:1.2rem;padding:1rem 1.2rem;background:var(--bg2);border:.5px solid var(--border);transition:border-color .2s,background .2s;cursor:default}\n.arch-row:hover{border-color:var(--tcb);background:var(--tcb-bg)}\n.arch-row+.arch-row{margin-top:-1px}\n.ar-idx{font-family:var(--font-mono);font-size:.48rem;color:var(--text3);width:18px;text-align:right;flex-shrink:0}\n.ar-dot{width:6px;height:6px;border-radius:50%;flex-shrink:0}\n.ar-name{font-family:var(--font-serif);font-size:.85rem;color:var(--text);flex:1}\n.ar-tag{font-family:var(--font-mono);font-size:.46rem;letter-spacing:.1em;text-transform:uppercase;padding:2px 8px;border:.5px solid;border-radius:2px;flex-shrink:0}\n.tag-tcb{color:var(--tcb);border-color:rgba(83,74,183,.35)}\n.tag-ok{color:var(--sec);border-color:rgba(15,110,86,.3)}\n.tag-warn{color:var(--warn);border-color:rgba(133,79,11,.3)}\n \n.arch-info h3{font-size:1.8rem;font-weight:400;line-height:1.2;margin-bottom:1.2rem}\n.arch-info h3 em{font-style:italic;color:var(--tcb)}\n.arch-info p{font-size:.88rem;color:var(--text2);line-height:1.9;margin-bottom:2rem}\n.spec-table{display:flex;flex-direction:column}\n.spec-row{display:flex;gap:1.5rem;align-items:baseline;padding:.65rem 0;border-bottom:.5px solid var(--border)}\n.spec-row:last-child{border-bottom:none}\n.spec-k{font-family:var(--font-mono);font-size:.57rem;color:var(--text3);width:160px;flex-shrink:0}\n.spec-v{font-family:var(--font-serif);font-size:.88rem;color:var(--text2)}\n.spec-v em{font-style:italic;color:var(--tcb)}\n \n\/* \u2500\u2500 D\u00c9MO \u2500\u2500 *\/\n.demo-wrap{background:var(--bg2);border-top:.5px solid var(--border);border-bottom:.5px solid var(--border)}\n.demo-head{display:flex;align-items:flex-end;justify-content:space-between;margin-bottom:2rem;flex-wrap:wrap;gap:1rem}\n.demo-controls{display:flex;gap:.5rem;flex-wrap:wrap}\n.demo-btn{font-family:var(--font-mono);font-size:.52rem;letter-spacing:.1em;text-transform:uppercase;padding:7px 14px;border:.5px solid var(--border);background:var(--bg3);color:var(--text2);cursor:pointer;border-radius:3px;transition:all .2s}\n.demo-btn:hover,.demo-btn.active{background:var(--tcb-bg);color:var(--tcb);border-color:rgba(83,74,183,.35)}\n.demo-btn-crit.active{background:#FDF0EE;color:var(--crit);border-color:rgba(153,60,29,.35)}\n.demo-btn-warn.active{background:#FDF6E8;color:var(--warn);border-color:rgba(133,79,11,.3)}\n.demo-btn-blue.active{background:#EEF5FD;color:#1a5fa0;border-color:rgba(26,95,160,.3)}\n.demo-reset{color:var(--text3);border-color:var(--border)}\n.demo-layout{display:grid;grid-template-columns:1fr 320px;gap:1.5rem}\n.demo-dashboard{background:var(--bg2);border:.5px solid var(--borderem);border-radius:var(--r);padding:1.4rem;min-height:380px}\n.dash-top{display:flex;justify-content:space-between;align-items:center;margin-bottom:1.2rem}\n.dash-title{font-family:var(--font-mono);font-size:.5rem;letter-spacing:.2em;text-transform:uppercase;color:var(--text3)}\n.dash-status{display:flex;align-items:center;gap:6px;font-family:var(--font-mono);font-size:.5rem}\n.status-dot{width:5px;height:5px;border-radius:50%;animation:blink 1.8s ease-in-out infinite}\n.threat-map{width:100%;height:180px;border:.5px solid var(--border);border-radius:var(--r-sm);background:var(--bg3);position:relative;margin-bottom:1.2rem;overflow:hidden}\n.threat-map::before{content:'CARTE DES MODULES ACTIFS';position:absolute;top:6px;left:10px;font-family:var(--font-mono);font-size:.44rem;letter-spacing:.14em;color:var(--text3)}\n.dash-metrics{display:grid;grid-template-columns:repeat(4,1fr);gap:1px;background:var(--border);margin-bottom:1.2rem}\n.dm{background:var(--bg2);padding:.8rem .9rem}\n.dm-lbl{font-family:var(--font-mono);font-size:.44rem;letter-spacing:.1em;text-transform:uppercase;color:var(--text3);margin-bottom:.35rem}\n.dm-val{font-family:var(--font-serif);font-size:1.3rem;font-style:italic;line-height:1}\n.dm-sub{font-family:var(--font-mono);font-size:.44rem;color:var(--text3);margin-top:.2rem}\n.alert-bar{padding:.6rem 1rem;font-family:var(--font-mono);font-size:.57rem;border:.5px solid;border-radius:var(--r-sm);display:none;align-items:center;gap:.7rem;animation:slideIn .3s ease;margin-bottom:.8rem;line-height:1.5}\n.alert-bar.show{display:flex}\n.alert-crit{background:#FDF0EE;border-color:rgba(153,60,29,.4);color:var(--crit)}\n.alert-warn{background:#FDF6E8;border-color:rgba(133,79,11,.35);color:var(--warn)}\n.alert-ok{background:var(--sec-bg);border-color:rgba(15,110,86,.35);color:var(--sec)}\n@keyframes slideIn{from{opacity:0;transform:translateY(-5px)}to{opacity:1;transform:translateY(0)}}\n.console{background:var(--bg3);border:.5px solid var(--border);border-radius:var(--r);padding:1rem 1.2rem;height:380px;overflow-y:auto;font-family:var(--font-mono);font-size:.58rem;line-height:1.9;scroll-behavior:smooth}\n.console::-webkit-scrollbar{width:3px}\n.console::-webkit-scrollbar-thumb{background:var(--border)}\n.console-title{font-size:.44rem;letter-spacing:.2em;text-transform:uppercase;color:var(--text3);margin-bottom:.7rem;border-bottom:.5px solid var(--border);padding-bottom:.5rem}\n.ll{display:flex;gap:.8rem}\n.lt{color:var(--text3);width:68px;flex-shrink:0;font-size:.52rem}\n.lok{color:var(--sec);width:52px;flex-shrink:0}\n.lwn{color:var(--warn);width:52px;flex-shrink:0}\n.lcr{color:var(--crit);width:52px;flex-shrink:0}\n.lm{color:var(--text2);flex:1}\n.lip{color:var(--tcb);font-weight:700}\n.ll-new{animation:lineIn .2s ease}\n \n\/* \u2500\u2500 CWE MINI GRID \u2500\u2500 *\/\n.cwe-mini{display:grid;grid-template-columns:repeat(5,1fr);gap:8px;margin-top:2rem}\n.cwe-chip{background:var(--bg2);border:.5px solid var(--border);border-radius:var(--r-sm);padding:8px 10px;transition:border-color .2s}\n.cwe-chip:hover{border-color:var(--tcb)}\n.cwe-id{font-family:var(--font-mono);font-size:.5rem;font-weight:700;color:var(--tcb);margin-bottom:3px}\n.cwe-desc{font-family:var(--font-mono);font-size:.46rem;color:var(--text3);line-height:1.4}\n.cwe-cover{font-family:var(--font-mono);font-size:.44rem;margin-top:4px;padding:2px 5px;border-radius:2px;display:inline-block}\n.cover-k{background:var(--tcb-bg);color:var(--tcb)}\n.cover-m{background:var(--sec-bg);color:var(--sec)}\n.cover-s{background:var(--bg3);color:var(--text3)}\n \n\/* \u2500\u2500 CTA FINAL \u2500\u2500 *\/\n.cta{text-align:center;padding:110px 3rem;position:relative;overflow:hidden}\n.cta::before{content:'';position:absolute;inset:0;background:radial-gradient(ellipse 800px 400px at 50% 50%,rgba(83,74,183,.04),transparent)}\n.cta-ttl{font-size:clamp(2.5rem,5vw,4.2rem);font-weight:400;letter-spacing:-.02em;line-height:1;margin-bottom:1.4rem}\n.cta-ttl em{font-style:italic;color:var(--tcb)}\n.cta-sub{font-size:.92rem;color:var(--text2);max-width:460px;margin:0 auto 2.8rem;line-height:1.8}\n.cta-form{display:flex;max-width:420px;margin:0 auto 2rem}\n.cta-in{flex:1;background:var(--bg2);border:.5px solid var(--borderem);border-right:none;color:var(--text);font-family:var(--font-mono);font-size:.65rem;padding:13px 16px;outline:none;transition:border-color .2s;border-radius:3px 0 0 3px}\n.cta-in:focus{border-color:var(--tcb)}\n.cta-in::placeholder{color:var(--text3)}\n.cta-btn{background:var(--tcb);border:.5px solid var(--tcb);color:#fff;font-family:var(--font-mono);font-size:.6rem;letter-spacing:.12em;text-transform:uppercase;padding:13px 20px;cursor:pointer;white-space:nowrap;transition:all .2s;border-radius:0 3px 3px 0;outline:none}\n.cta-btn:hover{background:var(--tcb-lt)}\n.cta-items{display:flex;justify-content:center;gap:2rem;flex-wrap:wrap}\n.cta-item{font-family:var(--font-mono);font-size:.52rem;letter-spacing:.1em;text-transform:uppercase;color:var(--text3);display:flex;align-items:center;gap:6px}\n.cta-item::before{content:'\u2713';color:var(--sec);font-size:.7rem}\n \n\/* \u2500\u2500 FOOTER \u2500\u2500 *\/\nfooter{border-top:.5px solid var(--border);padding:2rem 3rem;display:flex;align-items:center;justify-content:space-between;flex-wrap:wrap;gap:1rem;background:var(--bg2)}\n.f-logo{font-size:.85rem;color:var(--text2)}\n.f-logo em{font-style:italic;color:var(--tcb)}\n.f-links{display:flex;gap:1.8rem;list-style:none}\n.f-links a{font-family:var(--font-mono);font-size:.52rem;letter-spacing:.08em;text-transform:uppercase;color:var(--text3);text-decoration:none;transition:color .2s}\n.f-links a:hover{color:var(--tcb)}\n.f-copy{font-family:var(--font-mono);font-size:.5rem;color:var(--text3)}\n \n\/* \u2500\u2500 STATUS BAR \u2500\u2500 *\/\n.sbar{position:fixed;bottom:0;left:0;right:0;z-index:200;height:24px;background:rgba(245,244,241,.95);border-top:.5px solid var(--border);display:flex;align-items:center;padding:0 1.5rem;gap:1.8rem;font-family:var(--font-mono);font-size:.52rem;letter-spacing:.08em;backdrop-filter:blur(8px)}\n.si{color:var(--text3);display:flex;align-items:center;gap:4px}\n.sv{color:var(--text2)}\n.ss{color:var(--border)}\n.sr{margin-left:auto}\n \n\/* \u2500\u2500 FEATURES GRID \u2500\u2500 *\/\n.feat-grid{display:grid;grid-template-columns:repeat(3,1fr);border-left:.5px solid var(--border);border-top:.5px solid var(--border)}\n.feat{border-right:.5px solid var(--border);border-bottom:.5px solid var(--border);padding:2rem 1.8rem;position:relative;transition:background .25s}\n.feat:hover{background:var(--tcb-bg)}\n.feat::before{content:'';position:absolute;top:0;left:0;right:0;height:2px;background:var(--tcb);opacity:0;transition:opacity .25s}\n.feat:hover::before{opacity:1}\n.feat-n{font-family:var(--font-mono);font-size:.5rem;color:var(--text3);letter-spacing:.08em;margin-bottom:1rem}\n.feat-t{font-size:.98rem;font-weight:400;margin-bottom:.7rem;line-height:1.3}\n.feat-d{font-family:var(--font-mono);font-size:.62rem;color:var(--text2);line-height:1.8}\n.feat-tag{display:inline-block;margin-top:1rem;font-family:var(--font-mono);font-size:.48rem;letter-spacing:.1em;text-transform:uppercase;color:var(--tcb);border:.5px solid rgba(83,74,183,.3);padding:3px 8px;border-radius:2px}\n \n\/* \u2500\u2500 ANIMATIONS \u2500\u2500 *\/\n@keyframes fu{from{opacity:0;transform:translateY(16px)}to{opacity:1;transform:translateY(0)}}\n \n\/* \u2500\u2500 RESPONSIVE \u2500\u2500 *\/\n@media(max-width:900px){\n  #comment > section > div:first-child { grid-template-columns:1fr !important; gap:2.5rem !important; }\n  #comment > section > div > div:last-child { position:static !important; }\n \n  nav{padding:0 1.2rem}.nav-links{display:none}\n  .hero{grid-template-columns:1fr;padding:90px 1.5rem 60px;gap:3rem}\n  .hero-right{display:none}\n  .hero-metrics{grid-template-columns:repeat(3,1fr)}\n  .arch-wrap{grid-template-columns:1fr;gap:3rem}\n  .proof-grid{grid-template-columns:repeat(2,1fr)}\n  .feat-grid{grid-template-columns:1fr}\n  .demo-layout{grid-template-columns:1fr}\n  .dash-metrics{grid-template-columns:repeat(2,1fr)}\n  .cwe-mini{grid-template-columns:repeat(3,1fr)}\n  section{padding:60px 1.5rem}\n  footer{padding:1.5rem;flex-direction:column}\n  .f-links{flex-wrap:wrap;gap:1rem}\n}\n<\/style>\n<\/head>\n<body>\n \n<nav>\n  <a class=\"nav-logo\" href=\"#\">\n    <strong>CORTEX ORIGIN<span class=\"sup\">\u2122<\/span><\/strong>\n    <span class=\"badge\">CFVL \u00b7 seL4 EAL7<\/span>\n  <\/a>\n  <ul class=\"nav-links\">\n    <li><a href=\"#comment\">Sch\u00e9ma<\/a><\/li>\n    <li><a href=\"#architecture\">Architecture<\/a><\/li>\n    <li><a href=\"#evaluation\">\u00c9valuation<\/a><\/li>\n    <li><a href=\"#demo\">D\u00e9mo<\/a><\/li>\n    <li><a href=\"#zerodaysim\">Zero-Day<\/a><\/li>\n    <li><a href=\"#hybridsim\">IA+Humain<\/a><\/li>\n    <li><a href=\"#contact\">Contact<\/a><\/li>\n  <\/ul>\n  <a href=\"#contact\" class=\"nav-cta\">Demander une \u00e9valuation \u2192<\/a>\n<\/nav>\n \n<!-- \u2500\u2500 HERO \u2500\u2500 -->\n<section class=\"hero\">\n  <div class=\"hero-bg\"><div class=\"hero-glow\"><\/div><\/div>\n \n  <div class=\"hero-left\">\n    <span class=\"eyebrow\">Architecture IA Souveraine \u00b7 Formellement V\u00e9rifi\u00e9e<\/span>\n \n    <h1 class=\"hero-title\">\n      CORTEX <em>ORIGIN<\/em><span class=\"sub\">Protection formelle pour syst\u00e8mes critiques OIV \/ SSR<\/span>\n    <\/h1>\n \n    <p class=\"hero-desc\">\n      Architecture deux couches \u2014 <strong>seL4 EAL7 + 13 modules CFVL<\/strong> \u2014 avec v\u00e9rification formelle Isabelle\/HOL, \u00e9valuation CBMC et couverture <strong>TNR 99,8%<\/strong> prouv\u00e9e par construction sur 34 classes CWE.\n    <\/p>\n \n    <div class=\"hero-metrics\">\n      <div class=\"hm\">\n        <div class=\"hm-v\">99,8<sup>%<\/sup><\/div>\n        <div class=\"hm-l\">TNR global<br>prouv\u00e9 formellement<\/div>\n      <\/div>\n      <div class=\"hm\">\n        <div class=\"hm-v\">34<\/div>\n        <div class=\"hm-l\">Classes CWE<br>adress\u00e9es<\/div>\n      <\/div>\n      <div class=\"hm\">\n        <div class=\"hm-v\">116<sup>Mds<\/sup><\/div>\n        <div class=\"hm-l\">Entr\u00e9es fuzzing<br>0 crash \u00b7 116 Mds<\/div>\n      <\/div>\n    <\/div>\n \n    <div class=\"hero-cta\">\n      <a href=\"#demo\" class=\"btn-primary\">\u25b6 D\u00e9mo live<\/a>\n      <a href=\"#evaluation\" class=\"btn-sec\">Voir l&rsquo;\u00e9valuation CFVL \u2192<\/a>\n    <\/div>\n    <p class=\"hero-note\">\n      <span>seL4 EAL7 \u00b7 BSI-DSZ-CC-0784<\/span>\n      <span>France Deeptech \u00b7 Systematic \u00b7 SAFE<\/span>\n      <span>Isabelle\/HOL \u00b7 CBMC \u00b7 Frama-C<\/span>\n    <\/p>\n  <\/div>\n \n  <div class=\"hero-right\">\n    <div class=\"terminal\">\n      <div class=\"term-bar\">\n        <div class=\"term-dots\"><span class=\"td td-r\"><\/span><span class=\"td td-y\"><\/span><span class=\"td td-g\"><\/span><\/div>\n        <span class=\"term-label\">CFVL Evaluation Engine \u2014 Flux temps r\u00e9el<\/span>\n        <span class=\"term-live\"><span class=\"live-dot\"><\/span>LIVE<\/span>\n      <\/div>\n      <div class=\"term-body\" id=\"hero-log\">\n        <div class=\"tl\"><span class=\"tt\">08:41:00.001<\/span><span class=\"tok\">[ OK ]<\/span><span class=\"tm\">seL4 EAL7 kernel initialis\u00e9 \u2014 <span class=\"tip\">BSI-DSZ-CC-0784<\/span><\/span><\/div>\n        <div class=\"tl\"><span class=\"tt\">08:41:00.421<\/span><span class=\"tok\">[ OK ]<\/span><span class=\"tm\">Isolation m\u00e9moire cross-domain \u2014 <span class=\"tip\">421 ns<\/span> \u00b7 T1\/T6 prouv\u00e9<\/span><\/div>\n        <div class=\"tl\"><span class=\"tt\">08:41:01.003<\/span><span class=\"tok\">[ OK ]<\/span><span class=\"tm\">PRISM FSM \u2014 9 th\u00e9ories Isabelle\/HOL \u00b7 <span class=\"tip\">134 lemmes<\/span><\/span><\/div>\n        <div class=\"tl\"><span class=\"tt\">08:41:01.447<\/span><span class=\"tok\">[ OK ]<\/span><span class=\"tm\">OMEGA PolicyForge \u2014 100\/100 CFVL \u00b7 CBMC <span class=\"tip\">v\u00e9rifi\u00e9<\/span><\/span><\/div>\n        <div class=\"tl\"><span class=\"tt\">08:41:02.891<\/span><span class=\"tok\">[ OK ]<\/span><span class=\"tm\">SENTINEL \u2014 fuzzing <span class=\"tip\">116 Mds<\/span> inputs \u00b7 0 crash total<\/span><\/div>\n        <div class=\"tl\"><span class=\"tt\">08:41:03.120<\/span><span class=\"tok\">[ OK ]<\/span><span class=\"tm\">WALL-DOME \u2014 15\/15 CWE couverts \u00b7 h\u00e9ritage seL4 \u2191<\/span><\/div>\n        <div class=\"tl\"><span class=\"tt\">08:41:04.335<\/span><span class=\"tok\">[ OK ]<\/span><span class=\"tm\">AEGIS \u2014 614\/650 goals WP \u00b7 <span class=\"tip\">94,5%<\/span> Frama-C<\/span><\/div>\n        <div class=\"tl\"><span class=\"tt\">08:41:05.778<\/span><span class=\"tok\">[ OK ]<\/span><span class=\"tm\">M24 Offline Controller \u2014 <span class=\"tip\">100\/100<\/span> \u00b7 CBMC 13 props<\/span><\/div>\n        <div class=\"tl\"><span class=\"tt\">08:41:06.002<\/span><span class=\"tok\">[ OK ]<\/span><span class=\"tm\">TNR global calcul\u00e9 \u2014 <span class=\"tip\">99,8%<\/span> \u00b7 34 CWE adress\u00e9es<\/span><\/div>\n      <\/div>\n      <div class=\"term-stats\">\n        <div class=\"ts\"><div class=\"ts-v\" style=\"color:var(--tcb)\" id=\"h-score\">12<\/div><div class=\"ts-l\">Modules CFVL<\/div><\/div>\n        <div class=\"ts\"><div class=\"ts-v\" style=\"color:var(--sec)\">100\/100<\/div><div class=\"ts-l\">Score moyen<\/div><\/div>\n        <div class=\"ts\"><div class=\"ts-v\" style=\"color:var(--text)\" id=\"h-fuzz\">0<\/div><div class=\"ts-l\">Mds inputs fuzz<\/div><\/div>\n      <\/div>\n    <\/div>\n  <\/div>\n<\/section>\n \n<div class=\"sep\"><\/div>\n \n<!-- \u2500\u2500 \u00c9VALUATIONS CFVL \u2500\u2500 -->\n<!-- \u2500\u2500 COMMENT \u00c7A MARCHE \u2500\u2500 -->\n<div style=\"background:var(--bg2);border-top:.5px solid var(--border);border-bottom:.5px solid var(--border)\" id=\"comment\">\n  <section style=\"max-width:1200px;margin:0 auto\">\n \n    <div style=\"display:grid;grid-template-columns:1.1fr 0.9fr;gap:5rem;align-items:start\">\n \n      <!-- \u2500\u2500 COLONNE GAUCHE : Sch\u00e9ma SVG \u2500\u2500 -->\n      <div>\n        <p class=\"s-lbl\">Sch\u00e9ma d&rsquo;architecture<\/p>\n        <h2 class=\"s-ttl\">Comment \u00e7a <em>marche<\/em><\/h2>\n        <p class=\"s-dsc\" style=\"margin-bottom:1.5rem\">Chaque vecteur d&rsquo;attaque est analys\u00e9 par la TCB formellement prouv\u00e9e. La d\u00e9cision est prise en &lt;421 ns par construction \u2014 pas de configuration, pas de r\u00e8gle op\u00e9rateur.<\/p>\n \n        <div style=\"background:var(--bg3);border:.5px solid var(--borderem);border-radius:var(--r);padding:1.5rem;position:relative;overflow:hidden\">\n          <div style=\"position:absolute;inset:0;pointer-events:none;background:repeating-linear-gradient(0deg,transparent,transparent 29px,rgba(83,74,183,.025) 30px),repeating-linear-gradient(90deg,transparent,transparent 29px,rgba(83,74,183,.025) 30px)\"><\/div>\n          <svg viewBox=\"0 0 480 400\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:100%;height:auto;display:block\" font-family=\"'JetBrains Mono',monospace\">\n            <defs>\n              <marker id=\"arr-r\" markerWidth=\"6\" markerHeight=\"6\" refX=\"5\" refY=\"3\" orient=\"auto\"><path d=\"M0,0 L0,6 L6,3 z\" fill=\"rgba(153,60,29,.7)\"\/><\/marker>\n              <marker id=\"arr-t\" markerWidth=\"6\" markerHeight=\"6\" refX=\"5\" refY=\"3\" orient=\"auto\"><path d=\"M0,0 L0,6 L6,3 z\" fill=\"rgba(83,74,183,.7)\"\/><\/marker>\n              <marker id=\"arr-g\" markerWidth=\"6\" markerHeight=\"6\" refX=\"5\" refY=\"3\" orient=\"auto\"><path d=\"M0,0 L0,6 L6,3 z\" fill=\"rgba(15,110,86,.7)\"\/><\/marker>\n              <marker id=\"arr-d\" markerWidth=\"6\" markerHeight=\"6\" refX=\"5\" refY=\"3\" orient=\"auto\"><path d=\"M0,0 L0,6 L6,3 z\" fill=\"rgba(0,0,0,.18)\"\/><\/marker>\n            <\/defs>\n \n            <!-- \u2500\u2500 MENACES (ligne 1) \u2500\u2500 -->\n            <rect x=\"14\"  y=\"14\" width=\"92\" height=\"36\" rx=\"2\" fill=\"none\" stroke=\"rgba(153,60,29,.45)\" stroke-width=\"1\"\/>\n            <text x=\"60\"  y=\"27\" fill=\"rgba(153,60,29,.85)\" font-size=\"6.5\" text-anchor=\"middle\" letter-spacing=\"1.5\">MENACE<\/text>\n            <text x=\"60\"  y=\"40\" fill=\"rgba(153,60,29,.55)\" font-size=\"5.5\" text-anchor=\"middle\">CWE-089 \/ CWE-119<\/text>\n \n            <rect x=\"194\" y=\"14\" width=\"92\" height=\"36\" rx=\"2\" fill=\"none\" stroke=\"rgba(153,60,29,.45)\" stroke-width=\"1\"\/>\n            <text x=\"240\" y=\"27\" fill=\"rgba(153,60,29,.85)\" font-size=\"6.5\" text-anchor=\"middle\" letter-spacing=\"1.5\">MENACE<\/text>\n            <text x=\"240\" y=\"40\" fill=\"rgba(153,60,29,.55)\" font-size=\"5.5\" text-anchor=\"middle\">CWE-362 \/ CWE-400<\/text>\n \n            <rect x=\"374\" y=\"14\" width=\"92\" height=\"36\" rx=\"2\" fill=\"none\" stroke=\"rgba(153,60,29,.45)\" stroke-width=\"1\"\/>\n            <text x=\"420\" y=\"27\" fill=\"rgba(153,60,29,.85)\" font-size=\"6.5\" text-anchor=\"middle\" letter-spacing=\"1.5\">MENACE<\/text>\n            <text x=\"420\" y=\"40\" fill=\"rgba(153,60,29,.55)\" font-size=\"5.5\" text-anchor=\"middle\">CWE-918 \/ CWE-078<\/text>\n \n            <!-- Fl\u00e8ches vers TCB -->\n            <line x1=\"60\"  y1=\"50\" x2=\"60\"  y2=\"100\" stroke=\"rgba(153,60,29,.45)\" stroke-width=\"1\" stroke-dasharray=\"4,3\" marker-end=\"url(#arr-r)\"\/>\n            <line x1=\"240\" y1=\"50\" x2=\"240\" y2=\"100\" stroke=\"rgba(153,60,29,.45)\" stroke-width=\"1\" stroke-dasharray=\"4,3\" marker-end=\"url(#arr-r)\"\/>\n            <line x1=\"420\" y1=\"50\" x2=\"420\" y2=\"100\" stroke=\"rgba(153,60,29,.45)\" stroke-width=\"1\" stroke-dasharray=\"4,3\" marker-end=\"url(#arr-r)\"\/>\n \n            <!-- \u2500\u2500 TCB CORTEX ORIGIN (bloc central) \u2500\u2500 -->\n            <rect x=\"10\" y=\"104\" width=\"460\" height=\"80\" rx=\"2\" fill=\"rgba(83,74,183,.05)\" stroke=\"rgba(83,74,183,.5)\" stroke-width=\"1.5\"\/>\n            <!-- Bandeau TCB label -->\n            <text x=\"240\" y=\"124\" fill=\"rgba(83,74,183,.9)\" font-size=\"7.5\" text-anchor=\"middle\" letter-spacing=\"2.5\" font-weight=\"bold\">TCB CORTEX ORIGIN\u2122<\/text>\n            <text x=\"240\" y=\"138\" fill=\"rgba(83,74,183,.6)\" font-size=\"6\" text-anchor=\"middle\">seL4 EAL7 (Isabelle\/HOL) \u00b7 PRISM Audit Chain \u00b7 OMEGA PolicyForge<\/text>\n            <text x=\"240\" y=\"151\" fill=\"rgba(83,74,183,.45)\" font-size=\"5.5\" text-anchor=\"middle\">D\u00e9cision formelle \u2264421 ns \u00b7 34 CWE couvertes \u00b7 TNR 99,8% prouv\u00e9<\/text>\n            <text x=\"240\" y=\"164\" fill=\"rgba(83,74,183,.35)\" font-size=\"5\" text-anchor=\"middle\">BSI-DSZ-CC-0784 \u00b7 Couverture ligne 100% \u00b7 116 Mds entr\u00e9es fuzzing \u00b7 0 crash<\/text>\n \n            <!-- \u2500\u2500 COUCHE L1b (ligne entre TCB et sorties) \u2500\u2500 -->\n            <text x=\"240\" y=\"196\" fill=\"rgba(0,0,0,.3)\" font-size=\"5\" text-anchor=\"middle\" letter-spacing=\"1\">MODULES L1b \u2014 WALL-DOME \u00b7 AEGIS \u00b7 M09-CB \u00b7 SENTINEL \u00b7 M24 Offline<\/text>\n \n            <!-- Fl\u00e8ches sorties TCB \u2192 L1b d\u00e9cision -->\n            <line x1=\"60\"  y1=\"184\" x2=\"60\"  y2=\"218\" stroke=\"rgba(153,60,29,.6)\"  stroke-width=\"1.5\" marker-end=\"url(#arr-r)\"\/>\n            <line x1=\"240\" y1=\"184\" x2=\"240\" y2=\"218\" stroke=\"rgba(83,74,183,.6)\"  stroke-width=\"1.5\" marker-end=\"url(#arr-t)\"\/>\n            <line x1=\"420\" y1=\"184\" x2=\"420\" y2=\"218\" stroke=\"rgba(15,110,86,.6)\"  stroke-width=\"1.5\" marker-end=\"url(#arr-g)\"\/>\n \n            <!-- \u2500\u2500 \u00c9TATS DE SORTIE \u2500\u2500 -->\n            <!-- BLOQU\u00c9 -->\n            <rect x=\"10\"  y=\"220\" width=\"106\" height=\"52\" rx=\"2\" fill=\"rgba(153,60,29,.07)\" stroke=\"rgba(153,60,29,.4)\" stroke-width=\"1\"\/>\n            <text x=\"63\"  y=\"239\" fill=\"rgba(153,60,29,.9)\" font-size=\"7\" text-anchor=\"middle\" letter-spacing=\"1.5\">BLOQU\u00c9 \u2298<\/text>\n            <text x=\"63\"  y=\"251\" fill=\"rgba(153,60,29,.6)\" font-size=\"5.5\" text-anchor=\"middle\">Isolation formelle<\/text>\n            <text x=\"63\"  y=\"262\" fill=\"rgba(153,60,29,.5)\" font-size=\"5\" text-anchor=\"middle\">seL4 \u00b7 WALL-DOME<\/text>\n \n            <!-- ANALYS\u00c9 -->\n            <rect x=\"187\" y=\"220\" width=\"106\" height=\"52\" rx=\"2\" fill=\"rgba(83,74,183,.06)\" stroke=\"rgba(83,74,183,.4)\" stroke-width=\"1\"\/>\n            <text x=\"240\" y=\"239\" fill=\"rgba(83,74,183,.9)\" font-size=\"7\" text-anchor=\"middle\" letter-spacing=\"1.5\">ANALYS\u00c9 \u2131<\/text>\n            <text x=\"240\" y=\"251\" fill=\"rgba(83,74,183,.6)\" font-size=\"5.5\" text-anchor=\"middle\">Preuve formelle<\/text>\n            <text x=\"240\" y=\"262\" fill=\"rgba(83,74,183,.5)\" font-size=\"5\" text-anchor=\"middle\">CFVL + Isabelle\/HOL<\/text>\n \n            <!-- AUTORIS\u00c9 -->\n            <rect x=\"364\" y=\"220\" width=\"106\" height=\"52\" rx=\"2\" fill=\"rgba(15,110,86,.06)\" stroke=\"rgba(15,110,86,.4)\" stroke-width=\"1\"\/>\n            <text x=\"417\" y=\"239\" fill=\"rgba(15,110,86,.9)\" font-size=\"7\" text-anchor=\"middle\" letter-spacing=\"1.5\">AUTORIS\u00c9 \u2713<\/text>\n            <text x=\"417\" y=\"251\" fill=\"rgba(15,110,86,.6)\" font-size=\"5.5\" text-anchor=\"middle\">Trafic l\u00e9gitime<\/text>\n            <text x=\"417\" y=\"262\" fill=\"rgba(15,110,86,.5)\" font-size=\"5\" text-anchor=\"middle\">PRISM journalis\u00e9<\/text>\n \n            <!-- Fl\u00e8ches vers audit -->\n            <line x1=\"63\"  y1=\"272\" x2=\"63\"  y2=\"312\" stroke=\"rgba(0,0,0,.12)\" stroke-width=\"1\" stroke-dasharray=\"3,3\" marker-end=\"url(#arr-d)\"\/>\n            <line x1=\"240\" y1=\"272\" x2=\"240\" y2=\"312\" stroke=\"rgba(0,0,0,.12)\" stroke-width=\"1\" stroke-dasharray=\"3,3\" marker-end=\"url(#arr-d)\"\/>\n            <line x1=\"417\" y1=\"272\" x2=\"417\" y2=\"312\" stroke=\"rgba(0,0,0,.12)\" stroke-width=\"1\" stroke-dasharray=\"3,3\" marker-end=\"url(#arr-d)\"\/>\n \n            <!-- \u2500\u2500 AUDIT \/ PRISM \u2500\u2500 -->\n            <rect x=\"10\" y=\"314\" width=\"460\" height=\"52\" rx=\"2\" fill=\"rgba(15,110,86,.05)\" stroke=\"rgba(15,110,86,.35)\" stroke-width=\"1\"\/>\n            <text x=\"240\" y=\"334\" fill=\"rgba(15,110,86,.8)\" font-size=\"7.5\" text-anchor=\"middle\" letter-spacing=\"2\">PRISM AUDIT CHAIN\u2122 \u2014 OMEGA POLICYFORGE\u2122<\/text>\n            <text x=\"240\" y=\"347\" fill=\"rgba(15,110,86,.5)\" font-size=\"6\" text-anchor=\"middle\">Tra\u00e7abilit\u00e9 formelle \u00b7 Journalisation souveraine \u00b7 Rapport CFVL automatique<\/text>\n            <text x=\"240\" y=\"358\" fill=\"rgba(15,110,86,.35)\" font-size=\"5\" text-anchor=\"middle\">100% offline \u00b7 ANSSI \/ DGA \u00b7 OIV \u00b7 SSR<\/text>\n          <\/svg>\n        <\/div>\n      <\/div>\n \n      <!-- \u2500\u2500 COLONNE DROITE : L\u00e9gende \u2500\u2500 -->\n      <div style=\"position:sticky;top:70px\">\n        <p class=\"s-lbl\">L\u00e9gende<\/p>\n        <h2 class=\"s-ttl\" style=\"font-size:1.8rem;margin-bottom:1rem\">Lire le <em>sch\u00e9ma<\/em><\/h2>\n \n        <!-- N\u0152UDS -->\n        <div style=\"margin-bottom:1.8rem\">\n          <p style=\"font-family:var(--font-mono);font-size:.5rem;letter-spacing:.2em;text-transform:uppercase;color:var(--tcb);margin-bottom:.9rem;padding-bottom:.5rem;border-bottom:.5px solid var(--border)\">N\u0153uds<\/p>\n          <div style=\"display:flex;flex-direction:column;gap:.9rem\">\n            <div style=\"display:flex;gap:.9rem;align-items:flex-start\">\n              <div style=\"width:36px;height:30px;flex-shrink:0;border:.5px solid rgba(153,60,29,.5);background:rgba(153,60,29,.07);border-radius:3px\"><\/div>\n              <div><div style=\"font-size:.82rem;color:rgba(153,60,29,.9);margin-bottom:2px\">Source de menace<\/div><div style=\"font-family:var(--font-mono);font-size:.54rem;color:var(--text3);line-height:1.6\">Vecteur hostile class\u00e9 par CWE (MITRE ATT&#038;CK) \u2014 Internet, r\u00e9seau interne, endpoint compromis.<\/div><\/div>\n            <\/div>\n            <div style=\"display:flex;gap:.9rem;align-items:flex-start\">\n              <div style=\"width:36px;height:30px;flex-shrink:0;border:1.5px solid rgba(83,74,183,.6);background:rgba(83,74,183,.06);border-radius:3px\"><\/div>\n              <div><div style=\"font-size:.82rem;color:var(--tcb);margin-bottom:2px\">TCB CORTEX ORIGIN\u2122<\/div><div style=\"font-family:var(--font-mono);font-size:.54rem;color:var(--text3);line-height:1.6\">C\u0153ur formel \u2014 seL4 EAL7 + PRISM + OMEGA. D\u00e9cision \u2264421 ns prouv\u00e9e par Isabelle\/HOL.<\/div><\/div>\n            <\/div>\n            <div style=\"display:flex;gap:.9rem;align-items:flex-start\">\n              <div style=\"width:36px;height:30px;flex-shrink:0;border:.5px solid rgba(15,110,86,.45);background:rgba(15,110,86,.06);border-radius:3px\"><\/div>\n              <div><div style=\"font-size:.82rem;color:var(--sec);margin-bottom:2px\">PRISM Audit Chain\u2122<\/div><div style=\"font-family:var(--font-mono);font-size:.54rem;color:var(--text3);line-height:1.6\">Tra\u00e7abilit\u00e9 souveraine \u2014 chaque d\u00e9cision est journalis\u00e9e, sign\u00e9e et auditable CFVL.<\/div><\/div>\n            <\/div>\n          <\/div>\n        <\/div>\n \n        <!-- \u00c9TATS -->\n        <div style=\"margin-bottom:1.8rem\">\n          <p style=\"font-family:var(--font-mono);font-size:.5rem;letter-spacing:.2em;text-transform:uppercase;color:var(--tcb);margin-bottom:.9rem;padding-bottom:.5rem;border-bottom:.5px solid var(--border)\">\u00c9tats de sortie<\/p>\n          <div style=\"display:flex;flex-direction:column;gap:.9rem\">\n            <div style=\"display:flex;gap:.9rem;align-items:center\">\n              <div style=\"width:36px;height:30px;flex-shrink:0;border:.5px solid rgba(153,60,29,.5);background:rgba(153,60,29,.07);border-radius:3px;display:flex;align-items:center;justify-content:center;font-size:1rem;color:rgba(153,60,29,.8)\">\u2298<\/div>\n              <div><div style=\"font-size:.82rem;color:rgba(153,60,29,.9);margin-bottom:2px\">Bloqu\u00e9<\/div><div style=\"font-family:var(--font-mono);font-size:.54rem;color:var(--text3);line-height:1.6\">Isolation formelle seL4 + WALL-DOME\u2122 \u2014 aucune propagation possible par construction.<\/div><\/div>\n            <\/div>\n            <div style=\"display:flex;gap:.9rem;align-items:center\">\n              <div style=\"width:36px;height:30px;flex-shrink:0;border:.5px solid rgba(83,74,183,.45);background:rgba(83,74,183,.06);border-radius:3px;display:flex;align-items:center;justify-content:center;font-size:.7rem;color:rgba(83,74,183,.8);font-family:monospace;font-weight:700\">\u2131<\/div>\n              <div><div style=\"font-size:.82rem;color:var(--tcb);margin-bottom:2px\">Analys\u00e9 formellement<\/div><div style=\"font-family:var(--font-mono);font-size:.54rem;color:var(--text3);line-height:1.6\">Preuve CFVL g\u00e9n\u00e9r\u00e9e \u2014 rapport Isabelle\/HOL ou CBMC attach\u00e9 \u00e0 l&rsquo;\u00e9v\u00e9nement.<\/div><\/div>\n            <\/div>\n            <div style=\"display:flex;gap:.9rem;align-items:center\">\n              <div style=\"width:36px;height:30px;flex-shrink:0;border:.5px solid rgba(15,110,86,.45);background:rgba(15,110,86,.06);border-radius:3px;display:flex;align-items:center;justify-content:center;font-size:1rem;color:rgba(15,110,86,.8)\">\u2713<\/div>\n              <div><div style=\"font-size:.82rem;color:var(--sec);margin-bottom:2px\">Autoris\u00e9<\/div><div style=\"font-family:var(--font-mono);font-size:.54rem;color:var(--text3);line-height:1.6\">Trafic l\u00e9gitime \u2014 journalis\u00e9 par PRISM, politique valid\u00e9e par OMEGA, 100% offline.<\/div><\/div>\n            <\/div>\n          <\/div>\n        <\/div>\n \n        <!-- FLUX -->\n        <div style=\"margin-bottom:1.8rem\">\n          <p style=\"font-family:var(--font-mono);font-size:.5rem;letter-spacing:.2em;text-transform:uppercase;color:var(--tcb);margin-bottom:.9rem;padding-bottom:.5rem;border-bottom:.5px solid var(--border)\">Flux &#038; Couches<\/p>\n          <div style=\"display:flex;flex-direction:column;gap:.9rem\">\n            <div style=\"display:flex;gap:.9rem;align-items:center\">\n              <svg width=\"52\" height=\"22\" viewBox=\"0 0 52 22\" style=\"flex-shrink:0\"><line x1=\"3\" y1=\"11\" x2=\"46\" y2=\"11\" stroke=\"rgba(153,60,29,.7)\" stroke-width=\"1.5\" stroke-dasharray=\"4,3\"\/><polygon points=\"42,7 50,11 42,15\" fill=\"rgba(153,60,29,.7)\"\/><\/svg>\n              <div style=\"font-family:var(--font-mono);font-size:.54rem;color:var(--text3);line-height:1.6\">Vecteur hostile \u2192 analyse TCB formelle<\/div>\n            <\/div>\n            <div style=\"display:flex;gap:.9rem;align-items:center\">\n              <svg width=\"52\" height=\"22\" viewBox=\"0 0 52 22\" style=\"flex-shrink:0\"><line x1=\"3\" y1=\"11\" x2=\"46\" y2=\"11\" stroke=\"rgba(83,74,183,.65)\" stroke-width=\"1.5\"\/><polygon points=\"42,7 50,11 42,15\" fill=\"rgba(83,74,183,.65)\"\/><\/svg>\n              <div style=\"font-family:var(--font-mono);font-size:.54rem;color:var(--text3);line-height:1.6\">D\u00e9cision TCB \u2192 modules L1b (\u2264421 ns)<\/div>\n            <\/div>\n            <div style=\"display:flex;gap:.9rem;align-items:center\">\n              <svg width=\"52\" height=\"22\" viewBox=\"0 0 52 22\" style=\"flex-shrink:0\"><line x1=\"3\" y1=\"11\" x2=\"46\" y2=\"11\" stroke=\"rgba(0,0,0,.18)\" stroke-width=\"1\" stroke-dasharray=\"3,3\"\/><polygon points=\"42,7 50,11 42,15\" fill=\"rgba(0,0,0,.18)\"\/><\/svg>\n              <div style=\"font-family:var(--font-mono);font-size:.54rem;color:var(--text3);line-height:1.6\">Remont\u00e9e PRISM Audit Chain \u2014 tra\u00e7abilit\u00e9<\/div>\n            <\/div>\n          <\/div>\n        <\/div>\n \n        <!-- MODULES L1b -->\n        <div>\n          <p style=\"font-family:var(--font-mono);font-size:.5rem;letter-spacing:.2em;text-transform:uppercase;color:var(--tcb);margin-bottom:.9rem;padding-bottom:.5rem;border-bottom:.5px solid var(--border)\">Modules L1b (Hors-TCB)<\/p>\n          <div style=\"display:flex;flex-direction:column;gap:.6rem\">\n            <div style=\"display:flex;gap:8px;align-items:center\"><span style=\"width:7px;height:7px;border-radius:50%;background:var(--tcb);flex-shrink:0;box-shadow:0 0 4px var(--tcb)\"><\/span><span style=\"font-family:var(--font-mono);font-size:.54rem;color:var(--text2)\"><strong style=\"color:var(--tcb)\">seL4 EAL7<\/strong> \u2014 kernel formel \u00b7 7 CWE par construction<\/span><\/div>\n            <div style=\"display:flex;gap:8px;align-items:center\"><span style=\"width:7px;height:7px;border-radius:50%;background:var(--sec);flex-shrink:0\"><\/span><span style=\"font-family:var(--font-mono);font-size:.54rem;color:var(--text2)\"><strong style=\"color:var(--sec)\">WALL-DOME\u2122<\/strong> \u2014 15\/15 CWE \u00b7 isolation totale<\/span><\/div>\n            <div style=\"display:flex;gap:8px;align-items:center\"><span style=\"width:7px;height:7px;border-radius:50%;background:var(--sec);flex-shrink:0\"><\/span><span style=\"font-family:var(--font-mono);font-size:.54rem;color:var(--text2)\"><strong style=\"color:var(--sec)\">AEGIS\u2122<\/strong> \u2014 orchestration \u00b7 614\/650 WP goals<\/span><\/div>\n            <div style=\"display:flex;gap:8px;align-items:center\"><span style=\"width:7px;height:7px;border-radius:50%;background:var(--sec);flex-shrink:0\"><\/span><span style=\"font-family:var(--font-mono);font-size:.54rem;color:var(--text2)\"><strong style=\"color:var(--sec)\">M09-CB<\/strong> \u2014 circuit breaker \u00b7 CWE-400<\/span><\/div>\n            <div style=\"display:flex;gap:8px;align-items:center\"><span style=\"width:7px;height:7px;border-radius:50%;background:var(--sec);flex-shrink:0\"><\/span><span style=\"font-family:var(--font-mono);font-size:.54rem;color:var(--text2)\"><strong style=\"color:var(--sec)\">M24 Offline\u2122<\/strong> \u2014 isolation physique \u00b7 CBMC 13\/13<\/span><\/div>\n          <\/div>\n        <\/div>\n \n      <\/div>\n    <\/div>\n  <\/section>\n<\/div>\n \n \n<div class=\"proof-wrap\" id=\"evaluation\">\n  <section style=\"max-width:1200px;margin:0 auto\">\n    <p class=\"s-lbl\">\u00c9valuations CFVL<\/p>\n    <h2 class=\"s-ttl\">Preuves formelles <em>certifi\u00e9es<\/em><\/h2>\n    <p class=\"s-dsc\">Chaque module passe une \u00e9valuation ind\u00e9pendante CFVL combinant v\u00e9rification Isabelle\/HOL, CBMC, Frama-C\/WP et fuzzing intensif avant certification.<\/p>\n    <div class=\"proof-grid\">\n      <div class=\"proof-card\">\n        <div class=\"proof-score\">100<sup>\/100<\/sup><\/div>\n        <div class=\"proof-name\">M10 OMEGA PolicyForge<\/div>\n        <div class=\"proof-sub\">TCB \u00b7 CFVL-EVAL-001<br>74 tests C \u00b7 134 lemmes Isabelle<\/div>\n        <span class=\"proof-badge\">\u2713 PROUV\u00c9 TCB<\/span>\n      <\/div>\n      <div class=\"proof-card\">\n        <div class=\"proof-score\">100<sup>\/100<\/sup><\/div>\n        <div class=\"proof-name\">M02 PRISM Audit Chain<\/div>\n        <div class=\"proof-sub\">TCB \u00b7 CFVL-EVAL-002<br>FSM + BLP \u00b7 Isabelle\/HOL<\/div>\n        <span class=\"proof-badge\">\u2713 PROUV\u00c9 TCB<\/span>\n      <\/div>\n      <div class=\"proof-card\">\n        <div class=\"proof-score\">100<sup>\/100<\/sup><\/div>\n        <div class=\"proof-name\">M24 Offline Controller<\/div>\n        <div class=\"proof-sub\">L1b \u00b7 CFVL-EVAL-015 v2<br>CBMC 13 propri\u00e9t\u00e9s \u00b7 bug fix\u00e9<\/div>\n        <span class=\"proof-badge\">\u2713 PROUV\u00c9 L1b<\/span>\n      <\/div>\n      <div class=\"proof-card\">\n        <div class=\"proof-score\">100<sup>\/100<\/sup><\/div>\n        <div class=\"proof-name\">M11 TrustLink \u00b7 M09 CB<\/div>\n        <div class=\"proof-sub\">L1b \u00b7 CFVL-EVAL-009<br>WALL-DOME \u00b7 SENTINEL<\/div>\n        <span class=\"proof-badge\">\u2713 12 MODULES<\/span>\n      <\/div>\n    <\/div>\n \n    <!-- Mini CWE grid -->\n    <p class=\"s-lbl\" style=\"margin-top:0\">Surface de protection \u2014 15 classes CWE mesur\u00e9es<\/p>\n    <div class=\"cwe-mini\" id=\"cwe-grid\"><\/div>\n  <\/section>\n<\/div>\n \n<!-- \u2500\u2500 ARCHITECTURE \u2500\u2500 -->\n<section id=\"architecture\" style=\"max-width:1200px;margin:0 auto\">\n  <div class=\"arch-wrap\">\n    <div>\n      <p class=\"s-lbl\">Architecture<\/p>\n      <h2 class=\"s-ttl\">Deux couches de <em>confiance<\/em> formelle<\/h2>\n      <div class=\"arch-stack\">\n        <div class=\"arch-row\"><span class=\"ar-idx\">TCB<\/span><span class=\"ar-dot\" style=\"background:var(--tcb);box-shadow:0 0 5px var(--tcb)\"><\/span><span class=\"ar-name\">seL4 EAL7 \u2014 Kernel formel<\/span><span class=\"ar-tag tag-tcb\">\u2131 Isabelle\/HOL<\/span><\/div>\n        <div class=\"arch-row\"><span class=\"ar-idx\">TCB<\/span><span class=\"ar-dot\" style=\"background:var(--tcb);box-shadow:0 0 5px var(--tcb)\"><\/span><span class=\"ar-name\">M00 Root-of-Trust<\/span><span class=\"ar-tag tag-tcb\">CFVL 100\/100<\/span><\/div>\n        <div class=\"arch-row\"><span class=\"ar-idx\">TCB<\/span><span class=\"ar-dot\" style=\"background:var(--tcb);box-shadow:0 0 5px var(--tcb)\"><\/span><span class=\"ar-name\">M02 PRISM Audit Chain<\/span><span class=\"ar-tag tag-tcb\">CFVL 100\/100<\/span><\/div>\n        <div class=\"arch-row\"><span class=\"ar-idx\">TCB<\/span><span class=\"ar-dot\" style=\"background:var(--tcb);box-shadow:0 0 5px var(--tcb)\"><\/span><span class=\"ar-name\">M10 OMEGA PolicyForge<\/span><span class=\"ar-tag tag-tcb\">CFVL 100\/100<\/span><\/div>\n        <div class=\"arch-row\"><span class=\"ar-idx\">L1b<\/span><span class=\"ar-dot\" style=\"background:var(--sec);box-shadow:0 0 5px var(--sec)\"><\/span><span class=\"ar-name\">SENTINEL \u00b7 WALL-DOME<\/span><span class=\"ar-tag tag-ok\">CFVL 100\/100<\/span><\/div>\n        <div class=\"arch-row\"><span class=\"ar-idx\">L1b<\/span><span class=\"ar-dot\" style=\"background:var(--sec)\"><\/span><span class=\"ar-name\">AEGIS\u2122 \u00b7 ATLAS\u2122<\/span><span class=\"ar-tag tag-ok\">Frama-C\/WP 94,5%<\/span><\/div>\n        <div class=\"arch-row\"><span class=\"ar-idx\">L1b<\/span><span class=\"ar-dot\" style=\"background:var(--sec)\"><\/span><span class=\"ar-name\">M09-CB \u00b7 M11-TL \u00b7 M26-CPL<\/span><span class=\"ar-tag tag-ok\">CFVL 100\/100<\/span><\/div>\n        <div class=\"arch-row\"><span class=\"ar-idx\">L1b<\/span><span class=\"ar-dot\" style=\"background:var(--sec)\"><\/span><span class=\"ar-name\">M24 Offline Controller\u2122<\/span><span class=\"ar-tag tag-ok\">CBMC 13 props<\/span><\/div>\n        <div class=\"arch-row\"><span class=\"ar-idx\">L1b<\/span><span class=\"ar-dot\" style=\"background:var(--warn)\"><\/span><span class=\"ar-name\">M27 InterfaceGateway<\/span><span class=\"ar-tag tag-warn\">CFVL 94\/100<\/span><\/div>\n      <\/div>\n    <\/div>\n    <div class=\"arch-info\">\n      <h3>S\u00e9curit\u00e9 par <em>construction<\/em>,<br>non par configuration.<\/h3>\n      <p>Chaque couche repose sur des preuves math\u00e9matiques \u2014 pas de r\u00e8gles op\u00e9rateur, pas de configuration manuelle. La TCB (PRISM + OMEGA + M00) est le seul p\u00e9rim\u00e8tre de confiance. Tous les modules L1b sont Hors-TCB et isol\u00e9s formellement.<\/p>\n      <div class=\"spec-table\">\n        <div class=\"spec-row\"><span class=\"spec-k\">Kernel formel<\/span><span class=\"spec-v\"><em>seL4 EAL7 \u00b7 BSI-DSZ-CC-0784<\/em><\/span><\/div>\n        <div class=\"spec-row\"><span class=\"spec-k\">V\u00e9rification<\/span><span class=\"spec-v\"><em>Isabelle\/HOL \u00b7 CBMC \u00b7 Frama-C\/WP<\/em><\/span><\/div>\n        <div class=\"spec-row\"><span class=\"spec-k\">Couverture CWE<\/span><span class=\"spec-v\"><em>34 classes \u00b7 TNR 99,8% prouv\u00e9<\/em><\/span><\/div>\n        <div class=\"spec-row\"><span class=\"spec-k\">Fuzzing<\/span><span class=\"spec-v\"><em>116 Mds entr\u00e9es \u00b7 0 crash<\/em><\/span><\/div>\n        <div class=\"spec-row\"><span class=\"spec-k\">March\u00e9 cible<\/span><span class=\"spec-v\"><em>OIV \u00b7 SSR \u00b7 DGA \u00b7 ANSSI<\/em><\/span><\/div>\n        <div class=\"spec-row\"><span class=\"spec-k\">D\u00e9ploiement<\/span><span class=\"spec-v\"><em>100% offline \u00b7 souverain \u00b7 ARM64<\/em><\/span><\/div>\n      <\/div>\n    <\/div>\n  <\/div>\n<\/section>\n \n<!-- \u2500\u2500 FONCTIONNALIT\u00c9S \u2500\u2500 -->\n<div style=\"background:var(--bg2);border-top:.5px solid var(--border);border-bottom:.5px solid var(--border)\">\n  <section style=\"max-width:1200px;margin:0 auto\">\n    <p class=\"s-lbl\">Capacit\u00e9s<\/p>\n    <h2 class=\"s-ttl\">Couverture <em>formelle<\/em> compl\u00e8te<\/h2>\n    <p class=\"s-dsc\">Six axes d&rsquo;\u00e9valuation couvrent l&rsquo;int\u00e9gralit\u00e9 du cycle \u2014 du kernel formel \u00e0 l&rsquo;analyse de vuln\u00e9rabilit\u00e9s applicatives.<\/p>\n    <div class=\"feat-grid\">\n      <div class=\"feat\"><p class=\"feat-n\">01<\/p><h3 class=\"feat-t\">V\u00e9rification formelle kernel<\/h3><p class=\"feat-d\">seL4 prouv\u00e9 par Isabelle\/HOL \u2014 isolation m\u00e9moire cross-domain, capability integrity, non-interference. 7 CWE couverts par construction en &lt;421 ns.<\/p><span class=\"feat-tag\">\u2131 Isabelle\/HOL<\/span><\/div>\n      <div class=\"feat\"><p class=\"feat-n\">02<\/p><h3 class=\"feat-t\">CFVL \u2014 12 modules \u00e9valu\u00e9s<\/h3><p class=\"feat-d\">Score moyen 100\/100. Chaque module combine tests C, lemmes Isabelle, goals WP Frama-C et propri\u00e9t\u00e9s CBMC v\u00e9rifi\u00e9es m\u00e9caniquement.<\/p><span class=\"feat-tag\">CFVL Program<\/span><\/div>\n      <div class=\"feat\"><p class=\"feat-n\">03<\/p><h3 class=\"feat-t\">Fuzzing haute intensit\u00e9<\/h3><p class=\"feat-d\">116 milliards d&rsquo;entr\u00e9es g\u00e9n\u00e9r\u00e9es par libFuzzer et fuzzer C standalone sur ARM64. Z\u00e9ro crash. Couverture ligne 100%, r\u00e9gion 96,31%.<\/p><span class=\"feat-tag\">libFuzzer \u00b7 CBMC<\/span><\/div>\n      <div class=\"feat\"><p class=\"feat-n\">04<\/p><h3 class=\"feat-t\">Analyse statique AVA-VAN.5<\/h3><p class=\"feat-d\">Rapport AVA-VAN-001 v3.0 \u2014 34 CWE analys\u00e9es, 13 familles de risque OIV\/SSR, surface d&rsquo;attaque formalis\u00e9e. Aucune vuln\u00e9rabilit\u00e9 critique r\u00e9siduelle.<\/p><span class=\"feat-tag\">AVA-VAN.5 \u00b7 CSPN<\/span><\/div>\n      <div class=\"feat\"><p class=\"feat-n\">05<\/p><h3 class=\"feat-t\">Souverainet\u00e9 absolue<\/h3><p class=\"feat-d\">Architecture 100% offline native. Aucune donn\u00e9e ne quitte le p\u00e9rim\u00e8tre. CDN fran\u00e7ais, h\u00e9bergement souverain. M24 Offline Controller garantit l&rsquo;isolation physique.<\/p><span class=\"feat-tag\">M24 Offline\u2122<\/span><\/div>\n      <div class=\"feat\"><p class=\"feat-n\">06<\/p><h3 class=\"feat-t\">Frama-C\/WP \u2014 614\/650 goals<\/h3><p class=\"feat-d\">AEGIS prouv\u00e9 \u00e0 94,5% avec alt-ergo et z3 (steps 100 000). 27 goals r\u00e9siduels sur aegis_execute en cours de formalisation avec cvc5.<\/p><span class=\"feat-tag\">Frama-C \u00b7 WP<\/span><\/div>\n    <\/div>\n  <\/section>\n<\/div>\n \n<!-- \u2500\u2500 D\u00c9MO \u2500\u2500 -->\n<div class=\"demo-wrap\" id=\"demo\">\n  <section style=\"max-width:1200px;margin:0 auto\">\n    <div class=\"demo-head\">\n      <div>\n        <p class=\"s-lbl\">Simulateur d&rsquo;attaque<\/p>\n        <h2 class=\"s-ttl\" style=\"margin-bottom:.4rem\">R\u00e9ponse formelle <em>en temps r\u00e9el<\/em><\/h2>\n        <p style=\"font-family:var(--font-mono);font-size:.56rem;color:var(--text3);letter-spacing:.08em\">Chaque attaque est intercept\u00e9e par le module CORTEX certifi\u00e9 pour le CWE correspondant<\/p>\n      <\/div>\n      <div class=\"demo-controls\" style=\"align-items:center;gap:.5rem\">\n        <div id=\"auto-status\" style=\"font-family:var(--font-mono);font-size:.52rem;letter-spacing:.08em;color:var(--sec);display:flex;align-items:center;gap:6px\">\n          <span id=\"auto-dot\" style=\"width:6px;height:6px;border-radius:50%;background:var(--sec);display:inline-block;animation:blink 1.8s ease-in-out infinite\"><\/span>\n          <span id=\"auto-label\">SIMULATION ACTIVE<\/span>\n        <\/div>\n        <button class=\"demo-btn demo-reset\" onclick=\"toggleAuto()\" id=\"btn-auto\" style=\"min-width:90px\">\u23f8 Pause<\/button>\n        <button class=\"demo-btn demo-reset\" onclick=\"resetSim()\">\u21ba Reset<\/button>\n      <\/div>\n    <\/div>\n \n    <!-- Module status grid -->\n    <div id=\"module-grid\" style=\"display:grid;grid-template-columns:repeat(6,1fr);gap:6px;margin-bottom:1.5rem\"><\/div>\n \n    <!-- Carte grande pleine largeur -->\n    <div class=\"alert-bar\" id=\"alert-bar\" style=\"margin-bottom:.8rem\"><\/div>\n    <div class=\"demo-dashboard\" style=\"margin-bottom:1rem\">\n      <div class=\"dash-top\">\n        <span class=\"dash-title\">CORTEX ORIGIN\u2122 \u2014 Supervision temps r\u00e9el<\/span>\n        <span class=\"dash-status\">\n          <span class=\"status-dot\" id=\"s-dot\" style=\"background:var(--sec);box-shadow:0 0 5px var(--sec)\"><\/span>\n          <span id=\"s-txt\" style=\"color:var(--sec)\">Syst\u00e8me op\u00e9rationnel<\/span>\n        <\/span>\n      <\/div>\n          <div class=\"threat-map\" style=\"height:340px\">\n            <svg id=\"tmap\" viewBox=\"0 0 600 240\" style=\"width:100%;height:100%\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\">\n              <line x1=\"0\" y1=\"65\" x2=\"600\" y2=\"65\" stroke=\"rgba(83,74,183,.04)\" stroke-width=\".5\"\/>\n              <line x1=\"0\" y1=\"130\" x2=\"600\" y2=\"130\" stroke=\"rgba(83,74,183,.04)\" stroke-width=\".5\"\/>\n              <line x1=\"150\" y1=\"0\" x2=\"150\" y2=\"180\" stroke=\"rgba(83,74,183,.05)\" stroke-width=\".5\"\/>\n              <line x1=\"300\" y1=\"0\" x2=\"300\" y2=\"180\" stroke=\"rgba(83,74,183,.05)\" stroke-width=\".5\"\/>\n              <line x1=\"450\" y1=\"0\" x2=\"450\" y2=\"180\" stroke=\"rgba(83,74,183,.05)\" stroke-width=\".5\"\/>\n              <circle cx=\"300\" cy=\"100\" r=\"12\" fill=\"rgba(83,74,183,.12)\" stroke=\"var(--tcb)\" stroke-width=\"2\"\/>\n              <circle cx=\"300\" cy=\"100\" r=\"6\" fill=\"var(--tcb)\"\/>\n              <text x=\"300\" y=\"122\" fill=\"rgba(83,74,183,.6)\" font-size=\"7\" text-anchor=\"middle\" font-family=\"monospace\" font-weight=\"bold\">TCB CORTEX ORIGIN\u2122<\/text>\n              <!-- N\u0153uds L1b permanents -->\n              <circle cx=\"80\"  cy=\"45\"  r=\"5\" fill=\"rgba(15,110,86,.55)\" stroke=\"rgba(15,110,86,.35)\" stroke-width=\"1\"\/>\n              <circle cx=\"520\" cy=\"45\"  r=\"5\" fill=\"rgba(15,110,86,.55)\" stroke=\"rgba(15,110,86,.35)\" stroke-width=\"1\"\/>\n              <circle cx=\"80\"  cy=\"155\" r=\"5\" fill=\"rgba(15,110,86,.55)\" stroke=\"rgba(15,110,86,.35)\" stroke-width=\"1\"\/>\n              <circle cx=\"520\" cy=\"155\" r=\"5\" fill=\"rgba(15,110,86,.55)\" stroke=\"rgba(15,110,86,.35)\" stroke-width=\"1\"\/>\n              <circle cx=\"180\" cy=\"22\"  r=\"4\" fill=\"rgba(15,110,86,.45)\" stroke=\"rgba(15,110,86,.25)\" stroke-width=\"1\"\/>\n              <circle cx=\"420\" cy=\"172\" r=\"4\" fill=\"rgba(15,110,86,.45)\" stroke=\"rgba(15,110,86,.25)\" stroke-width=\"1\"\/>\n              <!-- Labels modules -->\n              <text x=\"80\" y=\"36\" fill=\"rgba(15,110,86,.5)\" font-size=\"5.5\" text-anchor=\"middle\" font-family=\"monospace\">WALL-DOME<\/text>\n              <text x=\"520\" y=\"36\" fill=\"rgba(15,110,86,.5)\" font-size=\"5.5\" text-anchor=\"middle\" font-family=\"monospace\">AEGIS<\/text>\n              <text x=\"80\" y=\"172\" fill=\"rgba(15,110,86,.5)\" font-size=\"5.5\" text-anchor=\"middle\" font-family=\"monospace\">SENTINEL<\/text>\n              <text x=\"520\" y=\"172\" fill=\"rgba(15,110,86,.5)\" font-size=\"5.5\" text-anchor=\"middle\" font-family=\"monospace\">M09-CB<\/text>\n              <text x=\"180\" y=\"15\" fill=\"rgba(15,110,86,.4)\" font-size=\"5\" text-anchor=\"middle\" font-family=\"monospace\">PRISM<\/text>\n              <text x=\"420\" y=\"185\" fill=\"rgba(15,110,86,.4)\" font-size=\"5\" text-anchor=\"middle\" font-family=\"monospace\">M24 OFFLINE<\/text>\n              <!-- Lignes de connexion permanentes -->\n              <line x1=\"80\"  y1=\"45\"  x2=\"300\" y2=\"100\" stroke=\"rgba(15,110,86,.1)\" stroke-width=\"1\"\/>\n              <line x1=\"520\" y1=\"45\"  x2=\"300\" y2=\"100\" stroke=\"rgba(15,110,86,.1)\" stroke-width=\"1\"\/>\n              <line x1=\"80\"  y1=\"155\" x2=\"300\" y2=\"100\" stroke=\"rgba(15,110,86,.1)\" stroke-width=\"1\"\/>\n              <line x1=\"520\" y1=\"155\" x2=\"300\" y2=\"100\" stroke=\"rgba(15,110,86,.1)\" stroke-width=\"1\"\/>\n              <g id=\"attack-g\"><\/g>\n              <!-- TCB flash ring -->\n              <circle id=\"tcb-flash\" cx=\"300\" cy=\"100\" r=\"18\" fill=\"none\" stroke=\"var(--tcb)\" stroke-width=\"3\" opacity=\"0\" style=\"transition:opacity .15s\"\/>\n            <\/svg>\n          <\/div>\n          <div class=\"dash-metrics\">\n            <div class=\"dm\"><div class=\"dm-lbl\">Attaques bloqu\u00e9es<\/div><div class=\"dm-val\" id=\"dm-blocked\" style=\"color:var(--sec)\">0<\/div><div class=\"dm-sub\">cette session<\/div><\/div>\n            <div class=\"dm\"><div class=\"dm-lbl\">CWE couvertes<\/div><div class=\"dm-val\" style=\"color:var(--tcb)\">34<\/div><div class=\"dm-sub\">formellement prouv\u00e9<\/div><\/div>\n            <div class=\"dm\"><div class=\"dm-lbl\">Module actif<\/div><div class=\"dm-val\" id=\"dm-mod\" style=\"color:var(--text);font-size:.85rem;font-style:normal\">\u2014<\/div><div class=\"dm-sub\" id=\"dm-mod-sub\">en attente<\/div><\/div>\n            <div class=\"dm\"><div class=\"dm-lbl\">D\u00e9cision TCB<\/div><div class=\"dm-val\" id=\"dm-lat\" style=\"color:var(--tcb)\">\u2264421 ns<\/div><div class=\"dm-sub\" id=\"dm-lat-sub\">ARM64 prouv\u00e9<\/div><\/div>\n          <\/div>\n        <\/div>\n    <\/div>\n    <!-- Journal en dessous de la carte -->\n    <div class=\"console\" id=\"log\" style=\"height:220px;margin-top:1rem\">\n      <div class=\"console-title\">\/\/ Journal CFVL \u2014 Simulation automatique active<\/div>\n      <div class=\"ll\"><span class=\"lt\">&#8211;:&#8211;.&#8212;<\/span><span class=\"lok\">[ OK ]<\/span><span class=\"lm\">seL4 kernel actif \u2014 isolation formelle <span class=\"lip\">T1\/T6<\/span><\/span><\/div>\n      <div class=\"ll\"><span class=\"lt\">&#8211;:&#8211;.&#8212;<\/span><span class=\"lok\">[ OK ]<\/span><span class=\"lm\">12 modules CFVL \u2014 surveillance active<\/span><\/div>\n      <div class=\"ll\"><span class=\"lt\">&#8211;:&#8211;.&#8212;<\/span><span class=\"lok\">[ OK ]<\/span><span class=\"lm\">TNR global <span class=\"lip\">99,8%<\/span> \u2014 34 CWE couvertes<\/span><\/div>\n    <\/div>\n  <\/section>\n<\/div>\n \n<!-- \u2500\u2500 SIMULATION ZERO-DAY & EX ANTE \u2500\u2500 -->\n<div style=\"background:var(--bg);border-top:.5px solid var(--border);border-bottom:.5px solid var(--border)\" id=\"zerodaysim\">\n  <section style=\"max-width:1200px;margin:0 auto\">\n \n    <div style=\"display:flex;align-items:flex-end;justify-content:space-between;margin-bottom:2rem;flex-wrap:wrap;gap:1rem\">\n      <div>\n        <p class=\"s-lbl\" style=\"color:var(--warn)\">Simulation avanc\u00e9e \u00b7 Zero-Day &#038; Ex Ante<\/p>\n        <h2 class=\"s-ttl\" style=\"margin-bottom:.3rem\">Vecteurs <em>inconnus<\/em> &#038; anticipation formelle<\/h2>\n        <p style=\"font-family:var(--font-mono);font-size:.55rem;color:var(--text3);letter-spacing:.07em;max-width:600px\">\n          Attaques sans CVE assign\u00e9, zero-day exploits, supply chain, entr\u00e9es adversariales IA \u2014 couverts par la TCB formelle <strong style=\"color:var(--text2)\">ind\u00e9pendamment de la connaissance pr\u00e9alable du vecteur<\/strong>\n        <\/p>\n      <\/div>\n      <div style=\"display:flex;align-items:center;gap:.6rem;flex-wrap:wrap\">\n        <div style=\"font-family:var(--font-mono);font-size:.52rem;letter-spacing:.08em;color:var(--warn);display:flex;align-items:center;gap:6px\">\n          <span id=\"zd-dot\" style=\"width:6px;height:6px;border-radius:50%;background:var(--warn);display:inline-block;animation:blink 1.8s ease-in-out infinite\"><\/span>\n          <span id=\"zd-label\">SIMULATION ACTIVE<\/span>\n        <\/div>\n        <button class=\"demo-btn\" onclick=\"zdToggle()\" id=\"zd-btn-pause\" style=\"min-width:90px;border-color:rgba(133,79,11,.35);color:var(--warn)\">\u23f8 Pause<\/button>\n        <button class=\"demo-btn demo-reset\" onclick=\"zdReset()\">\u21ba Reset<\/button>\n      <\/div>\n    <\/div>\n \n    <!-- Badge attaque courante -->\n    <div id=\"zd-badge\" style=\"background:var(--bg2);border:.5px solid var(--border);border-radius:var(--r);padding:.9rem 1.2rem;margin-bottom:1rem;min-height:56px;transition:border-color .3s\">\n      <div style=\"display:flex;align-items:center;gap:10px\">\n        <span id=\"zd-badge-icon\" style=\"font-size:1.2rem\">\u23f3<\/span>\n        <div>\n          <div id=\"zd-badge-name\" style=\"font-size:.82rem;font-weight:700;color:var(--text)\">Initialisation\u2026<\/div>\n          <div id=\"zd-badge-tag\" style=\"font-family:var(--font-mono);font-size:.5rem;color:var(--text3);margin-top:2px;letter-spacing:.06em\">\u2014<\/div>\n        <\/div>\n        <div style=\"margin-left:auto;text-align:right\">\n          <div id=\"zd-badge-lat\" style=\"font-family:var(--font-serif);font-size:1.3rem;font-style:italic;color:var(--tcb)\">\u2014<\/div>\n          <div id=\"zd-badge-layer\" style=\"font-family:var(--font-mono);font-size:.44rem;color:var(--text3)\">\u2014<\/div>\n        <\/div>\n        <div style=\"margin-left:1rem;text-align:right;min-width:180px\">\n          <div id=\"zd-phase-label\" style=\"font-family:var(--font-mono);font-size:.52rem;color:var(--warn);letter-spacing:.08em\">\u2014<\/div>\n        <\/div>\n      <\/div>\n    <\/div>\n    <div style=\"display:grid;grid-template-columns:1fr 1fr;gap:1.5rem;margin-bottom:1rem\">\n      <!-- Pourquoi ex ante -->\n      <div style=\"background:var(--bg2);border:.5px solid var(--border);border-radius:var(--r);padding:1rem 1.2rem\">\n        <p style=\"font-family:var(--font-mono);font-size:.48rem;letter-spacing:.2em;text-transform:uppercase;color:var(--warn);margin-bottom:.5rem\">Principe ex ante<\/p>\n        <div id=\"zd-ex-box\" style=\"font-family:var(--font-mono);font-size:.56rem;color:var(--text2);line-height:1.7;border-left:3px solid var(--warn);padding-left:.8rem;min-height:60px;transition:border-left-color .3s\">S\u00e9lection en cours\u2026<\/div>\n      <\/div>\n      <!-- M\u00e9triques -->\n      <div style=\"display:grid;grid-template-columns:repeat(3,1fr);gap:1px;background:var(--border);border-radius:var(--r);overflow:hidden;align-content:start\">\n        <div class=\"dm\"><div class=\"dm-lbl\">Vecteurs bloqu\u00e9s<\/div><div class=\"dm-val\" id=\"zd-blocked\" style=\"color:var(--warn)\">0<\/div><div class=\"dm-sub\">session<\/div><\/div>\n        <div class=\"dm\"><div class=\"dm-lbl\">Couverture formelle<\/div><div class=\"dm-val\" style=\"color:var(--tcb)\">100%<\/div><div class=\"dm-sub\">par construction TCB<\/div><\/div>\n        <div class=\"dm\"><div class=\"dm-lbl\">CVE requis<\/div><div class=\"dm-val\" style=\"color:var(--sec)\">0<\/div><div class=\"dm-sub\">preuves \u2260 signatures<\/div><\/div>\n      <\/div>\n    <\/div>\n    <!-- Carte pleine largeur -->\n    <div>\n \n      <!-- \u2500\u2500 TABLEAU GAUCHE : Flux d'attaque \u2500\u2500 -->\n      <div>\n        <!-- Carte vectorielle -->\n        <!-- Carte vectorielle -->\n        <div style=\"background:var(--bg2);border:.5px solid var(--borderem);border-radius:var(--r);overflow:hidden\">\n          <div style=\"background:var(--bg3);border-bottom:.5px solid var(--border);padding:.55rem 1rem;font-family:var(--font-mono);font-size:.46rem;letter-spacing:.18em;text-transform:uppercase;color:var(--text3);display:flex;justify-content:space-between;align-items:center\">\n            <span>Carte d&rsquo;attaque \u00b7 Temps r\u00e9el<\/span>\n            <span style=\"color:var(--warn);font-size:.46rem\" id=\"zd-phase-card\">\u2014<\/span>\n          <\/div>\n          <div style=\"height:320px;position:relative;background:var(--bg3)\">\n            <svg id=\"zd-svg\" viewBox=\"0 0 600 250\" style=\"width:100%;height:100%\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\">\n              <defs>\n                <filter id=\"glow-warm\">\n                  <feGaussianBlur stdDeviation=\"3\" result=\"blur\"\/>\n                  <feMerge><feMergeNode in=\"blur\"\/><feMergeNode in=\"SourceGraphic\"\/><\/feMerge>\n                <\/filter>\n                <filter id=\"glow-tcb\">\n                  <feGaussianBlur stdDeviation=\"4\" result=\"blur\"\/>\n                  <feMerge><feMergeNode in=\"blur\"\/><feMergeNode in=\"SourceGraphic\"\/><\/feMerge>\n                <\/filter>\n              <\/defs>\n              <!-- Grille de fond -->\n              <line x1=\"0\" y1=\"83\" x2=\"600\" y2=\"83\" stroke=\"rgba(83,74,183,.04)\" stroke-width=\".5\"\/>\n              <line x1=\"0\" y1=\"167\" x2=\"600\" y2=\"167\" stroke=\"rgba(83,74,183,.04)\" stroke-width=\".5\"\/>\n              <line x1=\"150\" y1=\"0\" x2=\"150\" y2=\"250\" stroke=\"rgba(83,74,183,.04)\" stroke-width=\".5\"\/>\n              <line x1=\"300\" y1=\"0\" x2=\"300\" y2=\"250\" stroke=\"rgba(83,74,183,.04)\" stroke-width=\".5\"\/>\n              <line x1=\"450\" y1=\"0\" x2=\"450\" y2=\"250\" stroke=\"rgba(83,74,183,.04)\" stroke-width=\".5\"\/>\n              <!-- TCB n\u0153ud central repositionn\u00e9 -->\n              <circle cx=\"300\" cy=\"125\" r=\"16\" fill=\"rgba(83,74,183,.1)\" stroke=\"var(--tcb)\" stroke-width=\"2\"\/>\n              <circle cx=\"300\" cy=\"125\" r=\"8\"  fill=\"var(--tcb)\"\/>\n              <circle id=\"zd-tcb-ring\" cx=\"300\" cy=\"125\" r=\"16\" fill=\"none\" stroke=\"var(--tcb)\" stroke-width=\"3\" opacity=\"0\" style=\"transition:opacity .1s\"\/>\n              <text x=\"300\" y=\"152\" fill=\"rgba(83,74,183,.6)\" font-size=\"8\" text-anchor=\"middle\" font-family=\"monospace\" font-weight=\"bold\">TCB FORMEL<\/text>\n              <text x=\"300\" y=\"163\" fill=\"rgba(83,74,183,.4)\" font-size=\"6\" text-anchor=\"middle\" font-family=\"monospace\">Isabelle\/HOL \u00b7 CBMC<\/text>\n              <!-- Modules permanents \u00e9largis -->\n              <circle cx=\"65\"  cy=\"52\"  r=\"7\" fill=\"rgba(15,110,86,.5)\" stroke=\"rgba(15,110,86,.35)\" stroke-width=\"1.2\"\/>\n              <circle cx=\"535\" cy=\"52\"  r=\"7\" fill=\"rgba(15,110,86,.5)\" stroke=\"rgba(15,110,86,.35)\" stroke-width=\"1.2\"\/>\n              <circle cx=\"65\"  cy=\"198\" r=\"7\" fill=\"rgba(15,110,86,.5)\" stroke=\"rgba(15,110,86,.35)\" stroke-width=\"1.2\"\/>\n              <circle cx=\"535\" cy=\"198\" r=\"7\" fill=\"rgba(15,110,86,.5)\" stroke=\"rgba(15,110,86,.35)\" stroke-width=\"1.2\"\/>\n              <circle cx=\"190\" cy=\"22\"  r=\"5\" fill=\"rgba(133,79,11,.4)\" stroke=\"rgba(133,79,11,.3)\" stroke-width=\"1\"\/>\n              <circle cx=\"410\" cy=\"228\" r=\"5\" fill=\"rgba(133,79,11,.4)\" stroke=\"rgba(133,79,11,.3)\" stroke-width=\"1\"\/>\n              <!-- Labels modules -->\n              <text x=\"65\"  y=\"40\"  fill=\"rgba(15,110,86,.55)\" font-size=\"7\" text-anchor=\"middle\" font-family=\"monospace\" font-weight=\"600\">WALL-DOME<\/text>\n              <text x=\"535\" y=\"40\"  fill=\"rgba(15,110,86,.55)\" font-size=\"7\" text-anchor=\"middle\" font-family=\"monospace\" font-weight=\"600\">AEGIS<\/text>\n              <text x=\"65\"  y=\"218\" fill=\"rgba(15,110,86,.55)\" font-size=\"7\" text-anchor=\"middle\" font-family=\"monospace\" font-weight=\"600\">SENTINEL<\/text>\n              <text x=\"535\" y=\"218\" fill=\"rgba(15,110,86,.55)\" font-size=\"7\" text-anchor=\"middle\" font-family=\"monospace\" font-weight=\"600\">M09-CB<\/text>\n              <text x=\"190\" y=\"14\"  fill=\"rgba(133,79,11,.5)\" font-size=\"6.5\" text-anchor=\"middle\" font-family=\"monospace\" font-weight=\"600\">PRISM<\/text>\n              <text x=\"410\" y=\"243\" fill=\"rgba(133,79,11,.5)\" font-size=\"6.5\" text-anchor=\"middle\" font-family=\"monospace\" font-weight=\"600\">M24 OFFLINE<\/text>\n              <!-- Connexions permanentes -->\n              <line x1=\"65\"  y1=\"52\"  x2=\"300\" y2=\"125\" stroke=\"rgba(15,110,86,.1)\" stroke-width=\"1\"\/>\n              <line x1=\"535\" y1=\"52\"  x2=\"300\" y2=\"125\" stroke=\"rgba(15,110,86,.1)\" stroke-width=\"1\"\/>\n              <line x1=\"65\"  y1=\"198\" x2=\"300\" y2=\"125\" stroke=\"rgba(15,110,86,.1)\" stroke-width=\"1\"\/>\n              <line x1=\"535\" y1=\"198\" x2=\"300\" y2=\"125\" stroke=\"rgba(15,110,86,.1)\" stroke-width=\"1\"\/>\n              <!-- \u00c9l\u00e9ments dynamiques -->\n              <g id=\"zd-attack-g\"><\/g>\n            <\/svg>\n          <\/div>\n          <!-- Barre de m\u00e9triques -->\n          <div style=\"display:grid;grid-template-columns:repeat(3,1fr);gap:1px;background:var(--border)\">\n            <div class=\"dm\"><div class=\"dm-lbl\">Vecteurs bloqu\u00e9s<\/div><div class=\"dm-val\" id=\"zd-blocked-card\" style=\"color:var(--warn)\">0<\/div><div class=\"dm-sub\">session<\/div><\/div>\n            <div class=\"dm\"><div class=\"dm-lbl\">Couverture formelle<\/div><div class=\"dm-val\" style=\"color:var(--tcb)\">100%<\/div><div class=\"dm-sub\">par construction TCB<\/div><\/div>\n            <div class=\"dm\"><div class=\"dm-lbl\">CVE requis<\/div><div class=\"dm-val\" style=\"color:var(--sec)\">0<\/div><div class=\"dm-sub\">preuves \u2260 signatures<\/div><\/div>\n          <\/div>\n        <\/div>\n      <\/div>\n \n    <!-- Journal en dessous -->\n    <div class=\"console\" id=\"zd-log\" style=\"height:220px;margin-top:1rem\">\n          <div class=\"console-title\">\/\/ Journal Zero-Day &#038; Ex Ante \u2014 Simulation automatique<\/div>\n          <div class=\"ll\"><span class=\"lt\">&#8211;:&#8211;.&#8212;<\/span><span class=\"lok\">[ OK ]<\/span><span class=\"lm\">TCB formelle active \u2014 couverture classe \u2260 signature<\/span><\/div>\n          <div class=\"ll\"><span class=\"lt\">&#8211;:&#8211;.&#8212;<\/span><span class=\"lok\">[ OK ]<\/span><span class=\"lm\">Isabelle\/HOL \u2014 <span class=\"lip\">T1\u2026T8<\/span> prouv\u00e9s \u2014 0 CVE requis<\/span><\/div>\n          <div class=\"ll\"><span class=\"lt\">&#8211;:&#8211;.&#8212;<\/span><span class=\"lok\">[ OK ]<\/span><span class=\"lm\">Ex ante actif \u2014 vecteurs inconnus couverts par construction<\/span><\/div>\n    <\/div>\n  <\/section>\n<\/div>\n \n \n<!-- \u2500\u2500 SIMULATION HYBRIDE HUMAIN + IA \u2500\u2500 -->\n<div style=\"background:var(--bg2);border-top:.5px solid var(--border);border-bottom:.5px solid var(--border)\" id=\"hybridsim\">\n  <section style=\"max-width:1200px;margin:0 auto\">\n \n    <div style=\"display:flex;align-items:flex-end;justify-content:space-between;margin-bottom:2rem;flex-wrap:wrap;gap:1rem\">\n      <div>\n        <p class=\"s-lbl\" style=\"color:#7B3F00\">Simulation \u00b7 Attaque Hybride Humain + IA<\/p>\n        <h2 class=\"s-ttl\" style=\"margin-bottom:.3rem\">Vitesse <em>machine<\/em>, sophistication <em>humaine<\/em><\/h2>\n        <p style=\"font-family:var(--font-mono);font-size:.55rem;color:var(--text3);letter-spacing:.07em;max-width:700px;line-height:1.7\">\n          APT coordonn\u00e9s par IA \u2014 attaques multi-vecteurs simultan\u00e9es en <strong style=\"color:var(--text2)\">&lt;50 ms<\/strong> avec mutation de payload en temps r\u00e9el, pivots lat\u00e9raux automatis\u00e9s et \u00e9vasion comportementale. La TCB r\u00e9pond par <strong style=\"color:var(--text2)\">preuve formelle<\/strong> ind\u00e9pendamment de la vitesse du vecteur.\n        <\/p>\n      <\/div>\n      <div style=\"display:flex;align-items:center;gap:.6rem;flex-wrap:wrap\">\n        <div style=\"font-family:var(--font-mono);font-size:.52rem;letter-spacing:.08em;color:#7B3F00;display:flex;align-items:center;gap:6px\">\n          <span id=\"hy-dot\" style=\"width:6px;height:6px;border-radius:50%;background:#7B3F00;display:inline-block;animation:blink .8s ease-in-out infinite\"><\/span>\n          <span id=\"hy-label\">SIMULATION ACTIVE \u00b7 VITESSE IA<\/span>\n        <\/div>\n        <button class=\"demo-btn\" onclick=\"hyToggle()\" id=\"hy-btn-pause\" style=\"min-width:90px;border-color:rgba(123,63,0,.35);color:#7B3F00\">\u23f8 Pause<\/button>\n        <button class=\"demo-btn demo-reset\" onclick=\"hyReset()\">\u21ba Reset<\/button>\n      <\/div>\n    <\/div>\n \n    <!-- M\u00e9triques vitesse en haut -->\n    <div style=\"display:grid;grid-template-columns:repeat(5,1fr);gap:1px;background:var(--border);border-radius:var(--r);overflow:hidden;margin-bottom:1rem\">\n      <div class=\"dm\"><div class=\"dm-lbl\">Vecteurs simultan\u00e9s<\/div><div class=\"dm-val\" id=\"hy-vectors\" style=\"color:#7B3F00\">0<\/div><div class=\"dm-sub\">cette s\u00e9quence<\/div><\/div>\n      <div class=\"dm\"><div class=\"dm-lbl\">Vitesse attaque IA<\/div><div class=\"dm-val\" style=\"color:var(--crit)\">&lt;50 ms<\/div><div class=\"dm-sub\">mutation payload<\/div><\/div>\n      <div class=\"dm\"><div class=\"dm-lbl\">R\u00e9ponse TCB<\/div><div class=\"dm-val\" id=\"hy-response\" style=\"color:var(--tcb)\">421 ns<\/div><div class=\"dm-sub\" id=\"hy-response-sub\">seL4 kernel<\/div><\/div>\n      <div class=\"dm\"><div class=\"dm-lbl\">Attaques bloqu\u00e9es<\/div><div class=\"dm-val\" id=\"hy-blocked\" style=\"color:var(--sec)\">0<\/div><div class=\"dm-sub\">session<\/div><\/div>\n      <div class=\"dm\"><div class=\"dm-lbl\">Ratio vitesse<\/div><div class=\"dm-val\" style=\"color:var(--sec)\">\u00d7100 000<\/div><div class=\"dm-sub\">TCB vs attaque IA<\/div><\/div>\n    <\/div>\n \n    <!-- Carte grande pleine largeur -->\n    <div style=\"background:var(--bg3);border:.5px solid var(--borderem);border-radius:var(--r);overflow:hidden;margin-bottom:1rem\">\n      <div style=\"background:var(--bg2);border-bottom:.5px solid var(--border);padding:.55rem 1rem;display:flex;justify-content:space-between;align-items:center\">\n        <span style=\"font-family:var(--font-mono);font-size:.46rem;letter-spacing:.18em;text-transform:uppercase;color:var(--text3)\">Carte d&rsquo;attaque hybride \u00b7 Multi-vecteurs simultan\u00e9s<\/span>\n        <span id=\"hy-phase\" style=\"font-family:var(--font-mono);font-size:.5rem;color:#7B3F00;letter-spacing:.08em\">En attente\u2026<\/span>\n      <\/div>\n      <div style=\"height:320px;position:relative\">\n        <svg id=\"hy-svg\" viewBox=\"0 0 900 280\" style=\"width:100%;height:100%\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\">\n          <defs>\n            <marker id=\"hy-arr\" markerWidth=\"6\" markerHeight=\"6\" refX=\"5\" refY=\"3\" orient=\"auto\"><path d=\"M0,0 L0,6 L6,3 z\" fill=\"rgba(123,63,0,.6)\"\/><\/marker>\n            <filter id=\"hy-glow\"><feGaussianBlur stdDeviation=\"3\" result=\"b\"\/><feMerge><feMergeNode in=\"b\"\/><feMergeNode in=\"SourceGraphic\"\/><\/feMerge><\/filter>\n          <\/defs>\n          <!-- Grille -->\n          <line x1=\"0\" y1=\"93\" x2=\"900\" y2=\"93\" stroke=\"rgba(83,74,183,.03)\" stroke-width=\".5\"\/>\n          <line x1=\"0\" y1=\"187\" x2=\"900\" y2=\"187\" stroke=\"rgba(83,74,183,.03)\" stroke-width=\".5\"\/>\n          <line x1=\"225\" y1=\"0\" x2=\"225\" y2=\"280\" stroke=\"rgba(83,74,183,.03)\" stroke-width=\".5\"\/>\n          <line x1=\"450\" y1=\"0\" x2=\"450\" y2=\"280\" stroke=\"rgba(83,74,183,.03)\" stroke-width=\".5\"\/>\n          <line x1=\"675\" y1=\"0\" x2=\"675\" y2=\"280\" stroke=\"rgba(83,74,183,.03)\" stroke-width=\".5\"\/>\n \n          <!-- TCB centre -->\n          <circle cx=\"450\" cy=\"140\" r=\"18\" fill=\"rgba(83,74,183,.12)\" stroke=\"var(--tcb)\" stroke-width=\"2.5\"\/>\n          <circle cx=\"450\" cy=\"140\" r=\"9\"  fill=\"var(--tcb)\" filter=\"url(#hy-glow)\"\/>\n          <circle id=\"hy-tcb-ring1\" cx=\"450\" cy=\"140\" r=\"18\" fill=\"none\" stroke=\"var(--tcb)\" stroke-width=\"3\" opacity=\"0\" style=\"transition:opacity .08s\"\/>\n          <circle id=\"hy-tcb-ring2\" cx=\"450\" cy=\"140\" r=\"28\" fill=\"none\" stroke=\"var(--tcb)\" stroke-width=\"2\" opacity=\"0\" style=\"transition:opacity .12s\"\/>\n          <text x=\"450\" y=\"168\" fill=\"rgba(83,74,183,.7)\" font-size=\"8.5\" text-anchor=\"middle\" font-family=\"monospace\" font-weight=\"bold\">TCB CORTEX ORIGIN\u2122<\/text>\n          <text x=\"450\" y=\"179\" fill=\"rgba(83,74,183,.45)\" font-size=\"6\" text-anchor=\"middle\" font-family=\"monospace\">seL4 EAL7 \u00b7 PRISM \u00b7 OMEGA<\/text>\n \n          <!-- Modules L1b (plus grand canvas = plus d'espace) -->\n          <circle cx=\"80\"  cy=\"55\"  r=\"8\" fill=\"rgba(15,110,86,.55)\" stroke=\"rgba(15,110,86,.4)\" stroke-width=\"1.5\"\/>\n          <circle cx=\"820\" cy=\"55\"  r=\"8\" fill=\"rgba(15,110,86,.55)\" stroke=\"rgba(15,110,86,.4)\" stroke-width=\"1.5\"\/>\n          <circle cx=\"80\"  cy=\"225\" r=\"8\" fill=\"rgba(15,110,86,.55)\" stroke=\"rgba(15,110,86,.4)\" stroke-width=\"1.5\"\/>\n          <circle cx=\"820\" cy=\"225\" r=\"8\" fill=\"rgba(15,110,86,.55)\" stroke=\"rgba(15,110,86,.4)\" stroke-width=\"1.5\"\/>\n          <circle cx=\"225\" cy=\"25\"  r=\"6\" fill=\"rgba(83,74,183,.45)\" stroke=\"rgba(83,74,183,.3)\" stroke-width=\"1\"\/>\n          <circle cx=\"675\" cy=\"255\" r=\"6\" fill=\"rgba(83,74,183,.45)\" stroke=\"rgba(83,74,183,.3)\" stroke-width=\"1\"\/>\n          <circle cx=\"225\" cy=\"255\" r=\"6\" fill=\"rgba(15,110,86,.4)\" stroke=\"rgba(15,110,86,.25)\" stroke-width=\"1\"\/>\n          <circle cx=\"675\" cy=\"25\"  r=\"6\" fill=\"rgba(15,110,86,.4)\" stroke=\"rgba(15,110,86,.25)\" stroke-width=\"1\"\/>\n \n          <!-- Labels modules -->\n          <text x=\"80\"  y=\"42\"  fill=\"rgba(15,110,86,.6)\" font-size=\"8\" text-anchor=\"middle\" font-family=\"monospace\" font-weight=\"600\">WALL-DOME<\/text>\n          <text x=\"820\" y=\"42\"  fill=\"rgba(15,110,86,.6)\" font-size=\"8\" text-anchor=\"middle\" font-family=\"monospace\" font-weight=\"600\">AEGIS<\/text>\n          <text x=\"80\"  y=\"248\" fill=\"rgba(15,110,86,.6)\" font-size=\"8\" text-anchor=\"middle\" font-family=\"monospace\" font-weight=\"600\">SENTINEL<\/text>\n          <text x=\"820\" y=\"248\" fill=\"rgba(15,110,86,.6)\" font-size=\"8\" text-anchor=\"middle\" font-family=\"monospace\" font-weight=\"600\">M09-CB<\/text>\n          <text x=\"225\" y=\"15\"  fill=\"rgba(83,74,183,.5)\" font-size=\"7\" text-anchor=\"middle\" font-family=\"monospace\" font-weight=\"600\">PRISM<\/text>\n          <text x=\"675\" y=\"270\" fill=\"rgba(83,74,183,.5)\" font-size=\"7\" text-anchor=\"middle\" font-family=\"monospace\" font-weight=\"600\">M24 OFFLINE<\/text>\n          <text x=\"225\" y=\"270\" fill=\"rgba(15,110,86,.5)\" font-size=\"7\" text-anchor=\"middle\" font-family=\"monospace\" font-weight=\"600\">ATLAS<\/text>\n          <text x=\"675\" y=\"15\"  fill=\"rgba(15,110,86,.5)\" font-size=\"7\" text-anchor=\"middle\" font-family=\"monospace\" font-weight=\"600\">M11-TL<\/text>\n \n          <!-- Connexions -->\n          <line x1=\"80\"  y1=\"55\"  x2=\"450\" y2=\"140\" stroke=\"rgba(15,110,86,.08)\" stroke-width=\"1\"\/>\n          <line x1=\"820\" y1=\"55\"  x2=\"450\" y2=\"140\" stroke=\"rgba(15,110,86,.08)\" stroke-width=\"1\"\/>\n          <line x1=\"80\"  y1=\"225\" x2=\"450\" y2=\"140\" stroke=\"rgba(15,110,86,.08)\" stroke-width=\"1\"\/>\n          <line x1=\"820\" y1=\"225\" x2=\"450\" y2=\"140\" stroke=\"rgba(15,110,86,.08)\" stroke-width=\"1\"\/>\n          <line x1=\"225\" y1=\"25\"  x2=\"450\" y2=\"140\" stroke=\"rgba(83,74,183,.06)\" stroke-width=\"1\"\/>\n          <line x1=\"675\" y1=\"255\" x2=\"450\" y2=\"140\" stroke=\"rgba(83,74,183,.06)\" stroke-width=\"1\"\/>\n \n          <!-- \u00c9l\u00e9ments dynamiques -->\n          <g id=\"hy-attack-g\"><\/g>\n        <\/svg>\n      <\/div>\n    <\/div>\n \n    <!-- Journal + current attack info -->\n    <div style=\"display:grid;grid-template-columns:1fr 1.2fr;gap:1rem\">\n      <!-- Info attaque courante -->\n      <div>\n        <div id=\"hy-attack-card\" style=\"background:var(--bg3);border:.5px solid var(--border);border-radius:var(--r);padding:1rem 1.2rem;margin-bottom:1rem;min-height:80px\">\n          <div style=\"font-family:var(--font-mono);font-size:.48rem;letter-spacing:.2em;text-transform:uppercase;color:#7B3F00;margin-bottom:.5rem\">ATTAQUE COURANTE<\/div>\n          <div id=\"hy-atk-name\" style=\"font-size:.9rem;font-weight:700;color:var(--text);margin-bottom:.3rem\">\u2014<\/div>\n          <div id=\"hy-atk-detail\" style=\"font-family:var(--font-mono);font-size:.54rem;color:var(--text3);line-height:1.6\">\u2014<\/div>\n        <\/div>\n        <div style=\"background:var(--bg3);border:.5px solid var(--border);border-radius:var(--r);padding:1rem 1.2rem\">\n          <div style=\"font-family:var(--font-mono);font-size:.48rem;letter-spacing:.2em;text-transform:uppercase;color:#7B3F00;margin-bottom:.5rem\">R\u00c9PONSE TCB<\/div>\n          <div id=\"hy-tcb-response\" style=\"font-family:var(--font-mono);font-size:.56rem;color:var(--text2);line-height:1.7;border-left:3px solid var(--tcb);padding-left:.8rem;min-height:48px\">Syst\u00e8me en attente\u2026<\/div>\n        <\/div>\n      <\/div>\n      <!-- Log -->\n      <div class=\"console\" id=\"hy-log\" style=\"height:220px\">\n        <div class=\"console-title\">\/\/ Journal Hybride IA+Humain \u2014 Vitesse machine \u00b7 Sophistication humaine<\/div>\n        <div class=\"ll\"><span class=\"lt\">&#8211;:&#8211;.&#8212;<\/span><span class=\"lok\">[ OK ]<\/span><span class=\"lm\">TCB active \u2014 preuves formelles ind\u00e9pendantes de la vitesse vecteur<\/span><\/div>\n        <div class=\"ll\"><span class=\"lt\">&#8211;:&#8211;.&#8212;<\/span><span class=\"lok\">[ OK ]<\/span><span class=\"lm\">Ratio TCB\/attaque = <span class=\"lip\">\u00d7100 000<\/span> \u2014 421 ns vs &lt;50 ms IA<\/span><\/div>\n      <\/div>\n    <\/div>\n  <\/section>\n<\/div>\n \n \n<!-- \u2500\u2500 CTA \u2500\u2500 -->\n<div style=\"background:var(--bg2);border-top:.5px solid var(--border);padding:3rem 1.5rem;text-align:center\" id=\"contact\">\n  <section style=\"max-width:700px;margin:0 auto\">\n    <p class=\"s-lbl\" style=\"display:block;text-align:center;margin-bottom:.8rem\">Contact &#038; \u00c9valuation<\/p>\n    <h2 style=\"font-family:var(--font-serif);font-size:2.8rem;font-weight:400;color:var(--text);margin-bottom:1rem;line-height:1.15\">\n      S\u00e9curisez votre<br><em style=\"color:var(--tcb);font-style:italic\">infrastructure critique<\/em>\n    <\/h2>\n    <p style=\"font-size:.85rem;color:var(--text2);line-height:1.8;max-width:520px;margin:0 auto 2rem\">\n      Rejoignez les organisations OIV\/SSR qui font confiance \u00e0 CORTEX ORIGIN\u2122 pour prot\u00e9ger leurs syst\u00e8mes les plus critiques avec des preuves formelles.\n    <\/p>\n    <a href=\"mailto:contact@cortexorigin.com\"\n       style=\"display:inline-block;background:var(--tcb);color:#fff;font-family:var(--font-mono);font-size:.58rem;letter-spacing:.18em;text-transform:uppercase;padding:.75rem 2rem;border-radius:3px;text-decoration:none;transition:opacity .2s\"\n       onmouseover=\"this.style.opacity='.85'\" onmouseout=\"this.style.opacity='1'\">\n      contact@cortexorigin.com \u2192\n    <\/a>\n    <div style=\"display:flex;gap:2rem;justify-content:center;flex-wrap:wrap;margin-top:2.5rem;padding-top:1.5rem;border-top:.5px solid var(--border)\">\n      <span style=\"font-family:var(--font-mono);font-size:.52rem;color:var(--text3);letter-spacing:.1em\">\u2713 \u00c9VALUATION CFVL COMPL\u00c8TE<\/span>\n      <span style=\"font-family:var(--font-mono);font-size:.52rem;color:var(--text3);letter-spacing:.1em\">\u2713 ARCHITECTURE SOUVERAINE<\/span>\n      <span style=\"font-family:var(--font-mono);font-size:.52rem;color:var(--text3);letter-spacing:.1em\">\u2713 SUPPORT TECHNIQUE D\u00c9DI\u00c9<\/span>\n      <span style=\"font-family:var(--font-mono);font-size:.52rem;color:var(--text3);letter-spacing:.1em\">\u2713 RAPPORTS FORMELS FOURNIS<\/span>\n    <\/div>\n  <\/section>\n<\/div>\n \n \n<script>\n\/* \u2500\u2500 CWE MINI GRID \u2500\u2500 *\/\nconst CWE_LIST=[\n  {id:'CWE-119',desc:'Buffer Overflow',cover:'kernel',sev:'CRITICAL'},\n  {id:'CWE-416',desc:'Use-After-Free',cover:'kernel',sev:'CRITICAL'},\n  {id:'CWE-787',desc:'OOB Write',cover:'kernel',sev:'CRITICAL'},\n  {id:'CWE-078',desc:'OS Cmd Inj.',cover:'module',sev:'CRITICAL'},\n  {id:'CWE-190',desc:'Integer Overflow',cover:'sel4',sev:'HIGH'},\n  {id:'CWE-476',desc:'Null Deref.',cover:'sel4',sev:'HIGH'},\n  {id:'CWE-362',desc:'Race Condition',cover:'sel4',sev:'HIGH'},\n  {id:'CWE-327',desc:'Weak Crypto',cover:'module',sev:'HIGH'},\n  {id:'CWE-020',desc:'Input Valid.',cover:'module',sev:'HIGH'},\n  {id:'CWE-089',desc:'SQL Injection',cover:'module',sev:'HIGH'},\n  {id:'CWE-400',desc:'Res. Exhaustion',cover:'module',sev:'HIGH'},\n  {id:'CWE-502',desc:'Insec. Deserial.',cover:'module',sev:'HIGH'},\n  {id:'CWE-918',desc:'SSRF',cover:'sel4',sev:'HIGH'},\n  {id:'CWE-369',desc:'Div by Zero',cover:'module',sev:'HIGH'},\n  {id:'CWE-125',desc:'OOB Read',cover:'module',sev:'HIGH'},\n];\nconst coverLabel={kernel:'\u2131 kernel',sel4:'\u2191 seL4',module:'\u2713 module'};\nconst coverCls={kernel:'cover-k',sel4:'cover-s',module:'cover-m'};\nconst grid=document.getElementById('cwe-grid');\nif(grid) CWE_LIST.forEach(c=>{\n  const d=document.createElement('div');d.className='cwe-chip';\n  d.innerHTML=`<div class=\"cwe-id\">${c.id}<\/div><div class=\"cwe-desc\">${c.desc}<\/div><span class=\"cwe-cover ${coverCls[c.cover]}\">${coverLabel[c.cover]}<\/span>`;\n  grid.appendChild(d);\n});\n \n\/* \u2500\u2500 TERMINAL HERO \u2500\u2500 *\/\nconst heroLog=document.getElementById('hero-log');\nconst heroMsgs=[\n  ['ok','M01 SENTINEL','fuzzing 1,9 Mds inputs \u2014 0 crash \u2014 TNR 100%'],\n  ['ok','M09-CB','CircuitBreaker \u2014 9,0 ns mean \u00b7 144 ns p99'],\n  ['ok','AEGIS\u2122','WP 614\/650 goals \u2014 94,5% Frama-C'],\n  ['ok','ATLAS\u2122','CFVL 97\/100 \u2014 fuzzing total 116 Mds'],\n  ['ok','seL4 EAL7','capability integrity T2 \u2014 escalade impossible \u00b7 421 ns'],\n  ['ok','M11 TrustLink','CFVL-EVAL-009 v3 \u2014 100\/100'],\n  ['ok','WALL-DOME\u2122','15\/15 CWE \u00b7 h\u00e9ritage seL4 \u2014 TNR 100%'],\n  ['ok','M26 AVA-CPL','96\/100 \u00b7 CSPN evidence pack OK'],\n];\nlet hIdx=0;\nfunction addHeroLog(type,mod,msg){\n  const n=new Date();\n  const t=`${String(n.getHours()).padStart(2,'0')}:${String(n.getMinutes()).padStart(2,'0')}:${String(n.getSeconds()).padStart(2,'0')}.${String(n.getMilliseconds()).padStart(3,'0')}`;\n  const d=document.createElement('div');d.className='tl tl-new';\n  d.innerHTML=`<span class=\"tt\">${t}<\/span><span class=\"tok\">[ OK ]<\/span><span class=\"tm\"><span class=\"tip\">${mod}<\/span> \u2014 ${msg}<\/span>`;\n  heroLog.appendChild(d);\n  while(heroLog.children.length>12)heroLog.removeChild(heroLog.firstChild);\n}\nsetInterval(()=>{ const m=heroMsgs[hIdx%heroMsgs.length]; addHeroLog('ok',m[1],m[2]); hIdx++; },2600);\n \n\/* Fuzz counter *\/\nlet fv=0,ftgt=1160,fel=document.getElementById('h-fuzz');\nconst fi=setInterval(()=>{ fv=Math.min(fv+18,ftgt); if(fel)fel.textContent=(fv\/10).toFixed(0); if(fv>=ftgt)clearInterval(fi); },30);\n \n\/* \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\n   SIMULATEUR D'ATTAQUE AUTOMATIQUE\n\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550 *\/\n \n\/* Catalogue complet des attaques avec module CORTEX par CWE *\/\nconst ATTACKS = [\n  {\n    name:'Injection SQL', cwe:'CWE-089', sev:'HIGH', color:'#993C1D',\n    source:[60,40], label:'SQL Inject',\n    module:'WALL-DOME\u2122', layer:'L1b', proof:'CFVL 100\/100',\n    latency:'~2,1 \u00b5s', latency_detail:'WALL-DOME path complet',\n    detection:'h\u00e9ritage seL4 \u2191 \u00b7 isolation applicative \u00b7 2,1 \u00b5s',\n    steps:[\n      {delay:0,   log:['warn','WALL-DOME\u2122','CWE-089 d\u00e9tect\u00e9 \u2014 payload SQL analys\u00e9 \u2014 TCB CORTEX actif']},\n      {delay:500, log:['warn','AEGIS\u2122','Pattern injection confirm\u00e9 \u2014 614\/650 WP goals actifs']},\n      {delay:950, log:['ok','WALL-DOME\u2122','Connexion isol\u00e9e \u00b7 h\u00e9ritage seL4 \u2191 \u00b7 TNR CWE-089 = 100% \u00b7 2,1 \u00b5s']},\n    ]\n  },\n  {\n    name:'Buffer Overflow', cwe:'CWE-119', sev:'CRITICAL', color:'#7B0000',\n    source:[540,40], label:'Buf. Overflow',\n    module:'seL4 EAL7', layer:'TCB', proof:'Isabelle\/HOL T1\/T6',\n    latency:'421 ns', latency_detail:'isolation m\u00e9moire kernel',\n    detection:'isolation m\u00e9moire cross-domain \u00b7 T1\/T6 \u00b7 421 ns',\n    steps:[\n      {delay:0,   log:['warn','seL4 EAL7','CWE-119 \u2014 \u00e9criture cross-domain d\u00e9tect\u00e9e \u00b7 T1\/T6 \u00b7 421 ns']},\n      {delay:450, log:['warn','M00 Root-of-Trust','Capability integrity \u2014 escalade impossible \u00b7 2,5 ns mean']},\n      {delay:900, log:['ok','seL4 EAL7','Buffer Overflow bloqu\u00e9 \u00b7 Isabelle\/HOL T1\/T6 \u00b7 421 ns prouv\u00e9']},\n    ]\n  },\n  {\n    name:'Brute-force SSH', cwe:'CWE-307', sev:'HIGH', color:'#854F0B',\n    source:[60,160], label:'Brute-force',\n    module:'M09-CB + SENTINEL', layer:'L1b', proof:'CFVL 100\/100',\n    latency:'~2,1 \u00b5s', latency_detail:'M09-CB 9,0 ns mean kernel',\n    detection:'rate limiting \u00b7 CWE-307 \u00b7 8 tentatives\/3s \u00b7 ~2,1 \u00b5s',\n    steps:[\n      {delay:0,   log:['warn','SENTINEL','CWE-307 \u2014 8 tentatives SSH\/3s \u2014 anomalie comportementale \u00b7 31,7 ns']},\n      {delay:480, log:['warn','M09-CB','CircuitBreaker activ\u00e9 \u2014 9,0 ns mean \u00b7 rate limiting forc\u00e9']},\n      {delay:950, log:['ok','SENTINEL','Brute-force bloqu\u00e9 \u00b7 IP bannie \u00b7 alerte PRISM \u00b7 2,1 \u00b5s end-to-end']},\n    ]\n  },\n  {\n    name:'Race Condition', cwe:'CWE-362', sev:'HIGH', color:'#1a5fa0',\n    source:[540,160], label:'Race Cond.',\n    module:'seL4 EAL7', layer:'TCB', proof:'Isabelle\/HOL T3',\n    latency:'421 ns', latency_detail:'IPC synchrone et atomique',\n    detection:'IPC seL4 synchrone et atomique \u00b7 T3 \u00b7 421 ns',\n    steps:[\n      {delay:0,   log:['warn','seL4 EAL7','CWE-362 \u2014 race condition IPC d\u00e9tect\u00e9e \u00b7 T3 actif \u00b7 421 ns']},\n      {delay:440, log:['warn','PRISM','FSM audit \u2014 transition etat ill\u00e9gitime intercept\u00e9e \u00b7 9,3 ns']},\n      {delay:900, log:['ok','seL4 EAL7','Race condition impossible \u00b7 IPC atomique T3 \u00b7 421 ns Isabelle\/HOL']},\n    ]\n  },\n  {\n    name:'Exfiltration C2', cwe:'CWE-918', sev:'HIGH', color:'#534AB7',\n    source:[190,18], label:'C2 Exfil',\n    module:'seL4 EAL7', layer:'TCB', proof:'Isabelle\/HOL T8',\n    latency:'421 ns', latency_detail:'non-interference TCB',\n    detection:'non-interference information flow \u00b7 T8 \u00b7 421 ns',\n    steps:[\n      {delay:0,   log:['warn','PRISM','CWE-918 \u2014 connexion C2 suspecte \u00b7 T8 non-interference \u00b7 4,0 ns BLP']},\n      {delay:480, log:['warn','seL4 EAL7','Tunnel exfiltration \u2014 information flow T8 bloqu\u00e9 \u00b7 421 ns']},\n      {delay:950, log:['ok','PRISM','Exfiltration stopp\u00e9e \u00b7 OMEGA notifi\u00e9 \u00b7 0 octet sorti \u00b7 421 ns']},\n    ]\n  },\n  {\n    name:'OS Cmd Injection', cwe:'CWE-078', sev:'CRITICAL', color:'#8B0000',\n    source:[420,178], label:'Cmd Inject',\n    module:'M24 Offline\u2122 + WALL-DOME\u2122', layer:'L1b', proof:'CBMC 13 props',\n    latency:'~2,1 \u00b5s', latency_detail:'M24 28,1 ns mean kernel',\n    detection:'architecture offline \u00b7 pas interface shell \u00b7 ~2,1 \u00b5s',\n    steps:[\n      {delay:0,   log:['warn','WALL-DOME\u2122','CWE-078 \u2014 tentative OS command injection \u2014 isolation active']},\n      {delay:480, log:['warn','M24 Offline\u2122','Mode offline : aucune interface shell \u00b7 CBMC 13\/13 \u00b7 28,1 ns mean']},\n      {delay:950, log:['ok','WALL-DOME\u2122','CWE-078 inexistant offline \u00b7 M24 CBMC 13 props \u00b7 ~2,1 \u00b5s']},\n    ]\n  },\n  {\n    name:'Null Dereference', cwe:'CWE-476', sev:'HIGH', color:'#374151',\n    source:[60,40], label:'Null Deref.',\n    module:'seL4 EAL7', layer:'TCB', proof:'Isabelle\/HOL T4',\n    latency:'421 ns', latency_detail:'null page non-mapp\u00e9e VM_FAULT',\n    detection:'null page non-mapp\u00e9e \u2192 VM_FAULT \u00b7 T4 \u00b7 421 ns',\n    steps:[\n      {delay:0,   log:['warn','seL4 EAL7','CWE-476 \u2014 null d\u00e9r\u00e9f\u00e9rencement d\u00e9tect\u00e9 \u00b7 T4 actif \u00b7 421 ns']},\n      {delay:440, log:['warn','M00 Root-of-Trust','Page nulle non-mapp\u00e9e \u2014 VM_FAULT \u00b7 2,5 ns mean kernel']},\n      {delay:900, log:['ok','seL4 EAL7','Null Deref bloqu\u00e9 \u00b7 VM_FAULT T4 \u00b7 Isabelle\/HOL \u00b7 421 ns']},\n    ]\n  },\n  {\n    name:'Res. Exhaustion', cwe:'CWE-400', sev:'HIGH', color:'#065F46',\n    source:[540,160], label:'DoS Exhaus.',\n    module:'M09 CircuitBreaker', layer:'L1b', proof:'CFVL 100\/100',\n    latency:'~2,1 \u00b5s', latency_detail:'M09-CB 9,0 ns mean \u00b7 trip 9,0 ns',\n    detection:'rate limit \u00b7 circuit breaker \u00b7 9,0 ns mean \u00b7 ~2,1 \u00b5s',\n    steps:[\n      {delay:0,   log:['warn','M09-CB','CWE-400 \u2014 saturation ressources d\u00e9tect\u00e9e \u2014 circuit ouvert \u00b7 9,0 ns']},\n      {delay:480, log:['warn','AEGIS\u2122','Playbook d\u00e9fensif activ\u00e9 \u2014 flux suspect isol\u00e9 \u00b7 6,8 ns block']},\n      {delay:950, log:['ok','M09-CB','DoS neutralis\u00e9 \u00b7 Circuit Breaker 100\/100 \u00b7 ~2,1 \u00b5s end-to-end']},\n    ]\n  },\n];\n \n \n\/* Modules pour la grille de statut *\/\nconst MODULES = [\n  {id:'seL4',  name:'seL4 EAL7',     color:'var(--tcb)', score:'\u2131 TCB'},\n  {id:'prism', name:'PRISM',          color:'var(--tcb)', score:'100\/100'},\n  {id:'omega', name:'OMEGA',          color:'var(--tcb)', score:'100\/100'},\n  {id:'wall',  name:'WALL-DOME',      color:'var(--sec)', score:'100\/100'},\n  {id:'aegis', name:'AEGIS\u2122',         color:'var(--sec)', score:'94,5%'},\n  {id:'m09',   name:'M09-CB',         color:'var(--sec)', score:'100\/100'},\n  {id:'sent',  name:'SENTINEL',       color:'var(--sec)', score:'100\/100'},\n  {id:'atlas', name:'ATLAS\u2122',         color:'var(--sec)', score:'97\/100'},\n  {id:'m24',   name:'M24 Offline',    color:'var(--sec)', score:'100\/100'},\n  {id:'m00',   name:'M00 RoT',        color:'var(--tcb)', score:'~85%'},\n  {id:'m11',   name:'M11-TL',         color:'var(--sec)', score:'100\/100'},\n  {id:'m26',   name:'M26-CPL',        color:'var(--sec)', score:'96\/100'},\n];\n \n\/* Module \u2192 modules actifs pour une attaque *\/\nconst MODULE_MAP = {\n  'seL4 EAL7':['seL4','prism','m00'],\n  'WALL-DOME\u2122':['wall','seL4'],\n  'M09-CB + SENTINEL':['m09','sent'],\n  'M09-CB':['m09'],\n  'SENTINEL':['sent'],\n  'M24 Offline\u2122 + WALL-DOME\u2122':['m24','wall'],\n  'PRISM':['prism','omega'],\n  'seL4 EAL7':['seL4','m00'],\n};\nfunction getActiveIds(moduleName){\n  for(const [k,v] of Object.entries(MODULE_MAP)){ if(moduleName.includes(k.split(' ')[0])) return v; }\n  return ['seL4'];\n}\n \n\/* Construire la grille de modules *\/\nfunction buildModuleGrid(){\n  const g=document.getElementById('module-grid');\n  if(!g) return;\n  g.innerHTML='';\n  MODULES.forEach(m=>{\n    const d=document.createElement('div');\n    d.id='mod-'+m.id;\n    d.style.cssText=`background:var(--bg2);border:.5px solid var(--border);border-radius:5px;padding:7px 9px;transition:all .25s`;\n    d.innerHTML=`<div style=\"font-family:var(--font-mono);font-size:.44rem;font-weight:700;color:var(--text3);letter-spacing:.06em;margin-bottom:2px\">${m.name}<\/div>\n                 <div style=\"font-family:var(--font-mono);font-size:.46rem;color:var(--text2)\">${m.score}<\/div>`;\n    g.appendChild(d);\n  });\n}\nbuildModuleGrid();\n \n\/* Activer un module visuellement *\/\nfunction flashModule(id, color){\n  const el=document.getElementById('mod-'+id);\n  if(!el) return;\n  el.style.background=color+'15';\n  el.style.borderColor=color;\n  el.style.transform='scale(1.04)';\n  setTimeout(()=>{ el.style.background='var(--bg2)'; el.style.borderColor='var(--border)'; el.style.transform='scale(1)'; },2000);\n}\nfunction resetModules(){ MODULES.forEach(m=>{ const el=document.getElementById('mod-'+m.id); if(el){el.style.background='var(--bg2)';el.style.borderColor='var(--border)';el.style.transform='scale(1)';} }); }\n \n\/* \u2500\u2500 UTILS \u2500\u2500 *\/\nfunction ts(){const n=new Date();return`${String(n.getHours()).padStart(2,'0')}:${String(n.getMinutes()).padStart(2,'0')}.${String(n.getMilliseconds()).padStart(3,'0')}`}\nfunction addLog(type,mod,msg){\n  const cls=type==='ok'?'lok':type==='warn'?'lwn':'lcr';\n  const lbl=type==='ok'?'[ OK ]':type==='warn'?'[ WARN ]':'[ CRIT ]';\n  const d=document.createElement('div');d.className='ll ll-new';\n  d.innerHTML=`<span class=\"lt\">${ts()}<\/span><span class=\"${cls}\">${lbl}<\/span><span class=\"lm\"><span class=\"lip\">${mod}<\/span> \u2014 ${msg}<\/span>`;\n  const log=document.getElementById('log');\n  if(log){log.appendChild(d);log.scrollTop=log.scrollHeight;}\n}\nfunction svgEl(tag,attrs){\n  const el=document.createElementNS('http:\/\/www.w3.org\/2000\/svg',tag);\n  for(const [k,v] of Object.entries(attrs)) el.setAttribute(k,v);\n  return el;\n}\n \nfunction addAttackNode(x,y,color,blocked){\n  const NS='http:\/\/www.w3.org\/2000\/svg';\n  const g=document.createElementNS(NS,'g');\n  const tx=300, ty=120;\n  const dx=tx-x, dy=ty-y;\n  const len=Math.sqrt(dx*dx+dy*dy);\n \n  if(!blocked){\n    \/* \u2500\u2500 Ligne anim\u00e9e : flux entrant \u2500\u2500 *\/\n    const lineLen=Math.ceil(len);\n    const line=svgEl('line',{x1:x,y1:y,x2:tx,y2:ty,\n      stroke:color,'stroke-width':'1.5',\n      'stroke-dasharray':'8 4',opacity:'.6'});\n    line.innerHTML=`<animate attributeName=\"stroke-dashoffset\" from=\"${lineLen}\" to=\"0\" dur=\"0.7s\" repeatCount=\"indefinite\"\/>`;\n    g.appendChild(line);\n \n    \/* \u2500\u2500 Projectile anim\u00e9 \u2500\u2500 *\/\n    const proj=svgEl('circle',{r:'4',fill:color,opacity:'.9'});\n    proj.innerHTML=`<animateMotion dur=\"0.7s\" repeatCount=\"indefinite\" calcMode=\"linear\">\n      <mpath href=\"#path-${x}-${y}\"\/>\n    <\/animateMotion>`;\n    const pathEl=svgEl('path',{id:`path-${x}-${y}`,d:`M${x},${y} L${tx},${ty}`,fill:'none',stroke:'none'});\n    g.appendChild(pathEl);\n    g.appendChild(proj);\n \n    \/* \u2500\u2500 N\u0153ud source \u2500\u2500 *\/\n    const src=svgEl('circle',{cx:x,cy:y,r:'8',fill:color,opacity:'.85'});\n    g.appendChild(src);\n \n    \/* \u2500\u2500 Pulse 1 \u2500\u2500 *\/\n    const p1=svgEl('circle',{cx:x,cy:y,r:'8',fill:'none',stroke:color,'stroke-width':'2',opacity:'.6'});\n    p1.innerHTML=`<animate attributeName=\"r\" from=\"8\" to=\"22\" dur=\"1s\" begin=\"0s\" repeatCount=\"indefinite\"\/>\n                  <animate attributeName=\"opacity\" from=\"0.6\" to=\"0\" dur=\"1s\" begin=\"0s\" repeatCount=\"indefinite\"\/>`;\n    g.appendChild(p1);\n \n    \/* \u2500\u2500 Pulse 2 d\u00e9cal\u00e9 \u2500\u2500 *\/\n    const p2=svgEl('circle',{cx:x,cy:y,r:'8',fill:'none',stroke:color,'stroke-width':'1.5',opacity:'.4'});\n    p2.innerHTML=`<animate attributeName=\"r\" from=\"8\" to=\"22\" dur=\"1s\" begin=\"0.4s\" repeatCount=\"indefinite\"\/>\n                  <animate attributeName=\"opacity\" from=\"0.4\" to=\"0\" dur=\"1s\" begin=\"0.4s\" repeatCount=\"indefinite\"\/>`;\n    g.appendChild(p2);\n \n    \/* \u2500\u2500 Label CWE \u2500\u2500 *\/\n    const lbl=svgEl('text',{x:x,y:y-14,fill:color,'font-size':'7','text-anchor':'middle',\n      'font-family':'monospace','font-weight':'bold',opacity:'.9'});\n    lbl.textContent=window._currentCwe||'CWE';\n    g.appendChild(lbl);\n \n  } else {\n    \/* \u2500\u2500 Phase blocage : ligne barr\u00e9e + \u2298 \u2500\u2500 *\/\n    const midX=(x+tx)\/2, midY=(y+ty)\/2;\n \n    \/* Ligne barr\u00e9e statique *\/\n    const line=svgEl('line',{x1:x,y1:y,x2:tx,y2:ty,\n      stroke:color,'stroke-width':'1','stroke-dasharray':'4,4',opacity:'.3'});\n    g.appendChild(line);\n \n    \/* Bouclier TCB flash *\/\n    const shield=svgEl('circle',{cx:tx,cy:ty,r:'16',fill:'none',stroke:color,'stroke-width':'2',opacity:'.5'});\n    shield.innerHTML=`<animate attributeName=\"r\" from=\"10\" to=\"22\" dur=\"0.4s\" repeatCount=\"3\"\/>\n                      <animate attributeName=\"opacity\" from=\"0.8\" to=\"0\" dur=\"0.4s\" repeatCount=\"3\"\/>`;\n    g.appendChild(shield);\n \n    \/* N\u0153ud source gris\u00e9 *\/\n    const src=svgEl('circle',{cx:x,cy:y,r:'8',fill:color,opacity:'.35'});\n    g.appendChild(src);\n \n    \/* \u2298 au milieu *\/\n    const t=svgEl('text',{x:String(midX),y:String(midY+4),fill:color,\n      'font-size':'16','text-anchor':'middle','font-weight':'bold',opacity:'.9'});\n    t.textContent='\u2298';\n    g.appendChild(t);\n \n    \/* Label BLOQU\u00c9 *\/\n    const lbl=svgEl('text',{x:String(midX),y:String(midY-6),fill:color,\n      'font-size':'6','text-anchor':'middle','font-family':'monospace',\n      'letter-spacing':'1',opacity:'.7'});\n    lbl.textContent='BLOQU\u00c9';\n    g.appendChild(lbl);\n  }\n \n  document.getElementById('attack-g').appendChild(g);\n}\nfunction setStatus(lvl){\n  const colors={ok:'var(--sec)',warn:'var(--warn)',crit:'var(--crit)'};\n  const labels={ok:'Syst\u00e8me op\u00e9rationnel',warn:'Analyse en cours\u2026',crit:'MENACE BLOQU\u00c9E'};\n  const c=colors[lvl]; const el=document.getElementById('s-dot');\n  if(el){el.style.background=c;el.style.boxShadow=`0 0 5px ${c}`;}\n  const st=document.getElementById('s-txt');if(st){st.textContent=labels[lvl];st.style.color=c;}\n}\nfunction setModStatus(mod,sub,lat){\n  const el=document.getElementById('dm-mod'); const sel=document.getElementById('dm-mod-sub');\n  if(el){el.textContent=mod;el.style.fontSize=mod.length>10?'.7rem':'.85rem';}\n  if(sel)sel.textContent=sub+(lat?' \u00b7 '+lat:'');\n}\nfunction showAlert(type,msg){\n  const bar=document.getElementById('alert-bar');\n  if(!bar) return;\n  bar.className=`alert-bar show alert-${type}`;\n  bar.innerHTML=`<span>${type==='crit'?'\u2298':type==='warn'?'\u26a0':'\u2713'}<\/span><span>${msg}<\/span>`;\n}\nfunction hideAlert(){const b=document.getElementById('alert-bar');if(b)b.className='alert-bar';}\n \n\/* \u2500\u2500 SIMULATEUR AUTO \u2500\u2500 *\/\nlet simIdx=0, simTimer=null, simRunning=true, totalBlocked=0;\n \nfunction runAttack(atk){\n  const g=document.getElementById('attack-g');\n  if(g) g.innerHTML='';\n  hideAlert();\n  resetModules();\n  window._currentCwe = atk.cwe;\n \n  \/\/ Phase 1 : attaque en transit \u2014 n\u0153ud anim\u00e9\n  setStatus('warn');\n  setModStatus(atk.module, atk.cwe+' \u00b7 '+atk.layer, atk.latency);\n  const latEl=document.getElementById('dm-lat'); const latSub=document.getElementById('dm-lat-sub');\n  if(latEl){latEl.textContent=atk.latency; latEl.style.color=atk.layer==='TCB'?'var(--tcb)':'var(--sec)';}\n  if(latSub){latSub.textContent=atk.latency_detail;}\n  showAlert('warn', atk.cwe+' \u2014 '+atk.name+' \u2014 '+atk.module+' intercepte');\n  addAttackNode(atk.source[0], atk.source[1], atk.color, false);\n \n  \/\/ Flash modules actifs avec d\u00e9lai d\u00e9cal\u00e9\n  const activeIds = getActiveIds(atk.module);\n  activeIds.forEach((id,i) => setTimeout(()=>flashModule(id, atk.color), 150+i*80));\n \n  \/\/ Logs avec timings ajust\u00e9s\n  atk.steps.forEach(s=>{\n    setTimeout(()=>addLog(s.log[0], s.log[1], s.log[2]), s.delay);\n  });\n \n  \/\/ Phase 2 : flash TCB + blocage (plus rapide)\n  setTimeout(()=>{\n    \/\/ Flash TCB visuel\n    const tcbFlash = document.getElementById('tcb-flash');\n    if(tcbFlash){ tcbFlash.style.opacity='1'; setTimeout(()=>tcbFlash.style.opacity='0', 300); }\n  }, 700);\n \n  setTimeout(()=>{\n    setStatus('crit');\n    showAlert('ok', '\u2713 '+atk.name+' bloqu\u00e9 \u2014 '+atk.module+' \u2014 '+atk.detection);\n    if(g) g.innerHTML='';\n    addAttackNode(atk.source[0], atk.source[1], atk.color, true);\n    totalBlocked++;\n    const el=document.getElementById('dm-blocked');\n    if(el){ el.textContent=totalBlocked; el.style.color='var(--tcb)'; setTimeout(()=>el.style.color='var(--sec)',350); }\n  }, 1000);\n \n  \/\/ Phase 3 : retour OK\n  setTimeout(()=>{\n    setStatus('ok');\n    setModStatus('\u2014','en attente');\n    hideAlert();\n    if(g) g.innerHTML='';\n    resetModules();\n  }, 1900);\n}\n \nfunction nextAttack(){\n  if(!simRunning) return;\n  runAttack(ATTACKS[simIdx % ATTACKS.length]);\n  simIdx++;\n  simTimer = setTimeout(nextAttack, 2300);\n}\n \nfunction toggleAuto(){\n  const btn=document.getElementById('btn-auto');\n  const lbl=document.getElementById('auto-label');\n  const dot=document.getElementById('auto-dot');\n  if(simRunning){\n    simRunning=false;\n    if(simTimer) clearTimeout(simTimer);\n    if(btn) btn.textContent='\u25b6 Reprendre';\n    if(lbl) lbl.textContent='SIMULATION EN PAUSE';\n    if(dot) dot.style.animation='none';\n    if(dot) dot.style.background='var(--text3)';\n  } else {\n    simRunning=true;\n    if(btn) btn.textContent='\u23f8 Pause';\n    if(lbl) lbl.textContent='SIMULATION ACTIVE';\n    if(dot){ dot.style.animation='blink 1.8s ease-in-out infinite'; dot.style.background='var(--sec)'; }\n    nextAttack();\n  }\n}\n \nfunction resetSim(){\n  simRunning=false;\n  if(simTimer) clearTimeout(simTimer);\n  simIdx=0; totalBlocked=0;\n  const g=document.getElementById('attack-g');\n  if(g) g.innerHTML='';\n  hideAlert(); resetModules(); setStatus('ok'); setModStatus('\u2014','en attente');\n  const el=document.getElementById('dm-blocked'); if(el) el.textContent='0';\n  const log=document.getElementById('log');\n  if(log){ log.innerHTML='<div class=\"console-title\">\/\/ Journal CFVL \u2014 Simulation r\u00e9initialis\u00e9e<\/div>'; }\n  addLog('ok','CORTEX ORIGIN','Syst\u00e8me r\u00e9initialis\u00e9 \u2014 12 modules op\u00e9rationnels \u2014 TNR 99,8%');\n  \/\/ Relancer\n  simRunning=true;\n  const btn=document.getElementById('btn-auto'); if(btn) btn.textContent='\u23f8 Pause';\n  const lbl=document.getElementById('auto-label'); if(lbl) lbl.textContent='SIMULATION ACTIVE';\n  const dot=document.getElementById('auto-dot'); if(dot){dot.style.animation='blink 1.8s ease-in-out infinite';dot.style.background='var(--sec)';}\n  setTimeout(nextAttack, 1000);\n}\n \n\/\/ D\u00e9marrer automatiquement\nsetTimeout(nextAttack, 1500);\n \n\/* \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\n   SIMULATEUR ZERO-DAY & EX ANTE\n\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550 *\/\n \nconst ZD_ATTACKS = [\n  {\n    name:'Zero-Day kernel (CVE inconnu)',\n    icon:'\ud83d\udc80',\n    type:'zero-day',\n    color:'#8B0000',\n    source:[540,40],\n    exante:'Preuve Isabelle\/HOL T1 : toute \u00e9criture m\u00e9moire cross-domain est formellement impossible \u2014 quel que soit le CVE. La preuve couvre la classe enti\u00e8re, pas le vecteur individuel.',\n    mechanism:'seL4 EAL7 \u00b7 isolation m\u00e9moire prouv\u00e9e \u00b7 aucun CVE requis',\n    latency:'421 ns',\n    layer:'TCB',\n    module:'seL4 EAL7',\n    steps:[\n      {delay:0,   t:'warn', m:'seL4 EAL7', l:'Vecteur kernel inconnu \u2014 tentative exploitation sans CVE assign\u00e9'},\n      {delay:420, t:'warn', m:'PRISM',     l:'Analyse FSM \u2014 comportement hors-mod\u00e8le d\u00e9tect\u00e9 \u00b7 aucune signature'},\n      {delay:840, t:'ok',   m:'seL4 EAL7', l:'Bloqu\u00e9 ex ante \u2014 T1 isolation m\u00e9moire \u00b7 classe couverte formellement'},\n    ]\n  },\n  {\n    name:'Supply Chain \u2014 d\u00e9pendance compromise',\n    icon:'\ud83d\udd17',\n    type:'supply-chain',\n    color:'#5B4A00',\n    source:[60,175],\n    exante:'ATLAS\u2122 v\u00e9rifie la cha\u00eene de d\u00e9pendances logicielles par preuve CFVL. CWE-829\/1104\/1357 couverts structurellement \u2014 un composant compromis ne peut pas propager d\\'\u00e9tat ill\u00e9gitime gr\u00e2ce \u00e0 OMEGA PolicyForge.',\n    mechanism:'ATLAS\u2122 + OMEGA PolicyForge \u00b7 CWE-829\/1104\/1357 \u00b7 CFVL 97\/100',\n    latency:'~2,1 \u00b5s',\n    layer:'L1b',\n    module:'ATLAS\u2122 + OMEGA',\n    steps:[\n      {delay:0,   t:'warn', m:'ATLAS\u2122',   l:'CWE-1104 \u2014 composant supply chain non-v\u00e9rifi\u00e9 d\u00e9tect\u00e9 \u00b7 audit d\u00e9marr\u00e9'},\n      {delay:450, t:'warn', m:'OMEGA',     l:'PolicyForge \u2014 propagation \u00e9tat ill\u00e9gitime bloqu\u00e9e \u00b7 politique active'},\n      {delay:900, t:'ok',   m:'ATLAS\u2122',   l:'Supply chain bloqu\u00e9e ex ante \u00b7 CFVL 97\/100 \u00b7 OMEGA policy enforced'},\n    ]\n  },\n  {\n    name:'Adversarial IA \u2014 entr\u00e9e empoisonn\u00e9e',\n    icon:'\ud83e\udd16',\n    type:'ai-adversarial',\n    color:'#1a4a7a',\n    source:[190,22],\n    exante:'Les entr\u00e9es adversariales IA (prompt injection, data poisoning) sont couvertes par CWE-20 (Input Validation) via SENTINEL + WALL-DOME. La validation formelle CFVL garantit qu\\'aucune entr\u00e9e ne peut violer les invariants OMEGA.',\n    mechanism:'SENTINEL + WALL-DOME\u2122 \u00b7 CWE-20\/345\/754 \u00b7 validation formelle',\n    latency:'~2,1 \u00b5s',\n    layer:'L1b',\n    module:'SENTINEL + WALL-DOME\u2122',\n    steps:[\n      {delay:0,   t:'warn', m:'SENTINEL',    l:'Entr\u00e9e adversariale IA d\u00e9tect\u00e9e \u2014 prompt injection \u00b7 CWE-20 actif'},\n      {delay:450, t:'warn', m:'WALL-DOME\u2122',  l:'Validation formelle \u2014 invariant OMEGA viol\u00e9 \u00b7 isolation d\u00e9clench\u00e9e'},\n      {delay:900, t:'ok',   m:'SENTINEL',    l:'Adversarial IA bloqu\u00e9 \u00b7 CWE-20\/345 \u00b7 CFVL formel \u00b7 ~2,1 \u00b5s'},\n    ]\n  },\n  {\n    name:'Side-channel timing (ex ante)',\n    icon:'\u23f1',\n    type:'side-channel',\n    color:'#2D4A5A',\n    source:[60,45],\n    exante:'CWE-208 (timing side-channel) est couvert par seL4 EAL7 via la propri\u00e9t\u00e9 T3 (IPC atomique) et M00 Root-of-Trust. L\\'uniformit\u00e9 temporelle des op\u00e9rations kernel est prouv\u00e9e formellement \u2014 aucune fuite d\\'information par timing.',\n    mechanism:'seL4 EAL7 T3 \u00b7 M00 Root-of-Trust \u00b7 CWE-203\/208 \u00b7 421 ns uniforme',\n    latency:'421 ns',\n    layer:'TCB',\n    module:'seL4 EAL7 + M00',\n    steps:[\n      {delay:0,   t:'warn', m:'seL4 EAL7',       l:'CWE-208 \u2014 timing side-channel d\u00e9tect\u00e9 \u00b7 analyse T3 IPC'},\n      {delay:400, t:'warn', m:'M00 Root-of-Trust',l:'Timing IPC kernel \u2014 uniformit\u00e9 formelle v\u00e9rifi\u00e9e \u00b7 421 ns'},\n      {delay:820, t:'ok',   m:'seL4 EAL7',        l:'Side-channel impossible \u00b7 T3 atomique \u00b7 fuite info = 0 bit'},\n    ]\n  },\n  {\n    name:'Zero-Day privilege escalation',\n    icon:'\u2b06',\n    type:'zero-day',\n    color:'#6B0000',\n    source:[540,175],\n    exante:'Toute escalade de privil\u00e8ges kernel est couverte par la propri\u00e9t\u00e9 T2 Isabelle\/HOL (capability integrity). Aucune technique d\\'escalade \u2014 connue ou inconnue \u2014 ne peut contourner le mod\u00e8le de capabilities seL4 formellement prouv\u00e9.',\n    mechanism:'seL4 EAL7 T2 \u00b7 capability integrity \u00b7 aucune escalade possible',\n    latency:'421 ns',\n    layer:'TCB',\n    module:'seL4 EAL7',\n    steps:[\n      {delay:0,   t:'warn', m:'seL4 EAL7',   l:'Zero-day escalade \u2014 tentative sans CVE \u00b7 capability T2 analys\u00e9e'},\n      {delay:400, t:'warn', m:'M00 Root-of-Trust', l:'Capability integrity \u2014 escalade = impossible par construction'},\n      {delay:820, t:'ok',   m:'seL4 EAL7',   l:'Escalade bloqu\u00e9e ex ante \u00b7 T2 \u00b7 Isabelle\/HOL \u00b7 CVE requis = 0'},\n    ]\n  },\n  {\n    name:'Information flow (OWASP non-publi\u00e9)',\n    icon:'\ud83d\udd00',\n    type:'ex-ante',\n    color:'#534AB7',\n    source:[410,198],\n    exante:'La propri\u00e9t\u00e9 T8 (non-interference) prouve formellement qu\\'aucune information ne peut fuir entre domaines d\\'isolation seL4 \u2014 qu\\'il s\\'agisse d\\'un vecteur r\u00e9pertori\u00e9 OWASP ou d\\'un vecteur encore inconnu. La preuve est ind\u00e9pendante du catalogue de vuln\u00e9rabilit\u00e9s.',\n    mechanism:'seL4 EAL7 T8 \u00b7 non-interference \u00b7 CWE-918 + vecteurs inconnus',\n    latency:'421 ns',\n    layer:'TCB',\n    module:'seL4 EAL7 + PRISM',\n    steps:[\n      {delay:0,   t:'warn', m:'PRISM',    l:'Information flow suspect \u2014 vecteur non r\u00e9pertori\u00e9 OWASP \u00b7 T8 actif'},\n      {delay:420, t:'warn', m:'seL4 EAL7',l:'Non-interference T8 \u2014 flux cross-domaine formellement impossible'},\n      {delay:840, t:'ok',   m:'PRISM',    l:'Bloqu\u00e9 ex ante \u00b7 T8 non-interference \u00b7 0 octet sorti \u00b7 421 ns'},\n    ]\n  },\n  {\n    name:'Concurrence avanc\u00e9e (CVE futur)',\n    icon:'\ud83d\udd04',\n    type:'ex-ante',\n    color:'#1a5fa0',\n    source:[520,45],\n    exante:'Les CWE-366\/367\/368 (race conditions avanc\u00e9es, TOCTOU) sont couverts par PRISM (FSM formel) et seL4 T3 (IPC atomique). Toute future CVE dans cette classe est automatiquement couverte sans mise \u00e0 jour de signatures.',\n    mechanism:'PRISM FSM \u00b7 seL4 T3 \u00b7 OMEGA \u00b7 CWE-366\/367\/368 \u00b7 classe enti\u00e8re',\n    latency:'~2,1 \u00b5s',\n    layer:'L1b',\n    module:'PRISM + seL4 EAL7',\n    steps:[\n      {delay:0,   t:'warn', m:'PRISM',    l:'CWE-367 TOCTOU \u2014 tentative race condition avanc\u00e9e \u00b7 FSM actif'},\n      {delay:430, t:'warn', m:'seL4 EAL7',l:'IPC atomique T3 \u2014 fen\u00eatre temporelle TOCTOU = 0 \u00b7 421 ns'},\n      {delay:860, t:'ok',   m:'PRISM',    l:'Concurrence bloqu\u00e9e ex ante \u00b7 classe CWE-36x couverte \u00b7 ~2,1 \u00b5s'},\n    ]\n  },\n  {\n    name:'Firmware tamper (supply chain HW)',\n    icon:'\u2699',\n    type:'supply-chain',\n    color:'#7B3F00',\n    source:[80,45],\n    exante:'M00 Root-of-Trust \u00e9tablit la cha\u00eene de confiance depuis le boot. Tout tamper firmware est d\u00e9tect\u00e9 avant chargement de la TCB. CWE-1357 (d\u00e9pendance logicielle non s\u00e9curis\u00e9e) + attestation hardware formelle par CBMC.',\n    mechanism:'M00 Root-of-Trust \u00b7 CBMC attestation \u00b7 CWE-1357 \u00b7 boot formel',\n    latency:'~2,5 ns',\n    layer:'TCB',\n    module:'M00 Root-of-Trust',\n    steps:[\n      {delay:0,   t:'warn', m:'M00 Root-of-Trust',l:'Tamper firmware d\u00e9tect\u00e9 au boot \u2014 CWE-1357 \u00b7 attestation CBMC'},\n      {delay:420, t:'warn', m:'PRISM',            l:'Cha\u00eene de confiance interrompue \u2014 TCB non charg\u00e9e \u00b7 audit log'},\n      {delay:840, t:'ok',   m:'M00 Root-of-Trust',l:'Boot isol\u00e9 \u00b7 firmware tamper bloqu\u00e9 ex ante \u00b7 2,5 ns mean'},\n    ]\n  },\n];\n \n\/* \u2500\u2500 Utilitaires \u2500\u2500 *\/\nfunction zdTs(){const n=new Date();return`${String(n.getHours()).padStart(2,'0')}:${String(n.getMinutes()).padStart(2,'0')}.${String(n.getMilliseconds()).padStart(3,'0')}`}\n \nfunction zdLog(type,mod,msg){\n  const cls=type==='ok'?'lok':type==='warn'?'lwn':'lcr';\n  const lbl=type==='ok'?'[ OK ]':type==='warn'?'[ WARN ]':'[ CRIT ]';\n  const d=document.createElement('div');d.className='ll ll-new';\n  d.innerHTML=`<span class=\"lt\">${zdTs()}<\/span><span class=\"${cls}\">${lbl}<\/span><span class=\"lm\"><span class=\"lip\">${mod}<\/span> \u2014 ${msg}<\/span>`;\n  const log=document.getElementById('zd-log');\n  if(log){log.appendChild(d);log.scrollTop=log.scrollHeight;}\n}\n \nfunction zdSvgEl(tag,attrs){\n  const el=document.createElementNS('http:\/\/www.w3.org\/2000\/svg',tag);\n  for(const [k,v] of Object.entries(attrs)) el.setAttribute(k,v);\n  return el;\n}\n \nfunction zdAddNode(x,y,color,blocked,cwe){\n  const NS='http:\/\/www.w3.org\/2000\/svg';\n  const g=document.createElementNS(NS,'g');\n  const tx=300,ty=125;\n  const dx=tx-x,dy=ty-y;\n  const len=Math.ceil(Math.sqrt(dx*dx+dy*dy));\n \n  if(!blocked){\n    \/* Ligne anim\u00e9e *\/\n    const line=zdSvgEl('line',{x1:x,y1:y,x2:tx,y2:ty,\n      stroke:color,'stroke-width':'1.5','stroke-dasharray':'8 4',opacity:'.55'});\n    line.innerHTML=`<animate attributeName=\"stroke-dashoffset\" from=\"${len}\" to=\"0\" dur=\"0.65s\" repeatCount=\"indefinite\"\/>`;\n    g.appendChild(line);\n \n    \/* Projectile anim\u00e9 *\/\n    const path=zdSvgEl('path',{id:`zdp-${x}-${y}`,d:`M${x},${y} L${tx},${ty}`,fill:'none',stroke:'none'});\n    g.appendChild(path);\n    const proj=zdSvgEl('circle',{r:'4.5',fill:color,opacity:'.9'});\n    proj.innerHTML=`<animateMotion dur=\"0.65s\" repeatCount=\"indefinite\" calcMode=\"linear\">\n      <mpath href=\"#zdp-${x}-${y}\"\/>\n    <\/animateMotion>`;\n    g.appendChild(proj);\n \n    \/* N\u0153ud source *\/\n    const src=zdSvgEl('circle',{cx:x,cy:y,r:'9',fill:color,opacity:'.8'});\n    g.appendChild(src);\n \n    \/* Doubles pulses *\/\n    const p1=zdSvgEl('circle',{cx:x,cy:y,r:'9',fill:'none',stroke:color,'stroke-width':'2',opacity:'.5'});\n    p1.innerHTML=`<animate attributeName=\"r\" from=\"9\" to=\"24\" dur=\"1.1s\" begin=\"0s\" repeatCount=\"indefinite\"\/>\n                  <animate attributeName=\"opacity\" from=\"0.5\" to=\"0\" dur=\"1.1s\" begin=\"0s\" repeatCount=\"indefinite\"\/>`;\n    g.appendChild(p1);\n    const p2=zdSvgEl('circle',{cx:x,cy:y,r:'9',fill:'none',stroke:color,'stroke-width':'1.5',opacity:'.35'});\n    p2.innerHTML=`<animate attributeName=\"r\" from=\"9\" to=\"24\" dur=\"1.1s\" begin=\"0.45s\" repeatCount=\"indefinite\"\/>\n                  <animate attributeName=\"opacity\" from=\"0.35\" to=\"0\" dur=\"1.1s\" begin=\"0.45s\" repeatCount=\"indefinite\"\/>`;\n    g.appendChild(p2);\n \n    \/* Label *\/\n    const lbl=zdSvgEl('text',{x:x,y:y-13,fill:color,'font-size':'7','text-anchor':'middle',\n      'font-family':'monospace','font-weight':'bold',opacity:'.95'});\n    lbl.textContent=cwe||'?';\n    g.appendChild(lbl);\n \n  } else {\n    \/* Phase blocage *\/\n    const midX=(x+tx)\/2, midY=(y+ty)\/2;\n    const line=zdSvgEl('line',{x1:x,y1:y,x2:tx,y2:ty,\n      stroke:color,'stroke-width':'1','stroke-dasharray':'4,5',opacity:'.25'});\n    g.appendChild(line);\n \n    \/* TCB shield flash *\/\n    const sh=zdSvgEl('circle',{cx:tx,cy:ty,r:'16',fill:'none',stroke:color,'stroke-width':'2.5',opacity:'.6'});\n    sh.innerHTML=`<animate attributeName=\"r\" from=\"12\" to=\"26\" dur=\"0.35s\" repeatCount=\"3\"\/>\n                  <animate attributeName=\"opacity\" from=\"0.8\" to=\"0\" dur=\"0.35s\" repeatCount=\"3\"\/>`;\n    g.appendChild(sh);\n \n    \/* Source gris\u00e9 *\/\n    const src=zdSvgEl('circle',{cx:x,cy:y,r:'9',fill:color,opacity:'.3'});\n    g.appendChild(src);\n \n    \/* \u2298 *\/\n    const t=zdSvgEl('text',{x:String(midX),y:String(midY+6),fill:color,\n      'font-size':'18','text-anchor':'middle','font-weight':'bold',opacity:'.85'});\n    t.textContent='\u2298';\n    g.appendChild(t);\n    const sub=zdSvgEl('text',{x:String(midX),y:String(midY-5),fill:color,\n      'font-size':'5.5','text-anchor':'middle','font-family':'monospace',\n      'letter-spacing':'1.5',opacity:'.7'});\n    sub.textContent='EX ANTE';\n    g.appendChild(sub);\n  }\n  document.getElementById('zd-attack-g').appendChild(g);\n}\n \n\/* \u2500\u2500 Moteur simulateur \u2500\u2500 *\/\nlet zdIdx=0, zdTimer=null, zdRunning=true, zdBlocked=0;\n \nfunction zdRun(atk){\n  \/* Nettoyer *\/\n  document.getElementById('zd-attack-g').innerHTML='';\n \n  \/* Badge *\/\n  const badge=document.getElementById('zd-badge');\n  const typeColor=atk.type==='zero-day'?'var(--crit)':atk.type==='supply-chain'?'var(--warn)':atk.type==='ai-adversarial'?'#1a5fa0':atk.type==='side-channel'?'#2D4A5A':'var(--tcb)';\n  if(badge){badge.style.borderColor=typeColor;}\n  const nm=document.getElementById('zd-badge-name');if(nm){nm.textContent=atk.name;nm.style.color=atk.color;}\n  const ic=document.getElementById('zd-badge-icon');if(ic)ic.textContent=atk.icon;\n  const tg=document.getElementById('zd-badge-tag');if(tg){tg.textContent=atk.mechanism;tg.style.color='var(--text3)';}\n  const lt=document.getElementById('zd-badge-lat');if(lt){lt.textContent=atk.latency;lt.style.color=atk.layer==='TCB'?'var(--tcb)':'var(--sec)';}\n  const ly=document.getElementById('zd-badge-layer');if(ly)ly.textContent=atk.module+' \u00b7 '+atk.layer;\n \n  \/* Phase label *\/\n  const ph=document.getElementById('zd-phase-label');if(ph){ph.textContent='TRANSIT \u2192';ph.style.color='var(--warn)';}\n \n  \/* Ex ante box *\/\n  const ex=document.getElementById('zd-ex-box');\n  if(ex){ex.textContent=atk.exante;ex.style.borderLeftColor=typeColor;}\n \n  \/* N\u0153ud anim\u00e9 *\/\n  zdAddNode(atk.source[0],atk.source[1],atk.color,false,atk.type==='zero-day'?'0-DAY':atk.type==='supply-chain'?'SC':atk.type==='ai-adversarial'?'AI-ADV':atk.type==='side-channel'?'SC-TIM':'EX-ANTE');\n \n  \/* Logs *\/\n  atk.steps.forEach(s=>{\n    setTimeout(()=>zdLog(s.t,s.m,s.l), s.delay);\n  });\n \n  \/* Flash TCB *\/\n  setTimeout(()=>{\n    const r=document.getElementById('zd-tcb-ring');\n    if(r){r.style.opacity='1';setTimeout(()=>r.style.opacity='0',280);}\n  }, 650);\n \n  \/* Blocage *\/\n  setTimeout(()=>{\n    if(ph){ph.textContent='\u2298 BLOQU\u00c9 EX ANTE';ph.style.color='var(--sec)';}\n    document.getElementById('zd-attack-g').innerHTML='';\n    zdAddNode(atk.source[0],atk.source[1],atk.color,true,'');\n    zdBlocked++;\n    const el=document.getElementById('zd-blocked');\n    if(el){el.textContent=zdBlocked;el.style.color='var(--warn)';setTimeout(()=>el.style.color='var(--warn)',300);}\n  }, 950);\n \n  \/* Retour idle *\/\n  setTimeout(()=>{\n    document.getElementById('zd-attack-g').innerHTML='';\n    if(ph){ph.textContent='En attente\u2026';ph.style.color='var(--text3)';}\n  }, 1800);\n}\n \nfunction zdNext(){\n  if(!zdRunning) return;\n  zdRun(ZD_ATTACKS[zdIdx % ZD_ATTACKS.length]);\n  zdIdx++;\n  zdTimer=setTimeout(zdNext, 2500);\n}\n \nfunction zdToggle(){\n  const btn=document.getElementById('zd-btn-pause');\n  const lbl=document.getElementById('zd-label');\n  const dot=document.getElementById('zd-dot');\n  if(zdRunning){\n    zdRunning=false;if(zdTimer)clearTimeout(zdTimer);\n    if(btn)btn.textContent='\u25b6 Reprendre';\n    if(lbl)lbl.textContent='EN PAUSE';\n    if(dot){dot.style.animation='none';dot.style.background='var(--text3)';}\n  } else {\n    zdRunning=true;\n    if(btn)btn.textContent='\u23f8 Pause';\n    if(lbl)lbl.textContent='SIMULATION ACTIVE';\n    if(dot){dot.style.animation='blink 1.8s ease-in-out infinite';dot.style.background='var(--warn)';}\n    zdNext();\n  }\n}\n \nfunction zdReset(){\n  zdRunning=false;if(zdTimer)clearTimeout(zdTimer);\n  zdIdx=0;zdBlocked=0;\n  document.getElementById('zd-attack-g').innerHTML='';\n  const el=document.getElementById('zd-blocked');if(el)el.textContent='0';\n  const log=document.getElementById('zd-log');\n  if(log){log.innerHTML='<div class=\"console-title\">\/\/ Journal Zero-Day & Ex Ante \u2014 R\u00e9initialis\u00e9<\/div>';}\n  zdLog('ok','TCB FORMEL','R\u00e9initialis\u00e9 \u2014 preuves ex ante actives \u2014 0 CVE requis');\n  zdRunning=true;\n  const btn=document.getElementById('zd-btn-pause');if(btn)btn.textContent='\u23f8 Pause';\n  const lbl=document.getElementById('zd-label');if(lbl)lbl.textContent='SIMULATION ACTIVE';\n  const dot=document.getElementById('zd-dot');if(dot){dot.style.animation='blink 1.8s ease-in-out infinite';dot.style.background='var(--warn)';}\n  setTimeout(zdNext, 800);\n}\n \n\/\/ D\u00e9marrer avec d\u00e9calage par rapport au simulateur principal\nsetTimeout(zdNext, 2800);\n \n\/* \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\n   SIMULATEUR HYBRIDE HUMAIN + IA\n\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550 *\/\n \n\/\/ Sc\u00e9narios : multi-vecteurs simultan\u00e9s, mutation, pivot, \u00e9vasion\nconst HY_ATTACKS = [\n  {\n    name:'APT coordonn\u00e9 IA \u2014 4 vecteurs simultan\u00e9s',\n    icon:'\ud83e\udd16',\n    aiSpeed:'<12 ms',\n    detail:'Injection SQL + exfiltration C2 + brute-force + privilege escalation lanc\u00e9s simultan\u00e9ment par orchestrateur IA. Mutation de payload \u00e0 chaque tentative.',\n    tcbResponse:'seL4 T1\/T2\/T3\/T8 activ\u00e9s simultan\u00e9ment \u2014 421 ns \u2014 4 vecteurs isol\u00e9s en parall\u00e8le par construction kernel',\n    modules:['seL4','wall','prism','m09'],\n    responseTime:'421 ns',\n    color:'#8B0000',\n    sources:[[80,55],[820,55],[80,225],[820,225]],\n    cweLabels:['CWE-089','CWE-918','CWE-307','CWE-269'],\n    steps:[\n      {delay:0,   t:'warn', m:'seL4 EAL7',    l:'4 vecteurs simultan\u00e9s d\u00e9tect\u00e9s \u2014 orchestrateur IA \u00b7 mutation payload \u00b7 <12 ms'},\n      {delay:200, t:'warn', m:'WALL-DOME\u2122',   l:'CWE-089 SQL + CWE-918 C2 \u2014 isolation parall\u00e8le d\u00e9clench\u00e9e'},\n      {delay:380, t:'warn', m:'PRISM',         l:'Escalade CWE-269 \u2014 T2 capability integrity \u00b7 421 ns'},\n      {delay:540, t:'warn', m:'M09-CB',        l:'Brute-force CWE-307 \u2014 CircuitBreaker \u00b7 9,0 ns mean'},\n      {delay:700, t:'ok',   m:'seL4 EAL7',    l:'4\/4 vecteurs bloqu\u00e9s \u00b7 isolation parall\u00e8le \u00b7 421 ns \u00b7 0 propagation'},\n    ]\n  },\n  {\n    name:'Mutation payload IA \u2014 \u00e9vasion comportementale',\n    icon:'\ud83e\uddec',\n    aiSpeed:'<8 ms',\n    detail:'L\\'IA adapte le payload \u00e0 chaque bloc d\u00e9tect\u00e9. 847 variantes g\u00e9n\u00e9r\u00e9es en 8 ms. Tentative d\\'apprendre les patterns de d\u00e9tection pour les contourner.',\n    tcbResponse:'WALL-DOME\u2122 + AEGIS : couverture par classe CWE (pas par signature) \u2014 toute variante de CWE-089 reste couverte ind\u00e9pendamment de la mutation',\n    modules:['wall','aegis','seL4'],\n    responseTime:'~2,1 \u00b5s',\n    color:'#1a4a7a',\n    sources:[[225,25],[675,255],[820,55]],\n    cweLabels:['CWE-089\\nv847','CWE-078\\nmut\u00e9','CWE-119\\nvar'],\n    steps:[\n      {delay:0,   t:'warn', m:'AEGIS\u2122',       l:'847 variantes payload IA d\u00e9tect\u00e9es en <8 ms \u2014 analyse comportementale'},\n      {delay:280, t:'warn', m:'WALL-DOME\u2122',   l:'Mutation CWE-089\/078\/119 \u2014 classe couverte CFVL \u00b7 signature non requise'},\n      {delay:520, t:'warn', m:'seL4 EAL7',    l:'Invariants kernel \u2014 T1\/T6 couvrent TOUTE variante m\u00e9moire \u00b7 preuve HOL'},\n      {delay:750, t:'ok',   m:'AEGIS\u2122',       l:'847\/847 variantes bloqu\u00e9es \u00b7 classe CWE \u2260 signature \u00b7 ~2,1 \u00b5s'},\n    ]\n  },\n  {\n    name:'Pivot lat\u00e9ral automatis\u00e9 \u2014 propagation IA',\n    icon:'\u2194',\n    aiSpeed:'<25 ms',\n    detail:'L\\'IA mappe le r\u00e9seau interne et g\u00e9n\u00e8re un plan de pivot optimal en 25 ms. Tentatives de mouvement lat\u00e9ral via 6 chemins d\\'ex\u00e9cution diff\u00e9rents.',\n    tcbResponse:'seL4 non-interference T8 + PRISM FSM : tout mouvement lat\u00e9ral inter-domaine est impossible par construction \u2014 le mod\u00e8le de domaines seL4 interdit le pivot',\n    modules:['seL4','prism','wall','sent'],\n    responseTime:'421 ns',\n    color:'#2D4A2D',\n    sources:[[80,55],[820,55],[225,255],[675,25]],\n    cweLabels:['PIVOT\\nL1','PIVOT\\nL2','PIVOT\\nL3','PIVOT\\nL4'],\n    steps:[\n      {delay:0,   t:'warn', m:'PRISM',         l:'Pivot lat\u00e9ral IA \u2014 6 chemins g\u00e9n\u00e9r\u00e9s en <25 ms \u2014 FSM analyse'},\n      {delay:250, t:'warn', m:'seL4 EAL7',    l:'Non-interference T8 \u2014 mouvement inter-domaine = impossible \u00b7 421 ns'},\n      {delay:480, t:'warn', m:'SENTINEL',      l:'Anomalie comportementale \u2014 pattern pivot IA d\u00e9tect\u00e9 \u00b7 31,7 ns'},\n      {delay:680, t:'ok',   m:'seL4 EAL7',    l:'6\/6 pivots bloqu\u00e9s \u00b7 domaines seL4 \u00e9tanches \u00b7 Isabelle\/HOL T8 \u00b7 421 ns'},\n    ]\n  },\n  {\n    name:'Supply chain + zero-day combin\u00e9s par LLM',\n    icon:'\u26a1',\n    aiSpeed:'<18 ms',\n    detail:'Un LLM g\u00e9n\u00e8re automatiquement un exploit combinant une vuln\u00e9rabilit\u00e9 supply chain (CWE-1104) et un zero-day kernel. Coordonn\u00e9 en 18 ms avec escalade planifi\u00e9e.',\n    tcbResponse:'ATLAS\u2122 + M00 Root-of-Trust : cha\u00eene de confiance v\u00e9rifi\u00e9e au boot \u2014 composant compromis ne peut pas charger \u2014 ex ante ind\u00e9pendant du LLM',\n    modules:['seL4','m00','atlas','prism'],\n    responseTime:'~2,5 ns',\n    color:'#5B0000',\n    sources:[[80,225],[820,225],[225,25],[675,255]],\n    cweLabels:['SC-LLM','0-DAY\\nkernel','CWE-\\n1104','CHAIN'],\n    steps:[\n      {delay:0,   t:'warn', m:'ATLAS\u2122',       l:'LLM supply chain exploit d\u00e9tect\u00e9 \u2014 CWE-1104 + zero-day \u00b7 <18 ms'},\n      {delay:260, t:'warn', m:'M00 Root-of-Trust', l:'Cha\u00eene de confiance \u2014 composant non-attest\u00e9 bloqu\u00e9 au boot \u00b7 2,5 ns'},\n      {delay:500, t:'warn', m:'seL4 EAL7',    l:'Zero-day kernel \u2014 T1\/T2 couvrent la classe \u00b7 Isabelle\/HOL'},\n      {delay:720, t:'ok',   m:'ATLAS\u2122',       l:'Exploit LLM bloqu\u00e9 ex ante \u00b7 supply chain + zero-day \u00b7 CFVL 97\/100'},\n    ]\n  },\n  {\n    name:'DDoS adaptatif IA \u2014 saturation formelle',\n    icon:'\ud83c\udf0a',\n    aiSpeed:'<5 ms',\n    detail:'Botnet orchestr\u00e9 par IA avec adaptation de la strat\u00e9gie d\\'inondation en temps r\u00e9el. 1,2M req\/s avec pattern-switching toutes les 5 ms pour contourner les rate limiters classiques.',\n    tcbResponse:'M09 CircuitBreaker + AEGIS : circuit formel prouv\u00e9 CFVL 100\/100 \u2014 le rate limit est une propri\u00e9t\u00e9 structurelle, pas une r\u00e8gle configurable',\n    modules:['m09','aegis','wall','seL4'],\n    responseTime:'~2,1 \u00b5s',\n    color:'#0A3D2D',\n    sources:[[80,55],[820,55],[80,225],[820,225]],\n    cweLabels:['1.2M\\nrps','DDoS\\nIA','CWE-\\n400','FLOOD'],\n    steps:[\n      {delay:0,   t:'warn', m:'M09-CB',        l:'DDoS IA 1,2M req\/s \u2014 pattern-switching <5 ms \u00b7 circuit analyse'},\n      {delay:200, t:'warn', m:'AEGIS\u2122',        l:'614\/650 WP goals actifs \u2014 adaptation d\u00e9fensive automatique'},\n      {delay:400, t:'warn', m:'M09-CB',        l:'CircuitBreaker CFVL \u2014 propri\u00e9t\u00e9 structurelle \u00b7 9,0 ns mean'},\n      {delay:600, t:'ok',   m:'M09-CB',        l:'DDoS adaptatif neutralis\u00e9 \u00b7 rate limit formel \u00b7 trafic l\u00e9gitime pr\u00e9serv\u00e9'},\n    ]\n  },\n  {\n    name:'Ransomware IA \u2014 chiffrement ultra-rapide',\n    icon:'\ud83d\udd10',\n    aiSpeed:'<30 ms',\n    detail:'Ransomware guid\u00e9 par IA qui s\u00e9lectionne les cibles prioritaires et d\u00e9clenche le chiffrement multi-thread\u00e9 en 30 ms. Contournement bas\u00e9 sur l\\'apprentissage des patterns de sauvegarde.',\n    tcbResponse:'seL4 EAL7 + M24 Offline\u2122 : isolation des domaines m\u00e9moire emp\u00eache tout chiffrement cross-domaine \u2014 T1\/T6 Isabelle\/HOL couvrent CWE-119\/787 (base du ransomware)',\n    modules:['seL4','m24','wall','prism'],\n    responseTime:'421 ns',\n    color:'#6B0000',\n    sources:[[225,25],[675,25],[80,225],[820,225]],\n    cweLabels:['RANSOM\\nIA','CWE-\\n787','CWE-\\n119','CRYPT'],\n    steps:[\n      {delay:0,   t:'warn', m:'seL4 EAL7',    l:'Ransomware IA d\u00e9tect\u00e9 \u2014 chiffrement multi-thread <30 ms \u00b7 T1\/T6'},\n      {delay:250, t:'warn', m:'M24 Offline\u2122',  l:'Mode offline \u2014 pas d\\'interface r\u00e9seau \u00b7 CBMC 13\/13 \u00b7 28,1 ns'},\n      {delay:480, t:'warn', m:'WALL-DOME\u2122',   l:'Isolation m\u00e9moire cross-domaine \u2014 CWE-787\/119 bloqu\u00e9s formellement'},\n      {delay:700, t:'ok',   m:'seL4 EAL7',    l:'Ransomware neutralis\u00e9 \u00b7 0 octet chiffr\u00e9 cross-domaine \u00b7 421 ns'},\n    ]\n  },\n];\n \n\/* \u2500\u2500 Utilitaires \u2500\u2500 *\/\nfunction hyTs(){const n=new Date();return`${String(n.getHours()).padStart(2,'0')}:${String(n.getMinutes()).padStart(2,'0')}.${String(n.getMilliseconds()).padStart(3,'0')}`}\n \nfunction hyLog(type,mod,msg){\n  const cls=type==='ok'?'lok':type==='warn'?'lwn':'lcr';\n  const lbl=type==='ok'?'[ OK ]':type==='warn'?'[ WARN ]':'[ CRIT ]';\n  const d=document.createElement('div');d.className='ll ll-new';\n  d.innerHTML=`<span class=\"lt\">${hyTs()}<\/span><span class=\"${cls}\">${lbl}<\/span><span class=\"lm\"><span class=\"lip\">${mod}<\/span> \u2014 ${msg}<\/span>`;\n  const log=document.getElementById('hy-log');\n  if(log){log.appendChild(d);log.scrollTop=log.scrollHeight;}\n}\n \nfunction hySvgEl(tag,attrs){\n  const el=document.createElementNS('http:\/\/www.w3.org\/2000\/svg',tag);\n  for(const [k,v] of Object.entries(attrs)) el.setAttribute(k,v);\n  return el;\n}\n \nfunction hyAddNode(x,y,color,blocked,label){\n  const NS='http:\/\/www.w3.org\/2000\/svg';\n  const g=document.createElementNS(NS,'g');\n  const tx=450,ty=140;\n  const dx=tx-x,dy=ty-y;\n  const len=Math.ceil(Math.sqrt(dx*dx+dy*dy));\n  const pathId=`hyp-${x}-${y}-${Math.random().toString(36).slice(2,6)}`;\n \n  if(!blocked){\n    \/\/ Ligne ultra-rapide anim\u00e9e\n    const line=hySvgEl('line',{x1:x,y1:y,x2:tx,y2:ty,\n      stroke:color,'stroke-width':'2','stroke-dasharray':'10 4',opacity:'.6'});\n    line.innerHTML=`<animate attributeName=\"stroke-dashoffset\" from=\"${len}\" to=\"0\" dur=\"0.4s\" repeatCount=\"indefinite\"\/>`;\n    g.appendChild(line);\n \n    \/\/ Projectile rapide\n    const path=hySvgEl('path',{id:pathId,d:`M${x},${y} L${tx},${ty}`,fill:'none',stroke:'none'});\n    g.appendChild(path);\n    const proj=hySvgEl('circle',{r:'5',fill:color,opacity:'.95'});\n    proj.innerHTML=`<animateMotion dur=\"0.4s\" repeatCount=\"indefinite\" calcMode=\"linear\"><mpath href=\"#${pathId}\"\/><\/animateMotion>`;\n    g.appendChild(proj);\n \n    \/\/ N\u0153ud source large\n    const src=hySvgEl('circle',{cx:x,cy:y,r:'10',fill:color,opacity:'.8'});\n    g.appendChild(src);\n \n    \/\/ Triple pulse (attaque IA rapide)\n    [0,'0.3s','0.6s'].forEach((begin,i)=>{\n      const p=hySvgEl('circle',{cx:x,cy:y,r:'10',fill:'none',stroke:color,\n        'stroke-width':String(2-i*0.5),opacity:String(.6-i*.15)});\n      p.innerHTML=`<animate attributeName=\"r\" from=\"10\" to=\"28\" dur=\"0.9s\" begin=\"${begin}\" repeatCount=\"indefinite\"\/>\n                   <animate attributeName=\"opacity\" from=\"${.6-i*.15}\" to=\"0\" dur=\"0.9s\" begin=\"${begin}\" repeatCount=\"indefinite\"\/>`;\n      g.appendChild(p);\n    });\n \n    \/\/ Label multi-ligne\n    if(label){\n      const lines=label.split('\\n');\n      lines.forEach((l,i)=>{\n        const t=hySvgEl('text',{x:x,y:String(y-12+(i>0?10:0)),fill:color,'font-size':'7.5',\n          'text-anchor':'middle','font-family':'monospace','font-weight':'bold',opacity:'.95'});\n        t.textContent=i===0?l:l;\n        g.appendChild(t);\n      });\n    }\n \n    \/\/ Badge vitesse IA\n    const badge=hySvgEl('text',{x:x,y:String(y+22),fill:'#7B3F00','font-size':'6',\n      'text-anchor':'middle','font-family':'monospace',opacity:'.8'});\n    badge.textContent='IA';\n    g.appendChild(badge);\n \n  } else {\n    const midX=(x+tx)\/2,midY=(y+ty)\/2;\n    const line=hySvgEl('line',{x1:x,y1:y,x2:tx,y2:ty,\n      stroke:color,'stroke-width':'1','stroke-dasharray':'5,6',opacity:'.2'});\n    g.appendChild(line);\n \n    \/\/ Double flash TCB\n    const sh=hySvgEl('circle',{cx:tx,cy:ty,r:'20',fill:'none',stroke:color,'stroke-width':'3',opacity:'.7'});\n    sh.innerHTML=`<animate attributeName=\"r\" from=\"14\" to=\"32\" dur=\"0.3s\" repeatCount=\"4\"\/>\n                  <animate attributeName=\"opacity\" from=\"0.8\" to=\"0\" dur=\"0.3s\" repeatCount=\"4\"\/>`;\n    g.appendChild(sh);\n \n    const src=hySvgEl('circle',{cx:x,cy:y,r:'10',fill:color,opacity:'.25'});\n    g.appendChild(src);\n \n    const t=hySvgEl('text',{x:String(midX),y:String(midY+7),fill:color,\n      'font-size':'20','text-anchor':'middle','font-weight':'bold',opacity:'.8'});\n    t.textContent='\u2298';\n    g.appendChild(t);\n    const sub=hySvgEl('text',{x:String(midX),y:String(midY-6),fill:color,\n      'font-size':'6','text-anchor':'middle','font-family':'monospace','letter-spacing':'2',opacity:'.65'});\n    sub.textContent='BLOQU\u00c9';\n    g.appendChild(sub);\n  }\n  document.getElementById('hy-attack-g').appendChild(g);\n}\n \n\/* \u2500\u2500 Moteur \u2500\u2500 *\/\nlet hyIdx=0,hyTimer=null,hyRunning=true,hyBlocked=0;\n \nfunction hyRun(atk){\n  const g=document.getElementById('hy-attack-g');\n  if(g) g.innerHTML='';\n \n  \/\/ M\u00e9triques\n  const vec=document.getElementById('hy-vectors');if(vec)vec.textContent=atk.sources.length;\n  const resp=document.getElementById('hy-response');if(resp){resp.textContent=atk.responseTime;resp.style.color=atk.responseTime==='421 ns'?'var(--tcb)':'var(--sec)';}\n  const rsub=document.getElementById('hy-response-sub');if(rsub)rsub.textContent=atk.modules[0];\n \n  \/\/ Phase\n  const ph=document.getElementById('hy-phase');\n  if(ph){ph.textContent=atk.aiSpeed+' IA \u2192 TCB '+atk.responseTime;ph.style.color='#7B3F00';}\n \n  \/\/ Info attaque\n  const nm=document.getElementById('hy-atk-name');if(nm){nm.textContent=atk.icon+' '+atk.name;nm.style.color='#5B2000';}\n  const det=document.getElementById('hy-atk-detail');if(det)det.textContent=atk.detail;\n  const tcbr=document.getElementById('hy-tcb-response');if(tcbr)tcbr.textContent=atk.tcbResponse;\n \n  \/\/ Flash modules\n  if(typeof flashModule==='function') atk.modules.forEach((id,i)=>setTimeout(()=>flashModule(id,'#7B3F00'),100+i*60));\n \n  \/\/ Tous les n\u0153uds sources simultan\u00e9ment (attaque IA multi-vecteurs)\n  atk.sources.forEach((src,i)=>hyAddNode(src[0],src[1],atk.color,false,atk.cweLabels[i]||''));\n \n  \/\/ Logs rapides\n  atk.steps.forEach(s=>setTimeout(()=>hyLog(s.t,s.m,s.l), s.delay));\n \n  \/\/ Flash TCB double ring\n  setTimeout(()=>{\n    const r1=document.getElementById('hy-tcb-ring1');\n    const r2=document.getElementById('hy-tcb-ring2');\n    if(r1){r1.style.opacity='1';setTimeout(()=>r1.style.opacity='0',200);}\n    if(r2){r2.style.opacity='1';setTimeout(()=>r2.style.opacity='0',350);}\n  }, 550);\n \n  \/\/ Blocage\n  setTimeout(()=>{\n    if(ph){ph.textContent='\u2298 '+atk.sources.length+' vecteurs bloqu\u00e9s \u00b7 '+atk.responseTime;ph.style.color='var(--sec)';}\n    if(g) g.innerHTML='';\n    atk.sources.forEach((src,i)=>hyAddNode(src[0],src[1],atk.color,true,''));\n    hyBlocked+=atk.sources.length;\n    const el=document.getElementById('hy-blocked');\n    if(el){el.textContent=hyBlocked;el.style.color='#7B3F00';setTimeout(()=>el.style.color='var(--sec)',300);}\n  }, 900);\n \n  \/\/ Retour\n  setTimeout(()=>{\n    if(g) g.innerHTML='';\n    if(ph){ph.textContent='En attente\u2026';ph.style.color='var(--text3)';}\n  }, 1700);\n}\n \nfunction hyNext(){\n  if(!hyRunning) return;\n  hyRun(HY_ATTACKS[hyIdx % HY_ATTACKS.length]);\n  hyIdx++;\n  hyTimer=setTimeout(hyNext, 2200);\n}\n \nfunction hyToggle(){\n  const btn=document.getElementById('hy-btn-pause');\n  const lbl=document.getElementById('hy-label');\n  const dot=document.getElementById('hy-dot');\n  if(hyRunning){\n    hyRunning=false;if(hyTimer)clearTimeout(hyTimer);\n    if(btn)btn.textContent='\u25b6 Reprendre';\n    if(lbl)lbl.textContent='EN PAUSE';\n    if(dot){dot.style.animation='none';dot.style.background='var(--text3)';}\n  } else {\n    hyRunning=true;\n    if(btn)btn.textContent='\u23f8 Pause';\n    if(lbl)lbl.textContent='SIMULATION ACTIVE \u00b7 VITESSE IA';\n    if(dot){dot.style.animation='blink .8s ease-in-out infinite';dot.style.background='#7B3F00';}\n    hyNext();\n  }\n}\n \nfunction hyReset(){\n  hyRunning=false;if(hyTimer)clearTimeout(hyTimer);\n  hyIdx=0;hyBlocked=0;\n  const g=document.getElementById('hy-attack-g');if(g)g.innerHTML='';\n  const el=document.getElementById('hy-blocked');if(el)el.textContent='0';\n  const log=document.getElementById('hy-log');\n  if(log){log.innerHTML='<div class=\"console-title\">\/\/ Journal Hybride IA+Humain \u2014 R\u00e9initialis\u00e9<\/div>';}\n  hyLog('ok','TCB FORMEL','Pr\u00eat \u2014 r\u00e9ponse formelle ind\u00e9pendante de la vitesse vecteur');\n  hyRunning=true;\n  const btn=document.getElementById('hy-btn-pause');if(btn)btn.textContent='\u23f8 Pause';\n  const lbl=document.getElementById('hy-label');if(lbl)lbl.textContent='SIMULATION ACTIVE \u00b7 VITESSE IA';\n  const dot=document.getElementById('hy-dot');if(dot){dot.style.animation='blink .8s ease-in-out infinite';dot.style.background='#7B3F00';}\n  setTimeout(hyNext, 800);\n}\n \n\/\/ D\u00e9marrer avec d\u00e9calage\nsetTimeout(hyNext, 4200);\n \n\/* \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\n   CTA FORM HANDLER\n\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550 *\/\nfunction ctaSubmit(e){\n  e.preventDefault();\n  const input = document.getElementById('cta-email');\n  const feedback = document.getElementById('cta-feedback');\n  const btn = e.currentTarget;\n  if(!input || !feedback) return;\n \n  const email = input.value.trim();\n \n  \/\/ Validation email\n  const emailRe = \/^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$\/;\n  if(!email){\n    showFeedback('error', '\u26a0 Veuillez saisir votre adresse email institutionnelle.');\n    input.focus();\n    return;\n  }\n  if(!emailRe.test(email)){\n    showFeedback('error', '\u26a0 Format email invalide \u2014 ex: contact@organisation.gouv.fr');\n    input.focus();\n    return;\n  }\n \n  \/\/ \u00c9tat loading\n  btn.textContent = 'Envoi...';\n  btn.disabled = true;\n  btn.style.opacity = '.7';\n \n  \/\/ Simuler envoi (mailto fallback + confirmation visuelle)\n  setTimeout(()=>{\n    \/\/ Ouvrir le client mail avec pr\u00e9-remplissage\n    window.location.href = 'mailto:contact@cortexorigin.com?subject=Demande+CORTEX+ORIGIN&body=Email+:+' + encodeURIComponent(email);\n \n    \/\/ Feedback visuel succ\u00e8s\n    showFeedback('success',\n      '\u2713 Demande transmise \u2014 nous vous contacterons sous 48h ouvr\u00e9es \u00b7 ' +\n      '<a href=\"https:\/\/cortexorigin.com\" style=\"color:var(--sec)\">cortexorigin.com<\/a>'\n    );\n \n    \/\/ Reset form\n    input.value = '';\n    btn.textContent = 'Demander \u2192';\n    btn.disabled = false;\n    btn.style.opacity = '1';\n  }, 800);\n}\n \nfunction showFeedback(type, msg){\n  const fb = document.getElementById('cta-feedback');\n  if(!fb) return;\n  const isOk = type === 'success';\n  fb.style.display = 'block';\n  fb.style.background = isOk ? 'var(--sec-bg)' : '#FDF0EE';\n  fb.style.border = isOk ? '.5px solid rgba(15,110,86,.35)' : '.5px solid rgba(153,60,29,.35)';\n  fb.style.color = isOk ? 'var(--sec)' : 'var(--crit)';\n  fb.innerHTML = msg;\n  \/\/ Auto-hide apr\u00e8s 8s pour le succ\u00e8s\n  if(isOk) setTimeout(()=>{ fb.style.display='none'; }, 8000);\n}\n \n\/\/ Enter sur l'input d\u00e9clenche aussi\ndocument.addEventListener('DOMContentLoaded', ()=>{\n  const inp = document.getElementById('cta-email');\n  if(inp) inp.addEventListener('keydown', e=>{ if(e.key==='Enter') ctaSubmit(e); });\n});\n \n \n \n<\/script>\n \n<\/body>\n<\/html>\n\n\n","protected":false},"excerpt":{"rendered":"<p>Menu Cortex ORIGIN\u2122 CORTEX ORIGIN\u2122 AETZU ARROW AI\u2122 Benchmark Architecture Socle critique (TCB) CORTEX ORIGIN\u2122 \u2014 Vue d&rsquo;ensemble Cortex Core\u2122 OMEGA\u2122 \u2014 Gouvernance PRISM\u2122 \u2014 Preuve AEGIS\u2122 \u2014 Ex\u00e9cution FULCRUM\u2122 S\u00e9curit\u00e9 &amp; Confinement SENTINEL\u2122 \u2014 S\u00e9curit\u00e9 active WALL-DOME\u2122 \u2014 Confinement CERB\u00c8RE\u2122 Decision Guard\u2122 CMS CORTEX MORPHIC SHIELD\u2122 \u2197 Interface &amp; Orchestration AVA\u2122 &amp; CPL\u2122 \u2014 [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"footnotes":""},"class_list":["post-1095","page","type-page","status-publish","hentry"],"_links":{"self":[{"href":"https:\/\/cortexorigin.com\/index.php\/wp-json\/wp\/v2\/pages\/1095","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/cortexorigin.com\/index.php\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/cortexorigin.com\/index.php\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/cortexorigin.com\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/cortexorigin.com\/index.php\/wp-json\/wp\/v2\/comments?post=1095"}],"version-history":[{"count":28,"href":"https:\/\/cortexorigin.com\/index.php\/wp-json\/wp\/v2\/pages\/1095\/revisions"}],"predecessor-version":[{"id":1420,"href":"https:\/\/cortexorigin.com\/index.php\/wp-json\/wp\/v2\/pages\/1095\/revisions\/1420"}],"wp:attachment":[{"href":"https:\/\/cortexorigin.com\/index.php\/wp-json\/wp\/v2\/media?parent=1095"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}