<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Archives des live - Pilote de Sable</title>
	<atom:link href="https://pilotedesable.com/tag/live/feed/" rel="self" type="application/rss+xml" />
	<link>https://pilotedesable.com/tag/live/</link>
	<description>Le meilleur du motocross sur sable</description>
	<lastBuildDate>Sat, 14 Feb 2026 05:29:51 +0000</lastBuildDate>
	<language>fr-FR</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=6.9.1</generator>

<image>
	<url>https://pilotedesable.com/wp-content/uploads/2018/02/cropped-Logo-Pilote-de-Sable-full-32x32.png</url>
	<title>Archives des live - Pilote de Sable</title>
	<link>https://pilotedesable.com/tag/live/</link>
	<width>32</width>
	<height>32</height>
</image> 
<site xmlns="com-wordpress:feed-additions:1">186855316</site>	<item>
		<title>CFS LIVE : classement en direct Loon-Plage 2023</title>
		<link>https://pilotedesable.com/cfs-live-classement-en-direct-loon-plage-2023/</link>
					<comments>https://pilotedesable.com/cfs-live-classement-en-direct-loon-plage-2023/#respond</comments>
		
		<dc:creator><![CDATA[Pilote de Sable]]></dc:creator>
		<pubDate>Sat, 28 Oct 2023 13:34:33 +0000</pubDate>
				<category><![CDATA[Courses]]></category>
		<category><![CDATA[live]]></category>
		<category><![CDATA[loon-plage]]></category>
		<category><![CDATA[Ronde des Sables]]></category>
		<guid isPermaLink="false">https://pilotedesable.com/?p=6291</guid>

					<description><![CDATA[<p>Retrouvez le classement des courses de la Ronde des Sables de Loon-Plage 2023 en direct, pour toutes les catégories, tout au long du week-end. Vous<a class="moretag" href="https://pilotedesable.com/cfs-live-classement-en-direct-loon-plage-2023/"> [...]</a></p>
<p>L’article <a href="https://pilotedesable.com/cfs-live-classement-en-direct-loon-plage-2023/">CFS LIVE : classement en direct Loon-Plage 2023</a> est apparu en premier sur <a href="https://pilotedesable.com">Pilote de Sable</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<h2 class="wp-block-heading">Retrouvez le classement des courses de la Ronde des Sables de Loon-Plage 2023 en direct, pour toutes les catégories, tout au long du week-end.</h2>



<p>Vous retrouverez pour chaque pilote, dans l’ordre : son classement instantané, son numéro, son nom, son club, le nombre de tours effectués, l’écart qui le sépare du premier pilote, l’écart qui le sépare du pilote précédent, son temps au tour et son meilleur temps au tour, sa catégorie.</p>



<p class="has-vivid-red-color has-text-color"><em><span style="text-decoration: underline;">ATTENTION</span> : Ce classement est gérée par la FFM et le CFS. Celui-ci est mis à jour seulement quelques minutes avant le début de chaque course. Si le live ci-dessous ne fonctionne pas, vous pouvez suivre le live via ce lien <a href="https://www.ffmoto.org/lives">https://www.ffmoto.org/lives</a>. Pilote de Sable n&rsquo;est pas reponsable du fonctionnement du live. Consultez le <a href="https://pilotedesable.com/cfs-loon-plage-le-programme-de-la-ronde-des-sables-2023/">programme du week-end.</a></em></p>



<iframe style="height: 6000px; width: 100%;" src="https://www.courses-sur-sable.fr/live/" frameborder="0" scrolling="yes"></iframe>
<p>L’article <a href="https://pilotedesable.com/cfs-live-classement-en-direct-loon-plage-2023/">CFS LIVE : classement en direct Loon-Plage 2023</a> est apparu en premier sur <a href="https://pilotedesable.com">Pilote de Sable</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://pilotedesable.com/cfs-live-classement-en-direct-loon-plage-2023/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">6291</post-id>	</item>
		<item>
		<title>Live Enduropale : le classement en direct</title>
		<link>https://pilotedesable.com/live-enduropale-2020-classement-direct/</link>
					<comments>https://pilotedesable.com/live-enduropale-2020-classement-direct/#respond</comments>
		
		<dc:creator><![CDATA[Pilote de Sable]]></dc:creator>
		<pubDate>Fri, 31 Jan 2020 09:00:25 +0000</pubDate>
				<category><![CDATA[Courses]]></category>
		<category><![CDATA[News]]></category>
		<category><![CDATA[enduropale 2020]]></category>
		<category><![CDATA[live]]></category>
		<guid isPermaLink="false">https://pilotedesable.com/?p=1312</guid>

					<description><![CDATA[<p>Suivez en direct l&#8217;Enduropale 2020 et le classement des pilotes en temps réel. Vous retrouverez pour chaque pilote, dans l&#8217;ordre : son classement instantané, son<a class="moretag" href="https://pilotedesable.com/live-enduropale-2020-classement-direct/"> [...]</a></p>
<p>L’article <a href="https://pilotedesable.com/live-enduropale-2020-classement-direct/">Live Enduropale : le classement en direct</a> est apparu en premier sur <a href="https://pilotedesable.com">Pilote de Sable</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<h2 class="wp-block-heading">Suivez en direct l&rsquo;Enduropale 2020 et le classement des pilotes en temps réel.</h2>



<p>Vous retrouverez pour chaque pilote, dans l&rsquo;ordre : son classement instantané, son numéro, son nom, son club, sa marque de moto, le nombre de tours effectués, l&rsquo;écart qui le sépare du premier pilote, l&rsquo;écart qui le sépare du pilote précédent, son temps au tour et son meilleur temps au tour.</p>



<style>
/* --- Pilote de Sable Live : style isolé --- */
#pds-live{
  font-family: system-ui, -apple-system, "Segoe UI", Roboto, Arial, sans-serif !important;
  color:#111 !important;
}

/* Reset doux sur le composant uniquement */
#pds-live, #pds-live *{ box-sizing:border-box; }

#pds-live h1,#pds-live h2,#pds-live h3,#pds-live p{ margin:0; }

#pds-live input, #pds-live button{
  font-family: inherit !important;
  font-size: 16px;
}

/* Boutons (par défaut) */
#pds-live button{
  background:#111 !important;
  color:#fff !important;
  border:0 !important;
  border-radius:12px !important;
  padding:12px 14px !important;
  cursor:pointer !important;
  font-weight:700 !important;
}
#pds-live button:active{ transform: translateY(1px); }
#pds-live button:disabled{ opacity:.6; cursor:not-allowed; }

/* Input */
#pds-live input{
  border:1px solid #ddd !important;
  border-radius:12px !important;
  padding:12px 14px !important;
  width:100%;
  outline:none;
}
#pds-live input:focus{ border-color:#bbb !important; }

/* Card / container */
#pds-live .pds-card{
  border:1px solid #eee;
  border-radius:16px;
  padding:12px;
  background:#fff;
}
#pds-live .pds-muted{ opacity:.75; font-size:13px; }
#pds-live .pds-title{ font-weight:800; font-size:18px; }

/* &#x2705; Toast feedback (sous la barre de recherche) */
#pds-live .pds-toast{
  display:none;
  margin-top:10px;
  border-radius:12px;
  padding:10px 12px;
  font-size:13px;
  font-weight:800;
  border:1px solid #eee;
}
#pds-live .pds-toast.pds-on{ display:block; }
#pds-live .pds-toast.pds-ok{ color:#0a7a2f; border-color:#bfe7c9; background:#f2fbf5; }
#pds-live .pds-toast.pds-bad{ color:#b00020; border-color:#f0b7bf; background:#fff5f6; }

/* Table responsive */
#pds-live .pds-tablewrap{
  margin-top:10px;
  overflow:auto;
  border:1px solid #eee;
  border-radius:16px;
  background:#fff;
}
#pds-live table{
  width:100%;
  border-collapse:separate !important;
  border-spacing:0 !important;
  min-width:650px;
}
#pds-live thead th{
  position:sticky;
  top:0;
  background:#fafafa;
  text-align:left;
  font-size:13px;
  letter-spacing:.02em;
  text-transform:none;
  padding:12px 10px !important;
  border-bottom:1px solid #eee !important;
}
#pds-live tbody td{
  padding:12px 10px !important;
  border-bottom:1px solid #f2f2f2 !important;
  font-size:14px;
}
#pds-live tbody tr:hover td{ background:#fcfcfc; }

/* Delta positions */
#pds-live .pds-delta{
  display:inline-block;
  margin-left:8px;
  padding:2px 8px;
  border-radius:999px;
  font-size:12px;
  line-height:1.6;
  border:1px solid #eee;
  vertical-align:middle;
}
#pds-live .pds-up{ color:#0a7a2f; border-color:#bfe7c9; background:#f2fbf5; }
#pds-live .pds-down{ color:#b00020; border-color:#f0b7bf; background:#fff5f6; }

/* Favori étoile : rendu propre, cliquable */
#pds-live .pds-favbtn{
  background:transparent !important;
  color:#111 !important;
  border:1px solid #eee !important;
  border-radius:12px !important;
  padding:8px 10px !important;
  font-size:18px !important;
  line-height:1 !important;
  width:44px;
  height:40px;
  display:inline-flex;
  align-items:center;
  justify-content:center;
}
#pds-live .pds-favbtn[data-on="1"]{
  background:#111 !important;
  color:#fff !important;
  border-color:#111 !important;
}

/* &#x2705; Bouton "Fermer" dans recherche */
#pds-live .pds-linkbtn{
  background:transparent !important;
  color:#111 !important;
  border:1px solid #eee !important;
  border-radius:12px !important;
  padding:10px 12px !important;
  font-weight:800 !important;
}

/* Checkbox align */
#pds-live label{ user-select:none; }
#pds-live input[type="checkbox"]{ width:18px; height:18px; }
</style>

<div id="pds-live" style="max-width:900px;margin:0 auto;padding:12px">
  <div style="display:flex;gap:10px;flex-wrap:wrap;align-items:center;justify-content:space-between">
    <div>
      <div id="metaTitle" style="font-weight:800;font-size:18px"></div>
      <div style="opacity:.85;font-size:13px;line-height:1.4">
        Temps restant: <span id="metaTimeLeft">&#8211;:&#8211;:&#8211;</span>
        • Prochain refresh: <span id="metaCountdown">&#8212;</span>s
      </div>
    </div>
    <!-- &#x2705; metaStatus supprimé -->
  </div>

  <div style="margin-top:12px;display:grid;grid-template-columns:1fr auto;gap:10px;align-items:center">
    <input id="q" inputmode="search" placeholder="Nom ou numéro (ex: 32 / Potisek)" />
    <button id="btnSearch">OK</button>
  </div>

  <!-- &#x2705; Confirmation sous la barre de recherche -->
  <div id="toast" class="pds-toast" role="status" aria-live="polite"></div>

  <div id="searchResult" class="pds-card" style="margin-top:10px; display:none"></div>

  <div style="margin-top:14px;display:flex;gap:10px;align-items:center;justify-content:space-between">
    <!-- &#x2705; SEUL CE TITRE CHANGE (Top 100 -> TOP 100 / Mes favoris (X)) -->
    <div id="tableTitle" style="font-weight:800">TOP 100</div>

    <label style="display:flex;gap:8px;align-items:center;font-size:13px;opacity:.9">
      <input type="checkbox" id="onlyFav" />
      Favoris uniquement
    </label>
  </div>

  <div class="pds-tablewrap">
    <table>
      <thead>
        <tr>
          <th>Pos</th>
          <th>#</th>
          <th>Pilote</th>
          <th>Marque</th>
          <th>Tours</th>
          <th style="text-align:right">Éc. 1er</th>
          <th>Tps tour</th>
          <th style="text-align:center">★</th>
        </tr>
      </thead>
      <tbody id="rows"></tbody>
    </table>
  </div>

  <div style="margin-top:10px;font-size:12px;opacity:.75;line-height:1.4">
    Astuce: ajoute des favoris (★) pour suivre tes pilotes. Sur mobile, la table scroll horizontalement.
  </div>
</div>

<script>
  const API_BASE = "https://livetimingscraper--pilotedesable.replit.app";

  const els = {
    title: document.getElementById("metaTitle"),
    tableTitle: document.getElementById("tableTitle"),
    timeLeft: document.getElementById("metaTimeLeft"),
    countdown: document.getElementById("metaCountdown"),
    rows: document.getElementById("rows"),
    q: document.getElementById("q"),
    btn: document.getElementById("btnSearch"),
    searchResult: document.getElementById("searchResult"),
    onlyFav: document.getElementById("onlyFav"),
    toast: document.getElementById("toast"),
  };

  const FAV_KEY = "pds_live_favs";
  const getFavs = () => new Set(JSON.parse(localStorage.getItem(FAV_KEY) || "[]"));
  const setFavs = (set) => localStorage.setItem(FAV_KEY, JSON.stringify([...set]));

  let latestRows = [];

  // ---- Deltas positions (persistés)
  let prevPosByNumber = JSON.parse(localStorage.getItem("pds_prev_pos") || "{}");

  function deltaBadge(number, newPos) {
    if (!number || !Number.isFinite(newPos)) return "";
    const oldPos = Number(prevPosByNumber[number]);
    if (!Number.isFinite(oldPos)) return "";
    const delta = oldPos - newPos;
    if (delta === 0) return "";
    if (delta > 0) return `<span class="pds-delta pds-up" title="+${delta} places">↑${delta}</span>`;
    return `<span class="pds-delta pds-down" title="${delta} places">↓${Math.abs(delta)}</span>`;
  }

  function savePrevPositions(rows) {
    const next = { ...prevPosByNumber };
    for (const r of (rows || [])) {
      const pos = Number(r?.position);
      if (r?.number && Number.isFinite(pos)) next[r.number] = pos;
    }
    prevPosByNumber = next;
    localStorage.setItem("pds_prev_pos", JSON.stringify(prevPosByNumber));
  }

  // ---- Timers refresh + countdown
  let refreshEveryMs = 30000;
  let nextRefreshAt = Date.now() + refreshEveryMs;
  let tickTimer = null;
  let refreshTimer = null;

  function esc(s) {
    return (s ?? "").toString().replace(/[&<>"']/g, c => ({
      "&":"&amp;","<":"&lt;",">":"&gt;",'"':"&quot;","'":"&#39;"
    }[c]));
  }

  function formatGap(gap) {
    if (!gap || gap === "-" || gap === "0") return "–";
    const clean = gap.toString().trim();
    if (clean.startsWith("+") || clean.startsWith("-")) return clean;
    return "+" + clean;
  }

  // ---- Toast feedback (sous la recherche)
  let toastTimer = null;
  function showToast(message, kind /* "ok" | "bad" */) {
    if (toastTimer) clearTimeout(toastTimer);
    els.toast.textContent = message;
    els.toast.classList.remove("pds-ok", "pds-bad");
    els.toast.classList.add("pds-on", kind === "bad" ? "pds-bad" : "pds-ok");
    toastTimer = setTimeout(() => {
      els.toast.classList.remove("pds-on", "pds-ok", "pds-bad");
      els.toast.textContent = "";
    }, 3500);
  }

  function closeSearch(clearInput = true) {
    els.searchResult.style.display = "none";
    els.searchResult.innerHTML = "";
    if (clearInput) els.q.value = "";
  }

  // &#x2705; mise à jour du titre du tableau UNIQUEMENT
  function updateTableTitle() {
    const favCount = getFavs().size;
    els.tableTitle.textContent = els.onlyFav.checked ? `MES FAVORIS (${favCount})` : "TOP 100";
  }

  function displayNameFromNumber(num) {
    const r = (latestRows || []).find(x => String(x.number) === String(num));
    if (!r) return `#${num}`;
    return `${r.name} #${r.number}`;
  }

  function toggleFav(number, nameForToast /* optional */) {
    const favs = getFavs();
    const wasFav = favs.has(number);
    if (wasFav) favs.delete(number); else favs.add(number);
    setFavs(favs);

    const label = nameForToast ? `${nameForToast} #${number}` : displayNameFromNumber(number);
    showToast(`${label} ${wasFav ? "supprimé des favoris" : "ajouté aux favoris"}`, wasFav ? "bad" : "ok");

    updateTableTitle();
    return !wasFav;
  }

  function renderTable(rows, alreadyFiltered = false) {
    const favs = getFavs();
    const onlyFav = els.onlyFav.checked;

    const filtered = (onlyFav && !alreadyFiltered)
      ? rows.filter(r => favs.has(r.number))
      : rows;

    els.rows.innerHTML = filtered.map(r => {
      const isFav = favs.has(r.number);
      return `
        <tr>
          <td>${esc(r.position)} ${deltaBadge(r.number, Number(r.position))}</td>
          <td>${esc(r.number)}</td>
          <td>${esc(r.name)}</td>
          <td>${esc(r.bike)}</td>
          <td>${esc(r.laps)}</td>
          <td style="text-align:right">${formatGap(r.gap)}</td>
          <td>${esc(r.lap_time)}</td>
          <td style="text-align:center">
            <button class="pds-favbtn"
              data-fav="${esc(r.number)}"
              data-name="${esc(r.name)}"
              data-on="${isFav ? "1" : "0"}"
              aria-label="Favori">
              ${isFav ? "★" : "☆"}
            </button>
          </td>
        </tr>
      `;
    }).join("");

    els.rows.querySelectorAll("button[data-fav]").forEach(btn => {
      btn.addEventListener("click", async () => {
        const n = btn.getAttribute("data-fav");
        const name = btn.getAttribute("data-name") || "";
        const nowFav = toggleFav(n, name);

        btn.setAttribute("data-on", nowFav ? "1" : "0");
        btn.textContent = nowFav ? "★" : "☆";

        if (els.onlyFav.checked) await refreshOnce();
        else renderTable(rows, false);
      });
    });
  }

  async function fetchLive() {
    const resp = await fetch(`${API_BASE}/live?limit=100`, { cache: "no-store" });
    const data = await resp.json();
    if (!resp.ok || !data.ok) throw new Error(data.error || "Live error");
    return data;
  }

  async function fetchFavs(numbers) {
    if (!numbers.length) {
      return { ok:true, meta:{ time_left: els.timeLeft.textContent, refresh_ms: refreshEveryMs }, rows: [] };
    }
    const resp = await fetch(`${API_BASE}/favs?numbers=${encodeURIComponent(numbers.join(","))}`, { cache: "no-store" });
    const data = await resp.json();
    if (!resp.ok || !data.ok) throw new Error(data.error || "Favs error");
    return data;
  }

  async function fetchSearch(query) {
    const resp = await fetch(`${API_BASE}/search?limit=20&query=${encodeURIComponent(query)}`, { cache: "no-store" });
    const data = await resp.json();
    if (!resp.ok || !data.ok) throw new Error(data.error || "Search error");
    return data;
  }

  async function refreshOnce() {
    updateTableTitle();

    const favs = [...getFavs()];
    const onlyFav = els.onlyFav.checked;

    const data = onlyFav ? await fetchFavs(favs) : await fetchLive();

    els.title.textContent = data.meta?.title || "Course";
    els.timeLeft.textContent = data.meta?.time_left || "--:--:--";

    refreshEveryMs = data.meta?.refresh_ms || 30000;
    nextRefreshAt = Date.now() + refreshEveryMs;

    latestRows = data.rows || [];
    renderTable(latestRows, onlyFav);
    savePrevPositions(latestRows);
  }

  function startTimers() {
    if (tickTimer) clearInterval(tickTimer);
    if (refreshTimer) clearTimeout(refreshTimer);

    tickTimer = setInterval(() => {
      if (document.hidden) return;
      const leftMs = Math.max(0, nextRefreshAt - Date.now());
      els.countdown.textContent = Math.ceil(leftMs / 1000);
    }, 1000);

    const scheduleNext = () => {
      const leftMs = Math.max(0, nextRefreshAt - Date.now());
      refreshTimer = setTimeout(async () => {
        if (!document.hidden) await refreshOnce();
        nextRefreshAt = Date.now() + refreshEveryMs;
        scheduleNext();
      }, leftMs);
    };
    scheduleNext();
  }

  function renderSearchList(rows, q) {
    els.searchResult.style.display = "block";
    els.searchResult.innerHTML =
      `<div style="display:flex;justify-content:space-between;gap:10px;align-items:center">
         <div style="font-weight:800;font-size:16px">
           ${rows.length} résultat${rows.length>1?"s":""} pour “${esc(q)}”
         </div>
         <button id="closeSearchBtn" class="pds-linkbtn" type="button">Fermer</button>
       </div>
       <div style="margin-top:10px;display:flex;flex-direction:column;gap:8px">
         ${rows.map(r => {
           const isFav = getFavs().has(r.number);
           return `
             <div style="display:flex;justify-content:space-between;gap:10px;align-items:center;border:1px solid #eee;border-radius:12px;padding:10px">
               <div style="min-width:0">
                 <div style="font-weight:800;white-space:nowrap;overflow:hidden;text-overflow:ellipsis">
                   ${esc(r.name)} (#${esc(r.number)})
                 </div>
                 <div style="font-size:13px;opacity:.8">
                   Pos ${esc(r.position)} • Tours ${esc(r.laps)} • ${esc(r.bike)}
                 </div>
               </div>
               <button class="pds-favbtn"
                 data-name="${esc(r.name)}"
                 data-fav="${esc(r.number)}"
                 data-on="${isFav ? "1" : "0"}"
                 aria-label="Favori">
                 ${isFav ? "★" : "☆"}
               </button>
             </div>
           `;
         }).join("")}
       </div>`;

    document.getElementById("closeSearchBtn").addEventListener("click", () => closeSearch(true));

    els.searchResult.querySelectorAll("button[data-fav]").forEach(btn => {
      btn.addEventListener("click", async () => {
        const n = btn.getAttribute("data-fav");
        const name = btn.getAttribute("data-name") || "";
        toggleFav(n, name);
        closeSearch(true);

        if (els.onlyFav.checked) await refreshOnce();
        else renderTable(latestRows, false);
      });
    });
  }

  els.btn.addEventListener("click", async () => {
    const q = els.q.value.trim();
    if (!q) return;

    els.searchResult.style.display = "block";
    els.searchResult.textContent = "Recherche…";

    try {
      const res = await fetchSearch(q);
      const rows = res.rows || [];
      if (!rows.length) {
        els.searchResult.textContent = "Aucun pilote trouvé.";
        return;
      }
      renderSearchList(rows, q);
    } catch (e) {
      els.searchResult.textContent = "Erreur de recherche / réseau.";
      console.error(e);
    }
  });

  els.onlyFav.addEventListener("change", () => {
    updateTableTitle();
    refreshOnce();
  });

  // Démarrage
  refreshOnce().then(() => {
    updateTableTitle();
    startTimers();
  });
</script>



<p>Vous pouvez aussi découvrir le <a href="https://pilotedesable.com/programme-enduropale-du-touquet-2020/">programme de l&rsquo;Enduropale 2020</a>, consulter les résultats complets du week-end ou revoir le <a href="https://pilotedesable.com/replay-enduropale-touquet-2019/">replay vidéo de l&rsquo;Enduropale du Touquet 2019</a>.</p>



<p><span style="text-decoration: underline;">RAPPEL DES HORAIRES</span></p>



<p><strong>Vendredi 31 janvier 2020<br></strong>9h30-11h30 : Red Bull Sand Session<br>14h-15h : Enduro Vintage (motos avant 1996)<br>16h-16h30 : Press day</p>



<p><strong>Samedi 1er février 2020<br></strong>8h30-9h30 : Enduropale Espoirs (11-15 ans)<br>10h30-12h : Enduropale Juniors (13-17 ans)<br>13h30-16h : Quaduro (dès 15 ans)</p>



<p><strong>Dimanche 2 février 2020<br></strong>12h45-15h45 : Enduropale Motos (dès 18 ans)</p>



<p><span style="color: #ff0000;">ATTENTION : ce classement est mis à jour seulement quelques minutes avant le début de chaque course.</span></p>
<p>L’article <a href="https://pilotedesable.com/live-enduropale-2020-classement-direct/">Live Enduropale : le classement en direct</a> est apparu en premier sur <a href="https://pilotedesable.com">Pilote de Sable</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://pilotedesable.com/live-enduropale-2020-classement-direct/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">1312</post-id>	</item>
	</channel>
</rss>
