{"id":1648,"date":"2026-04-25T04:59:01","date_gmt":"2026-04-25T04:59:01","guid":{"rendered":"https:\/\/geoisteaching.com\/?page_id=1648"},"modified":"2026-07-11T06:11:18","modified_gmt":"2026-07-11T06:11:18","slug":"exersati","status":"publish","type":"page","link":"https:\/\/geoisteaching.com\/?page_id=1648","title":{"rendered":"Exersa\u021bi"},"content":{"rendered":"<!DOCTYPE html>\n<html lang=\"ro\">\n<head>\n<meta charset=\"UTF-8\">\n<meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n<title>Exersa\u021bi \u2013 GeoIsTeaching<\/title>\n<link href=\"https:\/\/fonts.googleapis.com\/css2?family=Playfair+Display:ital,wght@0,400;0,700;1,400&#038;family=Nunito:wght@400;600;700;800&#038;display=swap\" rel=\"stylesheet\">\n<style>\n  :root {\n    --gold: #B8862A; --gold-light: #D4A843; --gold-pale: #F5EDD8;\n    --cream: #FDFAF4; --dark: #1A1510; --mid: #4A3F30; --muted: #8C7B65;\n    --pre-a1: #5C4033; --pre-a1-l: #8D6E63; --pre-a1-p: #EFEBE9;\n    --a1a2: #1565C0; --a1a2-l: #42A5F5; --a1a2-p: #E3F2FD;\n    --a2b1: #2E7D32; --a2b1-l: #66BB6A; --a2b1-p: #E8F5E9;\n    --b2c1: #6A1B9A; --b2c1-l: #AB47BC; --b2c1-p: #F3E5F5;\n  }\n  * { margin: 0; padding: 0; box-sizing: border-box; }\n  html { scroll-behavior: smooth; }\n  body { font-family: 'Nunito', sans-serif; background: var(--cream); color: var(--dark); min-height: 100vh; }\n\n  .hero { background: var(--dark); padding: 64px 60px 56px; position: relative; overflow: hidden; }\n  .hero::before { content: ''; position: absolute; inset: 0; background: radial-gradient(ellipse 70% 60% at 80% 50%, rgba(184,134,42,0.10) 0%, transparent 70%), repeating-linear-gradient(-45deg, transparent, transparent 40px, rgba(184,134,42,0.03) 40px, rgba(184,134,42,0.03) 41px); pointer-events: none; }\n  .hero-inner { max-width: 900px; margin: 0 auto; position: relative; z-index: 1; }\n  .hero-badge { display: inline-block; background: var(--gold); color: #fff; font-size: 11px; font-weight: 800; letter-spacing: 3px; text-transform: uppercase; padding: 5px 14px; border-radius: 20px; margin-bottom: 20px; }\n  .hero h1 { font-family: 'Playfair Display', serif; font-size: clamp(32px, 5vw, 58px); color: #fff; line-height: 1.15; margin-bottom: 16px; }\n  .hero h1 em { font-style: italic; color: var(--gold-light); }\n  .hero p { font-size: 17px; color: rgba(255,255,255,0.55); max-width: 580px; line-height: 1.7; font-weight: 600; }\n  .hero-stats { display: flex; gap: 32px; margin-top: 36px; flex-wrap: wrap; }\n  .stat { text-align: center; }\n  .stat-num { font-family: 'Playfair Display', serif; font-size: 32px; color: var(--gold-light); line-height: 1; }\n  .stat-label { font-size: 12px; color: rgba(255,255,255,0.4); letter-spacing: 1.5px; text-transform: uppercase; margin-top: 4px; font-weight: 700; }\n\n  .path-bar { background: var(--gold-pale); padding: 0 60px; border-bottom: 1px solid rgba(184,134,42,0.15); overflow-x: auto; }\n  .path-inner { max-width: 900px; margin: 0 auto; display: flex; gap: 0; }\n  .path-step { display: flex; align-items: center; gap: 10px; padding: 14px 20px 14px 0; font-size: 13px; font-weight: 700; color: var(--muted); white-space: nowrap; cursor: pointer; transition: color 0.2s; border-bottom: 2px solid transparent; text-decoration: none; }\n  .path-step:hover { color: var(--gold); }\n  .path-dot { width: 10px; height: 10px; border-radius: 50%; flex-shrink: 0; }\n  .path-arrow { color: rgba(184,134,42,0.3); margin-right: 10px; font-size: 12px; }\n\n  .content { max-width: 900px; margin: 0 auto; padding: 56px 60px; }\n\n  .intro { display: grid; grid-template-columns: 1fr 1fr; gap: 16px; margin-bottom: 56px; }\n  .intro-card { background: #fff; border: 1px solid rgba(184,134,42,0.12); padding: 22px 24px; border-left: 3px solid var(--gold); }\n  .intro-card h3 { font-family: 'Playfair Display', serif; font-size: 17px; color: var(--dark); margin-bottom: 8px; }\n  .intro-card p { font-size: 14px; color: var(--muted); line-height: 1.6; font-weight: 600; }\n\n  .level-section { margin-bottom: 52px; opacity: 0; transform: translateY(20px); animation: fadeUp 0.5s ease forwards; }\n  .level-section:nth-child(1) { animation-delay: 0.1s; }\n  .level-section:nth-child(2) { animation-delay: 0.2s; }\n  .level-section:nth-child(3) { animation-delay: 0.3s; }\n  .level-section:nth-child(4) { animation-delay: 0.4s; }\n  @keyframes fadeUp { to { opacity: 1; transform: translateY(0); } }\n\n  .level-header { display: flex; align-items: center; gap: 16px; margin-bottom: 20px; padding-bottom: 16px; border-bottom: 1px solid rgba(184,134,42,0.1); }\n  .level-badge { font-size: 12px; font-weight: 800; letter-spacing: 2px; text-transform: uppercase; padding: 6px 16px; border-radius: 20px; color: #fff; white-space: nowrap; }\n  .level-title { font-family: 'Playfair Display', serif; font-size: 22px; color: var(--dark); }\n  .level-desc { font-size: 13px; color: var(--muted); margin-left: auto; font-weight: 600; text-align: right; max-width: 220px; line-height: 1.4; }\n\n  .lessons-grid { display: grid; gap: 12px; }\n  .lesson-card { background: #fff; border: 1px solid rgba(0,0,0,0.07); display: flex; align-items: center; gap: 20px; padding: 20px 24px; text-decoration: none; color: inherit; transition: transform 0.2s, box-shadow 0.2s, border-color 0.2s; position: relative; overflow: hidden; }\n  .lesson-card::before { content: ''; position: absolute; left: 0; top: 0; bottom: 0; width: 4px; transition: width 0.2s; }\n  .lesson-card:hover { transform: translateX(4px); box-shadow: 0 4px 24px rgba(0,0,0,0.08); }\n  .lesson-card:hover::before { width: 6px; }\n  .lesson-icon { width: 48px; height: 48px; border-radius: 12px; display: flex; align-items: center; justify-content: center; font-size: 22px; flex-shrink: 0; transition: transform 0.2s; }\n  .lesson-card:hover .lesson-icon { transform: scale(1.1) rotate(-3deg); }\n  .lesson-body { flex: 1; min-width: 0; }\n  .lesson-num { font-size: 11px; font-weight: 800; letter-spacing: 2px; text-transform: uppercase; margin-bottom: 4px; }\n  .lesson-name { font-family: 'Playfair Display', serif; font-size: 18px; color: var(--dark); margin-bottom: 4px; line-height: 1.3; }\n  .lesson-tags { display: flex; gap: 6px; flex-wrap: wrap; }\n  .lesson-tag { font-size: 11px; font-weight: 700; padding: 2px 8px; border-radius: 10px; background: var(--gold-pale); color: var(--gold); }\n  .lesson-arrow { font-size: 20px; color: rgba(0,0,0,0.15); flex-shrink: 0; transition: color 0.2s, transform 0.2s; }\n  .lesson-card:hover .lesson-arrow { transform: translateX(4px); }\n\n  .pre-a1 .lesson-card::before { background: var(--pre-a1); }\n  .pre-a1 .lesson-icon { background: var(--pre-a1-p); }\n  .pre-a1 .lesson-num { color: var(--pre-a1-l); }\n  .pre-a1 .lesson-card:hover { border-color: var(--pre-a1-l); }\n  .pre-a1 .lesson-card:hover .lesson-arrow { color: var(--pre-a1); }\n  .pre-a1 .level-badge { background: var(--pre-a1); }\n\n  .a1a2 .lesson-card::before { background: var(--a1a2); }\n  .a1a2 .lesson-icon { background: var(--a1a2-p); }\n  .a1a2 .lesson-num { color: var(--a1a2-l); }\n  .a1a2 .lesson-card:hover { border-color: var(--a1a2-l); }\n  .a1a2 .lesson-card:hover .lesson-arrow { color: var(--a1a2); }\n  .a1a2 .level-badge { background: var(--a1a2); }\n\n  .a2b1 .lesson-card::before { background: var(--a2b1); }\n  .a2b1 .lesson-icon { background: var(--a2b1-p); }\n  .a2b1 .lesson-num { color: var(--a2b1-l); }\n  .a2b1 .lesson-card:hover { border-color: var(--a2b1-l); }\n  .a2b1 .lesson-card:hover .lesson-arrow { color: var(--a2b1); }\n  .a2b1 .level-badge { background: var(--a2b1); }\n\n  .b2c1 .lesson-card::before { background: var(--b2c1); }\n  .b2c1 .lesson-icon { background: var(--b2c1-p); }\n  .b2c1 .lesson-num { color: var(--b2c1-l); }\n  .b2c1 .lesson-card:hover { border-color: var(--b2c1-l); }\n  .b2c1 .lesson-card:hover .lesson-arrow { color: var(--b2c1); }\n  .b2c1 .level-badge { background: var(--b2c1); }\n\n  .cta-bar { background: var(--dark); padding: 40px 60px; display: flex; align-items: center; justify-content: space-between; gap: 24px; flex-wrap: wrap; }\n  .cta-bar h2 { font-family: 'Playfair Display', serif; font-size: 22px; color: #fff; line-height: 1.3; }\n  .cta-bar p { color: rgba(255,255,255,0.45); font-size: 14px; margin-top: 4px; font-weight: 600; }\n  .btn-gold { background: var(--gold); color: #fff; font-family: 'Nunito', sans-serif; font-size: 14px; font-weight: 800; padding: 12px 28px; border: none; cursor: pointer; text-decoration: none; display: inline-block; white-space: nowrap; transition: background 0.2s, transform 0.2s; letter-spacing: 0.5px; }\n  .btn-gold:hover { background: var(--gold-light); transform: translateY(-1px); }\n\n  @media (max-width: 720px) {\n    .hero { padding: 40px 20px 36px; }\n    .path-bar { padding: 0 20px; }\n    .content { padding: 36px 20px; }\n    .intro { grid-template-columns: 1fr; }\n    .level-desc { display: none; }\n    .cta-bar { padding: 32px 20px; flex-direction: column; align-items: flex-start; }\n    .hero-stats { gap: 20px; }\n  }\n<\/style>\n<\/head>\n<body>\n\n<div class=\"hero\">\n  <div class=\"hero-inner\">\n    <div class=\"hero-badge\">GeoIsTeaching \u00b7 Francez\u0103 interactiv\u0103<\/div>\n    <h1>Exersa\u021bi <em>franceza<\/em><br>la nivelul vostru<\/h1>\n    <p>Lec\u021bii interactive cu audio, exerci\u021bii, traduceri \u0219i jocuri de rol &#8211; de la primii pa\u0219i p\u00e2n\u0103 la nivel avansat.<\/p>\n    <div class=\"hero-stats\">\n      <div class=\"stat\"><div class=\"stat-num\">4<\/div><div class=\"stat-label\">niveluri<\/div><\/div>\n      <div class=\"stat\"><div class=\"stat-num\">14<\/div><div class=\"stat-label\">lec\u021bii<\/div><\/div>\n      <div class=\"stat\"><div class=\"stat-num\">\ud83d\udd0a<\/div><div class=\"stat-label\">audio TTS<\/div><\/div>\n      <div class=\"stat\"><div class=\"stat-num\">\u270f\ufe0f<\/div><div class=\"stat-label\">exerci\u021bii interactive<\/div><\/div>\n    <\/div>\n  <\/div>\n<\/div>\n\n<div class=\"path-bar\">\n  <div class=\"path-inner\">\n    <a class=\"path-step\" href=\"#pre-a1\"><span class=\"path-dot\" style=\"background:var(--pre-a1)\"><\/span>Pr\u00e9 A1<\/a>\n    <span class=\"path-arrow\">\u203a<\/span>\n    <a class=\"path-step\" href=\"#a1a2\"><span class=\"path-dot\" style=\"background:var(--a1a2)\"><\/span>A1-A2<\/a>\n    <span class=\"path-arrow\">\u203a<\/span>\n    <a class=\"path-step\" href=\"#a2b1\"><span class=\"path-dot\" style=\"background:var(--a2b1)\"><\/span>A2-B1<\/a>\n    <span class=\"path-arrow\">\u203a<\/span>\n    <a class=\"path-step\" href=\"#b2c1\"><span class=\"path-dot\" style=\"background:var(--b2c1)\"><\/span>B2-C1<\/a>\n  <\/div>\n<\/div>\n\n<div class=\"content\">\n\n  <div class=\"intro\">\n    <div class=\"intro-card\">\n      <h3>\ud83c\udfaf Cum s\u0103 folosi\u021bi lec\u021biile<\/h3>\n      <p>Fiecare lec\u021bie include texte cu audio, vocabular ilustrat, gramatic\u0103 explicat\u0103 simplu, exerci\u021bii interactive \u0219i traduceri. Parcurge\u021bi sec\u021biunile \u00een ordine sau alege\u021bi ce v\u0103 intereseaz\u0103.<\/p>\n    <\/div>\n    <div class=\"intro-card\">\n      <h3>\ud83d\udcc8 Progresa\u021bi pas cu pas<\/h3>\n      <p>\u00cencepe\u021bi de la nivelul vostru actual. Nu s\u0103ri\u021bi pa\u0219i &#8211; fiecare lec\u021bie construie\u0219te pe cea anterioar\u0103. Reveni\u021bi oric\u00e2nd pentru recapitulare sau consolidare.<\/p>\n    <\/div>\n  <\/div>\n\n  <!-- PRE A1 -->\n  <div class=\"level-section pre-a1\" id=\"pre-a1\">\n    <div class=\"level-header\">\n      <span class=\"level-badge\">Pr\u00e9 A1<\/span>\n      <h2 class=\"level-title\">Premiers pas en fran\u00e7ais<\/h2>\n      <div class=\"level-desc\">Pour les grands d\u00e9butants &#8211; premiers mots et expressions<\/div>\n    <\/div>\n    <div class=\"lessons-grid\">\n      <a href=\"https:\/\/geoisteaching.com\/?page_id=1644\" class=\"lesson-card\" target=\"_blank\">\n        <div class=\"lesson-icon\">\ud83c\udf31<\/div>\n        <div class=\"lesson-body\">\n          <div class=\"lesson-num\">Pr\u00e9 A1 \u00b7 Lec\u021bie 1<\/div>\n          <div class=\"lesson-name\">Bonjour ! Premiers mots en fran\u00e7ais<\/div>\n          <div class=\"lesson-tags\">\n            <span class=\"lesson-tag\">Salut\u0103ri<\/span>\n            <span class=\"lesson-tag\">Prezentare<\/span>\n            <span class=\"lesson-tag\">Numere<\/span>\n            <span class=\"lesson-tag\">\ud83d\udd0a Audio<\/span>\n          <\/div>\n        <\/div>\n        <div class=\"lesson-arrow\">\u2192<\/div>\n      <\/a>\n    <\/div>\n  <\/div>\n\n  <!-- A1-A2 -->\n  <div class=\"level-section a1a2\" id=\"a1a2\">\n    <div class=\"level-header\">\n      <span class=\"level-badge\">A1-A2<\/span>\n      <h2 class=\"level-title\">Les bases du fran\u00e7ais<\/h2>\n      <div class=\"level-desc\">Vie quotidienne, famille, maison, activit\u00e9s simples<\/div>\n    <\/div>\n    <div class=\"lessons-grid\">\n      <a href=\"https:\/\/geoisteaching.com\/?page_id=1646\" class=\"lesson-card\" target=\"_blank\">\n        <div class=\"lesson-icon\">\ud83c\udfe0<\/div>\n        <div class=\"lesson-body\">\n          <div class=\"lesson-num\">A1-A2 \u00b7 Lec\u021bie 1<\/div>\n          <div class=\"lesson-name\">La maison &#038; les activit\u00e9s du quotidien<\/div>\n          <div class=\"lesson-tags\">\n            <span class=\"lesson-tag\">Maison<\/span>\n            <span class=\"lesson-tag\">Meubles<\/span>\n            <span class=\"lesson-tag\">AVOIR<\/span>\n            <span class=\"lesson-tag\">Articles<\/span>\n            <span class=\"lesson-tag\">\ud83d\udd0a Audio<\/span>\n          <\/div>\n        <\/div>\n        <div class=\"lesson-arrow\">\u2192<\/div>\n      <\/a>\n      <a href=\"https:\/\/geoisteaching.com\/?page_id=1688\" class=\"lesson-card\" target=\"_blank\">\n        <div class=\"lesson-icon\">\ud83d\udc68\u200d\ud83d\udc69\u200d\ud83d\udc67<\/div>\n        <div class=\"lesson-body\">\n          <div class=\"lesson-num\">A1-A2 \u00b7 Lec\u021bie 2<\/div>\n          <div class=\"lesson-name\">La famille &#038; se pr\u00e9senter<\/div>\n          <div class=\"lesson-tags\">\n            <span class=\"lesson-tag\">Famille<\/span>\n            <span class=\"lesson-tag\">Pr\u00e9sentation<\/span>\n            <span class=\"lesson-tag\">\u00caTRE<\/span>\n            <span class=\"lesson-tag\">Adjectifs<\/span>\n            <span class=\"lesson-tag\">\ud83d\udd0a Audio<\/span>\n          <\/div>\n        <\/div>\n        <div class=\"lesson-arrow\">\u2192<\/div>\n      <\/a>\n    <\/div>\n  <\/div>\n\n  <!-- A2-B1 -->\n  <div class=\"level-section a2b1\" id=\"a2b1\">\n    <div class=\"level-header\">\n      <span class=\"level-badge\">A2-B1<\/span>\n      <h2 class=\"level-title\">Fran\u00e7ais interm\u00e9diaire<\/h2>\n      <div class=\"level-desc\">Pass\u00e9 compos\u00e9, sorties, voyages, travail, sant\u00e9<\/div>\n    <\/div>\n    <div class=\"lessons-grid\">\n      <a href=\"https:\/\/geoisteaching.com\/?page_id=1627\" class=\"lesson-card\" target=\"_blank\">\n        <div class=\"lesson-icon\">\ud83c\udf7d\ufe0f<\/div>\n        <div class=\"lesson-body\">\n          <div class=\"lesson-num\">A2-B1 \u00b7 Lec\u021bie 1<\/div>\n          <div class=\"lesson-name\">La nourriture &#038; les repas<\/div>\n          <div class=\"lesson-tags\">\n            <span class=\"lesson-tag\">Restaurant<\/span>\n            <span class=\"lesson-tag\">Pass\u00e9 compos\u00e9<\/span>\n            <span class=\"lesson-tag\">Articles partitifs<\/span>\n            <span class=\"lesson-tag\">\ud83d\udd0a Audio<\/span>\n          <\/div>\n        <\/div>\n        <div class=\"lesson-arrow\">\u2192<\/div>\n      <\/a>\n      <a href=\"https:\/\/geoisteaching.com\/?page_id=1692\" class=\"lesson-card\" target=\"_blank\">\n        <div class=\"lesson-icon\">\u2708\ufe0f<\/div>\n        <div class=\"lesson-body\">\n          <div class=\"lesson-num\">A2-B1 \u00b7 Lec\u021bie 2<\/div>\n          <div class=\"lesson-name\">Les voyages &#038; les transports<\/div>\n          <div class=\"lesson-tags\">\n            <span class=\"lesson-tag\">Voyages<\/span>\n            <span class=\"lesson-tag\">Transports<\/span>\n            <span class=\"lesson-tag\">Imparfait<\/span>\n            <span class=\"lesson-tag\">\ud83d\udd0a Audio<\/span>\n          <\/div>\n        <\/div>\n        <div class=\"lesson-arrow\">\u2192<\/div>\n      <\/a>\n    <\/div>\n  <\/div>\n\n  <!-- B2-C1 -->\n  <div class=\"level-section b2c1\" id=\"b2c1\">\n    <div class=\"level-header\">\n      <span class=\"level-badge\">B2-C1<\/span>\n      <h2 class=\"level-title\">Fran\u00e7ais avanc\u00e9<\/h2>\n      <div class=\"level-desc\">Argumentation, culture, soci\u00e9t\u00e9, nuances stylistiques<\/div>\n    <\/div>\n    <div class=\"lessons-grid\">\n      <a href=\"https:\/\/geoisteaching.com\/?page_id=1635\" class=\"lesson-card\" target=\"_blank\">\n        <div class=\"lesson-icon\">\ud83c\udfad<\/div>\n        <div class=\"lesson-body\">\n          <div class=\"lesson-num\">B2-C1 \u00b7 Lec\u021bie 1<\/div>\n          <div class=\"lesson-name\">L&#8217;art de l&#8217;argumentation<\/div>\n          <div class=\"lesson-tags\">\n            <span class=\"lesson-tag\">Argumentation<\/span>\n            <span class=\"lesson-tag\">Nuancer<\/span>\n            <span class=\"lesson-tag\">R\u00e9futer<\/span>\n            <span class=\"lesson-tag\">\ud83d\udd0a Audio<\/span>\n          <\/div>\n        <\/div>\n        <div class=\"lesson-arrow\">\u2192<\/div>\n      <\/a>\n      <a href=\"https:\/\/geoisteaching.com\/?page_id=1639\" class=\"lesson-card\" target=\"_blank\">\n        <div class=\"lesson-icon\">\ud83d\udcbc<\/div>\n        <div class=\"lesson-body\">\n          <div class=\"lesson-num\">B2-C1 \u00b7 Lec\u021bie 2<\/div>\n          <div class=\"lesson-name\">Le monde du travail<\/div>\n          <div class=\"lesson-tags\">\n            <span class=\"lesson-tag\">Travail<\/span>\n            <span class=\"lesson-tag\">N\u00e9gociation<\/span>\n            <span class=\"lesson-tag\">Email pro<\/span>\n            <span class=\"lesson-tag\">\ud83d\udd0a Audio<\/span>\n          <\/div>\n        <\/div>\n        <div class=\"lesson-arrow\">\u2192<\/div>\n      <\/a>\n      <a href=\"https:\/\/geoisteaching.com\/?page_id=1672\" class=\"lesson-card\" target=\"_blank\">\n        <div class=\"lesson-icon\">\u2708\ufe0f<\/div>\n        <div class=\"lesson-body\">\n          <div class=\"lesson-num\">B2-C1 \u00b7 Lec\u021bie 3<\/div>\n          <div class=\"lesson-name\">Voyager autrement &#8211; Culture &#038; destinations<\/div>\n          <div class=\"lesson-tags\">\n            <span class=\"lesson-tag\">Voyages<\/span>\n            <span class=\"lesson-tag\">Culture<\/span>\n            <span class=\"lesson-tag\">Conditionnel<\/span>\n            <span class=\"lesson-tag\">\ud83d\udd0a Audio<\/span>\n          <\/div>\n        <\/div>\n        <div class=\"lesson-arrow\">\u2192<\/div>\n      <\/a>\n      <a href=\"https:\/\/geoisteaching.com\/?page_id=1680\" class=\"lesson-card\" target=\"_blank\">\n        <div class=\"lesson-icon\">\ud83c\udf3f<\/div>\n        <div class=\"lesson-body\">\n          <div class=\"lesson-num\">B2-C1 \u00b7 Lec\u021bie 4<\/div>\n          <div class=\"lesson-name\">La Terre en partage &#8211; Ressources naturelles<\/div>\n          <div class=\"lesson-tags\">\n            <span class=\"lesson-tag\">\u00c9cologie<\/span>\n            <span class=\"lesson-tag\">\u00c9nergie<\/span>\n            <span class=\"lesson-tag\">Voix passive<\/span>\n            <span class=\"lesson-tag\">\ud83d\udd0a Audio<\/span>\n          <\/div>\n        <\/div>\n        <div class=\"lesson-arrow\">\u2192<\/div>\n      <\/a>\n      <a href=\"https:\/\/geoisteaching.com\/?page_id=1683\" class=\"lesson-card\" target=\"_blank\">\n        <div class=\"lesson-icon\">\u26bd<\/div>\n        <div class=\"lesson-body\">\n          <div class=\"lesson-num\">B2-C1 \u00b7 Lec\u021bie 5<\/div>\n          <div class=\"lesson-name\">Le Sport &#8211; entre passion, soci\u00e9t\u00e9 et performance<\/div>\n          <div class=\"lesson-tags\">\n            <span class=\"lesson-tag\">Sport<\/span>\n            <span class=\"lesson-tag\">Soci\u00e9t\u00e9<\/span>\n            <span class=\"lesson-tag\">Discours rapport\u00e9<\/span>\n            <span class=\"lesson-tag\">\ud83d\udd0a Audio<\/span>\n          <\/div>\n        <\/div>\n        <div class=\"lesson-arrow\">\u2192<\/div>\n      <\/a>\n      <a href=\"https:\/\/geoisteaching.com\/?page_id=1701\" class=\"lesson-card\" target=\"_blank\">\n        <div class=\"lesson-icon\">\ud83d\udcdd<\/div>\n        <div class=\"lesson-body\">\n          <div class=\"lesson-num\">B2-C1 \u00b7 Lec\u021bie 6<\/div>\n          <div class=\"lesson-name\">Les pronoms COD &#8211; le, la, l&#8217;, les<\/div>\n          <div class=\"lesson-tags\">\n            <span class=\"lesson-tag\">Gramatic\u0103<\/span>\n            <span class=\"lesson-tag\">\ud83d\udd0a Audio TTS<\/span>\n            <span class=\"lesson-tag\">Dictare<\/span>\n            <span class=\"lesson-tag\">Traducere<\/span>\n            <span class=\"lesson-tag\">\ud83c\udfa4 Oral<\/span>\n          <\/div>\n        <\/div>\n        <div class=\"lesson-arrow\">\u2192<\/div>\n      <\/a>\n      <a href=\"https:\/\/geoisteaching.com\/?page_id=1727\" class=\"lesson-card\" target=\"_blank\">\n        <div class=\"lesson-icon\">\ud83c\udf93<\/div>\n        <div class=\"lesson-body\">\n          <div class=\"lesson-num\">B2-C1 \u00b7 Lec\u021bie 7<\/div>\n          <div class=\"lesson-name\">Simulation d&#8217;examen \u2013 DALF C1 \u00b7 Culture &#038; Identit\u00e9<\/div>\n          <div class=\"lesson-tags\">\n            <span class=\"lesson-tag\">Examen complet<\/span>\n            <span class=\"lesson-tag\">4 \u00e9preuves<\/span>\n            <span class=\"lesson-tag\">\ud83d\udd0a Audio TTS<\/span>\n            <span class=\"lesson-tag\">\u270f\ufe0f Exerci\u021bii interactive<\/span>\n          <\/div>\n        <\/div>\n        <div class=\"lesson-arrow\">\u2192<\/div>\n      <\/a>\n\n      <a href=\"https:\/\/geoisteaching.com\/?page_id=1734\" class=\"lesson-card\" target=\"_blank\">\n        <div class=\"lesson-icon\">\ud83d\udd00<\/div>\n        <div class=\"lesson-body\">\n          <div class=\"lesson-num\">B2-C1 \u00b7 Lec\u021bie 8<\/div>\n          <div class=\"lesson-name\">Pronoms COD &#038; COI \u2014 Exercices interactifs<\/div>\n          <div class=\"lesson-tags\">\n            <span class=\"lesson-tag\">COD<\/span>\n            <span class=\"lesson-tag\">COI<\/span>\n            <span class=\"lesson-tag\">QCM<\/span>\n            <span class=\"lesson-tag\">Lacunes<\/span>\n            <span class=\"lesson-tag\">Transformation<\/span>\n            <span class=\"lesson-tag\">\u270f\ufe0f Mixte<\/span>\n          <\/div>\n        <\/div>\n        <div class=\"lesson-arrow\">\u2192<\/div>\n      <\/a>\n\n      <a href=\"https:\/\/geoisteaching.com\/?page_id=1738\" class=\"lesson-card\" target=\"_blank\">\n        <div class=\"lesson-icon\">\ud83d\udd00<\/div>\n        <div class=\"lesson-body\">\n          <div class=\"lesson-num\">B2-C1 \u00b7 Lec\u021bie 9<\/div>\n          <div class=\"lesson-name\">Confusions fr\u00e9quentes \u2014 les\/leurs \u00b7 nous\/nous nous \u00b7 on\/nous \u00b7 leur\/leurs<\/div>\n          <div class=\"lesson-tags\">\n            <span class=\"lesson-tag\">les vs leurs<\/span>\n            <span class=\"lesson-tag\">nous nous<\/span>\n            <span class=\"lesson-tag\">on vs nous<\/span>\n            <span class=\"lesson-tag\">leur vs leurs<\/span>\n            <span class=\"lesson-tag\">\u270f\ufe0f Mixte<\/span>\n          <\/div>\n        <\/div>\n        <div class=\"lesson-arrow\">\u2192<\/div>\n      <\/a>\n    <\/div>\n  <\/div>\n\n<\/div>\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>Simulation Examen B2 \u2014 Allingua Format<\/title>\n<link rel=\"preconnect\" href=\"https:\/\/fonts.googleapis.com\">\n<link href=\"https:\/\/fonts.googleapis.com\/css2?family=Source+Serif+4:opsz,wght@8..60,400;8..60,600;8..60,700&#038;family=Inter:wght@400;500;600;700&#038;family=JetBrains+Mono:wght@400;500&#038;display=swap\" rel=\"stylesheet\">\n<style>\n:root {\n  --bg: #FAFAF8;\n  --bg-card: #FFFFFF;\n  --ink: #1C1C1C;\n  --ink-soft: #5A5A54;\n  --navy: #1A3A5C;\n  --navy-deep: #102740;\n  --line: #DEDED6;\n  --success: #2D6A4F;\n  --success-bg: #E8F3EC;\n  --error: #9B2C2C;\n  --error-bg: #FBEAEA;\n  --amber: #B8860B;\n  --amber-bg: #FBF3E0;\n  --radius: 3px;\n}\n\n* { box-sizing: border-box; }\n\nbody {\n  margin: 0;\n  background: var(--bg);\n  color: var(--ink);\n  font-family: 'Inter', sans-serif;\n  font-size: 16px;\n  line-height: 1.55;\n}\n\nh1, h2, h3 { font-family: 'Source Serif 4', serif; margin: 0; }\n\n.app { max-width: 880px; margin: 0 auto; padding: 0 20px 80px; }\n\n\/* ===== TOP BAR \/ TIMER ===== *\/\n.topbar {\n  position: sticky;\n  top: 0;\n  z-index: 50;\n  background: var(--navy-deep);\n  color: #EFEFE8;\n  padding: 0;\n  border-bottom: 3px solid var(--amber);\n}\n.topbar-inner {\n  max-width: 880px;\n  margin: 0 auto;\n  display: flex;\n  align-items: center;\n  justify-content: space-between;\n  padding: 10px 20px;\n  gap: 16px;\n}\n.topbar-id {\n  font-size: 12px;\n  letter-spacing: 0.08em;\n  text-transform: uppercase;\n  color: #B9C6D4;\n}\n.topbar-section {\n  font-family: 'Source Serif 4', serif;\n  font-size: 17px;\n  font-weight: 600;\n  color: #fff;\n}\n.timer {\n  font-family: 'JetBrains Mono', monospace;\n  font-size: 22px;\n  font-weight: 500;\n  padding: 4px 14px;\n  border-radius: var(--radius);\n  background: rgba(255,255,255,0.08);\n  min-width: 92px;\n  text-align: center;\n  letter-spacing: 0.02em;\n}\n.timer.warn { background: rgba(184,134,11,0.35); color: #FFE9B0; }\n.timer.danger { background: rgba(155,44,44,0.45); color: #FFD2D2; animation: pulse 1s infinite; }\n@keyframes pulse { 50% { opacity: 0.55; } }\n\n\/* ===== HEADER \/ LANDING ===== *\/\n.masthead {\n  padding: 48px 0 28px;\n  border-bottom: 1px solid var(--line);\n  margin-bottom: 32px;\n}\n.eyebrow {\n  font-size: 12px;\n  letter-spacing: 0.14em;\n  text-transform: uppercase;\n  color: var(--navy);\n  font-weight: 600;\n  margin-bottom: 10px;\n}\n.masthead h1 {\n  font-size: 34px;\n  font-weight: 700;\n  color: var(--navy-deep);\n  line-height: 1.15;\n  margin-bottom: 10px;\n}\n.masthead p { color: var(--ink-soft); font-size: 15.5px; max-width: 560px; }\n\n.exam-grid {\n  display: grid;\n  gap: 16px;\n  margin-top: 28px;\n}\n.exam-card {\n  background: var(--bg-card);\n  border: 1px solid var(--line);\n  border-radius: var(--radius);\n  padding: 22px 24px;\n  display: flex;\n  align-items: center;\n  justify-content: space-between;\n  gap: 20px;\n  transition: border-color 0.15s, transform 0.15s;\n}\n.exam-card:hover { border-color: var(--navy); transform: translateX(2px); }\n.exam-card-title { font-family: 'Source Serif 4', serif; font-size: 19px; font-weight: 600; color: var(--navy-deep); margin-bottom: 4px; }\n.exam-card-meta { font-size: 13px; color: var(--ink-soft); }\n.btn {\n  font-family: 'Inter', sans-serif;\n  font-weight: 600;\n  font-size: 14px;\n  padding: 11px 20px;\n  border-radius: var(--radius);\n  border: none;\n  cursor: pointer;\n  background: var(--navy);\n  color: #fff;\n  white-space: nowrap;\n  transition: background 0.15s;\n}\n.btn:hover { background: var(--navy-deep); }\n.btn.secondary { background: transparent; color: var(--navy); border: 1.5px solid var(--navy); }\n.btn.secondary:hover { background: var(--navy); color: #fff; }\n.btn.ghost { background: transparent; color: var(--ink-soft); border: 1px solid var(--line); }\n.btn:disabled { opacity: 0.4; cursor: not-allowed; }\n\n\/* ===== SECTION NAV (intra-exam) ===== *\/\n.section-progress {\n  display: flex;\n  gap: 6px;\n  padding: 16px 0 0;\n  flex-wrap: wrap;\n}\n.dot {\n  font-size: 11px;\n  font-weight: 600;\n  padding: 5px 11px;\n  border-radius: 20px;\n  background: #EEEEE6;\n  color: var(--ink-soft);\n  letter-spacing: 0.02em;\n}\n.dot.active { background: var(--navy); color: #fff; }\n.dot.done { background: var(--success-bg); color: var(--success); }\n\n\/* ===== CARDS \/ SECTIONS ===== *\/\n.card {\n  background: var(--bg-card);\n  border: 1px solid var(--line);\n  border-radius: var(--radius);\n  padding: 28px 30px;\n  margin-bottom: 22px;\n}\n.card-label {\n  font-size: 12px;\n  text-transform: uppercase;\n  letter-spacing: 0.1em;\n  color: var(--navy);\n  font-weight: 600;\n  margin-bottom: 8px;\n}\n.card h2 { font-size: 22px; color: var(--navy-deep); margin-bottom: 4px; }\n.card .sub { color: var(--ink-soft); font-size: 14px; margin-bottom: 18px; }\n\n.instructions {\n  background: var(--amber-bg);\n  border-left: 3px solid var(--amber);\n  padding: 12px 16px;\n  font-size: 14px;\n  color: #6B5009;\n  border-radius: var(--radius);\n  margin-bottom: 22px;\n}\n\n\/* ===== AUDIO PLAYER ===== *\/\n.audio-box {\n  background: #F3F4F0;\n  border: 1px solid var(--line);\n  border-radius: var(--radius);\n  padding: 18px 20px;\n  margin-bottom: 20px;\n}\n.audio-controls { display: flex; align-items: center; gap: 12px; margin-bottom: 10px; }\n.play-btn {\n  width: 42px; height: 42px;\n  border-radius: 50%;\n  background: var(--navy);\n  border: none;\n  color: #fff;\n  font-size: 16px;\n  cursor: pointer;\n  display: flex; align-items: center; justify-content: center;\n  flex-shrink: 0;\n}\n.play-btn:hover { background: var(--navy-deep); }\n.play-btn:disabled { background: #BBB; cursor: not-allowed; }\n.audio-meta { font-size: 13px; color: var(--ink-soft); flex: 1; }\n.audio-meta strong { color: var(--ink); }\n.play-count { font-size: 12px; color: var(--ink-soft); }\n.transcript-toggle {\n  font-size: 12.5px;\n  color: var(--navy);\n  cursor: pointer;\n  text-decoration: underline dotted;\n  background: none;\n  border: none;\n  padding: 0;\n  margin-top: 4px;\n}\n.transcript {\n  margin-top: 12px;\n  padding: 12px 14px;\n  background: #fff;\n  border: 1px dashed var(--line);\n  border-radius: var(--radius);\n  font-size: 14px;\n  color: var(--ink-soft);\n  font-style: italic;\n  display: none;\n  line-height: 1.6;\n}\n.transcript.show { display: block; }\n\n\/* ===== READING TEXT ===== *\/\n.reading-text {\n  font-family: 'Source Serif 4', serif;\n  font-size: 16.5px;\n  line-height: 1.75;\n  color: #2A2A24;\n  padding: 18px 22px;\n  background: #F6F6F1;\n  border-radius: var(--radius);\n  margin-bottom: 22px;\n  border: 1px solid var(--line);\n}\n\n\/* ===== QUESTIONS ===== *\/\n.question-block { margin-bottom: 22px; padding-bottom: 18px; border-bottom: 1px solid var(--line); }\n.question-block:last-child { border-bottom: none; }\n.q-text { font-weight: 600; margin-bottom: 10px; font-size: 15px; }\n.q-num { color: var(--navy); margin-right: 6px; }\n.options { display: flex; flex-direction: column; gap: 8px; }\n.option {\n  display: flex;\n  align-items: center;\n  gap: 10px;\n  padding: 10px 14px;\n  border: 1px solid var(--line);\n  border-radius: var(--radius);\n  cursor: pointer;\n  font-size: 14.5px;\n  transition: border-color 0.12s, background 0.12s;\n}\n.option:hover { border-color: var(--navy); background: #F6F8FA; }\n.option.selected { border-color: var(--navy); background: #EAF0F6; font-weight: 500; }\n.option.correct { border-color: var(--success); background: var(--success-bg); }\n.option.incorrect { border-color: var(--error); background: var(--error-bg); }\n.option input { accent-color: var(--navy); }\n\n.reveal-btn {\n  font-size: 12.5px;\n  color: var(--ink-soft);\n  background: #EEEEE6;\n  border: none;\n  padding: 5px 12px;\n  border-radius: var(--radius);\n  cursor: pointer;\n  margin-top: 4px;\n}\n.reveal-btn:hover { background: #E2E2D8; }\n\n\/* ===== GRAMMAR FILL ===== *\/\n.fill-q { font-size: 15px; margin-bottom: 10px; }\n.fill-q code { background: #F0F0E8; padding: 1px 4px; border-radius: 2px; }\n\n\/* ===== WRITTEN PRODUCTION ===== *\/\n.prompt-box {\n  background: #EFF3F7;\n  border: 1px solid #C9D7E3;\n  border-radius: var(--radius);\n  padding: 16px 18px;\n  margin-bottom: 18px;\n}\n.prompt-type { font-size: 12px; text-transform: uppercase; letter-spacing: 0.08em; color: var(--navy); font-weight: 600; margin-bottom: 6px; }\n.word-count { font-size: 13px; color: var(--ink-soft); margin-top: 8px; text-align: right; }\n.word-count.over { color: var(--error); font-weight: 600; }\n\ntextarea.essay {\n  width: 100%;\n  min-height: 280px;\n  font-family: 'Source Serif 4', serif;\n  font-size: 16px;\n  line-height: 1.6;\n  padding: 16px 18px;\n  border: 1px solid var(--line);\n  border-radius: var(--radius);\n  resize: vertical;\n  color: var(--ink);\n  background: #fff;\n}\ntextarea.essay:focus { outline: 2px solid var(--navy); outline-offset: 1px; }\n\n\/* Virtual keyboard *\/\n.vkb-toggle {\n  display: inline-flex;\n  align-items: center;\n  gap: 6px;\n  font-size: 13px;\n  color: var(--navy);\n  background: #fff;\n  border: 1px solid var(--navy);\n  padding: 7px 13px;\n  border-radius: var(--radius);\n  cursor: pointer;\n  margin: 10px 0;\n}\n.vkb-toggle:hover { background: #EAF0F6; }\n.vkb {\n  display: none;\n  margin-top: 10px;\n  padding: 14px;\n  background: #ECECE4;\n  border-radius: var(--radius);\n  border: 1px solid var(--line);\n}\n.vkb.show { display: block; }\n.vkb-row { display: flex; gap: 5px; margin-bottom: 5px; justify-content: center; }\n.vkb-key {\n  min-width: 36px;\n  height: 38px;\n  padding: 0 6px;\n  background: #fff;\n  border: 1px solid #CCCCC0;\n  border-radius: 4px;\n  font-size: 15px;\n  cursor: pointer;\n  font-family: 'Inter', sans-serif;\n  color: var(--ink);\n  box-shadow: 0 1px 0 rgba(0,0,0,0.06);\n}\n.vkb-key:hover { background: var(--navy); color: #fff; border-color: var(--navy); }\n.vkb-key:active { transform: translateY(1px); box-shadow: none; }\n.vkb-key.wide { min-width: 70px; font-size: 12px; }\n\n\/* ===== ORAL ===== *\/\n.oral-topic-list { display: flex; flex-direction: column; gap: 10px; margin-bottom: 20px; }\n.oral-topic {\n  padding: 14px 16px;\n  background: #F6F6F1;\n  border: 1px solid var(--line);\n  border-radius: var(--radius);\n  font-size: 15px;\n  cursor: pointer;\n}\n.oral-topic:hover { border-color: var(--navy); }\n.oral-topic.picked { border-color: var(--amber); background: var(--amber-bg); font-weight: 600; }\n.oral-stage {\n  text-align: center;\n  padding: 40px 20px;\n}\n.oral-stage .big-timer {\n  font-family: 'JetBrains Mono', monospace;\n  font-size: 56px;\n  font-weight: 500;\n  color: var(--navy-deep);\n  margin: 14px 0;\n}\n.oral-phase-label { font-size: 13px; text-transform: uppercase; letter-spacing: 0.1em; color: var(--ink-soft); }\n.oral-topic-display { font-family: 'Source Serif 4', serif; font-size: 19px; margin: 18px 0; color: var(--navy-deep); max-width: 500px; margin-left: auto; margin-right: auto; }\n.oral-plan-hint { font-size: 13px; color: var(--ink-soft); margin-top: 24px; text-align: left; background: #F6F6F1; padding: 14px 18px; border-radius: var(--radius); max-width: 460px; margin-left: auto; margin-right: auto; }\n\n\/* ===== FOOTER NAV ===== *\/\n.footer-nav {\n  display: flex;\n  justify-content: space-between;\n  align-items: center;\n  margin-top: 24px;\n  padding-top: 18px;\n}\n\n\/* ===== RESULTS ===== *\/\n.score-hero {\n  text-align: center;\n  padding: 36px 0;\n}\n.score-big {\n  font-family: 'Source Serif 4', serif;\n  font-size: 64px;\n  font-weight: 700;\n  color: var(--navy-deep);\n}\n.score-pass { color: var(--success); }\n.score-fail { color: var(--error); }\n.score-label { font-size: 14px; color: var(--ink-soft); text-transform: uppercase; letter-spacing: 0.08em; margin-top: 4px; }\n.breakdown { display: grid; gap: 10px; margin-top: 24px; }\n.breakdown-row {\n  display: flex;\n  justify-content: space-between;\n  align-items: center;\n  padding: 12px 16px;\n  background: #F6F6F1;\n  border-radius: var(--radius);\n  border: 1px solid var(--line);\n}\n.breakdown-row.fail-min { border-left: 3px solid var(--error); }\n.breakdown-row.pass-min { border-left: 3px solid var(--success); }\n.breakdown-name { font-weight: 600; font-size: 14.5px; }\n.breakdown-score { font-family: 'JetBrains Mono', monospace; font-size: 15px; }\n.breakdown-minscore { font-size: 12px; color: var(--ink-soft); margin-left: 8px; }\n\n.hidden { display: none !important; }\n\n@media (max-width: 600px) {\n  .masthead h1 { font-size: 26px; }\n  .card { padding: 20px 18px; }\n  .oral-stage .big-timer { font-size: 42px; }\n  .vkb-key { min-width: 28px; height: 34px; font-size: 13px; }\n}\n<\/style>\n<\/head>\n<body>\n\n<div class=\"topbar\">\n  <div class=\"topbar-inner\">\n    <div class=\"topbar-id\" id=\"topbarId\">B2 \u00b7 ALLINGUA FORMAT<\/div>\n    <div class=\"topbar-section\" id=\"topbarSection\">\u2014<\/div>\n    <div class=\"timer\" id=\"globalTimer\">&#8211;:&#8211;<\/div>\n  <\/div>\n<\/div>\n\n<div class=\"app\" id=\"app\"><\/div>\n\n<script>\n\/\/ ============================================================\n\/\/ DONN\u00c9ES DES 3 SIMULATIONS D'EXAMEN B2\n\/\/ ============================================================\n\nconst EXAMS = [\n  \/\/ ============================================================\n  \/\/ SIMULATION 1\n  \/\/ ============================================================\n  {\n    id: 1,\n    title: \"Simulation 1\",\n    listening: {\n      duration: 25 * 60,\n      maxScore: 15,\n      passages: [\n        {\n          title: \"Document 1 \u2014 Bulletin d'actualit\u00e9 : mobilit\u00e9 urbaine\",\n          script: \"Bonjour \u00e0 toutes et \u00e0 tous, et bienvenue dans votre point d'actualit\u00e9. \u00c0 la une aujourd'hui : la ville de Lyon annonce un plan ambitieux pour r\u00e9duire la circulation automobile dans son centre historique. D\u00e8s le premier janvier prochain, une nouvelle zone \u00e0 faibles \u00e9missions sera mise en place, interdisant progressivement l'acc\u00e8s aux v\u00e9hicules les plus polluants. Selon la mairie, cette mesure devrait permettre de r\u00e9duire les \u00e9missions de particules fines de pr\u00e8s de trente pour cent en trois ans. Les commer\u00e7ants du centre-ville, eux, restent partag\u00e9s. Certains craignent une baisse de fr\u00e9quentation, tandis que d'autres saluent une initiative qui, selon eux, am\u00e9liorera la qualit\u00e9 de vie et attirera une client\u00e8le plus soucieuse de l'environnement. La municipalit\u00e9 pr\u00e9cise que des aides financi\u00e8res seront propos\u00e9es aux habitants souhaitant changer de v\u00e9hicule, ainsi qu'un renforcement du r\u00e9seau de transports en commun, avec notamment trois nouvelles lignes de bus \u00e9lectriques pr\u00e9vues pour la rentr\u00e9e. Cette annonce s'inscrit dans une tendance plus large observ\u00e9e dans plusieurs grandes villes europ\u00e9ennes, qui multiplient les restrictions de circulation pour r\u00e9pondre aux enjeux climatiques et sanitaires.\",\n          questions: [\n            { q: \"Quelle mesure la ville de Lyon va-t-elle mettre en place ?\", options: [\"Une interdiction totale des voitures\", \"Une zone \u00e0 faibles \u00e9missions\", \"Une augmentation des taxes sur l'essence\"], correct: 1 },\n            { q: \"Quelle r\u00e9duction des particules fines est attendue ?\", options: [\"10% en un an\", \"30% en trois ans\", \"50% en cinq ans\"], correct: 1 },\n            { q: \"Comment r\u00e9agissent les commer\u00e7ants ?\", options: [\"Ils sont tous oppos\u00e9s\", \"Ils sont tous favorables\", \"Leurs avis sont partag\u00e9s\"], correct: 2 },\n            { q: \"Que pr\u00e9voit la mairie pour les habitants ?\", options: [\"Des amendes plus \u00e9lev\u00e9es\", \"Des aides financi\u00e8res pour changer de v\u00e9hicule\", \"Rien de particulier\"], correct: 1 },\n            { q: \"Combien de nouvelles lignes de bus \u00e9lectriques sont pr\u00e9vues ?\", options: [\"Deux\", \"Trois\", \"Cinq\"], correct: 1 },\n          ],\n        },\n        {\n          title: \"Document 2 \u2014 Interview : protection des consommateurs\",\n          script: \"Notre invit\u00e9e aujourd'hui est juriste sp\u00e9cialis\u00e9e en droit de la consommation. Merci d'\u00eatre avec nous. Bonjour, merci de votre invitation. Pouvez-vous nous expliquer ce qui a chang\u00e9 r\u00e9cemment pour les consommateurs qui ach\u00e8tent en ligne ? Oui, en effet, une nouvelle directive europ\u00e9enne renforce les obligations d'information des vendeurs en ligne. D\u00e9sormais, les plateformes doivent indiquer clairement si un vendeur est un professionnel ou un particulier, ce qui change consid\u00e9rablement les droits applicables, notamment en mati\u00e8re de garantie. Et concr\u00e8tement, qu'est-ce que cela signifie pour quelqu'un qui ach\u00e8te, par exemple, sur un site de seconde main ? Cela signifie que si vous achetez aupr\u00e8s d'un particulier, vous ne b\u00e9n\u00e9ficiez pas des m\u00eames garanties l\u00e9gales que face \u00e0 un professionnel. Il est donc essentiel de v\u00e9rifier le statut du vendeur avant tout achat. Avez-vous un conseil particulier \u00e0 donner \u00e0 nos auditeurs ? Je dirais surtout : lisez les conditions g\u00e9n\u00e9rales de vente, m\u00eame si cela para\u00eet fastidieux, et n'h\u00e9sitez pas \u00e0 utiliser votre droit de r\u00e9tractation de quatorze jours en cas de doute. C'est un droit trop souvent m\u00e9connu, alors qu'il offre une r\u00e9elle protection.\",\n          questions: [\n            { q: \"Quel est le m\u00e9tier de l'invit\u00e9e ?\", options: [\"Avocate g\u00e9n\u00e9raliste\", \"Juriste sp\u00e9cialis\u00e9e en droit de la consommation\", \"Journaliste \u00e9conomique\"], correct: 1 },\n            { q: \"Que doivent d\u00e9sormais indiquer les plateformes en ligne ?\", options: [\"Le prix de livraison\", \"Si le vendeur est professionnel ou particulier\", \"La nationalit\u00e9 du vendeur\"], correct: 1 },\n            { q: \"Quelle est la diff\u00e9rence principale entre acheter \u00e0 un particulier ou \u00e0 un professionnel ?\", options: [\"Le d\u00e9lai de livraison\", \"Les garanties l\u00e9gales applicables\", \"Le mode de paiement\"], correct: 1 },\n            { q: \"Quel d\u00e9lai de r\u00e9tractation est mentionn\u00e9 ?\", options: [\"7 jours\", \"14 jours\", \"30 jours\"], correct: 1 },\n            { q: \"Quel conseil principal donne la juriste ?\", options: [\"Toujours payer en liquide\", \"Lire les conditions g\u00e9n\u00e9rales de vente\", \"\u00c9viter tout achat en ligne\"], correct: 1 },\n          ],\n        },\n        {\n          title: \"Document 3 \u2014 Reportage : agriculture biologique\",\n          script: \"Direction la campagne normande, o\u00f9 nous rencontrons aujourd'hui un agriculteur qui a fait le choix, il y a cinq ans, de convertir son exploitation \u00e0 l'agriculture biologique. Cette transition n'a pas \u00e9t\u00e9 simple, explique-t-il. Les trois premi\u00e8res ann\u00e9es sont les plus difficiles, car on ne peut pas encore vendre sous le label biologique tout en ayant d\u00e9j\u00e0 renonc\u00e9 aux pesticides de synth\u00e8se. C'est ce qu'on appelle la p\u00e9riode de conversion. Pendant cette p\u00e9riode, les rendements baissent souvent, ce qui repr\u00e9sente un risque financier important. Mais selon lui, le jeu en valait la chandelle. Aujourd'hui, ses produits se vendent mieux, notamment gr\u00e2ce \u00e0 la demande croissante des consommateurs pour une alimentation plus saine et plus respectueuse de l'environnement. Il travaille \u00e9galement en circuit court, en vendant directement sur les march\u00e9s locaux, ce qui lui permet de mieux valoriser son travail. Toutefois, il reste prudent quant \u00e0 l'id\u00e9e d'une g\u00e9n\u00e9ralisation rapide de ce mod\u00e8le \u00e0 l'ensemble du territoire, estimant que cela n\u00e9cessiterait un accompagnement financier beaucoup plus important de la part des pouvoirs publics.\",\n          questions: [\n            { q: \"Depuis combien de temps l'agriculteur a-t-il converti son exploitation ?\", options: [\"Deux ans\", \"Cinq ans\", \"Dix ans\"], correct: 1 },\n            { q: \"Pourquoi les trois premi\u00e8res ann\u00e9es sont-elles difficiles ?\", options: [\"Le climat est mauvais\", \"On ne peut pas encore vendre sous le label bio\", \"Il manque de personnel\"], correct: 1 },\n            { q: \"Que se passe-t-il g\u00e9n\u00e9ralement avec les rendements pendant la conversion ?\", options: [\"Ils augmentent\", \"Ils baissent\", \"Ils restent stables\"], correct: 1 },\n            { q: \"Comment vend-il principalement ses produits aujourd'hui ?\", options: [\"En grande distribution\", \"En circuit court sur les march\u00e9s locaux\", \"Uniquement \u00e0 l'export\"], correct: 1 },\n            { q: \"Que pense-t-il d'une g\u00e9n\u00e9ralisation rapide du mod\u00e8le bio ?\", options: [\"C'est facile et rapide \u00e0 mettre en place\", \"Cela n\u00e9cessiterait un accompagnement financier important\", \"Ce n'est pas souhaitable du tout\"], correct: 1 },\n          ],\n        },\n      ],\n    },\n    reading: {\n      duration: 25 * 60,\n      maxScore: 10,\n      texts: [\n        {\n          title: \"Texte 1 \u2014 Article de presse\",\n          content: \"La question de la pollution de l'air dans les grandes m\u00e9tropoles europ\u00e9ennes continue de susciter l'inqui\u00e9tude des autorit\u00e9s sanitaires. Selon un rapport r\u00e9cent de l'Agence europ\u00e9enne pour l'environnement, plus de trois cent mille d\u00e9c\u00e8s pr\u00e9matur\u00e9s seraient attribuables chaque ann\u00e9e \u00e0 une exposition prolong\u00e9e aux particules fines sur le continent. Si les villes ont multipli\u00e9 les initiatives ces derni\u00e8res ann\u00e9es, telles que la cr\u00e9ation de zones \u00e0 circulation restreinte ou le d\u00e9veloppement de pistes cyclables, les r\u00e9sultats demeurent contrast\u00e9s selon les r\u00e9gions. Certaines m\u00e9tropoles, comme Madrid ou Milan, ont enregistr\u00e9 des baisses significatives de la pollution atmosph\u00e9rique, gr\u00e2ce \u00e0 des politiques volontaristes combinant restrictions de circulation et investissements massifs dans les transports publics. D'autres villes, en revanche, peinent \u00e0 inverser la tendance, en raison notamment d'une d\u00e9pendance encore forte au chauffage au bois ou au charbon dans certaines r\u00e9gions d'Europe centrale et orientale. Les experts s'accordent n\u00e9anmoins sur un point : les mesures isol\u00e9es, sans accompagnement structurel, ont rarement des effets durables. Une approche globale, associant urbanisme, transition \u00e9nerg\u00e9tique et sensibilisation citoyenne, semble la seule voie r\u00e9ellement efficace pour r\u00e9duire durablement ce fl\u00e9au silencieux.\",\n          questions: [\n            { q: \"Combien de d\u00e9c\u00e8s pr\u00e9matur\u00e9s sont attribu\u00e9s chaque ann\u00e9e \u00e0 la pollution de l'air en Europe ?\", options: [\"Plus de 100 000\", \"Plus de 300 000\", \"Plus d'un million\"], correct: 1 },\n            { q: \"Quelles villes ont enregistr\u00e9 des baisses significatives de pollution ?\", options: [\"Madrid et Milan\", \"Paris et Berlin\", \"Londres et Rome\"], correct: 0 },\n            { q: \"Pourquoi certaines villes d'Europe centrale peinent-elles \u00e0 r\u00e9duire la pollution ?\", options: [\"Manque de voitures \u00e9lectriques\", \"D\u00e9pendance au chauffage au bois ou au charbon\", \"Absence de zones industrielles\"], correct: 1 },\n            { q: \"Quel est, selon les experts, le facteur cl\u00e9 d'efficacit\u00e9 des mesures ?\", options: [\"Leur co\u00fbt \u00e9lev\u00e9\", \"Une approche globale et structurelle\", \"Leur application imm\u00e9diate\"], correct: 1 },\n            { q: \"Comment l'auteur qualifie-t-il la pollution de l'air \u00e0 la fin du texte ?\", options: [\"Un probl\u00e8me mineur\", \"Un fl\u00e9au silencieux\", \"Une exag\u00e9ration m\u00e9diatique\"], correct: 1 },\n          ],\n        },\n        {\n          title: \"Texte 2 \u2014 Rapport \/ document professionnel\",\n          content: \"Note interne \u2014 Direction de la strat\u00e9gie environnementale. Objet : bilan de la politique de r\u00e9duction des d\u00e9chets, exercice \u00e9coul\u00e9. La pr\u00e9sente note dresse un \u00e9tat des lieux des actions men\u00e9es au cours de l'ann\u00e9e concernant la r\u00e9duction des d\u00e9chets au sein de nos sites de production. Plusieurs mesures ont \u00e9t\u00e9 mises en \u0153uvre, parmi lesquelles la suppression progressive des emballages plastiques \u00e0 usage unique dans nos cantines d'entreprise, remplac\u00e9s par des contenants r\u00e9utilisables. Cette initiative a permis une r\u00e9duction de dix-huit pour cent du volume de d\u00e9chets non recyclables produits sur l'ensemble de nos sites. Par ailleurs, un partenariat a \u00e9t\u00e9 nou\u00e9 avec une association locale de r\u00e9cup\u00e9ration alimentaire, permettant de revaloriser les surplus invendus de nos caf\u00e9t\u00e9rias plut\u00f4t que de les jeter. Toutefois, certains freins persistent. La sensibilisation du personnel reste in\u00e9gale selon les sites, et le co\u00fbt initial de certains \u00e9quipements r\u00e9utilisables a constitu\u00e9 un frein pour les sites les plus petits. La direction recommande donc, pour l'exercice \u00e0 venir, de renforcer les actions de formation aupr\u00e8s des \u00e9quipes et d'envisager une mutualisation des achats d'\u00e9quipements afin d'en r\u00e9duire le co\u00fbt pour l'ensemble du groupe.\",\n          questions: [\n            { q: \"Quelle r\u00e9duction de d\u00e9chets non recyclables a \u00e9t\u00e9 obtenue ?\", options: [\"8%\", \"18%\", \"28%\"], correct: 1 },\n            { q: \"Quel type de partenariat a \u00e9t\u00e9 nou\u00e9 ?\", options: [\"Avec une entreprise de recyclage\", \"Avec une association de r\u00e9cup\u00e9ration alimentaire\", \"Avec une universit\u00e9\"], correct: 1 },\n            { q: \"Quel frein est mentionn\u00e9 concernant le personnel ?\", options: [\"Refus total de coop\u00e9rer\", \"Sensibilisation in\u00e9gale selon les sites\", \"Manque de personnel\"], correct: 1 },\n            { q: \"Quelle recommandation est faite pour l'ann\u00e9e \u00e0 venir ?\", options: [\"Arr\u00eater les initiatives en cours\", \"Renforcer la formation et mutualiser les achats\", \"Externaliser la gestion des d\u00e9chets\"], correct: 1 },\n            { q: \"Quel type de document est-ce ?\", options: [\"Un article de blog\", \"Une note interne d'entreprise\", \"Une publicit\u00e9\"], correct: 1 },\n          ],\n        },\n      ],\n    },\n    grammar: {\n      duration: 20 * 60,\n      maxScore: 15,\n      sections: [\n        {\n          title: \"1. Subjonctif ou indicatif\",\n          items: [\n            { q: \"Il faut que tu _______ (finir) ce travail aujourd'hui.\", options: [\"finis\", \"finisses\", \"finira\"], correct: 1 },\n            { q: \"Je crois qu'il _______ (avoir) raison sur ce point.\", options: [\"ait\", \"a\", \"aura\"], correct: 1 },\n            { q: \"Bien qu'elle _______ (\u00eatre) fatigu\u00e9e, elle a termin\u00e9 son rapport.\", options: [\"est\", \"soit\", \"sera\"], correct: 1 },\n            { q: \"Il est certain que les prix _______ (augmenter) cette ann\u00e9e.\", options: [\"augmentent\", \"augmenteront\", \"aient augment\u00e9\"], correct: 1 },\n            { q: \"Nous doutons qu'il _______ (pouvoir) arriver \u00e0 temps.\", options: [\"peut\", \"puisse\", \"pourra\"], correct: 1 },\n          ],\n        },\n        {\n          title: \"2. Pronoms relatifs\",\n          items: [\n            { q: \"C'est un sujet _______ on d\u00e9bat depuis longtemps.\", options: [\"qui\", \"dont\", \"que\"], correct: 1 },\n            { q: \"La r\u00e9gion _______ je suis n\u00e9 a beaucoup chang\u00e9.\", options: [\"o\u00f9\", \"que\", \"dont\"], correct: 0 },\n            { q: \"Voici la solution _______ nous avons besoin.\", options: [\"que\", \"dont\", \"o\u00f9\"], correct: 1 },\n            { q: \"_______ m'\u00e9tonne, c'est son silence.\", options: [\"Ce qui\", \"Ce que\", \"Ce dont\"], correct: 0 },\n            { q: \"Les outils avec _______ il travaille sont obsol\u00e8tes.\", options: [\"lesquels\", \"dont\", \"que\"], correct: 0 },\n          ],\n        },\n        {\n          title: \"3. Connecteurs logiques\",\n          items: [\n            { q: \"_______ la crise, l'entreprise a maintenu ses effectifs.\", options: [\"Malgr\u00e9\", \"Bien que\", \"Parce que\"], correct: 0 },\n            { q: \"Il a accept\u00e9 l'offre _______ elle ne correspondait pas exactement \u00e0 ses attentes.\", options: [\"car\", \"bien qu'\", \"donc\"], correct: 1 },\n            { q: \"Nous partirons t\u00f4t _______ \u00e9viter les embouteillages.\", options: [\"afin d'\", \"afin que\", \"parce qu'\"], correct: 0 },\n            { q: \"_______ il neige, la route sera ferm\u00e9e.\", options: [\"Si\", \"Au cas o\u00f9\", \"Pourvu que\"], correct: 1 },\n            { q: \"Le projet a \u00e9t\u00e9 report\u00e9, _______ le budget n'\u00e9tait pas valid\u00e9.\", options: [\"car\", \"donc\", \"or\"], correct: 0 },\n          ],\n        },\n        {\n          title: \"4. Voix passive et discours indirect\",\n          items: [\n            { q: \"\u00ab La d\u00e9cision a \u00e9t\u00e9 prise. \u00bb Forme active \u00e9quivalente :\", options: [\"On a pris la d\u00e9cision.\", \"La d\u00e9cision prenait.\", \"On prendra la d\u00e9cision.\"], correct: 0 },\n            { q: \"Il m'a dit : \u00ab Je serai en retard. \u00bb \u2192 Il m'a dit qu'_______\", options: [\"il sera en retard.\", \"il serait en retard.\", \"il est en retard.\"], correct: 1 },\n            { q: \"Elle a demand\u00e9 : \u00ab Avez-vous fini ? \u00bb \u2192 Elle a demand\u00e9 _______\", options: [\"si nous avions fini.\", \"que nous ayons fini.\", \"si nous finirons.\"], correct: 0 },\n            { q: \"\u00ab Ne partez pas ! \u00bb a-t-il dit. \u2192 Il a dit _______\", options: [\"de ne pas partir.\", \"qu'il ne parte pas.\", \"de ne partir pas.\"], correct: 0 },\n            { q: \"Le rapport _______ par le comit\u00e9 la semaine prochaine. (examiner, passif)\", options: [\"sera examin\u00e9\", \"examinera\", \"aura examin\u00e9\"], correct: 0 },\n          ],\n        },\n        {\n          title: \"5. Pr\u00e9positions et verbes\",\n          items: [\n            { q: \"Cette situation contribue _______ aggraver les tensions.\", options: [\"\u00e0\", \"de\", \"pour\"], correct: 0 },\n            { q: \"Il s'agit _______ trouver un accord rapidement.\", options: [\"\u00e0\", \"de\", \"sur\"], correct: 1 },\n            { q: \"Les autorit\u00e9s insistent _______ la n\u00e9cessit\u00e9 de r\u00e9agir.\", options: [\"sur\", \"de\", \"\u00e0\"], correct: 0 },\n            { q: \"Tout d\u00e9pend _______ la d\u00e9cision du conseil.\", options: [\"\u00e0\", \"de\", \"sur\"], correct: 1 },\n            { q: \"Le pays s'engage _______ r\u00e9duire ses \u00e9missions.\", options: [\"\u00e0\", \"de\", \"pour\"], correct: 0 },\n          ],\n        },\n        {\n          title: \"6. Articles et accords\",\n          items: [\n            { q: \"_______ majorit\u00e9 des employ\u00e9s soutient ce changement.\", options: [\"La\", \"Une\", \"Des\"], correct: 0 },\n            { q: \"Il a montr\u00e9 _______ courage exceptionnel.\", options: [\"le\", \"un\", \"du\"], correct: 1 },\n            { q: \"Ce sont _______ d\u00e9cisions importantes pour l'avenir.\", options: [\"les\", \"des\", \"de\"], correct: 1 },\n            { q: \"Elle s'int\u00e9resse _______ questions sociales.\", options: [\"les\", \"aux\", \"des\"], correct: 1 },\n            { q: \"_______ tels \u00e9v\u00e9nements sont rares.\", options: [\"Les\", \"De tels\", \"Des\"], correct: 1 },\n          ],\n        },\n      ],\n    },\n    written: {\n      duration: 40 * 60,\n      maxScore: 30,\n      prompts: [\n        { type: \"Sujet argumentatif\", text: \"Les villes devraient-elles interdire totalement les voitures individuelles dans leurs centres-villes ? Donnez votre opinion en l'illustrant d'arguments. (200 mots maximum)\" },\n        { type: \"Sujet cr\u00e9atif\", text: \"Racontez une exp\u00e9rience, r\u00e9elle ou imaginaire, qui a chang\u00e9 votre fa\u00e7on de voir l'environnement ou la consommation. (200 mots maximum)\" },\n      ],\n    },\n    oral: {\n      duration: 10 * 60,\n      maxScore: 30,\n      topics: [\n        \"Faut-il limiter l'usage de la voiture individuelle en ville ?\",\n        \"Les consommateurs sont-ils suffisamment prot\u00e9g\u00e9s face aux pratiques commerciales agressives ?\",\n        \"L'agriculture biologique peut-elle nourrir durablement la population europ\u00e9enne ?\",\n      ],\n    },\n  },\n\n  \/\/ ============================================================\n  \/\/ SIMULATION 2\n  \/\/ ============================================================\n  {\n    id: 2,\n    title: \"Simulation 2\",\n    listening: {\n      duration: 25 * 60,\n      maxScore: 15,\n      passages: [\n        {\n          title: \"Document 1 \u2014 Bulletin d'actualit\u00e9 : \u00e9nergie verte\",\n          script: \"Bonjour et bienvenue dans votre journal. Premier sujet aujourd'hui : le gouvernement a annonc\u00e9 hier un nouveau plan d'investissement dans les \u00e9nergies renouvelables, dot\u00e9 d'une enveloppe de deux milliards d'euros sur cinq ans. Ce plan vise principalement le d\u00e9veloppement de l'\u00e9olien offshore le long des c\u00f4tes atlantiques, ainsi que l'extension de plusieurs parcs solaires dans le sud du pays. Selon le minist\u00e8re de la transition \u00e9nerg\u00e9tique, cet investissement devrait permettre de couvrir, \u00e0 terme, pr\u00e8s de vingt pour cent des besoins \u00e9lectriques nationaux gr\u00e2ce aux \u00e9nergies renouvelables, contre douze pour cent actuellement. Les associations environnementales ont globalement salu\u00e9 cette annonce, tout en regrettant l'absence de mesures concr\u00e8tes concernant le stockage de l'\u00e9nergie, un point qu'elles jugent pourtant essentiel pour garantir la stabilit\u00e9 du r\u00e9seau \u00e9lectrique. De leur c\u00f4t\u00e9, certains repr\u00e9sentants du secteur industriel s'inqui\u00e8tent du co\u00fbt de la transition pour les entreprises les plus consommatrices d'\u00e9nergie, et demandent des m\u00e9canismes d'accompagnement sp\u00e9cifiques. Le d\u00e9bat parlementaire sur ce plan devrait d\u00e9buter d\u00e8s le mois prochain.\",\n          questions: [\n            { q: \"Quel est le montant de l'enveloppe annonc\u00e9e ?\", options: [\"Un milliard d'euros\", \"Deux milliards d'euros\", \"Cinq milliards d'euros\"], correct: 1 },\n            { q: \"Quel type d'\u00e9nergie est principalement vis\u00e9 sur les c\u00f4tes atlantiques ?\", options: [\"Le solaire\", \"L'\u00e9olien offshore\", \"L'hydraulique\"], correct: 1 },\n            { q: \"Quel pourcentage des besoins \u00e9lectriques le plan vise-t-il \u00e0 terme ?\", options: [\"12%\", \"20%\", \"35%\"], correct: 1 },\n            { q: \"Que regrettent les associations environnementales ?\", options: [\"Le montant trop \u00e9lev\u00e9\", \"L'absence de mesures sur le stockage de l'\u00e9nergie\", \"Le manque de transparence\"], correct: 1 },\n            { q: \"Que demandent les repr\u00e9sentants du secteur industriel ?\", options: [\"L'arr\u00eat du plan\", \"Des m\u00e9canismes d'accompagnement sp\u00e9cifiques\", \"Une baisse des imp\u00f4ts g\u00e9n\u00e9raux\"], correct: 1 },\n          ],\n        },\n        {\n          title: \"Document 2 \u2014 Interview : consommation durable\",\n          script: \"Aujourd'hui, nous recevons une chercheuse en sociologie qui \u00e9tudie les comportements de consommation en Europe. Bonjour, merci d'\u00eatre ici. Bonjour, c'est un plaisir. Vos travaux r\u00e9cents portent sur l'\u00e9volution des habitudes d'achat. Qu'observez-vous ? On observe une tendance assez nette, en particulier chez les jeunes g\u00e9n\u00e9rations, vers une consommation plus r\u00e9fl\u00e9chie : achats de seconde main, r\u00e9paration plut\u00f4t que remplacement, attention port\u00e9e \u00e0 la provenance des produits. Mais attention, ce changement reste encore minoritaire et tr\u00e8s in\u00e9gal selon les cat\u00e9gories sociales. Pourquoi cette in\u00e9galit\u00e9 ? Principalement pour des raisons \u00e9conomiques. Les produits durables ou issus du commerce \u00e9quitable restent souvent plus chers, ce qui limite l'acc\u00e8s \u00e0 ce type de consommation pour les foyers aux revenus modestes. Il y a donc un vrai paradoxe : ce sont parfois les m\u00e9nages les plus en difficult\u00e9 qui, malgr\u00e9 eux, consomment de mani\u00e8re la moins durable, simplement parce que les alternatives responsables ne sont pas financi\u00e8rement accessibles. Que faudrait-il, selon vous, pour changer cela ? Il faudrait sans doute des politiques publiques qui rendent les produits durables plus abordables, plut\u00f4t que de compter uniquement sur la bonne volont\u00e9 individuelle des consommateurs.\",\n          questions: [\n            { q: \"Quelle est la profession de l'invit\u00e9e ?\", options: [\"\u00c9conomiste\", \"Chercheuse en sociologie\", \"Journaliste\"], correct: 1 },\n            { q: \"Chez quelle population la tendance \u00e0 consommer de fa\u00e7on r\u00e9fl\u00e9chie est-elle la plus nette ?\", options: [\"Les jeunes g\u00e9n\u00e9rations\", \"Les retrait\u00e9s\", \"Les cadres uniquement\"], correct: 0 },\n            { q: \"Pourquoi existe-t-il une in\u00e9galit\u00e9 dans l'acc\u00e8s \u00e0 la consommation durable ?\", options: [\"Manque d'information\", \"Raisons \u00e9conomiques, produits durables plus chers\", \"Manque d'int\u00e9r\u00eat des gens\"], correct: 1 },\n            { q: \"Quel paradoxe est mentionn\u00e9 ?\", options: [\"Les plus riches consomment le moins durable\", \"Les m\u00e9nages modestes consomment parfois le moins durable malgr\u00e9 eux\", \"Il n'y a aucun paradoxe\"], correct: 1 },\n            { q: \"Que recommande la chercheuse pour changer la situation ?\", options: [\"Plus de publicit\u00e9 pour le bio\", \"Des politiques publiques rendant les produits durables plus abordables\", \"Rien, la situation va s'am\u00e9liorer seule\"], correct: 1 },\n          ],\n        },\n        {\n          title: \"Document 3 \u2014 Reportage : r\u00e9duction des d\u00e9chets\",\n          script: \"Nous sommes aujourd'hui dans une petite commune du sud de la France, devenue un exemple en mati\u00e8re de r\u00e9duction des d\u00e9chets. Depuis cinq ans, la municipalit\u00e9 a mis en place une politique dite de z\u00e9ro d\u00e9chet, avec des r\u00e9sultats impressionnants : une baisse de quarante pour cent du volume d'ordures m\u00e9nag\u00e8res envoy\u00e9es en enfouissement. Comment y sont-ils arriv\u00e9s ? D'abord, par la g\u00e9n\u00e9ralisation du compostage individuel et collectif, avec des composteurs install\u00e9s dans chaque quartier. Ensuite, par une tarification incitative : plus les habitants produisent de d\u00e9chets, plus ils paient cher, ce qui a fortement encourag\u00e9 le tri et la r\u00e9duction \u00e0 la source. La commune a \u00e9galement ouvert une recyclerie, o\u00f9 les objets encore utilisables sont r\u00e9par\u00e9s et revendus \u00e0 petit prix, plut\u00f4t que jet\u00e9s. Le maire reconna\u00eet toutefois que ce mod\u00e8le a n\u00e9cessit\u00e9 un investissement initial important et une longue phase de sensibilisation aupr\u00e8s des habitants, certains s'\u00e9tant montr\u00e9s r\u00e9ticents au d\u00e9but face \u00e0 ce qu'ils percevaient comme une contrainte suppl\u00e9mentaire. Aujourd'hui, la commune affirme recevoir r\u00e9guli\u00e8rement des d\u00e9l\u00e9gations d'autres municipalit\u00e9s venues s'inspirer de son exp\u00e9rience.\",\n          questions: [\n            { q: \"Quelle baisse du volume de d\u00e9chets a \u00e9t\u00e9 obtenue ?\", options: [\"20%\", \"40%\", \"60%\"], correct: 1 },\n            { q: \"Qu'est-ce qui a \u00e9t\u00e9 g\u00e9n\u00e9ralis\u00e9 pour r\u00e9duire les d\u00e9chets ?\", options: [\"L'incin\u00e9ration\", \"Le compostage individuel et collectif\", \"L'exportation des d\u00e9chets\"], correct: 1 },\n            { q: \"Comment fonctionne la tarification incitative ?\", options: [\"Tout le monde paie le m\u00eame prix\", \"Plus on produit de d\u00e9chets, plus on paie\", \"Les d\u00e9chets sont gratuits\"], correct: 1 },\n            { q: \"Qu'est-ce qu'une recyclerie, selon le reportage ?\", options: [\"Un centre de tri automatis\u00e9\", \"Un lieu o\u00f9 les objets sont r\u00e9par\u00e9s et revendus\", \"Une usine d'incin\u00e9ration\"], correct: 1 },\n            { q: \"Comment certains habitants ont-ils r\u00e9agi au d\u00e9but ?\", options: [\"Avec un grand enthousiasme imm\u00e9diat\", \"Avec de la r\u00e9ticence, per\u00e7u comme une contrainte\", \"Ils n'ont pas r\u00e9agi du tout\"], correct: 1 },\n          ],\n        },\n      ],\n    },\n    reading: {\n      duration: 25 * 60,\n      maxScore: 10,\n      texts: [\n        {\n          title: \"Texte 1 \u2014 Article de presse\",\n          content: \"Le t\u00e9l\u00e9travail, longtemps marginal, s'est durablement install\u00e9 dans le paysage professionnel europ\u00e9en depuis la pand\u00e9mie. Selon une \u00e9tude r\u00e9cente men\u00e9e aupr\u00e8s de grandes entreprises, pr\u00e8s de quarante pour cent des salari\u00e9s du secteur des services travaillent d\u00e9sormais \u00e0 distance au moins deux jours par semaine. Cette transformation, salu\u00e9e par de nombreux employ\u00e9s pour la flexibilit\u00e9 qu'elle offre, n'est cependant pas sans poser de nouvelles questions. Les managers rapportent des difficult\u00e9s croissantes \u00e0 maintenir la coh\u00e9sion des \u00e9quipes et \u00e0 d\u00e9tecter les signes d'\u00e9puisement professionnel chez des collaborateurs qu'ils voient moins r\u00e9guli\u00e8rement. Par ailleurs, certains chercheurs en psychologie du travail alertent sur un risque d'isolement social, en particulier chez les jeunes employ\u00e9s r\u00e9cemment recrut\u00e9s, pour qui les interactions informelles au bureau jouaient un r\u00f4le important dans leur int\u00e9gration professionnle. Face \u00e0 ces constats, de nombreuses entreprises optent d\u00e9sormais pour des mod\u00e8les hybrides, imposant un nombre minimal de jours de pr\u00e9sence au bureau, tout en conservant une certaine flexibilit\u00e9. Cette approche m\u00e9diane semble, pour l'instant, recueillir l'adh\u00e9sion d'une majorit\u00e9 de salari\u00e9s, qui y voient un compromis acceptable entre autonomie et vie collective.\",\n          questions: [\n            { q: \"Quel pourcentage de salari\u00e9s du secteur des services t\u00e9l\u00e9travaille au moins deux jours par semaine ?\", options: [\"20%\", \"40%\", \"60%\"], correct: 1 },\n            { q: \"Quelle difficult\u00e9 les managers rapportent-ils ?\", options: [\"Baisse de productivit\u00e9 uniquement\", \"Difficult\u00e9 \u00e0 maintenir la coh\u00e9sion d'\u00e9quipe\", \"Augmentation des salaires\"], correct: 1 },\n            { q: \"Qui est particuli\u00e8rement \u00e0 risque d'isolement social selon les chercheurs ?\", options: [\"Les cadres exp\u00e9riment\u00e9s\", \"Les jeunes employ\u00e9s r\u00e9cemment recrut\u00e9s\", \"Les retrait\u00e9s\"], correct: 1 },\n            { q: \"Quel mod\u00e8le de nombreuses entreprises adoptent-elles d\u00e9sormais ?\", options: [\"Le t\u00e9l\u00e9travail \u00e0 100%\", \"Un mod\u00e8le hybride\", \"Le retour total au bureau\"], correct: 1 },\n            { q: \"Comment les salari\u00e9s per\u00e7oivent-ils globalement ce mod\u00e8le hybride ?\", options: [\"Comme une contrainte inacceptable\", \"Comme un compromis acceptable\", \"Ils sont indiff\u00e9rents\"], correct: 1 },\n          ],\n        },\n        {\n          title: \"Texte 2 \u2014 Rapport \/ document professionnel\",\n          content: \"Communiqu\u00e9 \u2014 Service des relations presse. Objet : lancement d'une nouvelle politique de mobilit\u00e9 durable pour les employ\u00e9s. Notre entreprise annonce aujourd'hui la mise en place d'un plan de mobilit\u00e9 destin\u00e9 \u00e0 encourager des d\u00e9placements plus respectueux de l'environnement parmi ses huit mille collaborateurs r\u00e9partis sur le territoire national. Ce plan comprend plusieurs volets. D'une part, une prime au covoiturage sera instaur\u00e9e d\u00e8s le mois prochain pour les salari\u00e9s partageant leur trajet domicile-travail. D'autre part, un forfait mobilit\u00e9s durables sera propos\u00e9 \u00e0 hauteur de quatre cents euros par an pour les employ\u00e9s se d\u00e9pla\u00e7ant \u00e0 v\u00e9lo ou utilisant les transports en commun. Enfin, des bornes de recharge pour v\u00e9hicules \u00e9lectriques seront install\u00e9es sur l'ensemble des parkings de l'entreprise d'ici la fin de l'ann\u00e9e. Cette initiative s'inscrit dans la strat\u00e9gie de responsabilit\u00e9 soci\u00e9tale du groupe, qui s'est engag\u00e9 \u00e0 r\u00e9duire son empreinte carbone de trente pour cent d'ici cinq ans. La direction esp\u00e8re que ce plan incitera une part significative des collaborateurs \u00e0 reconsid\u00e9rer leurs habitudes de d\u00e9placement, tout en am\u00e9liorant leur qualit\u00e9 de vie au travail.\",\n          questions: [\n            { q: \"Combien de collaborateurs l'entreprise compte-t-elle ?\", options: [\"Huit cents\", \"Huit mille\", \"Quatre-vingt mille\"], correct: 1 },\n            { q: \"Quel montant est pr\u00e9vu pour le forfait mobilit\u00e9s durables ?\", options: [\"200 euros par an\", \"400 euros par an\", \"1000 euros par an\"], correct: 1 },\n            { q: \"Que sera install\u00e9 sur les parkings d'ici la fin de l'ann\u00e9e ?\", options: [\"Des places r\u00e9serv\u00e9es au covoiturage\", \"Des bornes de recharge pour v\u00e9hicules \u00e9lectriques\", \"Des abris \u00e0 v\u00e9lo uniquement\"], correct: 1 },\n            { q: \"Quel objectif de r\u00e9duction d'empreinte carbone le groupe s'est-il fix\u00e9 ?\", options: [\"10% en 2 ans\", \"30% en 5 ans\", \"50% en 10 ans\"], correct: 1 },\n            { q: \"Quel type de document est-ce ?\", options: [\"Un communiqu\u00e9 de presse d'entreprise\", \"Un article scientifique\", \"Une lettre personnelle\"], correct: 0 },\n          ],\n        },\n      ],\n    },\n    grammar: {\n      duration: 20 * 60,\n      maxScore: 15,\n      sections: [\n        {\n          title: \"1. Subjonctif ou indicatif\",\n          items: [\n            { q: \"Il semble que la situation _______ (s'am\u00e9liorer) progressivement.\", options: [\"s'am\u00e9liore\", \"s'am\u00e9liora\", \"am\u00e9liorera\"], correct: 0 },\n            { q: \"Je suis s\u00fbr qu'elle _______ (r\u00e9ussir) son examen.\", options: [\"r\u00e9ussisse\", \"r\u00e9ussira\", \"ait r\u00e9ussi\"], correct: 1 },\n            { q: \"Quoiqu'il _______ (\u00eatre) tard, ils ont continu\u00e9 \u00e0 travailler.\", options: [\"est\", \"soit\", \"sera\"], correct: 1 },\n            { q: \"Il est \u00e9vident que ce projet _______ (n\u00e9cessiter) plus de moyens.\", options: [\"n\u00e9cessite\", \"n\u00e9cessitera\", \"ait n\u00e9cessit\u00e9\"], correct: 0 },\n            { q: \"Nous souhaitons qu'elle _______ (pouvoir) nous rejoindre bient\u00f4t.\", options: [\"peut\", \"puisse\", \"pourra\"], correct: 1 },\n          ],\n        },\n        {\n          title: \"2. Pronoms relatifs\",\n          items: [\n            { q: \"C'est une question _______ m\u00e9rite r\u00e9flexion.\", options: [\"qui\", \"que\", \"dont\"], correct: 0 },\n            { q: \"Le village _______ elle a grandi a beaucoup chang\u00e9.\", options: [\"dont\", \"o\u00f9\", \"que\"], correct: 1 },\n            { q: \"Voici les \u00e9l\u00e9ments _______ nous manquons.\", options: [\"que\", \"dont\", \"o\u00f9\"], correct: 1 },\n            { q: \"_______ je retiens surtout, c'est sa d\u00e9termination.\", options: [\"Ce que\", \"Ce qui\", \"Ce dont\"], correct: 0 },\n            { q: \"Le dossier sur _______ nous travaillons est complexe.\", options: [\"lequel\", \"dont\", \"que\"], correct: 0 },\n          ],\n        },\n        {\n          title: \"3. Connecteurs logiques\",\n          items: [\n            { q: \"_______ ses efforts, il n'a pas obtenu le poste.\", options: [\"Malgr\u00e9\", \"Bien que\", \"Car\"], correct: 0 },\n            { q: \"Elle a accept\u00e9 _______ les conditions \u00e9taient difficiles.\", options: [\"bien qu'\", \"car\", \"donc\"], correct: 0 },\n            { q: \"Il \u00e9conomise _______ acheter une maison.\", options: [\"afin d'\", \"afin qu'\", \"parce qu'\"], correct: 0 },\n            { q: \"_______ il fasse beau, nous sortirons.\", options: [\"Si\", \"Pourvu qu'\", \"Au cas o\u00f9\"], correct: 1 },\n            { q: \"La r\u00e9union a \u00e9t\u00e9 annul\u00e9e, _______ le directeur \u00e9tait absent.\", options: [\"car\", \"donc\", \"or\"], correct: 0 },\n          ],\n        },\n        {\n          title: \"4. Voix passive et discours indirect\",\n          items: [\n            { q: \"\u00ab On a valid\u00e9 le projet. \u00bb Forme passive :\", options: [\"Le projet a \u00e9t\u00e9 valid\u00e9.\", \"Le projet validait.\", \"Le projet sera valid\u00e9.\"], correct: 0 },\n            { q: \"Elle a dit : \u00ab Je pars demain. \u00bb \u2192 Elle a dit qu'_______\", options: [\"elle part demain.\", \"elle partirait le lendemain.\", \"elle partira demain.\"], correct: 1 },\n            { q: \"Il a demand\u00e9 : \u00ab O\u00f9 allez-vous ? \u00bb \u2192 Il a demand\u00e9 _______\", options: [\"o\u00f9 nous allions.\", \"o\u00f9 nous allons.\", \"o\u00f9 nous irons.\"], correct: 0 },\n            { q: \"\u00ab Restez calmes ! \u00bb a-t-elle dit. \u2192 Elle a dit _______\", options: [\"de rester calmes.\", \"qu'ils restent calmes.\", \"de restant calmes.\"], correct: 0 },\n            { q: \"Les r\u00e9sultats _______ publi\u00e9s la semaine prochaine. (passif)\", options: [\"seront\", \"auront \u00e9t\u00e9\", \"seraient\"], correct: 0 },\n          ],\n        },\n        {\n          title: \"5. Pr\u00e9positions et verbes\",\n          items: [\n            { q: \"Ce facteur contribue _______ ralentir la croissance.\", options: [\"\u00e0\", \"de\", \"pour\"], correct: 0 },\n            { q: \"Il s'agit _______ revoir enti\u00e8rement la strat\u00e9gie.\", options: [\"\u00e0\", \"de\", \"sur\"], correct: 1 },\n            { q: \"Les chercheurs insistent _______ l'importance de la pr\u00e9vention.\", options: [\"sur\", \"de\", \"\u00e0\"], correct: 0 },\n            { q: \"Sa r\u00e9ussite d\u00e9pend _______ son investissement personnel.\", options: [\"\u00e0\", \"de\", \"sur\"], correct: 1 },\n            { q: \"L'entreprise s'engage _______ former ses employ\u00e9s.\", options: [\"\u00e0\", \"de\", \"pour\"], correct: 0 },\n          ],\n        },\n        {\n          title: \"6. Articles et accords\",\n          items: [\n            { q: \"_______ plupart des experts s'accordent sur ce point.\", options: [\"La\", \"Une\", \"Des\"], correct: 0 },\n            { q: \"Il a fait preuve _______ patience remarquable.\", options: [\"la\", \"une\", \"de la\"], correct: 1 },\n            { q: \"Ce sont _______ initiatives prometteuses.\", options: [\"les\", \"des\", \"de\"], correct: 1 },\n            { q: \"Elle est attentive _______ d\u00e9tails techniques.\", options: [\"les\", \"aux\", \"des\"], correct: 1 },\n            { q: \"_______ mesures n'avaient jamais \u00e9t\u00e9 prises auparavant.\", options: [\"De telles\", \"Les\", \"Des\"], correct: 0 },\n          ],\n        },\n      ],\n    },\n    written: {\n      duration: 40 * 60,\n      maxScore: 30,\n      prompts: [\n        { type: \"Sujet argumentatif\", text: \"Le t\u00e9l\u00e9travail g\u00e9n\u00e9ralis\u00e9 est-il, selon vous, b\u00e9n\u00e9fique pour l'\u00e9quilibre entre vie professionnelle et vie priv\u00e9e ? (200 mots maximum)\" },\n        { type: \"Sujet cr\u00e9atif\", text: \"D\u00e9crivez une journ\u00e9e de votre vie dans dix ans, dans un monde o\u00f9 la transition \u00e9nerg\u00e9tique aurait pleinement r\u00e9ussi. (200 mots maximum)\" },\n      ],\n    },\n    oral: {\n      duration: 10 * 60,\n      maxScore: 30,\n      topics: [\n        \"La transition vers les \u00e9nergies renouvelables est-elle r\u00e9ellement viable \u00e0 court terme ?\",\n        \"Les citoyens europ\u00e9ens sont-ils pr\u00eats \u00e0 changer durablement leurs habitudes de consommation ?\",\n        \"Quelles mesures vous semblent les plus efficaces pour r\u00e9duire les d\u00e9chets \u00e0 l'\u00e9chelle d'une ville ?\",\n      ],\n    },\n  },\n\n  \/\/ ============================================================\n  \/\/ SIMULATION 3\n  \/\/ ============================================================\n  {\n    id: 3,\n    title: \"Simulation 3\",\n    listening: {\n      duration: 25 * 60,\n      maxScore: 15,\n      passages: [\n        {\n          title: \"Document 1 \u2014 Bulletin d'actualit\u00e9 : changement climatique\",\n          script: \"Bonjour \u00e0 tous, voici les titres de cette \u00e9dition. Un nouveau rapport du groupe d'experts intergouvernemental sur l'\u00e9volution du climat vient d'\u00eatre publi\u00e9, et ses conclusions sont sans appel : les engagements actuels des \u00c9tats ne suffisent pas pour limiter le r\u00e9chauffement climatique \u00e0 un niveau jug\u00e9 s\u00fbr. Selon les scientifiques, m\u00eame si tous les pays respectaient leurs engagements actuels, la temp\u00e9rature moyenne mondiale d\u00e9passerait largement les seuils fix\u00e9s par les accords internationaux. Face \u00e0 ce constat, plusieurs ministres de l'environnement europ\u00e9ens ont annonc\u00e9 vouloir pr\u00e9senter, lors du prochain sommet, des objectifs r\u00e9vis\u00e9s \u00e0 la hausse. Toutefois, des voix critiques s'\u00e9l\u00e8vent, notamment parmi certaines organisations non gouvernementales, qui d\u00e9noncent un manque de coh\u00e9rence entre les discours politiques et les d\u00e9cisions concr\u00e8tes, citant par exemple la poursuite de subventions aux \u00e9nergies fossiles dans plusieurs pays membres. De son c\u00f4t\u00e9, le secteur industriel demande des aides suppl\u00e9mentaires pour accompagner la transition, estimant que les d\u00e9lais impos\u00e9s sont trop courts pour adapter les cha\u00eenes de production sans mettre en p\u00e9ril l'emploi.\",\n          questions: [\n            { q: \"Que conclut le nouveau rapport scientifique ?\", options: [\"Les engagements actuels sont suffisants\", \"Les engagements actuels ne suffisent pas\", \"Le r\u00e9chauffement climatique est termin\u00e9\"], correct: 1 },\n            { q: \"Qu'ont annonc\u00e9 plusieurs ministres europ\u00e9ens ?\", options: [\"L'abandon des accords climatiques\", \"Des objectifs r\u00e9vis\u00e9s \u00e0 la hausse\", \"Une pause dans les n\u00e9gociations\"], correct: 1 },\n            { q: \"Que d\u00e9noncent certaines ONG ?\", options: [\"Le manque de rapports scientifiques\", \"Le manque de coh\u00e9rence entre discours et d\u00e9cisions\", \"L'absence de sommets internationaux\"], correct: 1 },\n            { q: \"Quel exemple de contradiction est cit\u00e9 ?\", options: [\"La construction de nouvelles centrales solaires\", \"La poursuite de subventions aux \u00e9nergies fossiles\", \"L'augmentation des taxes carbone\"], correct: 1 },\n            { q: \"Que demande le secteur industriel ?\", options: [\"Des aides suppl\u00e9mentaires pour la transition\", \"L'arr\u00eat imm\u00e9diat de toute production\", \"Moins de r\u00e9glementation environnementale\"], correct: 0 },\n          ],\n        },\n        {\n          title: \"Document 2 \u2014 Interview : pollution de l'air\",\n          script: \"Notre invit\u00e9 du jour est m\u00e9decin pneumologue, sp\u00e9cialiste des effets de la pollution sur la sant\u00e9 respiratoire. Bonjour docteur. Bonjour, merci de m'avoir invit\u00e9. Concr\u00e8tement, quels sont les effets de la pollution de l'air sur notre sant\u00e9 ? L'exposition prolong\u00e9e aux particules fines augmente significativement les risques de maladies respiratoires chroniques, mais aussi cardiovasculaires. On observe \u00e9galement des effets sur le d\u00e9veloppement pulmonaire des enfants, particuli\u00e8rement vuln\u00e9rables. Est-ce que certaines populations sont plus expos\u00e9es que d'autres ? Oui, absolument. Les personnes vivant pr\u00e8s des grands axes routiers, les enfants, les personnes \u00e2g\u00e9es et celles souffrant d\u00e9j\u00e0 de pathologies respiratoires sont les plus \u00e0 risque. On constate aussi des in\u00e9galit\u00e9s sociales : les quartiers les plus pollu\u00e9s sont souvent ceux o\u00f9 vivent les populations les plus modestes. Quelles recommandations donneriez-vous aux pouvoirs publics ? Il faudrait avant tout r\u00e9duire le trafic automobile pr\u00e8s des \u00e9coles et des h\u00f4pitaux, et am\u00e9liorer l'information du public lors des pics de pollution, car beaucoup de gens ignorent encore les gestes simples qui permettent de limiter leur exposition.\",\n          questions: [\n            { q: \"Quelle est la sp\u00e9cialit\u00e9 du m\u00e9decin invit\u00e9 ?\", options: [\"Cardiologie\", \"Pneumologie\", \"Dermatologie\"], correct: 1 },\n            { q: \"Quels effets la pollution a-t-elle sur les enfants ?\", options: [\"Aucun effet particulier\", \"Effets sur le d\u00e9veloppement pulmonaire\", \"Effets uniquement sur la vue\"], correct: 1 },\n            { q: \"Quelle in\u00e9galit\u00e9 sociale est mentionn\u00e9e ?\", options: [\"Les riches sont plus expos\u00e9s\", \"Les quartiers les plus pollu\u00e9s sont souvent les plus modestes\", \"Il n'y a aucune in\u00e9galit\u00e9\"], correct: 1 },\n            { q: \"Quelle recommandation est faite concernant le trafic ?\", options: [\"L'augmenter pr\u00e8s des \u00e9coles\", \"Le r\u00e9duire pr\u00e8s des \u00e9coles et h\u00f4pitaux\", \"Le supprimer totalement partout\"], correct: 1 },\n            { q: \"Que regrette le m\u00e9decin concernant l'information du public ?\", options: [\"Trop d'information disponible\", \"Beaucoup ignorent les gestes simples \u00e0 adopter\", \"L'information est d\u00e9j\u00e0 parfaite\"], correct: 1 },\n          ],\n        },\n        {\n          title: \"Document 3 \u2014 Reportage : mobilit\u00e9 et transports\",\n          script: \"Nous sommes aujourd'hui dans une ville moyenne du nord de la France, qui a totalement repens\u00e9 son r\u00e9seau de transports en commun ces trois derni\u00e8res ann\u00e9es. Le maire nous explique sa d\u00e9marche. Nous avons fait le choix de rendre les transports en commun gratuits pour tous les habitants, financ\u00e9s par une taxe sur les grandes surfaces commerciales de la ville. Quel a \u00e9t\u00e9 l'impact de cette mesure ? La fr\u00e9quentation des bus a augment\u00e9 de soixante pour cent en deux ans, et nous observons une baisse mesurable du trafic automobile dans le centre-ville aux heures de pointe. Certains commer\u00e7ants s'inqui\u00e9taient initialement d'une baisse de fr\u00e9quentation si l'acc\u00e8s en voiture devenait plus difficile, mais c'est l'inverse qui s'est produit, avec davantage de passage \u00e0 pied gr\u00e2ce \u00e0 la gratuit\u00e9 des transports. Cette mesure a-t-elle eu des effets inattendus ? Oui, nous avons aussi constat\u00e9 un effet social positif : les habitants des quartiers p\u00e9riph\u00e9riques, souvent plus modestes, se d\u00e9placent d\u00e9sormais beaucoup plus facilement vers le centre-ville pour le travail ou les loisirs, ce qui r\u00e9duit certaines in\u00e9galit\u00e9s d'acc\u00e8s \u00e0 la ville.\",\n          questions: [\n            { q: \"Comment la gratuit\u00e9 des transports est-elle financ\u00e9e ?\", options: [\"Par une augmentation des imp\u00f4ts locaux\", \"Par une taxe sur les grandes surfaces commerciales\", \"Par des subventions europ\u00e9ennes uniquement\"], correct: 1 },\n            { q: \"Quelle augmentation de fr\u00e9quentation des bus a \u00e9t\u00e9 observ\u00e9e ?\", options: [\"20%\", \"60%\", \"100%\"], correct: 1 },\n            { q: \"Quel effet a \u00e9t\u00e9 observ\u00e9 sur le trafic automobile ?\", options: [\"Une augmentation\", \"Une baisse mesurable\", \"Aucun changement\"], correct: 1 },\n            { q: \"Que craignaient initialement certains commer\u00e7ants ?\", options: [\"Une hausse des prix\", \"Une baisse de fr\u00e9quentation\", \"Une fermeture du centre-ville\"], correct: 1 },\n            { q: \"Quel effet social positif est mentionn\u00e9 ?\", options: [\"Plus d'in\u00e9galit\u00e9s entre quartiers\", \"Meilleur acc\u00e8s au centre-ville pour les quartiers modestes\", \"Aucun effet social particulier\"], correct: 1 },\n          ],\n        },\n      ],\n    },\n    reading: {\n      duration: 25 * 60,\n      maxScore: 10,\n      texts: [\n        {\n          title: \"Texte 1 \u2014 Article de presse\",\n          content: \"L'agriculture europ\u00e9enne traverse une p\u00e9riode de profondes mutations, tiraill\u00e9e entre les imp\u00e9ratifs de comp\u00e9titivit\u00e9 \u00e9conomique et les exigences croissantes en mati\u00e8re de durabilit\u00e9 environnementale. Si la demande des consommateurs pour des produits biologiques et locaux ne cesse de cro\u00eetre, les agriculteurs eux-m\u00eames restent confront\u00e9s \u00e0 des d\u00e9fis consid\u00e9rables. Les co\u00fbts de conversion vers des pratiques plus durables, la volatilit\u00e9 des prix agricoles, et la concurrence de produits import\u00e9s \u00e0 moindre co\u00fbt constituent autant d'obstacles \u00e0 une transition rapide. Plusieurs organisations agricoles appellent \u00e0 une r\u00e9forme de la politique agricole commune, estimant que les aides actuelles favorisent encore trop largement les grandes exploitations intensives, au d\u00e9triment des petites structures engag\u00e9es dans des d\u00e9marches plus respectueuses de l'environnement. Des voix s'\u00e9l\u00e8vent \u00e9galement pour r\u00e9clamer une meilleure protection face aux importations ne respectant pas les m\u00eames normes environnementales et sanitaires que la production europ\u00e9enne, ce qui serait, selon elles, une condition essentielle pour ne pas p\u00e9naliser injustement les agriculteurs ayant fait le choix de pratiques plus vertueuses. Le d\u00e9bat promet d'\u00eatre central lors des prochaines n\u00e9gociations europ\u00e9ennes sur l'avenir de la politique agricole.\",\n          questions: [\n            { q: \"Quelle est la tendance de la demande des consommateurs mentionn\u00e9e ?\", options: [\"Baisse de la demande en produits bio\", \"Croissance de la demande en produits bio et locaux\", \"Demande stable depuis des d\u00e9cennies\"], correct: 1 },\n            { q: \"Quel d\u00e9fi est cit\u00e9 concernant la transition durable ?\", options: [\"Manque de terres agricoles\", \"Co\u00fbts de conversion et concurrence des importations\", \"Absence de demande des consommateurs\"], correct: 1 },\n            { q: \"Que demandent plusieurs organisations agricoles ?\", options: [\"La suppression de toute aide publique\", \"Une r\u00e9forme de la politique agricole commune\", \"Une baisse des prix agricoles\"], correct: 1 },\n            { q: \"Quelle critique est faite sur les aides actuelles ?\", options: [\"Elles favorisent trop les grandes exploitations intensives\", \"Elles sont trop favorables aux petites exploitations\", \"Elles n'existent pas\"], correct: 0 },\n            { q: \"Que r\u00e9clament certaines voix concernant les importations ?\", options: [\"Une suppression totale des importations\", \"Une meilleure protection contre les importations \u00e0 normes inf\u00e9rieures\", \"Aucune r\u00e9gulation suppl\u00e9mentaire\"], correct: 1 },\n          ],\n        },\n        {\n          title: \"Texte 2 \u2014 Rapport \/ document professionnel\",\n          content: \"Bilan annuel \u2014 Programme de protection des consommateurs. Objet : synth\u00e8se des actions men\u00e9es sur l'exercice \u00e9coul\u00e9. Le pr\u00e9sent rapport dresse le bilan des activit\u00e9s de notre service de m\u00e9diation aupr\u00e8s des consommateurs pour l'ann\u00e9e \u00e9coul\u00e9e. Au total, deux mille trois cents dossiers ont \u00e9t\u00e9 trait\u00e9s, soit une augmentation de quinze pour cent par rapport \u00e0 l'exercice pr\u00e9c\u00e9dent. La majorit\u00e9 des litiges concerne des achats effectu\u00e9s en ligne, notamment des difficult\u00e9s li\u00e9es \u00e0 l'exercice du droit de r\u00e9tractation et \u00e0 des retards de livraison non justifi\u00e9s. Le service a \u00e9galement constat\u00e9 une hausse pr\u00e9occupante des plaintes relatives \u00e0 des pratiques commerciales trompeuses sur les r\u00e9seaux sociaux, en particulier concernant des publicit\u00e9s pr\u00e9sentant de fausses promotions ou des avis clients falsifi\u00e9s. Dans quatre-vingts pour cent des cas trait\u00e9s, une solution amiable a pu \u00eatre trouv\u00e9e entre le consommateur et le professionnel concern\u00e9, \u00e9vitant ainsi une proc\u00e9dure judiciaire. Le service recommande, pour l'ann\u00e9e \u00e0 venir, un renforcement de la coop\u00e9ration avec les plateformes de r\u00e9seaux sociaux afin de mieux identifier et sanctionner les pratiques commerciales frauduleuses constat\u00e9es en ligne.\",\n          questions: [\n            { q: \"Combien de dossiers ont \u00e9t\u00e9 trait\u00e9s sur l'exercice \u00e9coul\u00e9 ?\", options: [\"1300\", \"2300\", \"3300\"], correct: 1 },\n            { q: \"Quelle augmentation par rapport \u00e0 l'exercice pr\u00e9c\u00e9dent ?\", options: [\"5%\", \"15%\", \"25%\"], correct: 1 },\n            { q: \"Quel type de litige est majoritaire ?\", options: [\"Achats en magasin physique\", \"Achats effectu\u00e9s en ligne\", \"Litiges entre entreprises\"], correct: 1 },\n            { q: \"Quelle hausse pr\u00e9occupante est constat\u00e9e ?\", options: [\"Plaintes sur les r\u00e9seaux sociaux et publicit\u00e9s trompeuses\", \"Plaintes sur la qualit\u00e9 des produits alimentaires\", \"Plaintes li\u00e9es aux transports\"], correct: 0 },\n            { q: \"Dans quel pourcentage des cas une solution amiable a-t-elle \u00e9t\u00e9 trouv\u00e9e ?\", options: [\"50%\", \"80%\", \"95%\"], correct: 1 },\n          ],\n        },\n      ],\n    },\n    grammar: {\n      duration: 20 * 60,\n      maxScore: 15,\n      sections: [\n        {\n          title: \"1. Subjonctif ou indicatif\",\n          items: [\n            { q: \"Il est important que chacun _______ (prendre) ses responsabilit\u00e9s.\", options: [\"prend\", \"prenne\", \"prendra\"], correct: 1 },\n            { q: \"Je sais qu'elle _______ (avoir) d\u00e9j\u00e0 pris sa d\u00e9cision.\", options: [\"ait\", \"a\", \"aura\"], correct: 1 },\n            { q: \"Quoique le projet _______ (sembler) ambitieux, il reste r\u00e9alisable.\", options: [\"semble\", \"semblera\", \"sembl\"], correct: 0 },\n            { q: \"Il para\u00eet \u00e9vident que la situation _______ (s'aggraver).\", options: [\"s'aggrave\", \"s'aggravera\", \"se soit aggrav\u00e9e\"], correct: 1 },\n            { q: \"Nous attendons qu'il _______ (confirmer) sa venue.\", options: [\"confirme\", \"confirmera\", \"confirmait\"], correct: 0 },\n          ],\n        },\n        {\n          title: \"2. Pronoms relatifs\",\n          items: [\n            { q: \"C'est un enjeu _______ concerne tout le monde.\", options: [\"qui\", \"que\", \"dont\"], correct: 0 },\n            { q: \"Le quartier _______ ils ont d\u00e9m\u00e9nag\u00e9 est plus calme.\", options: [\"dont\", \"o\u00f9\", \"que\"], correct: 1 },\n            { q: \"Voici les documents _______ vous aurez besoin.\", options: [\"que\", \"dont\", \"o\u00f9\"], correct: 1 },\n            { q: \"_______ je pense souvent, c'est \u00e0 cette d\u00e9cision.\", options: [\"Ce que\", \"Ce \u00e0 quoi\", \"Ce dont\"], correct: 1 },\n            { q: \"Le contrat selon _______ ils travaillent expire bient\u00f4t.\", options: [\"lequel\", \"dont\", \"que\"], correct: 0 },\n          ],\n        },\n        {\n          title: \"3. Connecteurs logiques\",\n          items: [\n            { q: \"_______ la pression, elle a maintenu sa d\u00e9cision.\", options: [\"Malgr\u00e9\", \"Bien qu'\", \"Parce qu'\"], correct: 0 },\n            { q: \"Il a continu\u00e9 _______ tout le monde lui conseillait d'arr\u00eater.\", options: [\"bien que\", \"car\", \"donc\"], correct: 0 },\n            { q: \"Elle a tout pr\u00e9par\u00e9 _______ \u00e9viter les impr\u00e9vus.\", options: [\"afin d'\", \"afin qu'\", \"parce qu'\"], correct: 0 },\n            { q: \"_______ vous ayez des questions, n'h\u00e9sitez pas \u00e0 demander.\", options: [\"Si\", \"Au cas o\u00f9\", \"Pourvu que\"], correct: 1 },\n            { q: \"La s\u00e9ance a \u00e9t\u00e9 \u00e9court\u00e9e, _______ plusieurs participants devaient partir.\", options: [\"car\", \"donc\", \"or\"], correct: 0 },\n          ],\n        },\n        {\n          title: \"4. Voix passive et discours indirect\",\n          items: [\n            { q: \"\u00ab On a annul\u00e9 la r\u00e9union. \u00bb Forme passive :\", options: [\"La r\u00e9union a \u00e9t\u00e9 annul\u00e9e.\", \"La r\u00e9union annulait.\", \"La r\u00e9union sera annul\u00e9e.\"], correct: 0 },\n            { q: \"Il a annonc\u00e9 : \u00ab Je d\u00e9missionnerai bient\u00f4t. \u00bb \u2192 Il a annonc\u00e9 qu'_______\", options: [\"il d\u00e9missionnera bient\u00f4t.\", \"il d\u00e9missionnerait bient\u00f4t.\", \"il a d\u00e9missionn\u00e9.\"], correct: 1 },\n            { q: \"Elle a demand\u00e9 : \u00ab Que voulez-vous faire ? \u00bb \u2192 Elle a demand\u00e9 _______\", options: [\"ce que nous voulions faire.\", \"ce que nous voulons faire.\", \"que voulons-nous faire.\"], correct: 0 },\n            { q: \"\u00ab Signez ce document ! \u00bb a-t-il dit. \u2192 Il a dit _______\", options: [\"de signer ce document.\", \"qu'ils signent ce document.\", \"de signant ce document.\"], correct: 0 },\n            { q: \"Cette mesure _______ adopt\u00e9e par le conseil le mois prochain. (passif)\", options: [\"sera\", \"aura \u00e9t\u00e9\", \"serait\"], correct: 0 },\n          ],\n        },\n        {\n          title: \"5. Pr\u00e9positions et verbes\",\n          items: [\n            { q: \"Ce choix contribue _______ renforcer la confiance des investisseurs.\", options: [\"\u00e0\", \"de\", \"pour\"], correct: 0 },\n            { q: \"Il s'agit _______ repenser enti\u00e8rement le mod\u00e8le \u00e9conomique.\", options: [\"\u00e0\", \"de\", \"sur\"], correct: 1 },\n            { q: \"Les autorit\u00e9s insistent _______ la transparence du processus.\", options: [\"sur\", \"de\", \"\u00e0\"], correct: 0 },\n            { q: \"Le succ\u00e8s du projet d\u00e9pend _______ l'implication de chacun.\", options: [\"\u00e0\", \"de\", \"sur\"], correct: 1 },\n            { q: \"La r\u00e9gion s'engage _______ soutenir les petites entreprises.\", options: [\"\u00e0\", \"de\", \"pour\"], correct: 0 },\n          ],\n        },\n        {\n          title: \"6. Articles et accords\",\n          items: [\n            { q: \"_______ majorit\u00e9 des votants a approuv\u00e9 la r\u00e9forme.\", options: [\"La\", \"Une\", \"Des\"], correct: 0 },\n            { q: \"Il a fait preuve _______ rigueur exemplaire.\", options: [\"la\", \"une\", \"de la\"], correct: 1 },\n            { q: \"Ce sont _______ choix risqu\u00e9s mais r\u00e9fl\u00e9chis.\", options: [\"les\", \"des\", \"de\"], correct: 1 },\n            { q: \"Elle reste attentive _______ besoins de son \u00e9quipe.\", options: [\"les\", \"aux\", \"des\"], correct: 1 },\n            { q: \"_______ r\u00e9sultats n'avaient encore jamais \u00e9t\u00e9 atteints.\", options: [\"De pareils\", \"Les\", \"Des\"], correct: 0 },\n          ],\n        },\n      ],\n    },\n    written: {\n      duration: 40 * 60,\n      maxScore: 30,\n      prompts: [\n        { type: \"Sujet argumentatif\", text: \"Les accords internationaux sur le climat sont-ils efficaces, ou ne sont-ils que des d\u00e9clarations d'intention ? Justifiez votre r\u00e9ponse. (200 mots maximum)\" },\n        { type: \"Sujet cr\u00e9atif\", text: \"Imaginez le t\u00e9moignage d'une personne vivant dans une ville o\u00f9 tous les transports sont devenus gratuits et \u00e9cologiques. (200 mots maximum)\" },\n      ],\n    },\n    oral: {\n      duration: 10 * 60,\n      maxScore: 30,\n      topics: [\n        \"Les engagements pris lors des accords internationaux sont-ils suffisants pour lutter contre le changement climatique ?\",\n        \"Comment expliquez-vous que la pollution de l'air reste un probl\u00e8me majeur dans les grandes villes europ\u00e9ennes ?\",\n        \"Quelles mesures les villes devraient-elles adopter pour r\u00e9duire durablement la pollution de l'air ?\",\n      ],\n    },\n  },\n];\n\nif (typeof module !== \"undefined\") module.exports = EXAMS;\n\n<\/script>\n<script>\n\/\/ ============================================================\n\/\/ STATE\n\/\/ ============================================================\nlet state = {\n  examId: null,\n  exam: null,\n  sectionIndex: 0, \/\/ 0=listening,1=reading,2=grammar,3=written,4=oral\n  answers: { listening: [], reading: [], grammar: [], written: [\"\", \"\"], oral: null },\n  scores: {},\n  timerInterval: null,\n  timeLeft: 0,\n  sectionStarted: false,\n  oralPhase: \"pick\", \/\/ pick -> prep -> speak -> done\n  oralTopicIndex: null,\n};\n\nconst SECTION_NAMES = [\"Compr\u00e9hension orale\", \"Compr\u00e9hension \u00e9crite\", \"Grammaire\", \"Production \u00e9crite\", \"Production orale\"];\nconst SECTION_KEYS = [\"listening\", \"reading\", \"grammar\", \"written\", \"oral\"];\n\nconst app = document.getElementById(\"app\");\nconst topbarSection = document.getElementById(\"topbarSection\");\nconst topbarId = document.getElementById(\"topbarId\");\nconst globalTimer = document.getElementById(\"globalTimer\");\n\n\/\/ ============================================================\n\/\/ UTIL\n\/\/ ============================================================\nfunction fmtTime(sec) {\n  sec = Math.max(0, Math.round(sec));\n  const m = Math.floor(sec \/ 60).toString().padStart(2, \"0\");\n  const s = (sec % 60).toString().padStart(2, \"0\");\n  return `${m}:${s}`;\n}\n\nfunction clearTimer() {\n  if (state.timerInterval) clearInterval(state.timerInterval);\n  state.timerInterval = null;\n}\n\nfunction startTimer(seconds, onTick, onEnd) {\n  clearTimer();\n  state.timeLeft = seconds;\n  onTick(state.timeLeft);\n  state.timerInterval = setInterval(() => {\n    state.timeLeft -= 1;\n    onTick(state.timeLeft);\n    if (state.timeLeft <= 0) {\n      clearTimer();\n      onEnd();\n    }\n  }, 1000);\n}\n\nfunction updateGlobalTimerDisplay(sec, totalSec) {\n  globalTimer.textContent = fmtTime(sec);\n  globalTimer.classList.remove(\"warn\", \"danger\");\n  if (totalSec) {\n    const ratio = sec \/ totalSec;\n    if (ratio <= 0.1) globalTimer.classList.add(\"danger\");\n    else if (ratio <= 0.25) globalTimer.classList.add(\"warn\");\n  }\n}\n\nfunction countWords(text) {\n  return text.trim().split(\/\\s+\/).filter(Boolean).length;\n}\n\n\/\/ ============================================================\n\/\/ TTS\n\/\/ ============================================================\nlet ttsUtterance = null;\nlet ttsVoices = [];\nlet ttsVoicesReady = false;\nfunction loadVoices() {\n  ttsVoices = window.speechSynthesis ? window.speechSynthesis.getVoices() : [];\n  if (ttsVoices.length) ttsVoicesReady = true;\n}\nif (typeof speechSynthesis !== \"undefined\") {\n  loadVoices();\n  speechSynthesis.onvoiceschanged = loadVoices;\n}\nfunction pickFrenchVoice() {\n  if (!ttsVoices.length) loadVoices();\n  return ttsVoices.find(v => v.lang && v.lang.toLowerCase().startsWith(\"fr\")) || null;\n}\nfunction speak(text, onEnd) {\n  if (typeof speechSynthesis === \"undefined\") {\n    alert(\"La synth\u00e8se vocale (TTS) n'est pas disponible dans ce navigateur. Essayez avec Chrome sur ordinateur.\");\n    if (onEnd) onEnd();\n    return;\n  }\n  \/\/ If voices haven't loaded yet, give the browser a brief moment then retry once.\n  if (!ttsVoicesReady && !ttsVoices.length) {\n    loadVoices();\n    if (!ttsVoices.length) {\n      setTimeout(() => speak(text, onEnd), 300);\n      return;\n    }\n  }\n  speechSynthesis.cancel();\n  const utter = new SpeechSynthesisUtterance(text);\n  const voice = pickFrenchVoice();\n  if (voice) {\n    utter.voice = voice;\n  } else if (ttsVoices.length) {\n    \/\/ No French voice found on this device \u2014 warn once, still attempt with default voice + fr-FR lang hint.\n    console.warn(\"Aucune voix fran\u00e7aise trouv\u00e9e ; utilisation de la voix par d\u00e9faut.\");\n  }\n  utter.lang = \"fr-FR\";\n  utter.rate = 0.95;\n  utter.onend = () => { if (onEnd) onEnd(); };\n  utter.onerror = () => { if (onEnd) onEnd(); };\n  ttsUtterance = utter;\n  speechSynthesis.speak(utter);\n}\nfunction stopSpeak() {\n  if (typeof speechSynthesis !== \"undefined\") speechSynthesis.cancel();\n}\n\n\/\/ ============================================================\n\/\/ LANDING\n\/\/ ============================================================\nfunction renderLanding() {\n  clearTimer();\n  stopSpeak();\n  topbarSection.textContent = \"Accueil\";\n  topbarId.textContent = \"B2 \u00b7 ALLINGUA FORMAT\";\n  updateGlobalTimerDisplay(0);\n  globalTimer.textContent = \"\u2014\";\n  globalTimer.classList.remove(\"warn\", \"danger\");\n\n  app.innerHTML = `\n    <div class=\"masthead\">\n      <div class=\"eyebrow\">Pr\u00e9paration \u00e0 l'examen<\/div>\n      <h1>Simulation d'examen B2 \u2014 Format complet<\/h1>\n      <p>Trois simulations ind\u00e9pendantes, chacune reproduisant les cinq \u00e9preuves officielles : compr\u00e9hension orale (avec audio), compr\u00e9hension \u00e9crite, grammaire, production \u00e9crite avec clavier fran\u00e7ais virtuel, et production orale chronom\u00e9tr\u00e9e. Score final sur 100, avec seuils minimaux par \u00e9preuve.<\/p>\n    <\/div>\n    <div class=\"exam-grid\">\n      ${EXAMS.map(e => `\n        <div class=\"exam-card\">\n          <div>\n            <div class=\"exam-card-title\">${e.title}<\/div>\n            <div class=\"exam-card-meta\">5 \u00e9preuves \u00b7 ~2h00 \u00b7 Score \/100, seuil de r\u00e9ussite 60<\/div>\n          <\/div>\n          <button class=\"btn\" onclick=\"startExam(${e.id})\">Commencer \u2192<\/button>\n        <\/div>\n      `).join(\"\")}\n    <\/div>\n  `;\n}\n\nfunction startExam(id) {\n  state.examId = id;\n  state.exam = EXAMS.find(e => e.id === id);\n  state.sectionIndex = 0;\n  state.answers = { listening: [], reading: [], grammar: [], written: [\"\", \"\"], oral: null };\n  state.scores = {};\n  state.sectionStarted = false;\n  state.oralPhase = \"pick\";\n  state.oralTopicIndex = null;\n  renderSectionIntro();\n}\n\n\/\/ ============================================================\n\/\/ SECTION PROGRESS BAR\n\/\/ ============================================================\nfunction progressBarHTML() {\n  return `\n    <div class=\"section-progress\">\n      ${SECTION_NAMES.map((name, i) => {\n        let cls = \"dot\";\n        if (i < state.sectionIndex) cls += \" done\";\n        else if (i === state.sectionIndex) cls += \" active\";\n        return `<span class=\"${cls}\">${i + 1}. ${name}<\/span>`;\n      }).join(\"\")}\n    <\/div>\n  `;\n}\n\n\/\/ ============================================================\n\/\/ SECTION INTRO (before timer starts)\n\/\/ ============================================================\nfunction renderSectionIntro() {\n  clearTimer();\n  stopSpeak();\n  const key = SECTION_KEYS[state.sectionIndex];\n  const name = SECTION_NAMES[state.sectionIndex];\n  topbarSection.textContent = `${state.exam.title} \u00b7 ${name}`;\n  const durations = {\n    listening: state.exam.listening.duration,\n    reading: state.exam.reading.duration,\n    grammar: state.exam.grammar.duration,\n    written: state.exam.written.duration,\n    oral: state.exam.oral.duration,\n  };\n  globalTimer.textContent = fmtTime(durations[key]);\n  globalTimer.classList.remove(\"warn\", \"danger\");\n\n  const descriptions = {\n    listening: \"Vous allez \u00e9couter plusieurs documents audio (bulletin, interview, reportage). Chaque document peut \u00eatre \u00e9cout\u00e9 au maximum 2 fois. R\u00e9pondez aux questions \u00e0 choix multiple apr\u00e8s chaque document.\",\n    reading: \"Lisez attentivement les deux textes propos\u00e9s, puis r\u00e9pondez aux questions de compr\u00e9hension.\",\n    grammar: \"Six sections de cinq exercices chacune. Choisissez la r\u00e9ponse correcte pour chaque item.\",\n    written: \"R\u00e9digez un texte de 200 mots maximum sur l'un des deux sujets propos\u00e9s. Un clavier virtuel fran\u00e7ais est disponible pour les caract\u00e8res accentu\u00e9s.\",\n    oral: \"Vous choisirez un sujet, puis disposerez de 5 minutes de pr\u00e9paration suivies de 5 minutes de pr\u00e9sentation chronom\u00e9tr\u00e9e.\",\n  };\n\n  app.innerHTML = `\n    ${progressBarHTML()}\n    <div class=\"card\">\n      <div class=\"card-label\">\u00c9preuve ${state.sectionIndex + 1} \/ 5<\/div>\n      <h2>${name}<\/h2>\n      <div class=\"sub\">Dur\u00e9e allou\u00e9e : ${fmtTime(durations[key])} \u00b7 Score maximum : \/${{listening:15,reading:10,grammar:15,written:30,oral:30}[key]}<\/div>\n      <p style=\"margin-bottom:24px; color:var(--ink-soft); font-size:15px;\">${descriptions[key]}<\/p>\n      <button class=\"btn\" onclick=\"beginSection()\">D\u00e9marrer le chronom\u00e8tre et commencer \u2192<\/button>\n    <\/div>\n  `;\n}\n\nfunction beginSection() {\n  state.sectionStarted = true;\n  const key = SECTION_KEYS[state.sectionIndex];\n  if (key === \"listening\") renderListening();\n  else if (key === \"reading\") renderReading();\n  else if (key === \"grammar\") renderGrammar();\n  else if (key === \"written\") renderWritten();\n  else if (key === \"oral\") renderOralPick();\n}\n\nfunction goToNextSection() {\n  if (state.sectionIndex < 4) {\n    state.sectionIndex += 1;\n    renderSectionIntro();\n  } else {\n    renderResults();\n  }\n}\n\n\/\/ ============================================================\n\/\/ LISTENING\n\/\/ ============================================================\nlet listeningPlayCounts = {};\n\nfunction renderListening() {\n  const data = state.exam.listening;\n  if (!state.answers.listening.length) {\n    state.answers.listening = data.passages.map(p => p.questions.map(() => null));\n  }\n  listeningPlayCounts = listeningPlayCounts.examId === state.examId ? listeningPlayCounts : { examId: state.examId };\n  data.passages.forEach((_, i) => { if (listeningPlayCounts[i] === undefined) listeningPlayCounts[i] = 0; });\n\n  startTimer(data.duration, (t) => updateGlobalTimerDisplay(t, data.duration), () => {\n    alert(\"Temps \u00e9coul\u00e9 pour la compr\u00e9hension orale. Passage \u00e0 l'\u00e9preuve suivante.\");\n    finalizeSection(\"listening\");\n  });\n\n  renderListeningBody();\n}\n\nfunction renderListeningBody() {\n  const data = state.exam.listening;\n  const frVoice = pickFrenchVoice();\n  const voiceWarning = !frVoice ? `<div class=\"instructions\" style=\"background:#FBEAEA; border-left-color:var(--error); color:#6B1F1F;\">\u26a0 Aucune voix fran\u00e7aise n'a \u00e9t\u00e9 d\u00e9tect\u00e9e sur cet appareil. L'audio risque de ne pas se lire, ou de se lire avec un accent anglais. Essayez avec Chrome sur ordinateur, ou v\u00e9rifiez les param\u00e8tres de synth\u00e8se vocale de l'appareil.<\/div>` : \"\";\n  app.innerHTML = `\n    ${progressBarHTML()}\n    ${voiceWarning}\n    <div class=\"instructions\">Chaque document audio peut \u00eatre \u00e9cout\u00e9 au maximum 2 fois. Cliquez sur \u25b6 pour lancer la lecture (synth\u00e8se vocale).<\/div>\n    ${data.passages.map((passage, pi) => `\n      <div class=\"card\">\n        <div class=\"card-label\">Document ${pi + 1} \/ ${data.passages.length}<\/div>\n        <h2 style=\"font-size:18px;\">${passage.title}<\/h2>\n        <div class=\"audio-box\">\n          <div class=\"audio-controls\">\n            <button class=\"play-btn\" id=\"play-${pi}\" onclick=\"playPassage(${pi})\" ${listeningPlayCounts[pi] >= 2 ? \"disabled\" : \"\"}>\n              <span id=\"play-icon-${pi}\">\u25b6<\/span>\n            <\/button>\n            <div class=\"audio-meta\"><strong>\u00c9coutes restantes :<\/strong> <span id=\"count-${pi}\">${2 - listeningPlayCounts[pi]}<\/span> \/ 2<\/div>\n          <\/div>\n          <button class=\"transcript-toggle\" onclick=\"toggleTranscript(${pi})\">Afficher \/ masquer la transcription (apr\u00e8s \u00e9coute)<\/button>\n          <div class=\"transcript\" id=\"transcript-${pi}\">${passage.script}<\/div>\n        <\/div>\n        ${passage.questions.map((q, qi) => `\n          <div class=\"question-block\">\n            <div class=\"q-text\"><span class=\"q-num\">${qi + 1}.<\/span>${q.q}<\/div>\n            <div class=\"options\">\n              ${q.options.map((opt, oi) => `\n                <label class=\"option ${state.answers.listening[pi][qi] === oi ? \"selected\" : \"\"}\" onclick=\"selectListening(${pi},${qi},${oi})\">\n                  <input type=\"radio\" name=\"l-${pi}-${qi}\" ${state.answers.listening[pi][qi] === oi ? \"checked\" : \"\"}>\n                  ${opt}\n                <\/label>\n              `).join(\"\")}\n            <\/div>\n          <\/div>\n        `).join(\"\")}\n      <\/div>\n    `).join(\"\")}\n    <div class=\"footer-nav\">\n      <span style=\"font-size:13px; color:var(--ink-soft);\">R\u00e9pondu : ${countAnswered(\"listening\")} \/ ${totalQuestions(\"listening\")}<\/span>\n      <button class=\"btn\" onclick=\"finalizeSection('listening')\">Valider et continuer \u2192<\/button>\n    <\/div>\n  `;\n}\n\nfunction playPassage(pi) {\n  if (listeningPlayCounts[pi] >= 2) return;\n  listeningPlayCounts[pi] += 1;\n  const icon = document.getElementById(`play-icon-${pi}`);\n  const btn = document.getElementById(`play-${pi}`);\n  const countEl = document.getElementById(`count-${pi}`);\n  icon.textContent = \"\u2759\u2759\";\n  btn.disabled = true;\n  countEl.textContent = 2 - listeningPlayCounts[pi];\n  speak(state.exam.listening.passages[pi].script, () => {\n    icon.textContent = \"\u25b6\";\n    btn.disabled = listeningPlayCounts[pi] >= 2;\n  });\n}\n\nfunction toggleTranscript(pi) {\n  document.getElementById(`transcript-${pi}`).classList.toggle(\"show\");\n}\n\nfunction selectListening(pi, qi, oi) {\n  state.answers.listening[pi][qi] = oi;\n  renderListeningBody();\n}\n\nfunction countAnswered(key) {\n  if (key === \"listening\") return state.answers.listening.flat().filter(v => v !== null).length;\n  if (key === \"reading\") return state.answers.reading.flat().filter(v => v !== null).length;\n  if (key === \"grammar\") return state.answers.grammar.flat().filter(v => v !== null).length;\n}\nfunction totalQuestions(key) {\n  if (key === \"listening\") return state.exam.listening.passages.reduce((a, p) => a + p.questions.length, 0);\n  if (key === \"reading\") return state.exam.reading.texts.reduce((a, t) => a + t.questions.length, 0);\n  if (key === \"grammar\") return state.exam.grammar.sections.reduce((a, s) => a + s.items.length, 0);\n}\n\nfunction finalizeSection(key) {\n  clearTimer();\n  stopSpeak();\n  if (key === \"listening\") {\n    let correct = 0, total = 0;\n    state.exam.listening.passages.forEach((p, pi) => {\n      p.questions.forEach((q, qi) => {\n        total++;\n        if (state.answers.listening[pi][qi] === q.correct) correct++;\n      });\n    });\n    state.scores.listening = Math.round((correct \/ total) * state.exam.listening.maxScore * 10) \/ 10;\n  }\n  if (key === \"reading\") {\n    let correct = 0, total = 0;\n    state.exam.reading.texts.forEach((t, ti) => {\n      t.questions.forEach((q, qi) => {\n        total++;\n        if (state.answers.reading[ti][qi] === q.correct) correct++;\n      });\n    });\n    state.scores.reading = Math.round((correct \/ total) * state.exam.reading.maxScore * 10) \/ 10;\n  }\n  if (key === \"grammar\") {\n    let correct = 0, total = 0;\n    state.exam.grammar.sections.forEach((s, si) => {\n      s.items.forEach((it, ii) => {\n        total++;\n        if (state.answers.grammar[si][ii] === it.correct) correct++;\n      });\n    });\n    state.scores.grammar = Math.round((correct \/ total) * state.exam.grammar.maxScore * 10) \/ 10;\n  }\n  if (key === \"written\") {\n    const wc = state.answers.written.map(countWords);\n    const best = Math.max(...wc.map((w, i) => state.answers.written[i].trim() ? 1 : 0));\n    const hasAny = state.answers.written.some(t => t.trim().length > 20);\n    state.scores.written = hasAny ? \"\u00c0 \u00e9valuer manuellement\" : 0;\n  }\n  if (key === \"oral\") {\n    state.scores.oral = state.oralTopicIndex !== null ? \"\u00c0 \u00e9valuer (entra\u00eenement r\u00e9alis\u00e9)\" : \"Non r\u00e9alis\u00e9\";\n  }\n  goToNextSection();\n}\n\n\/\/ ============================================================\n\/\/ READING\n\/\/ ============================================================\nfunction renderReading() {\n  const data = state.exam.reading;\n  if (!state.answers.reading.length) {\n    state.answers.reading = data.texts.map(t => t.questions.map(() => null));\n  }\n  startTimer(data.duration, (t) => updateGlobalTimerDisplay(t, data.duration), () => {\n    alert(\"Temps \u00e9coul\u00e9 pour la compr\u00e9hension \u00e9crite. Passage \u00e0 l'\u00e9preuve suivante.\");\n    finalizeSection(\"reading\");\n  });\n  renderReadingBody();\n}\n\nfunction renderReadingBody() {\n  const data = state.exam.reading;\n  app.innerHTML = `\n    ${progressBarHTML()}\n    ${data.texts.map((text, ti) => `\n      <div class=\"card\">\n        <div class=\"card-label\">${text.title}<\/div>\n        <div class=\"reading-text\">${text.content}<\/div>\n        ${text.questions.map((q, qi) => `\n          <div class=\"question-block\">\n            <div class=\"q-text\"><span class=\"q-num\">${qi + 1}.<\/span>${q.q}<\/div>\n            <div class=\"options\">\n              ${q.options.map((opt, oi) => `\n                <label class=\"option ${state.answers.reading[ti][qi] === oi ? \"selected\" : \"\"}\" onclick=\"selectReading(${ti},${qi},${oi})\">\n                  <input type=\"radio\" name=\"r-${ti}-${qi}\" ${state.answers.reading[ti][qi] === oi ? \"checked\" : \"\"}>\n                  ${opt}\n                <\/label>\n              `).join(\"\")}\n            <\/div>\n          <\/div>\n        `).join(\"\")}\n      <\/div>\n    `).join(\"\")}\n    <div class=\"footer-nav\">\n      <span style=\"font-size:13px; color:var(--ink-soft);\">R\u00e9pondu : ${countAnswered(\"reading\")} \/ ${totalQuestions(\"reading\")}<\/span>\n      <button class=\"btn\" onclick=\"finalizeSection('reading')\">Valider et continuer \u2192<\/button>\n    <\/div>\n  `;\n}\n\nfunction selectReading(ti, qi, oi) {\n  state.answers.reading[ti][qi] = oi;\n  renderReadingBody();\n}\n\n\/\/ ============================================================\n\/\/ GRAMMAR\n\/\/ ============================================================\nfunction renderGrammar() {\n  const data = state.exam.grammar;\n  if (!state.answers.grammar.length) {\n    state.answers.grammar = data.sections.map(s => s.items.map(() => null));\n  }\n  startTimer(data.duration, (t) => updateGlobalTimerDisplay(t, data.duration), () => {\n    alert(\"Temps \u00e9coul\u00e9 pour la grammaire. Passage \u00e0 l'\u00e9preuve suivante.\");\n    finalizeSection(\"grammar\");\n  });\n  renderGrammarBody();\n}\n\nfunction renderGrammarBody() {\n  const data = state.exam.grammar;\n  app.innerHTML = `\n    ${progressBarHTML()}\n    ${data.sections.map((sec, si) => `\n      <div class=\"card\">\n        <div class=\"card-label\">Section ${si + 1} \/ 6<\/div>\n        <h2 style=\"font-size:18px;\">${sec.title}<\/h2>\n        ${sec.items.map((it, ii) => `\n          <div class=\"question-block\">\n            <div class=\"q-text\"><span class=\"q-num\">${ii + 1}.<\/span>${it.q}<\/div>\n            <div class=\"options\">\n              ${it.options.map((opt, oi) => `\n                <label class=\"option ${state.answers.grammar[si][ii] === oi ? \"selected\" : \"\"}\" onclick=\"selectGrammar(${si},${ii},${oi})\">\n                  <input type=\"radio\" name=\"g-${si}-${ii}\" ${state.answers.grammar[si][ii] === oi ? \"checked\" : \"\"}>\n                  ${opt}\n                <\/label>\n              `).join(\"\")}\n            <\/div>\n          <\/div>\n        `).join(\"\")}\n      <\/div>\n    `).join(\"\")}\n    <div class=\"footer-nav\">\n      <span style=\"font-size:13px; color:var(--ink-soft);\">R\u00e9pondu : ${countAnswered(\"grammar\")} \/ ${totalQuestions(\"grammar\")}<\/span>\n      <button class=\"btn\" onclick=\"finalizeSection('grammar')\">Valider et continuer \u2192<\/button>\n    <\/div>\n  `;\n}\n\nfunction selectGrammar(si, ii, oi) {\n  state.answers.grammar[si][ii] = oi;\n  renderGrammarBody();\n}\n\n\/\/ ============================================================\n\/\/ WRITTEN PRODUCTION (with virtual keyboard)\n\/\/ ============================================================\nlet activeTextareaId = null;\n\nconst FR_KEYS_ROW1 = [\"\u00e0\",\"\u00e2\",\"\u00e7\",\"\u00e8\",\"\u00e9\",\"\u00ea\",\"\u00eb\",\"\u00ee\",\"\u00ef\",\"\u00f4\",\"\u00f9\",\"\u00fb\",\"\u00fc\"];\nconst FR_KEYS_ROW2 = [\"\u0153\",\"\u00e6\",\"\u00ab\",\"\u00bb\",\"'\",\"-\"];\n\nfunction renderWritten() {\n  const data = state.exam.written;\n  startTimer(data.duration, (t) => updateGlobalTimerDisplay(t, data.duration), () => {\n    alert(\"Temps \u00e9coul\u00e9 pour la production \u00e9crite. Passage \u00e0 l'\u00e9preuve suivante.\");\n    finalizeSection(\"written\");\n  });\n  renderWrittenBody();\n}\n\nfunction renderWrittenBody() {\n  const data = state.exam.written;\n  app.innerHTML = `\n    ${progressBarHTML()}\n    <div class=\"instructions\">Choisissez un sujet (ou r\u00e9digez les deux, \u00e0 titre d'entra\u00eenement). Limite : 200 mots par texte. Le clavier virtuel ci-dessous ins\u00e8re les caract\u00e8res accentu\u00e9s fran\u00e7ais \u00e0 l'endroit du curseur.<\/div>\n    ${data.prompts.map((prompt, pi) => `\n      <div class=\"card\">\n        <div class=\"prompt-box\">\n          <div class=\"prompt-type\">${prompt.type}<\/div>\n          <div style=\"font-size:15.5px;\">${prompt.text}<\/div>\n        <\/div>\n        <button class=\"vkb-toggle\" onclick=\"toggleKeyboard(${pi})\">\u2328 Clavier fran\u00e7ais virtuel<\/button>\n        <div class=\"vkb\" id=\"vkb-${pi}\">\n          <div class=\"vkb-row\">\n            ${FR_KEYS_ROW1.map(k => `<button class=\"vkb-key\" onclick=\"insertChar(${pi},'${k}')\" type=\"button\">${k}<\/button>`).join(\"\")}\n          <\/div>\n          <div class=\"vkb-row\">\n            ${FR_KEYS_ROW2.map(k => `<button class=\"vkb-key\" onclick=\"insertChar(${pi},'${k}')\" type=\"button\">${k}<\/button>`).join(\"\")}\n            <button class=\"vkb-key wide\" onclick=\"insertChar(${pi}, ' ')\" type=\"button\">espace<\/button>\n          <\/div>\n        <\/div>\n        <textarea class=\"essay\" id=\"essay-${pi}\" placeholder=\"R\u00e9digez votre texte ici...\" oninput=\"onEssayInput(${pi})\" onfocus=\"activeTextareaId=${pi}\">${state.answers.written[pi]}<\/textarea>\n        <div class=\"word-count\" id=\"wc-${pi}\">${countWords(state.answers.written[pi])} \/ 200 mots<\/div>\n      <\/div>\n    `).join(\"\")}\n    <div class=\"footer-nav\">\n      <span><\/span>\n      <button class=\"btn\" onclick=\"finalizeSection('written')\">Valider et continuer \u2192<\/button>\n    <\/div>\n  `;\n}\n\nfunction toggleKeyboard(pi) {\n  document.getElementById(`vkb-${pi}`).classList.toggle(\"show\");\n}\n\nfunction insertChar(pi, char) {\n  const ta = document.getElementById(`essay-${pi}`);\n  const start = ta.selectionStart;\n  const end = ta.selectionEnd;\n  const val = ta.value;\n  ta.value = val.slice(0, start) + char + val.slice(end);\n  ta.selectionStart = ta.selectionEnd = start + char.length;\n  ta.focus();\n  onEssayInput(pi);\n}\n\nfunction onEssayInput(pi) {\n  const ta = document.getElementById(`essay-${pi}`);\n  state.answers.written[pi] = ta.value;\n  const wc = countWords(ta.value);\n  const wcEl = document.getElementById(`wc-${pi}`);\n  wcEl.textContent = `${wc} \/ 200 mots`;\n  wcEl.classList.toggle(\"over\", wc > 200);\n}\n\n\/\/ ============================================================\n\/\/ ORAL PRODUCTION\n\/\/ ============================================================\nfunction renderOralPick() {\n  globalTimer.textContent = \"\u2014\";\n  const data = state.exam.oral;\n  app.innerHTML = `\n    ${progressBarHTML()}\n    <div class=\"card\">\n      <div class=\"card-label\">Production orale<\/div>\n      <h2>Choisissez un sujet<\/h2>\n      <div class=\"sub\">Le sujet est normalement tir\u00e9 au hasard le jour de l'examen. Ici, s\u00e9lectionnez-en un pour vous entra\u00eener dans les m\u00eames conditions de temps.<\/div>\n      <div class=\"oral-topic-list\">\n        ${data.topics.map((topic, ti) => `\n          <div class=\"oral-topic ${state.oralTopicIndex === ti ? \"picked\" : \"\"}\" onclick=\"pickOralTopic(${ti})\">${topic}<\/div>\n        `).join(\"\")}\n      <\/div>\n      <button class=\"btn\" ${state.oralTopicIndex === null ? \"disabled\" : \"\"} onclick=\"startOralPrep()\">Commencer la pr\u00e9paration (5 min) \u2192<\/button>\n    <\/div>\n  `;\n}\n\nfunction pickOralTopic(ti) {\n  state.oralTopicIndex = ti;\n  renderOralPick();\n}\n\nfunction startOralPrep() {\n  state.oralPhase = \"prep\";\n  renderOralStage();\n  startTimer(5 * 60, (t) => {\n    updateGlobalTimerDisplay(t, 5 * 60);\n    updateOralBigTimer(t);\n  }, () => {\n    startOralSpeak();\n  });\n}\n\nfunction startOralSpeak() {\n  state.oralPhase = \"speak\";\n  renderOralStage();\n  startTimer(5 * 60, (t) => {\n    updateGlobalTimerDisplay(t, 5 * 60);\n    updateOralBigTimer(t);\n  }, () => {\n    state.oralPhase = \"done\";\n    renderOralStage();\n  });\n}\n\nfunction updateOralBigTimer(t) {\n  const el = document.getElementById(\"oralBigTimer\");\n  if (el) el.textContent = fmtTime(t);\n}\n\nfunction renderOralStage() {\n  const topic = state.exam.oral.topics[state.oralTopicIndex];\n  if (state.oralPhase === \"prep\") {\n    app.innerHTML = `\n      ${progressBarHTML()}\n      <div class=\"card oral-stage\">\n        <div class=\"oral-phase-label\">Phase de pr\u00e9paration<\/div>\n        <div class=\"big-timer\" id=\"oralBigTimer\">${fmtTime(state.timeLeft)}<\/div>\n        <div class=\"oral-topic-display\">${topic}<\/div>\n        <div class=\"oral-plan-hint\">\n          <strong>Pendant ces 5 minutes :<\/strong><br>\n          Notez 2-3 arguments principaux, un exemple concret, et une nuance ou contre-argument. Ne r\u00e9digez pas de texte complet \u2014 pr\u00e9parez un plan parl\u00e9, pas un texte lu.\n        <\/div>\n      <\/div>\n    `;\n  } else if (state.oralPhase === \"speak\") {\n    app.innerHTML = `\n      ${progressBarHTML()}\n      <div class=\"card oral-stage\">\n        <div class=\"oral-phase-label\">Pr\u00e9sentation \u2014 parlez maintenant<\/div>\n        <div class=\"big-timer\" id=\"oralBigTimer\">${fmtTime(state.timeLeft)}<\/div>\n        <div class=\"oral-topic-display\">${topic}<\/div>\n        <div class=\"oral-plan-hint\">\n          Pr\u00e9sentez votre argumentation \u00e0 voix haute jusqu'\u00e0 la fin du chronom\u00e8tre. Structurez : introduction, 2 arguments, nuance, conclusion.\n        <\/div>\n      <\/div>\n    `;\n  } else if (state.oralPhase === \"done\") {\n    app.innerHTML = `\n      ${progressBarHTML()}\n      <div class=\"card oral-stage\">\n        <div class=\"oral-phase-label\">\u00c9preuve orale termin\u00e9e<\/div>\n        <h2 style=\"margin: 16px 0;\">Bravo, l'entra\u00eenement chronom\u00e9tr\u00e9 est termin\u00e9.<\/h2>\n        <p style=\"color:var(--ink-soft); margin-bottom: 24px;\">Cette \u00e9preuve est \u00e9valu\u00e9e par un examinateur humain le jour de l'examen ; il n'y a pas de note automatique ici.<\/p>\n        <button class=\"btn\" onclick=\"finalizeSection('oral')\">Voir les r\u00e9sultats \u2192<\/button>\n      <\/div>\n    `;\n  }\n}\n\n\/\/ ============================================================\n\/\/ RESULTS\n\/\/ ============================================================\nfunction renderResults() {\n  clearTimer();\n  stopSpeak();\n  topbarSection.textContent = `${state.exam.title} \u00b7 R\u00e9sultats`;\n  globalTimer.textContent = \"\u2014\";\n\n  const minScores = { listening: 9, reading: 0, grammar: 9, written: 0, oral: 0 };\n  const maxScores = { listening: 15, reading: 10, grammar: 15, written: 30, oral: 30 };\n\n  const autoTotal = (state.scores.listening || 0) + (state.scores.reading || 0) + (state.scores.grammar || 0);\n  const autoMax = 15 + 10 + 15;\n\n  const rows = SECTION_KEYS.map((key, i) => {\n    const score = state.scores[key];\n    const isNumeric = typeof score === \"number\";\n    const min = minScores[key];\n    let rowClass = \"\";\n    if (isNumeric && min > 0) rowClass = score >= min ? \"pass-min\" : \"fail-min\";\n    return `\n      <div class=\"breakdown-row ${rowClass}\">\n        <div class=\"breakdown-name\">${SECTION_NAMES[i]}<\/div>\n        <div class=\"breakdown-score\">\n          ${isNumeric ? `${score} \/ ${maxScores[key]}` : `<em style=\"font-size:13px; color:var(--ink-soft);\">${score || \"\u2014\"}<\/em>`}\n          ${min > 0 && isNumeric ? `<span class=\"breakdown-minscore\">(seuil min. ${min})<\/span>` : \"\"}\n        <\/div>\n      <\/div>\n    `;\n  }).join(\"\");\n\n  const passedAuto = autoTotal >= 36 && (state.scores.listening || 0) >= 9 && (state.scores.grammar || 0) >= 9;\n\n  app.innerHTML = `\n    <div class=\"card\">\n      <div class=\"score-hero\">\n        <div class=\"score-label\">Score automatique (3 \u00e9preuves objectives)<\/div>\n        <div class=\"score-big ${passedAuto ? \"score-pass\" : \"score-fail\"}\">${autoTotal} \/ ${autoMax}<\/div>\n        <div class=\"score-label\" style=\"margin-top:8px;\">${passedAuto ? \"Seuils minimaux atteints sur les \u00e9preuves not\u00e9es automatiquement\" : \"Attention : un seuil minimal n'est pas atteint\"}<\/div>\n      <\/div>\n      <div class=\"breakdown\">${rows}<\/div>\n      <p style=\"font-size:13px; color:var(--ink-soft); margin-top:18px;\">Le score total officiel est sur 100 et inclut la production \u00e9crite et orale, \u00e9valu\u00e9es par un examinateur humain. Seules les \u00e9preuves de compr\u00e9hension orale, compr\u00e9hension \u00e9crite et grammaire sont not\u00e9es automatiquement ici.<\/p>\n      <div class=\"footer-nav\">\n        <button class=\"btn secondary\" onclick=\"renderLanding()\">\u2190 Retour \u00e0 l'accueil<\/button>\n        <button class=\"btn\" onclick=\"startExam(${state.examId})\">Refaire cette simulation<\/button>\n      <\/div>\n    <\/div>\n  `;\n}\n\n\/\/ ============================================================\n\/\/ INIT\n\/\/ ============================================================\nrenderLanding();\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>Simulation Examen B2 \u2014 Allingua Format (Set 2)<\/title>\n<link rel=\"preconnect\" href=\"https:\/\/fonts.googleapis.com\">\n<link href=\"https:\/\/fonts.googleapis.com\/css2?family=Source+Serif+4:opsz,wght@8..60,400;8..60,600;8..60,700&#038;family=Inter:wght@400;500;600;700&#038;family=JetBrains+Mono:wght@400;500&#038;display=swap\" rel=\"stylesheet\">\n<style>\n:root {\n  --bg: #FAFAF8;\n  --bg-card: #FFFFFF;\n  --ink: #1C1C1C;\n  --ink-soft: #5A5A54;\n  --navy: #1A3A5C;\n  --navy-deep: #102740;\n  --line: #DEDED6;\n  --success: #2D6A4F;\n  --success-bg: #E8F3EC;\n  --error: #9B2C2C;\n  --error-bg: #FBEAEA;\n  --amber: #B8860B;\n  --amber-bg: #FBF3E0;\n  --radius: 3px;\n}\n\n* { box-sizing: border-box; }\n\nbody {\n  margin: 0;\n  background: var(--bg);\n  color: var(--ink);\n  font-family: 'Inter', sans-serif;\n  font-size: 16px;\n  line-height: 1.55;\n}\n\nh1, h2, h3 { font-family: 'Source Serif 4', serif; margin: 0; }\n\n.app { max-width: 880px; margin: 0 auto; padding: 0 20px 80px; }\n\n\/* ===== TOP BAR \/ TIMER ===== *\/\n.topbar {\n  position: sticky;\n  top: 0;\n  z-index: 50;\n  background: var(--navy-deep);\n  color: #EFEFE8;\n  padding: 0;\n  border-bottom: 3px solid var(--amber);\n}\n.topbar-inner {\n  max-width: 880px;\n  margin: 0 auto;\n  display: flex;\n  align-items: center;\n  justify-content: space-between;\n  padding: 10px 20px;\n  gap: 16px;\n}\n.topbar-id {\n  font-size: 12px;\n  letter-spacing: 0.08em;\n  text-transform: uppercase;\n  color: #B9C6D4;\n}\n.topbar-section {\n  font-family: 'Source Serif 4', serif;\n  font-size: 17px;\n  font-weight: 600;\n  color: #fff;\n}\n.timer {\n  font-family: 'JetBrains Mono', monospace;\n  font-size: 22px;\n  font-weight: 500;\n  padding: 4px 14px;\n  border-radius: var(--radius);\n  background: rgba(255,255,255,0.08);\n  min-width: 92px;\n  text-align: center;\n  letter-spacing: 0.02em;\n}\n.timer.warn { background: rgba(184,134,11,0.35); color: #FFE9B0; }\n.timer.danger { background: rgba(155,44,44,0.45); color: #FFD2D2; animation: pulse 1s infinite; }\n@keyframes pulse { 50% { opacity: 0.55; } }\n\n\/* ===== HEADER \/ LANDING ===== *\/\n.masthead {\n  padding: 48px 0 28px;\n  border-bottom: 1px solid var(--line);\n  margin-bottom: 32px;\n}\n.eyebrow {\n  font-size: 12px;\n  letter-spacing: 0.14em;\n  text-transform: uppercase;\n  color: var(--navy);\n  font-weight: 600;\n  margin-bottom: 10px;\n}\n.masthead h1 {\n  font-size: 34px;\n  font-weight: 700;\n  color: var(--navy-deep);\n  line-height: 1.15;\n  margin-bottom: 10px;\n}\n.masthead p { color: var(--ink-soft); font-size: 15.5px; max-width: 560px; }\n\n.exam-grid {\n  display: grid;\n  gap: 16px;\n  margin-top: 28px;\n}\n.exam-card {\n  background: var(--bg-card);\n  border: 1px solid var(--line);\n  border-radius: var(--radius);\n  padding: 22px 24px;\n  display: flex;\n  align-items: center;\n  justify-content: space-between;\n  gap: 20px;\n  transition: border-color 0.15s, transform 0.15s;\n}\n.exam-card:hover { border-color: var(--navy); transform: translateX(2px); }\n.exam-card-title { font-family: 'Source Serif 4', serif; font-size: 19px; font-weight: 600; color: var(--navy-deep); margin-bottom: 4px; }\n.exam-card-meta { font-size: 13px; color: var(--ink-soft); }\n.btn {\n  font-family: 'Inter', sans-serif;\n  font-weight: 600;\n  font-size: 14px;\n  padding: 11px 20px;\n  border-radius: var(--radius);\n  border: none;\n  cursor: pointer;\n  background: var(--navy);\n  color: #fff;\n  white-space: nowrap;\n  transition: background 0.15s;\n}\n.btn:hover { background: var(--navy-deep); }\n.btn.secondary { background: transparent; color: var(--navy); border: 1.5px solid var(--navy); }\n.btn.secondary:hover { background: var(--navy); color: #fff; }\n.btn.ghost { background: transparent; color: var(--ink-soft); border: 1px solid var(--line); }\n.btn:disabled { opacity: 0.4; cursor: not-allowed; }\n\n\/* ===== SECTION NAV (intra-exam) ===== *\/\n.section-progress {\n  display: flex;\n  gap: 6px;\n  padding: 16px 0 0;\n  flex-wrap: wrap;\n}\n.dot {\n  font-size: 11px;\n  font-weight: 600;\n  padding: 5px 11px;\n  border-radius: 20px;\n  background: #EEEEE6;\n  color: var(--ink-soft);\n  letter-spacing: 0.02em;\n}\n.dot.active { background: var(--navy); color: #fff; }\n.dot.done { background: var(--success-bg); color: var(--success); }\n\n\/* ===== CARDS \/ SECTIONS ===== *\/\n.card {\n  background: var(--bg-card);\n  border: 1px solid var(--line);\n  border-radius: var(--radius);\n  padding: 28px 30px;\n  margin-bottom: 22px;\n}\n.card-label {\n  font-size: 12px;\n  text-transform: uppercase;\n  letter-spacing: 0.1em;\n  color: var(--navy);\n  font-weight: 600;\n  margin-bottom: 8px;\n}\n.card h2 { font-size: 22px; color: var(--navy-deep); margin-bottom: 4px; }\n.card .sub { color: var(--ink-soft); font-size: 14px; margin-bottom: 18px; }\n\n.instructions {\n  background: var(--amber-bg);\n  border-left: 3px solid var(--amber);\n  padding: 12px 16px;\n  font-size: 14px;\n  color: #6B5009;\n  border-radius: var(--radius);\n  margin-bottom: 22px;\n}\n\n\/* ===== AUDIO PLAYER ===== *\/\n.audio-box {\n  background: #F3F4F0;\n  border: 1px solid var(--line);\n  border-radius: var(--radius);\n  padding: 18px 20px;\n  margin-bottom: 20px;\n}\n.audio-controls { display: flex; align-items: center; gap: 12px; margin-bottom: 10px; }\n.play-btn {\n  width: 42px; height: 42px;\n  border-radius: 50%;\n  background: var(--navy);\n  border: none;\n  color: #fff;\n  font-size: 16px;\n  cursor: pointer;\n  display: flex; align-items: center; justify-content: center;\n  flex-shrink: 0;\n}\n.play-btn:hover { background: var(--navy-deep); }\n.play-btn:disabled { background: #BBB; cursor: not-allowed; }\n.audio-meta { font-size: 13px; color: var(--ink-soft); flex: 1; }\n.audio-meta strong { color: var(--ink); }\n.play-count { font-size: 12px; color: var(--ink-soft); }\n.transcript-toggle {\n  font-size: 12.5px;\n  color: var(--navy);\n  cursor: pointer;\n  text-decoration: underline dotted;\n  background: none;\n  border: none;\n  padding: 0;\n  margin-top: 4px;\n}\n.transcript {\n  margin-top: 12px;\n  padding: 12px 14px;\n  background: #fff;\n  border: 1px dashed var(--line);\n  border-radius: var(--radius);\n  font-size: 14px;\n  color: var(--ink-soft);\n  font-style: italic;\n  display: none;\n  line-height: 1.6;\n}\n.transcript.show { display: block; }\n\n\/* ===== READING TEXT ===== *\/\n.reading-text {\n  font-family: 'Source Serif 4', serif;\n  font-size: 16.5px;\n  line-height: 1.75;\n  color: #2A2A24;\n  padding: 18px 22px;\n  background: #F6F6F1;\n  border-radius: var(--radius);\n  margin-bottom: 22px;\n  border: 1px solid var(--line);\n}\n\n\/* ===== QUESTIONS ===== *\/\n.question-block { margin-bottom: 22px; padding-bottom: 18px; border-bottom: 1px solid var(--line); }\n.question-block:last-child { border-bottom: none; }\n.q-text { font-weight: 600; margin-bottom: 10px; font-size: 15px; }\n.q-num { color: var(--navy); margin-right: 6px; }\n.options { display: flex; flex-direction: column; gap: 8px; }\n.option {\n  display: flex;\n  align-items: center;\n  gap: 10px;\n  padding: 10px 14px;\n  border: 1px solid var(--line);\n  border-radius: var(--radius);\n  cursor: pointer;\n  font-size: 14.5px;\n  transition: border-color 0.12s, background 0.12s;\n}\n.option:hover { border-color: var(--navy); background: #F6F8FA; }\n.option.selected { border-color: var(--navy); background: #EAF0F6; font-weight: 500; }\n.option.correct { border-color: var(--success); background: var(--success-bg); }\n.option.incorrect { border-color: var(--error); background: var(--error-bg); }\n.option input { accent-color: var(--navy); }\n\n.reveal-btn {\n  font-size: 12.5px;\n  color: var(--ink-soft);\n  background: #EEEEE6;\n  border: none;\n  padding: 5px 12px;\n  border-radius: var(--radius);\n  cursor: pointer;\n  margin-top: 4px;\n}\n.reveal-btn:hover { background: #E2E2D8; }\n\n\/* ===== GRAMMAR FILL ===== *\/\n.fill-q { font-size: 15px; margin-bottom: 10px; }\n.fill-q code { background: #F0F0E8; padding: 1px 4px; border-radius: 2px; }\n\n\/* ===== WRITTEN PRODUCTION ===== *\/\n.prompt-box {\n  background: #EFF3F7;\n  border: 1px solid #C9D7E3;\n  border-radius: var(--radius);\n  padding: 16px 18px;\n  margin-bottom: 18px;\n}\n.prompt-type { font-size: 12px; text-transform: uppercase; letter-spacing: 0.08em; color: var(--navy); font-weight: 600; margin-bottom: 6px; }\n.word-count { font-size: 13px; color: var(--ink-soft); margin-top: 8px; text-align: right; }\n.word-count.over { color: var(--error); font-weight: 600; }\n\ntextarea.essay {\n  width: 100%;\n  min-height: 280px;\n  font-family: 'Source Serif 4', serif;\n  font-size: 16px;\n  line-height: 1.6;\n  padding: 16px 18px;\n  border: 1px solid var(--line);\n  border-radius: var(--radius);\n  resize: vertical;\n  color: var(--ink);\n  background: #fff;\n}\ntextarea.essay:focus { outline: 2px solid var(--navy); outline-offset: 1px; }\n\n\/* Virtual keyboard *\/\n.vkb-toggle {\n  display: inline-flex;\n  align-items: center;\n  gap: 6px;\n  font-size: 13px;\n  color: var(--navy);\n  background: #fff;\n  border: 1px solid var(--navy);\n  padding: 7px 13px;\n  border-radius: var(--radius);\n  cursor: pointer;\n  margin: 10px 0;\n}\n.vkb-toggle:hover { background: #EAF0F6; }\n.vkb {\n  display: none;\n  margin-top: 10px;\n  padding: 14px;\n  background: #ECECE4;\n  border-radius: var(--radius);\n  border: 1px solid var(--line);\n}\n.vkb.show { display: block; }\n.vkb-row { display: flex; gap: 5px; margin-bottom: 5px; justify-content: center; }\n.vkb-key {\n  min-width: 36px;\n  height: 38px;\n  padding: 0 6px;\n  background: #fff;\n  border: 1px solid #CCCCC0;\n  border-radius: 4px;\n  font-size: 15px;\n  cursor: pointer;\n  font-family: 'Inter', sans-serif;\n  color: var(--ink);\n  box-shadow: 0 1px 0 rgba(0,0,0,0.06);\n}\n.vkb-key:hover { background: var(--navy); color: #fff; border-color: var(--navy); }\n.vkb-key:active { transform: translateY(1px); box-shadow: none; }\n.vkb-key.wide { min-width: 70px; font-size: 12px; }\n\n\/* ===== ORAL ===== *\/\n.oral-topic-list { display: flex; flex-direction: column; gap: 10px; margin-bottom: 20px; }\n.oral-topic {\n  padding: 14px 16px;\n  background: #F6F6F1;\n  border: 1px solid var(--line);\n  border-radius: var(--radius);\n  font-size: 15px;\n  cursor: pointer;\n}\n.oral-topic:hover { border-color: var(--navy); }\n.oral-topic.picked { border-color: var(--amber); background: var(--amber-bg); font-weight: 600; }\n.oral-stage {\n  text-align: center;\n  padding: 40px 20px;\n}\n.oral-stage .big-timer {\n  font-family: 'JetBrains Mono', monospace;\n  font-size: 56px;\n  font-weight: 500;\n  color: var(--navy-deep);\n  margin: 14px 0;\n}\n.oral-phase-label { font-size: 13px; text-transform: uppercase; letter-spacing: 0.1em; color: var(--ink-soft); }\n.oral-topic-display { font-family: 'Source Serif 4', serif; font-size: 19px; margin: 18px 0; color: var(--navy-deep); max-width: 500px; margin-left: auto; margin-right: auto; }\n.oral-plan-hint { font-size: 13px; color: var(--ink-soft); margin-top: 24px; text-align: left; background: #F6F6F1; padding: 14px 18px; border-radius: var(--radius); max-width: 460px; margin-left: auto; margin-right: auto; }\n\n\/* ===== FOOTER NAV ===== *\/\n.footer-nav {\n  display: flex;\n  justify-content: space-between;\n  align-items: center;\n  margin-top: 24px;\n  padding-top: 18px;\n}\n\n\/* ===== RESULTS ===== *\/\n.score-hero {\n  text-align: center;\n  padding: 36px 0;\n}\n.score-big {\n  font-family: 'Source Serif 4', serif;\n  font-size: 64px;\n  font-weight: 700;\n  color: var(--navy-deep);\n}\n.score-pass { color: var(--success); }\n.score-fail { color: var(--error); }\n.score-label { font-size: 14px; color: var(--ink-soft); text-transform: uppercase; letter-spacing: 0.08em; margin-top: 4px; }\n.breakdown { display: grid; gap: 10px; margin-top: 24px; }\n.breakdown-row {\n  display: flex;\n  justify-content: space-between;\n  align-items: center;\n  padding: 12px 16px;\n  background: #F6F6F1;\n  border-radius: var(--radius);\n  border: 1px solid var(--line);\n}\n.breakdown-row.fail-min { border-left: 3px solid var(--error); }\n.breakdown-row.pass-min { border-left: 3px solid var(--success); }\n.breakdown-name { font-weight: 600; font-size: 14.5px; }\n.breakdown-score { font-family: 'JetBrains Mono', monospace; font-size: 15px; }\n.breakdown-minscore { font-size: 12px; color: var(--ink-soft); margin-left: 8px; }\n\n.hidden { display: none !important; }\n\n@media (max-width: 600px) {\n  .masthead h1 { font-size: 26px; }\n  .card { padding: 20px 18px; }\n  .oral-stage .big-timer { font-size: 42px; }\n  .vkb-key { min-width: 28px; height: 34px; font-size: 13px; }\n}\n<\/style>\n<\/head>\n<body>\n\n<div class=\"topbar\">\n  <div class=\"topbar-inner\">\n    <div class=\"topbar-id\" id=\"topbarId\">B2 \u00b7 ALLINGUA FORMAT<\/div>\n    <div class=\"topbar-section\" id=\"topbarSection\">\u2014<\/div>\n    <div class=\"timer\" id=\"globalTimer\">--:--<\/div>\n  <\/div>\n<\/div>\n\n<div class=\"app\" id=\"app\"><\/div>\n\n<script>\n\/\/ ============================================================\n\/\/ DONN\u00c9ES DES SIMULATIONS 4, 5, 6 \u2014 NOUVEAUX TH\u00c8MES\n\/\/ Migration, num\u00e9risation, sant\u00e9 publique, t\u00e9l\u00e9travail\/\u00e9ducation\n\/\/ ============================================================\n\nconst EXAMS = [\n  \/\/ ============================================================\n  \/\/ SIMULATION 4 \u2014 Migration & Num\u00e9risation\n  \/\/ ============================================================\n  {\n    id: 4,\n    title: \"Simulation 4\",\n    listening: {\n      duration: 25 * 60,\n      maxScore: 15,\n      passages: [\n        {\n          title: \"Document 1 \u2014 Bulletin d'actualit\u00e9 : migration\",\n          script: \"Bonjour \u00e0 toutes et \u00e0 tous. \u00c0 la une de cette \u00e9dition : un nouveau rapport de l'Organisation internationale pour les migrations souligne l'\u00e9volution des flux migratoires en Europe au cours des cinq derni\u00e8res ann\u00e9es. Selon ce rapport, si le nombre total de demandes d'asile a globalement augment\u00e9, les profils des personnes concern\u00e9es se sont \u00e9galement diversifi\u00e9s, avec une part croissante de migrants qualifi\u00e9s cherchant \u00e0 s'int\u00e9grer sur le march\u00e9 du travail europ\u00e9en. Plusieurs pays ont ainsi r\u00e9vis\u00e9 leurs politiques d'accueil, en simplifiant notamment les proc\u00e9dures de reconnaissance des dipl\u00f4mes \u00e9trangers. Cette \u00e9volution est salu\u00e9e par certains \u00e9conomistes, qui rappellent que de nombreux secteurs, notamment la sant\u00e9 et la construction, souffrent d'une p\u00e9nurie de main-d'\u0153uvre. D'autres voix, en revanche, appellent \u00e0 la prudence, estimant que l'int\u00e9gration r\u00e9ussie des migrants n\u00e9cessite des investissements importants en mati\u00e8re de formation linguistique et d'accompagnement social, des investissements qui restent, selon elles, encore insuffisants dans plusieurs pays membres de l'Union.\",\n          questions: [\n            { q: \"Quel organisme a publi\u00e9 le rapport mentionn\u00e9 ?\", options: [\"L'Organisation internationale pour les migrations\", \"L'Organisation mondiale de la sant\u00e9\", \"La Commission europ\u00e9enne\"], correct: 0 },\n            { q: \"Comment les profils des migrants ont-ils \u00e9volu\u00e9 selon le rapport ?\", options: [\"Ils sont rest\u00e9s identiques\", \"Part croissante de migrants qualifi\u00e9s\", \"Diminution g\u00e9n\u00e9rale du nombre de migrants\"], correct: 1 },\n            { q: \"Qu'ont fait plusieurs pays concernant les dipl\u00f4mes \u00e9trangers ?\", options: [\"Ils ont supprim\u00e9 leur reconnaissance\", \"Ils ont simplifi\u00e9 les proc\u00e9dures de reconnaissance\", \"Ils n'ont rien chang\u00e9\"], correct: 1 },\n            { q: \"Quels secteurs souffrent d'une p\u00e9nurie de main-d'\u0153uvre selon le reportage ?\", options: [\"La sant\u00e9 et la construction\", \"Le tourisme uniquement\", \"L'agriculture uniquement\"], correct: 0 },\n            { q: \"Que r\u00e9clament certaines voix pour une int\u00e9gration r\u00e9ussie ?\", options: [\"Moins de contr\u00f4les aux fronti\u00e8res\", \"Des investissements en formation linguistique et accompagnement\", \"La suppression totale des aides sociales\"], correct: 1 },\n          ],\n        },\n        {\n          title: \"Document 2 \u2014 Interview : num\u00e9risation et fracture num\u00e9rique\",\n          script: \"Aujourd'hui, nous recevons un chercheur sp\u00e9cialiste des in\u00e9galit\u00e9s num\u00e9riques. Bonjour, merci d'\u00eatre avec nous. Bonjour, c'est un plaisir d'\u00eatre ici. La num\u00e9risation des services publics s'acc\u00e9l\u00e8re partout en Europe. Quels sont, selon vous, les principaux risques de cette \u00e9volution ? Le risque principal, c'est ce qu'on appelle la fracture num\u00e9rique. Lorsque les d\u00e9marches administratives deviennent exclusivement accessibles en ligne, on exclut de fait une partie de la population : les personnes \u00e2g\u00e9es, celles qui n'ont pas acc\u00e8s \u00e0 une connexion internet stable, ou encore celles qui ne ma\u00eetrisent pas suffisamment les outils num\u00e9riques. Avez-vous des exemples concrets de ces difficult\u00e9s ? Oui, par exemple, le renouvellement de certains documents administratifs, ou la prise de rendez-vous m\u00e9dicaux, deviennent parfois impossibles sans comp\u00e9tences num\u00e9riques de base. Cela cr\u00e9e une double exclusion, \u00e0 la fois sociale et num\u00e9rique. Quelles solutions pr\u00e9conisez-vous ? Il est essentiel de maintenir des points d'accueil physiques en parall\u00e8le de la d\u00e9mat\u00e9rialisation, ainsi que des formations gratuites pour accompagner les publics les plus fragiles dans cette transition.\",\n          questions: [\n            { q: \"Quelle est la sp\u00e9cialit\u00e9 du chercheur interview\u00e9 ?\", options: [\"Les in\u00e9galit\u00e9s num\u00e9riques\", \"L'\u00e9conomie internationale\", \"La sant\u00e9 publique\"], correct: 0 },\n            { q: \"Quel est le principal risque \u00e9voqu\u00e9 de la num\u00e9risation des services publics ?\", options: [\"La fracture num\u00e9rique\", \"L'augmentation des co\u00fbts\", \"La lenteur des proc\u00e9dures\"], correct: 0 },\n            { q: \"Qui est particuli\u00e8rement concern\u00e9 par cette exclusion num\u00e9rique ?\", options: [\"Les jeunes dipl\u00f4m\u00e9s\", \"Les personnes \u00e2g\u00e9es et celles sans acc\u00e8s internet stable\", \"Les fonctionnaires\"], correct: 1 },\n            { q: \"Quel exemple concret est donn\u00e9 ?\", options: [\"Le renouvellement de documents administratifs en ligne\", \"L'achat de billets de train\", \"La r\u00e9servation de restaurants\"], correct: 0 },\n            { q: \"Quelle solution le chercheur pr\u00e9conise-t-il ?\", options: [\"Supprimer totalement le num\u00e9rique\", \"Maintenir des points d'accueil physiques et des formations\", \"Rendre tout payant pour financer l'acc\u00e8s\"], correct: 1 },\n          ],\n        },\n        {\n          title: \"Document 3 \u2014 Reportage : int\u00e9gration des migrants par le travail\",\n          script: \"Nous sommes aujourd'hui dans un centre de formation professionnelle qui propose un programme sp\u00e9cifique destin\u00e9 aux personnes r\u00e9cemment arriv\u00e9es en France. Ce programme combine cours de langue intensifs et formation technique dans des secteurs en tension, comme la logistique ou les m\u00e9tiers du soin. La responsable du centre nous explique : Nous avons constat\u00e9 que l'apprentissage de la langue est beaucoup plus rapide et plus motivant lorsqu'il est directement li\u00e9 \u00e0 un objectif professionnel concret. Les participants suivent vingt heures de cours par semaine, et la majorit\u00e9 d'entre eux trouvent un emploi dans les six mois suivant la fin de la formation. Une participante, originaire de Syrie, t\u00e9moigne : Avant ce programme, je me sentais isol\u00e9e, je ne comprenais pas les d\u00e9marches administratives, je n'osais pas chercher de travail. Aujourd'hui, je travaille comme aide-soignante et je me sens enfin utile dans cette soci\u00e9t\u00e9. La responsable souligne toutefois que ce type de programme reste insuffisamment financ\u00e9 par rapport \u00e0 la demande, avec des listes d'attente de plusieurs mois dans certaines r\u00e9gions.\",\n          questions: [\n            { q: \"Que combine le programme de formation pr\u00e9sent\u00e9 ?\", options: [\"Cours de langue et formation technique\", \"Uniquement des cours de langue\", \"Uniquement de la formation technique\"], correct: 0 },\n            { q: \"Dans quels secteurs la formation technique est-elle propos\u00e9e ?\", options: [\"La finance et le droit\", \"La logistique et les m\u00e9tiers du soin\", \"L'informatique uniquement\"], correct: 1 },\n            { q: \"Combien d'heures de cours par semaine suivent les participants ?\", options: [\"10 heures\", \"20 heures\", \"35 heures\"], correct: 1 },\n            { q: \"Que fait la participante syrienne aujourd'hui ?\", options: [\"Elle est \u00e9tudiante\", \"Elle travaille comme aide-soignante\", \"Elle est sans emploi\"], correct: 1 },\n            { q: \"Quel probl\u00e8me la responsable souligne-t-elle \u00e0 la fin ?\", options: [\"Le programme est trop cher pour les participants\", \"Le financement est insuffisant, listes d'attente longues\", \"Le programme va \u00eatre supprim\u00e9\"], correct: 1 },\n          ],\n        },\n      ],\n    },\n    reading: {\n      duration: 25 * 60,\n      maxScore: 10,\n      texts: [\n        {\n          title: \"Texte 1 \u2014 Article de presse\",\n          content: \"La question migratoire continue de diviser l'opinion publique europ\u00e9enne, alors m\u00eame que les donn\u00e9es d\u00e9mographiques dessinent un tableau plus nuanc\u00e9 que ne le laissent penser les d\u00e9bats politiques. Selon plusieurs \u00e9tudes r\u00e9centes, le vieillissement de la population europ\u00e9enne et le d\u00e9clin de la natalit\u00e9 dans de nombreux pays membres rendent l'apport migratoire structurellement n\u00e9cessaire au maintien de certains \u00e9quilibres \u00e9conomiques, notamment en ce qui concerne le financement des syst\u00e8mes de retraite et la disponibilit\u00e9 de main-d'\u0153uvre dans des secteurs essentiels. Pourtant, cette r\u00e9alit\u00e9 statistique se heurte souvent \u00e0 des perceptions tr\u00e8s diff\u00e9rentes au sein de l'opinion publique, o\u00f9 les questions identitaires et culturelles occupent une place centrale dans le d\u00e9bat. Les chercheurs en sciences sociales soulignent par ailleurs que les politiques d'int\u00e9gration jouent un r\u00f4le d\u00e9terminant dans la r\u00e9ussite ou l'\u00e9chec de ces dynamiques migratoires : un acc\u00e8s rapide \u00e0 la formation linguistique, \u00e0 l'emploi et au logement favorise une int\u00e9gration durable, tandis que des politiques restrictives ou des d\u00e9lais administratifs excessifs peuvent au contraire favoriser la pr\u00e9carit\u00e9 et l'isolement social des personnes concern\u00e9es.\",\n          questions: [\n            { q: \"Que r\u00e9v\u00e8lent les donn\u00e9es d\u00e9mographiques selon le texte ?\", options: [\"Une croissance d\u00e9mographique forte en Europe\", \"Un vieillissement et un d\u00e9clin de la natalit\u00e9 rendant la migration n\u00e9cessaire\", \"Une absence de tout probl\u00e8me d\u00e9mographique\"], correct: 1 },\n            { q: \"Pourquoi l'apport migratoire est-il jug\u00e9 n\u00e9cessaire \u00e9conomiquement ?\", options: [\"Pour le financement des retraites et la main-d'\u0153uvre\", \"Pour augmenter les imp\u00f4ts\", \"Pour r\u00e9duire la population active\"], correct: 0 },\n            { q: \"Quelle place occupent les questions identitaires dans le d\u00e9bat public selon le texte ?\", options: [\"Une place marginale\", \"Une place centrale\", \"Aucune place\"], correct: 1 },\n            { q: \"Quel facteur favorise une int\u00e9gration durable selon les chercheurs ?\", options: [\"Des d\u00e9lais administratifs longs\", \"Un acc\u00e8s rapide \u00e0 la formation, l'emploi et le logement\", \"L'isolement social volontaire\"], correct: 1 },\n            { q: \"Que peuvent provoquer des politiques restrictives selon le texte ?\", options: [\"Une int\u00e9gration plus rapide\", \"La pr\u00e9carit\u00e9 et l'isolement social\", \"Aucun effet particulier\"], correct: 1 },\n          ],\n        },\n        {\n          title: \"Texte 2 \u2014 Rapport \/ document professionnel\",\n          content: \"Note de synth\u00e8se \u2014 Direction des syst\u00e8mes d'information. Objet : bilan de la transformation num\u00e9rique des services aux usagers. La pr\u00e9sente note dresse un \u00e9tat des lieux de la d\u00e9mat\u00e9rialisation des d\u00e9marches administratives mise en \u0153uvre au cours des deux derni\u00e8res ann\u00e9es au sein de notre administration. Au total, soixante-quinze pour cent des d\u00e9marches sont d\u00e9sormais accessibles en ligne, contre quarante pour cent il y a deux ans, ce qui repr\u00e9sente une progression significative en termes d'efficacit\u00e9 et de r\u00e9duction des d\u00e9lais de traitement. Toutefois, une enqu\u00eate de satisfaction men\u00e9e aupr\u00e8s des usagers r\u00e9v\u00e8le que vingt-deux pour cent d'entre eux d\u00e9clarent avoir rencontr\u00e9 des difficult\u00e9s importantes pour effectuer leurs d\u00e9marches en ligne, principalement en raison d'un manque de comp\u00e9tences num\u00e9riques ou d'un acc\u00e8s limit\u00e9 \u00e0 internet. Ce constat a conduit la direction \u00e0 maintenir, contrairement au plan initial, l'ensemble des points d'accueil physiques existants, et \u00e0 renforcer les permanences d'aide aux d\u00e9marches num\u00e9riques dans les zones rurales et aupr\u00e8s des publics \u00e2g\u00e9s. La direction recommande de poursuivre cette double approche, combinant d\u00e9mat\u00e9rialisation et accompagnement humain, plut\u00f4t que de viser une d\u00e9mat\u00e9rialisation int\u00e9grale \u00e0 court terme.\",\n          questions: [\n            { q: \"Quel pourcentage de d\u00e9marches est d\u00e9sormais accessible en ligne ?\", options: [\"40%\", \"55%\", \"75%\"], correct: 2 },\n            { q: \"Quel pourcentage d'usagers a rencontr\u00e9 des difficult\u00e9s importantes ?\", options: [\"12%\", \"22%\", \"35%\"], correct: 1 },\n            { q: \"Quelle est la principale cause de ces difficult\u00e9s ?\", options: [\"Manque de comp\u00e9tences num\u00e9riques ou d'acc\u00e8s internet\", \"Sites web trop simples\", \"Trop de personnel disponible\"], correct: 0 },\n            { q: \"Qu'a d\u00e9cid\u00e9 la direction concernant les points d'accueil physiques ?\", options: [\"Les supprimer totalement\", \"Les maintenir tous\", \"En supprimer la moiti\u00e9\"], correct: 1 },\n            { q: \"Que recommande la direction pour l'avenir ?\", options: [\"Une d\u00e9mat\u00e9rialisation int\u00e9grale imm\u00e9diate\", \"Combiner d\u00e9mat\u00e9rialisation et accompagnement humain\", \"Revenir au tout papier\"], correct: 1 },\n          ],\n        },\n      ],\n    },\n    grammar: {\n      duration: 20 * 60,\n      maxScore: 15,\n      sections: [\n        {\n          title: \"1. Subjonctif ou indicatif\",\n          items: [\n            { q: \"Il est n\u00e9cessaire que les autorit\u00e9s _______ (agir) rapidement.\", options: [\"agissent\", \"agiront\", \"agissaient\"], correct: 0 },\n            { q: \"Je suis convaincu que cette r\u00e9forme _______ (am\u00e9liorer) la situation.\", options: [\"am\u00e9liore\", \"am\u00e9liorera\", \"ait am\u00e9lior\u00e9\"], correct: 1 },\n            { q: \"Bien que la proc\u00e9dure _______ (sembler) complexe, elle reste accessible.\", options: [\"semble\", \"semblera\", \"semblait\"], correct: 0 },\n            { q: \"Il est probable que le nombre de demandes _______ (augmenter) encore.\", options: [\"augmente\", \"augmentera\", \"ait augment\u00e9\"], correct: 1 },\n            { q: \"Nous voulons que chaque candidat _______ (recevoir) une r\u00e9ponse claire.\", options: [\"re\u00e7oit\", \"re\u00e7oive\", \"recevra\"], correct: 1 },\n          ],\n        },\n        {\n          title: \"2. Pronoms relatifs\",\n          items: [\n            { q: \"C'est une d\u00e9marche _______ prend du temps.\", options: [\"qui\", \"que\", \"dont\"], correct: 0 },\n            { q: \"Le pays _______ elle est arriv\u00e9e l'an dernier l'a bien accueillie.\", options: [\"dont\", \"o\u00f9\", \"que\"], correct: 1 },\n            { q: \"Voici les documents _______ vous aurez besoin pour la demande.\", options: [\"que\", \"dont\", \"o\u00f9\"], correct: 1 },\n            { q: \"_______ inqui\u00e8te les autorit\u00e9s, c'est la lenteur des proc\u00e9dures.\", options: [\"Ce que\", \"Ce qui\", \"Ce dont\"], correct: 1 },\n            { q: \"Le formulaire \u00e0 partir _______ on d\u00e9pose une demande est en ligne.\", options: [\"duquel\", \"dont\", \"que\"], correct: 0 },\n          ],\n        },\n        {\n          title: \"3. Connecteurs logiques\",\n          items: [\n            { q: \"_______ les obstacles administratifs, elle a obtenu son titre de s\u00e9jour.\", options: [\"Malgr\u00e9\", \"Bien qu'\", \"Car\"], correct: 0 },\n            { q: \"Il a r\u00e9ussi son int\u00e9gration _______ il ne parlait pas la langue au d\u00e9part.\", options: [\"bien qu'\", \"car\", \"donc\"], correct: 0 },\n            { q: \"Elle suit des cours du soir _______ progresser plus vite.\", options: [\"afin de\", \"afin que\", \"parce que\"], correct: 0 },\n            { q: \"_______ vous ayez des difficult\u00e9s, contactez ce service d'aide.\", options: [\"Si\", \"Au cas o\u00f9\", \"Pourvu que\"], correct: 1 },\n            { q: \"Le dossier a \u00e9t\u00e9 refus\u00e9, _______ il manquait un document essentiel.\", options: [\"car\", \"donc\", \"or\"], correct: 0 },\n          ],\n        },\n        {\n          title: \"4. Voix passive et discours indirect\",\n          items: [\n            { q: \"\u00ab On a simplifi\u00e9 la proc\u00e9dure. \u00bb Forme passive :\", options: [\"La proc\u00e9dure a \u00e9t\u00e9 simplifi\u00e9e.\", \"La proc\u00e9dure simplifiait.\", \"La proc\u00e9dure sera simplifi\u00e9e.\"], correct: 0 },\n            { q: \"Il a dit : \u00ab Je d\u00e9poserai ma demande demain. \u00bb \u2192 Il a dit qu'_______\", options: [\"il d\u00e9posera sa demande demain.\", \"il d\u00e9poserait sa demande le lendemain.\", \"il a d\u00e9pos\u00e9 sa demande.\"], correct: 1 },\n            { q: \"Elle a demand\u00e9 : \u00ab Avez-vous tous les documents ? \u00bb \u2192 Elle a demand\u00e9 _______\", options: [\"si nous avions tous les documents.\", \"que nous ayons tous les documents.\", \"si nous aurons tous les documents.\"], correct: 0 },\n            { q: \"\u00ab Pr\u00e9sentez votre passeport ! \u00bb a-t-on dit. \u2192 On a dit _______\", options: [\"de pr\u00e9senter son passeport.\", \"qu'il pr\u00e9sente son passeport.\", \"de pr\u00e9sentant son passeport.\"], correct: 0 },\n            { q: \"Le dossier _______ examin\u00e9 par la commission la semaine prochaine. (passif)\", options: [\"sera\", \"aura \u00e9t\u00e9\", \"serait\"], correct: 0 },\n          ],\n        },\n        {\n          title: \"5. Pr\u00e9positions et verbes\",\n          items: [\n            { q: \"Cette mesure contribue _______ faciliter l'acc\u00e8s aux services.\", options: [\"\u00e0\", \"de\", \"pour\"], correct: 0 },\n            { q: \"Il s'agit _______ simplifier les d\u00e9marches administratives.\", options: [\"\u00e0\", \"de\", \"sur\"], correct: 1 },\n            { q: \"Les experts insistent _______ l'importance de la formation linguistique.\", options: [\"sur\", \"de\", \"\u00e0\"], correct: 0 },\n            { q: \"Le succ\u00e8s de l'int\u00e9gration d\u00e9pend _______ plusieurs facteurs.\", options: [\"\u00e0\", \"de\", \"sur\"], correct: 1 },\n            { q: \"L'administration s'engage _______ r\u00e9duire les d\u00e9lais de traitement.\", options: [\"\u00e0\", \"de\", \"pour\"], correct: 0 },\n          ],\n        },\n        {\n          title: \"6. Articles et accords\",\n          items: [\n            { q: \"_______ majorit\u00e9 des dossiers est trait\u00e9e en ligne.\", options: [\"La\", \"Une\", \"Des\"], correct: 0 },\n            { q: \"Elle a fait preuve _______ patience remarquable face aux d\u00e9marches.\", options: [\"la\", \"une\", \"de la\"], correct: 1 },\n            { q: \"Ce sont _______ proc\u00e9dures particuli\u00e8rement longues.\", options: [\"les\", \"des\", \"de\"], correct: 1 },\n            { q: \"Il reste attentif _______ besoins des usagers les plus fragiles.\", options: [\"les\", \"aux\", \"des\"], correct: 1 },\n            { q: \"_______ situations n'avaient jamais \u00e9t\u00e9 observ\u00e9es avant la r\u00e9forme.\", options: [\"De telles\", \"Les\", \"Des\"], correct: 0 },\n          ],\n        },\n      ],\n    },\n    written: {\n      duration: 40 * 60,\n      maxScore: 30,\n      prompts: [\n        { type: \"Sujet argumentatif\", text: \"La num\u00e9risation des services publics doit-elle s'accompagner du maintien de points d'accueil physiques ? Justifiez votre point de vue. (200 mots maximum)\" },\n        { type: \"Sujet cr\u00e9atif\", text: \"Racontez le t\u00e9moignage, r\u00e9el ou imaginaire, d'une personne qui a d\u00fb s'adapter \u00e0 un nouveau pays ou \u00e0 une nouvelle technologie. (200 mots maximum)\" },\n      ],\n    },\n    oral: {\n      duration: 10 * 60,\n      maxScore: 30,\n      topics: [\n        \"L'immigration est-elle une n\u00e9cessit\u00e9 \u00e9conomique pour l'Europe ?\",\n        \"La num\u00e9risation des services publics risque-t-elle d'exclure certains citoyens ?\",\n        \"Quelles politiques favorisent, selon vous, une int\u00e9gration r\u00e9ussie des migrants ?\",\n      ],\n    },\n  },\n\n  \/\/ ============================================================\n  \/\/ SIMULATION 5 \u2014 Sant\u00e9 publique\n  \/\/ ============================================================\n  {\n    id: 5,\n    title: \"Simulation 5\",\n    listening: {\n      duration: 25 * 60,\n      maxScore: 15,\n      passages: [\n        {\n          title: \"Document 1 \u2014 Bulletin d'actualit\u00e9 : sant\u00e9 publique\",\n          script: \"Bonjour \u00e0 tous, voici les titres du jour. Les autorit\u00e9s sanitaires europ\u00e9ennes alertent sur une hausse pr\u00e9occupante des maladies chroniques li\u00e9es au mode de vie, notamment le diab\u00e8te de type deux et les maladies cardiovasculaires. Selon les derniers chiffres publi\u00e9s, ces pathologies repr\u00e9senteraient d\u00e9sormais plus de soixante pour cent des d\u00e9c\u00e8s \u00e9vitables sur le continent. Plusieurs facteurs sont point\u00e9s du doigt par les experts : la s\u00e9dentarit\u00e9 croissante, une alimentation d\u00e9s\u00e9quilibr\u00e9e, et l'exposition prolong\u00e9e au stress chronique. Face \u00e0 ce constat, certains gouvernements envisagent de renforcer les campagnes de pr\u00e9vention, notamment aupr\u00e8s des jeunes publics, et d'introduire une taxation plus stricte sur les produits ultra-transform\u00e9s. Ces mesures sont toutefois critiqu\u00e9es par certains repr\u00e9sentants de l'industrie agroalimentaire, qui estiment qu'elles p\u00e9nalisent injustement les consommateurs aux revenus modestes, pour qui ces produits restent souvent les plus accessibles financi\u00e8rement. Le d\u00e9bat sur l'\u00e9quilibre entre pr\u00e9vention sanitaire et libert\u00e9 de consommation devrait occuper une place importante dans les prochains d\u00e9bats parlementaires.\",\n          questions: [\n            { q: \"Quelles maladies sont en hausse selon le bulletin ?\", options: [\"Les maladies infectieuses\", \"Le diab\u00e8te de type deux et les maladies cardiovasculaires\", \"Les maladies rares uniquement\"], correct: 1 },\n            { q: \"Quel pourcentage des d\u00e9c\u00e8s \u00e9vitables ces pathologies repr\u00e9senteraient-elles ?\", options: [\"30%\", \"60%\", \"90%\"], correct: 1 },\n            { q: \"Quels facteurs sont point\u00e9s du doigt par les experts ?\", options: [\"S\u00e9dentarit\u00e9, alimentation d\u00e9s\u00e9quilibr\u00e9e, stress chronique\", \"Uniquement le tabac\", \"Uniquement la pollution\"], correct: 0 },\n            { q: \"Que pr\u00e9voient certains gouvernements ?\", options: [\"Supprimer toute pr\u00e9vention\", \"Renforcer la pr\u00e9vention et taxer les produits ultra-transform\u00e9s\", \"Ignorer le probl\u00e8me\"], correct: 1 },\n            { q: \"Pourquoi ces mesures sont-elles critiqu\u00e9es par certains ?\", options: [\"Elles co\u00fbtent trop cher \u00e0 l'\u00c9tat\", \"Elles p\u00e9nalisent les consommateurs aux revenus modestes\", \"Elles sont inefficaces scientifiquement\"], correct: 1 },\n          ],\n        },\n        {\n          title: \"Document 2 \u2014 Interview : acc\u00e8s aux soins\",\n          script: \"Notre invit\u00e9e aujourd'hui est m\u00e9decin g\u00e9n\u00e9raliste, install\u00e9e depuis dix ans dans une zone rurale. Bonjour docteur, merci d'\u00eatre avec nous. Bonjour, merci \u00e0 vous. Pouvez-vous nous d\u00e9crire la situation de l'acc\u00e8s aux soins dans les zones rurales aujourd'hui ? La situation est pr\u00e9occupante. De nombreux villages se trouvent d\u00e9sormais \u00e0 plus de trente minutes du m\u00e9decin le plus proche, et certaines sp\u00e9cialit\u00e9s m\u00e9dicales sont quasiment inaccessibles sans se d\u00e9placer vers les grandes villes. Cela touche particuli\u00e8rement les personnes \u00e2g\u00e9es et celles qui n'ont pas de moyen de transport personnel. Quelles solutions voyez-vous se d\u00e9velopper ? La t\u00e9l\u00e9consultation s'est beaucoup d\u00e9velopp\u00e9e, notamment depuis la pand\u00e9mie, et elle permet de pallier en partie ce manque, en particulier pour le suivi de pathologies chroniques. Cependant, elle ne peut pas remplacer enti\u00e8rement une consultation physique, surtout pour les examens n\u00e9cessitant un contact direct. Certaines collectivit\u00e9s locales ont \u00e9galement mis en place des maisons de sant\u00e9 pluridisciplinaires, regroupant plusieurs professionnels au m\u00eame endroit, ce qui facilite l'acc\u00e8s aux soins. Quel serait, selon vous, le levier le plus efficace pour am\u00e9liorer durablement la situation ? Il faudrait surtout revoir les incitations \u00e0 l'installation des jeunes m\u00e9decins en zone rurale, car beaucoup pr\u00e9f\u00e8rent aujourd'hui s'installer en ville, o\u00f9 les conditions de travail sont jug\u00e9es plus attractives.\",\n          questions: [\n            { q: \"Depuis combien de temps la m\u00e9decin est-elle install\u00e9e en zone rurale ?\", options: [\"Cinq ans\", \"Dix ans\", \"Vingt ans\"], correct: 1 },\n            { q: \"Qui est particuli\u00e8rement touch\u00e9 par le manque d'acc\u00e8s aux soins ?\", options: [\"Les personnes \u00e2g\u00e9es sans moyen de transport\", \"Les jeunes actifs uniquement\", \"Les touristes\"], correct: 0 },\n            { q: \"Quelle solution s'est d\u00e9velopp\u00e9e depuis la pand\u00e9mie ?\", options: [\"La t\u00e9l\u00e9consultation\", \"La fermeture des cabinets\", \"Les visites \u00e0 domicile uniquement\"], correct: 0 },\n            { q: \"Quelle limite a la t\u00e9l\u00e9consultation selon la m\u00e9decin ?\", options: [\"Elle est trop ch\u00e8re\", \"Elle ne remplace pas une consultation physique pour certains examens\", \"Elle n'existe pas en zone rurale\"], correct: 1 },\n            { q: \"Quel levier la m\u00e9decin juge-t-elle le plus efficace ?\", options: [\"Revoir les incitations \u00e0 l'installation des jeunes m\u00e9decins en zone rurale\", \"Construire plus d'h\u00f4pitaux en ville\", \"R\u00e9duire le nombre de m\u00e9decins\"], correct: 0 },\n          ],\n        },\n        {\n          title: \"Document 3 \u2014 Reportage : sant\u00e9 mentale au travail\",\n          script: \"Nous nous int\u00e9ressons aujourd'hui \u00e0 la question de la sant\u00e9 mentale au travail, un sujet de plus en plus pr\u00e9sent dans les entreprises europ\u00e9ennes. Selon une \u00e9tude r\u00e9cente, pr\u00e8s d'un salari\u00e9 sur trois d\u00e9clare avoir ressenti des signes d'\u00e9puisement professionnel au cours de l'ann\u00e9e \u00e9coul\u00e9e. Face \u00e0 ce constat, plusieurs entreprises ont mis en place des dispositifs sp\u00e9cifiques. Nous avons rencontr\u00e9 la responsable des ressources humaines d'une entreprise pionni\u00e8re sur le sujet. Nous avons instaur\u00e9 des entretiens r\u00e9guliers avec un psychologue du travail, accessibles gratuitement et de mani\u00e8re confidentielle, explique-t-elle. Nous avons \u00e9galement form\u00e9 l'ensemble de nos managers \u00e0 rep\u00e9rer les signes avant-coureurs de l'\u00e9puisement professionnel chez leurs \u00e9quipes. Un salari\u00e9 ayant b\u00e9n\u00e9fici\u00e9 de ce dispositif t\u00e9moigne : J'\u00e9tais au bord du burn-out sans m\u00eame m'en rendre compte. Le fait de pouvoir en parler rapidement \u00e0 un professionnel m'a permis de r\u00e9agir avant que la situation ne devienne incontr\u00f4lable. La responsable reconna\u00eet cependant que ces dispositifs restent encore minoritaires, en particulier dans les petites et moyennes entreprises, qui manquent souvent de moyens pour les mettre en place.\",\n          questions: [\n            { q: \"Quelle proportion de salari\u00e9s d\u00e9clare avoir ressenti des signes d'\u00e9puisement professionnel ?\", options: [\"Un sur dix\", \"Un sur trois\", \"Un sur deux\"], correct: 1 },\n            { q: \"Quel dispositif l'entreprise a-t-elle mis en place ?\", options: [\"Des entretiens gratuits avec un psychologue du travail\", \"Une r\u00e9duction du temps de travail pour tous\", \"Rien de particulier\"], correct: 0 },\n            { q: \"Qu'ont re\u00e7u les managers comme formation ?\", options: [\"Formation \u00e0 la gestion financi\u00e8re\", \"Formation \u00e0 rep\u00e9rer les signes d'\u00e9puisement professionnel\", \"Formation en informatique\"], correct: 1 },\n            { q: \"Que dit le salari\u00e9 t\u00e9moignant ?\", options: [\"Il n'a jamais eu de probl\u00e8me\", \"Il \u00e9tait au bord du burn-out sans s'en rendre compte\", \"Il a quitt\u00e9 l'entreprise\"], correct: 1 },\n            { q: \"Quelle limite la responsable RH reconna\u00eet-elle ?\", options: [\"Ces dispositifs sont obligatoires partout\", \"Ces dispositifs restent minoritaires, surtout en PME\", \"Ces dispositifs sont trop chers m\u00eame pour les grandes entreprises\"], correct: 1 },\n          ],\n        },\n      ],\n    },\n    reading: {\n      duration: 25 * 60,\n      maxScore: 10,\n      texts: [\n        {\n          title: \"Texte 1 \u2014 Article de presse\",\n          content: \"Le vieillissement de la population europ\u00e9enne pose des d\u00e9fis croissants aux syst\u00e8mes de sant\u00e9 publique, contraints de s'adapter \u00e0 une demande de soins en constante augmentation, notamment pour la prise en charge des maladies chroniques et de la d\u00e9pendance. Selon les projections d\u00e9mographiques, la part des personnes \u00e2g\u00e9es de plus de soixante-cinq ans devrait atteindre pr\u00e8s de trente pour cent de la population europ\u00e9enne d'ici deux mille cinquante, contre environ vingt pour cent actuellement. Cette \u00e9volution soul\u00e8ve des questions majeures quant au financement futur des syst\u00e8mes de protection sociale, d\u00e9j\u00e0 fortement sollicit\u00e9s. Plusieurs pays explorent des pistes telles que le d\u00e9veloppement du maintien \u00e0 domicile des personnes \u00e2g\u00e9es, jug\u00e9 \u00e0 la fois plus humain et moins co\u00fbteux que l'h\u00e9bergement en \u00e9tablissement sp\u00e9cialis\u00e9, ou encore l'investissement dans des technologies de t\u00e9l\u00e9surveillance m\u00e9dicale permettant un suivi \u00e0 distance plus efficace. Ces solutions, bien qu'encourageantes, n\u00e9cessitent toutefois des investissements initiaux importants et une r\u00e9organisation profonde des m\u00e9tiers du soin, qui font d\u00e9j\u00e0 face \u00e0 une p\u00e9nurie significative de personnel qualifi\u00e9 dans de nombreux pays europ\u00e9ens.\",\n          questions: [\n            { q: \"Quelle \u00e9volution d\u00e9mographique est annonc\u00e9e pour 2050 ?\", options: [\"Baisse de la part des personnes \u00e2g\u00e9es\", \"Hausse \u00e0 environ 30% de personnes de plus de 65 ans\", \"Stabilit\u00e9 compl\u00e8te\"], correct: 1 },\n            { q: \"Quel d\u00e9fi cette \u00e9volution pose-t-elle ?\", options: [\"Le financement des syst\u00e8mes de protection sociale\", \"La baisse de la demande de soins\", \"Aucun d\u00e9fi particulier\"], correct: 0 },\n            { q: \"Quelle piste est explor\u00e9e pour les personnes \u00e2g\u00e9es ?\", options: [\"Le maintien \u00e0 domicile\", \"La suppression des aides\", \"L'augmentation des hospitalisations\"], correct: 0 },\n            { q: \"Quelle technologie est mentionn\u00e9e pour le suivi \u00e0 distance ?\", options: [\"La t\u00e9l\u00e9surveillance m\u00e9dicale\", \"Les drones de livraison\", \"L'intelligence artificielle g\u00e9n\u00e9rale\"], correct: 0 },\n            { q: \"Quel probl\u00e8me ces solutions rencontrent-elles ?\", options: [\"Elles sont trop simples \u00e0 mettre en place\", \"Investissements importants et p\u00e9nurie de personnel qualifi\u00e9\", \"Aucun probl\u00e8me, tout est d\u00e9j\u00e0 r\u00e9solu\"], correct: 1 },\n          ],\n        },\n        {\n          title: \"Texte 2 \u2014 Rapport \/ document professionnel\",\n          content: \"Rapport annuel \u2014 Service de sant\u00e9 au travail. Objet : synth\u00e8se des risques psychosociaux identifi\u00e9s sur l'exercice \u00e9coul\u00e9. Le pr\u00e9sent rapport pr\u00e9sente les r\u00e9sultats de l'enqu\u00eate annuelle men\u00e9e aupr\u00e8s des salari\u00e9s de notre groupe concernant les risques psychosociaux. Sur les trois mille deux cents salari\u00e9s ayant r\u00e9pondu \u00e0 l'enqu\u00eate, vingt-huit pour cent d\u00e9clarent ressentir un niveau de stress \u00e9lev\u00e9 de mani\u00e8re r\u00e9guli\u00e8re, une proportion en l\u00e9g\u00e8re hausse par rapport \u00e0 l'exercice pr\u00e9c\u00e9dent. Les principaux facteurs identifi\u00e9s sont la surcharge de travail, ressentie par quarante-cinq pour cent des r\u00e9pondants, ainsi que le manque de reconnaissance professionnelle, cit\u00e9 par trente-deux pour cent d'entre eux. Le service de sant\u00e9 au travail a mis en place, au cours de l'ann\u00e9e, plusieurs actions correctives, notamment un renforcement des effectifs dans les services identifi\u00e9s comme les plus sous tension, ainsi qu'une formation des managers \u00e0 la pr\u00e9vention des risques psychosociaux. Ces mesures ont permis une l\u00e9g\u00e8re am\u00e9lioration sur certains indicateurs, mais le rapport recommande de poursuivre ces efforts, en accordant une attention particuli\u00e8re aux nouveaux salari\u00e9s, statistiquement plus vuln\u00e9rables durant leur premi\u00e8re ann\u00e9e dans l'entreprise.\",\n          questions: [\n            { q: \"Combien de salari\u00e9s ont r\u00e9pondu \u00e0 l'enqu\u00eate ?\", options: [\"1200\", \"3200\", \"5200\"], correct: 1 },\n            { q: \"Quel pourcentage d\u00e9clare un niveau de stress \u00e9lev\u00e9 r\u00e9gulier ?\", options: [\"18%\", \"28%\", \"48%\"], correct: 1 },\n            { q: \"Quel est le principal facteur de stress identifi\u00e9 ?\", options: [\"La surcharge de travail\", \"Le manque d'espace de bureau\", \"Les trajets domicile-travail\"], correct: 0 },\n            { q: \"Quelle action corrective a \u00e9t\u00e9 mise en place ?\", options: [\"Renforcement des effectifs dans les services sous tension\", \"Suppression des cong\u00e9s\", \"R\u00e9duction des salaires\"], correct: 0 },\n            { q: \"Qui le rapport identifie-t-il comme particuli\u00e8rement vuln\u00e9rable ?\", options: [\"Les nouveaux salari\u00e9s durant leur premi\u00e8re ann\u00e9e\", \"Les salari\u00e9s proches de la retraite\", \"Les cadres dirigeants uniquement\"], correct: 0 },\n          ],\n        },\n      ],\n    },\n    grammar: {\n      duration: 20 * 60,\n      maxScore: 15,\n      sections: [\n        {\n          title: \"1. Subjonctif ou indicatif\",\n          items: [\n            { q: \"Il est essentiel que chacun _______ (avoir) acc\u00e8s aux soins de base.\", options: [\"a\", \"ait\", \"aura\"], correct: 1 },\n            { q: \"Je pense que cette campagne de pr\u00e9vention _______ (\u00eatre) utile.\", options: [\"soit\", \"est\", \"sera\"], correct: 1 },\n            { q: \"Bien que les d\u00e9lais _______ (rester) longs, la situation s'am\u00e9liore.\", options: [\"restent\", \"resteront\", \"restaient\"], correct: 0 },\n            { q: \"Il est clair que le vieillissement de la population _______ (poser) probl\u00e8me.\", options: [\"pose\", \"posera\", \"ait pos\u00e9\"], correct: 0 },\n            { q: \"Nous souhaitons que ce dispositif _______ (pouvoir) \u00eatre \u00e9tendu.\", options: [\"peut\", \"puisse\", \"pourra\"], correct: 1 },\n          ],\n        },\n        {\n          title: \"2. Pronoms relatifs\",\n          items: [\n            { q: \"C'est un probl\u00e8me _______ touche de nombreux pays.\", options: [\"qui\", \"que\", \"dont\"], correct: 0 },\n            { q: \"La r\u00e9gion _______ elle exerce manque de m\u00e9decins.\", options: [\"dont\", \"o\u00f9\", \"que\"], correct: 1 },\n            { q: \"Voici les ressources _______ nous avons besoin.\", options: [\"que\", \"dont\", \"o\u00f9\"], correct: 1 },\n            { q: \"_______ pr\u00e9occupe les experts, c'est la p\u00e9nurie de personnel.\", options: [\"Ce que\", \"Ce qui\", \"Ce dont\"], correct: 1 },\n            { q: \"Le dispositif sur _______ ils comptent n'est pas encore financ\u00e9.\", options: [\"lequel\", \"dont\", \"que\"], correct: 0 },\n          ],\n        },\n        {\n          title: \"3. Connecteurs logiques\",\n          items: [\n            { q: \"_______ les efforts des autorit\u00e9s, le syst\u00e8me reste fragile.\", options: [\"Malgr\u00e9\", \"Bien qu'\", \"Car\"], correct: 0 },\n            { q: \"Elle a accept\u00e9 ce poste _______ les conditions \u00e9taient difficiles.\", options: [\"bien que\", \"car\", \"donc\"], correct: 0 },\n            { q: \"Le service a \u00e9t\u00e9 renforc\u00e9 _______ r\u00e9duire les d\u00e9lais d'attente.\", options: [\"afin de\", \"afin que\", \"parce que\"], correct: 0 },\n            { q: \"_______ vous ressentiez du stress, n'h\u00e9sitez pas \u00e0 consulter.\", options: [\"Si\", \"Au cas o\u00f9\", \"Pourvu que\"], correct: 1 },\n            { q: \"La consultation a \u00e9t\u00e9 annul\u00e9e, _______ le m\u00e9decin \u00e9tait absent.\", options: [\"car\", \"donc\", \"or\"], correct: 0 },\n          ],\n        },\n        {\n          title: \"4. Voix passive et discours indirect\",\n          items: [\n            { q: \"\u00ab On a renforc\u00e9 les effectifs. \u00bb Forme passive :\", options: [\"Les effectifs ont \u00e9t\u00e9 renforc\u00e9s.\", \"Les effectifs renfor\u00e7aient.\", \"Les effectifs seront renforc\u00e9s.\"], correct: 0 },\n            { q: \"Il a dit : \u00ab Je consulterai un sp\u00e9cialiste. \u00bb \u2192 Il a dit qu'_______\", options: [\"il consultera un sp\u00e9cialiste.\", \"il consulterait un sp\u00e9cialiste.\", \"il a consult\u00e9 un sp\u00e9cialiste.\"], correct: 1 },\n            { q: \"Elle a demand\u00e9 : \u00ab Avez-vous des sympt\u00f4mes ? \u00bb \u2192 Elle a demand\u00e9 _______\", options: [\"si nous avions des sympt\u00f4mes.\", \"que nous ayons des sympt\u00f4mes.\", \"si nous aurons des sympt\u00f4mes.\"], correct: 0 },\n            { q: \"\u00ab Prenez du repos ! \u00bb a dit le m\u00e9decin. \u2192 Le m\u00e9decin a dit _______\", options: [\"de prendre du repos.\", \"qu'il prenne du repos.\", \"de prenant du repos.\"], correct: 0 },\n            { q: \"De nouvelles mesures _______ annonc\u00e9es la semaine prochaine. (passif)\", options: [\"seront\", \"auront \u00e9t\u00e9\", \"seraient\"], correct: 0 },\n          ],\n        },\n        {\n          title: \"5. Pr\u00e9positions et verbes\",\n          items: [\n            { q: \"Le stress chronique contribue _______ aggraver certaines maladies.\", options: [\"\u00e0\", \"de\", \"pour\"], correct: 0 },\n            { q: \"Il s'agit _______ pr\u00e9venir plut\u00f4t que de gu\u00e9rir.\", options: [\"\u00e0\", \"de\", \"sur\"], correct: 1 },\n            { q: \"Les m\u00e9decins insistent _______ l'importance du suivi r\u00e9gulier.\", options: [\"sur\", \"de\", \"\u00e0\"], correct: 0 },\n            { q: \"La gu\u00e9rison d\u00e9pend _______ plusieurs facteurs individuels.\", options: [\"\u00e0\", \"de\", \"sur\"], correct: 1 },\n            { q: \"L'h\u00f4pital s'engage _______ r\u00e9duire les temps d'attente.\", options: [\"\u00e0\", \"de\", \"pour\"], correct: 0 },\n          ],\n        },\n        {\n          title: \"6. Articles et accords\",\n          items: [\n            { q: \"_______ majorit\u00e9 des patients est satisfaite du suivi.\", options: [\"La\", \"Une\", \"Des\"], correct: 0 },\n            { q: \"Le personnel a fait preuve _______ d\u00e9vouement remarquable.\", options: [\"le\", \"un\", \"du\"], correct: 1 },\n            { q: \"Ce sont _______ d\u00e9cisions difficiles \u00e0 prendre en urgence.\", options: [\"les\", \"des\", \"de\"], correct: 1 },\n            { q: \"Elle reste attentive _______ besoins de ses patients.\", options: [\"les\", \"aux\", \"des\"], correct: 1 },\n            { q: \"_______ cas n'avaient jamais \u00e9t\u00e9 recens\u00e9s dans cette r\u00e9gion.\", options: [\"De tels\", \"Les\", \"Des\"], correct: 0 },\n          ],\n        },\n      ],\n    },\n    written: {\n      duration: 40 * 60,\n      maxScore: 30,\n      prompts: [\n        { type: \"Sujet argumentatif\", text: \"Faut-il taxer davantage les produits alimentaires jug\u00e9s mauvais pour la sant\u00e9 afin de financer la pr\u00e9vention ? Donnez votre avis. (200 mots maximum)\" },\n        { type: \"Sujet cr\u00e9atif\", text: \"D\u00e9crivez une journ\u00e9e dans la vie d'un m\u00e9decin exer\u00e7ant dans une zone rurale isol\u00e9e. (200 mots maximum)\" },\n      ],\n    },\n    oral: {\n      duration: 10 * 60,\n      maxScore: 30,\n      topics: [\n        \"Comment expliquez-vous la hausse des maladies chroniques li\u00e9es au mode de vie ?\",\n        \"La t\u00e9l\u00e9consultation peut-elle r\u00e9ellement r\u00e9soudre le probl\u00e8me de l'acc\u00e8s aux soins en zone rurale ?\",\n        \"Les entreprises devraient-elles \u00eatre davantage responsables de la sant\u00e9 mentale de leurs salari\u00e9s ?\",\n      ],\n    },\n  },\n\n  \/\/ ============================================================\n  \/\/ SIMULATION 6 \u2014 T\u00e9l\u00e9travail & \u00c9ducation\n  \/\/ ============================================================\n  {\n    id: 6,\n    title: \"Simulation 6\",\n    listening: {\n      duration: 25 * 60,\n      maxScore: 15,\n      passages: [\n        {\n          title: \"Document 1 \u2014 Bulletin d'actualit\u00e9 : t\u00e9l\u00e9travail\",\n          script: \"Bonjour \u00e0 tous, voici votre point d'actualit\u00e9 \u00e9conomique et sociale. Une \u00e9tude europ\u00e9enne publi\u00e9e cette semaine r\u00e9v\u00e8le que pr\u00e8s de la moiti\u00e9 des entreprises du secteur tertiaire ont d\u00e9sormais adopt\u00e9 un mod\u00e8le de travail hybride de mani\u00e8re permanente, combinant pr\u00e9sence au bureau et t\u00e9l\u00e9travail. Cette g\u00e9n\u00e9ralisation s'accompagne toutefois de nouveaux d\u00e9fis pour les directions des ressources humaines. Selon l'\u00e9tude, soixante pour cent des managers interrog\u00e9s d\u00e9clarent rencontrer des difficult\u00e9s \u00e0 \u00e9valuer \u00e9quitablement la performance de leurs \u00e9quipes lorsque celles-ci travaillent partiellement \u00e0 distance. Par ailleurs, plusieurs syndicats alertent sur un risque de surcharge de travail invisible, les salari\u00e9s en t\u00e9l\u00e9travail ayant tendance, selon eux, \u00e0 r\u00e9pondre aux messages professionnels en dehors des horaires habituels. Face \u00e0 ces constats, certains pays europ\u00e9ens envisagent de renforcer le droit \u00e0 la d\u00e9connexion, d\u00e9j\u00e0 inscrit dans la loi de plusieurs \u00c9tats membres, mais dont l'application concr\u00e8te reste, selon les syndicats, largement insuffisante.\",\n          questions: [\n            { q: \"Quel mod\u00e8le de travail s'est g\u00e9n\u00e9ralis\u00e9 selon l'\u00e9tude ?\", options: [\"Le t\u00e9l\u00e9travail \u00e0 temps complet\", \"Le mod\u00e8le hybride\", \"Le retour total au bureau\"], correct: 1 },\n            { q: \"Quelle difficult\u00e9 rencontrent les managers selon l'\u00e9tude ?\", options: [\"\u00c9valuer \u00e9quitablement la performance \u00e0 distance\", \"Recruter de nouveaux employ\u00e9s\", \"Payer les salaires\"], correct: 0 },\n            { q: \"Quel risque les syndicats d\u00e9noncent-ils ?\", options: [\"Une baisse g\u00e9n\u00e9rale des salaires\", \"Une surcharge de travail invisible\", \"Une diminution du nombre d'emplois\"], correct: 1 },\n            { q: \"Quel droit certains pays envisagent-ils de renforcer ?\", options: [\"Le droit \u00e0 la d\u00e9connexion\", \"Le droit aux cong\u00e9s pay\u00e9s\", \"Le droit de gr\u00e8ve\"], correct: 0 },\n            { q: \"Comment les syndicats jugent-ils l'application actuelle de ce droit ?\", options: [\"Parfaitement satisfaisante\", \"Largement insuffisante\", \"Inexistante dans tous les pays\"], correct: 1 },\n          ],\n        },\n        {\n          title: \"Document 2 \u2014 Interview : \u00e9ducation et num\u00e9rique\",\n          script: \"Notre invit\u00e9e aujourd'hui est enseignante-chercheuse sp\u00e9cialis\u00e9e dans les usages du num\u00e9rique en \u00e9ducation. Bonjour, merci d'\u00eatre avec nous. Bonjour, merci de votre invitation. Le num\u00e9rique occupe une place croissante dans les salles de classe. Quel bilan peut-on en tirer aujourd'hui ? Le bilan est nuanc\u00e9. D'un c\u00f4t\u00e9, les outils num\u00e9riques permettent une plus grande personnalisation des apprentissages, notamment pour les \u00e9l\u00e8ves en difficult\u00e9, qui peuvent avancer \u00e0 leur propre rythme gr\u00e2ce \u00e0 des exercices adaptatifs. De l'autre, on observe des effets moins positifs, notamment sur la capacit\u00e9 de concentration des \u00e9l\u00e8ves, fortement sollicit\u00e9e par ailleurs par les \u00e9crans en dehors de l'\u00e9cole. Avez-vous des recommandations \u00e0 formuler ? Je pense qu'il est essentiel de conserver un \u00e9quilibre, en r\u00e9servant certains apprentissages fondamentaux, comme la lecture et l'\u00e9criture manuscrite, \u00e0 des supports traditionnels, tout en int\u00e9grant le num\u00e9rique de mani\u00e8re cibl\u00e9e pour des usages o\u00f9 il apporte une r\u00e9elle valeur ajout\u00e9e, comme la recherche d'information ou le travail collaboratif. Comment les enseignants vivent-ils cette transition ? C'est in\u00e9gal. Certains se sont form\u00e9s rapidement et s'en servent efficacement, tandis que d'autres se sentent d\u00e9pass\u00e9s, faute de formation suffisante, ce qui cr\u00e9e des disparit\u00e9s importantes entre \u00e9tablissements.\",\n          questions: [\n            { q: \"Quelle est la sp\u00e9cialit\u00e9 de l'enseignante-chercheuse ?\", options: [\"Les usages du num\u00e9rique en \u00e9ducation\", \"L'histoire de l'art\", \"Les langues \u00e9trang\u00e8res\"], correct: 0 },\n            { q: \"Quel avantage du num\u00e9rique est mentionn\u00e9 pour les \u00e9l\u00e8ves en difficult\u00e9 ?\", options: [\"Une personnalisation des apprentissages\", \"Une suppression totale des notes\", \"Moins de devoirs\"], correct: 0 },\n            { q: \"Quel effet moins positif est observ\u00e9 ?\", options: [\"Am\u00e9lioration de la concentration\", \"Effets n\u00e9gatifs sur la capacit\u00e9 de concentration\", \"Aucun effet n\u00e9gatif\"], correct: 1 },\n            { q: \"Quelle recommandation fait l'enseignante-chercheuse ?\", options: [\"Tout num\u00e9riser sans exception\", \"Conserver certains apprentissages sur support traditionnel\", \"Supprimer totalement le num\u00e9rique\"], correct: 1 },\n            { q: \"Comment les enseignants vivent-ils cette transition selon elle ?\", options: [\"De mani\u00e8re uniforme et positive\", \"De mani\u00e8re in\u00e9gale, certains se sentent d\u00e9pass\u00e9s\", \"Tous refusent le num\u00e9rique\"], correct: 1 },\n          ],\n        },\n        {\n          title: \"Document 3 \u2014 Reportage : formation continue et reconversion\",\n          script: \"Nous nous penchons aujourd'hui sur le ph\u00e9nom\u00e8ne croissant de la reconversion professionnelle, en particulier chez les trentenaires et quarantenaires. Selon une \u00e9tude r\u00e9cente, pr\u00e8s d'un actif sur quatre envisage s\u00e9rieusement de changer de m\u00e9tier au cours des cinq prochaines ann\u00e9es. Nous avons rencontr\u00e9 un ancien cadre commercial, aujourd'hui reconverti dans l'artisanat du bois. Apr\u00e8s quinze ans dans la m\u00eame entreprise, je ressentais un profond besoin de sens dans mon travail, explique-t-il. J'ai suivi une formation de neuf mois, financ\u00e9e en partie par mon compte personnel de formation, avant de me lancer en tant qu'ind\u00e9pendant. Ce type de parcours est de plus en plus fr\u00e9quent, observe un conseiller en \u00e9volution professionnelle que nous avons \u00e9galement interrog\u00e9. Les dispositifs de formation continue se sont consid\u00e9rablement d\u00e9velopp\u00e9s ces derni\u00e8res ann\u00e9es, mais l'acc\u00e8s \u00e0 l'information reste un frein important : de nombreux actifs ignorent encore l'\u00e9tendue de leurs droits \u00e0 la formation. Il souligne \u00e9galement que la reconversion implique souvent une baisse temporaire de revenus, ce qui constitue un frein financier majeur, en particulier pour les personnes ayant des charges familiales importantes.\",\n          questions: [\n            { q: \"Quelle proportion d'actifs envisage de changer de m\u00e9tier dans les 5 ans ?\", options: [\"Un sur dix\", \"Un sur quatre\", \"Un sur deux\"], correct: 1 },\n            { q: \"Dans quel domaine l'ancien cadre commercial s'est-il reconverti ?\", options: [\"L'artisanat du bois\", \"L'informatique\", \"La m\u00e9decine\"], correct: 0 },\n            { q: \"Combien de temps a dur\u00e9 sa formation ?\", options: [\"Trois mois\", \"Neuf mois\", \"Deux ans\"], correct: 1 },\n            { q: \"Quel frein important le conseiller mentionne-t-il concernant l'acc\u00e8s \u00e0 la formation ?\", options: [\"Le manque d'information sur les droits \u00e0 la formation\", \"L'absence totale de dispositifs\", \"Le manque d'organismes de formation\"], correct: 0 },\n            { q: \"Quel autre frein financier est mentionn\u00e9 ?\", options: [\"Le co\u00fbt des transports\", \"La baisse temporaire de revenus pendant la reconversion\", \"Le prix des fournitures\"], correct: 1 },\n          ],\n        },\n      ],\n    },\n    reading: {\n      duration: 25 * 60,\n      maxScore: 10,\n      texts: [\n        {\n          title: \"Texte 1 \u2014 Article de presse\",\n          content: \"Le d\u00e9veloppement massif du t\u00e9l\u00e9travail a profond\u00e9ment transform\u00e9 l'organisation spatiale des villes europ\u00e9ennes, avec des cons\u00e9quences que les urbanistes commencent seulement \u00e0 mesurer. Plusieurs grandes m\u00e9tropoles observent une diminution sensible de la fr\u00e9quentation des quartiers d'affaires en milieu de semaine, tandis que les zones r\u00e9sidentielles p\u00e9riph\u00e9riques connaissent une activit\u00e9 commerciale accrue durant les m\u00eames p\u00e9riodes. Ce r\u00e9\u00e9quilibrage pose des questions in\u00e9dites en mati\u00e8re de planification urbaine : certains bureaux vacants sont d\u00e9sormais reconvertis en logements, une tendance encourag\u00e9e par plusieurs municipalit\u00e9s confront\u00e9es \u00e0 une p\u00e9nurie de logements abordables. Les commerces de proximit\u00e9 dans les quartiers r\u00e9sidentiels, autrefois fragilis\u00e9s par l'exode quotidien des habitants vers leur lieu de travail, connaissent quant \u00e0 eux un regain d'activit\u00e9 inattendu. Toutefois, cette transformation n'est pas sans poser de difficult\u00e9s : les centres-villes, historiquement d\u00e9pendants de la fr\u00e9quentation des travailleurs de bureau, voient certains commerces fermer, faute de client\u00e8le suffisante en semaine, ce qui oblige les collectivit\u00e9s locales \u00e0 repenser enti\u00e8rement l'attractivit\u00e9 de ces quartiers, par exemple en y d\u00e9veloppant davantage de logements ou d'activit\u00e9s culturelles.\",\n          questions: [\n            { q: \"Quel changement est observ\u00e9 dans les quartiers d'affaires ?\", options: [\"Une augmentation de fr\u00e9quentation\", \"Une diminution sensible de fr\u00e9quentation en semaine\", \"Aucun changement\"], correct: 1 },\n            { q: \"Que deviennent certains bureaux vacants ?\", options: [\"Ils sont d\u00e9truits\", \"Ils sont reconvertis en logements\", \"Ils restent vides ind\u00e9finiment\"], correct: 1 },\n            { q: \"Quel effet est observ\u00e9 sur les commerces de proximit\u00e9 r\u00e9sidentiels ?\", options: [\"Une fermeture g\u00e9n\u00e9ralis\u00e9e\", \"Un regain d'activit\u00e9 inattendu\", \"Aucun changement\"], correct: 1 },\n            { q: \"Quelle difficult\u00e9 rencontrent les centres-villes ?\", options: [\"Fermeture de commerces faute de client\u00e8le en semaine\", \"Trop de touristes\", \"Manque de bureaux disponibles\"], correct: 0 },\n            { q: \"Que doivent repenser les collectivit\u00e9s locales selon le texte ?\", options: [\"L'attractivit\u00e9 des centres-villes\", \"Les imp\u00f4ts locaux uniquement\", \"Le r\u00e9seau routier uniquement\"], correct: 0 },\n          ],\n        },\n        {\n          title: \"Texte 2 \u2014 Rapport \/ document professionnel\",\n          content: \"Bilan p\u00e9dagogique \u2014 Direction acad\u00e9mique. Objet : \u00e9valuation du dispositif d'apprentissage hybride mis en place sur l'ann\u00e9e scolaire \u00e9coul\u00e9e. Le pr\u00e9sent rapport \u00e9value les r\u00e9sultats du dispositif d'apprentissage hybride, combinant pr\u00e9sence en classe et plateforme num\u00e9rique, d\u00e9ploy\u00e9 dans l'ensemble des \u00e9tablissements de notre acad\u00e9mie au cours de l'ann\u00e9e \u00e9coul\u00e9e. Les r\u00e9sultats sont globalement encourageants : soixante-cinq pour cent des enseignants interrog\u00e9s estiment que ce dispositif a permis une meilleure personnalisation du suivi des \u00e9l\u00e8ves, notamment gr\u00e2ce aux exercices adaptatifs propos\u00e9s par la plateforme. Cependant, l'\u00e9valuation r\u00e9v\u00e8le \u00e9galement des disparit\u00e9s pr\u00e9occupantes : les \u00e9l\u00e8ves issus de familles disposant d'un acc\u00e8s limit\u00e9 \u00e0 internet ou \u00e0 un \u00e9quipement informatique adapt\u00e9 ont, dans l'ensemble, moins b\u00e9n\u00e9fici\u00e9 de ce dispositif, accentuant potentiellement les in\u00e9galit\u00e9s scolaires existantes. Par ailleurs, vingt pour cent des enseignants d\u00e9clarent ne pas se sentir suffisamment form\u00e9s \u00e0 l'utilisation de ces outils, ce qui limite leur capacit\u00e9 \u00e0 en exploiter pleinement le potentiel p\u00e9dagogique. La direction acad\u00e9mique recommande, pour l'ann\u00e9e \u00e0 venir, un renforcement du pr\u00eat de mat\u00e9riel informatique aux familles les plus modestes, ainsi qu'un programme de formation continue obligatoire pour l'ensemble du corps enseignant.\",\n          questions: [\n            { q: \"Quel pourcentage d'enseignants juge le dispositif positif pour la personnalisation du suivi ?\", options: [\"45%\", \"65%\", \"85%\"], correct: 1 },\n            { q: \"Quelle disparit\u00e9 pr\u00e9occupante est r\u00e9v\u00e9l\u00e9e ?\", options: [\"Les \u00e9l\u00e8ves avec acc\u00e8s limit\u00e9 \u00e0 internet en b\u00e9n\u00e9ficient moins\", \"Tous les \u00e9l\u00e8ves en b\u00e9n\u00e9ficient \u00e9galement\", \"Seuls les bons \u00e9l\u00e8ves y ont acc\u00e8s\"], correct: 0 },\n            { q: \"Quel pourcentage d'enseignants ne se sent pas suffisamment form\u00e9 ?\", options: [\"10%\", \"20%\", \"40%\"], correct: 1 },\n            { q: \"Que recommande la direction acad\u00e9mique pour l'ann\u00e9e \u00e0 venir ?\", options: [\"Supprimer le dispositif\", \"Renforcer le pr\u00eat de mat\u00e9riel et la formation continue\", \"Rendre le dispositif payant\"], correct: 1 },\n            { q: \"Quel type de document est-ce ?\", options: [\"Un bilan p\u00e9dagogique officiel\", \"Un article de blog personnel\", \"Une publicit\u00e9 pour une \u00e9cole priv\u00e9e\"], correct: 0 },\n          ],\n        },\n      ],\n    },\n    grammar: {\n      duration: 20 * 60,\n      maxScore: 15,\n      sections: [\n        {\n          title: \"1. Subjonctif ou indicatif\",\n          items: [\n            { q: \"Il faut que les enseignants _______ (\u00eatre) mieux form\u00e9s au num\u00e9rique.\", options: [\"sont\", \"soient\", \"seront\"], correct: 1 },\n            { q: \"Je crois que le t\u00e9l\u00e9travail _______ (avoir) des effets positifs et n\u00e9gatifs.\", options: [\"ait\", \"a\", \"aura\"], correct: 1 },\n            { q: \"Quoique la transition _______ (sembler) difficile, elle reste n\u00e9cessaire.\", options: [\"semble\", \"semblera\", \"semblait\"], correct: 0 },\n            { q: \"Il est certain que cette tendance _______ (se confirmer) dans les ann\u00e9es \u00e0 venir.\", options: [\"se confirme\", \"se confirmera\", \"se soit confirm\u00e9e\"], correct: 1 },\n            { q: \"Nous attendons qu'il _______ (finir) sa formation avant de postuler.\", options: [\"finit\", \"finisse\", \"finira\"], correct: 1 },\n          ],\n        },\n        {\n          title: \"2. Pronoms relatifs\",\n          items: [\n            { q: \"C'est une comp\u00e9tence _______ devient essentielle aujourd'hui.\", options: [\"qui\", \"que\", \"dont\"], correct: 0 },\n            { q: \"L'entreprise _______ il travaille a adopt\u00e9 le t\u00e9l\u00e9travail.\", options: [\"dont\", \"o\u00f9\", \"que\"], correct: 1 },\n            { q: \"Voici la formation _______ il a besoin pour se reconvertir.\", options: [\"que\", \"dont\", \"o\u00f9\"], correct: 1 },\n            { q: \"_______ inqui\u00e8te les enseignants, c'est le manque de formation.\", options: [\"Ce que\", \"Ce qui\", \"Ce dont\"], correct: 1 },\n            { q: \"Le dispositif gr\u00e2ce \u00e0 _______ elle a pu se reconvertir est gratuit.\", options: [\"auquel\", \"dont\", \"que\"], correct: 0 },\n          ],\n        },\n        {\n          title: \"3. Connecteurs logiques\",\n          items: [\n            { q: \"_______ les avantages du t\u00e9l\u00e9travail, certains pr\u00e9f\u00e8rent le bureau.\", options: [\"Malgr\u00e9\", \"Bien qu'\", \"Car\"], correct: 0 },\n            { q: \"Il a chang\u00e9 de m\u00e9tier _______ il avait un emploi stable.\", options: [\"bien qu'\", \"car\", \"donc\"], correct: 0 },\n            { q: \"Elle suit une formation _______ se reconvertir dans l'artisanat.\", options: [\"afin de\", \"afin que\", \"parce que\"], correct: 0 },\n            { q: \"_______ vous h\u00e9sitiez encore, ce conseiller peut vous renseigner.\", options: [\"Si\", \"Au cas o\u00f9\", \"Pourvu que\"], correct: 1 },\n            { q: \"Le cours a \u00e9t\u00e9 annul\u00e9, _______ trop peu d'\u00e9l\u00e8ves \u00e9taient inscrits.\", options: [\"car\", \"donc\", \"or\"], correct: 0 },\n          ],\n        },\n        {\n          title: \"4. Voix passive et discours indirect\",\n          items: [\n            { q: \"\u00ab On a g\u00e9n\u00e9ralis\u00e9 le t\u00e9l\u00e9travail. \u00bb Forme passive :\", options: [\"Le t\u00e9l\u00e9travail a \u00e9t\u00e9 g\u00e9n\u00e9ralis\u00e9.\", \"Le t\u00e9l\u00e9travail g\u00e9n\u00e9ralisait.\", \"Le t\u00e9l\u00e9travail sera g\u00e9n\u00e9ralis\u00e9.\"], correct: 0 },\n            { q: \"Il a dit : \u00ab Je me reconvertirai l'ann\u00e9e prochaine. \u00bb \u2192 Il a dit qu'_______\", options: [\"il se reconvertira l'ann\u00e9e prochaine.\", \"il se reconvertirait l'ann\u00e9e suivante.\", \"il s'est reconverti.\"], correct: 1 },\n            { q: \"Elle a demand\u00e9 : \u00ab Avez-vous suivi cette formation ? \u00bb \u2192 Elle a demand\u00e9 _______\", options: [\"si nous avions suivi cette formation.\", \"que nous ayons suivi cette formation.\", \"si nous suivrons cette formation.\"], correct: 0 },\n            { q: \"\u00ab Inscrivez-vous avant vendredi ! \u00bb a-t-il dit. \u2192 Il a dit _______\", options: [\"de s'inscrire avant vendredi.\", \"qu'ils s'inscrivent avant vendredi.\", \"de s'inscrivant avant vendredi.\"], correct: 0 },\n            { q: \"Les nouveaux programmes _______ appliqu\u00e9s d\u00e8s septembre. (passif)\", options: [\"seront\", \"auront \u00e9t\u00e9\", \"seraient\"], correct: 0 },\n          ],\n        },\n        {\n          title: \"5. Pr\u00e9positions et verbes\",\n          items: [\n            { q: \"Le t\u00e9l\u00e9travail contribue _______ r\u00e9duire les trajets quotidiens.\", options: [\"\u00e0\", \"de\", \"pour\"], correct: 0 },\n            { q: \"Il s'agit _______ repenser l'organisation du travail.\", options: [\"\u00e0\", \"de\", \"sur\"], correct: 1 },\n            { q: \"Les chercheurs insistent _______ la n\u00e9cessit\u00e9 de former les enseignants.\", options: [\"sur\", \"de\", \"\u00e0\"], correct: 0 },\n            { q: \"La r\u00e9ussite de la reconversion d\u00e9pend _______ plusieurs facteurs personnels.\", options: [\"\u00e0\", \"de\", \"sur\"], correct: 1 },\n            { q: \"L'acad\u00e9mie s'engage _______ former tous les enseignants au num\u00e9rique.\", options: [\"\u00e0\", \"de\", \"pour\"], correct: 0 },\n          ],\n        },\n        {\n          title: \"6. Articles et accords\",\n          items: [\n            { q: \"_______ majorit\u00e9 des entreprises a adopt\u00e9 le mod\u00e8le hybride.\", options: [\"La\", \"Une\", \"Des\"], correct: 0 },\n            { q: \"Il a fait preuve _______ motivation exceptionnelle pendant sa formation.\", options: [\"la\", \"une\", \"de la\"], correct: 1 },\n            { q: \"Ce sont _______ choix de carri\u00e8re difficiles \u00e0 assumer.\", options: [\"les\", \"des\", \"de\"], correct: 1 },\n            { q: \"Elle reste attentive _______ besoins de ses \u00e9l\u00e8ves en difficult\u00e9.\", options: [\"les\", \"aux\", \"des\"], correct: 1 },\n            { q: \"_______ disparit\u00e9s n'avaient jamais \u00e9t\u00e9 aussi visibles.\", options: [\"De telles\", \"Les\", \"Des\"], correct: 0 },\n          ],\n        },\n      ],\n    },\n    written: {\n      duration: 40 * 60,\n      maxScore: 30,\n      prompts: [\n        { type: \"Sujet argumentatif\", text: \"Le num\u00e9rique \u00e0 l'\u00e9cole est-il, selon vous, plus b\u00e9n\u00e9fique que nuisible aux apprentissages des \u00e9l\u00e8ves ? (200 mots maximum)\" },\n        { type: \"Sujet cr\u00e9atif\", text: \"Imaginez le parcours d'une personne qui d\u00e9cide, apr\u00e8s quinze ans dans le m\u00eame m\u00e9tier, de se reconvertir compl\u00e8tement. (200 mots maximum)\" },\n      ],\n    },\n    oral: {\n      duration: 10 * 60,\n      maxScore: 30,\n      topics: [\n        \"Le t\u00e9l\u00e9travail g\u00e9n\u00e9ralis\u00e9 va-t-il durablement transformer l'organisation des villes ?\",\n        \"Le num\u00e9rique \u00e0 l'\u00e9cole accentue-t-il les in\u00e9galit\u00e9s entre \u00e9l\u00e8ves ?\",\n        \"La reconversion professionnelle devrait-elle \u00eatre davantage facilit\u00e9e et financ\u00e9e par l'\u00c9tat ?\",\n      ],\n    },\n  },\n];\n\nif (typeof module !== \"undefined\") module.exports = EXAMS;\n\n<\/script>\n<script>\n\/\/ ============================================================\n\/\/ STATE\n\/\/ ============================================================\nlet state = {\n  examId: null,\n  exam: null,\n  sectionIndex: 0, \/\/ 0=listening,1=reading,2=grammar,3=written,4=oral\n  answers: { listening: [], reading: [], grammar: [], written: [\"\", \"\"], oral: null },\n  scores: {},\n  timerInterval: null,\n  timeLeft: 0,\n  sectionStarted: false,\n  oralPhase: \"pick\", \/\/ pick -> prep -> speak -> done\n  oralTopicIndex: null,\n};\n\nconst SECTION_NAMES = [\"Compr\u00e9hension orale\", \"Compr\u00e9hension \u00e9crite\", \"Grammaire\", \"Production \u00e9crite\", \"Production orale\"];\nconst SECTION_KEYS = [\"listening\", \"reading\", \"grammar\", \"written\", \"oral\"];\n\nconst app = document.getElementById(\"app\");\nconst topbarSection = document.getElementById(\"topbarSection\");\nconst topbarId = document.getElementById(\"topbarId\");\nconst globalTimer = document.getElementById(\"globalTimer\");\n\n\/\/ ============================================================\n\/\/ UTIL\n\/\/ ============================================================\nfunction fmtTime(sec) {\n  sec = Math.max(0, Math.round(sec));\n  const m = Math.floor(sec \/ 60).toString().padStart(2, \"0\");\n  const s = (sec % 60).toString().padStart(2, \"0\");\n  return `${m}:${s}`;\n}\n\nfunction clearTimer() {\n  if (state.timerInterval) clearInterval(state.timerInterval);\n  state.timerInterval = null;\n}\n\nfunction startTimer(seconds, onTick, onEnd) {\n  clearTimer();\n  state.timeLeft = seconds;\n  onTick(state.timeLeft);\n  state.timerInterval = setInterval(() => {\n    state.timeLeft -= 1;\n    onTick(state.timeLeft);\n    if (state.timeLeft <= 0) {\n      clearTimer();\n      onEnd();\n    }\n  }, 1000);\n}\n\nfunction updateGlobalTimerDisplay(sec, totalSec) {\n  globalTimer.textContent = fmtTime(sec);\n  globalTimer.classList.remove(\"warn\", \"danger\");\n  if (totalSec) {\n    const ratio = sec \/ totalSec;\n    if (ratio <= 0.1) globalTimer.classList.add(\"danger\");\n    else if (ratio <= 0.25) globalTimer.classList.add(\"warn\");\n  }\n}\n\nfunction countWords(text) {\n  return text.trim().split(\/\\s+\/).filter(Boolean).length;\n}\n\n\/\/ ============================================================\n\/\/ TTS\n\/\/ ============================================================\nlet ttsUtterance = null;\nlet ttsVoices = [];\nlet ttsVoicesReady = false;\nfunction loadVoices() {\n  ttsVoices = window.speechSynthesis ? window.speechSynthesis.getVoices() : [];\n  if (ttsVoices.length) ttsVoicesReady = true;\n}\nif (typeof speechSynthesis !== \"undefined\") {\n  loadVoices();\n  speechSynthesis.onvoiceschanged = loadVoices;\n}\nfunction pickFrenchVoice() {\n  if (!ttsVoices.length) loadVoices();\n  return ttsVoices.find(v => v.lang && v.lang.toLowerCase().startsWith(\"fr\")) || null;\n}\nfunction speak(text, onEnd) {\n  if (typeof speechSynthesis === \"undefined\") {\n    alert(\"La synth\u00e8se vocale (TTS) n'est pas disponible dans ce navigateur. Essayez avec Chrome sur ordinateur.\");\n    if (onEnd) onEnd();\n    return;\n  }\n  \/\/ If voices haven't loaded yet, give the browser a brief moment then retry once.\n  if (!ttsVoicesReady && !ttsVoices.length) {\n    loadVoices();\n    if (!ttsVoices.length) {\n      setTimeout(() => speak(text, onEnd), 300);\n      return;\n    }\n  }\n  speechSynthesis.cancel();\n  const utter = new SpeechSynthesisUtterance(text);\n  const voice = pickFrenchVoice();\n  if (voice) {\n    utter.voice = voice;\n  } else if (ttsVoices.length) {\n    \/\/ No French voice found on this device \u2014 warn once, still attempt with default voice + fr-FR lang hint.\n    console.warn(\"Aucune voix fran\u00e7aise trouv\u00e9e ; utilisation de la voix par d\u00e9faut.\");\n  }\n  utter.lang = \"fr-FR\";\n  utter.rate = 0.95;\n  utter.onend = () => { if (onEnd) onEnd(); };\n  utter.onerror = () => { if (onEnd) onEnd(); };\n  ttsUtterance = utter;\n  speechSynthesis.speak(utter);\n}\nfunction stopSpeak() {\n  if (typeof speechSynthesis !== \"undefined\") speechSynthesis.cancel();\n}\n\n\/\/ ============================================================\n\/\/ LANDING\n\/\/ ============================================================\nfunction renderLanding() {\n  clearTimer();\n  stopSpeak();\n  topbarSection.textContent = \"Accueil\";\n  topbarId.textContent = \"B2 \u00b7 ALLINGUA FORMAT\";\n  updateGlobalTimerDisplay(0);\n  globalTimer.textContent = \"\u2014\";\n  globalTimer.classList.remove(\"warn\", \"danger\");\n\n  app.innerHTML = `\n    <div class=\"masthead\">\n      <div class=\"eyebrow\">Pr\u00e9paration \u00e0 l'examen \u2014 S\u00e9rie 2<\/div>\n      <h1>Simulation d'examen B2 \u2014 Migration, num\u00e9rique, sant\u00e9, travail<\/h1>\n      <p>Trois nouvelles simulations ind\u00e9pendantes, m\u00eame format officiel complet : compr\u00e9hension orale (avec audio), compr\u00e9hension \u00e9crite, grammaire, production \u00e9crite avec clavier fran\u00e7ais virtuel, et production orale chronom\u00e9tr\u00e9e. Th\u00e8mes : migration, num\u00e9risation, sant\u00e9 publique, t\u00e9l\u00e9travail et \u00e9ducation.<\/p>\n    <\/div>\n    <div class=\"exam-grid\">\n      ${EXAMS.map(e => `\n        <div class=\"exam-card\">\n          <div>\n            <div class=\"exam-card-title\">${e.title}<\/div>\n            <div class=\"exam-card-meta\">5 \u00e9preuves \u00b7 ~2h00 \u00b7 Score \/100, seuil de r\u00e9ussite 60<\/div>\n          <\/div>\n          <button class=\"btn\" onclick=\"startExam(${e.id})\">Commencer \u2192<\/button>\n        <\/div>\n      `).join(\"\")}\n    <\/div>\n  `;\n}\n\nfunction startExam(id) {\n  state.examId = id;\n  state.exam = EXAMS.find(e => e.id === id);\n  state.sectionIndex = 0;\n  state.answers = { listening: [], reading: [], grammar: [], written: [\"\", \"\"], oral: null };\n  state.scores = {};\n  state.sectionStarted = false;\n  state.oralPhase = \"pick\";\n  state.oralTopicIndex = null;\n  renderSectionIntro();\n}\n\n\/\/ ============================================================\n\/\/ SECTION PROGRESS BAR\n\/\/ ============================================================\nfunction progressBarHTML() {\n  return `\n    <div class=\"section-progress\">\n      ${SECTION_NAMES.map((name, i) => {\n        let cls = \"dot\";\n        if (i < state.sectionIndex) cls += \" done\";\n        else if (i === state.sectionIndex) cls += \" active\";\n        return `<span class=\"${cls}\">${i + 1}. ${name}<\/span>`;\n      }).join(\"\")}\n    <\/div>\n  `;\n}\n\n\/\/ ============================================================\n\/\/ SECTION INTRO (before timer starts)\n\/\/ ============================================================\nfunction renderSectionIntro() {\n  clearTimer();\n  stopSpeak();\n  const key = SECTION_KEYS[state.sectionIndex];\n  const name = SECTION_NAMES[state.sectionIndex];\n  topbarSection.textContent = `${state.exam.title} \u00b7 ${name}`;\n  const durations = {\n    listening: state.exam.listening.duration,\n    reading: state.exam.reading.duration,\n    grammar: state.exam.grammar.duration,\n    written: state.exam.written.duration,\n    oral: state.exam.oral.duration,\n  };\n  globalTimer.textContent = fmtTime(durations[key]);\n  globalTimer.classList.remove(\"warn\", \"danger\");\n\n  const descriptions = {\n    listening: \"Vous allez \u00e9couter plusieurs documents audio (bulletin, interview, reportage). Chaque document peut \u00eatre \u00e9cout\u00e9 au maximum 2 fois. R\u00e9pondez aux questions \u00e0 choix multiple apr\u00e8s chaque document.\",\n    reading: \"Lisez attentivement les deux textes propos\u00e9s, puis r\u00e9pondez aux questions de compr\u00e9hension.\",\n    grammar: \"Six sections de cinq exercices chacune. Choisissez la r\u00e9ponse correcte pour chaque item.\",\n    written: \"R\u00e9digez un texte de 200 mots maximum sur l'un des deux sujets propos\u00e9s. Un clavier virtuel fran\u00e7ais est disponible pour les caract\u00e8res accentu\u00e9s.\",\n    oral: \"Vous choisirez un sujet, puis disposerez de 5 minutes de pr\u00e9paration suivies de 5 minutes de pr\u00e9sentation chronom\u00e9tr\u00e9e.\",\n  };\n\n  app.innerHTML = `\n    ${progressBarHTML()}\n    <div class=\"card\">\n      <div class=\"card-label\">\u00c9preuve ${state.sectionIndex + 1} \/ 5<\/div>\n      <h2>${name}<\/h2>\n      <div class=\"sub\">Dur\u00e9e allou\u00e9e : ${fmtTime(durations[key])} \u00b7 Score maximum : \/${{listening:15,reading:10,grammar:15,written:30,oral:30}[key]}<\/div>\n      <p style=\"margin-bottom:24px; color:var(--ink-soft); font-size:15px;\">${descriptions[key]}<\/p>\n      <button class=\"btn\" onclick=\"beginSection()\">D\u00e9marrer le chronom\u00e8tre et commencer \u2192<\/button>\n    <\/div>\n  `;\n}\n\nfunction beginSection() {\n  state.sectionStarted = true;\n  const key = SECTION_KEYS[state.sectionIndex];\n  if (key === \"listening\") renderListening();\n  else if (key === \"reading\") renderReading();\n  else if (key === \"grammar\") renderGrammar();\n  else if (key === \"written\") renderWritten();\n  else if (key === \"oral\") renderOralPick();\n}\n\nfunction goToNextSection() {\n  if (state.sectionIndex < 4) {\n    state.sectionIndex += 1;\n    renderSectionIntro();\n  } else {\n    renderResults();\n  }\n}\n\n\/\/ ============================================================\n\/\/ LISTENING\n\/\/ ============================================================\nlet listeningPlayCounts = {};\n\nfunction renderListening() {\n  const data = state.exam.listening;\n  if (!state.answers.listening.length) {\n    state.answers.listening = data.passages.map(p => p.questions.map(() => null));\n  }\n  listeningPlayCounts = listeningPlayCounts.examId === state.examId ? listeningPlayCounts : { examId: state.examId };\n  data.passages.forEach((_, i) => { if (listeningPlayCounts[i] === undefined) listeningPlayCounts[i] = 0; });\n\n  startTimer(data.duration, (t) => updateGlobalTimerDisplay(t, data.duration), () => {\n    alert(\"Temps \u00e9coul\u00e9 pour la compr\u00e9hension orale. Passage \u00e0 l'\u00e9preuve suivante.\");\n    finalizeSection(\"listening\");\n  });\n\n  renderListeningBody();\n}\n\nfunction renderListeningBody() {\n  const data = state.exam.listening;\n  const frVoice = pickFrenchVoice();\n  const voiceWarning = !frVoice ? `<div class=\"instructions\" style=\"background:#FBEAEA; border-left-color:var(--error); color:#6B1F1F;\">\u26a0 Aucune voix fran\u00e7aise n'a \u00e9t\u00e9 d\u00e9tect\u00e9e sur cet appareil. L'audio risque de ne pas se lire, ou de se lire avec un accent anglais. Essayez avec Chrome sur ordinateur, ou v\u00e9rifiez les param\u00e8tres de synth\u00e8se vocale de l'appareil.<\/div>` : \"\";\n  app.innerHTML = `\n    ${progressBarHTML()}\n    ${voiceWarning}\n    <div class=\"instructions\">Chaque document audio peut \u00eatre \u00e9cout\u00e9 au maximum 2 fois. Cliquez sur \u25b6 pour lancer la lecture (synth\u00e8se vocale).<\/div>\n    ${data.passages.map((passage, pi) => `\n      <div class=\"card\">\n        <div class=\"card-label\">Document ${pi + 1} \/ ${data.passages.length}<\/div>\n        <h2 style=\"font-size:18px;\">${passage.title}<\/h2>\n        <div class=\"audio-box\">\n          <div class=\"audio-controls\">\n            <button class=\"play-btn\" id=\"play-${pi}\" onclick=\"playPassage(${pi})\" ${listeningPlayCounts[pi] >= 2 ? \"disabled\" : \"\"}>\n              <span id=\"play-icon-${pi}\">\u25b6<\/span>\n            <\/button>\n            <div class=\"audio-meta\"><strong>\u00c9coutes restantes :<\/strong> <span id=\"count-${pi}\">${2 - listeningPlayCounts[pi]}<\/span> \/ 2<\/div>\n          <\/div>\n          <button class=\"transcript-toggle\" onclick=\"toggleTranscript(${pi})\">Afficher \/ masquer la transcription (apr\u00e8s \u00e9coute)<\/button>\n          <div class=\"transcript\" id=\"transcript-${pi}\">${passage.script}<\/div>\n        <\/div>\n        ${passage.questions.map((q, qi) => `\n          <div class=\"question-block\">\n            <div class=\"q-text\"><span class=\"q-num\">${qi + 1}.<\/span>${q.q}<\/div>\n            <div class=\"options\">\n              ${q.options.map((opt, oi) => `\n                <label class=\"option ${state.answers.listening[pi][qi] === oi ? \"selected\" : \"\"}\" onclick=\"selectListening(${pi},${qi},${oi})\">\n                  <input type=\"radio\" name=\"l-${pi}-${qi}\" ${state.answers.listening[pi][qi] === oi ? \"checked\" : \"\"}>\n                  ${opt}\n                <\/label>\n              `).join(\"\")}\n            <\/div>\n          <\/div>\n        `).join(\"\")}\n      <\/div>\n    `).join(\"\")}\n    <div class=\"footer-nav\">\n      <span style=\"font-size:13px; color:var(--ink-soft);\">R\u00e9pondu : ${countAnswered(\"listening\")} \/ ${totalQuestions(\"listening\")}<\/span>\n      <button class=\"btn\" onclick=\"finalizeSection('listening')\">Valider et continuer \u2192<\/button>\n    <\/div>\n  `;\n}\n\nfunction playPassage(pi) {\n  if (listeningPlayCounts[pi] >= 2) return;\n  listeningPlayCounts[pi] += 1;\n  const icon = document.getElementById(`play-icon-${pi}`);\n  const btn = document.getElementById(`play-${pi}`);\n  const countEl = document.getElementById(`count-${pi}`);\n  icon.textContent = \"\u2759\u2759\";\n  btn.disabled = true;\n  countEl.textContent = 2 - listeningPlayCounts[pi];\n  speak(state.exam.listening.passages[pi].script, () => {\n    icon.textContent = \"\u25b6\";\n    btn.disabled = listeningPlayCounts[pi] >= 2;\n  });\n}\n\nfunction toggleTranscript(pi) {\n  document.getElementById(`transcript-${pi}`).classList.toggle(\"show\");\n}\n\nfunction selectListening(pi, qi, oi) {\n  state.answers.listening[pi][qi] = oi;\n  renderListeningBody();\n}\n\nfunction countAnswered(key) {\n  if (key === \"listening\") return state.answers.listening.flat().filter(v => v !== null).length;\n  if (key === \"reading\") return state.answers.reading.flat().filter(v => v !== null).length;\n  if (key === \"grammar\") return state.answers.grammar.flat().filter(v => v !== null).length;\n}\nfunction totalQuestions(key) {\n  if (key === \"listening\") return state.exam.listening.passages.reduce((a, p) => a + p.questions.length, 0);\n  if (key === \"reading\") return state.exam.reading.texts.reduce((a, t) => a + t.questions.length, 0);\n  if (key === \"grammar\") return state.exam.grammar.sections.reduce((a, s) => a + s.items.length, 0);\n}\n\nfunction finalizeSection(key) {\n  clearTimer();\n  stopSpeak();\n  if (key === \"listening\") {\n    let correct = 0, total = 0;\n    state.exam.listening.passages.forEach((p, pi) => {\n      p.questions.forEach((q, qi) => {\n        total++;\n        if (state.answers.listening[pi][qi] === q.correct) correct++;\n      });\n    });\n    state.scores.listening = Math.round((correct \/ total) * state.exam.listening.maxScore * 10) \/ 10;\n  }\n  if (key === \"reading\") {\n    let correct = 0, total = 0;\n    state.exam.reading.texts.forEach((t, ti) => {\n      t.questions.forEach((q, qi) => {\n        total++;\n        if (state.answers.reading[ti][qi] === q.correct) correct++;\n      });\n    });\n    state.scores.reading = Math.round((correct \/ total) * state.exam.reading.maxScore * 10) \/ 10;\n  }\n  if (key === \"grammar\") {\n    let correct = 0, total = 0;\n    state.exam.grammar.sections.forEach((s, si) => {\n      s.items.forEach((it, ii) => {\n        total++;\n        if (state.answers.grammar[si][ii] === it.correct) correct++;\n      });\n    });\n    state.scores.grammar = Math.round((correct \/ total) * state.exam.grammar.maxScore * 10) \/ 10;\n  }\n  if (key === \"written\") {\n    const wc = state.answers.written.map(countWords);\n    const best = Math.max(...wc.map((w, i) => state.answers.written[i].trim() ? 1 : 0));\n    const hasAny = state.answers.written.some(t => t.trim().length > 20);\n    state.scores.written = hasAny ? \"\u00c0 \u00e9valuer manuellement\" : 0;\n  }\n  if (key === \"oral\") {\n    state.scores.oral = state.oralTopicIndex !== null ? \"\u00c0 \u00e9valuer (entra\u00eenement r\u00e9alis\u00e9)\" : \"Non r\u00e9alis\u00e9\";\n  }\n  goToNextSection();\n}\n\n\/\/ ============================================================\n\/\/ READING\n\/\/ ============================================================\nfunction renderReading() {\n  const data = state.exam.reading;\n  if (!state.answers.reading.length) {\n    state.answers.reading = data.texts.map(t => t.questions.map(() => null));\n  }\n  startTimer(data.duration, (t) => updateGlobalTimerDisplay(t, data.duration), () => {\n    alert(\"Temps \u00e9coul\u00e9 pour la compr\u00e9hension \u00e9crite. Passage \u00e0 l'\u00e9preuve suivante.\");\n    finalizeSection(\"reading\");\n  });\n  renderReadingBody();\n}\n\nfunction renderReadingBody() {\n  const data = state.exam.reading;\n  app.innerHTML = `\n    ${progressBarHTML()}\n    ${data.texts.map((text, ti) => `\n      <div class=\"card\">\n        <div class=\"card-label\">${text.title}<\/div>\n        <div class=\"reading-text\">${text.content}<\/div>\n        ${text.questions.map((q, qi) => `\n          <div class=\"question-block\">\n            <div class=\"q-text\"><span class=\"q-num\">${qi + 1}.<\/span>${q.q}<\/div>\n            <div class=\"options\">\n              ${q.options.map((opt, oi) => `\n                <label class=\"option ${state.answers.reading[ti][qi] === oi ? \"selected\" : \"\"}\" onclick=\"selectReading(${ti},${qi},${oi})\">\n                  <input type=\"radio\" name=\"r-${ti}-${qi}\" ${state.answers.reading[ti][qi] === oi ? \"checked\" : \"\"}>\n                  ${opt}\n                <\/label>\n              `).join(\"\")}\n            <\/div>\n          <\/div>\n        `).join(\"\")}\n      <\/div>\n    `).join(\"\")}\n    <div class=\"footer-nav\">\n      <span style=\"font-size:13px; color:var(--ink-soft);\">R\u00e9pondu : ${countAnswered(\"reading\")} \/ ${totalQuestions(\"reading\")}<\/span>\n      <button class=\"btn\" onclick=\"finalizeSection('reading')\">Valider et continuer \u2192<\/button>\n    <\/div>\n  `;\n}\n\nfunction selectReading(ti, qi, oi) {\n  state.answers.reading[ti][qi] = oi;\n  renderReadingBody();\n}\n\n\/\/ ============================================================\n\/\/ GRAMMAR\n\/\/ ============================================================\nfunction renderGrammar() {\n  const data = state.exam.grammar;\n  if (!state.answers.grammar.length) {\n    state.answers.grammar = data.sections.map(s => s.items.map(() => null));\n  }\n  startTimer(data.duration, (t) => updateGlobalTimerDisplay(t, data.duration), () => {\n    alert(\"Temps \u00e9coul\u00e9 pour la grammaire. Passage \u00e0 l'\u00e9preuve suivante.\");\n    finalizeSection(\"grammar\");\n  });\n  renderGrammarBody();\n}\n\nfunction renderGrammarBody() {\n  const data = state.exam.grammar;\n  app.innerHTML = `\n    ${progressBarHTML()}\n    ${data.sections.map((sec, si) => `\n      <div class=\"card\">\n        <div class=\"card-label\">Section ${si + 1} \/ 6<\/div>\n        <h2 style=\"font-size:18px;\">${sec.title}<\/h2>\n        ${sec.items.map((it, ii) => `\n          <div class=\"question-block\">\n            <div class=\"q-text\"><span class=\"q-num\">${ii + 1}.<\/span>${it.q}<\/div>\n            <div class=\"options\">\n              ${it.options.map((opt, oi) => `\n                <label class=\"option ${state.answers.grammar[si][ii] === oi ? \"selected\" : \"\"}\" onclick=\"selectGrammar(${si},${ii},${oi})\">\n                  <input type=\"radio\" name=\"g-${si}-${ii}\" ${state.answers.grammar[si][ii] === oi ? \"checked\" : \"\"}>\n                  ${opt}\n                <\/label>\n              `).join(\"\")}\n            <\/div>\n          <\/div>\n        `).join(\"\")}\n      <\/div>\n    `).join(\"\")}\n    <div class=\"footer-nav\">\n      <span style=\"font-size:13px; color:var(--ink-soft);\">R\u00e9pondu : ${countAnswered(\"grammar\")} \/ ${totalQuestions(\"grammar\")}<\/span>\n      <button class=\"btn\" onclick=\"finalizeSection('grammar')\">Valider et continuer \u2192<\/button>\n    <\/div>\n  `;\n}\n\nfunction selectGrammar(si, ii, oi) {\n  state.answers.grammar[si][ii] = oi;\n  renderGrammarBody();\n}\n\n\/\/ ============================================================\n\/\/ WRITTEN PRODUCTION (with virtual keyboard)\n\/\/ ============================================================\nlet activeTextareaId = null;\n\nconst FR_KEYS_ROW1 = [\"\u00e0\",\"\u00e2\",\"\u00e7\",\"\u00e8\",\"\u00e9\",\"\u00ea\",\"\u00eb\",\"\u00ee\",\"\u00ef\",\"\u00f4\",\"\u00f9\",\"\u00fb\",\"\u00fc\"];\nconst FR_KEYS_ROW2 = [\"\u0153\",\"\u00e6\",\"\u00ab\",\"\u00bb\",\"'\",\"-\"];\n\nfunction renderWritten() {\n  const data = state.exam.written;\n  startTimer(data.duration, (t) => updateGlobalTimerDisplay(t, data.duration), () => {\n    alert(\"Temps \u00e9coul\u00e9 pour la production \u00e9crite. Passage \u00e0 l'\u00e9preuve suivante.\");\n    finalizeSection(\"written\");\n  });\n  renderWrittenBody();\n}\n\nfunction renderWrittenBody() {\n  const data = state.exam.written;\n  app.innerHTML = `\n    ${progressBarHTML()}\n    <div class=\"instructions\">Choisissez un sujet (ou r\u00e9digez les deux, \u00e0 titre d'entra\u00eenement). Limite : 200 mots par texte. Le clavier virtuel ci-dessous ins\u00e8re les caract\u00e8res accentu\u00e9s fran\u00e7ais \u00e0 l'endroit du curseur.<\/div>\n    ${data.prompts.map((prompt, pi) => `\n      <div class=\"card\">\n        <div class=\"prompt-box\">\n          <div class=\"prompt-type\">${prompt.type}<\/div>\n          <div style=\"font-size:15.5px;\">${prompt.text}<\/div>\n        <\/div>\n        <button class=\"vkb-toggle\" onclick=\"toggleKeyboard(${pi})\">\u2328 Clavier fran\u00e7ais virtuel<\/button>\n        <div class=\"vkb\" id=\"vkb-${pi}\">\n          <div class=\"vkb-row\">\n            ${FR_KEYS_ROW1.map(k => `<button class=\"vkb-key\" onclick=\"insertChar(${pi},'${k}')\" type=\"button\">${k}<\/button>`).join(\"\")}\n          <\/div>\n          <div class=\"vkb-row\">\n            ${FR_KEYS_ROW2.map(k => `<button class=\"vkb-key\" onclick=\"insertChar(${pi},'${k}')\" type=\"button\">${k}<\/button>`).join(\"\")}\n            <button class=\"vkb-key wide\" onclick=\"insertChar(${pi}, ' ')\" type=\"button\">espace<\/button>\n          <\/div>\n        <\/div>\n        <textarea class=\"essay\" id=\"essay-${pi}\" placeholder=\"R\u00e9digez votre texte ici...\" oninput=\"onEssayInput(${pi})\" onfocus=\"activeTextareaId=${pi}\">${state.answers.written[pi]}<\/textarea>\n        <div class=\"word-count\" id=\"wc-${pi}\">${countWords(state.answers.written[pi])} \/ 200 mots<\/div>\n      <\/div>\n    `).join(\"\")}\n    <div class=\"footer-nav\">\n      <span><\/span>\n      <button class=\"btn\" onclick=\"finalizeSection('written')\">Valider et continuer \u2192<\/button>\n    <\/div>\n  `;\n}\n\nfunction toggleKeyboard(pi) {\n  document.getElementById(`vkb-${pi}`).classList.toggle(\"show\");\n}\n\nfunction insertChar(pi, char) {\n  const ta = document.getElementById(`essay-${pi}`);\n  const start = ta.selectionStart;\n  const end = ta.selectionEnd;\n  const val = ta.value;\n  ta.value = val.slice(0, start) + char + val.slice(end);\n  ta.selectionStart = ta.selectionEnd = start + char.length;\n  ta.focus();\n  onEssayInput(pi);\n}\n\nfunction onEssayInput(pi) {\n  const ta = document.getElementById(`essay-${pi}`);\n  state.answers.written[pi] = ta.value;\n  const wc = countWords(ta.value);\n  const wcEl = document.getElementById(`wc-${pi}`);\n  wcEl.textContent = `${wc} \/ 200 mots`;\n  wcEl.classList.toggle(\"over\", wc > 200);\n}\n\n\/\/ ============================================================\n\/\/ ORAL PRODUCTION\n\/\/ ============================================================\nfunction renderOralPick() {\n  globalTimer.textContent = \"\u2014\";\n  const data = state.exam.oral;\n  app.innerHTML = `\n    ${progressBarHTML()}\n    <div class=\"card\">\n      <div class=\"card-label\">Production orale<\/div>\n      <h2>Choisissez un sujet<\/h2>\n      <div class=\"sub\">Le sujet est normalement tir\u00e9 au hasard le jour de l'examen. Ici, s\u00e9lectionnez-en un pour vous entra\u00eener dans les m\u00eames conditions de temps.<\/div>\n      <div class=\"oral-topic-list\">\n        ${data.topics.map((topic, ti) => `\n          <div class=\"oral-topic ${state.oralTopicIndex === ti ? \"picked\" : \"\"}\" onclick=\"pickOralTopic(${ti})\">${topic}<\/div>\n        `).join(\"\")}\n      <\/div>\n      <button class=\"btn\" ${state.oralTopicIndex === null ? \"disabled\" : \"\"} onclick=\"startOralPrep()\">Commencer la pr\u00e9paration (5 min) \u2192<\/button>\n    <\/div>\n  `;\n}\n\nfunction pickOralTopic(ti) {\n  state.oralTopicIndex = ti;\n  renderOralPick();\n}\n\nfunction startOralPrep() {\n  state.oralPhase = \"prep\";\n  renderOralStage();\n  startTimer(5 * 60, (t) => {\n    updateGlobalTimerDisplay(t, 5 * 60);\n    updateOralBigTimer(t);\n  }, () => {\n    startOralSpeak();\n  });\n}\n\nfunction startOralSpeak() {\n  state.oralPhase = \"speak\";\n  renderOralStage();\n  startTimer(5 * 60, (t) => {\n    updateGlobalTimerDisplay(t, 5 * 60);\n    updateOralBigTimer(t);\n  }, () => {\n    state.oralPhase = \"done\";\n    renderOralStage();\n  });\n}\n\nfunction updateOralBigTimer(t) {\n  const el = document.getElementById(\"oralBigTimer\");\n  if (el) el.textContent = fmtTime(t);\n}\n\nfunction renderOralStage() {\n  const topic = state.exam.oral.topics[state.oralTopicIndex];\n  if (state.oralPhase === \"prep\") {\n    app.innerHTML = `\n      ${progressBarHTML()}\n      <div class=\"card oral-stage\">\n        <div class=\"oral-phase-label\">Phase de pr\u00e9paration<\/div>\n        <div class=\"big-timer\" id=\"oralBigTimer\">${fmtTime(state.timeLeft)}<\/div>\n        <div class=\"oral-topic-display\">${topic}<\/div>\n        <div class=\"oral-plan-hint\">\n          <strong>Pendant ces 5 minutes :<\/strong><br>\n          Notez 2-3 arguments principaux, un exemple concret, et une nuance ou contre-argument. Ne r\u00e9digez pas de texte complet \u2014 pr\u00e9parez un plan parl\u00e9, pas un texte lu.\n        <\/div>\n      <\/div>\n    `;\n  } else if (state.oralPhase === \"speak\") {\n    app.innerHTML = `\n      ${progressBarHTML()}\n      <div class=\"card oral-stage\">\n        <div class=\"oral-phase-label\">Pr\u00e9sentation \u2014 parlez maintenant<\/div>\n        <div class=\"big-timer\" id=\"oralBigTimer\">${fmtTime(state.timeLeft)}<\/div>\n        <div class=\"oral-topic-display\">${topic}<\/div>\n        <div class=\"oral-plan-hint\">\n          Pr\u00e9sentez votre argumentation \u00e0 voix haute jusqu'\u00e0 la fin du chronom\u00e8tre. Structurez : introduction, 2 arguments, nuance, conclusion.\n        <\/div>\n      <\/div>\n    `;\n  } else if (state.oralPhase === \"done\") {\n    app.innerHTML = `\n      ${progressBarHTML()}\n      <div class=\"card oral-stage\">\n        <div class=\"oral-phase-label\">\u00c9preuve orale termin\u00e9e<\/div>\n        <h2 style=\"margin: 16px 0;\">Bravo, l'entra\u00eenement chronom\u00e9tr\u00e9 est termin\u00e9.<\/h2>\n        <p style=\"color:var(--ink-soft); margin-bottom: 24px;\">Cette \u00e9preuve est \u00e9valu\u00e9e par un examinateur humain le jour de l'examen ; il n'y a pas de note automatique ici.<\/p>\n        <button class=\"btn\" onclick=\"finalizeSection('oral')\">Voir les r\u00e9sultats \u2192<\/button>\n      <\/div>\n    `;\n  }\n}\n\n\/\/ ============================================================\n\/\/ RESULTS\n\/\/ ============================================================\nfunction renderResults() {\n  clearTimer();\n  stopSpeak();\n  topbarSection.textContent = `${state.exam.title} \u00b7 R\u00e9sultats`;\n  globalTimer.textContent = \"\u2014\";\n\n  const minScores = { listening: 9, reading: 0, grammar: 9, written: 0, oral: 0 };\n  const maxScores = { listening: 15, reading: 10, grammar: 15, written: 30, oral: 30 };\n\n  const autoTotal = (state.scores.listening || 0) + (state.scores.reading || 0) + (state.scores.grammar || 0);\n  const autoMax = 15 + 10 + 15;\n\n  const rows = SECTION_KEYS.map((key, i) => {\n    const score = state.scores[key];\n    const isNumeric = typeof score === \"number\";\n    const min = minScores[key];\n    let rowClass = \"\";\n    if (isNumeric && min > 0) rowClass = score >= min ? \"pass-min\" : \"fail-min\";\n    return `\n      <div class=\"breakdown-row ${rowClass}\">\n        <div class=\"breakdown-name\">${SECTION_NAMES[i]}<\/div>\n        <div class=\"breakdown-score\">\n          ${isNumeric ? `${score} \/ ${maxScores[key]}` : `<em style=\"font-size:13px; color:var(--ink-soft);\">${score || \"\u2014\"}<\/em>`}\n          ${min > 0 && isNumeric ? `<span class=\"breakdown-minscore\">(seuil min. ${min})<\/span>` : \"\"}\n        <\/div>\n      <\/div>\n    `;\n  }).join(\"\");\n\n  const passedAuto = autoTotal >= 36 && (state.scores.listening || 0) >= 9 && (state.scores.grammar || 0) >= 9;\n\n  app.innerHTML = `\n    <div class=\"card\">\n      <div class=\"score-hero\">\n        <div class=\"score-label\">Score automatique (3 \u00e9preuves objectives)<\/div>\n        <div class=\"score-big ${passedAuto ? \"score-pass\" : \"score-fail\"}\">${autoTotal} \/ ${autoMax}<\/div>\n        <div class=\"score-label\" style=\"margin-top:8px;\">${passedAuto ? \"Seuils minimaux atteints sur les \u00e9preuves not\u00e9es automatiquement\" : \"Attention : un seuil minimal n'est pas atteint\"}<\/div>\n      <\/div>\n      <div class=\"breakdown\">${rows}<\/div>\n      <p style=\"font-size:13px; color:var(--ink-soft); margin-top:18px;\">Le score total officiel est sur 100 et inclut la production \u00e9crite et orale, \u00e9valu\u00e9es par un examinateur humain. Seules les \u00e9preuves de compr\u00e9hension orale, compr\u00e9hension \u00e9crite et grammaire sont not\u00e9es automatiquement ici.<\/p>\n      <div class=\"footer-nav\">\n        <button class=\"btn secondary\" onclick=\"renderLanding()\">\u2190 Retour \u00e0 l'accueil<\/button>\n        <button class=\"btn\" onclick=\"startExam(${state.examId})\">Refaire cette simulation<\/button>\n      <\/div>\n    <\/div>\n  `;\n}\n\n\/\/ ============================================================\n\/\/ INIT\n\/\/ ============================================================\nrenderLanding();\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>Simulation Examen B2 \u2014 Allingua Format (Set 2)<\/title>\n<link rel=\"preconnect\" href=\"https:\/\/fonts.googleapis.com\">\n<link href=\"https:\/\/fonts.googleapis.com\/css2?family=Source+Serif+4:opsz,wght@8..60,400;8..60,600;8..60,700&#038;family=Inter:wght@400;500;600;700&#038;family=JetBrains+Mono:wght@400;500&#038;display=swap\" rel=\"stylesheet\">\n<style>\n:root {\n  --bg: #FAFAF8;\n  --bg-card: #FFFFFF;\n  --ink: #1C1C1C;\n  --ink-soft: #5A5A54;\n  --navy: #1A3A5C;\n  --navy-deep: #102740;\n  --line: #DEDED6;\n  --success: #2D6A4F;\n  --success-bg: #E8F3EC;\n  --error: #9B2C2C;\n  --error-bg: #FBEAEA;\n  --amber: #B8860B;\n  --amber-bg: #FBF3E0;\n  --radius: 3px;\n}\n \n* { box-sizing: border-box; }\n \nbody {\n  margin: 0;\n  background: var(--bg);\n  color: var(--ink);\n  font-family: 'Inter', sans-serif;\n  font-size: 16px;\n  line-height: 1.55;\n}\n \nh1, h2, h3 { font-family: 'Source Serif 4', serif; margin: 0; }\n \n.app { max-width: 880px; margin: 0 auto; padding: 0 20px 80px; }\n \n\/* ===== TOP BAR \/ TIMER ===== *\/\n.topbar {\n  position: sticky;\n  top: 0;\n  z-index: 50;\n  background: var(--navy-deep);\n  color: #EFEFE8;\n  padding: 0;\n  border-bottom: 3px solid var(--amber);\n}\n.topbar-inner {\n  max-width: 880px;\n  margin: 0 auto;\n  display: flex;\n  align-items: center;\n  justify-content: space-between;\n  padding: 10px 20px;\n  gap: 16px;\n}\n.topbar-id {\n  font-size: 12px;\n  letter-spacing: 0.08em;\n  text-transform: uppercase;\n  color: #B9C6D4;\n}\n.topbar-section {\n  font-family: 'Source Serif 4', serif;\n  font-size: 17px;\n  font-weight: 600;\n  color: #fff;\n}\n.timer {\n  font-family: 'JetBrains Mono', monospace;\n  font-size: 22px;\n  font-weight: 500;\n  padding: 4px 14px;\n  border-radius: var(--radius);\n  background: rgba(255,255,255,0.08);\n  min-width: 92px;\n  text-align: center;\n  letter-spacing: 0.02em;\n}\n.timer.warn { background: rgba(184,134,11,0.35); color: #FFE9B0; }\n.timer.danger { background: rgba(155,44,44,0.45); color: #FFD2D2; animation: pulse 1s infinite; }\n@keyframes pulse { 50% { opacity: 0.55; } }\n \n\/* ===== HEADER \/ LANDING ===== *\/\n.masthead {\n  padding: 48px 0 28px;\n  border-bottom: 1px solid var(--line);\n  margin-bottom: 32px;\n}\n.eyebrow {\n  font-size: 12px;\n  letter-spacing: 0.14em;\n  text-transform: uppercase;\n  color: var(--navy);\n  font-weight: 600;\n  margin-bottom: 10px;\n}\n.masthead h1 {\n  font-size: 34px;\n  font-weight: 700;\n  color: var(--navy-deep);\n  line-height: 1.15;\n  margin-bottom: 10px;\n}\n.masthead p { color: var(--ink-soft); font-size: 15.5px; max-width: 560px; }\n \n.exam-grid {\n  display: grid;\n  gap: 16px;\n  margin-top: 28px;\n}\n.exam-card {\n  background: var(--bg-card);\n  border: 1px solid var(--line);\n  border-radius: var(--radius);\n  padding: 22px 24px;\n  display: flex;\n  align-items: center;\n  justify-content: space-between;\n  gap: 20px;\n  transition: border-color 0.15s, transform 0.15s;\n}\n.exam-card:hover { border-color: var(--navy); transform: translateX(2px); }\n.exam-card-title { font-family: 'Source Serif 4', serif; font-size: 19px; font-weight: 600; color: var(--navy-deep); margin-bottom: 4px; }\n.exam-card-meta { font-size: 13px; color: var(--ink-soft); }\n.btn {\n  font-family: 'Inter', sans-serif;\n  font-weight: 600;\n  font-size: 14px;\n  padding: 11px 20px;\n  border-radius: var(--radius);\n  border: none;\n  cursor: pointer;\n  background: var(--navy);\n  color: #fff;\n  white-space: nowrap;\n  transition: background 0.15s;\n}\n.btn:hover { background: var(--navy-deep); }\n.btn.secondary { background: transparent; color: var(--navy); border: 1.5px solid var(--navy); }\n.btn.secondary:hover { background: var(--navy); color: #fff; }\n.btn.ghost { background: transparent; color: var(--ink-soft); border: 1px solid var(--line); }\n.btn:disabled { opacity: 0.4; cursor: not-allowed; }\n \n\/* ===== SECTION NAV (intra-exam) ===== *\/\n.section-progress {\n  display: flex;\n  gap: 6px;\n  padding: 16px 0 0;\n  flex-wrap: wrap;\n}\n.dot {\n  font-size: 11px;\n  font-weight: 600;\n  padding: 5px 11px;\n  border-radius: 20px;\n  background: #EEEEE6;\n  color: var(--ink-soft);\n  letter-spacing: 0.02em;\n}\n.dot.active { background: var(--navy); color: #fff; }\n.dot.done { background: var(--success-bg); color: var(--success); }\n \n\/* ===== CARDS \/ SECTIONS ===== *\/\n.card {\n  background: var(--bg-card);\n  border: 1px solid var(--line);\n  border-radius: var(--radius);\n  padding: 28px 30px;\n  margin-bottom: 22px;\n}\n.card-label {\n  font-size: 12px;\n  text-transform: uppercase;\n  letter-spacing: 0.1em;\n  color: var(--navy);\n  font-weight: 600;\n  margin-bottom: 8px;\n}\n.card h2 { font-size: 22px; color: var(--navy-deep); margin-bottom: 4px; }\n.card .sub { color: var(--ink-soft); font-size: 14px; margin-bottom: 18px; }\n \n.instructions {\n  background: var(--amber-bg);\n  border-left: 3px solid var(--amber);\n  padding: 12px 16px;\n  font-size: 14px;\n  color: #6B5009;\n  border-radius: var(--radius);\n  margin-bottom: 22px;\n}\n \n\/* ===== AUDIO PLAYER ===== *\/\n.audio-box {\n  background: #F3F4F0;\n  border: 1px solid var(--line);\n  border-radius: var(--radius);\n  padding: 18px 20px;\n  margin-bottom: 20px;\n}\n.audio-controls { display: flex; align-items: center; gap: 12px; margin-bottom: 10px; }\n.play-btn {\n  width: 42px; height: 42px;\n  border-radius: 50%;\n  background: var(--navy);\n  border: none;\n  color: #fff;\n  font-size: 16px;\n  cursor: pointer;\n  display: flex; align-items: center; justify-content: center;\n  flex-shrink: 0;\n}\n.play-btn:hover { background: var(--navy-deep); }\n.play-btn:disabled { background: #BBB; cursor: not-allowed; }\n.audio-meta { font-size: 13px; color: var(--ink-soft); flex: 1; }\n.audio-meta strong { color: var(--ink); }\n.play-count { font-size: 12px; color: var(--ink-soft); }\n.transcript-toggle {\n  font-size: 12.5px;\n  color: var(--navy);\n  cursor: pointer;\n  text-decoration: underline dotted;\n  background: none;\n  border: none;\n  padding: 0;\n  margin-top: 4px;\n}\n.transcript {\n  margin-top: 12px;\n  padding: 12px 14px;\n  background: #fff;\n  border: 1px dashed var(--line);\n  border-radius: var(--radius);\n  font-size: 14px;\n  color: var(--ink-soft);\n  font-style: italic;\n  display: none;\n  line-height: 1.6;\n}\n.transcript.show { display: block; }\n \n\/* ===== READING TEXT ===== *\/\n.reading-text {\n  font-family: 'Source Serif 4', serif;\n  font-size: 16.5px;\n  line-height: 1.75;\n  color: #2A2A24;\n  padding: 18px 22px;\n  background: #F6F6F1;\n  border-radius: var(--radius);\n  margin-bottom: 22px;\n  border: 1px solid var(--line);\n}\n \n\/* ===== QUESTIONS ===== *\/\n.question-block { margin-bottom: 22px; padding-bottom: 18px; border-bottom: 1px solid var(--line); }\n.question-block:last-child { border-bottom: none; }\n.q-text { font-weight: 600; margin-bottom: 10px; font-size: 15px; }\n.q-num { color: var(--navy); margin-right: 6px; }\n.options { display: flex; flex-direction: column; gap: 8px; }\n.option {\n  display: flex;\n  align-items: center;\n  gap: 10px;\n  padding: 10px 14px;\n  border: 1px solid var(--line);\n  border-radius: var(--radius);\n  cursor: pointer;\n  font-size: 14.5px;\n  transition: border-color 0.12s, background 0.12s;\n}\n.option:hover { border-color: var(--navy); background: #F6F8FA; }\n.option.selected { border-color: var(--navy); background: #EAF0F6; font-weight: 500; }\n.option.correct { border-color: var(--success); background: var(--success-bg); }\n.option.incorrect { border-color: var(--error); background: var(--error-bg); }\n.option input { accent-color: var(--navy); }\n \n.reveal-btn {\n  font-size: 12.5px;\n  color: var(--ink-soft);\n  background: #EEEEE6;\n  border: none;\n  padding: 5px 12px;\n  border-radius: var(--radius);\n  cursor: pointer;\n  margin-top: 4px;\n}\n.reveal-btn:hover { background: #E2E2D8; }\n \n\/* ===== GRAMMAR FILL ===== *\/\n.fill-q { font-size: 15px; margin-bottom: 10px; }\n.fill-q code { background: #F0F0E8; padding: 1px 4px; border-radius: 2px; }\n \n\/* ===== WRITTEN PRODUCTION ===== *\/\n.prompt-box {\n  background: #EFF3F7;\n  border: 1px solid #C9D7E3;\n  border-radius: var(--radius);\n  padding: 16px 18px;\n  margin-bottom: 18px;\n}\n.prompt-type { font-size: 12px; text-transform: uppercase; letter-spacing: 0.08em; color: var(--navy); font-weight: 600; margin-bottom: 6px; }\n.word-count { font-size: 13px; color: var(--ink-soft); margin-top: 8px; text-align: right; }\n.word-count.over { color: var(--error); font-weight: 600; }\n \ntextarea.essay {\n  width: 100%;\n  min-height: 280px;\n  font-family: 'Source Serif 4', serif;\n  font-size: 16px;\n  line-height: 1.6;\n  padding: 16px 18px;\n  border: 1px solid var(--line);\n  border-radius: var(--radius);\n  resize: vertical;\n  color: var(--ink);\n  background: #fff;\n}\ntextarea.essay:focus { outline: 2px solid var(--navy); outline-offset: 1px; }\n \n\/* Virtual keyboard *\/\n.vkb-toggle {\n  display: inline-flex;\n  align-items: center;\n  gap: 6px;\n  font-size: 13px;\n  color: var(--navy);\n  background: #fff;\n  border: 1px solid var(--navy);\n  padding: 7px 13px;\n  border-radius: var(--radius);\n  cursor: pointer;\n  margin: 10px 0;\n}\n.vkb-toggle:hover { background: #EAF0F6; }\n.vkb {\n  display: none;\n  margin-top: 10px;\n  padding: 14px;\n  background: #ECECE4;\n  border-radius: var(--radius);\n  border: 1px solid var(--line);\n}\n.vkb.show { display: block; }\n.vkb-row { display: flex; gap: 5px; margin-bottom: 5px; justify-content: center; }\n.vkb-key {\n  min-width: 36px;\n  height: 38px;\n  padding: 0 6px;\n  background: #fff;\n  border: 1px solid #CCCCC0;\n  border-radius: 4px;\n  font-size: 15px;\n  cursor: pointer;\n  font-family: 'Inter', sans-serif;\n  color: var(--ink);\n  box-shadow: 0 1px 0 rgba(0,0,0,0.06);\n}\n.vkb-key:hover { background: var(--navy); color: #fff; border-color: var(--navy); }\n.vkb-key:active { transform: translateY(1px); box-shadow: none; }\n.vkb-key.wide { min-width: 70px; font-size: 12px; }\n \n\/* ===== ORAL ===== *\/\n.oral-topic-list { display: flex; flex-direction: column; gap: 10px; margin-bottom: 20px; }\n.oral-topic {\n  padding: 14px 16px;\n  background: #F6F6F1;\n  border: 1px solid var(--line);\n  border-radius: var(--radius);\n  font-size: 15px;\n  cursor: pointer;\n}\n.oral-topic:hover { border-color: var(--navy); }\n.oral-topic.picked { border-color: var(--amber); background: var(--amber-bg); font-weight: 600; }\n.oral-stage {\n  text-align: center;\n  padding: 40px 20px;\n}\n.oral-stage .big-timer {\n  font-family: 'JetBrains Mono', monospace;\n  font-size: 56px;\n  font-weight: 500;\n  color: var(--navy-deep);\n  margin: 14px 0;\n}\n.oral-phase-label { font-size: 13px; text-transform: uppercase; letter-spacing: 0.1em; color: var(--ink-soft); }\n.oral-topic-display { font-family: 'Source Serif 4', serif; font-size: 19px; margin: 18px 0; color: var(--navy-deep); max-width: 500px; margin-left: auto; margin-right: auto; }\n.oral-plan-hint { font-size: 13px; color: var(--ink-soft); margin-top: 24px; text-align: left; background: #F6F6F1; padding: 14px 18px; border-radius: var(--radius); max-width: 460px; margin-left: auto; margin-right: auto; }\n \n\/* ===== FOOTER NAV ===== *\/\n.footer-nav {\n  display: flex;\n  justify-content: space-between;\n  align-items: center;\n  margin-top: 24px;\n  padding-top: 18px;\n}\n \n\/* ===== RESULTS ===== *\/\n.score-hero {\n  text-align: center;\n  padding: 36px 0;\n}\n.score-big {\n  font-family: 'Source Serif 4', serif;\n  font-size: 64px;\n  font-weight: 700;\n  color: var(--navy-deep);\n}\n.score-pass { color: var(--success); }\n.score-fail { color: var(--error); }\n.score-label { font-size: 14px; color: var(--ink-soft); text-transform: uppercase; letter-spacing: 0.08em; margin-top: 4px; }\n.breakdown { display: grid; gap: 10px; margin-top: 24px; }\n.breakdown-row {\n  display: flex;\n  justify-content: space-between;\n  align-items: center;\n  padding: 12px 16px;\n  background: #F6F6F1;\n  border-radius: var(--radius);\n  border: 1px solid var(--line);\n}\n.breakdown-row.fail-min { border-left: 3px solid var(--error); }\n.breakdown-row.pass-min { border-left: 3px solid var(--success); }\n.breakdown-name { font-weight: 600; font-size: 14.5px; }\n.breakdown-score { font-family: 'JetBrains Mono', monospace; font-size: 15px; }\n.breakdown-minscore { font-size: 12px; color: var(--ink-soft); margin-left: 8px; }\n \n.hidden { display: none !important; }\n \n@media (max-width: 600px) {\n  .masthead h1 { font-size: 26px; }\n  .card { padding: 20px 18px; }\n  .oral-stage .big-timer { font-size: 42px; }\n  .vkb-key { min-width: 28px; height: 34px; font-size: 13px; }\n}\n<\/style>\n<\/head>\n<body>\n \n<div class=\"topbar\">\n  <div class=\"topbar-inner\">\n    <div class=\"topbar-id\" id=\"topbarId\">B2 \u00b7 ALLINGUA FORMAT<\/div>\n    <div class=\"topbar-section\" id=\"topbarSection\">\u2014<\/div>\n    <div class=\"timer\" id=\"globalTimer\">--:--<\/div>\n  <\/div>\n<\/div>\n \n<div class=\"app\" id=\"app\"><\/div>\n \n<script>\n\/\/ ============================================================\n\/\/ DONN\u00c9ES DES SIMULATIONS 4, 5, 6 \u2014 NOUVEAUX TH\u00c8MES\n\/\/ Migration, num\u00e9risation, sant\u00e9 publique, t\u00e9l\u00e9travail\/\u00e9ducation\n\/\/ ============================================================\n \nconst EXAMS = [\n  \/\/ ============================================================\n  \/\/ SIMULATION 4 \u2014 Migration & Num\u00e9risation\n  \/\/ ============================================================\n  {\n    id: 4,\n    title: \"Simulation 4\",\n    listening: {\n      duration: 25 * 60,\n      maxScore: 15,\n      passages: [\n        {\n          title: \"Document 1 \u2014 Bulletin d'actualit\u00e9 : migration\",\n          script: \"Bonjour \u00e0 toutes et \u00e0 tous. \u00c0 la une de cette \u00e9dition : un nouveau rapport de l'Organisation internationale pour les migrations souligne l'\u00e9volution des flux migratoires en Europe au cours des cinq derni\u00e8res ann\u00e9es. Selon ce rapport, si le nombre total de demandes d'asile a globalement augment\u00e9, les profils des personnes concern\u00e9es se sont \u00e9galement diversifi\u00e9s, avec une part croissante de migrants qualifi\u00e9s cherchant \u00e0 s'int\u00e9grer sur le march\u00e9 du travail europ\u00e9en. Plusieurs pays ont ainsi r\u00e9vis\u00e9 leurs politiques d'accueil, en simplifiant notamment les proc\u00e9dures de reconnaissance des dipl\u00f4mes \u00e9trangers. Cette \u00e9volution est salu\u00e9e par certains \u00e9conomistes, qui rappellent que de nombreux secteurs, notamment la sant\u00e9 et la construction, souffrent d'une p\u00e9nurie de main-d'\u0153uvre. D'autres voix, en revanche, appellent \u00e0 la prudence, estimant que l'int\u00e9gration r\u00e9ussie des migrants n\u00e9cessite des investissements importants en mati\u00e8re de formation linguistique et d'accompagnement social, des investissements qui restent, selon elles, encore insuffisants dans plusieurs pays membres de l'Union.\",\n          questions: [\n            { q: \"Quel organisme a publi\u00e9 le rapport mentionn\u00e9 ?\", options: [\"L'Organisation internationale pour les migrations\", \"L'Organisation mondiale de la sant\u00e9\", \"La Commission europ\u00e9enne\"], correct: 0 },\n            { q: \"Comment les profils des migrants ont-ils \u00e9volu\u00e9 selon le rapport ?\", options: [\"Ils sont rest\u00e9s identiques\", \"Part croissante de migrants qualifi\u00e9s\", \"Diminution g\u00e9n\u00e9rale du nombre de migrants\"], correct: 1 },\n            { q: \"Qu'ont fait plusieurs pays concernant les dipl\u00f4mes \u00e9trangers ?\", options: [\"Ils ont supprim\u00e9 leur reconnaissance\", \"Ils ont simplifi\u00e9 les proc\u00e9dures de reconnaissance\", \"Ils n'ont rien chang\u00e9\"], correct: 1 },\n            { q: \"Quels secteurs souffrent d'une p\u00e9nurie de main-d'\u0153uvre selon le reportage ?\", options: [\"La sant\u00e9 et la construction\", \"Le tourisme uniquement\", \"L'agriculture uniquement\"], correct: 0 },\n            { q: \"Que r\u00e9clament certaines voix pour une int\u00e9gration r\u00e9ussie ?\", options: [\"Moins de contr\u00f4les aux fronti\u00e8res\", \"Des investissements en formation linguistique et accompagnement\", \"La suppression totale des aides sociales\"], correct: 1 },\n          ],\n        },\n        {\n          title: \"Document 2 \u2014 Interview : num\u00e9risation et fracture num\u00e9rique\",\n          script: \"Aujourd'hui, nous recevons un chercheur sp\u00e9cialiste des in\u00e9galit\u00e9s num\u00e9riques. Bonjour, merci d'\u00eatre avec nous. Bonjour, c'est un plaisir d'\u00eatre ici. La num\u00e9risation des services publics s'acc\u00e9l\u00e8re partout en Europe. Quels sont, selon vous, les principaux risques de cette \u00e9volution ? Le risque principal, c'est ce qu'on appelle la fracture num\u00e9rique. Lorsque les d\u00e9marches administratives deviennent exclusivement accessibles en ligne, on exclut de fait une partie de la population : les personnes \u00e2g\u00e9es, celles qui n'ont pas acc\u00e8s \u00e0 une connexion internet stable, ou encore celles qui ne ma\u00eetrisent pas suffisamment les outils num\u00e9riques. Avez-vous des exemples concrets de ces difficult\u00e9s ? Oui, par exemple, le renouvellement de certains documents administratifs, ou la prise de rendez-vous m\u00e9dicaux, deviennent parfois impossibles sans comp\u00e9tences num\u00e9riques de base. Cela cr\u00e9e une double exclusion, \u00e0 la fois sociale et num\u00e9rique. Quelles solutions pr\u00e9conisez-vous ? Il est essentiel de maintenir des points d'accueil physiques en parall\u00e8le de la d\u00e9mat\u00e9rialisation, ainsi que des formations gratuites pour accompagner les publics les plus fragiles dans cette transition.\",\n          questions: [\n            { q: \"Quelle est la sp\u00e9cialit\u00e9 du chercheur interview\u00e9 ?\", options: [\"Les in\u00e9galit\u00e9s num\u00e9riques\", \"L'\u00e9conomie internationale\", \"La sant\u00e9 publique\"], correct: 0 },\n            { q: \"Quel est le principal risque \u00e9voqu\u00e9 de la num\u00e9risation des services publics ?\", options: [\"La fracture num\u00e9rique\", \"L'augmentation des co\u00fbts\", \"La lenteur des proc\u00e9dures\"], correct: 0 },\n            { q: \"Qui est particuli\u00e8rement concern\u00e9 par cette exclusion num\u00e9rique ?\", options: [\"Les jeunes dipl\u00f4m\u00e9s\", \"Les personnes \u00e2g\u00e9es et celles sans acc\u00e8s internet stable\", \"Les fonctionnaires\"], correct: 1 },\n            { q: \"Quel exemple concret est donn\u00e9 ?\", options: [\"Le renouvellement de documents administratifs en ligne\", \"L'achat de billets de train\", \"La r\u00e9servation de restaurants\"], correct: 0 },\n            { q: \"Quelle solution le chercheur pr\u00e9conise-t-il ?\", options: [\"Supprimer totalement le num\u00e9rique\", \"Maintenir des points d'accueil physiques et des formations\", \"Rendre tout payant pour financer l'acc\u00e8s\"], correct: 1 },\n          ],\n        },\n        {\n          title: \"Document 3 \u2014 Reportage : int\u00e9gration des migrants par le travail\",\n          script: \"Nous sommes aujourd'hui dans un centre de formation professionnelle qui propose un programme sp\u00e9cifique destin\u00e9 aux personnes r\u00e9cemment arriv\u00e9es en France. Ce programme combine cours de langue intensifs et formation technique dans des secteurs en tension, comme la logistique ou les m\u00e9tiers du soin. La responsable du centre nous explique : Nous avons constat\u00e9 que l'apprentissage de la langue est beaucoup plus rapide et plus motivant lorsqu'il est directement li\u00e9 \u00e0 un objectif professionnel concret. Les participants suivent vingt heures de cours par semaine, et la majorit\u00e9 d'entre eux trouvent un emploi dans les six mois suivant la fin de la formation. Une participante, originaire de Syrie, t\u00e9moigne : Avant ce programme, je me sentais isol\u00e9e, je ne comprenais pas les d\u00e9marches administratives, je n'osais pas chercher de travail. Aujourd'hui, je travaille comme aide-soignante et je me sens enfin utile dans cette soci\u00e9t\u00e9. La responsable souligne toutefois que ce type de programme reste insuffisamment financ\u00e9 par rapport \u00e0 la demande, avec des listes d'attente de plusieurs mois dans certaines r\u00e9gions.\",\n          questions: [\n            { q: \"Que combine le programme de formation pr\u00e9sent\u00e9 ?\", options: [\"Cours de langue et formation technique\", \"Uniquement des cours de langue\", \"Uniquement de la formation technique\"], correct: 0 },\n            { q: \"Dans quels secteurs la formation technique est-elle propos\u00e9e ?\", options: [\"La finance et le droit\", \"La logistique et les m\u00e9tiers du soin\", \"L'informatique uniquement\"], correct: 1 },\n            { q: \"Combien d'heures de cours par semaine suivent les participants ?\", options: [\"10 heures\", \"20 heures\", \"35 heures\"], correct: 1 },\n            { q: \"Que fait la participante syrienne aujourd'hui ?\", options: [\"Elle est \u00e9tudiante\", \"Elle travaille comme aide-soignante\", \"Elle est sans emploi\"], correct: 1 },\n            { q: \"Quel probl\u00e8me la responsable souligne-t-elle \u00e0 la fin ?\", options: [\"Le programme est trop cher pour les participants\", \"Le financement est insuffisant, listes d'attente longues\", \"Le programme va \u00eatre supprim\u00e9\"], correct: 1 },\n          ],\n        },\n      ],\n    },\n    reading: {\n      duration: 25 * 60,\n      maxScore: 10,\n      texts: [\n        {\n          title: \"Texte 1 \u2014 Article de presse\",\n          content: \"La question migratoire continue de diviser l'opinion publique europ\u00e9enne, alors m\u00eame que les donn\u00e9es d\u00e9mographiques dessinent un tableau plus nuanc\u00e9 que ne le laissent penser les d\u00e9bats politiques. Selon plusieurs \u00e9tudes r\u00e9centes, le vieillissement de la population europ\u00e9enne et le d\u00e9clin de la natalit\u00e9 dans de nombreux pays membres rendent l'apport migratoire structurellement n\u00e9cessaire au maintien de certains \u00e9quilibres \u00e9conomiques, notamment en ce qui concerne le financement des syst\u00e8mes de retraite et la disponibilit\u00e9 de main-d'\u0153uvre dans des secteurs essentiels. Pourtant, cette r\u00e9alit\u00e9 statistique se heurte souvent \u00e0 des perceptions tr\u00e8s diff\u00e9rentes au sein de l'opinion publique, o\u00f9 les questions identitaires et culturelles occupent une place centrale dans le d\u00e9bat. Les chercheurs en sciences sociales soulignent par ailleurs que les politiques d'int\u00e9gration jouent un r\u00f4le d\u00e9terminant dans la r\u00e9ussite ou l'\u00e9chec de ces dynamiques migratoires : un acc\u00e8s rapide \u00e0 la formation linguistique, \u00e0 l'emploi et au logement favorise une int\u00e9gration durable, tandis que des politiques restrictives ou des d\u00e9lais administratifs excessifs peuvent au contraire favoriser la pr\u00e9carit\u00e9 et l'isolement social des personnes concern\u00e9es.\",\n          questions: [\n            { q: \"Que r\u00e9v\u00e8lent les donn\u00e9es d\u00e9mographiques selon le texte ?\", options: [\"Une croissance d\u00e9mographique forte en Europe\", \"Un vieillissement et un d\u00e9clin de la natalit\u00e9 rendant la migration n\u00e9cessaire\", \"Une absence de tout probl\u00e8me d\u00e9mographique\"], correct: 1 },\n            { q: \"Pourquoi l'apport migratoire est-il jug\u00e9 n\u00e9cessaire \u00e9conomiquement ?\", options: [\"Pour le financement des retraites et la main-d'\u0153uvre\", \"Pour augmenter les imp\u00f4ts\", \"Pour r\u00e9duire la population active\"], correct: 0 },\n            { q: \"Quelle place occupent les questions identitaires dans le d\u00e9bat public selon le texte ?\", options: [\"Une place marginale\", \"Une place centrale\", \"Aucune place\"], correct: 1 },\n            { q: \"Quel facteur favorise une int\u00e9gration durable selon les chercheurs ?\", options: [\"Des d\u00e9lais administratifs longs\", \"Un acc\u00e8s rapide \u00e0 la formation, l'emploi et le logement\", \"L'isolement social volontaire\"], correct: 1 },\n            { q: \"Que peuvent provoquer des politiques restrictives selon le texte ?\", options: [\"Une int\u00e9gration plus rapide\", \"La pr\u00e9carit\u00e9 et l'isolement social\", \"Aucun effet particulier\"], correct: 1 },\n          ],\n        },\n        {\n          title: \"Texte 2 \u2014 Rapport \/ document professionnel\",\n          content: \"Note de synth\u00e8se \u2014 Direction des syst\u00e8mes d'information. Objet : bilan de la transformation num\u00e9rique des services aux usagers. La pr\u00e9sente note dresse un \u00e9tat des lieux de la d\u00e9mat\u00e9rialisation des d\u00e9marches administratives mise en \u0153uvre au cours des deux derni\u00e8res ann\u00e9es au sein de notre administration. Au total, soixante-quinze pour cent des d\u00e9marches sont d\u00e9sormais accessibles en ligne, contre quarante pour cent il y a deux ans, ce qui repr\u00e9sente une progression significative en termes d'efficacit\u00e9 et de r\u00e9duction des d\u00e9lais de traitement. Toutefois, une enqu\u00eate de satisfaction men\u00e9e aupr\u00e8s des usagers r\u00e9v\u00e8le que vingt-deux pour cent d'entre eux d\u00e9clarent avoir rencontr\u00e9 des difficult\u00e9s importantes pour effectuer leurs d\u00e9marches en ligne, principalement en raison d'un manque de comp\u00e9tences num\u00e9riques ou d'un acc\u00e8s limit\u00e9 \u00e0 internet. Ce constat a conduit la direction \u00e0 maintenir, contrairement au plan initial, l'ensemble des points d'accueil physiques existants, et \u00e0 renforcer les permanences d'aide aux d\u00e9marches num\u00e9riques dans les zones rurales et aupr\u00e8s des publics \u00e2g\u00e9s. La direction recommande de poursuivre cette double approche, combinant d\u00e9mat\u00e9rialisation et accompagnement humain, plut\u00f4t que de viser une d\u00e9mat\u00e9rialisation int\u00e9grale \u00e0 court terme.\",\n          questions: [\n            { q: \"Quel pourcentage de d\u00e9marches est d\u00e9sormais accessible en ligne ?\", options: [\"40%\", \"55%\", \"75%\"], correct: 2 },\n            { q: \"Quel pourcentage d'usagers a rencontr\u00e9 des difficult\u00e9s importantes ?\", options: [\"12%\", \"22%\", \"35%\"], correct: 1 },\n            { q: \"Quelle est la principale cause de ces difficult\u00e9s ?\", options: [\"Manque de comp\u00e9tences num\u00e9riques ou d'acc\u00e8s internet\", \"Sites web trop simples\", \"Trop de personnel disponible\"], correct: 0 },\n            { q: \"Qu'a d\u00e9cid\u00e9 la direction concernant les points d'accueil physiques ?\", options: [\"Les supprimer totalement\", \"Les maintenir tous\", \"En supprimer la moiti\u00e9\"], correct: 1 },\n            { q: \"Que recommande la direction pour l'avenir ?\", options: [\"Une d\u00e9mat\u00e9rialisation int\u00e9grale imm\u00e9diate\", \"Combiner d\u00e9mat\u00e9rialisation et accompagnement humain\", \"Revenir au tout papier\"], correct: 1 },\n          ],\n        },\n      ],\n    },\n    grammar: {\n      duration: 20 * 60,\n      maxScore: 15,\n      sections: [\n        {\n          title: \"1. Subjonctif ou indicatif\",\n          items: [\n            { q: \"Il est n\u00e9cessaire que les autorit\u00e9s _______ (agir) rapidement.\", options: [\"agissent\", \"agiront\", \"agissaient\"], correct: 0 },\n            { q: \"Je suis convaincu que cette r\u00e9forme _______ (am\u00e9liorer) la situation.\", options: [\"am\u00e9liore\", \"am\u00e9liorera\", \"ait am\u00e9lior\u00e9\"], correct: 1 },\n            { q: \"Bien que la proc\u00e9dure _______ (sembler) complexe, elle reste accessible.\", options: [\"semble\", \"semblera\", \"semblait\"], correct: 0 },\n            { q: \"Il est probable que le nombre de demandes _______ (augmenter) encore.\", options: [\"augmente\", \"augmentera\", \"ait augment\u00e9\"], correct: 1 },\n            { q: \"Nous voulons que chaque candidat _______ (recevoir) une r\u00e9ponse claire.\", options: [\"re\u00e7oit\", \"re\u00e7oive\", \"recevra\"], correct: 1 },\n          ],\n        },\n        {\n          title: \"2. Pronoms relatifs\",\n          items: [\n            { q: \"C'est une d\u00e9marche _______ prend du temps.\", options: [\"qui\", \"que\", \"dont\"], correct: 0 },\n            { q: \"Le pays _______ elle est arriv\u00e9e l'an dernier l'a bien accueillie.\", options: [\"dont\", \"o\u00f9\", \"que\"], correct: 1 },\n            { q: \"Voici les documents _______ vous aurez besoin pour la demande.\", options: [\"que\", \"dont\", \"o\u00f9\"], correct: 1 },\n            { q: \"_______ inqui\u00e8te les autorit\u00e9s, c'est la lenteur des proc\u00e9dures.\", options: [\"Ce que\", \"Ce qui\", \"Ce dont\"], correct: 1 },\n            { q: \"Le formulaire \u00e0 partir _______ on d\u00e9pose une demande est en ligne.\", options: [\"duquel\", \"dont\", \"que\"], correct: 0 },\n          ],\n        },\n        {\n          title: \"3. Connecteurs logiques\",\n          items: [\n            { q: \"_______ les obstacles administratifs, elle a obtenu son titre de s\u00e9jour.\", options: [\"Malgr\u00e9\", \"Bien qu'\", \"Car\"], correct: 0 },\n            { q: \"Il a r\u00e9ussi son int\u00e9gration _______ il ne parlait pas la langue au d\u00e9part.\", options: [\"bien qu'\", \"car\", \"donc\"], correct: 0 },\n            { q: \"Elle suit des cours du soir _______ progresser plus vite.\", options: [\"afin de\", \"afin que\", \"parce que\"], correct: 0 },\n            { q: \"_______ vous ayez des difficult\u00e9s, contactez ce service d'aide.\", options: [\"Si\", \"Au cas o\u00f9\", \"Pourvu que\"], correct: 1 },\n            { q: \"Le dossier a \u00e9t\u00e9 refus\u00e9, _______ il manquait un document essentiel.\", options: [\"car\", \"donc\", \"or\"], correct: 0 },\n          ],\n        },\n        {\n          title: \"4. Voix passive et discours indirect\",\n          items: [\n            { q: \"\u00ab On a simplifi\u00e9 la proc\u00e9dure. \u00bb Forme passive :\", options: [\"La proc\u00e9dure a \u00e9t\u00e9 simplifi\u00e9e.\", \"La proc\u00e9dure simplifiait.\", \"La proc\u00e9dure sera simplifi\u00e9e.\"], correct: 0 },\n            { q: \"Il a dit : \u00ab Je d\u00e9poserai ma demande demain. \u00bb \u2192 Il a dit qu'_______\", options: [\"il d\u00e9posera sa demande demain.\", \"il d\u00e9poserait sa demande le lendemain.\", \"il a d\u00e9pos\u00e9 sa demande.\"], correct: 1 },\n            { q: \"Elle a demand\u00e9 : \u00ab Avez-vous tous les documents ? \u00bb \u2192 Elle a demand\u00e9 _______\", options: [\"si nous avions tous les documents.\", \"que nous ayons tous les documents.\", \"si nous aurons tous les documents.\"], correct: 0 },\n            { q: \"\u00ab Pr\u00e9sentez votre passeport ! \u00bb a-t-on dit. \u2192 On a dit _______\", options: [\"de pr\u00e9senter son passeport.\", \"qu'il pr\u00e9sente son passeport.\", \"de pr\u00e9sentant son passeport.\"], correct: 0 },\n            { q: \"Le dossier _______ examin\u00e9 par la commission la semaine prochaine. (passif)\", options: [\"sera\", \"aura \u00e9t\u00e9\", \"serait\"], correct: 0 },\n          ],\n        },\n        {\n          title: \"5. Pr\u00e9positions et verbes\",\n          items: [\n            { q: \"Cette mesure contribue _______ faciliter l'acc\u00e8s aux services.\", options: [\"\u00e0\", \"de\", \"pour\"], correct: 0 },\n            { q: \"Il s'agit _______ simplifier les d\u00e9marches administratives.\", options: [\"\u00e0\", \"de\", \"sur\"], correct: 1 },\n            { q: \"Les experts insistent _______ l'importance de la formation linguistique.\", options: [\"sur\", \"de\", \"\u00e0\"], correct: 0 },\n            { q: \"Le succ\u00e8s de l'int\u00e9gration d\u00e9pend _______ plusieurs facteurs.\", options: [\"\u00e0\", \"de\", \"sur\"], correct: 1 },\n            { q: \"L'administration s'engage _______ r\u00e9duire les d\u00e9lais de traitement.\", options: [\"\u00e0\", \"de\", \"pour\"], correct: 0 },\n          ],\n        },\n        {\n          title: \"6. Articles et accords\",\n          items: [\n            { q: \"_______ majorit\u00e9 des dossiers est trait\u00e9e en ligne.\", options: [\"La\", \"Une\", \"Des\"], correct: 0 },\n            { q: \"Elle a fait preuve _______ patience remarquable face aux d\u00e9marches.\", options: [\"la\", \"une\", \"de la\"], correct: 1 },\n            { q: \"Ce sont _______ proc\u00e9dures particuli\u00e8rement longues.\", options: [\"les\", \"des\", \"de\"], correct: 1 },\n            { q: \"Il reste attentif _______ besoins des usagers les plus fragiles.\", options: [\"les\", \"aux\", \"des\"], correct: 1 },\n            { q: \"_______ situations n'avaient jamais \u00e9t\u00e9 observ\u00e9es avant la r\u00e9forme.\", options: [\"De telles\", \"Les\", \"Des\"], correct: 0 },\n          ],\n        },\n      ],\n    },\n    written: {\n      duration: 40 * 60,\n      maxScore: 30,\n      prompts: [\n        { type: \"Sujet argumentatif\", text: \"La num\u00e9risation des services publics doit-elle s'accompagner du maintien de points d'accueil physiques ? Justifiez votre point de vue. (200 mots maximum)\" },\n        { type: \"Sujet cr\u00e9atif\", text: \"Racontez le t\u00e9moignage, r\u00e9el ou imaginaire, d'une personne qui a d\u00fb s'adapter \u00e0 un nouveau pays ou \u00e0 une nouvelle technologie. (200 mots maximum)\" },\n      ],\n    },\n    oral: {\n      duration: 10 * 60,\n      maxScore: 30,\n      topics: [\n        \"L'immigration est-elle une n\u00e9cessit\u00e9 \u00e9conomique pour l'Europe ?\",\n        \"La num\u00e9risation des services publics risque-t-elle d'exclure certains citoyens ?\",\n        \"Quelles politiques favorisent, selon vous, une int\u00e9gration r\u00e9ussie des migrants ?\",\n      ],\n    },\n  },\n \n  \/\/ ============================================================\n  \/\/ SIMULATION 5 \u2014 Sant\u00e9 publique\n  \/\/ ============================================================\n  {\n    id: 5,\n    title: \"Simulation 5\",\n    listening: {\n      duration: 25 * 60,\n      maxScore: 15,\n      passages: [\n        {\n          title: \"Document 1 \u2014 Bulletin d'actualit\u00e9 : sant\u00e9 publique\",\n          script: \"Bonjour \u00e0 tous, voici les titres du jour. Les autorit\u00e9s sanitaires europ\u00e9ennes alertent sur une hausse pr\u00e9occupante des maladies chroniques li\u00e9es au mode de vie, notamment le diab\u00e8te de type deux et les maladies cardiovasculaires. Selon les derniers chiffres publi\u00e9s, ces pathologies repr\u00e9senteraient d\u00e9sormais plus de soixante pour cent des d\u00e9c\u00e8s \u00e9vitables sur le continent. Plusieurs facteurs sont point\u00e9s du doigt par les experts : la s\u00e9dentarit\u00e9 croissante, une alimentation d\u00e9s\u00e9quilibr\u00e9e, et l'exposition prolong\u00e9e au stress chronique. Face \u00e0 ce constat, certains gouvernements envisagent de renforcer les campagnes de pr\u00e9vention, notamment aupr\u00e8s des jeunes publics, et d'introduire une taxation plus stricte sur les produits ultra-transform\u00e9s. Ces mesures sont toutefois critiqu\u00e9es par certains repr\u00e9sentants de l'industrie agroalimentaire, qui estiment qu'elles p\u00e9nalisent injustement les consommateurs aux revenus modestes, pour qui ces produits restent souvent les plus accessibles financi\u00e8rement. Le d\u00e9bat sur l'\u00e9quilibre entre pr\u00e9vention sanitaire et libert\u00e9 de consommation devrait occuper une place importante dans les prochains d\u00e9bats parlementaires.\",\n          questions: [\n            { q: \"Quelles maladies sont en hausse selon le bulletin ?\", options: [\"Les maladies infectieuses\", \"Le diab\u00e8te de type deux et les maladies cardiovasculaires\", \"Les maladies rares uniquement\"], correct: 1 },\n            { q: \"Quel pourcentage des d\u00e9c\u00e8s \u00e9vitables ces pathologies repr\u00e9senteraient-elles ?\", options: [\"30%\", \"60%\", \"90%\"], correct: 1 },\n            { q: \"Quels facteurs sont point\u00e9s du doigt par les experts ?\", options: [\"S\u00e9dentarit\u00e9, alimentation d\u00e9s\u00e9quilibr\u00e9e, stress chronique\", \"Uniquement le tabac\", \"Uniquement la pollution\"], correct: 0 },\n            { q: \"Que pr\u00e9voient certains gouvernements ?\", options: [\"Supprimer toute pr\u00e9vention\", \"Renforcer la pr\u00e9vention et taxer les produits ultra-transform\u00e9s\", \"Ignorer le probl\u00e8me\"], correct: 1 },\n            { q: \"Pourquoi ces mesures sont-elles critiqu\u00e9es par certains ?\", options: [\"Elles co\u00fbtent trop cher \u00e0 l'\u00c9tat\", \"Elles p\u00e9nalisent les consommateurs aux revenus modestes\", \"Elles sont inefficaces scientifiquement\"], correct: 1 },\n          ],\n        },\n        {\n          title: \"Document 2 \u2014 Interview : acc\u00e8s aux soins\",\n          script: \"Notre invit\u00e9e aujourd'hui est m\u00e9decin g\u00e9n\u00e9raliste, install\u00e9e depuis dix ans dans une zone rurale. Bonjour docteur, merci d'\u00eatre avec nous. Bonjour, merci \u00e0 vous. Pouvez-vous nous d\u00e9crire la situation de l'acc\u00e8s aux soins dans les zones rurales aujourd'hui ? La situation est pr\u00e9occupante. De nombreux villages se trouvent d\u00e9sormais \u00e0 plus de trente minutes du m\u00e9decin le plus proche, et certaines sp\u00e9cialit\u00e9s m\u00e9dicales sont quasiment inaccessibles sans se d\u00e9placer vers les grandes villes. Cela touche particuli\u00e8rement les personnes \u00e2g\u00e9es et celles qui n'ont pas de moyen de transport personnel. Quelles solutions voyez-vous se d\u00e9velopper ? La t\u00e9l\u00e9consultation s'est beaucoup d\u00e9velopp\u00e9e, notamment depuis la pand\u00e9mie, et elle permet de pallier en partie ce manque, en particulier pour le suivi de pathologies chroniques. Cependant, elle ne peut pas remplacer enti\u00e8rement une consultation physique, surtout pour les examens n\u00e9cessitant un contact direct. Certaines collectivit\u00e9s locales ont \u00e9galement mis en place des maisons de sant\u00e9 pluridisciplinaires, regroupant plusieurs professionnels au m\u00eame endroit, ce qui facilite l'acc\u00e8s aux soins. Quel serait, selon vous, le levier le plus efficace pour am\u00e9liorer durablement la situation ? Il faudrait surtout revoir les incitations \u00e0 l'installation des jeunes m\u00e9decins en zone rurale, car beaucoup pr\u00e9f\u00e8rent aujourd'hui s'installer en ville, o\u00f9 les conditions de travail sont jug\u00e9es plus attractives.\",\n          questions: [\n            { q: \"Depuis combien de temps la m\u00e9decin est-elle install\u00e9e en zone rurale ?\", options: [\"Cinq ans\", \"Dix ans\", \"Vingt ans\"], correct: 1 },\n            { q: \"Qui est particuli\u00e8rement touch\u00e9 par le manque d'acc\u00e8s aux soins ?\", options: [\"Les personnes \u00e2g\u00e9es sans moyen de transport\", \"Les jeunes actifs uniquement\", \"Les touristes\"], correct: 0 },\n            { q: \"Quelle solution s'est d\u00e9velopp\u00e9e depuis la pand\u00e9mie ?\", options: [\"La t\u00e9l\u00e9consultation\", \"La fermeture des cabinets\", \"Les visites \u00e0 domicile uniquement\"], correct: 0 },\n            { q: \"Quelle limite a la t\u00e9l\u00e9consultation selon la m\u00e9decin ?\", options: [\"Elle est trop ch\u00e8re\", \"Elle ne remplace pas une consultation physique pour certains examens\", \"Elle n'existe pas en zone rurale\"], correct: 1 },\n            { q: \"Quel levier la m\u00e9decin juge-t-elle le plus efficace ?\", options: [\"Revoir les incitations \u00e0 l'installation des jeunes m\u00e9decins en zone rurale\", \"Construire plus d'h\u00f4pitaux en ville\", \"R\u00e9duire le nombre de m\u00e9decins\"], correct: 0 },\n          ],\n        },\n        {\n          title: \"Document 3 \u2014 Reportage : sant\u00e9 mentale au travail\",\n          script: \"Nous nous int\u00e9ressons aujourd'hui \u00e0 la question de la sant\u00e9 mentale au travail, un sujet de plus en plus pr\u00e9sent dans les entreprises europ\u00e9ennes. Selon une \u00e9tude r\u00e9cente, pr\u00e8s d'un salari\u00e9 sur trois d\u00e9clare avoir ressenti des signes d'\u00e9puisement professionnel au cours de l'ann\u00e9e \u00e9coul\u00e9e. Face \u00e0 ce constat, plusieurs entreprises ont mis en place des dispositifs sp\u00e9cifiques. Nous avons rencontr\u00e9 la responsable des ressources humaines d'une entreprise pionni\u00e8re sur le sujet. Nous avons instaur\u00e9 des entretiens r\u00e9guliers avec un psychologue du travail, accessibles gratuitement et de mani\u00e8re confidentielle, explique-t-elle. Nous avons \u00e9galement form\u00e9 l'ensemble de nos managers \u00e0 rep\u00e9rer les signes avant-coureurs de l'\u00e9puisement professionnel chez leurs \u00e9quipes. Un salari\u00e9 ayant b\u00e9n\u00e9fici\u00e9 de ce dispositif t\u00e9moigne : J'\u00e9tais au bord du burn-out sans m\u00eame m'en rendre compte. Le fait de pouvoir en parler rapidement \u00e0 un professionnel m'a permis de r\u00e9agir avant que la situation ne devienne incontr\u00f4lable. La responsable reconna\u00eet cependant que ces dispositifs restent encore minoritaires, en particulier dans les petites et moyennes entreprises, qui manquent souvent de moyens pour les mettre en place.\",\n          questions: [\n            { q: \"Quelle proportion de salari\u00e9s d\u00e9clare avoir ressenti des signes d'\u00e9puisement professionnel ?\", options: [\"Un sur dix\", \"Un sur trois\", \"Un sur deux\"], correct: 1 },\n            { q: \"Quel dispositif l'entreprise a-t-elle mis en place ?\", options: [\"Des entretiens gratuits avec un psychologue du travail\", \"Une r\u00e9duction du temps de travail pour tous\", \"Rien de particulier\"], correct: 0 },\n            { q: \"Qu'ont re\u00e7u les managers comme formation ?\", options: [\"Formation \u00e0 la gestion financi\u00e8re\", \"Formation \u00e0 rep\u00e9rer les signes d'\u00e9puisement professionnel\", \"Formation en informatique\"], correct: 1 },\n            { q: \"Que dit le salari\u00e9 t\u00e9moignant ?\", options: [\"Il n'a jamais eu de probl\u00e8me\", \"Il \u00e9tait au bord du burn-out sans s'en rendre compte\", \"Il a quitt\u00e9 l'entreprise\"], correct: 1 },\n            { q: \"Quelle limite la responsable RH reconna\u00eet-elle ?\", options: [\"Ces dispositifs sont obligatoires partout\", \"Ces dispositifs restent minoritaires, surtout en PME\", \"Ces dispositifs sont trop chers m\u00eame pour les grandes entreprises\"], correct: 1 },\n          ],\n        },\n      ],\n    },\n    reading: {\n      duration: 25 * 60,\n      maxScore: 10,\n      texts: [\n        {\n          title: \"Texte 1 \u2014 Article de presse\",\n          content: \"Le vieillissement de la population europ\u00e9enne pose des d\u00e9fis croissants aux syst\u00e8mes de sant\u00e9 publique, contraints de s'adapter \u00e0 une demande de soins en constante augmentation, notamment pour la prise en charge des maladies chroniques et de la d\u00e9pendance. Selon les projections d\u00e9mographiques, la part des personnes \u00e2g\u00e9es de plus de soixante-cinq ans devrait atteindre pr\u00e8s de trente pour cent de la population europ\u00e9enne d'ici deux mille cinquante, contre environ vingt pour cent actuellement. Cette \u00e9volution soul\u00e8ve des questions majeures quant au financement futur des syst\u00e8mes de protection sociale, d\u00e9j\u00e0 fortement sollicit\u00e9s. Plusieurs pays explorent des pistes telles que le d\u00e9veloppement du maintien \u00e0 domicile des personnes \u00e2g\u00e9es, jug\u00e9 \u00e0 la fois plus humain et moins co\u00fbteux que l'h\u00e9bergement en \u00e9tablissement sp\u00e9cialis\u00e9, ou encore l'investissement dans des technologies de t\u00e9l\u00e9surveillance m\u00e9dicale permettant un suivi \u00e0 distance plus efficace. Ces solutions, bien qu'encourageantes, n\u00e9cessitent toutefois des investissements initiaux importants et une r\u00e9organisation profonde des m\u00e9tiers du soin, qui font d\u00e9j\u00e0 face \u00e0 une p\u00e9nurie significative de personnel qualifi\u00e9 dans de nombreux pays europ\u00e9ens.\",\n          questions: [\n            { q: \"Quelle \u00e9volution d\u00e9mographique est annonc\u00e9e pour 2050 ?\", options: [\"Baisse de la part des personnes \u00e2g\u00e9es\", \"Hausse \u00e0 environ 30% de personnes de plus de 65 ans\", \"Stabilit\u00e9 compl\u00e8te\"], correct: 1 },\n            { q: \"Quel d\u00e9fi cette \u00e9volution pose-t-elle ?\", options: [\"Le financement des syst\u00e8mes de protection sociale\", \"La baisse de la demande de soins\", \"Aucun d\u00e9fi particulier\"], correct: 0 },\n            { q: \"Quelle piste est explor\u00e9e pour les personnes \u00e2g\u00e9es ?\", options: [\"Le maintien \u00e0 domicile\", \"La suppression des aides\", \"L'augmentation des hospitalisations\"], correct: 0 },\n            { q: \"Quelle technologie est mentionn\u00e9e pour le suivi \u00e0 distance ?\", options: [\"La t\u00e9l\u00e9surveillance m\u00e9dicale\", \"Les drones de livraison\", \"L'intelligence artificielle g\u00e9n\u00e9rale\"], correct: 0 },\n            { q: \"Quel probl\u00e8me ces solutions rencontrent-elles ?\", options: [\"Elles sont trop simples \u00e0 mettre en place\", \"Investissements importants et p\u00e9nurie de personnel qualifi\u00e9\", \"Aucun probl\u00e8me, tout est d\u00e9j\u00e0 r\u00e9solu\"], correct: 1 },\n          ],\n        },\n        {\n          title: \"Texte 2 \u2014 Rapport \/ document professionnel\",\n          content: \"Rapport annuel \u2014 Service de sant\u00e9 au travail. Objet : synth\u00e8se des risques psychosociaux identifi\u00e9s sur l'exercice \u00e9coul\u00e9. Le pr\u00e9sent rapport pr\u00e9sente les r\u00e9sultats de l'enqu\u00eate annuelle men\u00e9e aupr\u00e8s des salari\u00e9s de notre groupe concernant les risques psychosociaux. Sur les trois mille deux cents salari\u00e9s ayant r\u00e9pondu \u00e0 l'enqu\u00eate, vingt-huit pour cent d\u00e9clarent ressentir un niveau de stress \u00e9lev\u00e9 de mani\u00e8re r\u00e9guli\u00e8re, une proportion en l\u00e9g\u00e8re hausse par rapport \u00e0 l'exercice pr\u00e9c\u00e9dent. Les principaux facteurs identifi\u00e9s sont la surcharge de travail, ressentie par quarante-cinq pour cent des r\u00e9pondants, ainsi que le manque de reconnaissance professionnelle, cit\u00e9 par trente-deux pour cent d'entre eux. Le service de sant\u00e9 au travail a mis en place, au cours de l'ann\u00e9e, plusieurs actions correctives, notamment un renforcement des effectifs dans les services identifi\u00e9s comme les plus sous tension, ainsi qu'une formation des managers \u00e0 la pr\u00e9vention des risques psychosociaux. Ces mesures ont permis une l\u00e9g\u00e8re am\u00e9lioration sur certains indicateurs, mais le rapport recommande de poursuivre ces efforts, en accordant une attention particuli\u00e8re aux nouveaux salari\u00e9s, statistiquement plus vuln\u00e9rables durant leur premi\u00e8re ann\u00e9e dans l'entreprise.\",\n          questions: [\n            { q: \"Combien de salari\u00e9s ont r\u00e9pondu \u00e0 l'enqu\u00eate ?\", options: [\"1200\", \"3200\", \"5200\"], correct: 1 },\n            { q: \"Quel pourcentage d\u00e9clare un niveau de stress \u00e9lev\u00e9 r\u00e9gulier ?\", options: [\"18%\", \"28%\", \"48%\"], correct: 1 },\n            { q: \"Quel est le principal facteur de stress identifi\u00e9 ?\", options: [\"La surcharge de travail\", \"Le manque d'espace de bureau\", \"Les trajets domicile-travail\"], correct: 0 },\n            { q: \"Quelle action corrective a \u00e9t\u00e9 mise en place ?\", options: [\"Renforcement des effectifs dans les services sous tension\", \"Suppression des cong\u00e9s\", \"R\u00e9duction des salaires\"], correct: 0 },\n            { q: \"Qui le rapport identifie-t-il comme particuli\u00e8rement vuln\u00e9rable ?\", options: [\"Les nouveaux salari\u00e9s durant leur premi\u00e8re ann\u00e9e\", \"Les salari\u00e9s proches de la retraite\", \"Les cadres dirigeants uniquement\"], correct: 0 },\n          ],\n        },\n      ],\n    },\n    grammar: {\n      duration: 20 * 60,\n      maxScore: 15,\n      sections: [\n        {\n          title: \"1. Subjonctif ou indicatif\",\n          items: [\n            { q: \"Il est essentiel que chacun _______ (avoir) acc\u00e8s aux soins de base.\", options: [\"a\", \"ait\", \"aura\"], correct: 1 },\n            { q: \"Je pense que cette campagne de pr\u00e9vention _______ (\u00eatre) utile.\", options: [\"soit\", \"est\", \"sera\"], correct: 1 },\n            { q: \"Bien que les d\u00e9lais _______ (rester) longs, la situation s'am\u00e9liore.\", options: [\"restent\", \"resteront\", \"restaient\"], correct: 0 },\n            { q: \"Il est clair que le vieillissement de la population _______ (poser) probl\u00e8me.\", options: [\"pose\", \"posera\", \"ait pos\u00e9\"], correct: 0 },\n            { q: \"Nous souhaitons que ce dispositif _______ (pouvoir) \u00eatre \u00e9tendu.\", options: [\"peut\", \"puisse\", \"pourra\"], correct: 1 },\n          ],\n        },\n        {\n          title: \"2. Pronoms relatifs\",\n          items: [\n            { q: \"C'est un probl\u00e8me _______ touche de nombreux pays.\", options: [\"qui\", \"que\", \"dont\"], correct: 0 },\n            { q: \"La r\u00e9gion _______ elle exerce manque de m\u00e9decins.\", options: [\"dont\", \"o\u00f9\", \"que\"], correct: 1 },\n            { q: \"Voici les ressources _______ nous avons besoin.\", options: [\"que\", \"dont\", \"o\u00f9\"], correct: 1 },\n            { q: \"_______ pr\u00e9occupe les experts, c'est la p\u00e9nurie de personnel.\", options: [\"Ce que\", \"Ce qui\", \"Ce dont\"], correct: 1 },\n            { q: \"Le dispositif sur _______ ils comptent n'est pas encore financ\u00e9.\", options: [\"lequel\", \"dont\", \"que\"], correct: 0 },\n          ],\n        },\n        {\n          title: \"3. Connecteurs logiques\",\n          items: [\n            { q: \"_______ les efforts des autorit\u00e9s, le syst\u00e8me reste fragile.\", options: [\"Malgr\u00e9\", \"Bien qu'\", \"Car\"], correct: 0 },\n            { q: \"Elle a accept\u00e9 ce poste _______ les conditions \u00e9taient difficiles.\", options: [\"bien que\", \"car\", \"donc\"], correct: 0 },\n            { q: \"Le service a \u00e9t\u00e9 renforc\u00e9 _______ r\u00e9duire les d\u00e9lais d'attente.\", options: [\"afin de\", \"afin que\", \"parce que\"], correct: 0 },\n            { q: \"_______ vous ressentiez du stress, n'h\u00e9sitez pas \u00e0 consulter.\", options: [\"Si\", \"Au cas o\u00f9\", \"Pourvu que\"], correct: 1 },\n            { q: \"La consultation a \u00e9t\u00e9 annul\u00e9e, _______ le m\u00e9decin \u00e9tait absent.\", options: [\"car\", \"donc\", \"or\"], correct: 0 },\n          ],\n        },\n        {\n          title: \"4. Voix passive et discours indirect\",\n          items: [\n            { q: \"\u00ab On a renforc\u00e9 les effectifs. \u00bb Forme passive :\", options: [\"Les effectifs ont \u00e9t\u00e9 renforc\u00e9s.\", \"Les effectifs renfor\u00e7aient.\", \"Les effectifs seront renforc\u00e9s.\"], correct: 0 },\n            { q: \"Il a dit : \u00ab Je consulterai un sp\u00e9cialiste. \u00bb \u2192 Il a dit qu'_______\", options: [\"il consultera un sp\u00e9cialiste.\", \"il consulterait un sp\u00e9cialiste.\", \"il a consult\u00e9 un sp\u00e9cialiste.\"], correct: 1 },\n            { q: \"Elle a demand\u00e9 : \u00ab Avez-vous des sympt\u00f4mes ? \u00bb \u2192 Elle a demand\u00e9 _______\", options: [\"si nous avions des sympt\u00f4mes.\", \"que nous ayons des sympt\u00f4mes.\", \"si nous aurons des sympt\u00f4mes.\"], correct: 0 },\n            { q: \"\u00ab Prenez du repos ! \u00bb a dit le m\u00e9decin. \u2192 Le m\u00e9decin a dit _______\", options: [\"de prendre du repos.\", \"qu'il prenne du repos.\", \"de prenant du repos.\"], correct: 0 },\n            { q: \"De nouvelles mesures _______ annonc\u00e9es la semaine prochaine. (passif)\", options: [\"seront\", \"auront \u00e9t\u00e9\", \"seraient\"], correct: 0 },\n          ],\n        },\n        {\n          title: \"5. Pr\u00e9positions et verbes\",\n          items: [\n            { q: \"Le stress chronique contribue _______ aggraver certaines maladies.\", options: [\"\u00e0\", \"de\", \"pour\"], correct: 0 },\n            { q: \"Il s'agit _______ pr\u00e9venir plut\u00f4t que de gu\u00e9rir.\", options: [\"\u00e0\", \"de\", \"sur\"], correct: 1 },\n            { q: \"Les m\u00e9decins insistent _______ l'importance du suivi r\u00e9gulier.\", options: [\"sur\", \"de\", \"\u00e0\"], correct: 0 },\n            { q: \"La gu\u00e9rison d\u00e9pend _______ plusieurs facteurs individuels.\", options: [\"\u00e0\", \"de\", \"sur\"], correct: 1 },\n            { q: \"L'h\u00f4pital s'engage _______ r\u00e9duire les temps d'attente.\", options: [\"\u00e0\", \"de\", \"pour\"], correct: 0 },\n          ],\n        },\n        {\n          title: \"6. Articles et accords\",\n          items: [\n            { q: \"_______ majorit\u00e9 des patients est satisfaite du suivi.\", options: [\"La\", \"Une\", \"Des\"], correct: 0 },\n            { q: \"Le personnel a fait preuve _______ d\u00e9vouement remarquable.\", options: [\"le\", \"un\", \"du\"], correct: 1 },\n            { q: \"Ce sont _______ d\u00e9cisions difficiles \u00e0 prendre en urgence.\", options: [\"les\", \"des\", \"de\"], correct: 1 },\n            { q: \"Elle reste attentive _______ besoins de ses patients.\", options: [\"les\", \"aux\", \"des\"], correct: 1 },\n            { q: \"_______ cas n'avaient jamais \u00e9t\u00e9 recens\u00e9s dans cette r\u00e9gion.\", options: [\"De tels\", \"Les\", \"Des\"], correct: 0 },\n          ],\n        },\n      ],\n    },\n    written: {\n      duration: 40 * 60,\n      maxScore: 30,\n      prompts: [\n        { type: \"Sujet argumentatif\", text: \"Faut-il taxer davantage les produits alimentaires jug\u00e9s mauvais pour la sant\u00e9 afin de financer la pr\u00e9vention ? Donnez votre avis. (200 mots maximum)\" },\n        { type: \"Sujet cr\u00e9atif\", text: \"D\u00e9crivez une journ\u00e9e dans la vie d'un m\u00e9decin exer\u00e7ant dans une zone rurale isol\u00e9e. (200 mots maximum)\" },\n      ],\n    },\n    oral: {\n      duration: 10 * 60,\n      maxScore: 30,\n      topics: [\n        \"Comment expliquez-vous la hausse des maladies chroniques li\u00e9es au mode de vie ?\",\n        \"La t\u00e9l\u00e9consultation peut-elle r\u00e9ellement r\u00e9soudre le probl\u00e8me de l'acc\u00e8s aux soins en zone rurale ?\",\n        \"Les entreprises devraient-elles \u00eatre davantage responsables de la sant\u00e9 mentale de leurs salari\u00e9s ?\",\n      ],\n    },\n  },\n \n  \/\/ ============================================================\n  \/\/ SIMULATION 6 \u2014 T\u00e9l\u00e9travail & \u00c9ducation\n  \/\/ ============================================================\n  {\n    id: 6,\n    title: \"Simulation 6\",\n    listening: {\n      duration: 25 * 60,\n      maxScore: 15,\n      passages: [\n        {\n          title: \"Document 1 \u2014 Bulletin d'actualit\u00e9 : t\u00e9l\u00e9travail\",\n          script: \"Bonjour \u00e0 tous, voici votre point d'actualit\u00e9 \u00e9conomique et sociale. Une \u00e9tude europ\u00e9enne publi\u00e9e cette semaine r\u00e9v\u00e8le que pr\u00e8s de la moiti\u00e9 des entreprises du secteur tertiaire ont d\u00e9sormais adopt\u00e9 un mod\u00e8le de travail hybride de mani\u00e8re permanente, combinant pr\u00e9sence au bureau et t\u00e9l\u00e9travail. Cette g\u00e9n\u00e9ralisation s'accompagne toutefois de nouveaux d\u00e9fis pour les directions des ressources humaines. Selon l'\u00e9tude, soixante pour cent des managers interrog\u00e9s d\u00e9clarent rencontrer des difficult\u00e9s \u00e0 \u00e9valuer \u00e9quitablement la performance de leurs \u00e9quipes lorsque celles-ci travaillent partiellement \u00e0 distance. Par ailleurs, plusieurs syndicats alertent sur un risque de surcharge de travail invisible, les salari\u00e9s en t\u00e9l\u00e9travail ayant tendance, selon eux, \u00e0 r\u00e9pondre aux messages professionnels en dehors des horaires habituels. Face \u00e0 ces constats, certains pays europ\u00e9ens envisagent de renforcer le droit \u00e0 la d\u00e9connexion, d\u00e9j\u00e0 inscrit dans la loi de plusieurs \u00c9tats membres, mais dont l'application concr\u00e8te reste, selon les syndicats, largement insuffisante.\",\n          questions: [\n            { q: \"Quel mod\u00e8le de travail s'est g\u00e9n\u00e9ralis\u00e9 selon l'\u00e9tude ?\", options: [\"Le t\u00e9l\u00e9travail \u00e0 temps complet\", \"Le mod\u00e8le hybride\", \"Le retour total au bureau\"], correct: 1 },\n            { q: \"Quelle difficult\u00e9 rencontrent les managers selon l'\u00e9tude ?\", options: [\"\u00c9valuer \u00e9quitablement la performance \u00e0 distance\", \"Recruter de nouveaux employ\u00e9s\", \"Payer les salaires\"], correct: 0 },\n            { q: \"Quel risque les syndicats d\u00e9noncent-ils ?\", options: [\"Une baisse g\u00e9n\u00e9rale des salaires\", \"Une surcharge de travail invisible\", \"Une diminution du nombre d'emplois\"], correct: 1 },\n            { q: \"Quel droit certains pays envisagent-ils de renforcer ?\", options: [\"Le droit \u00e0 la d\u00e9connexion\", \"Le droit aux cong\u00e9s pay\u00e9s\", \"Le droit de gr\u00e8ve\"], correct: 0 },\n            { q: \"Comment les syndicats jugent-ils l'application actuelle de ce droit ?\", options: [\"Parfaitement satisfaisante\", \"Largement insuffisante\", \"Inexistante dans tous les pays\"], correct: 1 },\n          ],\n        },\n        {\n          title: \"Document 2 \u2014 Interview : \u00e9ducation et num\u00e9rique\",\n          script: \"Notre invit\u00e9e aujourd'hui est enseignante-chercheuse sp\u00e9cialis\u00e9e dans les usages du num\u00e9rique en \u00e9ducation. Bonjour, merci d'\u00eatre avec nous. Bonjour, merci de votre invitation. Le num\u00e9rique occupe une place croissante dans les salles de classe. Quel bilan peut-on en tirer aujourd'hui ? Le bilan est nuanc\u00e9. D'un c\u00f4t\u00e9, les outils num\u00e9riques permettent une plus grande personnalisation des apprentissages, notamment pour les \u00e9l\u00e8ves en difficult\u00e9, qui peuvent avancer \u00e0 leur propre rythme gr\u00e2ce \u00e0 des exercices adaptatifs. De l'autre, on observe des effets moins positifs, notamment sur la capacit\u00e9 de concentration des \u00e9l\u00e8ves, fortement sollicit\u00e9e par ailleurs par les \u00e9crans en dehors de l'\u00e9cole. Avez-vous des recommandations \u00e0 formuler ? Je pense qu'il est essentiel de conserver un \u00e9quilibre, en r\u00e9servant certains apprentissages fondamentaux, comme la lecture et l'\u00e9criture manuscrite, \u00e0 des supports traditionnels, tout en int\u00e9grant le num\u00e9rique de mani\u00e8re cibl\u00e9e pour des usages o\u00f9 il apporte une r\u00e9elle valeur ajout\u00e9e, comme la recherche d'information ou le travail collaboratif. Comment les enseignants vivent-ils cette transition ? C'est in\u00e9gal. Certains se sont form\u00e9s rapidement et s'en servent efficacement, tandis que d'autres se sentent d\u00e9pass\u00e9s, faute de formation suffisante, ce qui cr\u00e9e des disparit\u00e9s importantes entre \u00e9tablissements.\",\n          questions: [\n            { q: \"Quelle est la sp\u00e9cialit\u00e9 de l'enseignante-chercheuse ?\", options: [\"Les usages du num\u00e9rique en \u00e9ducation\", \"L'histoire de l'art\", \"Les langues \u00e9trang\u00e8res\"], correct: 0 },\n            { q: \"Quel avantage du num\u00e9rique est mentionn\u00e9 pour les \u00e9l\u00e8ves en difficult\u00e9 ?\", options: [\"Une personnalisation des apprentissages\", \"Une suppression totale des notes\", \"Moins de devoirs\"], correct: 0 },\n            { q: \"Quel effet moins positif est observ\u00e9 ?\", options: [\"Am\u00e9lioration de la concentration\", \"Effets n\u00e9gatifs sur la capacit\u00e9 de concentration\", \"Aucun effet n\u00e9gatif\"], correct: 1 },\n            { q: \"Quelle recommandation fait l'enseignante-chercheuse ?\", options: [\"Tout num\u00e9riser sans exception\", \"Conserver certains apprentissages sur support traditionnel\", \"Supprimer totalement le num\u00e9rique\"], correct: 1 },\n            { q: \"Comment les enseignants vivent-ils cette transition selon elle ?\", options: [\"De mani\u00e8re uniforme et positive\", \"De mani\u00e8re in\u00e9gale, certains se sentent d\u00e9pass\u00e9s\", \"Tous refusent le num\u00e9rique\"], correct: 1 },\n          ],\n        },\n        {\n          title: \"Document 3 \u2014 Reportage : formation continue et reconversion\",\n          script: \"Nous nous penchons aujourd'hui sur le ph\u00e9nom\u00e8ne croissant de la reconversion professionnelle, en particulier chez les trentenaires et quarantenaires. Selon une \u00e9tude r\u00e9cente, pr\u00e8s d'un actif sur quatre envisage s\u00e9rieusement de changer de m\u00e9tier au cours des cinq prochaines ann\u00e9es. Nous avons rencontr\u00e9 un ancien cadre commercial, aujourd'hui reconverti dans l'artisanat du bois. Apr\u00e8s quinze ans dans la m\u00eame entreprise, je ressentais un profond besoin de sens dans mon travail, explique-t-il. J'ai suivi une formation de neuf mois, financ\u00e9e en partie par mon compte personnel de formation, avant de me lancer en tant qu'ind\u00e9pendant. Ce type de parcours est de plus en plus fr\u00e9quent, observe un conseiller en \u00e9volution professionnelle que nous avons \u00e9galement interrog\u00e9. Les dispositifs de formation continue se sont consid\u00e9rablement d\u00e9velopp\u00e9s ces derni\u00e8res ann\u00e9es, mais l'acc\u00e8s \u00e0 l'information reste un frein important : de nombreux actifs ignorent encore l'\u00e9tendue de leurs droits \u00e0 la formation. Il souligne \u00e9galement que la reconversion implique souvent une baisse temporaire de revenus, ce qui constitue un frein financier majeur, en particulier pour les personnes ayant des charges familiales importantes.\",\n          questions: [\n            { q: \"Quelle proportion d'actifs envisage de changer de m\u00e9tier dans les 5 ans ?\", options: [\"Un sur dix\", \"Un sur quatre\", \"Un sur deux\"], correct: 1 },\n            { q: \"Dans quel domaine l'ancien cadre commercial s'est-il reconverti ?\", options: [\"L'artisanat du bois\", \"L'informatique\", \"La m\u00e9decine\"], correct: 0 },\n            { q: \"Combien de temps a dur\u00e9 sa formation ?\", options: [\"Trois mois\", \"Neuf mois\", \"Deux ans\"], correct: 1 },\n            { q: \"Quel frein important le conseiller mentionne-t-il concernant l'acc\u00e8s \u00e0 la formation ?\", options: [\"Le manque d'information sur les droits \u00e0 la formation\", \"L'absence totale de dispositifs\", \"Le manque d'organismes de formation\"], correct: 0 },\n            { q: \"Quel autre frein financier est mentionn\u00e9 ?\", options: [\"Le co\u00fbt des transports\", \"La baisse temporaire de revenus pendant la reconversion\", \"Le prix des fournitures\"], correct: 1 },\n          ],\n        },\n      ],\n    },\n    reading: {\n      duration: 25 * 60,\n      maxScore: 10,\n      texts: [\n        {\n          title: \"Texte 1 \u2014 Article de presse\",\n          content: \"Le d\u00e9veloppement massif du t\u00e9l\u00e9travail a profond\u00e9ment transform\u00e9 l'organisation spatiale des villes europ\u00e9ennes, avec des cons\u00e9quences que les urbanistes commencent seulement \u00e0 mesurer. Plusieurs grandes m\u00e9tropoles observent une diminution sensible de la fr\u00e9quentation des quartiers d'affaires en milieu de semaine, tandis que les zones r\u00e9sidentielles p\u00e9riph\u00e9riques connaissent une activit\u00e9 commerciale accrue durant les m\u00eames p\u00e9riodes. Ce r\u00e9\u00e9quilibrage pose des questions in\u00e9dites en mati\u00e8re de planification urbaine : certains bureaux vacants sont d\u00e9sormais reconvertis en logements, une tendance encourag\u00e9e par plusieurs municipalit\u00e9s confront\u00e9es \u00e0 une p\u00e9nurie de logements abordables. Les commerces de proximit\u00e9 dans les quartiers r\u00e9sidentiels, autrefois fragilis\u00e9s par l'exode quotidien des habitants vers leur lieu de travail, connaissent quant \u00e0 eux un regain d'activit\u00e9 inattendu. Toutefois, cette transformation n'est pas sans poser de difficult\u00e9s : les centres-villes, historiquement d\u00e9pendants de la fr\u00e9quentation des travailleurs de bureau, voient certains commerces fermer, faute de client\u00e8le suffisante en semaine, ce qui oblige les collectivit\u00e9s locales \u00e0 repenser enti\u00e8rement l'attractivit\u00e9 de ces quartiers, par exemple en y d\u00e9veloppant davantage de logements ou d'activit\u00e9s culturelles.\",\n          questions: [\n            { q: \"Quel changement est observ\u00e9 dans les quartiers d'affaires ?\", options: [\"Une augmentation de fr\u00e9quentation\", \"Une diminution sensible de fr\u00e9quentation en semaine\", \"Aucun changement\"], correct: 1 },\n            { q: \"Que deviennent certains bureaux vacants ?\", options: [\"Ils sont d\u00e9truits\", \"Ils sont reconvertis en logements\", \"Ils restent vides ind\u00e9finiment\"], correct: 1 },\n            { q: \"Quel effet est observ\u00e9 sur les commerces de proximit\u00e9 r\u00e9sidentiels ?\", options: [\"Une fermeture g\u00e9n\u00e9ralis\u00e9e\", \"Un regain d'activit\u00e9 inattendu\", \"Aucun changement\"], correct: 1 },\n            { q: \"Quelle difficult\u00e9 rencontrent les centres-villes ?\", options: [\"Fermeture de commerces faute de client\u00e8le en semaine\", \"Trop de touristes\", \"Manque de bureaux disponibles\"], correct: 0 },\n            { q: \"Que doivent repenser les collectivit\u00e9s locales selon le texte ?\", options: [\"L'attractivit\u00e9 des centres-villes\", \"Les imp\u00f4ts locaux uniquement\", \"Le r\u00e9seau routier uniquement\"], correct: 0 },\n          ],\n        },\n        {\n          title: \"Texte 2 \u2014 Rapport \/ document professionnel\",\n          content: \"Bilan p\u00e9dagogique \u2014 Direction acad\u00e9mique. Objet : \u00e9valuation du dispositif d'apprentissage hybride mis en place sur l'ann\u00e9e scolaire \u00e9coul\u00e9e. Le pr\u00e9sent rapport \u00e9value les r\u00e9sultats du dispositif d'apprentissage hybride, combinant pr\u00e9sence en classe et plateforme num\u00e9rique, d\u00e9ploy\u00e9 dans l'ensemble des \u00e9tablissements de notre acad\u00e9mie au cours de l'ann\u00e9e \u00e9coul\u00e9e. Les r\u00e9sultats sont globalement encourageants : soixante-cinq pour cent des enseignants interrog\u00e9s estiment que ce dispositif a permis une meilleure personnalisation du suivi des \u00e9l\u00e8ves, notamment gr\u00e2ce aux exercices adaptatifs propos\u00e9s par la plateforme. Cependant, l'\u00e9valuation r\u00e9v\u00e8le \u00e9galement des disparit\u00e9s pr\u00e9occupantes : les \u00e9l\u00e8ves issus de familles disposant d'un acc\u00e8s limit\u00e9 \u00e0 internet ou \u00e0 un \u00e9quipement informatique adapt\u00e9 ont, dans l'ensemble, moins b\u00e9n\u00e9fici\u00e9 de ce dispositif, accentuant potentiellement les in\u00e9galit\u00e9s scolaires existantes. Par ailleurs, vingt pour cent des enseignants d\u00e9clarent ne pas se sentir suffisamment form\u00e9s \u00e0 l'utilisation de ces outils, ce qui limite leur capacit\u00e9 \u00e0 en exploiter pleinement le potentiel p\u00e9dagogique. La direction acad\u00e9mique recommande, pour l'ann\u00e9e \u00e0 venir, un renforcement du pr\u00eat de mat\u00e9riel informatique aux familles les plus modestes, ainsi qu'un programme de formation continue obligatoire pour l'ensemble du corps enseignant.\",\n          questions: [\n            { q: \"Quel pourcentage d'enseignants juge le dispositif positif pour la personnalisation du suivi ?\", options: [\"45%\", \"65%\", \"85%\"], correct: 1 },\n            { q: \"Quelle disparit\u00e9 pr\u00e9occupante est r\u00e9v\u00e9l\u00e9e ?\", options: [\"Les \u00e9l\u00e8ves avec acc\u00e8s limit\u00e9 \u00e0 internet en b\u00e9n\u00e9ficient moins\", \"Tous les \u00e9l\u00e8ves en b\u00e9n\u00e9ficient \u00e9galement\", \"Seuls les bons \u00e9l\u00e8ves y ont acc\u00e8s\"], correct: 0 },\n            { q: \"Quel pourcentage d'enseignants ne se sent pas suffisamment form\u00e9 ?\", options: [\"10%\", \"20%\", \"40%\"], correct: 1 },\n            { q: \"Que recommande la direction acad\u00e9mique pour l'ann\u00e9e \u00e0 venir ?\", options: [\"Supprimer le dispositif\", \"Renforcer le pr\u00eat de mat\u00e9riel et la formation continue\", \"Rendre le dispositif payant\"], correct: 1 },\n            { q: \"Quel type de document est-ce ?\", options: [\"Un bilan p\u00e9dagogique officiel\", \"Un article de blog personnel\", \"Une publicit\u00e9 pour une \u00e9cole priv\u00e9e\"], correct: 0 },\n          ],\n        },\n      ],\n    },\n    grammar: {\n      duration: 20 * 60,\n      maxScore: 15,\n      sections: [\n        {\n          title: \"1. Subjonctif ou indicatif\",\n          items: [\n            { q: \"Il faut que les enseignants _______ (\u00eatre) mieux form\u00e9s au num\u00e9rique.\", options: [\"sont\", \"soient\", \"seront\"], correct: 1 },\n            { q: \"Je crois que le t\u00e9l\u00e9travail _______ (avoir) des effets positifs et n\u00e9gatifs.\", options: [\"ait\", \"a\", \"aura\"], correct: 1 },\n            { q: \"Quoique la transition _______ (sembler) difficile, elle reste n\u00e9cessaire.\", options: [\"semble\", \"semblera\", \"semblait\"], correct: 0 },\n            { q: \"Il est certain que cette tendance _______ (se confirmer) dans les ann\u00e9es \u00e0 venir.\", options: [\"se confirme\", \"se confirmera\", \"se soit confirm\u00e9e\"], correct: 1 },\n            { q: \"Nous attendons qu'il _______ (finir) sa formation avant de postuler.\", options: [\"finit\", \"finisse\", \"finira\"], correct: 1 },\n          ],\n        },\n        {\n          title: \"2. Pronoms relatifs\",\n          items: [\n            { q: \"C'est une comp\u00e9tence _______ devient essentielle aujourd'hui.\", options: [\"qui\", \"que\", \"dont\"], correct: 0 },\n            { q: \"L'entreprise _______ il travaille a adopt\u00e9 le t\u00e9l\u00e9travail.\", options: [\"dont\", \"o\u00f9\", \"que\"], correct: 1 },\n            { q: \"Voici la formation _______ il a besoin pour se reconvertir.\", options: [\"que\", \"dont\", \"o\u00f9\"], correct: 1 },\n            { q: \"_______ inqui\u00e8te les enseignants, c'est le manque de formation.\", options: [\"Ce que\", \"Ce qui\", \"Ce dont\"], correct: 1 },\n            { q: \"Le dispositif gr\u00e2ce \u00e0 _______ elle a pu se reconvertir est gratuit.\", options: [\"auquel\", \"dont\", \"que\"], correct: 0 },\n          ],\n        },\n        {\n          title: \"3. Connecteurs logiques\",\n          items: [\n            { q: \"_______ les avantages du t\u00e9l\u00e9travail, certains pr\u00e9f\u00e8rent le bureau.\", options: [\"Malgr\u00e9\", \"Bien qu'\", \"Car\"], correct: 0 },\n            { q: \"Il a chang\u00e9 de m\u00e9tier _______ il avait un emploi stable.\", options: [\"bien qu'\", \"car\", \"donc\"], correct: 0 },\n            { q: \"Elle suit une formation _______ se reconvertir dans l'artisanat.\", options: [\"afin de\", \"afin que\", \"parce que\"], correct: 0 },\n            { q: \"_______ vous h\u00e9sitiez encore, ce conseiller peut vous renseigner.\", options: [\"Si\", \"Au cas o\u00f9\", \"Pourvu que\"], correct: 1 },\n            { q: \"Le cours a \u00e9t\u00e9 annul\u00e9, _______ trop peu d'\u00e9l\u00e8ves \u00e9taient inscrits.\", options: [\"car\", \"donc\", \"or\"], correct: 0 },\n          ],\n        },\n        {\n          title: \"4. Voix passive et discours indirect\",\n          items: [\n            { q: \"\u00ab On a g\u00e9n\u00e9ralis\u00e9 le t\u00e9l\u00e9travail. \u00bb Forme passive :\", options: [\"Le t\u00e9l\u00e9travail a \u00e9t\u00e9 g\u00e9n\u00e9ralis\u00e9.\", \"Le t\u00e9l\u00e9travail g\u00e9n\u00e9ralisait.\", \"Le t\u00e9l\u00e9travail sera g\u00e9n\u00e9ralis\u00e9.\"], correct: 0 },\n            { q: \"Il a dit : \u00ab Je me reconvertirai l'ann\u00e9e prochaine. \u00bb \u2192 Il a dit qu'_______\", options: [\"il se reconvertira l'ann\u00e9e prochaine.\", \"il se reconvertirait l'ann\u00e9e suivante.\", \"il s'est reconverti.\"], correct: 1 },\n            { q: \"Elle a demand\u00e9 : \u00ab Avez-vous suivi cette formation ? \u00bb \u2192 Elle a demand\u00e9 _______\", options: [\"si nous avions suivi cette formation.\", \"que nous ayons suivi cette formation.\", \"si nous suivrons cette formation.\"], correct: 0 },\n            { q: \"\u00ab Inscrivez-vous avant vendredi ! \u00bb a-t-il dit. \u2192 Il a dit _______\", options: [\"de s'inscrire avant vendredi.\", \"qu'ils s'inscrivent avant vendredi.\", \"de s'inscrivant avant vendredi.\"], correct: 0 },\n            { q: \"Les nouveaux programmes _______ appliqu\u00e9s d\u00e8s septembre. (passif)\", options: [\"seront\", \"auront \u00e9t\u00e9\", \"seraient\"], correct: 0 },\n          ],\n        },\n        {\n          title: \"5. Pr\u00e9positions et verbes\",\n          items: [\n            { q: \"Le t\u00e9l\u00e9travail contribue _______ r\u00e9duire les trajets quotidiens.\", options: [\"\u00e0\", \"de\", \"pour\"], correct: 0 },\n            { q: \"Il s'agit _______ repenser l'organisation du travail.\", options: [\"\u00e0\", \"de\", \"sur\"], correct: 1 },\n            { q: \"Les chercheurs insistent _______ la n\u00e9cessit\u00e9 de former les enseignants.\", options: [\"sur\", \"de\", \"\u00e0\"], correct: 0 },\n            { q: \"La r\u00e9ussite de la reconversion d\u00e9pend _______ plusieurs facteurs personnels.\", options: [\"\u00e0\", \"de\", \"sur\"], correct: 1 },\n            { q: \"L'acad\u00e9mie s'engage _______ former tous les enseignants au num\u00e9rique.\", options: [\"\u00e0\", \"de\", \"pour\"], correct: 0 },\n          ],\n        },\n        {\n          title: \"6. Articles et accords\",\n          items: [\n            { q: \"_______ majorit\u00e9 des entreprises a adopt\u00e9 le mod\u00e8le hybride.\", options: [\"La\", \"Une\", \"Des\"], correct: 0 },\n            { q: \"Il a fait preuve _______ motivation exceptionnelle pendant sa formation.\", options: [\"la\", \"une\", \"de la\"], correct: 1 },\n            { q: \"Ce sont _______ choix de carri\u00e8re difficiles \u00e0 assumer.\", options: [\"les\", \"des\", \"de\"], correct: 1 },\n            { q: \"Elle reste attentive _______ besoins de ses \u00e9l\u00e8ves en difficult\u00e9.\", options: [\"les\", \"aux\", \"des\"], correct: 1 },\n            { q: \"_______ disparit\u00e9s n'avaient jamais \u00e9t\u00e9 aussi visibles.\", options: [\"De telles\", \"Les\", \"Des\"], correct: 0 },\n          ],\n        },\n      ],\n    },\n    written: {\n      duration: 40 * 60,\n      maxScore: 30,\n      prompts: [\n        { type: \"Sujet argumentatif\", text: \"Le num\u00e9rique \u00e0 l'\u00e9cole est-il, selon vous, plus b\u00e9n\u00e9fique que nuisible aux apprentissages des \u00e9l\u00e8ves ? (200 mots maximum)\" },\n        { type: \"Sujet cr\u00e9atif\", text: \"Imaginez le parcours d'une personne qui d\u00e9cide, apr\u00e8s quinze ans dans le m\u00eame m\u00e9tier, de se reconvertir compl\u00e8tement. (200 mots maximum)\" },\n      ],\n    },\n    oral: {\n      duration: 10 * 60,\n      maxScore: 30,\n      topics: [\n        \"Le t\u00e9l\u00e9travail g\u00e9n\u00e9ralis\u00e9 va-t-il durablement transformer l'organisation des villes ?\",\n        \"Le num\u00e9rique \u00e0 l'\u00e9cole accentue-t-il les in\u00e9galit\u00e9s entre \u00e9l\u00e8ves ?\",\n        \"La reconversion professionnelle devrait-elle \u00eatre davantage facilit\u00e9e et financ\u00e9e par l'\u00c9tat ?\",\n      ],\n    },\n  },\n];\n \nif (typeof module !== \"undefined\") module.exports = EXAMS;\n \n<\/script>\n<script>\n\/\/ ============================================================\n\/\/ STATE\n\/\/ ============================================================\nlet state = {\n  examId: null,\n  exam: null,\n  sectionIndex: 0, \/\/ 0=listening,1=reading,2=grammar,3=written,4=oral\n  answers: { listening: [], reading: [], grammar: [], written: [\"\", \"\"], oral: null },\n  scores: {},\n  timerInterval: null,\n  timeLeft: 0,\n  sectionStarted: false,\n  oralPhase: \"pick\", \/\/ pick -> prep -> speak -> done\n  oralTopicIndex: null,\n};\n \nconst SECTION_NAMES = [\"Compr\u00e9hension orale\", \"Compr\u00e9hension \u00e9crite\", \"Grammaire\", \"Production \u00e9crite\", \"Production orale\"];\nconst SECTION_KEYS = [\"listening\", \"reading\", \"grammar\", \"written\", \"oral\"];\n \nconst app = document.getElementById(\"app\");\nconst topbarSection = document.getElementById(\"topbarSection\");\nconst topbarId = document.getElementById(\"topbarId\");\nconst globalTimer = document.getElementById(\"globalTimer\");\n \n\/\/ ============================================================\n\/\/ UTIL\n\/\/ ============================================================\nfunction fmtTime(sec) {\n  sec = Math.max(0, Math.round(sec));\n  const m = Math.floor(sec \/ 60).toString().padStart(2, \"0\");\n  const s = (sec % 60).toString().padStart(2, \"0\");\n  return `${m}:${s}`;\n}\n \nfunction clearTimer() {\n  if (state.timerInterval) clearInterval(state.timerInterval);\n  state.timerInterval = null;\n}\n \nfunction startTimer(seconds, onTick, onEnd) {\n  clearTimer();\n  state.timeLeft = seconds;\n  onTick(state.timeLeft);\n  state.timerInterval = setInterval(() => {\n    state.timeLeft -= 1;\n    onTick(state.timeLeft);\n    if (state.timeLeft <= 0) {\n      clearTimer();\n      onEnd();\n    }\n  }, 1000);\n}\n \nfunction updateGlobalTimerDisplay(sec, totalSec) {\n  globalTimer.textContent = fmtTime(sec);\n  globalTimer.classList.remove(\"warn\", \"danger\");\n  if (totalSec) {\n    const ratio = sec \/ totalSec;\n    if (ratio <= 0.1) globalTimer.classList.add(\"danger\");\n    else if (ratio <= 0.25) globalTimer.classList.add(\"warn\");\n  }\n}\n \nfunction countWords(text) {\n  return text.trim().split(\/\\s+\/).filter(Boolean).length;\n}\n \n\/\/ ============================================================\n\/\/ TTS\n\/\/ ============================================================\nlet ttsUtterance = null;\nlet ttsVoices = [];\nlet ttsVoicesReady = false;\nfunction loadVoices() {\n  ttsVoices = window.speechSynthesis ? window.speechSynthesis.getVoices() : [];\n  if (ttsVoices.length) ttsVoicesReady = true;\n}\nif (typeof speechSynthesis !== \"undefined\") {\n  loadVoices();\n  speechSynthesis.onvoiceschanged = loadVoices;\n}\nfunction pickFrenchVoice() {\n  if (!ttsVoices.length) loadVoices();\n  return ttsVoices.find(v => v.lang && v.lang.toLowerCase().startsWith(\"fr\")) || null;\n}\nfunction speak(text, onEnd) {\n  if (typeof speechSynthesis === \"undefined\") {\n    alert(\"La synth\u00e8se vocale (TTS) n'est pas disponible dans ce navigateur. Essayez avec Chrome sur ordinateur.\");\n    if (onEnd) onEnd();\n    return;\n  }\n  \/\/ If voices haven't loaded yet, give the browser a brief moment then retry once.\n  if (!ttsVoicesReady && !ttsVoices.length) {\n    loadVoices();\n    if (!ttsVoices.length) {\n      setTimeout(() => speak(text, onEnd), 300);\n      return;\n    }\n  }\n  speechSynthesis.cancel();\n  const utter = new SpeechSynthesisUtterance(text);\n  const voice = pickFrenchVoice();\n  if (voice) {\n    utter.voice = voice;\n  } else if (ttsVoices.length) {\n    \/\/ No French voice found on this device \u2014 warn once, still attempt with default voice + fr-FR lang hint.\n    console.warn(\"Aucune voix fran\u00e7aise trouv\u00e9e ; utilisation de la voix par d\u00e9faut.\");\n  }\n  utter.lang = \"fr-FR\";\n  utter.rate = 0.95;\n  utter.onend = () => { if (onEnd) onEnd(); };\n  utter.onerror = () => { if (onEnd) onEnd(); };\n  ttsUtterance = utter;\n  speechSynthesis.speak(utter);\n}\nfunction stopSpeak() {\n  if (typeof speechSynthesis !== \"undefined\") speechSynthesis.cancel();\n}\n \n\/\/ ============================================================\n\/\/ LANDING\n\/\/ ============================================================\nfunction renderLanding() {\n  clearTimer();\n  stopSpeak();\n  topbarSection.textContent = \"Accueil\";\n  topbarId.textContent = \"B2 \u00b7 ALLINGUA FORMAT\";\n  updateGlobalTimerDisplay(0);\n  globalTimer.textContent = \"\u2014\";\n  globalTimer.classList.remove(\"warn\", \"danger\");\n \n  app.innerHTML = `\n    <div class=\"masthead\">\n      <div class=\"eyebrow\">Pr\u00e9paration \u00e0 l'examen \u2014 S\u00e9rie 2<\/div>\n      <h1>Simulation d'examen B2 \u2014 Migration, num\u00e9rique, sant\u00e9, travail<\/h1>\n      <p>Trois nouvelles simulations ind\u00e9pendantes, m\u00eame format officiel complet : compr\u00e9hension orale (avec audio), compr\u00e9hension \u00e9crite, grammaire, production \u00e9crite avec clavier fran\u00e7ais virtuel, et production orale chronom\u00e9tr\u00e9e. Th\u00e8mes : migration, num\u00e9risation, sant\u00e9 publique, t\u00e9l\u00e9travail et \u00e9ducation.<\/p>\n    <\/div>\n    <div class=\"exam-grid\">\n      ${EXAMS.map(e => `\n        <div class=\"exam-card\">\n          <div>\n            <div class=\"exam-card-title\">${e.title}<\/div>\n            <div class=\"exam-card-meta\">5 \u00e9preuves \u00b7 ~2h00 \u00b7 Score \/100, seuil de r\u00e9ussite 60<\/div>\n          <\/div>\n          <button class=\"btn\" onclick=\"startExam(${e.id})\">Commencer \u2192<\/button>\n        <\/div>\n      `).join(\"\")}\n    <\/div>\n  `;\n}\n \nfunction startExam(id) {\n  state.examId = id;\n  state.exam = EXAMS.find(e => e.id === id);\n  state.sectionIndex = 0;\n  state.answers = { listening: [], reading: [], grammar: [], written: [\"\", \"\"], oral: null };\n  state.scores = {};\n  state.sectionStarted = false;\n  state.oralPhase = \"pick\";\n  state.oralTopicIndex = null;\n  renderSectionIntro();\n}\n \n\/\/ ============================================================\n\/\/ SECTION PROGRESS BAR\n\/\/ ============================================================\nfunction progressBarHTML() {\n  return `\n    <div class=\"section-progress\">\n      ${SECTION_NAMES.map((name, i) => {\n        let cls = \"dot\";\n        if (i < state.sectionIndex) cls += \" done\";\n        else if (i === state.sectionIndex) cls += \" active\";\n        return `<span class=\"${cls}\">${i + 1}. ${name}<\/span>`;\n      }).join(\"\")}\n    <\/div>\n  `;\n}\n \n\/\/ ============================================================\n\/\/ SECTION INTRO (before timer starts)\n\/\/ ============================================================\nfunction renderSectionIntro() {\n  clearTimer();\n  stopSpeak();\n  const key = SECTION_KEYS[state.sectionIndex];\n  const name = SECTION_NAMES[state.sectionIndex];\n  topbarSection.textContent = `${state.exam.title} \u00b7 ${name}`;\n  const durations = {\n    listening: state.exam.listening.duration,\n    reading: state.exam.reading.duration,\n    grammar: state.exam.grammar.duration,\n    written: state.exam.written.duration,\n    oral: state.exam.oral.duration,\n  };\n  globalTimer.textContent = fmtTime(durations[key]);\n  globalTimer.classList.remove(\"warn\", \"danger\");\n \n  const descriptions = {\n    listening: \"Vous allez \u00e9couter plusieurs documents audio (bulletin, interview, reportage). Chaque document peut \u00eatre \u00e9cout\u00e9 au maximum 2 fois. R\u00e9pondez aux questions \u00e0 choix multiple apr\u00e8s chaque document.\",\n    reading: \"Lisez attentivement les deux textes propos\u00e9s, puis r\u00e9pondez aux questions de compr\u00e9hension.\",\n    grammar: \"Six sections de cinq exercices chacune. Choisissez la r\u00e9ponse correcte pour chaque item.\",\n    written: \"R\u00e9digez un texte de 200 mots maximum sur l'un des deux sujets propos\u00e9s. Un clavier virtuel fran\u00e7ais est disponible pour les caract\u00e8res accentu\u00e9s.\",\n    oral: \"Vous choisirez un sujet, puis disposerez de 5 minutes de pr\u00e9paration suivies de 5 minutes de pr\u00e9sentation chronom\u00e9tr\u00e9e.\",\n  };\n \n  app.innerHTML = `\n    ${progressBarHTML()}\n    <div class=\"card\">\n      <div class=\"card-label\">\u00c9preuve ${state.sectionIndex + 1} \/ 5<\/div>\n      <h2>${name}<\/h2>\n      <div class=\"sub\">Dur\u00e9e allou\u00e9e : ${fmtTime(durations[key])} \u00b7 Score maximum : \/${{listening:15,reading:10,grammar:15,written:30,oral:30}[key]}<\/div>\n      <p style=\"margin-bottom:24px; color:var(--ink-soft); font-size:15px;\">${descriptions[key]}<\/p>\n      <button class=\"btn\" onclick=\"beginSection()\">D\u00e9marrer le chronom\u00e8tre et commencer \u2192<\/button>\n    <\/div>\n  `;\n}\n \nfunction beginSection() {\n  state.sectionStarted = true;\n  const key = SECTION_KEYS[state.sectionIndex];\n  if (key === \"listening\") renderListening();\n  else if (key === \"reading\") renderReading();\n  else if (key === \"grammar\") renderGrammar();\n  else if (key === \"written\") renderWritten();\n  else if (key === \"oral\") renderOralPick();\n}\n \nfunction goToNextSection() {\n  if (state.sectionIndex < 4) {\n    state.sectionIndex += 1;\n    renderSectionIntro();\n  } else {\n    renderResults();\n  }\n}\n \n\/\/ ============================================================\n\/\/ LISTENING\n\/\/ ============================================================\nlet listeningPlayCounts = {};\n \nfunction renderListening() {\n  const data = state.exam.listening;\n  if (!state.answers.listening.length) {\n    state.answers.listening = data.passages.map(p => p.questions.map(() => null));\n  }\n  listeningPlayCounts = listeningPlayCounts.examId === state.examId ? listeningPlayCounts : { examId: state.examId };\n  data.passages.forEach((_, i) => { if (listeningPlayCounts[i] === undefined) listeningPlayCounts[i] = 0; });\n \n  startTimer(data.duration, (t) => updateGlobalTimerDisplay(t, data.duration), () => {\n    alert(\"Temps \u00e9coul\u00e9 pour la compr\u00e9hension orale. Passage \u00e0 l'\u00e9preuve suivante.\");\n    finalizeSection(\"listening\");\n  });\n \n  renderListeningBody();\n}\n \nfunction renderListeningBody() {\n  const data = state.exam.listening;\n  const frVoice = pickFrenchVoice();\n  const voiceWarning = !frVoice ? `<div class=\"instructions\" style=\"background:#FBEAEA; border-left-color:var(--error); color:#6B1F1F;\">\u26a0 Aucune voix fran\u00e7aise n'a \u00e9t\u00e9 d\u00e9tect\u00e9e sur cet appareil. L'audio risque de ne pas se lire, ou de se lire avec un accent anglais. Essayez avec Chrome sur ordinateur, ou v\u00e9rifiez les param\u00e8tres de synth\u00e8se vocale de l'appareil.<\/div>` : \"\";\n  app.innerHTML = `\n    ${progressBarHTML()}\n    ${voiceWarning}\n    <div class=\"instructions\">Chaque document audio peut \u00eatre \u00e9cout\u00e9 au maximum 2 fois. Cliquez sur \u25b6 pour lancer la lecture (synth\u00e8se vocale).<\/div>\n    ${data.passages.map((passage, pi) => `\n      <div class=\"card\">\n        <div class=\"card-label\">Document ${pi + 1} \/ ${data.passages.length}<\/div>\n        <h2 style=\"font-size:18px;\">${passage.title}<\/h2>\n        <div class=\"audio-box\">\n          <div class=\"audio-controls\">\n            <button class=\"play-btn\" id=\"play-${pi}\" onclick=\"playPassage(${pi})\" ${listeningPlayCounts[pi] >= 2 ? \"disabled\" : \"\"}>\n              <span id=\"play-icon-${pi}\">\u25b6<\/span>\n            <\/button>\n            <div class=\"audio-meta\"><strong>\u00c9coutes restantes :<\/strong> <span id=\"count-${pi}\">${2 - listeningPlayCounts[pi]}<\/span> \/ 2<\/div>\n          <\/div>\n          <button class=\"transcript-toggle\" onclick=\"toggleTranscript(${pi})\">Afficher \/ masquer la transcription (apr\u00e8s \u00e9coute)<\/button>\n          <div class=\"transcript\" id=\"transcript-${pi}\">${passage.script}<\/div>\n        <\/div>\n        ${passage.questions.map((q, qi) => `\n          <div class=\"question-block\">\n            <div class=\"q-text\"><span class=\"q-num\">${qi + 1}.<\/span>${q.q}<\/div>\n            <div class=\"options\">\n              ${q.options.map((opt, oi) => `\n                <label class=\"option ${state.answers.listening[pi][qi] === oi ? \"selected\" : \"\"}\" onclick=\"selectListening(${pi},${qi},${oi})\">\n                  <input type=\"radio\" name=\"l-${pi}-${qi}\" ${state.answers.listening[pi][qi] === oi ? \"checked\" : \"\"}>\n                  ${opt}\n                <\/label>\n              `).join(\"\")}\n            <\/div>\n          <\/div>\n        `).join(\"\")}\n      <\/div>\n    `).join(\"\")}\n    <div class=\"footer-nav\">\n      <span style=\"font-size:13px; color:var(--ink-soft);\">R\u00e9pondu : ${countAnswered(\"listening\")} \/ ${totalQuestions(\"listening\")}<\/span>\n      <button class=\"btn\" onclick=\"finalizeSection('listening')\">Valider et continuer \u2192<\/button>\n    <\/div>\n  `;\n}\n \nfunction playPassage(pi) {\n  if (listeningPlayCounts[pi] >= 2) return;\n  listeningPlayCounts[pi] += 1;\n  const icon = document.getElementById(`play-icon-${pi}`);\n  const btn = document.getElementById(`play-${pi}`);\n  const countEl = document.getElementById(`count-${pi}`);\n  icon.textContent = \"\u2759\u2759\";\n  btn.disabled = true;\n  countEl.textContent = 2 - listeningPlayCounts[pi];\n  speak(state.exam.listening.passages[pi].script, () => {\n    icon.textContent = \"\u25b6\";\n    btn.disabled = listeningPlayCounts[pi] >= 2;\n  });\n}\n \nfunction toggleTranscript(pi) {\n  document.getElementById(`transcript-${pi}`).classList.toggle(\"show\");\n}\n \nfunction selectListening(pi, qi, oi) {\n  state.answers.listening[pi][qi] = oi;\n  renderListeningBody();\n}\n \nfunction countAnswered(key) {\n  if (key === \"listening\") return state.answers.listening.flat().filter(v => v !== null).length;\n  if (key === \"reading\") return state.answers.reading.flat().filter(v => v !== null).length;\n  if (key === \"grammar\") return state.answers.grammar.flat().filter(v => v !== null).length;\n}\nfunction totalQuestions(key) {\n  if (key === \"listening\") return state.exam.listening.passages.reduce((a, p) => a + p.questions.length, 0);\n  if (key === \"reading\") return state.exam.reading.texts.reduce((a, t) => a + t.questions.length, 0);\n  if (key === \"grammar\") return state.exam.grammar.sections.reduce((a, s) => a + s.items.length, 0);\n}\n \nfunction finalizeSection(key) {\n  clearTimer();\n  stopSpeak();\n  if (key === \"listening\") {\n    let correct = 0, total = 0;\n    state.exam.listening.passages.forEach((p, pi) => {\n      p.questions.forEach((q, qi) => {\n        total++;\n        if (state.answers.listening[pi][qi] === q.correct) correct++;\n      });\n    });\n    state.scores.listening = Math.round((correct \/ total) * state.exam.listening.maxScore * 10) \/ 10;\n  }\n  if (key === \"reading\") {\n    let correct = 0, total = 0;\n    state.exam.reading.texts.forEach((t, ti) => {\n      t.questions.forEach((q, qi) => {\n        total++;\n        if (state.answers.reading[ti][qi] === q.correct) correct++;\n      });\n    });\n    state.scores.reading = Math.round((correct \/ total) * state.exam.reading.maxScore * 10) \/ 10;\n  }\n  if (key === \"grammar\") {\n    let correct = 0, total = 0;\n    state.exam.grammar.sections.forEach((s, si) => {\n      s.items.forEach((it, ii) => {\n        total++;\n        if (state.answers.grammar[si][ii] === it.correct) correct++;\n      });\n    });\n    state.scores.grammar = Math.round((correct \/ total) * state.exam.grammar.maxScore * 10) \/ 10;\n  }\n  if (key === \"written\") {\n    const wc = state.answers.written.map(countWords);\n    const best = Math.max(...wc.map((w, i) => state.answers.written[i].trim() ? 1 : 0));\n    const hasAny = state.answers.written.some(t => t.trim().length > 20);\n    state.scores.written = hasAny ? \"\u00c0 \u00e9valuer manuellement\" : 0;\n  }\n  if (key === \"oral\") {\n    state.scores.oral = state.oralTopicIndex !== null ? \"\u00c0 \u00e9valuer (entra\u00eenement r\u00e9alis\u00e9)\" : \"Non r\u00e9alis\u00e9\";\n  }\n  goToNextSection();\n}\n \n\/\/ ============================================================\n\/\/ READING\n\/\/ ============================================================\nfunction renderReading() {\n  const data = state.exam.reading;\n  if (!state.answers.reading.length) {\n    state.answers.reading = data.texts.map(t => t.questions.map(() => null));\n  }\n  startTimer(data.duration, (t) => updateGlobalTimerDisplay(t, data.duration), () => {\n    alert(\"Temps \u00e9coul\u00e9 pour la compr\u00e9hension \u00e9crite. Passage \u00e0 l'\u00e9preuve suivante.\");\n    finalizeSection(\"reading\");\n  });\n  renderReadingBody();\n}\n \nfunction renderReadingBody() {\n  const data = state.exam.reading;\n  app.innerHTML = `\n    ${progressBarHTML()}\n    ${data.texts.map((text, ti) => `\n      <div class=\"card\">\n        <div class=\"card-label\">${text.title}<\/div>\n        <div class=\"reading-text\">${text.content}<\/div>\n        ${text.questions.map((q, qi) => `\n          <div class=\"question-block\">\n            <div class=\"q-text\"><span class=\"q-num\">${qi + 1}.<\/span>${q.q}<\/div>\n            <div class=\"options\">\n              ${q.options.map((opt, oi) => `\n                <label class=\"option ${state.answers.reading[ti][qi] === oi ? \"selected\" : \"\"}\" onclick=\"selectReading(${ti},${qi},${oi})\">\n                  <input type=\"radio\" name=\"r-${ti}-${qi}\" ${state.answers.reading[ti][qi] === oi ? \"checked\" : \"\"}>\n                  ${opt}\n                <\/label>\n              `).join(\"\")}\n            <\/div>\n          <\/div>\n        `).join(\"\")}\n      <\/div>\n    `).join(\"\")}\n    <div class=\"footer-nav\">\n      <span style=\"font-size:13px; color:var(--ink-soft);\">R\u00e9pondu : ${countAnswered(\"reading\")} \/ ${totalQuestions(\"reading\")}<\/span>\n      <button class=\"btn\" onclick=\"finalizeSection('reading')\">Valider et continuer \u2192<\/button>\n    <\/div>\n  `;\n}\n \nfunction selectReading(ti, qi, oi) {\n  state.answers.reading[ti][qi] = oi;\n  renderReadingBody();\n}\n \n\/\/ ============================================================\n\/\/ GRAMMAR\n\/\/ ============================================================\nfunction renderGrammar() {\n  const data = state.exam.grammar;\n  if (!state.answers.grammar.length) {\n    state.answers.grammar = data.sections.map(s => s.items.map(() => null));\n  }\n  startTimer(data.duration, (t) => updateGlobalTimerDisplay(t, data.duration), () => {\n    alert(\"Temps \u00e9coul\u00e9 pour la grammaire. Passage \u00e0 l'\u00e9preuve suivante.\");\n    finalizeSection(\"grammar\");\n  });\n  renderGrammarBody();\n}\n \nfunction renderGrammarBody() {\n  const data = state.exam.grammar;\n  app.innerHTML = `\n    ${progressBarHTML()}\n    ${data.sections.map((sec, si) => `\n      <div class=\"card\">\n        <div class=\"card-label\">Section ${si + 1} \/ 6<\/div>\n        <h2 style=\"font-size:18px;\">${sec.title}<\/h2>\n        ${sec.items.map((it, ii) => `\n          <div class=\"question-block\">\n            <div class=\"q-text\"><span class=\"q-num\">${ii + 1}.<\/span>${it.q}<\/div>\n            <div class=\"options\">\n              ${it.options.map((opt, oi) => `\n                <label class=\"option ${state.answers.grammar[si][ii] === oi ? \"selected\" : \"\"}\" onclick=\"selectGrammar(${si},${ii},${oi})\">\n                  <input type=\"radio\" name=\"g-${si}-${ii}\" ${state.answers.grammar[si][ii] === oi ? \"checked\" : \"\"}>\n                  ${opt}\n                <\/label>\n              `).join(\"\")}\n            <\/div>\n          <\/div>\n        `).join(\"\")}\n      <\/div>\n    `).join(\"\")}\n    <div class=\"footer-nav\">\n      <span style=\"font-size:13px; color:var(--ink-soft);\">R\u00e9pondu : ${countAnswered(\"grammar\")} \/ ${totalQuestions(\"grammar\")}<\/span>\n      <button class=\"btn\" onclick=\"finalizeSection('grammar')\">Valider et continuer \u2192<\/button>\n    <\/div>\n  `;\n}\n \nfunction selectGrammar(si, ii, oi) {\n  state.answers.grammar[si][ii] = oi;\n  renderGrammarBody();\n}\n \n\/\/ ============================================================\n\/\/ WRITTEN PRODUCTION (with virtual keyboard)\n\/\/ ============================================================\nlet activeTextareaId = null;\n \nconst FR_KEYS_ROW1 = [\"\u00e0\",\"\u00e2\",\"\u00e7\",\"\u00e8\",\"\u00e9\",\"\u00ea\",\"\u00eb\",\"\u00ee\",\"\u00ef\",\"\u00f4\",\"\u00f9\",\"\u00fb\",\"\u00fc\"];\nconst FR_KEYS_ROW2 = [\"\u0153\",\"\u00e6\",\"\u00ab\",\"\u00bb\",\"'\",\"-\"];\n \nfunction renderWritten() {\n  const data = state.exam.written;\n  startTimer(data.duration, (t) => updateGlobalTimerDisplay(t, data.duration), () => {\n    alert(\"Temps \u00e9coul\u00e9 pour la production \u00e9crite. Passage \u00e0 l'\u00e9preuve suivante.\");\n    finalizeSection(\"written\");\n  });\n  renderWrittenBody();\n}\n \nfunction renderWrittenBody() {\n  const data = state.exam.written;\n  app.innerHTML = `\n    ${progressBarHTML()}\n    <div class=\"instructions\">Choisissez un sujet (ou r\u00e9digez les deux, \u00e0 titre d'entra\u00eenement). Limite : 200 mots par texte. Le clavier virtuel ci-dessous ins\u00e8re les caract\u00e8res accentu\u00e9s fran\u00e7ais \u00e0 l'endroit du curseur.<\/div>\n    ${data.prompts.map((prompt, pi) => `\n      <div class=\"card\">\n        <div class=\"prompt-box\">\n          <div class=\"prompt-type\">${prompt.type}<\/div>\n          <div style=\"font-size:15.5px;\">${prompt.text}<\/div>\n        <\/div>\n        <button class=\"vkb-toggle\" onclick=\"toggleKeyboard(${pi})\">\u2328 Clavier fran\u00e7ais virtuel<\/button>\n        <div class=\"vkb\" id=\"vkb-${pi}\">\n          <div class=\"vkb-row\">\n            ${FR_KEYS_ROW1.map(k => `<button class=\"vkb-key\" onclick=\"insertChar(${pi},'${k}')\" type=\"button\">${k}<\/button>`).join(\"\")}\n          <\/div>\n          <div class=\"vkb-row\">\n            ${FR_KEYS_ROW2.map(k => `<button class=\"vkb-key\" onclick=\"insertChar(${pi},'${k}')\" type=\"button\">${k}<\/button>`).join(\"\")}\n            <button class=\"vkb-key wide\" onclick=\"insertChar(${pi}, ' ')\" type=\"button\">espace<\/button>\n          <\/div>\n        <\/div>\n        <textarea class=\"essay\" id=\"essay-${pi}\" placeholder=\"R\u00e9digez votre texte ici...\" oninput=\"onEssayInput(${pi})\" onfocus=\"activeTextareaId=${pi}\">${state.answers.written[pi]}<\/textarea>\n        <div class=\"word-count\" id=\"wc-${pi}\">${countWords(state.answers.written[pi])} \/ 200 mots<\/div>\n      <\/div>\n    `).join(\"\")}\n    <div class=\"footer-nav\">\n      <span><\/span>\n      <button class=\"btn\" onclick=\"finalizeSection('written')\">Valider et continuer \u2192<\/button>\n    <\/div>\n  `;\n}\n \nfunction toggleKeyboard(pi) {\n  document.getElementById(`vkb-${pi}`).classList.toggle(\"show\");\n}\n \nfunction insertChar(pi, char) {\n  const ta = document.getElementById(`essay-${pi}`);\n  const start = ta.selectionStart;\n  const end = ta.selectionEnd;\n  const val = ta.value;\n  ta.value = val.slice(0, start) + char + val.slice(end);\n  ta.selectionStart = ta.selectionEnd = start + char.length;\n  ta.focus();\n  onEssayInput(pi);\n}\n \nfunction onEssayInput(pi) {\n  const ta = document.getElementById(`essay-${pi}`);\n  state.answers.written[pi] = ta.value;\n  const wc = countWords(ta.value);\n  const wcEl = document.getElementById(`wc-${pi}`);\n  wcEl.textContent = `${wc} \/ 200 mots`;\n  wcEl.classList.toggle(\"over\", wc > 200);\n}\n \n\/\/ ============================================================\n\/\/ ORAL PRODUCTION\n\/\/ ============================================================\nfunction renderOralPick() {\n  globalTimer.textContent = \"\u2014\";\n  const data = state.exam.oral;\n  app.innerHTML = `\n    ${progressBarHTML()}\n    <div class=\"card\">\n      <div class=\"card-label\">Production orale<\/div>\n      <h2>Choisissez un sujet<\/h2>\n      <div class=\"sub\">Le sujet est normalement tir\u00e9 au hasard le jour de l'examen. Ici, s\u00e9lectionnez-en un pour vous entra\u00eener dans les m\u00eames conditions de temps.<\/div>\n      <div class=\"oral-topic-list\">\n        ${data.topics.map((topic, ti) => `\n          <div class=\"oral-topic ${state.oralTopicIndex === ti ? \"picked\" : \"\"}\" onclick=\"pickOralTopic(${ti})\">${topic}<\/div>\n        `).join(\"\")}\n      <\/div>\n      <button class=\"btn\" ${state.oralTopicIndex === null ? \"disabled\" : \"\"} onclick=\"startOralPrep()\">Commencer la pr\u00e9paration (5 min) \u2192<\/button>\n    <\/div>\n  `;\n}\n \nfunction pickOralTopic(ti) {\n  state.oralTopicIndex = ti;\n  renderOralPick();\n}\n \nfunction startOralPrep() {\n  state.oralPhase = \"prep\";\n  renderOralStage();\n  startTimer(5 * 60, (t) => {\n    updateGlobalTimerDisplay(t, 5 * 60);\n    updateOralBigTimer(t);\n  }, () => {\n    startOralSpeak();\n  });\n}\n \nfunction startOralSpeak() {\n  state.oralPhase = \"speak\";\n  renderOralStage();\n  startTimer(5 * 60, (t) => {\n    updateGlobalTimerDisplay(t, 5 * 60);\n    updateOralBigTimer(t);\n  }, () => {\n    state.oralPhase = \"done\";\n    renderOralStage();\n  });\n}\n \nfunction updateOralBigTimer(t) {\n  const el = document.getElementById(\"oralBigTimer\");\n  if (el) el.textContent = fmtTime(t);\n}\n \nfunction renderOralStage() {\n  const topic = state.exam.oral.topics[state.oralTopicIndex];\n  if (state.oralPhase === \"prep\") {\n    app.innerHTML = `\n      ${progressBarHTML()}\n      <div class=\"card oral-stage\">\n        <div class=\"oral-phase-label\">Phase de pr\u00e9paration<\/div>\n        <div class=\"big-timer\" id=\"oralBigTimer\">${fmtTime(state.timeLeft)}<\/div>\n        <div class=\"oral-topic-display\">${topic}<\/div>\n        <div class=\"oral-plan-hint\">\n          <strong>Pendant ces 5 minutes :<\/strong><br>\n          Notez 2-3 arguments principaux, un exemple concret, et une nuance ou contre-argument. Ne r\u00e9digez pas de texte complet \u2014 pr\u00e9parez un plan parl\u00e9, pas un texte lu.\n        <\/div>\n      <\/div>\n    `;\n  } else if (state.oralPhase === \"speak\") {\n    app.innerHTML = `\n      ${progressBarHTML()}\n      <div class=\"card oral-stage\">\n        <div class=\"oral-phase-label\">Pr\u00e9sentation \u2014 parlez maintenant<\/div>\n        <div class=\"big-timer\" id=\"oralBigTimer\">${fmtTime(state.timeLeft)}<\/div>\n        <div class=\"oral-topic-display\">${topic}<\/div>\n        <div class=\"oral-plan-hint\">\n          Pr\u00e9sentez votre argumentation \u00e0 voix haute jusqu'\u00e0 la fin du chronom\u00e8tre. Structurez : introduction, 2 arguments, nuance, conclusion.\n        <\/div>\n      <\/div>\n    `;\n  } else if (state.oralPhase === \"done\") {\n    app.innerHTML = `\n      ${progressBarHTML()}\n      <div class=\"card oral-stage\">\n        <div class=\"oral-phase-label\">\u00c9preuve orale termin\u00e9e<\/div>\n        <h2 style=\"margin: 16px 0;\">Bravo, l'entra\u00eenement chronom\u00e9tr\u00e9 est termin\u00e9.<\/h2>\n        <p style=\"color:var(--ink-soft); margin-bottom: 24px;\">Cette \u00e9preuve est \u00e9valu\u00e9e par un examinateur humain le jour de l'examen ; il n'y a pas de note automatique ici.<\/p>\n        <button class=\"btn\" onclick=\"finalizeSection('oral')\">Voir les r\u00e9sultats \u2192<\/button>\n      <\/div>\n    `;\n  }\n}\n \n\/\/ ============================================================\n\/\/ RESULTS\n\/\/ ============================================================\nfunction renderResults() {\n  clearTimer();\n  stopSpeak();\n  topbarSection.textContent = `${state.exam.title} \u00b7 R\u00e9sultats`;\n  globalTimer.textContent = \"\u2014\";\n \n  const minScores = { listening: 9, reading: 0, grammar: 9, written: 0, oral: 0 };\n  const maxScores = { listening: 15, reading: 10, grammar: 15, written: 30, oral: 30 };\n \n  const autoTotal = (state.scores.listening || 0) + (state.scores.reading || 0) + (state.scores.grammar || 0);\n  const autoMax = 15 + 10 + 15;\n \n  const rows = SECTION_KEYS.map((key, i) => {\n    const score = state.scores[key];\n    const isNumeric = typeof score === \"number\";\n    const min = minScores[key];\n    let rowClass = \"\";\n    if (isNumeric && min > 0) rowClass = score >= min ? \"pass-min\" : \"fail-min\";\n    return `\n      <div class=\"breakdown-row ${rowClass}\">\n        <div class=\"breakdown-name\">${SECTION_NAMES[i]}<\/div>\n        <div class=\"breakdown-score\">\n          ${isNumeric ? `${score} \/ ${maxScores[key]}` : `<em style=\"font-size:13px; color:var(--ink-soft);\">${score || \"\u2014\"}<\/em>`}\n          ${min > 0 && isNumeric ? `<span class=\"breakdown-minscore\">(seuil min. ${min})<\/span>` : \"\"}\n        <\/div>\n      <\/div>\n    `;\n  }).join(\"\");\n \n  const passedAuto = autoTotal >= 36 && (state.scores.listening || 0) >= 9 && (state.scores.grammar || 0) >= 9;\n \n  app.innerHTML = `\n    <div class=\"card\">\n      <div class=\"score-hero\">\n        <div class=\"score-label\">Score automatique (3 \u00e9preuves objectives)<\/div>\n        <div class=\"score-big ${passedAuto ? \"score-pass\" : \"score-fail\"}\">${autoTotal} \/ ${autoMax}<\/div>\n        <div class=\"score-label\" style=\"margin-top:8px;\">${passedAuto ? \"Seuils minimaux atteints sur les \u00e9preuves not\u00e9es automatiquement\" : \"Attention : un seuil minimal n'est pas atteint\"}<\/div>\n      <\/div>\n      <div class=\"breakdown\">${rows}<\/div>\n      <p style=\"font-size:13px; color:var(--ink-soft); margin-top:18px;\">Le score total officiel est sur 100 et inclut la production \u00e9crite et orale, \u00e9valu\u00e9es par un examinateur humain. Seules les \u00e9preuves de compr\u00e9hension orale, compr\u00e9hension \u00e9crite et grammaire sont not\u00e9es automatiquement ici.<\/p>\n      <div class=\"footer-nav\">\n        <button class=\"btn secondary\" onclick=\"renderLanding()\">\u2190 Retour \u00e0 l'accueil<\/button>\n        <button class=\"btn\" onclick=\"startExam(${state.examId})\">Refaire cette simulation<\/button>\n      <\/div>\n    <\/div>\n  `;\n}\n \n\/\/ ============================================================\n\/\/ INIT\n\/\/ ============================================================\nrenderLanding();\n \n<\/script>\n<\/body>\n<\/html>\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>Simulation Examen B2 \u2014 Allingua Format (Set 2)<\/title>\n<link rel=\"preconnect\" href=\"https:\/\/fonts.googleapis.com\">\n<link href=\"https:\/\/fonts.googleapis.com\/css2?family=Source+Serif+4:opsz,wght@8..60,400;8..60,600;8..60,700&#038;family=Inter:wght@400;500;600;700&#038;family=JetBrains+Mono:wght@400;500&#038;display=swap\" rel=\"stylesheet\">\n<style>\n:root {\n  --bg: #FAFAF8;\n  --bg-card: #FFFFFF;\n  --ink: #1C1C1C;\n  --ink-soft: #5A5A54;\n  --navy: #1A3A5C;\n  --navy-deep: #102740;\n  --line: #DEDED6;\n  --success: #2D6A4F;\n  --success-bg: #E8F3EC;\n  --error: #9B2C2C;\n  --error-bg: #FBEAEA;\n  --amber: #B8860B;\n  --amber-bg: #FBF3E0;\n  --radius: 3px;\n}\n\n* { box-sizing: border-box; }\n\nbody {\n  margin: 0;\n  background: var(--bg);\n  color: var(--ink);\n  font-family: 'Inter', sans-serif;\n  font-size: 16px;\n  line-height: 1.55;\n}\n\nh1, h2, h3 { font-family: 'Source Serif 4', serif; margin: 0; }\n\n.app { max-width: 880px; margin: 0 auto; padding: 0 20px 80px; }\n\n\/* ===== TOP BAR \/ TIMER ===== *\/\n.topbar {\n  position: sticky;\n  top: 0;\n  z-index: 50;\n  background: var(--navy-deep);\n  color: #EFEFE8;\n  padding: 0;\n  border-bottom: 3px solid var(--amber);\n}\n.topbar-inner {\n  max-width: 880px;\n  margin: 0 auto;\n  display: flex;\n  align-items: center;\n  justify-content: space-between;\n  padding: 10px 20px;\n  gap: 16px;\n}\n.topbar-id {\n  font-size: 12px;\n  letter-spacing: 0.08em;\n  text-transform: uppercase;\n  color: #B9C6D4;\n}\n.topbar-section {\n  font-family: 'Source Serif 4', serif;\n  font-size: 17px;\n  font-weight: 600;\n  color: #fff;\n}\n.timer {\n  font-family: 'JetBrains Mono', monospace;\n  font-size: 22px;\n  font-weight: 500;\n  padding: 4px 14px;\n  border-radius: var(--radius);\n  background: rgba(255,255,255,0.08);\n  min-width: 92px;\n  text-align: center;\n  letter-spacing: 0.02em;\n}\n.timer.warn { background: rgba(184,134,11,0.35); color: #FFE9B0; }\n.timer.danger { background: rgba(155,44,44,0.45); color: #FFD2D2; animation: pulse 1s infinite; }\n@keyframes pulse { 50% { opacity: 0.55; } }\n\n\/* ===== HEADER \/ LANDING ===== *\/\n.masthead {\n  padding: 48px 0 28px;\n  border-bottom: 1px solid var(--line);\n  margin-bottom: 32px;\n}\n.eyebrow {\n  font-size: 12px;\n  letter-spacing: 0.14em;\n  text-transform: uppercase;\n  color: var(--navy);\n  font-weight: 600;\n  margin-bottom: 10px;\n}\n.masthead h1 {\n  font-size: 34px;\n  font-weight: 700;\n  color: var(--navy-deep);\n  line-height: 1.15;\n  margin-bottom: 10px;\n}\n.masthead p { color: var(--ink-soft); font-size: 15.5px; max-width: 560px; }\n\n.exam-grid {\n  display: grid;\n  gap: 16px;\n  margin-top: 28px;\n}\n.exam-card {\n  background: var(--bg-card);\n  border: 1px solid var(--line);\n  border-radius: var(--radius);\n  padding: 22px 24px;\n  display: flex;\n  align-items: center;\n  justify-content: space-between;\n  gap: 20px;\n  transition: border-color 0.15s, transform 0.15s;\n}\n.exam-card:hover { border-color: var(--navy); transform: translateX(2px); }\n.exam-card-title { font-family: 'Source Serif 4', serif; font-size: 19px; font-weight: 600; color: var(--navy-deep); margin-bottom: 4px; }\n.exam-card-meta { font-size: 13px; color: var(--ink-soft); }\n.btn {\n  font-family: 'Inter', sans-serif;\n  font-weight: 600;\n  font-size: 14px;\n  padding: 11px 20px;\n  border-radius: var(--radius);\n  border: none;\n  cursor: pointer;\n  background: var(--navy);\n  color: #fff;\n  white-space: nowrap;\n  transition: background 0.15s;\n}\n.btn:hover { background: var(--navy-deep); }\n.btn.secondary { background: transparent; color: var(--navy); border: 1.5px solid var(--navy); }\n.btn.secondary:hover { background: var(--navy); color: #fff; }\n.btn.ghost { background: transparent; color: var(--ink-soft); border: 1px solid var(--line); }\n.btn:disabled { opacity: 0.4; cursor: not-allowed; }\n\n\/* ===== SECTION NAV (intra-exam) ===== *\/\n.section-progress {\n  display: flex;\n  gap: 6px;\n  padding: 16px 0 0;\n  flex-wrap: wrap;\n}\n.dot {\n  font-size: 11px;\n  font-weight: 600;\n  padding: 5px 11px;\n  border-radius: 20px;\n  background: #EEEEE6;\n  color: var(--ink-soft);\n  letter-spacing: 0.02em;\n}\n.dot.active { background: var(--navy); color: #fff; }\n.dot.done { background: var(--success-bg); color: var(--success); }\n\n\/* ===== CARDS \/ SECTIONS ===== *\/\n.card {\n  background: var(--bg-card);\n  border: 1px solid var(--line);\n  border-radius: var(--radius);\n  padding: 28px 30px;\n  margin-bottom: 22px;\n}\n.card-label {\n  font-size: 12px;\n  text-transform: uppercase;\n  letter-spacing: 0.1em;\n  color: var(--navy);\n  font-weight: 600;\n  margin-bottom: 8px;\n}\n.card h2 { font-size: 22px; color: var(--navy-deep); margin-bottom: 4px; }\n.card .sub { color: var(--ink-soft); font-size: 14px; margin-bottom: 18px; }\n\n.instructions {\n  background: var(--amber-bg);\n  border-left: 3px solid var(--amber);\n  padding: 12px 16px;\n  font-size: 14px;\n  color: #6B5009;\n  border-radius: var(--radius);\n  margin-bottom: 22px;\n}\n\n\/* ===== AUDIO PLAYER ===== *\/\n.audio-box {\n  background: #F3F4F0;\n  border: 1px solid var(--line);\n  border-radius: var(--radius);\n  padding: 18px 20px;\n  margin-bottom: 20px;\n}\n.audio-controls { display: flex; align-items: center; gap: 12px; margin-bottom: 10px; }\n.play-btn {\n  width: 42px; height: 42px;\n  border-radius: 50%;\n  background: var(--navy);\n  border: none;\n  color: #fff;\n  font-size: 16px;\n  cursor: pointer;\n  display: flex; align-items: center; justify-content: center;\n  flex-shrink: 0;\n}\n.play-btn:hover { background: var(--navy-deep); }\n.play-btn:disabled { background: #BBB; cursor: not-allowed; }\n.audio-meta { font-size: 13px; color: var(--ink-soft); flex: 1; }\n.audio-meta strong { color: var(--ink); }\n.play-count { font-size: 12px; color: var(--ink-soft); }\n.transcript-toggle {\n  font-size: 12.5px;\n  color: var(--navy);\n  cursor: pointer;\n  text-decoration: underline dotted;\n  background: none;\n  border: none;\n  padding: 0;\n  margin-top: 4px;\n}\n.transcript {\n  margin-top: 12px;\n  padding: 12px 14px;\n  background: #fff;\n  border: 1px dashed var(--line);\n  border-radius: var(--radius);\n  font-size: 14px;\n  color: var(--ink-soft);\n  font-style: italic;\n  display: none;\n  line-height: 1.6;\n}\n.transcript.show { display: block; }\n\n\/* ===== READING TEXT ===== *\/\n.reading-text {\n  font-family: 'Source Serif 4', serif;\n  font-size: 16.5px;\n  line-height: 1.75;\n  color: #2A2A24;\n  padding: 18px 22px;\n  background: #F6F6F1;\n  border-radius: var(--radius);\n  margin-bottom: 22px;\n  border: 1px solid var(--line);\n}\n\n\/* ===== QUESTIONS ===== *\/\n.question-block { margin-bottom: 22px; padding-bottom: 18px; border-bottom: 1px solid var(--line); }\n.question-block:last-child { border-bottom: none; }\n.q-text { font-weight: 600; margin-bottom: 10px; font-size: 15px; }\n.q-num { color: var(--navy); margin-right: 6px; }\n.options { display: flex; flex-direction: column; gap: 8px; }\n.option {\n  display: flex;\n  align-items: center;\n  gap: 10px;\n  padding: 10px 14px;\n  border: 1px solid var(--line);\n  border-radius: var(--radius);\n  cursor: pointer;\n  font-size: 14.5px;\n  transition: border-color 0.12s, background 0.12s;\n}\n.option:hover { border-color: var(--navy); background: #F6F8FA; }\n.option.selected { border-color: var(--navy); background: #EAF0F6; font-weight: 500; }\n.option.correct { border-color: var(--success); background: var(--success-bg); }\n.option.incorrect { border-color: var(--error); background: var(--error-bg); }\n.option input { accent-color: var(--navy); }\n\n.reveal-btn {\n  font-size: 12.5px;\n  color: var(--ink-soft);\n  background: #EEEEE6;\n  border: none;\n  padding: 5px 12px;\n  border-radius: var(--radius);\n  cursor: pointer;\n  margin-top: 4px;\n}\n.reveal-btn:hover { background: #E2E2D8; }\n\n\/* ===== GRAMMAR FILL ===== *\/\n.fill-q { font-size: 15px; margin-bottom: 10px; }\n.fill-q code { background: #F0F0E8; padding: 1px 4px; border-radius: 2px; }\n\n\/* ===== WRITTEN PRODUCTION ===== *\/\n.prompt-box {\n  background: #EFF3F7;\n  border: 1px solid #C9D7E3;\n  border-radius: var(--radius);\n  padding: 16px 18px;\n  margin-bottom: 18px;\n}\n.prompt-type { font-size: 12px; text-transform: uppercase; letter-spacing: 0.08em; color: var(--navy); font-weight: 600; margin-bottom: 6px; }\n.word-count { font-size: 13px; color: var(--ink-soft); margin-top: 8px; text-align: right; }\n.word-count.over { color: var(--error); font-weight: 600; }\n\ntextarea.essay {\n  width: 100%;\n  min-height: 280px;\n  font-family: 'Source Serif 4', serif;\n  font-size: 16px;\n  line-height: 1.6;\n  padding: 16px 18px;\n  border: 1px solid var(--line);\n  border-radius: var(--radius);\n  resize: vertical;\n  color: var(--ink);\n  background: #fff;\n}\ntextarea.essay:focus { outline: 2px solid var(--navy); outline-offset: 1px; }\n\n\/* Virtual keyboard *\/\n.vkb-toggle {\n  display: inline-flex;\n  align-items: center;\n  gap: 6px;\n  font-size: 13px;\n  color: var(--navy);\n  background: #fff;\n  border: 1px solid var(--navy);\n  padding: 7px 13px;\n  border-radius: var(--radius);\n  cursor: pointer;\n  margin: 10px 0;\n}\n.vkb-toggle:hover { background: #EAF0F6; }\n.vkb {\n  display: none;\n  margin-top: 10px;\n  padding: 14px;\n  background: #ECECE4;\n  border-radius: var(--radius);\n  border: 1px solid var(--line);\n}\n.vkb.show { display: block; }\n.vkb-row { display: flex; gap: 5px; margin-bottom: 5px; justify-content: center; }\n.vkb-key {\n  min-width: 36px;\n  height: 38px;\n  padding: 0 6px;\n  background: #fff;\n  border: 1px solid #CCCCC0;\n  border-radius: 4px;\n  font-size: 15px;\n  cursor: pointer;\n  font-family: 'Inter', sans-serif;\n  color: var(--ink);\n  box-shadow: 0 1px 0 rgba(0,0,0,0.06);\n}\n.vkb-key:hover { background: var(--navy); color: #fff; border-color: var(--navy); }\n.vkb-key:active { transform: translateY(1px); box-shadow: none; }\n.vkb-key.wide { min-width: 70px; font-size: 12px; }\n\n\/* ===== ORAL ===== *\/\n.oral-topic-list { display: flex; flex-direction: column; gap: 10px; margin-bottom: 20px; }\n.oral-topic {\n  padding: 14px 16px;\n  background: #F6F6F1;\n  border: 1px solid var(--line);\n  border-radius: var(--radius);\n  font-size: 15px;\n  cursor: pointer;\n}\n.oral-topic:hover { border-color: var(--navy); }\n.oral-topic.picked { border-color: var(--amber); background: var(--amber-bg); font-weight: 600; }\n.oral-stage {\n  text-align: center;\n  padding: 40px 20px;\n}\n.oral-stage .big-timer {\n  font-family: 'JetBrains Mono', monospace;\n  font-size: 56px;\n  font-weight: 500;\n  color: var(--navy-deep);\n  margin: 14px 0;\n}\n.oral-phase-label { font-size: 13px; text-transform: uppercase; letter-spacing: 0.1em; color: var(--ink-soft); }\n.oral-topic-display { font-family: 'Source Serif 4', serif; font-size: 19px; margin: 18px 0; color: var(--navy-deep); max-width: 500px; margin-left: auto; margin-right: auto; }\n.oral-plan-hint { font-size: 13px; color: var(--ink-soft); margin-top: 24px; text-align: left; background: #F6F6F1; padding: 14px 18px; border-radius: var(--radius); max-width: 460px; margin-left: auto; margin-right: auto; }\n\n\/* ===== FOOTER NAV ===== *\/\n.footer-nav {\n  display: flex;\n  justify-content: space-between;\n  align-items: center;\n  margin-top: 24px;\n  padding-top: 18px;\n}\n\n\/* ===== RESULTS ===== *\/\n.score-hero {\n  text-align: center;\n  padding: 36px 0;\n}\n.score-big {\n  font-family: 'Source Serif 4', serif;\n  font-size: 64px;\n  font-weight: 700;\n  color: var(--navy-deep);\n}\n.score-pass { color: var(--success); }\n.score-fail { color: var(--error); }\n.score-label { font-size: 14px; color: var(--ink-soft); text-transform: uppercase; letter-spacing: 0.08em; margin-top: 4px; }\n.breakdown { display: grid; gap: 10px; margin-top: 24px; }\n.breakdown-row {\n  display: flex;\n  justify-content: space-between;\n  align-items: center;\n  padding: 12px 16px;\n  background: #F6F6F1;\n  border-radius: var(--radius);\n  border: 1px solid var(--line);\n}\n.breakdown-row.fail-min { border-left: 3px solid var(--error); }\n.breakdown-row.pass-min { border-left: 3px solid var(--success); }\n.breakdown-name { font-weight: 600; font-size: 14.5px; }\n.breakdown-score { font-family: 'JetBrains Mono', monospace; font-size: 15px; }\n.breakdown-minscore { font-size: 12px; color: var(--ink-soft); margin-left: 8px; }\n\n.hidden { display: none !important; }\n\n@media (max-width: 600px) {\n  .masthead h1 { font-size: 26px; }\n  .card { padding: 20px 18px; }\n  .oral-stage .big-timer { font-size: 42px; }\n  .vkb-key { min-width: 28px; height: 34px; font-size: 13px; }\n}\n<\/style>\n<\/head>\n<body>\n\n<div class=\"topbar\">\n  <div class=\"topbar-inner\">\n    <div class=\"topbar-id\" id=\"topbarId\">B2 \u00b7 ALLINGUA FORMAT<\/div>\n    <div class=\"topbar-section\" id=\"topbarSection\">\u2014<\/div>\n    <div class=\"timer\" id=\"globalTimer\">--:--<\/div>\n  <\/div>\n<\/div>\n\n<div class=\"app\" id=\"app\"><\/div>\n\n<script>\n\/\/ ============================================================\n\/\/ DONN\u00c9ES DES SIMULATIONS 4, 5, 6 \u2014 NOUVEAUX TH\u00c8MES\n\/\/ Migration, num\u00e9risation, sant\u00e9 publique, t\u00e9l\u00e9travail\/\u00e9ducation\n\/\/ ============================================================\n\nconst EXAMS = [\n  \/\/ ============================================================\n  \/\/ SIMULATION 4 \u2014 Migration & Num\u00e9risation\n  \/\/ ============================================================\n  {\n    id: 4,\n    title: \"Simulation 4\",\n    listening: {\n      duration: 25 * 60,\n      maxScore: 15,\n      passages: [\n        {\n          title: \"Document 1 \u2014 Bulletin d'actualit\u00e9 : migration\",\n          script: \"Bonjour \u00e0 toutes et \u00e0 tous. \u00c0 la une de cette \u00e9dition : un nouveau rapport de l'Organisation internationale pour les migrations souligne l'\u00e9volution des flux migratoires en Europe au cours des cinq derni\u00e8res ann\u00e9es. Selon ce rapport, si le nombre total de demandes d'asile a globalement augment\u00e9, les profils des personnes concern\u00e9es se sont \u00e9galement diversifi\u00e9s, avec une part croissante de migrants qualifi\u00e9s cherchant \u00e0 s'int\u00e9grer sur le march\u00e9 du travail europ\u00e9en. Plusieurs pays ont ainsi r\u00e9vis\u00e9 leurs politiques d'accueil, en simplifiant notamment les proc\u00e9dures de reconnaissance des dipl\u00f4mes \u00e9trangers. Cette \u00e9volution est salu\u00e9e par certains \u00e9conomistes, qui rappellent que de nombreux secteurs, notamment la sant\u00e9 et la construction, souffrent d'une p\u00e9nurie de main-d'\u0153uvre. D'autres voix, en revanche, appellent \u00e0 la prudence, estimant que l'int\u00e9gration r\u00e9ussie des migrants n\u00e9cessite des investissements importants en mati\u00e8re de formation linguistique et d'accompagnement social, des investissements qui restent, selon elles, encore insuffisants dans plusieurs pays membres de l'Union.\",\n          questions: [\n            { q: \"Quel organisme a publi\u00e9 le rapport mentionn\u00e9 ?\", options: [\"L'Organisation internationale pour les migrations\", \"L'Organisation mondiale de la sant\u00e9\", \"La Commission europ\u00e9enne\"], correct: 0 },\n            { q: \"Comment les profils des migrants ont-ils \u00e9volu\u00e9 selon le rapport ?\", options: [\"Ils sont rest\u00e9s identiques\", \"Part croissante de migrants qualifi\u00e9s\", \"Diminution g\u00e9n\u00e9rale du nombre de migrants\"], correct: 1 },\n            { q: \"Qu'ont fait plusieurs pays concernant les dipl\u00f4mes \u00e9trangers ?\", options: [\"Ils ont supprim\u00e9 leur reconnaissance\", \"Ils ont simplifi\u00e9 les proc\u00e9dures de reconnaissance\", \"Ils n'ont rien chang\u00e9\"], correct: 1 },\n            { q: \"Quels secteurs souffrent d'une p\u00e9nurie de main-d'\u0153uvre selon le reportage ?\", options: [\"La sant\u00e9 et la construction\", \"Le tourisme uniquement\", \"L'agriculture uniquement\"], correct: 0 },\n            { q: \"Que r\u00e9clament certaines voix pour une int\u00e9gration r\u00e9ussie ?\", options: [\"Moins de contr\u00f4les aux fronti\u00e8res\", \"Des investissements en formation linguistique et accompagnement\", \"La suppression totale des aides sociales\"], correct: 1 },\n          ],\n        },\n        {\n          title: \"Document 2 \u2014 Interview : num\u00e9risation et fracture num\u00e9rique\",\n          script: \"Aujourd'hui, nous recevons un chercheur sp\u00e9cialiste des in\u00e9galit\u00e9s num\u00e9riques. Bonjour, merci d'\u00eatre avec nous. Bonjour, c'est un plaisir d'\u00eatre ici. La num\u00e9risation des services publics s'acc\u00e9l\u00e8re partout en Europe. Quels sont, selon vous, les principaux risques de cette \u00e9volution ? Le risque principal, c'est ce qu'on appelle la fracture num\u00e9rique. Lorsque les d\u00e9marches administratives deviennent exclusivement accessibles en ligne, on exclut de fait une partie de la population : les personnes \u00e2g\u00e9es, celles qui n'ont pas acc\u00e8s \u00e0 une connexion internet stable, ou encore celles qui ne ma\u00eetrisent pas suffisamment les outils num\u00e9riques. Avez-vous des exemples concrets de ces difficult\u00e9s ? Oui, par exemple, le renouvellement de certains documents administratifs, ou la prise de rendez-vous m\u00e9dicaux, deviennent parfois impossibles sans comp\u00e9tences num\u00e9riques de base. Cela cr\u00e9e une double exclusion, \u00e0 la fois sociale et num\u00e9rique. Quelles solutions pr\u00e9conisez-vous ? Il est essentiel de maintenir des points d'accueil physiques en parall\u00e8le de la d\u00e9mat\u00e9rialisation, ainsi que des formations gratuites pour accompagner les publics les plus fragiles dans cette transition.\",\n          questions: [\n            { q: \"Quelle est la sp\u00e9cialit\u00e9 du chercheur interview\u00e9 ?\", options: [\"Les in\u00e9galit\u00e9s num\u00e9riques\", \"L'\u00e9conomie internationale\", \"La sant\u00e9 publique\"], correct: 0 },\n            { q: \"Quel est le principal risque \u00e9voqu\u00e9 de la num\u00e9risation des services publics ?\", options: [\"La fracture num\u00e9rique\", \"L'augmentation des co\u00fbts\", \"La lenteur des proc\u00e9dures\"], correct: 0 },\n            { q: \"Qui est particuli\u00e8rement concern\u00e9 par cette exclusion num\u00e9rique ?\", options: [\"Les jeunes dipl\u00f4m\u00e9s\", \"Les personnes \u00e2g\u00e9es et celles sans acc\u00e8s internet stable\", \"Les fonctionnaires\"], correct: 1 },\n            { q: \"Quel exemple concret est donn\u00e9 ?\", options: [\"Le renouvellement de documents administratifs en ligne\", \"L'achat de billets de train\", \"La r\u00e9servation de restaurants\"], correct: 0 },\n            { q: \"Quelle solution le chercheur pr\u00e9conise-t-il ?\", options: [\"Supprimer totalement le num\u00e9rique\", \"Maintenir des points d'accueil physiques et des formations\", \"Rendre tout payant pour financer l'acc\u00e8s\"], correct: 1 },\n          ],\n        },\n        {\n          title: \"Document 3 \u2014 Reportage : int\u00e9gration des migrants par le travail\",\n          script: \"Nous sommes aujourd'hui dans un centre de formation professionnelle qui propose un programme sp\u00e9cifique destin\u00e9 aux personnes r\u00e9cemment arriv\u00e9es en France. Ce programme combine cours de langue intensifs et formation technique dans des secteurs en tension, comme la logistique ou les m\u00e9tiers du soin. La responsable du centre nous explique : Nous avons constat\u00e9 que l'apprentissage de la langue est beaucoup plus rapide et plus motivant lorsqu'il est directement li\u00e9 \u00e0 un objectif professionnel concret. Les participants suivent vingt heures de cours par semaine, et la majorit\u00e9 d'entre eux trouvent un emploi dans les six mois suivant la fin de la formation. Une participante, originaire de Syrie, t\u00e9moigne : Avant ce programme, je me sentais isol\u00e9e, je ne comprenais pas les d\u00e9marches administratives, je n'osais pas chercher de travail. Aujourd'hui, je travaille comme aide-soignante et je me sens enfin utile dans cette soci\u00e9t\u00e9. La responsable souligne toutefois que ce type de programme reste insuffisamment financ\u00e9 par rapport \u00e0 la demande, avec des listes d'attente de plusieurs mois dans certaines r\u00e9gions.\",\n          questions: [\n            { q: \"Que combine le programme de formation pr\u00e9sent\u00e9 ?\", options: [\"Cours de langue et formation technique\", \"Uniquement des cours de langue\", \"Uniquement de la formation technique\"], correct: 0 },\n            { q: \"Dans quels secteurs la formation technique est-elle propos\u00e9e ?\", options: [\"La finance et le droit\", \"La logistique et les m\u00e9tiers du soin\", \"L'informatique uniquement\"], correct: 1 },\n            { q: \"Combien d'heures de cours par semaine suivent les participants ?\", options: [\"10 heures\", \"20 heures\", \"35 heures\"], correct: 1 },\n            { q: \"Que fait la participante syrienne aujourd'hui ?\", options: [\"Elle est \u00e9tudiante\", \"Elle travaille comme aide-soignante\", \"Elle est sans emploi\"], correct: 1 },\n            { q: \"Quel probl\u00e8me la responsable souligne-t-elle \u00e0 la fin ?\", options: [\"Le programme est trop cher pour les participants\", \"Le financement est insuffisant, listes d'attente longues\", \"Le programme va \u00eatre supprim\u00e9\"], correct: 1 },\n          ],\n        },\n      ],\n    },\n    reading: {\n      duration: 25 * 60,\n      maxScore: 10,\n      texts: [\n        {\n          title: \"Texte 1 \u2014 Article de presse\",\n          content: \"La question migratoire continue de diviser l'opinion publique europ\u00e9enne, alors m\u00eame que les donn\u00e9es d\u00e9mographiques dessinent un tableau plus nuanc\u00e9 que ne le laissent penser les d\u00e9bats politiques. Selon plusieurs \u00e9tudes r\u00e9centes, le vieillissement de la population europ\u00e9enne et le d\u00e9clin de la natalit\u00e9 dans de nombreux pays membres rendent l'apport migratoire structurellement n\u00e9cessaire au maintien de certains \u00e9quilibres \u00e9conomiques, notamment en ce qui concerne le financement des syst\u00e8mes de retraite et la disponibilit\u00e9 de main-d'\u0153uvre dans des secteurs essentiels. Pourtant, cette r\u00e9alit\u00e9 statistique se heurte souvent \u00e0 des perceptions tr\u00e8s diff\u00e9rentes au sein de l'opinion publique, o\u00f9 les questions identitaires et culturelles occupent une place centrale dans le d\u00e9bat. Les chercheurs en sciences sociales soulignent par ailleurs que les politiques d'int\u00e9gration jouent un r\u00f4le d\u00e9terminant dans la r\u00e9ussite ou l'\u00e9chec de ces dynamiques migratoires : un acc\u00e8s rapide \u00e0 la formation linguistique, \u00e0 l'emploi et au logement favorise une int\u00e9gration durable, tandis que des politiques restrictives ou des d\u00e9lais administratifs excessifs peuvent au contraire favoriser la pr\u00e9carit\u00e9 et l'isolement social des personnes concern\u00e9es.\",\n          questions: [\n            { q: \"Que r\u00e9v\u00e8lent les donn\u00e9es d\u00e9mographiques selon le texte ?\", options: [\"Une croissance d\u00e9mographique forte en Europe\", \"Un vieillissement et un d\u00e9clin de la natalit\u00e9 rendant la migration n\u00e9cessaire\", \"Une absence de tout probl\u00e8me d\u00e9mographique\"], correct: 1 },\n            { q: \"Pourquoi l'apport migratoire est-il jug\u00e9 n\u00e9cessaire \u00e9conomiquement ?\", options: [\"Pour le financement des retraites et la main-d'\u0153uvre\", \"Pour augmenter les imp\u00f4ts\", \"Pour r\u00e9duire la population active\"], correct: 0 },\n            { q: \"Quelle place occupent les questions identitaires dans le d\u00e9bat public selon le texte ?\", options: [\"Une place marginale\", \"Une place centrale\", \"Aucune place\"], correct: 1 },\n            { q: \"Quel facteur favorise une int\u00e9gration durable selon les chercheurs ?\", options: [\"Des d\u00e9lais administratifs longs\", \"Un acc\u00e8s rapide \u00e0 la formation, l'emploi et le logement\", \"L'isolement social volontaire\"], correct: 1 },\n            { q: \"Que peuvent provoquer des politiques restrictives selon le texte ?\", options: [\"Une int\u00e9gration plus rapide\", \"La pr\u00e9carit\u00e9 et l'isolement social\", \"Aucun effet particulier\"], correct: 1 },\n          ],\n        },\n        {\n          title: \"Texte 2 \u2014 Rapport \/ document professionnel\",\n          content: \"Note de synth\u00e8se \u2014 Direction des syst\u00e8mes d'information. Objet : bilan de la transformation num\u00e9rique des services aux usagers. La pr\u00e9sente note dresse un \u00e9tat des lieux de la d\u00e9mat\u00e9rialisation des d\u00e9marches administratives mise en \u0153uvre au cours des deux derni\u00e8res ann\u00e9es au sein de notre administration. Au total, soixante-quinze pour cent des d\u00e9marches sont d\u00e9sormais accessibles en ligne, contre quarante pour cent il y a deux ans, ce qui repr\u00e9sente une progression significative en termes d'efficacit\u00e9 et de r\u00e9duction des d\u00e9lais de traitement. Toutefois, une enqu\u00eate de satisfaction men\u00e9e aupr\u00e8s des usagers r\u00e9v\u00e8le que vingt-deux pour cent d'entre eux d\u00e9clarent avoir rencontr\u00e9 des difficult\u00e9s importantes pour effectuer leurs d\u00e9marches en ligne, principalement en raison d'un manque de comp\u00e9tences num\u00e9riques ou d'un acc\u00e8s limit\u00e9 \u00e0 internet. Ce constat a conduit la direction \u00e0 maintenir, contrairement au plan initial, l'ensemble des points d'accueil physiques existants, et \u00e0 renforcer les permanences d'aide aux d\u00e9marches num\u00e9riques dans les zones rurales et aupr\u00e8s des publics \u00e2g\u00e9s. La direction recommande de poursuivre cette double approche, combinant d\u00e9mat\u00e9rialisation et accompagnement humain, plut\u00f4t que de viser une d\u00e9mat\u00e9rialisation int\u00e9grale \u00e0 court terme.\",\n          questions: [\n            { q: \"Quel pourcentage de d\u00e9marches est d\u00e9sormais accessible en ligne ?\", options: [\"40%\", \"55%\", \"75%\"], correct: 2 },\n            { q: \"Quel pourcentage d'usagers a rencontr\u00e9 des difficult\u00e9s importantes ?\", options: [\"12%\", \"22%\", \"35%\"], correct: 1 },\n            { q: \"Quelle est la principale cause de ces difficult\u00e9s ?\", options: [\"Manque de comp\u00e9tences num\u00e9riques ou d'acc\u00e8s internet\", \"Sites web trop simples\", \"Trop de personnel disponible\"], correct: 0 },\n            { q: \"Qu'a d\u00e9cid\u00e9 la direction concernant les points d'accueil physiques ?\", options: [\"Les supprimer totalement\", \"Les maintenir tous\", \"En supprimer la moiti\u00e9\"], correct: 1 },\n            { q: \"Que recommande la direction pour l'avenir ?\", options: [\"Une d\u00e9mat\u00e9rialisation int\u00e9grale imm\u00e9diate\", \"Combiner d\u00e9mat\u00e9rialisation et accompagnement humain\", \"Revenir au tout papier\"], correct: 1 },\n          ],\n        },\n      ],\n    },\n    grammar: {\n      duration: 20 * 60,\n      maxScore: 15,\n      sections: [\n        {\n          title: \"1. Subjonctif ou indicatif\",\n          items: [\n            { q: \"Il est n\u00e9cessaire que les autorit\u00e9s _______ (agir) rapidement.\", options: [\"agissent\", \"agiront\", \"agissaient\"], correct: 0 },\n            { q: \"Je suis convaincu que cette r\u00e9forme _______ (am\u00e9liorer) la situation.\", options: [\"am\u00e9liore\", \"am\u00e9liorera\", \"ait am\u00e9lior\u00e9\"], correct: 1 },\n            { q: \"Bien que la proc\u00e9dure _______ (sembler) complexe, elle reste accessible.\", options: [\"semble\", \"semblera\", \"semblait\"], correct: 0 },\n            { q: \"Il est probable que le nombre de demandes _______ (augmenter) encore.\", options: [\"augmente\", \"augmentera\", \"ait augment\u00e9\"], correct: 1 },\n            { q: \"Nous voulons que chaque candidat _______ (recevoir) une r\u00e9ponse claire.\", options: [\"re\u00e7oit\", \"re\u00e7oive\", \"recevra\"], correct: 1 },\n          ],\n        },\n        {\n          title: \"2. Pronoms relatifs\",\n          items: [\n            { q: \"C'est une d\u00e9marche _______ prend du temps.\", options: [\"qui\", \"que\", \"dont\"], correct: 0 },\n            { q: \"Le pays _______ elle est arriv\u00e9e l'an dernier l'a bien accueillie.\", options: [\"dont\", \"o\u00f9\", \"que\"], correct: 1 },\n            { q: \"Voici les documents _______ vous aurez besoin pour la demande.\", options: [\"que\", \"dont\", \"o\u00f9\"], correct: 1 },\n            { q: \"_______ inqui\u00e8te les autorit\u00e9s, c'est la lenteur des proc\u00e9dures.\", options: [\"Ce que\", \"Ce qui\", \"Ce dont\"], correct: 1 },\n            { q: \"Le formulaire \u00e0 partir _______ on d\u00e9pose une demande est en ligne.\", options: [\"duquel\", \"dont\", \"que\"], correct: 0 },\n          ],\n        },\n        {\n          title: \"3. Connecteurs logiques\",\n          items: [\n            { q: \"_______ les obstacles administratifs, elle a obtenu son titre de s\u00e9jour.\", options: [\"Malgr\u00e9\", \"Bien qu'\", \"Car\"], correct: 0 },\n            { q: \"Il a r\u00e9ussi son int\u00e9gration _______ il ne parlait pas la langue au d\u00e9part.\", options: [\"bien qu'\", \"car\", \"donc\"], correct: 0 },\n            { q: \"Elle suit des cours du soir _______ progresser plus vite.\", options: [\"afin de\", \"afin que\", \"parce que\"], correct: 0 },\n            { q: \"_______ vous ayez des difficult\u00e9s, contactez ce service d'aide.\", options: [\"Si\", \"Au cas o\u00f9\", \"Pourvu que\"], correct: 1 },\n            { q: \"Le dossier a \u00e9t\u00e9 refus\u00e9, _______ il manquait un document essentiel.\", options: [\"car\", \"donc\", \"or\"], correct: 0 },\n          ],\n        },\n        {\n          title: \"4. Voix passive et discours indirect\",\n          items: [\n            { q: \"\u00ab On a simplifi\u00e9 la proc\u00e9dure. \u00bb Forme passive :\", options: [\"La proc\u00e9dure a \u00e9t\u00e9 simplifi\u00e9e.\", \"La proc\u00e9dure simplifiait.\", \"La proc\u00e9dure sera simplifi\u00e9e.\"], correct: 0 },\n            { q: \"Il a dit : \u00ab Je d\u00e9poserai ma demande demain. \u00bb \u2192 Il a dit qu'_______\", options: [\"il d\u00e9posera sa demande demain.\", \"il d\u00e9poserait sa demande le lendemain.\", \"il a d\u00e9pos\u00e9 sa demande.\"], correct: 1 },\n            { q: \"Elle a demand\u00e9 : \u00ab Avez-vous tous les documents ? \u00bb \u2192 Elle a demand\u00e9 _______\", options: [\"si nous avions tous les documents.\", \"que nous ayons tous les documents.\", \"si nous aurons tous les documents.\"], correct: 0 },\n            { q: \"\u00ab Pr\u00e9sentez votre passeport ! \u00bb a-t-on dit. \u2192 On a dit _______\", options: [\"de pr\u00e9senter son passeport.\", \"qu'il pr\u00e9sente son passeport.\", \"de pr\u00e9sentant son passeport.\"], correct: 0 },\n            { q: \"Le dossier _______ examin\u00e9 par la commission la semaine prochaine. (passif)\", options: [\"sera\", \"aura \u00e9t\u00e9\", \"serait\"], correct: 0 },\n          ],\n        },\n        {\n          title: \"5. Pr\u00e9positions et verbes\",\n          items: [\n            { q: \"Cette mesure contribue _______ faciliter l'acc\u00e8s aux services.\", options: [\"\u00e0\", \"de\", \"pour\"], correct: 0 },\n            { q: \"Il s'agit _______ simplifier les d\u00e9marches administratives.\", options: [\"\u00e0\", \"de\", \"sur\"], correct: 1 },\n            { q: \"Les experts insistent _______ l'importance de la formation linguistique.\", options: [\"sur\", \"de\", \"\u00e0\"], correct: 0 },\n            { q: \"Le succ\u00e8s de l'int\u00e9gration d\u00e9pend _______ plusieurs facteurs.\", options: [\"\u00e0\", \"de\", \"sur\"], correct: 1 },\n            { q: \"L'administration s'engage _______ r\u00e9duire les d\u00e9lais de traitement.\", options: [\"\u00e0\", \"de\", \"pour\"], correct: 0 },\n          ],\n        },\n        {\n          title: \"6. Articles et accords\",\n          items: [\n            { q: \"_______ majorit\u00e9 des dossiers est trait\u00e9e en ligne.\", options: [\"La\", \"Une\", \"Des\"], correct: 0 },\n            { q: \"Elle a fait preuve _______ patience remarquable face aux d\u00e9marches.\", options: [\"la\", \"une\", \"de la\"], correct: 1 },\n            { q: \"Ce sont _______ proc\u00e9dures particuli\u00e8rement longues.\", options: [\"les\", \"des\", \"de\"], correct: 1 },\n            { q: \"Il reste attentif _______ besoins des usagers les plus fragiles.\", options: [\"les\", \"aux\", \"des\"], correct: 1 },\n            { q: \"_______ situations n'avaient jamais \u00e9t\u00e9 observ\u00e9es avant la r\u00e9forme.\", options: [\"De telles\", \"Les\", \"Des\"], correct: 0 },\n          ],\n        },\n      ],\n    },\n    written: {\n      duration: 40 * 60,\n      maxScore: 30,\n      prompts: [\n        { type: \"Sujet argumentatif\", text: \"La num\u00e9risation des services publics doit-elle s'accompagner du maintien de points d'accueil physiques ? Justifiez votre point de vue. (200 mots maximum)\" },\n        { type: \"Sujet cr\u00e9atif\", text: \"Racontez le t\u00e9moignage, r\u00e9el ou imaginaire, d'une personne qui a d\u00fb s'adapter \u00e0 un nouveau pays ou \u00e0 une nouvelle technologie. (200 mots maximum)\" },\n      ],\n    },\n    oral: {\n      duration: 10 * 60,\n      maxScore: 30,\n      topics: [\n        \"L'immigration est-elle une n\u00e9cessit\u00e9 \u00e9conomique pour l'Europe ?\",\n        \"La num\u00e9risation des services publics risque-t-elle d'exclure certains citoyens ?\",\n        \"Quelles politiques favorisent, selon vous, une int\u00e9gration r\u00e9ussie des migrants ?\",\n      ],\n    },\n  },\n\n  \/\/ ============================================================\n  \/\/ SIMULATION 5 \u2014 Sant\u00e9 publique\n  \/\/ ============================================================\n  {\n    id: 5,\n    title: \"Simulation 5\",\n    listening: {\n      duration: 25 * 60,\n      maxScore: 15,\n      passages: [\n        {\n          title: \"Document 1 \u2014 Bulletin d'actualit\u00e9 : sant\u00e9 publique\",\n          script: \"Bonjour \u00e0 tous, voici les titres du jour. Les autorit\u00e9s sanitaires europ\u00e9ennes alertent sur une hausse pr\u00e9occupante des maladies chroniques li\u00e9es au mode de vie, notamment le diab\u00e8te de type deux et les maladies cardiovasculaires. Selon les derniers chiffres publi\u00e9s, ces pathologies repr\u00e9senteraient d\u00e9sormais plus de soixante pour cent des d\u00e9c\u00e8s \u00e9vitables sur le continent. Plusieurs facteurs sont point\u00e9s du doigt par les experts : la s\u00e9dentarit\u00e9 croissante, une alimentation d\u00e9s\u00e9quilibr\u00e9e, et l'exposition prolong\u00e9e au stress chronique. Face \u00e0 ce constat, certains gouvernements envisagent de renforcer les campagnes de pr\u00e9vention, notamment aupr\u00e8s des jeunes publics, et d'introduire une taxation plus stricte sur les produits ultra-transform\u00e9s. Ces mesures sont toutefois critiqu\u00e9es par certains repr\u00e9sentants de l'industrie agroalimentaire, qui estiment qu'elles p\u00e9nalisent injustement les consommateurs aux revenus modestes, pour qui ces produits restent souvent les plus accessibles financi\u00e8rement. Le d\u00e9bat sur l'\u00e9quilibre entre pr\u00e9vention sanitaire et libert\u00e9 de consommation devrait occuper une place importante dans les prochains d\u00e9bats parlementaires.\",\n          questions: [\n            { q: \"Quelles maladies sont en hausse selon le bulletin ?\", options: [\"Les maladies infectieuses\", \"Le diab\u00e8te de type deux et les maladies cardiovasculaires\", \"Les maladies rares uniquement\"], correct: 1 },\n            { q: \"Quel pourcentage des d\u00e9c\u00e8s \u00e9vitables ces pathologies repr\u00e9senteraient-elles ?\", options: [\"30%\", \"60%\", \"90%\"], correct: 1 },\n            { q: \"Quels facteurs sont point\u00e9s du doigt par les experts ?\", options: [\"S\u00e9dentarit\u00e9, alimentation d\u00e9s\u00e9quilibr\u00e9e, stress chronique\", \"Uniquement le tabac\", \"Uniquement la pollution\"], correct: 0 },\n            { q: \"Que pr\u00e9voient certains gouvernements ?\", options: [\"Supprimer toute pr\u00e9vention\", \"Renforcer la pr\u00e9vention et taxer les produits ultra-transform\u00e9s\", \"Ignorer le probl\u00e8me\"], correct: 1 },\n            { q: \"Pourquoi ces mesures sont-elles critiqu\u00e9es par certains ?\", options: [\"Elles co\u00fbtent trop cher \u00e0 l'\u00c9tat\", \"Elles p\u00e9nalisent les consommateurs aux revenus modestes\", \"Elles sont inefficaces scientifiquement\"], correct: 1 },\n          ],\n        },\n        {\n          title: \"Document 2 \u2014 Interview : acc\u00e8s aux soins\",\n          script: \"Notre invit\u00e9e aujourd'hui est m\u00e9decin g\u00e9n\u00e9raliste, install\u00e9e depuis dix ans dans une zone rurale. Bonjour docteur, merci d'\u00eatre avec nous. Bonjour, merci \u00e0 vous. Pouvez-vous nous d\u00e9crire la situation de l'acc\u00e8s aux soins dans les zones rurales aujourd'hui ? La situation est pr\u00e9occupante. De nombreux villages se trouvent d\u00e9sormais \u00e0 plus de trente minutes du m\u00e9decin le plus proche, et certaines sp\u00e9cialit\u00e9s m\u00e9dicales sont quasiment inaccessibles sans se d\u00e9placer vers les grandes villes. Cela touche particuli\u00e8rement les personnes \u00e2g\u00e9es et celles qui n'ont pas de moyen de transport personnel. Quelles solutions voyez-vous se d\u00e9velopper ? La t\u00e9l\u00e9consultation s'est beaucoup d\u00e9velopp\u00e9e, notamment depuis la pand\u00e9mie, et elle permet de pallier en partie ce manque, en particulier pour le suivi de pathologies chroniques. Cependant, elle ne peut pas remplacer enti\u00e8rement une consultation physique, surtout pour les examens n\u00e9cessitant un contact direct. Certaines collectivit\u00e9s locales ont \u00e9galement mis en place des maisons de sant\u00e9 pluridisciplinaires, regroupant plusieurs professionnels au m\u00eame endroit, ce qui facilite l'acc\u00e8s aux soins. Quel serait, selon vous, le levier le plus efficace pour am\u00e9liorer durablement la situation ? Il faudrait surtout revoir les incitations \u00e0 l'installation des jeunes m\u00e9decins en zone rurale, car beaucoup pr\u00e9f\u00e8rent aujourd'hui s'installer en ville, o\u00f9 les conditions de travail sont jug\u00e9es plus attractives.\",\n          questions: [\n            { q: \"Depuis combien de temps la m\u00e9decin est-elle install\u00e9e en zone rurale ?\", options: [\"Cinq ans\", \"Dix ans\", \"Vingt ans\"], correct: 1 },\n            { q: \"Qui est particuli\u00e8rement touch\u00e9 par le manque d'acc\u00e8s aux soins ?\", options: [\"Les personnes \u00e2g\u00e9es sans moyen de transport\", \"Les jeunes actifs uniquement\", \"Les touristes\"], correct: 0 },\n            { q: \"Quelle solution s'est d\u00e9velopp\u00e9e depuis la pand\u00e9mie ?\", options: [\"La t\u00e9l\u00e9consultation\", \"La fermeture des cabinets\", \"Les visites \u00e0 domicile uniquement\"], correct: 0 },\n            { q: \"Quelle limite a la t\u00e9l\u00e9consultation selon la m\u00e9decin ?\", options: [\"Elle est trop ch\u00e8re\", \"Elle ne remplace pas une consultation physique pour certains examens\", \"Elle n'existe pas en zone rurale\"], correct: 1 },\n            { q: \"Quel levier la m\u00e9decin juge-t-elle le plus efficace ?\", options: [\"Revoir les incitations \u00e0 l'installation des jeunes m\u00e9decins en zone rurale\", \"Construire plus d'h\u00f4pitaux en ville\", \"R\u00e9duire le nombre de m\u00e9decins\"], correct: 0 },\n          ],\n        },\n        {\n          title: \"Document 3 \u2014 Reportage : sant\u00e9 mentale au travail\",\n          script: \"Nous nous int\u00e9ressons aujourd'hui \u00e0 la question de la sant\u00e9 mentale au travail, un sujet de plus en plus pr\u00e9sent dans les entreprises europ\u00e9ennes. Selon une \u00e9tude r\u00e9cente, pr\u00e8s d'un salari\u00e9 sur trois d\u00e9clare avoir ressenti des signes d'\u00e9puisement professionnel au cours de l'ann\u00e9e \u00e9coul\u00e9e. Face \u00e0 ce constat, plusieurs entreprises ont mis en place des dispositifs sp\u00e9cifiques. Nous avons rencontr\u00e9 la responsable des ressources humaines d'une entreprise pionni\u00e8re sur le sujet. Nous avons instaur\u00e9 des entretiens r\u00e9guliers avec un psychologue du travail, accessibles gratuitement et de mani\u00e8re confidentielle, explique-t-elle. Nous avons \u00e9galement form\u00e9 l'ensemble de nos managers \u00e0 rep\u00e9rer les signes avant-coureurs de l'\u00e9puisement professionnel chez leurs \u00e9quipes. Un salari\u00e9 ayant b\u00e9n\u00e9fici\u00e9 de ce dispositif t\u00e9moigne : J'\u00e9tais au bord du burn-out sans m\u00eame m'en rendre compte. Le fait de pouvoir en parler rapidement \u00e0 un professionnel m'a permis de r\u00e9agir avant que la situation ne devienne incontr\u00f4lable. La responsable reconna\u00eet cependant que ces dispositifs restent encore minoritaires, en particulier dans les petites et moyennes entreprises, qui manquent souvent de moyens pour les mettre en place.\",\n          questions: [\n            { q: \"Quelle proportion de salari\u00e9s d\u00e9clare avoir ressenti des signes d'\u00e9puisement professionnel ?\", options: [\"Un sur dix\", \"Un sur trois\", \"Un sur deux\"], correct: 1 },\n            { q: \"Quel dispositif l'entreprise a-t-elle mis en place ?\", options: [\"Des entretiens gratuits avec un psychologue du travail\", \"Une r\u00e9duction du temps de travail pour tous\", \"Rien de particulier\"], correct: 0 },\n            { q: \"Qu'ont re\u00e7u les managers comme formation ?\", options: [\"Formation \u00e0 la gestion financi\u00e8re\", \"Formation \u00e0 rep\u00e9rer les signes d'\u00e9puisement professionnel\", \"Formation en informatique\"], correct: 1 },\n            { q: \"Que dit le salari\u00e9 t\u00e9moignant ?\", options: [\"Il n'a jamais eu de probl\u00e8me\", \"Il \u00e9tait au bord du burn-out sans s'en rendre compte\", \"Il a quitt\u00e9 l'entreprise\"], correct: 1 },\n            { q: \"Quelle limite la responsable RH reconna\u00eet-elle ?\", options: [\"Ces dispositifs sont obligatoires partout\", \"Ces dispositifs restent minoritaires, surtout en PME\", \"Ces dispositifs sont trop chers m\u00eame pour les grandes entreprises\"], correct: 1 },\n          ],\n        },\n      ],\n    },\n    reading: {\n      duration: 25 * 60,\n      maxScore: 10,\n      texts: [\n        {\n          title: \"Texte 1 \u2014 Article de presse\",\n          content: \"Le vieillissement de la population europ\u00e9enne pose des d\u00e9fis croissants aux syst\u00e8mes de sant\u00e9 publique, contraints de s'adapter \u00e0 une demande de soins en constante augmentation, notamment pour la prise en charge des maladies chroniques et de la d\u00e9pendance. Selon les projections d\u00e9mographiques, la part des personnes \u00e2g\u00e9es de plus de soixante-cinq ans devrait atteindre pr\u00e8s de trente pour cent de la population europ\u00e9enne d'ici deux mille cinquante, contre environ vingt pour cent actuellement. Cette \u00e9volution soul\u00e8ve des questions majeures quant au financement futur des syst\u00e8mes de protection sociale, d\u00e9j\u00e0 fortement sollicit\u00e9s. Plusieurs pays explorent des pistes telles que le d\u00e9veloppement du maintien \u00e0 domicile des personnes \u00e2g\u00e9es, jug\u00e9 \u00e0 la fois plus humain et moins co\u00fbteux que l'h\u00e9bergement en \u00e9tablissement sp\u00e9cialis\u00e9, ou encore l'investissement dans des technologies de t\u00e9l\u00e9surveillance m\u00e9dicale permettant un suivi \u00e0 distance plus efficace. Ces solutions, bien qu'encourageantes, n\u00e9cessitent toutefois des investissements initiaux importants et une r\u00e9organisation profonde des m\u00e9tiers du soin, qui font d\u00e9j\u00e0 face \u00e0 une p\u00e9nurie significative de personnel qualifi\u00e9 dans de nombreux pays europ\u00e9ens.\",\n          questions: [\n            { q: \"Quelle \u00e9volution d\u00e9mographique est annonc\u00e9e pour 2050 ?\", options: [\"Baisse de la part des personnes \u00e2g\u00e9es\", \"Hausse \u00e0 environ 30% de personnes de plus de 65 ans\", \"Stabilit\u00e9 compl\u00e8te\"], correct: 1 },\n            { q: \"Quel d\u00e9fi cette \u00e9volution pose-t-elle ?\", options: [\"Le financement des syst\u00e8mes de protection sociale\", \"La baisse de la demande de soins\", \"Aucun d\u00e9fi particulier\"], correct: 0 },\n            { q: \"Quelle piste est explor\u00e9e pour les personnes \u00e2g\u00e9es ?\", options: [\"Le maintien \u00e0 domicile\", \"La suppression des aides\", \"L'augmentation des hospitalisations\"], correct: 0 },\n            { q: \"Quelle technologie est mentionn\u00e9e pour le suivi \u00e0 distance ?\", options: [\"La t\u00e9l\u00e9surveillance m\u00e9dicale\", \"Les drones de livraison\", \"L'intelligence artificielle g\u00e9n\u00e9rale\"], correct: 0 },\n            { q: \"Quel probl\u00e8me ces solutions rencontrent-elles ?\", options: [\"Elles sont trop simples \u00e0 mettre en place\", \"Investissements importants et p\u00e9nurie de personnel qualifi\u00e9\", \"Aucun probl\u00e8me, tout est d\u00e9j\u00e0 r\u00e9solu\"], correct: 1 },\n          ],\n        },\n        {\n          title: \"Texte 2 \u2014 Rapport \/ document professionnel\",\n          content: \"Rapport annuel \u2014 Service de sant\u00e9 au travail. Objet : synth\u00e8se des risques psychosociaux identifi\u00e9s sur l'exercice \u00e9coul\u00e9. Le pr\u00e9sent rapport pr\u00e9sente les r\u00e9sultats de l'enqu\u00eate annuelle men\u00e9e aupr\u00e8s des salari\u00e9s de notre groupe concernant les risques psychosociaux. Sur les trois mille deux cents salari\u00e9s ayant r\u00e9pondu \u00e0 l'enqu\u00eate, vingt-huit pour cent d\u00e9clarent ressentir un niveau de stress \u00e9lev\u00e9 de mani\u00e8re r\u00e9guli\u00e8re, une proportion en l\u00e9g\u00e8re hausse par rapport \u00e0 l'exercice pr\u00e9c\u00e9dent. Les principaux facteurs identifi\u00e9s sont la surcharge de travail, ressentie par quarante-cinq pour cent des r\u00e9pondants, ainsi que le manque de reconnaissance professionnelle, cit\u00e9 par trente-deux pour cent d'entre eux. Le service de sant\u00e9 au travail a mis en place, au cours de l'ann\u00e9e, plusieurs actions correctives, notamment un renforcement des effectifs dans les services identifi\u00e9s comme les plus sous tension, ainsi qu'une formation des managers \u00e0 la pr\u00e9vention des risques psychosociaux. Ces mesures ont permis une l\u00e9g\u00e8re am\u00e9lioration sur certains indicateurs, mais le rapport recommande de poursuivre ces efforts, en accordant une attention particuli\u00e8re aux nouveaux salari\u00e9s, statistiquement plus vuln\u00e9rables durant leur premi\u00e8re ann\u00e9e dans l'entreprise.\",\n          questions: [\n            { q: \"Combien de salari\u00e9s ont r\u00e9pondu \u00e0 l'enqu\u00eate ?\", options: [\"1200\", \"3200\", \"5200\"], correct: 1 },\n            { q: \"Quel pourcentage d\u00e9clare un niveau de stress \u00e9lev\u00e9 r\u00e9gulier ?\", options: [\"18%\", \"28%\", \"48%\"], correct: 1 },\n            { q: \"Quel est le principal facteur de stress identifi\u00e9 ?\", options: [\"La surcharge de travail\", \"Le manque d'espace de bureau\", \"Les trajets domicile-travail\"], correct: 0 },\n            { q: \"Quelle action corrective a \u00e9t\u00e9 mise en place ?\", options: [\"Renforcement des effectifs dans les services sous tension\", \"Suppression des cong\u00e9s\", \"R\u00e9duction des salaires\"], correct: 0 },\n            { q: \"Qui le rapport identifie-t-il comme particuli\u00e8rement vuln\u00e9rable ?\", options: [\"Les nouveaux salari\u00e9s durant leur premi\u00e8re ann\u00e9e\", \"Les salari\u00e9s proches de la retraite\", \"Les cadres dirigeants uniquement\"], correct: 0 },\n          ],\n        },\n      ],\n    },\n    grammar: {\n      duration: 20 * 60,\n      maxScore: 15,\n      sections: [\n        {\n          title: \"1. Subjonctif ou indicatif\",\n          items: [\n            { q: \"Il est essentiel que chacun _______ (avoir) acc\u00e8s aux soins de base.\", options: [\"a\", \"ait\", \"aura\"], correct: 1 },\n            { q: \"Je pense que cette campagne de pr\u00e9vention _______ (\u00eatre) utile.\", options: [\"soit\", \"est\", \"sera\"], correct: 1 },\n            { q: \"Bien que les d\u00e9lais _______ (rester) longs, la situation s'am\u00e9liore.\", options: [\"restent\", \"resteront\", \"restaient\"], correct: 0 },\n            { q: \"Il est clair que le vieillissement de la population _______ (poser) probl\u00e8me.\", options: [\"pose\", \"posera\", \"ait pos\u00e9\"], correct: 0 },\n            { q: \"Nous souhaitons que ce dispositif _______ (pouvoir) \u00eatre \u00e9tendu.\", options: [\"peut\", \"puisse\", \"pourra\"], correct: 1 },\n          ],\n        },\n        {\n          title: \"2. Pronoms relatifs\",\n          items: [\n            { q: \"C'est un probl\u00e8me _______ touche de nombreux pays.\", options: [\"qui\", \"que\", \"dont\"], correct: 0 },\n            { q: \"La r\u00e9gion _______ elle exerce manque de m\u00e9decins.\", options: [\"dont\", \"o\u00f9\", \"que\"], correct: 1 },\n            { q: \"Voici les ressources _______ nous avons besoin.\", options: [\"que\", \"dont\", \"o\u00f9\"], correct: 1 },\n            { q: \"_______ pr\u00e9occupe les experts, c'est la p\u00e9nurie de personnel.\", options: [\"Ce que\", \"Ce qui\", \"Ce dont\"], correct: 1 },\n            { q: \"Le dispositif sur _______ ils comptent n'est pas encore financ\u00e9.\", options: [\"lequel\", \"dont\", \"que\"], correct: 0 },\n          ],\n        },\n        {\n          title: \"3. Connecteurs logiques\",\n          items: [\n            { q: \"_______ les efforts des autorit\u00e9s, le syst\u00e8me reste fragile.\", options: [\"Malgr\u00e9\", \"Bien qu'\", \"Car\"], correct: 0 },\n            { q: \"Elle a accept\u00e9 ce poste _______ les conditions \u00e9taient difficiles.\", options: [\"bien que\", \"car\", \"donc\"], correct: 0 },\n            { q: \"Le service a \u00e9t\u00e9 renforc\u00e9 _______ r\u00e9duire les d\u00e9lais d'attente.\", options: [\"afin de\", \"afin que\", \"parce que\"], correct: 0 },\n            { q: \"_______ vous ressentiez du stress, n'h\u00e9sitez pas \u00e0 consulter.\", options: [\"Si\", \"Au cas o\u00f9\", \"Pourvu que\"], correct: 1 },\n            { q: \"La consultation a \u00e9t\u00e9 annul\u00e9e, _______ le m\u00e9decin \u00e9tait absent.\", options: [\"car\", \"donc\", \"or\"], correct: 0 },\n          ],\n        },\n        {\n          title: \"4. Voix passive et discours indirect\",\n          items: [\n            { q: \"\u00ab On a renforc\u00e9 les effectifs. \u00bb Forme passive :\", options: [\"Les effectifs ont \u00e9t\u00e9 renforc\u00e9s.\", \"Les effectifs renfor\u00e7aient.\", \"Les effectifs seront renforc\u00e9s.\"], correct: 0 },\n            { q: \"Il a dit : \u00ab Je consulterai un sp\u00e9cialiste. \u00bb \u2192 Il a dit qu'_______\", options: [\"il consultera un sp\u00e9cialiste.\", \"il consulterait un sp\u00e9cialiste.\", \"il a consult\u00e9 un sp\u00e9cialiste.\"], correct: 1 },\n            { q: \"Elle a demand\u00e9 : \u00ab Avez-vous des sympt\u00f4mes ? \u00bb \u2192 Elle a demand\u00e9 _______\", options: [\"si nous avions des sympt\u00f4mes.\", \"que nous ayons des sympt\u00f4mes.\", \"si nous aurons des sympt\u00f4mes.\"], correct: 0 },\n            { q: \"\u00ab Prenez du repos ! \u00bb a dit le m\u00e9decin. \u2192 Le m\u00e9decin a dit _______\", options: [\"de prendre du repos.\", \"qu'il prenne du repos.\", \"de prenant du repos.\"], correct: 0 },\n            { q: \"De nouvelles mesures _______ annonc\u00e9es la semaine prochaine. (passif)\", options: [\"seront\", \"auront \u00e9t\u00e9\", \"seraient\"], correct: 0 },\n          ],\n        },\n        {\n          title: \"5. Pr\u00e9positions et verbes\",\n          items: [\n            { q: \"Le stress chronique contribue _______ aggraver certaines maladies.\", options: [\"\u00e0\", \"de\", \"pour\"], correct: 0 },\n            { q: \"Il s'agit _______ pr\u00e9venir plut\u00f4t que de gu\u00e9rir.\", options: [\"\u00e0\", \"de\", \"sur\"], correct: 1 },\n            { q: \"Les m\u00e9decins insistent _______ l'importance du suivi r\u00e9gulier.\", options: [\"sur\", \"de\", \"\u00e0\"], correct: 0 },\n            { q: \"La gu\u00e9rison d\u00e9pend _______ plusieurs facteurs individuels.\", options: [\"\u00e0\", \"de\", \"sur\"], correct: 1 },\n            { q: \"L'h\u00f4pital s'engage _______ r\u00e9duire les temps d'attente.\", options: [\"\u00e0\", \"de\", \"pour\"], correct: 0 },\n          ],\n        },\n        {\n          title: \"6. Articles et accords\",\n          items: [\n            { q: \"_______ majorit\u00e9 des patients est satisfaite du suivi.\", options: [\"La\", \"Une\", \"Des\"], correct: 0 },\n            { q: \"Le personnel a fait preuve _______ d\u00e9vouement remarquable.\", options: [\"le\", \"un\", \"du\"], correct: 1 },\n            { q: \"Ce sont _______ d\u00e9cisions difficiles \u00e0 prendre en urgence.\", options: [\"les\", \"des\", \"de\"], correct: 1 },\n            { q: \"Elle reste attentive _______ besoins de ses patients.\", options: [\"les\", \"aux\", \"des\"], correct: 1 },\n            { q: \"_______ cas n'avaient jamais \u00e9t\u00e9 recens\u00e9s dans cette r\u00e9gion.\", options: [\"De tels\", \"Les\", \"Des\"], correct: 0 },\n          ],\n        },\n      ],\n    },\n    written: {\n      duration: 40 * 60,\n      maxScore: 30,\n      prompts: [\n        { type: \"Sujet argumentatif\", text: \"Faut-il taxer davantage les produits alimentaires jug\u00e9s mauvais pour la sant\u00e9 afin de financer la pr\u00e9vention ? Donnez votre avis. (200 mots maximum)\" },\n        { type: \"Sujet cr\u00e9atif\", text: \"D\u00e9crivez une journ\u00e9e dans la vie d'un m\u00e9decin exer\u00e7ant dans une zone rurale isol\u00e9e. (200 mots maximum)\" },\n      ],\n    },\n    oral: {\n      duration: 10 * 60,\n      maxScore: 30,\n      topics: [\n        \"Comment expliquez-vous la hausse des maladies chroniques li\u00e9es au mode de vie ?\",\n        \"La t\u00e9l\u00e9consultation peut-elle r\u00e9ellement r\u00e9soudre le probl\u00e8me de l'acc\u00e8s aux soins en zone rurale ?\",\n        \"Les entreprises devraient-elles \u00eatre davantage responsables de la sant\u00e9 mentale de leurs salari\u00e9s ?\",\n      ],\n    },\n  },\n\n  \/\/ ============================================================\n  \/\/ SIMULATION 6 \u2014 T\u00e9l\u00e9travail & \u00c9ducation\n  \/\/ ============================================================\n  {\n    id: 6,\n    title: \"Simulation 6\",\n    listening: {\n      duration: 25 * 60,\n      maxScore: 15,\n      passages: [\n        {\n          title: \"Document 1 \u2014 Bulletin d'actualit\u00e9 : t\u00e9l\u00e9travail\",\n          script: \"Bonjour \u00e0 tous, voici votre point d'actualit\u00e9 \u00e9conomique et sociale. Une \u00e9tude europ\u00e9enne publi\u00e9e cette semaine r\u00e9v\u00e8le que pr\u00e8s de la moiti\u00e9 des entreprises du secteur tertiaire ont d\u00e9sormais adopt\u00e9 un mod\u00e8le de travail hybride de mani\u00e8re permanente, combinant pr\u00e9sence au bureau et t\u00e9l\u00e9travail. Cette g\u00e9n\u00e9ralisation s'accompagne toutefois de nouveaux d\u00e9fis pour les directions des ressources humaines. Selon l'\u00e9tude, soixante pour cent des managers interrog\u00e9s d\u00e9clarent rencontrer des difficult\u00e9s \u00e0 \u00e9valuer \u00e9quitablement la performance de leurs \u00e9quipes lorsque celles-ci travaillent partiellement \u00e0 distance. Par ailleurs, plusieurs syndicats alertent sur un risque de surcharge de travail invisible, les salari\u00e9s en t\u00e9l\u00e9travail ayant tendance, selon eux, \u00e0 r\u00e9pondre aux messages professionnels en dehors des horaires habituels. Face \u00e0 ces constats, certains pays europ\u00e9ens envisagent de renforcer le droit \u00e0 la d\u00e9connexion, d\u00e9j\u00e0 inscrit dans la loi de plusieurs \u00c9tats membres, mais dont l'application concr\u00e8te reste, selon les syndicats, largement insuffisante.\",\n          questions: [\n            { q: \"Quel mod\u00e8le de travail s'est g\u00e9n\u00e9ralis\u00e9 selon l'\u00e9tude ?\", options: [\"Le t\u00e9l\u00e9travail \u00e0 temps complet\", \"Le mod\u00e8le hybride\", \"Le retour total au bureau\"], correct: 1 },\n            { q: \"Quelle difficult\u00e9 rencontrent les managers selon l'\u00e9tude ?\", options: [\"\u00c9valuer \u00e9quitablement la performance \u00e0 distance\", \"Recruter de nouveaux employ\u00e9s\", \"Payer les salaires\"], correct: 0 },\n            { q: \"Quel risque les syndicats d\u00e9noncent-ils ?\", options: [\"Une baisse g\u00e9n\u00e9rale des salaires\", \"Une surcharge de travail invisible\", \"Une diminution du nombre d'emplois\"], correct: 1 },\n            { q: \"Quel droit certains pays envisagent-ils de renforcer ?\", options: [\"Le droit \u00e0 la d\u00e9connexion\", \"Le droit aux cong\u00e9s pay\u00e9s\", \"Le droit de gr\u00e8ve\"], correct: 0 },\n            { q: \"Comment les syndicats jugent-ils l'application actuelle de ce droit ?\", options: [\"Parfaitement satisfaisante\", \"Largement insuffisante\", \"Inexistante dans tous les pays\"], correct: 1 },\n          ],\n        },\n        {\n          title: \"Document 2 \u2014 Interview : \u00e9ducation et num\u00e9rique\",\n          script: \"Notre invit\u00e9e aujourd'hui est enseignante-chercheuse sp\u00e9cialis\u00e9e dans les usages du num\u00e9rique en \u00e9ducation. Bonjour, merci d'\u00eatre avec nous. Bonjour, merci de votre invitation. Le num\u00e9rique occupe une place croissante dans les salles de classe. Quel bilan peut-on en tirer aujourd'hui ? Le bilan est nuanc\u00e9. D'un c\u00f4t\u00e9, les outils num\u00e9riques permettent une plus grande personnalisation des apprentissages, notamment pour les \u00e9l\u00e8ves en difficult\u00e9, qui peuvent avancer \u00e0 leur propre rythme gr\u00e2ce \u00e0 des exercices adaptatifs. De l'autre, on observe des effets moins positifs, notamment sur la capacit\u00e9 de concentration des \u00e9l\u00e8ves, fortement sollicit\u00e9e par ailleurs par les \u00e9crans en dehors de l'\u00e9cole. Avez-vous des recommandations \u00e0 formuler ? Je pense qu'il est essentiel de conserver un \u00e9quilibre, en r\u00e9servant certains apprentissages fondamentaux, comme la lecture et l'\u00e9criture manuscrite, \u00e0 des supports traditionnels, tout en int\u00e9grant le num\u00e9rique de mani\u00e8re cibl\u00e9e pour des usages o\u00f9 il apporte une r\u00e9elle valeur ajout\u00e9e, comme la recherche d'information ou le travail collaboratif. Comment les enseignants vivent-ils cette transition ? C'est in\u00e9gal. Certains se sont form\u00e9s rapidement et s'en servent efficacement, tandis que d'autres se sentent d\u00e9pass\u00e9s, faute de formation suffisante, ce qui cr\u00e9e des disparit\u00e9s importantes entre \u00e9tablissements.\",\n          questions: [\n            { q: \"Quelle est la sp\u00e9cialit\u00e9 de l'enseignante-chercheuse ?\", options: [\"Les usages du num\u00e9rique en \u00e9ducation\", \"L'histoire de l'art\", \"Les langues \u00e9trang\u00e8res\"], correct: 0 },\n            { q: \"Quel avantage du num\u00e9rique est mentionn\u00e9 pour les \u00e9l\u00e8ves en difficult\u00e9 ?\", options: [\"Une personnalisation des apprentissages\", \"Une suppression totale des notes\", \"Moins de devoirs\"], correct: 0 },\n            { q: \"Quel effet moins positif est observ\u00e9 ?\", options: [\"Am\u00e9lioration de la concentration\", \"Effets n\u00e9gatifs sur la capacit\u00e9 de concentration\", \"Aucun effet n\u00e9gatif\"], correct: 1 },\n            { q: \"Quelle recommandation fait l'enseignante-chercheuse ?\", options: [\"Tout num\u00e9riser sans exception\", \"Conserver certains apprentissages sur support traditionnel\", \"Supprimer totalement le num\u00e9rique\"], correct: 1 },\n            { q: \"Comment les enseignants vivent-ils cette transition selon elle ?\", options: [\"De mani\u00e8re uniforme et positive\", \"De mani\u00e8re in\u00e9gale, certains se sentent d\u00e9pass\u00e9s\", \"Tous refusent le num\u00e9rique\"], correct: 1 },\n          ],\n        },\n        {\n          title: \"Document 3 \u2014 Reportage : formation continue et reconversion\",\n          script: \"Nous nous penchons aujourd'hui sur le ph\u00e9nom\u00e8ne croissant de la reconversion professionnelle, en particulier chez les trentenaires et quarantenaires. Selon une \u00e9tude r\u00e9cente, pr\u00e8s d'un actif sur quatre envisage s\u00e9rieusement de changer de m\u00e9tier au cours des cinq prochaines ann\u00e9es. Nous avons rencontr\u00e9 un ancien cadre commercial, aujourd'hui reconverti dans l'artisanat du bois. Apr\u00e8s quinze ans dans la m\u00eame entreprise, je ressentais un profond besoin de sens dans mon travail, explique-t-il. J'ai suivi une formation de neuf mois, financ\u00e9e en partie par mon compte personnel de formation, avant de me lancer en tant qu'ind\u00e9pendant. Ce type de parcours est de plus en plus fr\u00e9quent, observe un conseiller en \u00e9volution professionnelle que nous avons \u00e9galement interrog\u00e9. Les dispositifs de formation continue se sont consid\u00e9rablement d\u00e9velopp\u00e9s ces derni\u00e8res ann\u00e9es, mais l'acc\u00e8s \u00e0 l'information reste un frein important : de nombreux actifs ignorent encore l'\u00e9tendue de leurs droits \u00e0 la formation. Il souligne \u00e9galement que la reconversion implique souvent une baisse temporaire de revenus, ce qui constitue un frein financier majeur, en particulier pour les personnes ayant des charges familiales importantes.\",\n          questions: [\n            { q: \"Quelle proportion d'actifs envisage de changer de m\u00e9tier dans les 5 ans ?\", options: [\"Un sur dix\", \"Un sur quatre\", \"Un sur deux\"], correct: 1 },\n            { q: \"Dans quel domaine l'ancien cadre commercial s'est-il reconverti ?\", options: [\"L'artisanat du bois\", \"L'informatique\", \"La m\u00e9decine\"], correct: 0 },\n            { q: \"Combien de temps a dur\u00e9 sa formation ?\", options: [\"Trois mois\", \"Neuf mois\", \"Deux ans\"], correct: 1 },\n            { q: \"Quel frein important le conseiller mentionne-t-il concernant l'acc\u00e8s \u00e0 la formation ?\", options: [\"Le manque d'information sur les droits \u00e0 la formation\", \"L'absence totale de dispositifs\", \"Le manque d'organismes de formation\"], correct: 0 },\n            { q: \"Quel autre frein financier est mentionn\u00e9 ?\", options: [\"Le co\u00fbt des transports\", \"La baisse temporaire de revenus pendant la reconversion\", \"Le prix des fournitures\"], correct: 1 },\n          ],\n        },\n      ],\n    },\n    reading: {\n      duration: 25 * 60,\n      maxScore: 10,\n      texts: [\n        {\n          title: \"Texte 1 \u2014 Article de presse\",\n          content: \"Le d\u00e9veloppement massif du t\u00e9l\u00e9travail a profond\u00e9ment transform\u00e9 l'organisation spatiale des villes europ\u00e9ennes, avec des cons\u00e9quences que les urbanistes commencent seulement \u00e0 mesurer. Plusieurs grandes m\u00e9tropoles observent une diminution sensible de la fr\u00e9quentation des quartiers d'affaires en milieu de semaine, tandis que les zones r\u00e9sidentielles p\u00e9riph\u00e9riques connaissent une activit\u00e9 commerciale accrue durant les m\u00eames p\u00e9riodes. Ce r\u00e9\u00e9quilibrage pose des questions in\u00e9dites en mati\u00e8re de planification urbaine : certains bureaux vacants sont d\u00e9sormais reconvertis en logements, une tendance encourag\u00e9e par plusieurs municipalit\u00e9s confront\u00e9es \u00e0 une p\u00e9nurie de logements abordables. Les commerces de proximit\u00e9 dans les quartiers r\u00e9sidentiels, autrefois fragilis\u00e9s par l'exode quotidien des habitants vers leur lieu de travail, connaissent quant \u00e0 eux un regain d'activit\u00e9 inattendu. Toutefois, cette transformation n'est pas sans poser de difficult\u00e9s : les centres-villes, historiquement d\u00e9pendants de la fr\u00e9quentation des travailleurs de bureau, voient certains commerces fermer, faute de client\u00e8le suffisante en semaine, ce qui oblige les collectivit\u00e9s locales \u00e0 repenser enti\u00e8rement l'attractivit\u00e9 de ces quartiers, par exemple en y d\u00e9veloppant davantage de logements ou d'activit\u00e9s culturelles.\",\n          questions: [\n            { q: \"Quel changement est observ\u00e9 dans les quartiers d'affaires ?\", options: [\"Une augmentation de fr\u00e9quentation\", \"Une diminution sensible de fr\u00e9quentation en semaine\", \"Aucun changement\"], correct: 1 },\n            { q: \"Que deviennent certains bureaux vacants ?\", options: [\"Ils sont d\u00e9truits\", \"Ils sont reconvertis en logements\", \"Ils restent vides ind\u00e9finiment\"], correct: 1 },\n            { q: \"Quel effet est observ\u00e9 sur les commerces de proximit\u00e9 r\u00e9sidentiels ?\", options: [\"Une fermeture g\u00e9n\u00e9ralis\u00e9e\", \"Un regain d'activit\u00e9 inattendu\", \"Aucun changement\"], correct: 1 },\n            { q: \"Quelle difficult\u00e9 rencontrent les centres-villes ?\", options: [\"Fermeture de commerces faute de client\u00e8le en semaine\", \"Trop de touristes\", \"Manque de bureaux disponibles\"], correct: 0 },\n            { q: \"Que doivent repenser les collectivit\u00e9s locales selon le texte ?\", options: [\"L'attractivit\u00e9 des centres-villes\", \"Les imp\u00f4ts locaux uniquement\", \"Le r\u00e9seau routier uniquement\"], correct: 0 },\n          ],\n        },\n        {\n          title: \"Texte 2 \u2014 Rapport \/ document professionnel\",\n          content: \"Bilan p\u00e9dagogique \u2014 Direction acad\u00e9mique. Objet : \u00e9valuation du dispositif d'apprentissage hybride mis en place sur l'ann\u00e9e scolaire \u00e9coul\u00e9e. Le pr\u00e9sent rapport \u00e9value les r\u00e9sultats du dispositif d'apprentissage hybride, combinant pr\u00e9sence en classe et plateforme num\u00e9rique, d\u00e9ploy\u00e9 dans l'ensemble des \u00e9tablissements de notre acad\u00e9mie au cours de l'ann\u00e9e \u00e9coul\u00e9e. Les r\u00e9sultats sont globalement encourageants : soixante-cinq pour cent des enseignants interrog\u00e9s estiment que ce dispositif a permis une meilleure personnalisation du suivi des \u00e9l\u00e8ves, notamment gr\u00e2ce aux exercices adaptatifs propos\u00e9s par la plateforme. Cependant, l'\u00e9valuation r\u00e9v\u00e8le \u00e9galement des disparit\u00e9s pr\u00e9occupantes : les \u00e9l\u00e8ves issus de familles disposant d'un acc\u00e8s limit\u00e9 \u00e0 internet ou \u00e0 un \u00e9quipement informatique adapt\u00e9 ont, dans l'ensemble, moins b\u00e9n\u00e9fici\u00e9 de ce dispositif, accentuant potentiellement les in\u00e9galit\u00e9s scolaires existantes. Par ailleurs, vingt pour cent des enseignants d\u00e9clarent ne pas se sentir suffisamment form\u00e9s \u00e0 l'utilisation de ces outils, ce qui limite leur capacit\u00e9 \u00e0 en exploiter pleinement le potentiel p\u00e9dagogique. La direction acad\u00e9mique recommande, pour l'ann\u00e9e \u00e0 venir, un renforcement du pr\u00eat de mat\u00e9riel informatique aux familles les plus modestes, ainsi qu'un programme de formation continue obligatoire pour l'ensemble du corps enseignant.\",\n          questions: [\n            { q: \"Quel pourcentage d'enseignants juge le dispositif positif pour la personnalisation du suivi ?\", options: [\"45%\", \"65%\", \"85%\"], correct: 1 },\n            { q: \"Quelle disparit\u00e9 pr\u00e9occupante est r\u00e9v\u00e9l\u00e9e ?\", options: [\"Les \u00e9l\u00e8ves avec acc\u00e8s limit\u00e9 \u00e0 internet en b\u00e9n\u00e9ficient moins\", \"Tous les \u00e9l\u00e8ves en b\u00e9n\u00e9ficient \u00e9galement\", \"Seuls les bons \u00e9l\u00e8ves y ont acc\u00e8s\"], correct: 0 },\n            { q: \"Quel pourcentage d'enseignants ne se sent pas suffisamment form\u00e9 ?\", options: [\"10%\", \"20%\", \"40%\"], correct: 1 },\n            { q: \"Que recommande la direction acad\u00e9mique pour l'ann\u00e9e \u00e0 venir ?\", options: [\"Supprimer le dispositif\", \"Renforcer le pr\u00eat de mat\u00e9riel et la formation continue\", \"Rendre le dispositif payant\"], correct: 1 },\n            { q: \"Quel type de document est-ce ?\", options: [\"Un bilan p\u00e9dagogique officiel\", \"Un article de blog personnel\", \"Une publicit\u00e9 pour une \u00e9cole priv\u00e9e\"], correct: 0 },\n          ],\n        },\n      ],\n    },\n    grammar: {\n      duration: 20 * 60,\n      maxScore: 15,\n      sections: [\n        {\n          title: \"1. Subjonctif ou indicatif\",\n          items: [\n            { q: \"Il faut que les enseignants _______ (\u00eatre) mieux form\u00e9s au num\u00e9rique.\", options: [\"sont\", \"soient\", \"seront\"], correct: 1 },\n            { q: \"Je crois que le t\u00e9l\u00e9travail _______ (avoir) des effets positifs et n\u00e9gatifs.\", options: [\"ait\", \"a\", \"aura\"], correct: 1 },\n            { q: \"Quoique la transition _______ (sembler) difficile, elle reste n\u00e9cessaire.\", options: [\"semble\", \"semblera\", \"semblait\"], correct: 0 },\n            { q: \"Il est certain que cette tendance _______ (se confirmer) dans les ann\u00e9es \u00e0 venir.\", options: [\"se confirme\", \"se confirmera\", \"se soit confirm\u00e9e\"], correct: 1 },\n            { q: \"Nous attendons qu'il _______ (finir) sa formation avant de postuler.\", options: [\"finit\", \"finisse\", \"finira\"], correct: 1 },\n          ],\n        },\n        {\n          title: \"2. Pronoms relatifs\",\n          items: [\n            { q: \"C'est une comp\u00e9tence _______ devient essentielle aujourd'hui.\", options: [\"qui\", \"que\", \"dont\"], correct: 0 },\n            { q: \"L'entreprise _______ il travaille a adopt\u00e9 le t\u00e9l\u00e9travail.\", options: [\"dont\", \"o\u00f9\", \"que\"], correct: 1 },\n            { q: \"Voici la formation _______ il a besoin pour se reconvertir.\", options: [\"que\", \"dont\", \"o\u00f9\"], correct: 1 },\n            { q: \"_______ inqui\u00e8te les enseignants, c'est le manque de formation.\", options: [\"Ce que\", \"Ce qui\", \"Ce dont\"], correct: 1 },\n            { q: \"Le dispositif gr\u00e2ce \u00e0 _______ elle a pu se reconvertir est gratuit.\", options: [\"auquel\", \"dont\", \"que\"], correct: 0 },\n          ],\n        },\n        {\n          title: \"3. Connecteurs logiques\",\n          items: [\n            { q: \"_______ les avantages du t\u00e9l\u00e9travail, certains pr\u00e9f\u00e8rent le bureau.\", options: [\"Malgr\u00e9\", \"Bien qu'\", \"Car\"], correct: 0 },\n            { q: \"Il a chang\u00e9 de m\u00e9tier _______ il avait un emploi stable.\", options: [\"bien qu'\", \"car\", \"donc\"], correct: 0 },\n            { q: \"Elle suit une formation _______ se reconvertir dans l'artisanat.\", options: [\"afin de\", \"afin que\", \"parce que\"], correct: 0 },\n            { q: \"_______ vous h\u00e9sitiez encore, ce conseiller peut vous renseigner.\", options: [\"Si\", \"Au cas o\u00f9\", \"Pourvu que\"], correct: 1 },\n            { q: \"Le cours a \u00e9t\u00e9 annul\u00e9, _______ trop peu d'\u00e9l\u00e8ves \u00e9taient inscrits.\", options: [\"car\", \"donc\", \"or\"], correct: 0 },\n          ],\n        },\n        {\n          title: \"4. Voix passive et discours indirect\",\n          items: [\n            { q: \"\u00ab On a g\u00e9n\u00e9ralis\u00e9 le t\u00e9l\u00e9travail. \u00bb Forme passive :\", options: [\"Le t\u00e9l\u00e9travail a \u00e9t\u00e9 g\u00e9n\u00e9ralis\u00e9.\", \"Le t\u00e9l\u00e9travail g\u00e9n\u00e9ralisait.\", \"Le t\u00e9l\u00e9travail sera g\u00e9n\u00e9ralis\u00e9.\"], correct: 0 },\n            { q: \"Il a dit : \u00ab Je me reconvertirai l'ann\u00e9e prochaine. \u00bb \u2192 Il a dit qu'_______\", options: [\"il se reconvertira l'ann\u00e9e prochaine.\", \"il se reconvertirait l'ann\u00e9e suivante.\", \"il s'est reconverti.\"], correct: 1 },\n            { q: \"Elle a demand\u00e9 : \u00ab Avez-vous suivi cette formation ? \u00bb \u2192 Elle a demand\u00e9 _______\", options: [\"si nous avions suivi cette formation.\", \"que nous ayons suivi cette formation.\", \"si nous suivrons cette formation.\"], correct: 0 },\n            { q: \"\u00ab Inscrivez-vous avant vendredi ! \u00bb a-t-il dit. \u2192 Il a dit _______\", options: [\"de s'inscrire avant vendredi.\", \"qu'ils s'inscrivent avant vendredi.\", \"de s'inscrivant avant vendredi.\"], correct: 0 },\n            { q: \"Les nouveaux programmes _______ appliqu\u00e9s d\u00e8s septembre. (passif)\", options: [\"seront\", \"auront \u00e9t\u00e9\", \"seraient\"], correct: 0 },\n          ],\n        },\n        {\n          title: \"5. Pr\u00e9positions et verbes\",\n          items: [\n            { q: \"Le t\u00e9l\u00e9travail contribue _______ r\u00e9duire les trajets quotidiens.\", options: [\"\u00e0\", \"de\", \"pour\"], correct: 0 },\n            { q: \"Il s'agit _______ repenser l'organisation du travail.\", options: [\"\u00e0\", \"de\", \"sur\"], correct: 1 },\n            { q: \"Les chercheurs insistent _______ la n\u00e9cessit\u00e9 de former les enseignants.\", options: [\"sur\", \"de\", \"\u00e0\"], correct: 0 },\n            { q: \"La r\u00e9ussite de la reconversion d\u00e9pend _______ plusieurs facteurs personnels.\", options: [\"\u00e0\", \"de\", \"sur\"], correct: 1 },\n            { q: \"L'acad\u00e9mie s'engage _______ former tous les enseignants au num\u00e9rique.\", options: [\"\u00e0\", \"de\", \"pour\"], correct: 0 },\n          ],\n        },\n        {\n          title: \"6. Articles et accords\",\n          items: [\n            { q: \"_______ majorit\u00e9 des entreprises a adopt\u00e9 le mod\u00e8le hybride.\", options: [\"La\", \"Une\", \"Des\"], correct: 0 },\n            { q: \"Il a fait preuve _______ motivation exceptionnelle pendant sa formation.\", options: [\"la\", \"une\", \"de la\"], correct: 1 },\n            { q: \"Ce sont _______ choix de carri\u00e8re difficiles \u00e0 assumer.\", options: [\"les\", \"des\", \"de\"], correct: 1 },\n            { q: \"Elle reste attentive _______ besoins de ses \u00e9l\u00e8ves en difficult\u00e9.\", options: [\"les\", \"aux\", \"des\"], correct: 1 },\n            { q: \"_______ disparit\u00e9s n'avaient jamais \u00e9t\u00e9 aussi visibles.\", options: [\"De telles\", \"Les\", \"Des\"], correct: 0 },\n          ],\n        },\n      ],\n    },\n    written: {\n      duration: 40 * 60,\n      maxScore: 30,\n      prompts: [\n        { type: \"Sujet argumentatif\", text: \"Le num\u00e9rique \u00e0 l'\u00e9cole est-il, selon vous, plus b\u00e9n\u00e9fique que nuisible aux apprentissages des \u00e9l\u00e8ves ? (200 mots maximum)\" },\n        { type: \"Sujet cr\u00e9atif\", text: \"Imaginez le parcours d'une personne qui d\u00e9cide, apr\u00e8s quinze ans dans le m\u00eame m\u00e9tier, de se reconvertir compl\u00e8tement. (200 mots maximum)\" },\n      ],\n    },\n    oral: {\n      duration: 10 * 60,\n      maxScore: 30,\n      topics: [\n        \"Le t\u00e9l\u00e9travail g\u00e9n\u00e9ralis\u00e9 va-t-il durablement transformer l'organisation des villes ?\",\n        \"Le num\u00e9rique \u00e0 l'\u00e9cole accentue-t-il les in\u00e9galit\u00e9s entre \u00e9l\u00e8ves ?\",\n        \"La reconversion professionnelle devrait-elle \u00eatre davantage facilit\u00e9e et financ\u00e9e par l'\u00c9tat ?\",\n      ],\n    },\n  },\n];\n\nif (typeof module !== \"undefined\") module.exports = EXAMS;\n\n<\/script>\n<script>\n\/\/ ============================================================\n\/\/ STATE\n\/\/ ============================================================\nlet state = {\n  examId: null,\n  exam: null,\n  sectionIndex: 0, \/\/ 0=listening,1=reading,2=grammar,3=written,4=oral\n  answers: { listening: [], reading: [], grammar: [], written: [\"\", \"\"], oral: null },\n  scores: {},\n  timerInterval: null,\n  timeLeft: 0,\n  sectionStarted: false,\n  oralPhase: \"pick\", \/\/ pick -> prep -> speak -> done\n  oralTopicIndex: null,\n};\n\nconst SECTION_NAMES = [\"Compr\u00e9hension orale\", \"Compr\u00e9hension \u00e9crite\", \"Grammaire\", \"Production \u00e9crite\", \"Production orale\"];\nconst SECTION_KEYS = [\"listening\", \"reading\", \"grammar\", \"written\", \"oral\"];\n\nconst app = document.getElementById(\"app\");\nconst topbarSection = document.getElementById(\"topbarSection\");\nconst topbarId = document.getElementById(\"topbarId\");\nconst globalTimer = document.getElementById(\"globalTimer\");\n\n\/\/ ============================================================\n\/\/ UTIL\n\/\/ ============================================================\nfunction fmtTime(sec) {\n  sec = Math.max(0, Math.round(sec));\n  const m = Math.floor(sec \/ 60).toString().padStart(2, \"0\");\n  const s = (sec % 60).toString().padStart(2, \"0\");\n  return `${m}:${s}`;\n}\n\nfunction clearTimer() {\n  if (state.timerInterval) clearInterval(state.timerInterval);\n  state.timerInterval = null;\n}\n\nfunction startTimer(seconds, onTick, onEnd) {\n  clearTimer();\n  state.timeLeft = seconds;\n  onTick(state.timeLeft);\n  state.timerInterval = setInterval(() => {\n    state.timeLeft -= 1;\n    onTick(state.timeLeft);\n    if (state.timeLeft <= 0) {\n      clearTimer();\n      onEnd();\n    }\n  }, 1000);\n}\n\nfunction updateGlobalTimerDisplay(sec, totalSec) {\n  globalTimer.textContent = fmtTime(sec);\n  globalTimer.classList.remove(\"warn\", \"danger\");\n  if (totalSec) {\n    const ratio = sec \/ totalSec;\n    if (ratio <= 0.1) globalTimer.classList.add(\"danger\");\n    else if (ratio <= 0.25) globalTimer.classList.add(\"warn\");\n  }\n}\n\nfunction countWords(text) {\n  return text.trim().split(\/\\s+\/).filter(Boolean).length;\n}\n\n\/\/ ============================================================\n\/\/ TTS\n\/\/ ============================================================\nlet ttsUtterance = null;\nlet ttsVoices = [];\nlet ttsVoicesReady = false;\nfunction loadVoices() {\n  ttsVoices = window.speechSynthesis ? window.speechSynthesis.getVoices() : [];\n  if (ttsVoices.length) ttsVoicesReady = true;\n}\nif (typeof speechSynthesis !== \"undefined\") {\n  loadVoices();\n  speechSynthesis.onvoiceschanged = loadVoices;\n}\nfunction pickFrenchVoice() {\n  if (!ttsVoices.length) loadVoices();\n  return ttsVoices.find(v => v.lang && v.lang.toLowerCase().startsWith(\"fr\")) || null;\n}\nfunction speak(text, onEnd) {\n  if (typeof speechSynthesis === \"undefined\") {\n    alert(\"La synth\u00e8se vocale (TTS) n'est pas disponible dans ce navigateur. Essayez avec Chrome sur ordinateur.\");\n    if (onEnd) onEnd();\n    return;\n  }\n  \/\/ If voices haven't loaded yet, give the browser a brief moment then retry once.\n  if (!ttsVoicesReady && !ttsVoices.length) {\n    loadVoices();\n    if (!ttsVoices.length) {\n      setTimeout(() => speak(text, onEnd), 300);\n      return;\n    }\n  }\n  speechSynthesis.cancel();\n  const utter = new SpeechSynthesisUtterance(text);\n  const voice = pickFrenchVoice();\n  if (voice) {\n    utter.voice = voice;\n  } else if (ttsVoices.length) {\n    \/\/ No French voice found on this device \u2014 warn once, still attempt with default voice + fr-FR lang hint.\n    console.warn(\"Aucune voix fran\u00e7aise trouv\u00e9e ; utilisation de la voix par d\u00e9faut.\");\n  }\n  utter.lang = \"fr-FR\";\n  utter.rate = 0.95;\n  utter.onend = () => { if (onEnd) onEnd(); };\n  utter.onerror = () => { if (onEnd) onEnd(); };\n  ttsUtterance = utter;\n  speechSynthesis.speak(utter);\n}\nfunction stopSpeak() {\n  if (typeof speechSynthesis !== \"undefined\") speechSynthesis.cancel();\n}\n\n\/\/ ============================================================\n\/\/ LANDING\n\/\/ ============================================================\nfunction renderLanding() {\n  clearTimer();\n  stopSpeak();\n  topbarSection.textContent = \"Accueil\";\n  topbarId.textContent = \"B2 \u00b7 ALLINGUA FORMAT\";\n  updateGlobalTimerDisplay(0);\n  globalTimer.textContent = \"\u2014\";\n  globalTimer.classList.remove(\"warn\", \"danger\");\n\n  app.innerHTML = `\n    <div class=\"masthead\">\n      <div class=\"eyebrow\">Pr\u00e9paration \u00e0 l'examen \u2014 S\u00e9rie 2<\/div>\n      <h1>Simulation d'examen B2 \u2014 Migration, num\u00e9rique, sant\u00e9, travail<\/h1>\n      <p>Trois nouvelles simulations ind\u00e9pendantes, m\u00eame format officiel complet : compr\u00e9hension orale (avec audio), compr\u00e9hension \u00e9crite, grammaire, production \u00e9crite avec clavier fran\u00e7ais virtuel, et production orale chronom\u00e9tr\u00e9e. Th\u00e8mes : migration, num\u00e9risation, sant\u00e9 publique, t\u00e9l\u00e9travail et \u00e9ducation.<\/p>\n    <\/div>\n    <div class=\"exam-grid\">\n      ${EXAMS.map(e => `\n        <div class=\"exam-card\">\n          <div>\n            <div class=\"exam-card-title\">${e.title}<\/div>\n            <div class=\"exam-card-meta\">5 \u00e9preuves \u00b7 ~2h00 \u00b7 Score \/100, seuil de r\u00e9ussite 60<\/div>\n          <\/div>\n          <button class=\"btn\" onclick=\"startExam(${e.id})\">Commencer \u2192<\/button>\n        <\/div>\n      `).join(\"\")}\n    <\/div>\n  `;\n}\n\nfunction startExam(id) {\n  state.examId = id;\n  state.exam = EXAMS.find(e => e.id === id);\n  state.sectionIndex = 0;\n  state.answers = { listening: [], reading: [], grammar: [], written: [\"\", \"\"], oral: null };\n  state.scores = {};\n  state.sectionStarted = false;\n  state.oralPhase = \"pick\";\n  state.oralTopicIndex = null;\n  renderSectionIntro();\n}\n\n\/\/ ============================================================\n\/\/ SECTION PROGRESS BAR\n\/\/ ============================================================\nfunction progressBarHTML() {\n  return `\n    <div class=\"section-progress\">\n      ${SECTION_NAMES.map((name, i) => {\n        let cls = \"dot\";\n        if (i < state.sectionIndex) cls += \" done\";\n        else if (i === state.sectionIndex) cls += \" active\";\n        return `<span class=\"${cls}\">${i + 1}. ${name}<\/span>`;\n      }).join(\"\")}\n    <\/div>\n  `;\n}\n\n\/\/ ============================================================\n\/\/ SECTION INTRO (before timer starts)\n\/\/ ============================================================\nfunction renderSectionIntro() {\n  clearTimer();\n  stopSpeak();\n  const key = SECTION_KEYS[state.sectionIndex];\n  const name = SECTION_NAMES[state.sectionIndex];\n  topbarSection.textContent = `${state.exam.title} \u00b7 ${name}`;\n  const durations = {\n    listening: state.exam.listening.duration,\n    reading: state.exam.reading.duration,\n    grammar: state.exam.grammar.duration,\n    written: state.exam.written.duration,\n    oral: state.exam.oral.duration,\n  };\n  globalTimer.textContent = fmtTime(durations[key]);\n  globalTimer.classList.remove(\"warn\", \"danger\");\n\n  const descriptions = {\n    listening: \"Vous allez \u00e9couter plusieurs documents audio (bulletin, interview, reportage). Chaque document peut \u00eatre \u00e9cout\u00e9 au maximum 2 fois. R\u00e9pondez aux questions \u00e0 choix multiple apr\u00e8s chaque document.\",\n    reading: \"Lisez attentivement les deux textes propos\u00e9s, puis r\u00e9pondez aux questions de compr\u00e9hension.\",\n    grammar: \"Six sections de cinq exercices chacune. Choisissez la r\u00e9ponse correcte pour chaque item.\",\n    written: \"R\u00e9digez un texte de 200 mots maximum sur l'un des deux sujets propos\u00e9s. Un clavier virtuel fran\u00e7ais est disponible pour les caract\u00e8res accentu\u00e9s.\",\n    oral: \"Vous choisirez un sujet, puis disposerez de 5 minutes de pr\u00e9paration suivies de 5 minutes de pr\u00e9sentation chronom\u00e9tr\u00e9e.\",\n  };\n\n  app.innerHTML = `\n    ${progressBarHTML()}\n    <div class=\"card\">\n      <div class=\"card-label\">\u00c9preuve ${state.sectionIndex + 1} \/ 5<\/div>\n      <h2>${name}<\/h2>\n      <div class=\"sub\">Dur\u00e9e allou\u00e9e : ${fmtTime(durations[key])} \u00b7 Score maximum : \/${{listening:15,reading:10,grammar:15,written:30,oral:30}[key]}<\/div>\n      <p style=\"margin-bottom:24px; color:var(--ink-soft); font-size:15px;\">${descriptions[key]}<\/p>\n      <button class=\"btn\" onclick=\"beginSection()\">D\u00e9marrer le chronom\u00e8tre et commencer \u2192<\/button>\n    <\/div>\n  `;\n}\n\nfunction beginSection() {\n  state.sectionStarted = true;\n  const key = SECTION_KEYS[state.sectionIndex];\n  if (key === \"listening\") renderListening();\n  else if (key === \"reading\") renderReading();\n  else if (key === \"grammar\") renderGrammar();\n  else if (key === \"written\") renderWritten();\n  else if (key === \"oral\") renderOralPick();\n}\n\nfunction goToNextSection() {\n  if (state.sectionIndex < 4) {\n    state.sectionIndex += 1;\n    renderSectionIntro();\n  } else {\n    renderResults();\n  }\n}\n\n\/\/ ============================================================\n\/\/ LISTENING\n\/\/ ============================================================\nlet listeningPlayCounts = {};\n\nfunction renderListening() {\n  const data = state.exam.listening;\n  if (!state.answers.listening.length) {\n    state.answers.listening = data.passages.map(p => p.questions.map(() => null));\n  }\n  listeningPlayCounts = listeningPlayCounts.examId === state.examId ? listeningPlayCounts : { examId: state.examId };\n  data.passages.forEach((_, i) => { if (listeningPlayCounts[i] === undefined) listeningPlayCounts[i] = 0; });\n\n  startTimer(data.duration, (t) => updateGlobalTimerDisplay(t, data.duration), () => {\n    alert(\"Temps \u00e9coul\u00e9 pour la compr\u00e9hension orale. Passage \u00e0 l'\u00e9preuve suivante.\");\n    finalizeSection(\"listening\");\n  });\n\n  renderListeningBody();\n}\n\nfunction renderListeningBody() {\n  const data = state.exam.listening;\n  const frVoice = pickFrenchVoice();\n  const voiceWarning = !frVoice ? `<div class=\"instructions\" style=\"background:#FBEAEA; border-left-color:var(--error); color:#6B1F1F;\">\u26a0 Aucune voix fran\u00e7aise n'a \u00e9t\u00e9 d\u00e9tect\u00e9e sur cet appareil. L'audio risque de ne pas se lire, ou de se lire avec un accent anglais. Essayez avec Chrome sur ordinateur, ou v\u00e9rifiez les param\u00e8tres de synth\u00e8se vocale de l'appareil.<\/div>` : \"\";\n  app.innerHTML = `\n    ${progressBarHTML()}\n    ${voiceWarning}\n    <div class=\"instructions\">Chaque document audio peut \u00eatre \u00e9cout\u00e9 au maximum 2 fois. Cliquez sur \u25b6 pour lancer la lecture (synth\u00e8se vocale).<\/div>\n    ${data.passages.map((passage, pi) => `\n      <div class=\"card\">\n        <div class=\"card-label\">Document ${pi + 1} \/ ${data.passages.length}<\/div>\n        <h2 style=\"font-size:18px;\">${passage.title}<\/h2>\n        <div class=\"audio-box\">\n          <div class=\"audio-controls\">\n            <button class=\"play-btn\" id=\"play-${pi}\" onclick=\"playPassage(${pi})\" ${listeningPlayCounts[pi] >= 2 ? \"disabled\" : \"\"}>\n              <span id=\"play-icon-${pi}\">\u25b6<\/span>\n            <\/button>\n            <div class=\"audio-meta\"><strong>\u00c9coutes restantes :<\/strong> <span id=\"count-${pi}\">${2 - listeningPlayCounts[pi]}<\/span> \/ 2<\/div>\n          <\/div>\n          <button class=\"transcript-toggle\" onclick=\"toggleTranscript(${pi})\">Afficher \/ masquer la transcription (apr\u00e8s \u00e9coute)<\/button>\n          <div class=\"transcript\" id=\"transcript-${pi}\">${passage.script}<\/div>\n        <\/div>\n        ${passage.questions.map((q, qi) => `\n          <div class=\"question-block\">\n            <div class=\"q-text\"><span class=\"q-num\">${qi + 1}.<\/span>${q.q}<\/div>\n            <div class=\"options\">\n              ${q.options.map((opt, oi) => `\n                <label class=\"option ${state.answers.listening[pi][qi] === oi ? \"selected\" : \"\"}\" onclick=\"selectListening(${pi},${qi},${oi})\">\n                  <input type=\"radio\" name=\"l-${pi}-${qi}\" ${state.answers.listening[pi][qi] === oi ? \"checked\" : \"\"}>\n                  ${opt}\n                <\/label>\n              `).join(\"\")}\n            <\/div>\n          <\/div>\n        `).join(\"\")}\n      <\/div>\n    `).join(\"\")}\n    <div class=\"footer-nav\">\n      <span style=\"font-size:13px; color:var(--ink-soft);\">R\u00e9pondu : ${countAnswered(\"listening\")} \/ ${totalQuestions(\"listening\")}<\/span>\n      <button class=\"btn\" onclick=\"finalizeSection('listening')\">Valider et continuer \u2192<\/button>\n    <\/div>\n  `;\n}\n\nfunction playPassage(pi) {\n  if (listeningPlayCounts[pi] >= 2) return;\n  listeningPlayCounts[pi] += 1;\n  const icon = document.getElementById(`play-icon-${pi}`);\n  const btn = document.getElementById(`play-${pi}`);\n  const countEl = document.getElementById(`count-${pi}`);\n  icon.textContent = \"\u2759\u2759\";\n  btn.disabled = true;\n  countEl.textContent = 2 - listeningPlayCounts[pi];\n  speak(state.exam.listening.passages[pi].script, () => {\n    icon.textContent = \"\u25b6\";\n    btn.disabled = listeningPlayCounts[pi] >= 2;\n  });\n}\n\nfunction toggleTranscript(pi) {\n  document.getElementById(`transcript-${pi}`).classList.toggle(\"show\");\n}\n\nfunction selectListening(pi, qi, oi) {\n  state.answers.listening[pi][qi] = oi;\n  renderListeningBody();\n}\n\nfunction countAnswered(key) {\n  if (key === \"listening\") return state.answers.listening.flat().filter(v => v !== null).length;\n  if (key === \"reading\") return state.answers.reading.flat().filter(v => v !== null).length;\n  if (key === \"grammar\") return state.answers.grammar.flat().filter(v => v !== null).length;\n}\nfunction totalQuestions(key) {\n  if (key === \"listening\") return state.exam.listening.passages.reduce((a, p) => a + p.questions.length, 0);\n  if (key === \"reading\") return state.exam.reading.texts.reduce((a, t) => a + t.questions.length, 0);\n  if (key === \"grammar\") return state.exam.grammar.sections.reduce((a, s) => a + s.items.length, 0);\n}\n\nfunction finalizeSection(key) {\n  clearTimer();\n  stopSpeak();\n  if (key === \"listening\") {\n    let correct = 0, total = 0;\n    state.exam.listening.passages.forEach((p, pi) => {\n      p.questions.forEach((q, qi) => {\n        total++;\n        if (state.answers.listening[pi][qi] === q.correct) correct++;\n      });\n    });\n    state.scores.listening = Math.round((correct \/ total) * state.exam.listening.maxScore * 10) \/ 10;\n  }\n  if (key === \"reading\") {\n    let correct = 0, total = 0;\n    state.exam.reading.texts.forEach((t, ti) => {\n      t.questions.forEach((q, qi) => {\n        total++;\n        if (state.answers.reading[ti][qi] === q.correct) correct++;\n      });\n    });\n    state.scores.reading = Math.round((correct \/ total) * state.exam.reading.maxScore * 10) \/ 10;\n  }\n  if (key === \"grammar\") {\n    let correct = 0, total = 0;\n    state.exam.grammar.sections.forEach((s, si) => {\n      s.items.forEach((it, ii) => {\n        total++;\n        if (state.answers.grammar[si][ii] === it.correct) correct++;\n      });\n    });\n    state.scores.grammar = Math.round((correct \/ total) * state.exam.grammar.maxScore * 10) \/ 10;\n  }\n  if (key === \"written\") {\n    const wc = state.answers.written.map(countWords);\n    const best = Math.max(...wc.map((w, i) => state.answers.written[i].trim() ? 1 : 0));\n    const hasAny = state.answers.written.some(t => t.trim().length > 20);\n    state.scores.written = hasAny ? \"\u00c0 \u00e9valuer manuellement\" : 0;\n  }\n  if (key === \"oral\") {\n    state.scores.oral = state.oralTopicIndex !== null ? \"\u00c0 \u00e9valuer (entra\u00eenement r\u00e9alis\u00e9)\" : \"Non r\u00e9alis\u00e9\";\n  }\n  goToNextSection();\n}\n\n\/\/ ============================================================\n\/\/ READING\n\/\/ ============================================================\nfunction renderReading() {\n  const data = state.exam.reading;\n  if (!state.answers.reading.length) {\n    state.answers.reading = data.texts.map(t => t.questions.map(() => null));\n  }\n  startTimer(data.duration, (t) => updateGlobalTimerDisplay(t, data.duration), () => {\n    alert(\"Temps \u00e9coul\u00e9 pour la compr\u00e9hension \u00e9crite. Passage \u00e0 l'\u00e9preuve suivante.\");\n    finalizeSection(\"reading\");\n  });\n  renderReadingBody();\n}\n\nfunction renderReadingBody() {\n  const data = state.exam.reading;\n  app.innerHTML = `\n    ${progressBarHTML()}\n    ${data.texts.map((text, ti) => `\n      <div class=\"card\">\n        <div class=\"card-label\">${text.title}<\/div>\n        <div class=\"reading-text\">${text.content}<\/div>\n        ${text.questions.map((q, qi) => `\n          <div class=\"question-block\">\n            <div class=\"q-text\"><span class=\"q-num\">${qi + 1}.<\/span>${q.q}<\/div>\n            <div class=\"options\">\n              ${q.options.map((opt, oi) => `\n                <label class=\"option ${state.answers.reading[ti][qi] === oi ? \"selected\" : \"\"}\" onclick=\"selectReading(${ti},${qi},${oi})\">\n                  <input type=\"radio\" name=\"r-${ti}-${qi}\" ${state.answers.reading[ti][qi] === oi ? \"checked\" : \"\"}>\n                  ${opt}\n                <\/label>\n              `).join(\"\")}\n            <\/div>\n          <\/div>\n        `).join(\"\")}\n      <\/div>\n    `).join(\"\")}\n    <div class=\"footer-nav\">\n      <span style=\"font-size:13px; color:var(--ink-soft);\">R\u00e9pondu : ${countAnswered(\"reading\")} \/ ${totalQuestions(\"reading\")}<\/span>\n      <button class=\"btn\" onclick=\"finalizeSection('reading')\">Valider et continuer \u2192<\/button>\n    <\/div>\n  `;\n}\n\nfunction selectReading(ti, qi, oi) {\n  state.answers.reading[ti][qi] = oi;\n  renderReadingBody();\n}\n\n\/\/ ============================================================\n\/\/ GRAMMAR\n\/\/ ============================================================\nfunction renderGrammar() {\n  const data = state.exam.grammar;\n  if (!state.answers.grammar.length) {\n    state.answers.grammar = data.sections.map(s => s.items.map(() => null));\n  }\n  startTimer(data.duration, (t) => updateGlobalTimerDisplay(t, data.duration), () => {\n    alert(\"Temps \u00e9coul\u00e9 pour la grammaire. Passage \u00e0 l'\u00e9preuve suivante.\");\n    finalizeSection(\"grammar\");\n  });\n  renderGrammarBody();\n}\n\nfunction renderGrammarBody() {\n  const data = state.exam.grammar;\n  app.innerHTML = `\n    ${progressBarHTML()}\n    ${data.sections.map((sec, si) => `\n      <div class=\"card\">\n        <div class=\"card-label\">Section ${si + 1} \/ 6<\/div>\n        <h2 style=\"font-size:18px;\">${sec.title}<\/h2>\n        ${sec.items.map((it, ii) => `\n          <div class=\"question-block\">\n            <div class=\"q-text\"><span class=\"q-num\">${ii + 1}.<\/span>${it.q}<\/div>\n            <div class=\"options\">\n              ${it.options.map((opt, oi) => `\n                <label class=\"option ${state.answers.grammar[si][ii] === oi ? \"selected\" : \"\"}\" onclick=\"selectGrammar(${si},${ii},${oi})\">\n                  <input type=\"radio\" name=\"g-${si}-${ii}\" ${state.answers.grammar[si][ii] === oi ? \"checked\" : \"\"}>\n                  ${opt}\n                <\/label>\n              `).join(\"\")}\n            <\/div>\n          <\/div>\n        `).join(\"\")}\n      <\/div>\n    `).join(\"\")}\n    <div class=\"footer-nav\">\n      <span style=\"font-size:13px; color:var(--ink-soft);\">R\u00e9pondu : ${countAnswered(\"grammar\")} \/ ${totalQuestions(\"grammar\")}<\/span>\n      <button class=\"btn\" onclick=\"finalizeSection('grammar')\">Valider et continuer \u2192<\/button>\n    <\/div>\n  `;\n}\n\nfunction selectGrammar(si, ii, oi) {\n  state.answers.grammar[si][ii] = oi;\n  renderGrammarBody();\n}\n\n\/\/ ============================================================\n\/\/ WRITTEN PRODUCTION (with virtual keyboard)\n\/\/ ============================================================\nlet activeTextareaId = null;\n\nconst FR_KEYS_ROW1 = [\"\u00e0\",\"\u00e2\",\"\u00e7\",\"\u00e8\",\"\u00e9\",\"\u00ea\",\"\u00eb\",\"\u00ee\",\"\u00ef\",\"\u00f4\",\"\u00f9\",\"\u00fb\",\"\u00fc\"];\nconst FR_KEYS_ROW2 = [\"\u0153\",\"\u00e6\",\"\u00ab\",\"\u00bb\",\"'\",\"-\"];\n\nfunction renderWritten() {\n  const data = state.exam.written;\n  startTimer(data.duration, (t) => updateGlobalTimerDisplay(t, data.duration), () => {\n    alert(\"Temps \u00e9coul\u00e9 pour la production \u00e9crite. Passage \u00e0 l'\u00e9preuve suivante.\");\n    finalizeSection(\"written\");\n  });\n  renderWrittenBody();\n}\n\nfunction renderWrittenBody() {\n  const data = state.exam.written;\n  app.innerHTML = `\n    ${progressBarHTML()}\n    <div class=\"instructions\">Choisissez un sujet (ou r\u00e9digez les deux, \u00e0 titre d'entra\u00eenement). Limite : 200 mots par texte. Le clavier virtuel ci-dessous ins\u00e8re les caract\u00e8res accentu\u00e9s fran\u00e7ais \u00e0 l'endroit du curseur.<\/div>\n    ${data.prompts.map((prompt, pi) => `\n      <div class=\"card\">\n        <div class=\"prompt-box\">\n          <div class=\"prompt-type\">${prompt.type}<\/div>\n          <div style=\"font-size:15.5px;\">${prompt.text}<\/div>\n        <\/div>\n        <button class=\"vkb-toggle\" onclick=\"toggleKeyboard(${pi})\">\u2328 Clavier fran\u00e7ais virtuel<\/button>\n        <div class=\"vkb\" id=\"vkb-${pi}\">\n          <div class=\"vkb-row\">\n            ${FR_KEYS_ROW1.map(k => `<button class=\"vkb-key\" onclick=\"insertChar(${pi},'${k}')\" type=\"button\">${k}<\/button>`).join(\"\")}\n          <\/div>\n          <div class=\"vkb-row\">\n            ${FR_KEYS_ROW2.map(k => `<button class=\"vkb-key\" onclick=\"insertChar(${pi},'${k}')\" type=\"button\">${k}<\/button>`).join(\"\")}\n            <button class=\"vkb-key wide\" onclick=\"insertChar(${pi}, ' ')\" type=\"button\">espace<\/button>\n          <\/div>\n        <\/div>\n        <textarea class=\"essay\" id=\"essay-${pi}\" placeholder=\"R\u00e9digez votre texte ici...\" oninput=\"onEssayInput(${pi})\" onfocus=\"activeTextareaId=${pi}\">${state.answers.written[pi]}<\/textarea>\n        <div class=\"word-count\" id=\"wc-${pi}\">${countWords(state.answers.written[pi])} \/ 200 mots<\/div>\n      <\/div>\n    `).join(\"\")}\n    <div class=\"footer-nav\">\n      <span><\/span>\n      <button class=\"btn\" onclick=\"finalizeSection('written')\">Valider et continuer \u2192<\/button>\n    <\/div>\n  `;\n}\n\nfunction toggleKeyboard(pi) {\n  document.getElementById(`vkb-${pi}`).classList.toggle(\"show\");\n}\n\nfunction insertChar(pi, char) {\n  const ta = document.getElementById(`essay-${pi}`);\n  const start = ta.selectionStart;\n  const end = ta.selectionEnd;\n  const val = ta.value;\n  ta.value = val.slice(0, start) + char + val.slice(end);\n  ta.selectionStart = ta.selectionEnd = start + char.length;\n  ta.focus();\n  onEssayInput(pi);\n}\n\nfunction onEssayInput(pi) {\n  const ta = document.getElementById(`essay-${pi}`);\n  state.answers.written[pi] = ta.value;\n  const wc = countWords(ta.value);\n  const wcEl = document.getElementById(`wc-${pi}`);\n  wcEl.textContent = `${wc} \/ 200 mots`;\n  wcEl.classList.toggle(\"over\", wc > 200);\n}\n\n\/\/ ============================================================\n\/\/ ORAL PRODUCTION\n\/\/ ============================================================\nfunction renderOralPick() {\n  globalTimer.textContent = \"\u2014\";\n  const data = state.exam.oral;\n  app.innerHTML = `\n    ${progressBarHTML()}\n    <div class=\"card\">\n      <div class=\"card-label\">Production orale<\/div>\n      <h2>Choisissez un sujet<\/h2>\n      <div class=\"sub\">Le sujet est normalement tir\u00e9 au hasard le jour de l'examen. Ici, s\u00e9lectionnez-en un pour vous entra\u00eener dans les m\u00eames conditions de temps.<\/div>\n      <div class=\"oral-topic-list\">\n        ${data.topics.map((topic, ti) => `\n          <div class=\"oral-topic ${state.oralTopicIndex === ti ? \"picked\" : \"\"}\" onclick=\"pickOralTopic(${ti})\">${topic}<\/div>\n        `).join(\"\")}\n      <\/div>\n      <button class=\"btn\" ${state.oralTopicIndex === null ? \"disabled\" : \"\"} onclick=\"startOralPrep()\">Commencer la pr\u00e9paration (5 min) \u2192<\/button>\n    <\/div>\n  `;\n}\n\nfunction pickOralTopic(ti) {\n  state.oralTopicIndex = ti;\n  renderOralPick();\n}\n\nfunction startOralPrep() {\n  state.oralPhase = \"prep\";\n  renderOralStage();\n  startTimer(5 * 60, (t) => {\n    updateGlobalTimerDisplay(t, 5 * 60);\n    updateOralBigTimer(t);\n  }, () => {\n    startOralSpeak();\n  });\n}\n\nfunction startOralSpeak() {\n  state.oralPhase = \"speak\";\n  renderOralStage();\n  startTimer(5 * 60, (t) => {\n    updateGlobalTimerDisplay(t, 5 * 60);\n    updateOralBigTimer(t);\n  }, () => {\n    state.oralPhase = \"done\";\n    renderOralStage();\n  });\n}\n\nfunction updateOralBigTimer(t) {\n  const el = document.getElementById(\"oralBigTimer\");\n  if (el) el.textContent = fmtTime(t);\n}\n\nfunction renderOralStage() {\n  const topic = state.exam.oral.topics[state.oralTopicIndex];\n  if (state.oralPhase === \"prep\") {\n    app.innerHTML = `\n      ${progressBarHTML()}\n      <div class=\"card oral-stage\">\n        <div class=\"oral-phase-label\">Phase de pr\u00e9paration<\/div>\n        <div class=\"big-timer\" id=\"oralBigTimer\">${fmtTime(state.timeLeft)}<\/div>\n        <div class=\"oral-topic-display\">${topic}<\/div>\n        <div class=\"oral-plan-hint\">\n          <strong>Pendant ces 5 minutes :<\/strong><br>\n          Notez 2-3 arguments principaux, un exemple concret, et une nuance ou contre-argument. Ne r\u00e9digez pas de texte complet \u2014 pr\u00e9parez un plan parl\u00e9, pas un texte lu.\n        <\/div>\n      <\/div>\n    `;\n  } else if (state.oralPhase === \"speak\") {\n    app.innerHTML = `\n      ${progressBarHTML()}\n      <div class=\"card oral-stage\">\n        <div class=\"oral-phase-label\">Pr\u00e9sentation \u2014 parlez maintenant<\/div>\n        <div class=\"big-timer\" id=\"oralBigTimer\">${fmtTime(state.timeLeft)}<\/div>\n        <div class=\"oral-topic-display\">${topic}<\/div>\n        <div class=\"oral-plan-hint\">\n          Pr\u00e9sentez votre argumentation \u00e0 voix haute jusqu'\u00e0 la fin du chronom\u00e8tre. Structurez : introduction, 2 arguments, nuance, conclusion.\n        <\/div>\n      <\/div>\n    `;\n  } else if (state.oralPhase === \"done\") {\n    app.innerHTML = `\n      ${progressBarHTML()}\n      <div class=\"card oral-stage\">\n        <div class=\"oral-phase-label\">\u00c9preuve orale termin\u00e9e<\/div>\n        <h2 style=\"margin: 16px 0;\">Bravo, l'entra\u00eenement chronom\u00e9tr\u00e9 est termin\u00e9.<\/h2>\n        <p style=\"color:var(--ink-soft); margin-bottom: 24px;\">Cette \u00e9preuve est \u00e9valu\u00e9e par un examinateur humain le jour de l'examen ; il n'y a pas de note automatique ici.<\/p>\n        <button class=\"btn\" onclick=\"finalizeSection('oral')\">Voir les r\u00e9sultats \u2192<\/button>\n      <\/div>\n    `;\n  }\n}\n\n\/\/ ============================================================\n\/\/ RESULTS\n\/\/ ============================================================\nfunction renderResults() {\n  clearTimer();\n  stopSpeak();\n  topbarSection.textContent = `${state.exam.title} \u00b7 R\u00e9sultats`;\n  globalTimer.textContent = \"\u2014\";\n\n  const minScores = { listening: 9, reading: 0, grammar: 9, written: 0, oral: 0 };\n  const maxScores = { listening: 15, reading: 10, grammar: 15, written: 30, oral: 30 };\n\n  const autoTotal = (state.scores.listening || 0) + (state.scores.reading || 0) + (state.scores.grammar || 0);\n  const autoMax = 15 + 10 + 15;\n\n  const rows = SECTION_KEYS.map((key, i) => {\n    const score = state.scores[key];\n    const isNumeric = typeof score === \"number\";\n    const min = minScores[key];\n    let rowClass = \"\";\n    if (isNumeric && min > 0) rowClass = score >= min ? \"pass-min\" : \"fail-min\";\n    return `\n      <div class=\"breakdown-row ${rowClass}\">\n        <div class=\"breakdown-name\">${SECTION_NAMES[i]}<\/div>\n        <div class=\"breakdown-score\">\n          ${isNumeric ? `${score} \/ ${maxScores[key]}` : `<em style=\"font-size:13px; color:var(--ink-soft);\">${score || \"\u2014\"}<\/em>`}\n          ${min > 0 && isNumeric ? `<span class=\"breakdown-minscore\">(seuil min. ${min})<\/span>` : \"\"}\n        <\/div>\n      <\/div>\n    `;\n  }).join(\"\");\n\n  const passedAuto = autoTotal >= 36 && (state.scores.listening || 0) >= 9 && (state.scores.grammar || 0) >= 9;\n\n  app.innerHTML = `\n    <div class=\"card\">\n      <div class=\"score-hero\">\n        <div class=\"score-label\">Score automatique (3 \u00e9preuves objectives)<\/div>\n        <div class=\"score-big ${passedAuto ? \"score-pass\" : \"score-fail\"}\">${autoTotal} \/ ${autoMax}<\/div>\n        <div class=\"score-label\" style=\"margin-top:8px;\">${passedAuto ? \"Seuils minimaux atteints sur les \u00e9preuves not\u00e9es automatiquement\" : \"Attention : un seuil minimal n'est pas atteint\"}<\/div>\n      <\/div>\n      <div class=\"breakdown\">${rows}<\/div>\n      <p style=\"font-size:13px; color:var(--ink-soft); margin-top:18px;\">Le score total officiel est sur 100 et inclut la production \u00e9crite et orale, \u00e9valu\u00e9es par un examinateur humain. Seules les \u00e9preuves de compr\u00e9hension orale, compr\u00e9hension \u00e9crite et grammaire sont not\u00e9es automatiquement ici.<\/p>\n      <div class=\"footer-nav\">\n        <button class=\"btn secondary\" onclick=\"renderLanding()\">\u2190 Retour \u00e0 l'accueil<\/button>\n        <button class=\"btn\" onclick=\"startExam(${state.examId})\">Refaire cette simulation<\/button>\n      <\/div>\n    <\/div>\n  `;\n}\n\n\/\/ ============================================================\n\/\/ INIT\n\/\/ ============================================================\nrenderLanding();\n\n<\/script>\n<\/body>\n<\/html><iframe src=\"https:\/\/6a358d9b53539c869ca103e9--soft-malasada-d7bdbd.netlify.app\/\" \n        style=\"width:100%; height:900px; border:none; border-radius:8px;\" \n        title=\"Simulare examen B2\">\n<\/iframe>","protected":false},"excerpt":{"rendered":"<p>Exersa\u021bi \u2013 GeoIsTeaching GeoIsTeaching \u00b7 Francez\u0103 interactiv\u0103 Exersa\u021bi francezala nivelul vostru Lec\u021bii interactive cu audio, exerci\u021bii, traduceri \u0219i jocuri de rol &#8211; de la primii [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"om_disable_all_campaigns":false,"pmpro_default_level":"","_monsterinsights_skip_tracking":false,"_uf_show_specific_survey":0,"_uf_disable_surveys":false,"footnotes":""},"class_list":["post-1648","page","type-page","status-publish","hentry","pmpro-has-access"],"aioseo_notices":[],"jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/geoisteaching.com\/index.php?rest_route=\/wp\/v2\/pages\/1648","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/geoisteaching.com\/index.php?rest_route=\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/geoisteaching.com\/index.php?rest_route=\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/geoisteaching.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/geoisteaching.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=1648"}],"version-history":[{"count":27,"href":"https:\/\/geoisteaching.com\/index.php?rest_route=\/wp\/v2\/pages\/1648\/revisions"}],"predecessor-version":[{"id":1874,"href":"https:\/\/geoisteaching.com\/index.php?rest_route=\/wp\/v2\/pages\/1648\/revisions\/1874"}],"wp:attachment":[{"href":"https:\/\/geoisteaching.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=1648"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}