version à 86%

This commit is contained in:
oussi
2026-04-24 10:39:05 +02:00
commit feb7277fe9
16 changed files with 17780 additions and 0 deletions

BIN
.DS_Store vendored Normal file

Binary file not shown.

10
.gitignore vendored Normal file
View File

@@ -0,0 +1,10 @@
__pycache__/
*.pyc
.venv/
venv/
data/config.json
data/alerts.json
*.log
scanOgc/
CLAUDE.md
.claude/

124
PLAN_EXTRACTION.md Normal file
View File

@@ -0,0 +1,124 @@
# Plan extraction OGC → Excel
## Contexte
Extraction des fiches OGC (Organismes de Gestion du Contrôle) scanées.
Chaque PDF = 1 dossier patient, ~6 pages.
## Modèles utilisés
- **Vision** : `qwen3-vl:2b` via Ollama (identifie le type de page + extrait les champs)
- **Texte** : `qwen3:4b` (optionnel, structuration secondaire si besoin)
## Architecture
```
PDF → pdf2image (images par page)
Pour chaque page :
→ qwen3-vl:2b : identifier le type de page
→ Si "Séjour d'hospitalisation complète" : SKIP
→ Sinon : extraction structurée JSON via qwen3-vl:2b
Assemblage des champs par dossier
Sortie Excel (openpyxl / pandas)
```
## Types de pages
| Titre détecté | Action |
|---|---|
| FICHE MEDICALE DE RECUEIL DU PRATICIEN CONSEIL | Extraire (page principale) |
| FICHE MEDICALE DE CONCERTATION | Skip (vide ou manuscrit léger) |
| Séjour d'hospitalisation complète | **SKIP** (gros manuscrit) |
| Eléments de preuve tracés au dossier | Extraire |
| FICHE ADMINISTRATIVE DE CONCERTATION 2/2 | Extraire |
| FICHE ADMINISTRATIVE DE CONCERTATION 1/2 | Extraire |
## Champs à extraire
### En-tête (commun)
- N° OGC, Etablissement, FINESS, Date début contrôle
- N° Champ, Libellé champ de contrôle
- Dossier manquant, Date début séjour, Date fin séjour
### Page 1 — Données du séjour (Etablissement + Recodage)
- Age (ans), Age (jours), Sexe
- Poids d'entrée, Durée de séjour
- Mode d'entrée, Provenance, Mode de sortie, Destination
- Nb séances, Nb RUM, Nb j EXH, Type EXB, Nb j EXB
### Page 1 — Données du RUM (Etablissement + Recodage)
- N° RUM, Lits dédiés SP, UM, IGS II
- Durée RUM (date_debut / date_fin)
- Nature suppl., Nb suppl.
### Page 1 — Codages (listes)
- DP_etab_code, DP_etab_libelle
- DR_etab_code, DR_etab_libelle
- DAS_etab : liste de {code, rang, libelle}
- Actes_etab : liste de {code, rang, libelle}
- DP_recodage, DR_recodage
- DAS_recodage : liste de {code, rang}
- Actes_recodage : liste de {code, rang}
### Page 1 — GHM/GHS + décision
- GHM_etab, GHS_etab, GHM_recodage, GHS_recodage
- Recodage_impactant_facturation (0/1)
- GHS_injustifie (0/1)
- SE_coche (1/2/3/4), ATU, FFM, FSD
- Accord_Desaccord (accord/désaccord)
- Nom_praticien_conseil
### Page Eléments de preuve (tableau 17 lignes)
Pour chaque type de document :
- present (oui/non), photocopie (nombre), absent_date_1ere_demande, date_obtention
- Date_elements_preuve
- Medecin_controleur_signataire, Medecin_DIM_signataire
### Page Fiche Administrative 2/2
- GHS_initial, GHS_avant_concertation, GHS_final_apres_concertation
- Decision_finale (maintien_avis_controleur / retour_groupage_DIM / autre_groupage)
- Avis_DIM_final (accord/désaccord)
- Date_concertation
- Nom_medecin_responsable_controle, Nom_medecin_DIM
### Page Fiche Administrative 1/2
- Date_concertation_1_2
- Argumentaire_medecin_controleur (texte long imprimé)
## Structure Excel de sortie
### Onglet 1 : "Données principales"
1 ligne par OGC, colonnes = tous les champs scalaires
### Onglet 2 : "Diagnostics"
1 ligne par code diagnostique (DP/DR/DAS), avec colonne N°OGC
### Onglet 3 : "Actes"
1 ligne par acte, avec colonne N°OGC
### Onglet 4 : "Eléments de preuve"
1 ligne par type de document × N°OGC
## Fichiers
- `extraction.py` : script principal
- `scanOgc/` : dossier des PDFs source
- `output/` : dossier de sortie Excel
## Pour relancer
```bash
cd "/Users/oussi/Documents/Documents - MacBook Pro de oussi/EttaSante/T2A/ScanOGC/testExtraction2"
python3 extraction.py
```
## Dépendances
```bash
pip install pdf2image pillow pandas openpyxl requests
# Ollama doit tourner : ollama serve
# Modèle requis : qwen3-vl:2b
```
## Notes importantes
- L'ordre des pages varie selon les fichiers → identification par titre, pas par numéro
- Page manuscrite identifiée par le titre "Séjour d'hospitalisation complète"
- qwen3-vl:2b : paramètre `think` désactivé pour JSON pur (plus rapide)
- Timeout Ollama : 120s par page (pages denses)

82
README.md Normal file
View File

@@ -0,0 +1,82 @@
# Extraction OGC — Qwen3-VL 235B
Extraction automatique des fiches OGC (Organisme de Gestion du Contrôle) vers Excel.
Modèle : **qwen3-vl:235b-cloud** (vision multimodal via Ollama).
---
## Structure du dossier
```
testExtraction2/
├── extraction.py ← script principal
├── README.md ← ce fichier
├── PLAN_EXTRACTION.md ← documentation technique détaillée
├── scanOgc/ ← 12 PDFs source (OGC 358 à 429)
└── output/
├── extraction_ogc.xlsx ← résultat (4 onglets)
└── extraction_ogc_raw.json ← données brutes pour debug
```
---
## Lancement
```bash
cd testExtraction2
# Tous les fichiers
python3 extraction.py
# Un seul fichier (relance partielle — fusionne avec le cache)
python3 extraction.py "358"
```
---
## Ce que fait le script
1. Convertit chaque page PDF en image (200 DPI)
2. Envoie l'image à **qwen3-vl:235b-cloud** pour identifier le type de page
3. Ignore la page "Séjour d'hospitalisation complète" (bloc manuscrit — phase 2)
4. Pour chaque autre page, extrait les données en JSON via un prompt dédié
5. Assemble tout en Excel (4 onglets)
### Types de pages traités
| Type | Action |
|---|---|
| FICHE_RECUEIL | Extrait (données séjour, codages, GHM/GHS) |
| ELEMENTS_PREUVE | Extrait (tableau 17 documents) |
| FICHE_ADMIN_2_2 | Extrait (GHS final, décision concertation) |
| FICHE_ADMIN_1_2 | Extrait (argumentaire imprimé complet) |
| SEJOUR_MANUSCRIT | **Ignoré** — commentaires manuscrits (phase 2) |
| FICHE_CONCERTATION_VIDE | Ignoré — page vide |
---
## Sortie Excel (4 onglets)
**Données principales** — 1 ligne par OGC, tous les champs scalaires
**Diagnostics** — 1 ligne par code (DP/DR/DAS), établissement + recodage
**Actes** — 1 ligne par acte CCAM, établissement + recodage
**Eléments de preuve** — 1 ligne par type de document × OGC
---
## Particularités techniques
- **Thinking mode** : qwen3-vl génère ~4000 tokens de réflexion interne avant la réponse. `num_predict=8192` est obligatoire pour avoir assez de budget tokens.
- **Rate limit** : pause de 2s entre chaque requête + retry automatique sur 429 (attente 60s × tentative).
- **Ordre des pages variable** : identification par titre, pas par numéro de page.
- **Relance partielle** : `python3 extraction.py "XXX"` charge le cache JSON existant et ne réécrase que le fichier relancé.
---
## Prérequis
```bash
pip install pdf2image pillow pandas openpyxl requests
# Ollama doit tourner (ollama serve)
# Modèle requis : qwen3-vl:235b-cloud
```

1129
extraction.py Normal file

File diff suppressed because it is too large Load Diff

683
generate_report.py Normal file
View File

@@ -0,0 +1,683 @@
"""
Génération du bilan d'extraction OGC — QWEN
Usage : python3 generate_report.py
"""
import json
import re
import sys
from datetime import datetime
from pathlib import Path
from reportlab.lib import colors
from reportlab.lib.enums import TA_CENTER, TA_LEFT, TA_RIGHT
from reportlab.lib.pagesizes import A4
from reportlab.lib.styles import ParagraphStyle, getSampleStyleSheet
from reportlab.lib.units import cm
from reportlab.platypus import (
HRFlowable, PageBreak, Paragraph, SimpleDocTemplate, Spacer, Table,
TableStyle,
)
# ─── Config ───────────────────────────────────────────────────────────────────
BASE = Path(__file__).parent
OUTPUT = BASE / "output"
MODEL = "qwen3-vl:235b-cloud"
LABEL = "QWEN"
ACC = colors.HexColor("#1a5276")
JSON_PATH = OUTPUT / "extraction_ogc_raw.json"
CORRECTION_PATH = OUTPUT / "extraction_ogc_raw_Correction.json"
TIMING_PATH = OUTPUT / "timing_stats.json"
REPORT_PATH = OUTPUT / "bilan_extraction_qwen_ogc.pdf"
# ─── Styles ───────────────────────────────────────────────────────────────────
def make_styles(acc):
base = getSampleStyleSheet()
return {
"title": ParagraphStyle("title", parent=base["Title"],
fontSize=22, textColor=colors.white, alignment=TA_LEFT),
"subtitle": ParagraphStyle("subtitle", parent=base["Normal"],
fontSize=10, textColor=colors.HexColor("#aaaaaa"), alignment=TA_LEFT),
"section": ParagraphStyle("section", parent=base["Heading2"],
fontSize=13, textColor=acc, spaceBefore=16, spaceAfter=6),
"body": ParagraphStyle("body", parent=base["Normal"], fontSize=9, leading=14),
"small": ParagraphStyle("small", parent=base["Normal"], fontSize=8,
textColor=colors.HexColor("#444444")),
"right": ParagraphStyle("right", parent=base["Normal"], fontSize=7,
textColor=colors.HexColor("#888888"), alignment=TA_RIGHT),
"kpi_num": ParagraphStyle("kpi_num", parent=base["Normal"], fontSize=36,
fontName="Helvetica-Bold", alignment=TA_CENTER),
"kpi_lbl": ParagraphStyle("kpi_lbl", parent=base["Normal"], fontSize=8,
textColor=colors.HexColor("#777777"), alignment=TA_CENTER),
"warn": ParagraphStyle("warn", parent=base["Normal"], fontSize=8,
textColor=colors.HexColor("#c0392b")),
"footnote": ParagraphStyle("footnote", parent=base["Normal"], fontSize=7,
textColor=colors.HexColor("#888888")),
"center": ParagraphStyle("center", parent=base["Normal"], fontSize=9, alignment=TA_CENTER),
"bold": ParagraphStyle("bold", parent=base["Normal"], fontSize=9,
fontName="Helvetica-Bold"),
"th": ParagraphStyle("th", parent=base["Normal"], fontSize=8,
textColor=colors.white, fontName="Helvetica-Bold"),
}
# ─── Utilitaires ──────────────────────────────────────────────────────────────
def _fmt_s(s):
if s is None:
return ""
s = int(s)
h, r = divmod(s, 3600)
m, sec = divmod(r, 60)
if h:
return f"{h}h{m:02d}m{sec:02d}s"
if m:
return f"{m}m{sec:02d}s"
return f"{sec}s"
def _prec_color(p: float):
if p >= 90:
return colors.HexColor("#27ae60")
if p >= 75:
return colors.HexColor("#e67e22")
return colors.HexColor("#e74c3c")
def _gravite_color(g: str):
return {
"Critique": colors.HexColor("#e74c3c"),
"Haute": colors.HexColor("#e67e22"),
"Moyenne": colors.HexColor("#f1c40f"),
"Faible": colors.HexColor("#27ae60"),
}.get(g, colors.black)
_TS = TableStyle
def _base_table_style(acc):
return [
("BACKGROUND", (0, 0), (-1, 0), acc),
("TEXTCOLOR", (0, 0), (-1, 0), colors.white),
("FONTNAME", (0, 0), (-1, 0), "Helvetica-Bold"),
("FONTSIZE", (0, 0), (-1, -1), 8),
("ROWBACKGROUNDS",(0, 1), (-1, -1), [colors.HexColor("#f8f9fa"), colors.white]),
("GRID", (0, 0), (-1, -1), 0.3, colors.HexColor("#cccccc")),
("LEFTPADDING", (0, 0), (-1, -1), 6),
("RIGHTPADDING", (0, 0), (-1, -1), 6),
("TOPPADDING", (0, 0), (-1, -1), 4),
("BOTTOMPADDING", (0, 0), (-1, -1), 4),
]
# ─── Comparaison orig vs correction ───────────────────────────────────────────
def _flatten(d, prefix=""):
items = {}
if isinstance(d, dict):
for k, v in d.items():
key = f"{prefix}.{k}" if prefix else k
if isinstance(v, (dict, list)):
items.update(_flatten(v, key))
else:
items[key] = str(v).strip()
elif isinstance(d, list):
for i, v in enumerate(d):
key = f"{prefix}[{i}]"
if isinstance(v, (dict, list)):
items.update(_flatten(v, key))
else:
items[key] = str(v).strip()
return items
def _normalize_keys(flat: dict) -> dict:
"""Normalise les anciens noms de clés pour compatibilité avec les fichiers de correction antérieurs.
rang → niveau (renommage effectué en avril 2026).
"""
return {k.replace(".rang", ".niveau"): v for k, v in flat.items()}
def _get_cat(key: str, ptype: str = "") -> str:
k = key.lower()
if ptype == "ELEMENTS_PREUVE":
if any(x in k for x in ("medecin", "signataire", "date")):
return "Signataires / Dates"
return "Éléments de preuve"
if ptype in ("FICHE_ADMIN_2_2", "FICHE_ADMIN_1_2"):
if any(x in k for x in ("nom_medecin", "date_conc", "medecin")):
return "Signataires / Dates"
return "Concertation (2/2)"
if any(x in k for x in ("das_etab", "das_reco")):
return "DAS"
if any(x in k for x in ("sejour_etab", "sejour_reco")):
return "Données séjour"
if any(x in k for x in ("dp_etab", "dr_etab", "dp_reco", "dr_reco")):
return "DP / DR"
if any(x in k for x in ("rum_etab", "rum_reco")):
return "Données RUM"
if any(x in k for x in ("actes_etab", "actes_reco")):
return "Actes"
if any(x in k for x in ("ghm_", "ghs_")):
return "GHM / GHS"
if any(x in k for x in ("accord_desaccord", "se_coche", "atu", "ffm", "fsd")):
return "Accord / SE"
if any(x in k for x in ("date_debut", "date_fin", "nom_praticien")):
return "Signataires / Dates"
return "Métadonnées"
def compare_extractions(orig_list, corr_list):
orig_map = {r["fichier"]: r for r in orig_list}
corr_map = {r["fichier"]: r for r in corr_list}
total_g = correct_g = 0
per_dossier = []
per_cat = {}
per_type = {}
ep_counters = {k: {"occ": 0, "dossiers": set()} for k in [
"dr_confondu_das", "annee_mal_lue", "se_coche_halluc", "maintien_X",
"provenance_halluc", "acte_dans_das", "das_manquant", "das_code_wrong",
"json_non_parsable",
]}
for fichier in sorted(orig_map):
if fichier not in corr_map:
continue
o = orig_map[fichier]
c = corr_map[fichier]
o_pages = {(p["page"], p.get("type", "")): p for p in o.get("pages_traitees", [])}
c_pages = {(p["page"], p.get("type", "")): p for p in c.get("pages_traitees", [])}
structural_error = "raw_response" in json.dumps(o)
dos_total = dos_correct = 0
for page_key in sorted(set(o_pages) & set(c_pages)):
op = o_pages[page_key]
cp = c_pages[page_key]
ptype = op.get("type", "UNKNOWN")
od = op.get("data", {})
cd = cp.get("data", {})
if not isinstance(od, dict) or not isinstance(cd, dict):
continue
if "raw_response" in od or "raw_response" in cd:
ep_counters["json_non_parsable"]["occ"] += 1
ep_counters["json_non_parsable"]["dossiers"].add(fichier)
continue
o_flat = _normalize_keys(_flatten(od))
c_flat = _normalize_keys(_flatten(cd))
all_keys = set(o_flat) | set(c_flat)
for k in all_keys:
ov = o_flat.get(k, "")
cv = c_flat.get(k, "")
cat = _get_cat(k, ptype)
per_cat.setdefault(cat, {"total": 0, "correct": 0})
per_type.setdefault(ptype, {"total": 0, "correct": 0})
per_cat[cat]["total"] += 1
per_type[ptype]["total"] += 1
dos_total += 1
if ov == cv:
per_cat[cat]["correct"] += 1
per_type[ptype]["correct"] += 1
dos_correct += 1
if ptype == "FICHE_RECUEIL":
dr = (od.get("dr_etab") or {}).get("code", "")
cdr = (cd.get("dr_etab") or {}).get("code", "")
if dr and not cdr:
ep_counters["dr_confondu_das"]["occ"] += 1
ep_counters["dr_confondu_das"]["dossiers"].add(fichier)
prov = str((od.get("sejour_etab") or {}).get("provenance", "")).strip()
cprov = str((cd.get("sejour_etab") or {}).get("provenance", "")).strip()
if prov and not cprov:
ep_counters["provenance_halluc"]["occ"] += 1
ep_counters["provenance_halluc"]["dossiers"].add(fichier)
se = str(od.get("se_coche", "")).strip()
cse = str(cd.get("se_coche", "")).strip()
if se and not cse:
ep_counters["se_coche_halluc"]["occ"] += 1
ep_counters["se_coche_halluc"]["dossiers"].add(fichier)
das = od.get("das_etab") or []
cdas = cd.get("das_etab") or []
dp = (od.get("dp_etab") or {}).get("code", "")
if dp and not [x for x in das if isinstance(x, dict) and x.get("code")]:
ep_counters["das_manquant"]["occ"] += 1
ep_counters["das_manquant"]["dossiers"].add(fichier)
for od2, cd2 in zip(das, cdas):
if isinstance(od2, dict) and isinstance(cd2, dict):
if od2.get("code") != cd2.get("code") and cd2.get("code"):
oc = od2.get("code", "")
if len(oc) >= 7 and oc[:4].isalpha():
ep_counters["acte_dans_das"]["occ"] += 1
ep_counters["acte_dans_das"]["dossiers"].add(fichier)
else:
ep_counters["das_code_wrong"]["occ"] += 1
ep_counters["das_code_wrong"]["dossiers"].add(fichier)
if ptype == "FICHE_ADMIN_2_2":
m = str(od.get("maintien_avis_controleur", "")).strip()
cm_ = str(cd.get("maintien_avis_controleur", "")).strip().lower()
if m.upper() == "X" and cm_ == "oui":
ep_counters["maintien_X"]["occ"] += 1
ep_counters["maintien_X"]["dossiers"].add(fichier)
for k in od:
if "date" in k.lower():
ov = str(od.get(k, "")).strip()
cv = str(cd.get(k, "")).strip()
if ov != cv:
oy = re.findall(r"1[6-9]", ov)
cy = re.findall(r"1[6-9]", cv)
if oy and cy and oy != cy:
ep_counters["annee_mal_lue"]["occ"] += 1
ep_counters["annee_mal_lue"]["dossiers"].add(fichier)
prec = round(dos_correct / dos_total * 100) if dos_total else 0
per_dossier.append({
"fichier": fichier.replace(".pdf", ""),
"total": dos_total, "correct": dos_correct,
"errors": dos_total - dos_correct,
"precision": prec, "structural_error": structural_error,
})
total_g += dos_total
correct_g += dos_correct
prec_g = round(correct_g / total_g * 100, 1) if total_g else 0
n_total = len(orig_list)
error_patterns = []
for desc, key, gravite in [
("DR confondu avec DAS", "dr_confondu_das", "Critique"),
("Année mal lue (ex : 2017 au lieu de 2018)", "annee_mal_lue", "Haute"),
("se_coche inventé ('1' ou '4' au lieu de vide)", "se_coche_halluc", "Haute"),
("maintien_avis = 'X' au lieu de 'oui'", "maintien_X", "Haute"),
("provenance inventé ('8' au lieu de vide)", "provenance_halluc", "Haute"),
("Code acte mis dans DAS", "acte_dans_das", "Haute"),
("DAS entier manquant", "das_manquant", "Critique"),
("DAS code mauvais", "das_code_wrong", "Critique"),
("JSON non parsable", "json_non_parsable", "Critique"),
]:
e = ep_counters[key]
if e["occ"] > 0:
error_patterns.append({
"desc": desc, "occ": e["occ"],
"dossiers": len(e["dossiers"]), "n_total": n_total,
"gravite": gravite,
})
return {
"total": total_g, "correct": correct_g,
"errors": total_g - correct_g, "precision": prec_g,
"per_dossier": per_dossier, "per_cat": per_cat,
"per_type": per_type, "error_patterns": error_patterns,
}
# ─── Sections PDF ─────────────────────────────────────────────────────────────
def _section_header(story, S, acc, text):
story.append(Paragraph(text, S["section"]))
story.append(HRFlowable(width="100%", thickness=0.5, color=acc, spaceAfter=6))
def _build_header(story, S, acc, meta):
hdr = Table(
[[Paragraph(f"BILAN D'EXTRACTION —\nMODÈLE {LABEL}", S["title"]),
Paragraph(meta, S["subtitle"])]],
colWidths=[10*cm, 7*cm],
)
hdr.setStyle(_TS([
("BACKGROUND", (0, 0), (-1, -1), acc),
("LEFTPADDING", (0, 0), (-1, -1), 16),
("RIGHTPADDING", (0, 0), (-1, -1), 12),
("TOPPADDING", (0, 0), (-1, -1), 16),
("BOTTOMPADDING", (0, 0), (-1, -1), 16),
("VALIGN", (0, 0), (-1, -1), "MIDDLE"),
]))
story.append(hdr)
story.append(Spacer(1, 0.5*cm))
def _build_kpis(story, S, acc, cmp):
GREEN = colors.HexColor("#27ae60")
RED = colors.HexColor("#e74c3c")
kpi_num_style = ParagraphStyle("kpi_num2", parent=S["kpi_num"], fontSize=28, leading=32)
def kpi_cell(num, lbl, color=colors.HexColor("#333333")):
return [Paragraph(f'<font color="{color.hexval()}">{num}</font>', kpi_num_style),
Paragraph(lbl, S["kpi_lbl"])]
cells = [
kpi_cell(str(len(cmp["per_dossier"])), "Dossiers analysés", acc),
kpi_cell(str(cmp["total"]), "Champs comparés", colors.HexColor("#333333")),
kpi_cell(str(cmp["correct"]), "Champs corrects", GREEN),
kpi_cell(str(cmp["errors"]), "Champs en erreur", RED),
kpi_cell(f"{cmp['precision']}%", "Précision globale",
GREEN if cmp["precision"] >= 85 else RED),
]
kpi_t = Table([[c[0] for c in cells], [c[1] for c in cells]], colWidths=[3.4*cm]*5)
kpi_t.setStyle(_TS([
("BACKGROUND", (0, 0), (-1, -1), colors.HexColor("#f8f9fa")),
("BOX", (0, 0), (-1, -1), 0.5, colors.HexColor("#dddddd")),
("INNERGRID", (0, 0), (-1, -1), 0.3, colors.HexColor("#eeeeee")),
("TOPPADDING", (0, 0), (-1, 0), 14),
("BOTTOMPADDING", (0, 0), (-1, 0), 6),
("TOPPADDING", (0, 1), (-1, 1), 4),
("BOTTOMPADDING", (0, 1), (-1, 1), 12),
("ALIGN", (0, 0), (-1, -1), "CENTER"),
("VALIGN", (0, 0), (-1, -1), "MIDDLE"),
]))
story.append(kpi_t)
story.append(Spacer(1, 0.4*cm))
def _build_per_dossier(story, S, acc, W, cmp):
header = ["N° OGC", "Champs\ntotaux", "Champs\ncorrects", "Erreurs",
"Précision", "Err. structurelle"]
rows = [header]
style_extra = []
for i, d in enumerate(cmp["per_dossier"], start=1):
prec = d["precision"]
rows.append([d["fichier"], str(d["total"]), str(d["correct"]),
str(d["errors"]), f"{prec}%",
"■ Oui" if d["structural_error"] else ""])
pc = _prec_color(prec)
style_extra += [
("TEXTCOLOR", (4, i), (4, i), pc),
("FONTNAME", (4, i), (4, i), "Helvetica-Bold"),
("TEXTCOLOR", (3, i), (3, i),
colors.HexColor("#e74c3c") if d["errors"] > 0 else colors.HexColor("#27ae60")),
("FONTNAME", (3, i), (3, i), "Helvetica-Bold"),
("TEXTCOLOR", (2, i), (2, i), colors.HexColor("#27ae60")),
("FONTNAME", (2, i), (2, i), "Helvetica-Bold"),
]
if d["structural_error"]:
style_extra += [("TEXTCOLOR", (5, i), (5, i), colors.HexColor("#e74c3c")),
("FONTNAME", (5, i), (5, i), "Helvetica-Bold")]
tot_prec = round(cmp["correct"] / cmp["total"] * 100, 1) if cmp["total"] else 0
n_struct = sum(1 for d in cmp["per_dossier"] if d["structural_error"])
rows.append(["TOTAL", str(cmp["total"]), str(cmp["correct"]),
str(cmp["errors"]), f"{tot_prec}%", f"{n_struct} dossier(s)"])
n = len(rows)
style_extra += [("BACKGROUND", (0, n-1), (-1, n-1), colors.HexColor("#eaf0fb")),
("FONTNAME", (0, n-1), (-1, n-1), "Helvetica-Bold")]
col_w = [W*0.16, W*0.12, W*0.14, W*0.11, W*0.13, W*0.34]
t = Table([[Paragraph(str(c), S["th"] if i == 0 else S["small"]) for c in row]
for i, row in enumerate(rows)], colWidths=col_w)
t.setStyle(_TS(_base_table_style(acc) + style_extra))
story.append(t)
def _build_per_cat(story, S, acc, W, cmp):
cat_order = [
"DAS", "Données séjour", "DP / DR", "Données RUM",
"Signataires / Dates", "Métadonnées", "Concertation (2/2)",
"Éléments de preuve", "Accord / SE", "GHM / GHS", "Actes",
]
rows = [["Catégorie", "Champs\ntotaux", "Champs\ncorrects", "Erreurs", "Précision"]]
style_extra = []
for i, cat in enumerate(cat_order, start=1):
d = cmp["per_cat"].get(cat)
if not d:
continue
prec = round(d["correct"] / d["total"] * 100) if d["total"] else 0
rows.append([cat, str(d["total"]), str(d["correct"]),
str(d["total"] - d["correct"]), f"{prec}%"])
style_extra += [("TEXTCOLOR", (4, i), (4, i), _prec_color(prec)),
("FONTNAME", (4, i), (4, i), "Helvetica-Bold")]
col_w = [W*0.40, W*0.15, W*0.15, W*0.15, W*0.15]
t = Table([[Paragraph(str(c), S["th"] if i == 0 else S["small"]) for c in row]
for i, row in enumerate(rows)], colWidths=col_w)
t.setStyle(_TS(_base_table_style(acc) + style_extra))
story.append(t)
def _build_per_type(story, S, acc, W, cmp):
rows = [["Type de page", "Champs\ntotaux", "Champs\ncorrects", "Erreurs", "Précision"]]
style_extra = []
for i, (ptype, d) in enumerate(sorted(cmp["per_type"].items(),
key=lambda x: -x[1]["total"]), start=1):
prec = round(d["correct"] / d["total"] * 100) if d["total"] else 0
label = (ptype.replace("FICHE_", "Fiche ").replace("_RECUEIL", "de recueil")
.replace("_ADMIN_", " administrative ").replace("_2_2", "2/2")
.replace("_1_2", "1/2").replace("ELEMENTS_PREUVE", "Éléments de preuve"))
rows.append([label, str(d["total"]), str(d["correct"]),
str(d["total"] - d["correct"]), f"{prec}%"])
style_extra += [("TEXTCOLOR", (4, i), (4, i), _prec_color(prec)),
("FONTNAME", (4, i), (4, i), "Helvetica-Bold")]
col_w = [W*0.40, W*0.15, W*0.15, W*0.15, W*0.15]
t = Table([[Paragraph(str(c), S["th"] if i == 0 else S["small"]) for c in row]
for i, row in enumerate(rows)], colWidths=col_w)
t.setStyle(_TS(_base_table_style(acc) + style_extra))
story.append(t)
def _build_error_patterns(story, S, acc, W, cmp):
rows = [["Ce que le modèle a raté — catégorie d'erreur",
"Occur-\nrences", "Sur combien\nde dossiers", "Gravité"]]
style_extra = []
for i, p in enumerate(cmp["error_patterns"], start=1):
gc = _gravite_color(p["gravite"])
rows.append([p["desc"], str(p["occ"]),
f"{p['dossiers']} / {p['n_total']}", p["gravite"]])
style_extra += [("TEXTCOLOR", (3, i), (3, i), gc),
("FONTNAME", (3, i), (3, i), "Helvetica-Bold")]
col_w = [W*0.56, W*0.10, W*0.17, W*0.17]
t = Table([[Paragraph(str(c), S["th"] if i == 0 else S["small"]) for c in row]
for i, row in enumerate(rows)], colWidths=col_w)
t.setStyle(_TS(_base_table_style(acc) + style_extra))
story.append(t)
def _build_timing(story, S, acc, W, timing_data):
if not timing_data:
story.append(Paragraph(
"Aucune donnée temporelle disponible. "
"Relancez l'extraction pour générer timing_stats.json.", S["small"]))
return
total_s = sum(t.get("duree_totale_s") or 0 for t in timing_data)
total_pages= sum(t.get("nb_pages_total") or 0 for t in timing_data)
total_err = sum(len(t.get("erreurs", [])) for t in timing_data)
total_429 = sum(len(t.get("blocages_429", [])) for t in timing_data)
total_wait = sum(b["attente_s"] for t in timing_data for b in t.get("blocages_429", []))
n_dos = len(timing_data)
story.append(Paragraph("Résumé global", S["bold"]))
story.append(Spacer(1, 0.2*cm))
kpi_rows = [
["Durée totale d'extraction", _fmt_s(total_s)],
["Durée moyenne / dossier", _fmt_s(total_s / n_dos) if n_dos else ""],
["Durée moyenne / page", _fmt_s(total_s / total_pages) if total_pages else ""],
["Pages traitées", str(total_pages)],
["Erreurs totales", str(total_err)],
["Blocages rate limit (429)", str(total_429)],
["Temps perdu en attentes 429", _fmt_s(total_wait)],
["Temps utile (hors 429)", _fmt_s(total_s - total_wait)],
]
style_kpi = _base_table_style(acc) + [
("ALIGN", (1, 0), (1, -1), "CENTER"),
("TEXTCOLOR", (1, 0), (1, -1), acc),
("FONTNAME", (1, 0), (1, -1), "Helvetica-Bold"),
]
t_kpi = Table([[Paragraph(k, S["small"]), Paragraph(v, S["small"])]
for k, v in kpi_rows], colWidths=[W*0.6, W*0.4])
t_kpi.setStyle(_TS(style_kpi))
story.append(t_kpi)
story.append(Spacer(1, 0.4*cm))
story.append(Paragraph("Détail par dossier", S["bold"]))
story.append(Spacer(1, 0.2*cm))
header = ["Dossier", "Début", "Fin", "Durée", "Pages",
"Erreurs", "Blocages\n429", "Attente\n429"]
rows = [header]
style_dos = _base_table_style(acc)
for i, t in enumerate(timing_data, start=1):
debut = (t.get("debut") or "")[:16].replace("T", " ")
fin = (t.get("fin") or "")[:16].replace("T", " ")
n_err = len(t.get("erreurs", []))
n_b = len(t.get("blocages_429", []))
att = sum(b["attente_s"] for b in t.get("blocages_429", []))
rows.append([
t["fichier"].replace(".pdf", ""), debut, fin,
_fmt_s(t.get("duree_totale_s")), str(t.get("nb_pages_total", "")),
str(n_err), str(n_b), _fmt_s(att) if att else "",
])
if n_err > 0:
style_dos += [("TEXTCOLOR", (5, i), (5, i), colors.HexColor("#e74c3c")),
("FONTNAME", (5, i), (5, i), "Helvetica-Bold")]
if n_b > 0:
style_dos += [("TEXTCOLOR", (6, i), (6, i), colors.HexColor("#e67e22")),
("FONTNAME", (6, i), (6, i), "Helvetica-Bold")]
col_w = [W*0.18, W*0.14, W*0.14, W*0.10, W*0.08, W*0.09, W*0.10, W*0.17]
t_dos = Table([[Paragraph(str(c), S["th"] if i == 0 else S["small"]) for c in row]
for i, row in enumerate(rows)], colWidths=col_w)
t_dos.setStyle(_TS(style_dos))
story.append(t_dos)
has_issues = any(t.get("erreurs") or t.get("blocages_429") for t in timing_data)
if has_issues:
story.append(Spacer(1, 0.4*cm))
story.append(Paragraph("Erreurs et blocages détaillés", S["bold"]))
story.append(Spacer(1, 0.2*cm))
for t in timing_data:
if not t.get("erreurs") and not t.get("blocages_429"):
continue
story.append(Paragraph(t["fichier"].replace(".pdf", ""), S["bold"]))
for err in t.get("erreurs", []):
story.append(Paragraph(
f" ⚠ Page {err['page']}{err['phase']} : {err['message'][:100]}",
S["warn"]))
for b in t.get("blocages_429", []):
story.append(Paragraph(
f" ⏳ Blocage 429 — tentative {b['tentative']}, "
f"attente {b['attente_s']}s à {str(b.get('ts',''))[:16].replace('T',' ')}",
ParagraphStyle("b429", parent=S["small"],
textColor=colors.HexColor("#e67e22"))))
story.append(Spacer(1, 0.1*cm))
# ─── Main builder ─────────────────────────────────────────────────────────────
def build_pdf():
W = A4[0] - 4*cm
if not JSON_PATH.exists():
print(f"⚠ JSON introuvable : {JSON_PATH}")
sys.exit(1)
with open(JSON_PATH, encoding="utf-8") as f:
orig_data = json.load(f)
cmp = None
if CORRECTION_PATH.exists():
with open(CORRECTION_PATH, encoding="utf-8") as f:
corr_data = json.load(f)
cmp = compare_extractions(orig_data, corr_data)
timing_data = None
if TIMING_PATH.exists():
with open(TIMING_PATH, encoding="utf-8") as f:
timing_data = json.load(f)
S = make_styles(ACC)
story = []
if cmp:
etabl = finess = controle = ""
for r in orig_data:
for pt in r.get("pages_traitees", []):
d = pt.get("data", {})
if d.get("etablissement"):
etabl = d["etablissement"]
if d.get("finess"):
finess = d["finess"]
if d.get("date_debut_controle"):
controle = d["date_debut_controle"]
if etabl and finess and controle:
break
if etabl:
break
meta = (f"{etabl} · FINESS {finess}\n"
f"{len(orig_data)} dossiers OGC · Contrôle {controle} · "
f"{datetime.now().strftime('%B %Y').capitalize()}")
else:
meta = (f"{len(orig_data)} dossiers OGC\n"
f"Généré le {datetime.now().strftime('%d/%m/%Y à %H:%M')}")
_build_header(story, S, ACC, meta)
if cmp:
_section_header(story, S, ACC, "1. Indicateurs globaux")
_build_kpis(story, S, ACC, cmp)
_section_header(story, S, ACC, "2. Résultats par dossier OGC")
_build_per_dossier(story, S, ACC, W, cmp)
story.append(Spacer(1, 0.4*cm))
_section_header(story, S, ACC, "3. Précision par catégorie de champ")
_build_per_cat(story, S, ACC, W, cmp)
story.append(Spacer(1, 0.4*cm))
_section_header(story, S, ACC, "4. Précision par type de page")
_build_per_type(story, S, ACC, W, cmp)
story.append(Spacer(1, 0.4*cm))
if cmp["error_patterns"]:
_section_header(story, S, ACC, "5. Patterns d'erreurs récurrents")
_build_error_patterns(story, S, ACC, W, cmp)
story.append(Spacer(1, 0.4*cm))
sec_timing = 6
else:
sec_timing = 1
story.append(PageBreak())
_section_header(story, S, ACC, f"{sec_timing}. Analyse temporelle")
_build_timing(story, S, ACC, W, timing_data)
story.append(Spacer(1, 0.5*cm))
note = (
"Rapport généré par comparaison automatique de extraction_ogc_raw.json "
"vs extraction_ogc_raw_Correction.json · "
f"Périmètre : {len(orig_data)} dossiers OGC · "
"Les pourcentages de précision sont calculés champ par champ."
if cmp else
f"Rapport généré automatiquement · {len(orig_data)} dossiers OGC · "
"Aucun fichier de correction disponible — métriques de précision non calculées."
)
story.append(HRFlowable(width="100%", thickness=0.3, color=colors.grey))
story.append(Paragraph(note, S["footnote"]))
doc = SimpleDocTemplate(
str(REPORT_PATH), pagesize=A4,
leftMargin=2*cm, rightMargin=2*cm,
topMargin=2*cm, bottomMargin=2*cm,
title=f"Bilan extraction OGC — {LABEL}",
author="EttaSanté / T2A",
)
doc.build(story)
print(f"{REPORT_PATH}")
if __name__ == "__main__":
print(f"Génération bilan {LABEL}...")
build_pdf()

View File

@@ -0,0 +1,137 @@
%PDF-1.4
%“Œ‹ž ReportLab Generated PDF document http://www.reportlab.com
1 0 obj
<<
/F1 2 0 R /F2 3 0 R /F3 4 0 R
>>
endobj
2 0 obj
<<
/BaseFont /Helvetica /Encoding /WinAnsiEncoding /Name /F1 /Subtype /Type1 /Type /Font
>>
endobj
3 0 obj
<<
/BaseFont /Helvetica-Bold /Encoding /WinAnsiEncoding /Name /F2 /Subtype /Type1 /Type /Font
>>
endobj
4 0 obj
<<
/BaseFont /ZapfDingbats /Name /F3 /Subtype /Type1 /Type /Font
>>
endobj
5 0 obj
<<
/Contents 12 0 R /MediaBox [ 0 0 595.2756 841.8898 ] /Parent 11 0 R /Resources <<
/Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ]
>> /Rotate 0 /Trans <<
>>
/Type /Page
>>
endobj
6 0 obj
<<
/Contents 13 0 R /MediaBox [ 0 0 595.2756 841.8898 ] /Parent 11 0 R /Resources <<
/Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ]
>> /Rotate 0 /Trans <<
>>
/Type /Page
>>
endobj
7 0 obj
<<
/Contents 14 0 R /MediaBox [ 0 0 595.2756 841.8898 ] /Parent 11 0 R /Resources <<
/Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ]
>> /Rotate 0 /Trans <<
>>
/Type /Page
>>
endobj
8 0 obj
<<
/Contents 15 0 R /MediaBox [ 0 0 595.2756 841.8898 ] /Parent 11 0 R /Resources <<
/Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ]
>> /Rotate 0 /Trans <<
>>
/Type /Page
>>
endobj
9 0 obj
<<
/PageMode /UseNone /Pages 11 0 R /Type /Catalog
>>
endobj
10 0 obj
<<
/Author (EttaSant\351 / T2A) /CreationDate (D:20260420204759+02'00') /Creator (\(unspecified\)) /Keywords () /ModDate (D:20260420204759+02'00') /Producer (ReportLab PDF Library - www.reportlab.com)
/Subject (\(unspecified\)) /Title (Bilan extraction OGC \204 QWEN) /Trapped /False
>>
endobj
11 0 obj
<<
/Count 4 /Kids [ 5 0 R 6 0 R 7 0 R 8 0 R ] /Type /Pages
>>
endobj
12 0 obj
<<
/Filter [ /ASCII85Decode /FlateDecode ] /Length 2572
>>
stream
Gb!#_D,VB4&H9tYd$IEtAo_SXY)`]VL(&bIS7t(F0<T:m14W<X9\Y&(l-?3U]q9]\'1afD]%olWB;OFr4Wr7&6i(m'5fgPD3I22=(n#at+;-se(Z]CQnFls"7nT$pb:F39D$!a@GFe%pJ@YrHKJS_XO,6\,$V=CV%NaGKL([o;0ub.&ehpJ9o(C6.9kCmZ\QYH%AMp<W#ae9tpu_8g#j@\gk/#/Il#0qXT,6SXh>,%[,rtqcm.\Wbj-.U\e`CR%q+`8TaPi@<9n'c:ST:A>BB8ouZd@l7?b>bn4`aO:8go`FS#u6gRT)MPYdhe_Q)Ag#l0@8hPDf%UoBS&BjQ(&r7c#0C\DICuRkL[Mb+-9AkEfg?2adtP%Fr<,i*k""EkT1kXOcIt_auc_AGN`<9t:o2$UVfEj[[Os9%k)a3rZCq]-iOm<L`E!A_N%'95S3+),DX;4?u4Md)h!)F_&3u^f09\e2WPOo>fUtq/!B^Eg-BD^\i0HoPa'L'GuKoA:[%0J)$EPX^F>B8;Tp[!ti[fbbX<kgf3>>^.W0Lq,T:#S2dR7cq_52PZrm\G=B$oc'BRChftPOQ,t"h7am2gDOk?ADT0*HSsiN-Z@m!lTO9&B2b5M[1.W2110W&nD7QjQfU>3$BqtL9dDF.8)9*tHG0'$`%hR+-%L'_N9Ru^?Lo&N:DhN5/h'_s<"p-N9iMs,<2?f+=<t,DDO@TA(@h=q3CE-in3/h@`X+D"]cFTcrU1OtTG1WdB[Qjh%$C]^;]@dAkVthAlH^rpl\"7UHlN!kG[[!X*Y`*W.;8>6gC\I7-:$0WS+1"rb<-`"9JMBt]N`oHXDa:^6/`rOF9]]qi4-ag:cUq1neDcTA*2oc8[!(uLG$6,Y8b9gD5G]kg^K]SI+1("fIM(<a)B7Z3kl-&r8Bb+_jjTb9l%u_%gE2=/h.2:13(rhWQiBa;ERBTRR)F%F7B2td5MtaM%NSj=>+&WrS2Y+3;n8S6e:M6L0n"7ZKPkC<7M=T!)PNY4#U!D+h]3W43%u;4A1;U%7^e$\&pW7t2JQV+q4'M2e,<me=VKu-A/cZepo$E)OOS-%!=O5G^o3+.G6c=8`=YQ2i-+N>HKYYqR#5A`QH'sg?;AOs`\Dn)f`9-9+3@pe,t%::qBS#GZn/b5?@A!+B3LJR4KT[@"4hD*j_MC4r+J#kJG[Su,WLVJMrNg@]:`kt?^VO4q-&SL+pj$k;pXDTD`)FI8Fqc]nLdUQOImOo+VWQ\2dM8o@o/?!/qU7kR9`%Qh>Y2Af6\D'/3S>AKI]RrL&G$u5#,<>E$c2I1trgq6IqXVdsUbo>20ploi=dED<bN"#RS]Jr2tDW#q$4250]oA^d8`XTP[+tGDtG@GQhf$T[g-jOTm\*)$L1r3f*/#'RoX/`!7eV8h,H!UdkGobc<m@=ni1.&:``?4e-MI24=oO+YJ;>mWi%;#MN8r5X@-U"].Hl\,Zkt4r9l*/tf7gDfPjmFeEM46Z<&GBXNh-7i/s,6&43maTYL+=>AY9:k82J!#Rg7i;G9YUWug\8K`6X'!eMHG&mX'&2akXnK/!geQ)SZZ:#g"$AtVQ]EB]W9<(h1e^N@2M$,4`s"SPEs.H:mq[>t#&i<Gnn94CG'GO7aG)2l35\N1S#f-PiGD+o9d^EFWi;ttFCON*MDulakIp<\AK;,ppm<FG[@&P.k]6h=dUsad[9%S7K-4do6=%t8H7.:0rBUk(R!#--T6_K;!.%2t7ch!LEQN8[F(/t_#q9PN`,=.M<H&dKN<oCAqY_*"o+9XbZOY<K+bKdEl*e:!0V,I'uJ:gPGOR9u9'G.?h]4`Sgj4lPsUY1][UPJb\\ZUG`pPNq\8Q4AQa-.Sodr!`]G9B*W#X3.p8&8TsB_&o+RZ!Kn$9$g3%o+INSfu%m5pg@Bj\Fl,1=)m=(FR0B:];/U=H#cLp8f_nQhX_DI\\@1j*#mA#K7.Oa%j#T5KS!+B-MhDh&;%)ajoJI@_c,s''6-:s"="g*5CgLE=t0KN&fEN]P3^%H/9COrm5!"L17j/(jUG;T"]*hR?sP0lsHaKgTj_n[qcJR3%kIoQ^l*JI,SYlV$^YFAiT2k;&:a,Z)ESH]4fRqjT9aa.d3Q7"!SRYL&hkp.)UQ@#*`O]"J`A`^Pj=f:du#NTeb5:LXo[*pYDN?QlW]Xr%fqHcPo;;o.RUuY=`U$o1%4_A`aD8J)2UM3LGcAC!hCdaST2Bp;-$I$e8Rl%uQ,CA*`i66;$]^pq$G"CubQdD7R5^OP9r,qc__Q$@\m90a0-#&q4]1GgZPSUDL!*.H)@FZTbfM4-(k8.*k&5QD=D[akqI!7mZh];,9>5duZP!M&m*cjk*ftMDJl<R8.*H[K)^DWq\c`4,U:u``PbthWaQ)58fQSBQXG!3@Rc]WG:qX5R<l/eH44ff1W`'3m\0:);k=Z'i%GG\pSnt'ORq5qDRR3AarZ,a/4JDF4q4LL:mg:^:!>=abkKOj_bK1VHiIj(cOs"%u#<R?sO+i26-kk\i\3f^%(ZrJR.lZPX,gY11NrqQfX4Rc+2-N3"=(%7PP3a1K13_o7i9X2KJ:OHohht~>endstream
endobj
13 0 obj
<<
/Filter [ /ASCII85Decode /FlateDecode ] /Length 2177
>>
stream
Gb!TY?#uJr&;KZF/,&+!da"("M%Ak+jWnQo:=G9V^!"V;MJ5[1L(r[TkMMnsYm&cfYZWoU-;>LL=M(j[Q@2hD@,j1Mr#\Z7rY`W<9*U?mp^8drEa\e\0#pK>O4a"qf<[TY(&jql`K[:iIFrBcT=^*bI.\JOiN'>>ifMt:-2N&<#"LFA8gWF"[ip[fbB"Y&J$6$F)R&BDg$(4HheQc7HfX='FU[%fce>nRPNj!oH'\/5iUE#lg<.C_nr8@rDulKj@WE!oHrtkM#%<6(Ugpu"k/kRI3/*9[B/';hj6,.98,P",0I8=.FVU$!cYKr,I:hI$it,@67&qWm#YT+hM(J1>99ukh.63Eo=E/^'0#rgN<gC.sWl&)bZTUVIBtJks\[DTH%LHHUP2$D275MILFPVR)'!!us&'S]\q<^S:S<92uI$6>pknmMBjY/$t@R>S3`#4DE;@VQC;g:!Rmuee(iXA,jGS]AfX9WPeVHp)1Cc&#6];ZE$&l[RlLQ1O8L9Pq9_jLKt'Ml,B?mG28GlqH\.6P,k&M4M?-FWS4NPr'ipE5I8''fQ:M5Bn78\l:$@uBa$RA=f[4AE[@bC_oP'=^3aVu66k2eaP7)/IQi$u$uQA383D1_N0'"17#_:D1]qIt,a7ZG]t`fY%c*djW=N0T"^2Mrp't2et7,]%uEB8Rb9dWZ*i78[*)g+KCP`VSrJ<OedkI@@1X?bgAnHh0b>eFPUiIBFOQYAs+!Oki!`UCC"/jWSuC.CF&62eYjE=RXDaQ>!s:()_D[ilNe/s7?dAe!HF#CD"U\j,\t)r]UIgp725"&e3O`FiHZ52ijh@>2Y73'^)^A?e`,K2eWD09a.cmU_\A!VpcXT*0;`up4%uF9\*G'rTCjK^n'FMrC6r#dEp?q*V2Ns;GbrTdGM-P/h2@.(FWW(ce30`i:q(Ae1W>:,6?eng3FD3b"jX^:1s17jquT7AD]4lUYZ8NW_YgF=lMn?u[Du?Q+k!iq.tr_Vq#XWb$]m-PjAg0]H4%4U\F6pHPdps/*10i9-B#L[Je+8EY/>L]Fkf?G62ob/Zq.NU]CmM^oZ"_(Qeo6.UZSr./O\0okG]qXp$p;POMb(@r:\erGf%(jgpI^+hc<7.mA.F=PBq$l2=Ii<90+7lWT:,KfSD)d!D^X_Q?P^"mpP)OCG:1(6([5Tr+CMMhJ@agm3YkDT4#s97:G'P"PhAh4&"fMa.?r2@rKHU*QG8=HV^]J?cM'V#];9@5@)!Pqhq7-Z^pbPK0s?g.=R\n[N"qpL1V,VT)j:JEP6iJLLqLHm6M\N-.XGh-)hca(T2^$YruJ6KLCt<!U]75qXlq!g:m'`MOTGD>9Gbg[Zi(P2>:^fE-OJiEQfN/X\2>)lU)N2rSHRb$H]%:TSk'nrgrE0hc5)?iDC>qf^+^Q9>,3qCshR6JY#OI)]r5tZ0?1(`8qu.(%JTE<=q;d>)7miWec@NbQU?KZ&=K!aR^fQ0LIj\MW>k:4FN6lA;eY[*V+X%/KH#O`QVE6nN0.Dg.)jd*2'ATL"u!)@ES\oqT-q%-3%3nDbegL,.&Ti5*+VcJn[835]-ENJ1Sc!XDl?Cnkh73dO^Cec<D>5DGaR%n>9?Q^CTi=H!s*$hC@KMU9rj'cT48Icdld$6'tD3a&.FL_UtBSZWS8b'C3)B.8RO%IGS%.n/*fBc_it8G_;2U^8/k]%`)Wh_So[TSl3+t,dt0%LbL>O@gGh<j.+/?Z`@^"8\@.2i]P5mmthPjSh895_)/ZWHOL+f-db`b)oE9Z+dg/q*6kn<`jXZC4Ju_C`2bK3ULAhoOOq@j^,_utKZ(K(_)re>#g"g+=nHX"C7PtbO-mNn:PP'CFq!UTNh,2[,`hI@l3.KNB3UB@(eA<K*=<DlmtO+pEl@8e99G26+4k:maM%)93=j_9#E>8V_*R)90K)IZ`oeeRHk>H8KS`P;"fR<),o\Zgijp;+Z#_#n8=UV'!DU:R2?F9pQs!pjOaNc+8`!1W6-bWN&3sag5fr0WO_^+j1E(jA7tYM0Igk=[NF`BgWUb3G5Z?f/&-4'%%46VBM)V4(miX%hM9LRtp[.j$AIS>kH/^!R`5*&DE6I-=P?.@F[-CkZ<ZO'^b!:I-M(l)jYF=4?^:e?Io+ehJXas^+[o\P]^J`%F0D\b0<I\e4RsEFkP-Laq%7gF#KK_j&~>endstream
endobj
14 0 obj
<<
/Filter [ /ASCII85Decode /FlateDecode ] /Length 2240
>>
stream
Gau`XD/\/e&H;*)_/DsS7-2&%IV[OO?l6,Uo>^ibPGkGgb>)mX>Q=Xmfchk6Z7,,(`C1I&UjJ+l51K,$$UNEm8H&QoM9t!'HM)h36IG?S,!=n!q)`o;>l7]ce!6).;H$:d/kJO>eE/q>c3Q<;JhffP0YbiAUcB6)s0+1<M1ZCR=W.R'#cf,5"h9^5HF$moINAhq($4In?YhX>$afhlQ7jif-hHRY6#cFZ1I7\Kbr*6Fg@G("@U#l]&XPOW8h8BCTYC^(1E#Ds[CFs7eoXI7rLn@`52S%[%Srr"L)r7bgXRXF2iM:7k0fuX(C5;t5ihorZQ?Th,SD?)aK_)`e/2MbY:g][cDfaaC7S"hS%H)F9N--On%Hog#kMc5TsHT9EQr6Yir4D8o_*KD6uRQ.S_fea'Ic93D42;Co$]j$BteW;rSF):r&Bm2W:T<1e)!hD_i%g.g(`cMQf=WP^UgJs]5;1QSXC&G/uh?0(t1b4O`,o;6le=cKN.3kde+4Vohr?t=_tPNHA1d2LVp^Ua89O\5eZ2C//BP^s1rJ1Ok1XU&)D@E_IXkP$9m?U$Gq<XNH5TNY]!gtId<F)i$f4!F#D]J&d&+3IU>5)&#U^(JX8X',dX$EZ?!\8m-a07ZsQf:g8rJ?Kl4%QeMf/>*<ot-T'\4n'm"'j_ZP39p@h@]fV2AG(#-n+caXD?@3??Gq<Jcc_k*m9#odcb^?tX%YEDS_FHOM&3he"cq]\u&ps4W`))It8'BPND::!Y6catmG&[[%IK+!<)"r,aX3#(mJ7,&n(Li?RO]h#OVapZpo#u##:&/`d6GOSSrj2b?-CG_UY1pd>s6>'3\mKUVQH/?UiD27!$a(;Y^DbPP`+,J-eiFlicAj3^JdbMti[\1#=\I&Ca7cSXmSB/FV>2'EsT%_XN1I9&=[l,D7R]5T>BhL5s^&8ku9RD-?hB(t=IZ81TAT(@+)p^MhW5f->c5OIh_`,.kj:i^!D0X717?Y)(p(?S'RcPNQRE@*SDkF$qm:M;4MKqBYqhK<<^D]4*W**2tB(O51m:(gXk9<hkc-p">r.D#;9p&l/B;n(Kahu7iT&mKuA'3&8pLnL)b=;H\o/OiZE@`jseL4C85MdA)Z(=3352K^[adNo21nALh&X7^;jro78+]pPE?0CksCqdJ(Ih-Ol%)GnL@t%-Xd!S:SCF7*4Q.,fZ`]6$3JGq]F8Y9kOHRK1&2XFI7:`,kn(9!"iWIZ$h@=W7>\.;)=VHXZ5jH#A:)GT%h6m)<'_?!A[cb?1Z%"$^7&&dG.jNk,iII%%:Md[\5:^m46"*sTk!0+5o,RmVW:WBVW.NHgrpZtOeJ/Eb3HhN"MS<Y:UI3;oPm"<Dl7BeF"OCoX@cj9NIg$8[D09:oO-c5sZI`K10"q7\"NdWSkQZ;?o!ZPbo$r@*(;?JrQ_#TJ":LZ$O%0q?RI8f*T-GO2#1'8qRNC=!I5TDCL-=b[5"4fWXcr_\bNKQ>&B>-/f%0af$ELs9TL<VkcoNVST,DOAa5\"&r&6m\RbA)8KHS/*J"/:tAE_6GTn>LXcK/d,#pt66k+.#:/@\0A<5VZ'_`'BoB+@%1<,8r+gUPEh/q^02]9n(-sZj&o\8RWUaj5O/XYR's=!(F+F23;;i%+#jg5[IJPZ7dDW1Dp[9npC),1k8%Xqd:Br8krmK#6G[Y4qOA(p*Bq6liR8,@ip?GiGa:8G_UWFiIE8iB4"O=,0hiL*1iKBk4B2h/;AQq5V_Uu%-6(H!]7n\%$e`h,U.k%)%L?NHhO9mJ46!a_`6H<qa_.m5epj]#6GUW^;N:.I3:d"m#t7;(JZ.eW)M)oVS;(s;Z)?g$P76GW)H)<%g4D7GT\sX]M"4DBEs,FG%M8MCuI2peN"?RB\*%oqh4a77NC'uA6K7s3Np3Ib;,E1=6<Dab$6(4!gR7UpQDV-\b^fDoD\.CK^]R84:#$[P/Us5/sKSN:hJfUH'O%cPr"+r[^me:;)6Cp67dUpIj%jkaO]@(,1C?r[KIrhfqoDhg(KgN'=H#]=AZ_CCM:T-.cnpZV)+f9GVa/a9IQXl$sOJ\eq7[T`gJ#/>Op2l0_8o?Q5/*m+^6kG^_:QT1^5@R>1]hjY2LBs"@"M$<pgl4:+83+%!AgXdg5%.Df&T;fCGftjUA17&$=VE!kBFD!nHk=&]h@DcMUl&1`H0tZ(!L5-pe,rh/_lCPD\1blK=m.[nVkNI8^-TWW+Znn:ReCQQj>#W0;@;nLq;RCM*~>endstream
endobj
15 0 obj
<<
/Filter [ /ASCII85Decode /FlateDecode ] /Length 506
>>
stream
Gasak_+rc>&A@6WhJq;&=kedsE!-1S6A7ad/$4bM6dR.iG..&748*j^.U=N5BkH]L^GgTTN[69KXQb;B"t,`W>bLlnT!KE]%5++92<009Q!gU-2+OW<`bST'4\@A+g:%qCn97]cVC+W[3oPpO[^a"3LFhO'1bWOV7eH/VN\M6e!<Xh[;<Jom#Y>UF=-XE[5FhP0PG@utH#b>E[u2Dlc\`LJe#apTPp"^Vqp5f>qB`WPVmq2crJ#m?Gci,I(8mdMJ7)7]&Kbu)5ZWhFomcOi<RkCUM)Qopc<.=s=\+C;^V@pGK[:rFFhCi(AqPjLqr@SS^6%m&gs>ZTj^-m95eDA+Nm:F6=0gaO1d7?V(Q@\%kq4Hb\!-.Ne@f`OSh063a_N\TDHOO%XM''m8arA288<S@]XR-==1&[@`*FSQH?.3Ndp0[7Sm2Plo`=Sq94^%?lj's9h:<N,9Jl/K],4JMV@/%c!hNfl`b[U(1r)6>Ib[(37Vju,AA80-@aLJ~>endstream
endobj
xref
0 16
0000000000 65535 f
0000000073 00000 n
0000000124 00000 n
0000000231 00000 n
0000000343 00000 n
0000000426 00000 n
0000000631 00000 n
0000000836 00000 n
0000001041 00000 n
0000001246 00000 n
0000001315 00000 n
0000001621 00000 n
0000001699 00000 n
0000004363 00000 n
0000006632 00000 n
0000008964 00000 n
trailer
<<
/ID
[<8465917567113f196f99bd144e52b34c><8465917567113f196f99bd144e52b34c>]
% ReportLab generated PDF document -- digest (http://www.reportlab.com)
/Info 10 0 R
/Root 9 0 R
/Size 16
>>
startxref
9561
%%EOF

View File

@@ -0,0 +1,131 @@
%PDF-1.4
%“Œ‹ž ReportLab Generated PDF document http://www.reportlab.com
1 0 obj
<<
/F1 2 0 R /F2 3 0 R
>>
endobj
2 0 obj
<<
/BaseFont /Helvetica /Encoding /WinAnsiEncoding /Name /F1 /Subtype /Type1 /Type /Font
>>
endobj
3 0 obj
<<
/BaseFont /Helvetica-Bold /Encoding /WinAnsiEncoding /Name /F2 /Subtype /Type1 /Type /Font
>>
endobj
4 0 obj
<<
/Contents 11 0 R /MediaBox [ 0 0 595.2756 841.8898 ] /Parent 10 0 R /Resources <<
/Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ]
>> /Rotate 0 /Trans <<
>>
/Type /Page
>>
endobj
5 0 obj
<<
/Contents 12 0 R /MediaBox [ 0 0 595.2756 841.8898 ] /Parent 10 0 R /Resources <<
/Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ]
>> /Rotate 0 /Trans <<
>>
/Type /Page
>>
endobj
6 0 obj
<<
/Contents 13 0 R /MediaBox [ 0 0 595.2756 841.8898 ] /Parent 10 0 R /Resources <<
/Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ]
>> /Rotate 0 /Trans <<
>>
/Type /Page
>>
endobj
7 0 obj
<<
/Contents 14 0 R /MediaBox [ 0 0 595.2756 841.8898 ] /Parent 10 0 R /Resources <<
/Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ]
>> /Rotate 0 /Trans <<
>>
/Type /Page
>>
endobj
8 0 obj
<<
/PageMode /UseNone /Pages 10 0 R /Type /Catalog
>>
endobj
9 0 obj
<<
/Author (EttaSant\351 / T2A) /CreationDate (D:20260421112127+02'00') /Creator (\(unspecified\)) /Keywords () /ModDate (D:20260421112127+02'00') /Producer (ReportLab PDF Library - www.reportlab.com)
/Subject (\(unspecified\)) /Title (Bilan extraction OGC \204 QWEN) /Trapped /False
>>
endobj
10 0 obj
<<
/Count 4 /Kids [ 4 0 R 5 0 R 6 0 R 7 0 R ] /Type /Pages
>>
endobj
11 0 obj
<<
/Filter [ /ASCII85Decode /FlateDecode ] /Length 2546
>>
stream
Gb!#_gN)%,&:O:Si$D="1L[Mtj3b,sN&.UWa3(c[d>KJ)WACiE9(K@fqZ<Q!JiAf)f:Mgc6OW<'!.06%C'fR)Db0oR*XR*N-?%cD!Ck(9$&D!2nJ)q$:]<D+>u.F4AXN^rXA-J[l`P<g"K6)98N6h:hFrT3>"GsuG-Z5A)+oR5`#*:2)qS3<ak*.\BWBO(aj&8`/?9Wl7DNGg^c-Jh5X<ZN231K;9E4mXrk0MRmk1fhY0"XYUYj(`cd'Rt2qP7TpcBAn9MQsoC%BHl`In?,)Nic]7mZ92hn&9n4EEk)8go`F)m/[<RT*XpYdhe_Q%sPZl/q:*o;g(#bM+ZpEdfecO`tG^mf*:Tm`Pd%0W4F=jn7j*N[R3$Tir974ES/AD)MpronM7L36uoCYEmr9KIa<p'.Vj:rg()p8S-k\ZQJLg"_!Xpg2Ls\_cA<qC*OD7GWPW^%MD*`]tR=3*LX)Kn8r\E3]W:`bN8]?Cq?0%\\W\uXT"SNrR8>9"U6+_=^[?PDqF/^/""X);TGToOU,MSc_P);mOJ'c^Ir9MrDk^'S3!^9cq_83PZrn'mtu((fNa<ls2OBcWD;T[1R\eiI.([5jg4`Z/?)>n:mQ';$5AG05J>9mEsBa<=U$)Fg7,CLDV1CG9510k]ACDa?Q$j0GOpp@pG"qKaPK1LPmMCN!O5TBj!Q!UC%ob5ZCX<T@^mn"`6n]W8Q<UD/L1tEi(ODLKJh%bG;tORjK$-F9#<X:]VB'M`,=2-]XC'*@L>''M0>X'#VP[2Cq?,hrnU8XKM;GGmb@$&(pJsoK.(,us#GN*Yp$I(j,`H9%'&*hh17:W3?PZ/i,:lg?I*9=:$g#"[rtim=[+E:D5-/c13]C_f$W3jrS$'GBppk3B`9GdZ.[%W@C==>O2X5QX/Kril_F@UIZg(hq9#a"/^b;D\$nR;]=Z/pNGt3En!Dq/7DGck>tne=s!#upDkHLb4$lFR\lP][.`Va1AZ@[GJm#</F%e4sN?DiQAkq@)Tb55u70)RuH#[MbikT@mP,6N^gN6Z;"pmDY%uhK069_;8I9LHbgC8/8-+a0!a%+tEK;@p+$s:lO#=_F`IXeTG>T?U/%rURUU5+bjK;gim@!Ts.ioRP.B^F3ERJ"p#O3nB5>;J*sX%RO*8B[Hka47#sH))b2c,8gCggg;C>J?D]_"W#C"h=U17=p0EIo2_`Gm^"kpm!;504,+78Yk>;HK'?t+'X`Z0@DtX6bU[l)Y@Zt<QKj%X6mX>_Ket@;&@&LousQ\dVaQmQKt:mDNpa+H^$$O"GPl:,sG(./T<$L.Ps4&IR5sIp![aS[%8q.ds>Z(RPsR'3Y<!jh>(?%m1W6bqL"`)e&)Pjb^n=[;u:)&IDdY+('bbe<G:c6:m3]1T]"@sE$2IX;u"V\&0J"K.&dV!3'@TSD-n=JQ3B3DJG:'bmGX!cXO/GhqG712*9`i`+]&.DRLm@bJ:`Br@2(s-@H_Y;TE+5N!(EZ5L)q$o0aG:ub99[^#oXgR!>H4Q9MZ<(:bZ!/S,k$'3Z%i$Nrcn_!BB577Q(AR+@24/%KWX;)FOTG&9dglJ-2U*!XangVL&"q;#nQTfIGW0."DCo1dp;X:]LZQ(`!A8JC&U%"]0_k;#i6g[dA5F$K._MjuFi?Pc-Nch]W\!5qso#_SLa6#N5[I@K9^iCjRGF39HeY)+K3)CE_D?$p[+pL><BW!F`oc$G8b^$u!beT[b0pM#p3cB=0c,K*"$ZjKN/3#=Yb@lTbg8AE7bj"^WAl7SAKlb]YcB-e1$!5QIT*Zkf8SjSq1^%Yt]9g`ImUk(CAI-1YHN1g&6S]tsMa;GG'uSKA*i^s*r)"L$(q6$kg'#/^X,s%?n<BF1nN4mi@0,akZUX)YZ@iuf#Cqi:tB5>htTB]mFXIYZe^I?@<WnXR@_O>bZVr,4e&_qFj@h>>#[HlGDUK*ibUG5gGZ5G'Inm4:lIYWKQ:T3_+L$S[l.H>oUl4:N[tP3nQm%3/kO[MhFhmEui#)F*!'?E])lMWU2DPLIe;Fb@rO[[^kmV.+>c9%D_"frLXUkh'-9*\6e]Q*Ejpb'ZKo//")$Psm5:dB\QD+t-O56W>*;AJbupJ2.Oh?pGS66nk8B"!SSa2>Ukm&VMokGTJ>Eh$LIF1#7aTUR65_,3*<>DkArq3V-%MGZLXEpN\!H9::ncQ04,ncG=$4S6"_6NEk=DOq1S@>c@@bHr)qI(g<0M'2j,n_\_F\VHa)G\(1=`:@@:UjpPb4bO_:t`"]H&lgqOSl:(F\N*`VMVEVab62Js&lTD10T_A(A>)r<_-@_uY(^&G)664%r9LIed96=:OWO:m*\N"*]R,N.P=ppFKU5C%fHV^J\h\Z_MaLaFDlZNK&\9cKaC;D>q/Cgc%)]Sol8F1j;aZ;C%g^0m9o]R3*S=&YP[9S"oT5R9sW9<nTn\j@W9a>1hHr#,/p)]HfF7"0CMgacBDh7Y*ZKEYGk_Ob3.0.r#''SWZEN\_gQOaPlRNIb&G*nG\\"n"Hh?[T9Fgf;(=I(n'5u=%FF_X!VkW!6#-iX3G_?PD~>endstream
endobj
12 0 obj
<<
/Filter [ /ASCII85Decode /FlateDecode ] /Length 2076
>>
stream
Gb!Snhc&8h&:WfGfU!OjB50!NZDDp.JC<;=],&gRAo<!VU$e#03Y'd=mr)bbrfPj<&oS%s:`@8%qGu#,eUB#'Yjn4Es+_8<haVS]ScRk*\d.A$/rW!1jlkpK&R4lAT&hE(n/%oPVEBS$6aNV:/mJSTlFB*r=(saR6i(aYeaJ\[\<9um.LGRR%;>t>DfJVP^$Odep?<OL2&MbM1pYq%Er34i#&^&GA)-cLoo.Wh906K?m'9_tR4g.!>?DCP^g/K<p[H@]e^n7A<cSDt0j,OgjPhtc_Ssb=(k%1e>E/.V^FL;$Uu_uXLu<ZY'8cV1_U$7K65&*FNpBdWkE6+-gFGg\ZA"M_8'+gP?QHt&@`qd5SZD$2@<o<EOF>itXLP\B]j)1r-.D+L,?QdTS$1EJ/0dIBN#U-&"H#e&J7g^FP3Y6JOH+n2<A%bo/EZ0"Xa!=pRIgaRN)Ot?)a@#K/;R4M)TK*+Me30(,CpWIKPWJA%Po4H#o$`8ZC$Y\82a7Q3-2lUMHt'<ZB9C/]E)QL.6P,k&M4C1ASa/q)@>nf=Apr6"Nb#12/P`+61X`b1D7aXJB_"j3,kH__^Nc]/5E']GJ[/Oh4&kjO[(^7OJe3`8\^m2,X?a:BZ#$i'$'nNRjUdnGipdSVut]uRV">m8+;a4oB3'ECF&DPh&U9'Y)sheT'.O@c(%fV*s/a13%!2DA0XY\cb_A-a-`XX?M<uK"OUG=B.`a"!>5T/J7_:C>:,26b2/[o,cTbQLMLGOeVDn.C6@GB:i"rR-+-9oek-gtWC>e_ZNkH-->j\m8s2/C'!NcB.?f"aO)Qt(0-o3XjXR#^d-pc$rQ%=/np`T"8!X8Wj98a,-;`43+5n"8;H@_DTkm\O]4n5CXLiSe6W_h(-Eh$%RjPUVi_:)iRI$fmY"VPCC/-U6W4C:IT]SKQ^P$6W(QX8.Q]5aog_0j^[CpBUG/s+\)JXWPW3(TP$9mP?bJr!0AVJVT?_2sBhi^;eRRHN`KN!%ZQE^U#*R9>9OLH;*?*VC);6Yu]F)m_ki[M4lF/lS40V2u%pCsEbrVI;jH$8](SRkmZ\2a$$)hE+\4RI.s.9gi=;g%Lca"NL.>d!APGL&21'0\S0Z%^*?c8lBZPBJu^1,r!C5@u@VoL,3Ab1GOU(0MOXS;^.-G>5;[!HA#iQorV99<qt)dp/i\,;?;?@QF,g-LGL]B&,Q,RTSHV3gVi"4RF2:9lFr)G5^)UXNZ,8LYj;c\NKn<q=2oABkr*"].:n.i`^1aU(u;8DE2Z_*U9(8=C(B%b+Ug#1-#]86*^sP7\f8CE"G@2[bV%dm383o?!MmWK:d<?4K[[V:3XOA<c^'$]o_I7a2'BbA+IF0]>cO:_D%E&n]RkLDGZ7g8HJ$nViXj]egf'1nlmW*\rt$EO3V&;p9J1`@':#]0M,OGcln6=H\WlLk1D;C(\UTqlnW9`bjdb@Yp8)1_b`oU:_F"9(8Xr';3%CqqhH@mT4;ZJ6"a.,q7\.)LWEIMB<".EO"(pWW8`hqNm5b/mFN9V^O!N),dNCNNo7r?K#\-DaV\`&j)4so6)H(7GF[\C(6+(pNMDYY)^;sD$:$c2Ztnhh6_s7a;EH+s_[X"`LZ=T[qKt6'gNa-71AO"lVO6e<R,_^8Mka"8g(p"FUtFr'^.O%@3<))OHkY]&"t)XK:T!/4"OBpN(MDQ:5LlKk?uN!8QRbZ1"K/JI+(N)=?EQDIGNW\1`VB'Gp9)Wmi[P^;Jk(((=E&HsrIeN4)DN=c3BY=/>g$Plb71po8rD!NU=jL#\"j;S'p9&]lma3F$mBWY6SQi0B*V"6Aet=[-<a$[dq?lWMI#3%QlSOLLL^(gcB.46*18L6VNfV,&/q'%&VS*5@0@aQV*(R\&gP2?HA*P`-Z7;d/FVa+%F1QT6/pZRDNGPuc4aIY+O"eCM,CGZ-sDS8%%>U@57)"Bp-\rpk6;+rMELLs()+rt:+tbU6/8#3=!<+RaY[,uf:67:0tlqS'o?P)8=7tc6r0q`2UH6QFMW*F6W:4f+>"LskDh1fB^4XnUh-<5=/oB:gqISUm@=t;DG,mZ`ek*9*;p*i]Lu]~>endstream
endobj
13 0 obj
<<
/Filter [ /ASCII85Decode /FlateDecode ] /Length 2182
>>
stream
Gau`XD/\/e&H;*)_/DsS<9:a5IV[OO?l6,Uo>^ibS#EFsbAM/#>Q=XmaW`0&Z7,,(,t1_oW-aQFHg'LX1dTcAPPXHJM9r:\HN'3Q6IGWc,!=n!rB#>3?N!ugF&,@`WMq3mQR!eZC@dr-B*=\.5oHFcQp51fd[U\er3A(=M1ZCR>oF!+#cf,5"h9[4HF_r"I\$mG($52-Z.SH$-YWGfXe/elpZ?hD"Mr@_S-]8qD>O/gC<MBVX*q+E6sT"N.BQ9RL]/4BcX`[jfAcd[=?@X2O,)<Hq/FL[3B`W#(](F!I+mp27`.cOBeCu@fKmT"#Eeln(HlY+8L-c1O_0j(W%kqMT:`8ASQ!@!Dk0OmS#<[29N1["++24!K_]N_cpaDnZt?^6naJM"HA;__Tm(aG:2eAkMNjb+/kq9Tq0A^51g`9.s6`AiD^($k3cA=h*,Q6)?6#uiY!D`r'`V.Qc!@_?m!Bmu+X"F'</Z\hVLcr9?SO(A4S;ASWR?-hmj/>+V=O,^f^B4?*8M]3VepF4pX-p4HH1S=bY,ePK@b&dYC5;Ul*%]1/d!hplfAUT&-i&HS9%#OIG:dq>MgD#:P%/dX2TON&GU1(a5Z'&3\OVB]ED[i?L/r!Q1NPoE*(*/EDmTc[k5'(]"R'%h`cU8(l6/S*<rfYY"`AM6Jm^]r<"PCBN%pM^,#[D/q\?bLrFW7H3NK9LMCVQL>/3$LL]_P,iP"@PPA!foE9SHAI:<p9H'NXPNoV[DX$aLgU-dh9Cl@RpWkh_(j$WmA96a,_ugV=MJ+-L>nQcSeWD75kRJpnTkcr%5Sr=o;l,tOZ!u<u#PEO^#9niHUsf2NLmR_GQ-\.o]s]S\eRlELq8I>!1E2"BR>K19F@2k7Pt,XVCEIR3,kR&8m/f806Vhj5(X0O,ce$ADS^uTLKZ%W&C2fshbu>+3CJ$B'*,0VDW!C@#[69b,,OK>1Qcu+oSj9i"r[q"(jSk6>gr+()aJ21eFu/gul=cXJ*0Z*!/PA;k<280l*+]iUI$+-3g\uXZGTibm?'1R-1]+hC):tI<9F8+#H_'bhWb/\-L,E>6qOAmn.i3Jsk?:P.2q'p_^!/37of%s',S.l!aL"p1:kReQfjnOoM-,/>_p"9$.u.dCh+](Aqaeti!9SrBbqO?of,q9n,1FJ]1'CPO%.e,]6/E1NK&kD98nn?kdi=lp^gK4$9?bCCgJJRfCj]3BTJ/Y0/^OK#;Zf%[_>rD\GotANbci>ma<0l"24FAAM';T;K`_[2cb>VJYjklhliV5e.trdf*sbsWq`o[@fU!GrZO[1PML?UYLmi`IL4+.%J:c[b0<"t7JpeaO2s_KbA+\FZ!Z&[;QtfY)q[s!Vp433<Y`G6d*YA5>Ls0ou*)Q,dp8'WSI/S'OK5ijiG\:lDI5#%@m"5=r?sdXka$(?5.J?=A`]b0S^:A2J_=-'DdK!#efE^DT?Eu!QJUk_D%g4;8I>NM;q`o\/fLI)CQSnZ)Lg]+F32#4(lq;*/\>MLe5TDCK*0YZbJAn`'"=T"QM1Ied5_(367l4>u7??Igp<A<o$@^%0U]uYFgtT(E`o4SKGm+"P^`qD9!u/Sce3K%B0L/S'"$'];YV2a91)g]Opc\M;)A)G!",t-C>g3od/;ARE:8n]-0/8Q$*sg4-q\W;_L#_]tLM,LL32#4(lq:skH#_d`:X;39LW?\2">#:U+@%[J9+9n7#6Ha$4q(G6i?Y/[3?&GVpc\M;)A'1BK5nD[g\1`"7Bd:*.#*/,JNWfpJ0rnrTo(Im7$KgsU&ft^j'G@U$fcH\"7`fJ8^'12&?H/sJ`&rc/hrB]*=0s?]BiA5(/?)HSTE2/U>EZ*Se=9MGT"m(QDi8Df/hc/Xj\lR3o"b0.LT48jjLD7IiS<7M0XSW3ZU>B3)^#[?&:VgH)96;Pq":cWiIDHWa*%pAadNiQ\nHmlKXW&3.,iu<+KpnKHel]7J>/'+L4]h'!rl=9df44G[eLC.spS.]F1RK)>:@/-kbAFH_Vl$;/_3&a:d@fdb]ojf?W_/Q-PXKDhd[^TtM&D@tP1Pd<.imJ<K)<c!''EhXO#'B&U"8fC3fQ8[C2%f>H<3+Ldu'@Hh%?gP2%NX;W-`\SD=g5oKgTo!T.O[;I2'QFDiS5'f@D2hl:n++6D/n";G`G50HQHMr+3id<J^p\XOEJY:Q.U_65k~>endstream
endobj
14 0 obj
<<
/Filter [ /ASCII85Decode /FlateDecode ] /Length 317
>>
stream
GarVIb>,r/&A70Vk#aU1DUKd;7k3FpM2-J['NqRX>h-)p42C#h-bocAQ$07bfpT5SlP)0gBn/:*Rg0"[i().KD8:A*kJa9jDe;qRVCO_p>M"hFVFu!0c0?c#r'`ga8X"U?W!,,d7lsq>fjOJ&S?kCgfN0qi3Vf3'KSQo]J^D5n&6#r*7"(I;%LVJWH6K&l@rDV*Hh"pIRJ%^$C%Y]r]p_S%CL8tOSnBir'!.j0\-5klfFYF\!Ded2Ksjq=$N($UNKpi6QYMIg:a'c9k$=en8Jt)Z6Ai+>cFFi9hh6!m6h668aJ;U[8V,k/[EELd~>endstream
endobj
xref
0 15
0000000000 65535 f
0000000073 00000 n
0000000114 00000 n
0000000221 00000 n
0000000333 00000 n
0000000538 00000 n
0000000743 00000 n
0000000948 00000 n
0000001153 00000 n
0000001222 00000 n
0000001527 00000 n
0000001605 00000 n
0000004243 00000 n
0000006411 00000 n
0000008685 00000 n
trailer
<<
/ID
[<5b68c87b2bd1edda18069a726c174248><5b68c87b2bd1edda18069a726c174248>]
% ReportLab generated PDF document -- digest (http://www.reportlab.com)
/Info 9 0 R
/Root 8 0 R
/Size 15
>>
startxref
9093
%%EOF

BIN
output/extraction_ogc.xlsx Normal file

Binary file not shown.

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

213
output/rapport_qwen.pdf Normal file
View File

@@ -0,0 +1,213 @@
%PDF-1.4
%“Œ‹ž ReportLab Generated PDF document http://www.reportlab.com
1 0 obj
<<
/F1 2 0 R /F2 3 0 R /F3 6 0 R
>>
endobj
2 0 obj
<<
/BaseFont /Helvetica /Encoding /WinAnsiEncoding /Name /F1 /Subtype /Type1 /Type /Font
>>
endobj
3 0 obj
<<
/BaseFont /Helvetica-Bold /Encoding /WinAnsiEncoding /Name /F2 /Subtype /Type1 /Type /Font
>>
endobj
4 0 obj
<<
/Contents 16 0 R /MediaBox [ 0 0 595.2756 841.8898 ] /Parent 15 0 R /Resources <<
/Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ]
>> /Rotate 0 /Trans <<
>>
/Type /Page
>>
endobj
5 0 obj
<<
/Contents 17 0 R /MediaBox [ 0 0 595.2756 841.8898 ] /Parent 15 0 R /Resources <<
/Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ]
>> /Rotate 0 /Trans <<
>>
/Type /Page
>>
endobj
6 0 obj
<<
/BaseFont /Symbol /Name /F3 /Subtype /Type1 /Type /Font
>>
endobj
7 0 obj
<<
/Contents 18 0 R /MediaBox [ 0 0 595.2756 841.8898 ] /Parent 15 0 R /Resources <<
/Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ]
>> /Rotate 0 /Trans <<
>>
/Type /Page
>>
endobj
8 0 obj
<<
/Contents 19 0 R /MediaBox [ 0 0 595.2756 841.8898 ] /Parent 15 0 R /Resources <<
/Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ]
>> /Rotate 0 /Trans <<
>>
/Type /Page
>>
endobj
9 0 obj
<<
/Contents 20 0 R /MediaBox [ 0 0 595.2756 841.8898 ] /Parent 15 0 R /Resources <<
/Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ]
>> /Rotate 0 /Trans <<
>>
/Type /Page
>>
endobj
10 0 obj
<<
/Contents 21 0 R /MediaBox [ 0 0 595.2756 841.8898 ] /Parent 15 0 R /Resources <<
/Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ]
>> /Rotate 0 /Trans <<
>>
/Type /Page
>>
endobj
11 0 obj
<<
/Contents 22 0 R /MediaBox [ 0 0 595.2756 841.8898 ] /Parent 15 0 R /Resources <<
/Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ]
>> /Rotate 0 /Trans <<
>>
/Type /Page
>>
endobj
12 0 obj
<<
/Contents 23 0 R /MediaBox [ 0 0 595.2756 841.8898 ] /Parent 15 0 R /Resources <<
/Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ]
>> /Rotate 0 /Trans <<
>>
/Type /Page
>>
endobj
13 0 obj
<<
/PageMode /UseNone /Pages 15 0 R /Type /Catalog
>>
endobj
14 0 obj
<<
/Author (EttaSant\351 / T2A) /CreationDate (D:20260416195931+02'00') /Creator (\(unspecified\)) /Keywords () /ModDate (D:20260416195931+02'00') /Producer (ReportLab PDF Library - www.reportlab.com)
/Subject (\(unspecified\)) /Title (Rapport extraction OGC \204 Qwen3-VL 235B) /Trapped /False
>>
endobj
15 0 obj
<<
/Count 8 /Kids [ 4 0 R 5 0 R 7 0 R 8 0 R 9 0 R 10 0 R 11 0 R 12 0 R ] /Type /Pages
>>
endobj
16 0 obj
<<
/Filter [ /ASCII85Decode /FlateDecode ] /Length 1889
>>
stream
Gb!<P>uTK;'Sc)J.s/8-"%HX`-182uA\(ODKr2OmB#dUS9da9nL:7,2O6lX/Y)UC,l*.rKaKf-c3dE":7#Xt;A_HBo:<9IJ3I\jOj(*7+Qjb5XSWi#GE'%I^3u&9jiJ*IcK`U:%6+as%lO?aV2r"lE7[[,4"G3sV)%oKZ,8l[;blBe9V%;d8%N[Uge9^'.3admM`^g4)UBrrjN*!(A3[KtSOrrpL*iIKKK"O<0I6g?[aQOp1Epj85(EF9:=LT]a+4>OT>%G04#SYCu['ch6.S>WfQBNg2dTJn3aMmma+c\aY'/%.'jQbY]/)SZJT`!nb4BpZ:Y$TVjf7gfL/)u:Agj3kN2ndDO]<85V9`o5V]sW:n`nA5CXR-CH0ed`DjY<Z<OXhS@ade$=>]CffM<jF$lSMa_8A'ak5<$$uVAtUHrm5Ut&=14B5tJ`-9n.;+F*TZGA/]M5PmOfU[Yl%!f\&P=CE<30(`#(dOTeG5J/tkE>\:mdRqEnUR4Z1lZXV.n$o1dd&!H4h#K%`3,8(j8i'2J<;D;fJfV*9j[+$WKg(B,+$+YKkXajTj"5]_+Z`U/[]VcL[$GXPC9HfW<r7e-nPf>+EfrrUSd4h[)FbHO@;>'.qemZ-UDB0D8ON8lWe'M(Ccrjs<XF)S>Uu(/K0FNSNTg!^"bX>PJVl;Ha[no94]`l*mOb!7;'NHPkN&Q.Za+9Wa+,BB,^7$A4#$,#$<q/ni+k\)MRO4M=c$d1U@*J$ORn2IIZ\mB!1n!`^&<&2u%g#F'F:aT=Z.!7]2&QK@1h1&L?m&/2&/$$J]!p'BNG$KrZA1[fX@\D4"F^2W<KG)jB!KRg6&Al7k4.GK1L<l+j88(O5F`koEet9%o_@P56Pc$`*[XRd?70r4B,gjB&OBO;:RpqE$eIB]!We]_@mFUh:<+;oj6iT70oZ`6%3?2^pr."f(8)lI/HJ.>j?%=4NJAPRbeD;b"`-gY$!G(a\kdb_1Pc;oRCUS*1.Jte!_r5MaM\,\fijMdbc?/q/_ZGjbg_LWpG/l,=M(CsaC[*u.OZ'42FXTFfj\(fR7Y(!MIdNu+8%*3Q;u_F@>dR>EEnmR7-&TK.LX[E+=dP!\msPs#c[A*c?^lH749e"&m\q?JEa<0HPrMZ;86lfbQIFid[J0SqnQGQ?Np(7_CG.JAZq"C5.[>'$1=2fLT7JAS"r&IR]j#d$+DE@75;rtFek&'BcU68Y\G2VUFRB,e97,)*NKU!WTa')PU-;#q=:N;MK^8>UVLigIIpqoB^$YoYS?X5?!H'`6RGdJ)!+QC@;Q8&h5-D<2o_c=eeen'NEEYR(Hdd_U\.,A=&i;Jh2Pr%LiaoIh0_oVoIfNV-pI\S9HHU*n'=bf);.\<g&T(U[lm'IUu@Q-?Q?ERKi;mWN7q+n<GnELQc%9J_mefaAGG-@&!t10T8/3_ce%XBrkjfm@6&,//*sc+_LR?q86F]4js%0>dH@Q9s8#^"M593N1md]F6Z]4h\4#V/E/@Qfi"E$U_.CCPoAgNWaUVQ*M<6R&*aI^sICR3Eqf%Bjp>N;Yq3c8[Ugs]_@Io?<;L!/;e+_f6VsM;I:>(EG?KF[taaW33mtFC[,s-';;7kP@9-&=tM:;4X&uY*6,u3-Kb?j:C\m?R0_/lUFBoe,IZ,Fb2:l,kZJ.a6r_.9b=o3<c-JDc7upk6\4,Wn&3%jH#1*^o"@4c&G>I\)HC&eI0fkY+LT*e?.ugfL)RY:O<n3R7X\_g.^KVXJ%h4/Y<OfJip_YB1b82-RAWV:cNCHAf!gPi@ZY-8,6,c.q>47;F8\mWf`&r?l*tnXq?>_Jp\*")oEU?e.YKVujd<c0'qc0+52a8E[WuogPRSk?R-(gA8*Oq]Mi]$-Ao<'T2bb!0.Ke"1G1r\G~>endstream
endobj
17 0 obj
<<
/Filter [ /ASCII85Decode /FlateDecode ] /Length 1999
>>
stream
Gb!#^?!$&E&:N_CbY(ab4k+-jfp3_hO9Jfq=U=oC3?45"RQ\T_:8$?k?ce>CJfQ?T]]CDda<P%tl&ISFfa(9$0`=/'!rP68rQbbj@<`;2*=9V^(^tWfhSEbtf5nTT#7-oZ%L-74n'bkrn@:%Od!n4CU].<]#WO(?40c>W/!()YV#gh8$%4sgqi;ZFI$SmVYGk,!YU;MPp!ndH/FAM$ZL"khHd#jif)oQ"fgcA%2nKHUZ.#I)>m8p[Ec_9onH037_sjE%rMi(.Yk"?8,:DNp<b)o9K?-"eRC=Ckl0of<,I:E]0"<-kZ9^s`$2S[]E'60@h1NP_mD\2FqV,Bg4rp5cSF_0CQT)OG?GZTj*]iNU5\fKQ'GmnP7qBo2]*E7s%uJO#PqU6co&g>pHb]1eh(;()>LMF]]TNJ8iKQ0,$_QbghU!S=PtU[3>a":nFH7+Wfd"&^m?'5M$]h(a>BhD&fYSjpJ`!@q&flYnOco-o6+94Ecn50XKPTP,,[:^qm)"1Cc:IPd<F7SuJ*<Nn4-"pZH[3!Y#l#cA4rI$;97J&B8ma#&;.D!]V4H-GXLN)H[+q>gkDD]pEe@,I.gB;%%6=m"(j%2_kR3eg)\,<1C^L?h*7WW!6H/AnbgB=8?7>32H^VbgHVp^M%[3;;knrK8h#;H8rB-\?6q#r]<sbX7Es3nJ$<hCZHJbH&7rWSCrl(!@pSIaZIlGh`',7DJW71j$!uKo`1l(;8+pfV)rSLP@^uF7LW-+gKHRA"SG!n+)=_6X1V;6m)[YlVQWbmQ>:;E-p':6nM<L353BUP4@V\s(K;dJ9fl%)K\FDJHLeDh&!88I_A55rEa:>djfeAD#tHC#=_<-7R79'uTLrJaBr4ukSDgb)[PmX>dP_"RPs^_IgK%8I.@KCe'PEbY")9P@ofB-%US3K6#-r3dWYi(RforA\^a)/Ud?hF&UK2'L;I>I@#@\mekb,[!X!ADJETY=1@A(C""MT<aEI]G;c<*[HI3Z2la$MF,U^2&8d0F'K.OelX2?fZYj^)iLKo#ChHVV`DC``d2@QLNjTt$e4J<eAR'k\87JFQ0[FS2P3d>A.CQ1oB/NrDa(u'7d(][(r=9)KP8(j3C<M*g^'5uQdO2i15d0_NgJ;E.SnI`!d#a&0^ouNk`TKG*(LPd8Yhgms'"7hZff23A<#R(4GlW@R)Uh+e3(`Z4?%Z-ZdJA$MAK%^n;'?pB[,V<Q:3dZllrY@kCV7$3O9+*>W(A<O1QG>=]uqh&or%hCWP/`YHDBrk+:.dS,:`]5])'G;U@`qP(#=[Xfp0X;:=DtOnM?1Raf&e7--+R/f">S=mF_gQ0Uss$]4)6dIc[CdZ1MtV.Jkgi=Eih+'OH,Onn=5ec'*3H_gA]Dp2tdjljKH+'K%fc3jtrBZR@i&c*Y9.3jr^A&$BePGC)I046UU\*n?0iFr#RO/bh2LrcXDD]p*[9#.p_NDjtHSD<?S`8i*XlHre?;3-OgLO(d,>H,YVl<W,h3Z<JEQEAYrL5`/`nQY3HUS7ls2l$W2UZ4/:M82Q)f:M7DiXm-7Qul<g*[Vniau5FnC#SaKphCK4Lb[[O4<eefimF]@,p"YVR[KL1HI5uA,[6/X>I$RamR+XZT<'.e_O?n%JU"li.TGIm`;BA@$IZfXVpT1DN;!k-dQ%ieJq\rtm(u(V,'"bDd\puW+Z4,IJk8(-9Z"hfl"EdnCs\#!9+Uo@,*QlPkOaubHjShehCcaA-s:W,>j0eo!R(@#?hke(=/]9F(#2SoRqYB.^d9qg_U='Q6mgZZMNL6^b@D*<-YKmAd9<e8dsO+.&XdGmj[dfG&*]:fE0=>!R_?tVpEJ?rWRgT]hE6Oo^AGl#T?`c<S"Iu-J]pL)l8*Q_0mRo*=#%h.8QJOX<sj369`SMg&$O?q3Xr1;^cDq+d(h[OPgt!I>$jh93Xr1;W3`FaW,nn6W&(B4_b+;-pZdiQP9bR[/h`HHE'MF64gjI,dbao)6Z16,Fb$%_!0C(FnG~>endstream
endobj
18 0 obj
<<
/Filter [ /ASCII85Decode /FlateDecode ] /Length 1645
>>
stream
Gb"/)9lo#Z&A@sBoPNtp,3DO*LE'hJgMDGFL"P)](Br!B>Tb"3SG`;U&KhW8#Oc?Y/T509_pG1Hf2"1scRU[lrkQMQkoAV:K[(;:9H\]_bVTN4+2%+0gDSkl1l,br`5Z1'=MqRUoBWnh_h\gWBTunq^Srr?QqW:siu.TJb:ku1Euoo5VF:b`"?>!jE#340V^mRQjNAsn@7#bVd;usj:hHlg3Ej;u,0Q-oGlck;KHC>u48u12`ooTC#4(/6/8U:LK2k/["Vg]H1k3eY3h&qdB3R>54>0`.R!t%/Xl:oD%Jk&K0@;=W/c!U)P!#0Z@RA(uJRps'B%'c=LsH_Pn76Y53/_2thTWM@R%.O@N8PjNUY4]pHUD\8'sC#Cob0#.-bTDlORg,Y4YjV76t(?-!nFDSdHSXt3&B6:E8)X!j$@P2?mZ+e>DV!$"A_H[b(*VsZRjj_:OFTB@sIdaSVkI2%Q<V7*:]!`jC=ddKk*:bjLAi'S(BC@Uc-]%B2kAP&^PW;U(t^\D,s1)lGmfbQ+D>88J6[UQuMi5?HH[@mVV!!al9?lWYTi)oOX>!=Zhbor*]&iimM[_r+^1%G(bF7/-`T@o6Y[k&%]M9Ja9g)6iR-X,@V4M!S*0M?I:N*`1D3ZCeTg.$A(>VFnio['F6a$ZsoX=h:NRE(BQ>"="<8D>>upWk:q]$N8bq!;]6q_(ck'![f4(e3"3SP8`AN;(>(2QT9.He_iM`ccAESCT+V:Eb>B+82<^(:*VQ2m6/R5X][<\@WT8l';B,l*30HW?:^VaiH@FKcqRf(QK:]92(a;s8YAXUk1OO!.ri.\;E^2=%0dRe@_hP:V(G&Q>"Y[M;?)Sr9%RiYj?B]E^;)TT:QE.aKl!eqqkn`*(<",5d+p[0V#b%u,8ejR1,Y?E0:SLuj2WOidhCuN?GnV_s0+gFk9c*%N?KR75X;h_h)hgm"e]fP.T3/SCfZ?Q\6KG@!?6)G:#8S8%RUjMaD14='!AKRt1f*-'o4"!S\t8L_r,]G?+^4!N=M.PBAu'2-99MTM2d!8Q`_/`)_Yre#<J:.<s#loeeqT9=kMZ21U[YtH.d"?QW>Nog<1)%H!EIuGHP?.N]])Iq*W%0IgmWnhZ"F]edUZ>tMIC3S8B&N&V284C&]<$b.PSfF1ncB-["Ddg:tRi@Ad*gtK:l9WkW8dO&teTGY=@CRkN-]s6j/0`Y\!Or2'n7H-PFT$<ip.j14i`(X;/l]Tr]!OrXGRFO;5ndDM>Be:hCdTAY^'`i-[p%*C8R%Bb1KoGi3E"ZD%:17ZK]bgV2/.T]^Cf-g.cs4@K$=C1j6Z?eftDePP:dU$K6J]jMh)i4*[.lhR7+kF@,KW#Q%/>k>KToKIlq3j$D&!^VR!R*aKibttIGD)=.-5dhehg/MXGC,NI"OiF8C_n9oI:%:\uru.Bde^8,JXiAq,CqlL[L@#XgD!']C'P]J5'#e'3[T6BhSZ3sg`@=lQ,Vbfi<K_0.eVZt>+<#Y'auk6P,hE*uPEb.fo3-B"77jWo<[]B<!=0*k_"!22pSZGX=in(f$ABZa!+KgCkC'jd[7:]37K[J36J!nkSkc(2TOOljZ3h,H5reqo^i^[FgRIZ(FJS4THhU9`Q[O*I9tUCr>2*mTldcisrW;#Qp!`~>endstream
endobj
19 0 obj
<<
/Filter [ /ASCII85Decode /FlateDecode ] /Length 1482
>>
stream
Gb"/ihfGM_&BE],/,JXV[q]o/(^B,2+'^)u=&BW_qlo1?kE-H-`B#`#pZLEBrWj?G2T'(o]HbFXTp_eVcAuj,,m'2^bl>tT!1tM"?6CAEkT5gg%&.P,UWsr%gg0/`M[M!G\;M+0/n@1\[Y.9o-9rV4F&<uA@LEP/LJFlG&J(7aQKJPb5,&;J)"'UZVs:\%7ZaWCC)jjmeuutJr7\g7033NIMfSXR_XUKHb/L48jkA-!b&S'e:.tlHhea`'%$DTjANi?_+7FOIq.fkTG;-EFb[u.\4[b>BI8Ko]jbr10p(?6)#gd,ukK"PFEcgasHFSu1(me<JOJKuFR4XlmTGN,1>[gM5a440up2-+5@(o7rnTn\&'gjVaQQmC__\TgmgaD?&!Rl7.\PC5`,+cMe.YqC^L1^`[SKRLJ@\.,P.W)2;?3&/OP&?FBrNplCjNb;=4fprFWt]/ARrth31HB*T2R@<n#(p<nSMuP+MG=GBHb"1rX*d-T/8loTd4r<#=>p)Fk9pDT?1qR>SNLsa=NYSr4PNH\5Rs^B,q""p;A\lY8*8rc6+6IkR?7j]g"IBUeh%_LlYualh=iiumVVVs+WMEti,0'Wm:HFUQS(rG9,AkZ+Y*P^U*EH;N)Q''0?/fca,!@f`KdgQZ6Wbopp(F=CKHJG;;K1['m11t.uT`l*C@$:<iN.@7"%LYSk_k3]Y5^[VGi^&rILuM]$d\M>[;]B**64121DTAc][2N9!_8!j0^7'X_d-<B"op\/;oj7\nRa.Zsr6+#G^4#iks]@?J+`>YJqfN$'sddf\%Us+B*RZ;'rcldca+cSM$).m*$W6TR1+6lr33=SY=gN#jihu4Ul._SmF$uLnP3#nR$97))VM8$-^g+VNeZRaY:M@8W-j>.:[<!C3%Ghf=8-<N$,KE#lVgd7DX3o(Z-JH7_VH&R+;qk+>bI)Ad$m9cl;eu^k^b_^CS6=[0=rg3"C;ergcW;W93]un=YnK=n;*]Yu5n!+:aN3)$7//EUD7H(Y%.kPqMBI^+q!l?51m1,#P)E_K?9Edc.,'"C<jr<6cF9)&D91nWI<H>.iAEV:0Z\iJ@W&;9^#>Zis@R(KLX;U*G@NMC'lN+]66G_CGV]1?%d2.#XG%P\M75XRpd;o3e;h0N@W`g"9WaPAJJ:hM@/:a/)H5)agN7@kAX8fiZG;IKCH5CeqQIbJkrGg"8)"F':J&Z1]%[$N#c/;&JAAlm<]BIP;[ioLF@TkstQL*0(8QkdSo4m8U7O6=^NW#_LF4?nd.iET#$0^_c=C4?JG;hN`S3*8gc7T95gN[9`U0a@2$5pA!u)TjMkg->8=`>'tMkr>VM)jh1,O@56%LT,HKAc5iN+B(c:uXe([kT=+Hq`Ffq\9GVYeK?o3TO3b8laS22H_Ir%a?hAM^U\$u.KK"W=rsJIo'a/PooR_"3?N+C&U31h&CTu"J;UNU7F.70>mjB*Q2K>/<I\#Kd$_>$5/YbQU~>endstream
endobj
20 0 obj
<<
/Filter [ /ASCII85Decode /FlateDecode ] /Length 1477
>>
stream
Gb"/)d;GFE'Rf^Wgp_-q(,H%$bX3GM9c[8B'#7CFq8MYG&Wq^R`pN3WmfhG_>dC`S<*EAA8auL1G7KBi1Hn;?;"6uss6CJO%l'#-&g.nJ7j,C;6gT@;O8^&[j-^*M(oJA2E39bt3;17o_G+e/*:V$kPMjhd2,7TS1s1])Q3t2l'[,JO]I+K]&pV(*UrDYA%\mn(FCj%rm`^oPA6,hXbe3VS3YIpaf@e5\ZsH^%?ENlMRnU1qP!U&cQuI>h:1Z^fYf_9bhc']q]4N$55_m8GTbj[X$Z"t&XK#He2q*+UC'N@pr_VH<r!`*iOn\raC>&,61jO4W@d4;16l/>.#QahZZQn'&hjH)ZcZ[4sXZNfd93AkedS1m<Tfe@R&3.6r^ph#Q+qEG]%H_UO#-m46KD3[H$"m$"4tI]CS=($O1's^\"RbX%Y8DmHbjM4^]SQY4bU4l/#`P.:9O=r6"aScIl`D^9`)%R*.R0)j8L0"*,&$?9HFs&q4>#hE?^6Vb]SHUa%g7;_0ngB3X:@e-FJ#]oIG#/6+F1g@6H`]O_WpG:gV\?,XcqSTp\HCp6h3Xm";fSo*n+r5J`W@AeuJSR8X=;l&gE'a.<6<"646pVA(PFdDR7&6L]Ma'V:e%,ZJ/0bXREW*G.4^PZJQt;15eS7;>lsG0Qm=]_=XlBaieBQ`:*Kq4Ar7*+W&1<2GuC,]DS\1_@%?:b6B0gV#&qQ"KKI%Xu6CFO,HqCktt!CH3g!?#^&j)KZu!"Ei'npAedYW;@d4-']KQ9r!^GY?nfn<N!9@D$p\TeYLSAGNd_n:0^E[J$OBbm7)VH8F,mXu:C>Q-lO&iSfKdiZ;.AI=MU&0")rFTu4]DU(Mm&Jd2UBi_#Jk5.CX;)Xdir]fm0D](e[e0t,sif?GDjgL`-#/DG.HGQgb,bA1:PHoB'+8Vh3#6RDDr3;MsHD9m;fh$[p<6_g)dQ]2C1[/Vh:.GPNI/]P%=IhS!FV?M<E/W\N'Q4%O^u2/ssi;b#P^[I'lajaGWdQ))p"#e;0e@`gDiBG%OPp(k:$RnKg'F1!o9C".jh]PaRiimf/NE\r2`$P26OE$inaaQ0#6Ge:\fM!0Kjq[2N<a%2YsFnJ.EPn0&5&P<0#$"\]_O+"[=trXL.,*UGChb2`c^*4U%Fd!:D*71_jH9#7'2K-*(EL[7HlZ\Sh+lO623I?j+(JIn[hNn4:8eNU&+1I<cUVh=$[">Y4-P,HHFHX2f4aRsmcOpN#-Y$]K>C0a>ZbiC74Mje-S1csKoK.V71Z/$1r-Rt(9HAL)K,2P/8\2Cd.*Nn(PfiMH8NVjdJ9NNl+Wts=2/57qD(gOD`2&ff,_);,)\n5Jlbpi]/]5Z$E_)3_bI8[i?d3h/G3h[eK$+amGXRaZ$_)qP^F\MIdWB3SCaS=\a*D%u6'u.5<Ja&I\G\=qC@Vl)j:RLHkcm2DOlZ^]$'/DO\^RTp'm:!998%WX\%7^@!P0lrX~>endstream
endobj
21 0 obj
<<
/Filter [ /ASCII85Decode /FlateDecode ] /Length 1575
>>
stream
Gb"/i?$#9h&;KZL'mnQ&1Tg2iZ><h-_DP(TLB''SR<Bo9PWB[;#u!):Zp2;<+3%c[P,q+$["K]`/5,m:SX&Pi`X&aDi9L@');rODg(t%9+M.m>%Yq+j8_3aOKpsk%F+e':+V93W;FiZ?FZ\fe#(kkio[Q6_$Pm\'((VuS-^J2j`6Tn9"*@TfQk")dR2<h!?bkST#*/HbZ:Du"lbGIEZO?2Z9lM26i%e\(=$^C?Gb@IGd.J[5_.PeU(ViC[_GH!V",=&$iVp0P<.D@>Yd!Pc6SkdD3&EFke)*>F#.u_6F),FNS2)l^lit$82rnC'!f@eCm:@4-HF;@HaGKbOA4$4tYlDD^A=^<j/p#:6!R/GU7WMW2mcQfAk<Dup3D5[u?_=2aO[&$8j^.MiX.e;+pgS3-0TH^cW>ac&\)4m09q_)`Pf?RJ2<aKXBk.Wu'N(Fk1,#<1o6bqUIpFn>L8KRm2I`/d-t&mEIGl(BGK^km%W`bsE')LBQRI:)<C@?XZsf4!R5_O9-pS%TcO.0l/:^(/JGjo1OXWR]9!BK&jAP<iC$Z1$6!rM:ii![Np7RU707kk!B[famHGaIRV"VG]W'IJe)@9QFEi%O*8E.ij;a[!AZ(hj%*9c0),D]`p%^IVJHg"cHHg9oP9eIFIBA-Jtp_&SG;Z0`_NbmFl,fS?XX6\28[3.-+7ZH6##sjMID2<'%`$JZX^*)YEUjZD,PIW8DBI^A<l3=gT-+%?C,i*a?a^i-\XkhD#;N+\:VS4l!@aU6eF:1rk!Ro_D3?:=AomnI*nl#!L)ma]rr,"Q#_IPj"jGRU0rL'P#ne1JKgZ]"3VmGn,gmp%H3cQ75o".[l%A@L@C^;9Q@&qO]1+fBp=nCffMLam[FLI_%Zh'g>I_JdBmH62&\m4=Z2KOSZM1(j/d-4l?o;-Ga=PH@=j?KWYa-IBVXP!DF03aGAJ!;eMGuqN@jqE\S?#I'f2%I6`'.]un0Ti4UeLoB']?hOO]/Z7$<4[1XljC8MV4(s32nO=2M]%k]Rq7q%.+HLYQS\ifS\Dn$([TZIL&uiP^batsQ1/DXD/co^f?'^4P`;fO2g[B^6top&7m^qH@?ee0\"GSH0T0@1JhaQs`gBjXX<gPqAeqf$l%ILah'`_([pZfrNM\uT%\&L[0't[71-6_[GV(DO<-a5*S$G147MB0;0q4H<+;HmpTbpLTjV@D"!8'Nq_ZqPim1Z>%Do;l.;jNck#N\jTH@S5"WLXnS/lgF78BFV3lGTNZbG@=RU?Lb*\5[b5$XB\eO[]]_I&[_qBd+E4<a^o&d[CNK&gjmsm/P##2U9%XV3lHP0#db+>Y7O-47ln!V,!!4,;L<L<FhBb&2bI%FX^dJA/Y1S<Og[N7XA@_(#+l>?g(XG68S_[46#R(Zs(Ws(nq?#Eu2!.)(+UP(QH#Jk(TdC3Z)F*B(M9:=qtW](srJ^Sd/tm-2jo,kc:iM2XU3Tg-VnLD=]!@%V2ifR=;Wc8"8$a[6V)kP%Z%?QJgJ[pO@>E#Z.LWOS>mc/Q*lmr0h3f[Z^,uWiL:0[l[JpqsBHC.3efhA_P^gFdWH9^Ap#5pLj~>endstream
endobj
22 0 obj
<<
/Filter [ /ASCII85Decode /FlateDecode ] /Length 1164
>>
stream
Gb"/'9lldX&A@sBm&a![_-.ub3okgJPIM8fNK%Rsn:eG!6RKfO+DlUW([q[>1i<FPSTGd50[`S:o<Ye74Tn4j(B9^OJ:S70$O#PKhZ4'OJ:A"q^\>-kRus!nUuD`tB"!7_.[ik96eU6-$Ks*rNHBB3WAl0t]pRs8*/&s!j!Y.-d=EQr]6BJq^G\G1d59oT?;hoi9>+&F\YL;d%du6Ri.-GY:r%Q(5_<Qc5-oe1\"&+5/r?u9_.+e3gWQW8"Q+ejKB5.#L.Q!IJH#WK]0-$D?*'F."b=>kJ@7/-7%oH)=Qg_e\IBFRdO!p+MM"E$]M00=`U4hc`CX9#oWSlMW^B*4l@:iA&o\_bd5l0gJf]GB&B.cd`b.5+&ab]srKNg<n<>6X=dQ0X#FbNA9&Y.S/lta47A9ro\QgLh%N_/gs$2&E4i>rLEH%OVp'_VK(NkPMW[rga0VaY6:!3?WNEqq%qq8-A7Pp1(qH4,$CE&ob=U@o?)k^YB#uIZ2TQEf'EWj"ok"3%o:VQWsq*kji@o_Uj))\?tRiF$F1kaquY^RabQXk/&<o"2M1l]?TDD"'`r,?^8BTWiZcm!?c.SWVo3&V,eOj'aB[H9`7Qqh7=>X20M-n+XNOAON0U!I@PN?>Nn\G<Pj8D`JFKj*?qf7IL+FT/#M;+m"*=n)5A9%._o``[XGd)+^HO!^XVq%1j/\5U`HY&5RlC*_7AaWLsi89:bX+FS!!N?/F=oo\u_Z@i9Fs2(kV(Yk1C5^ah1B03Fe0%&'F[/1F20FNA`D/%K&?s4,[.4dHf+XItU?'6B`XTeD1o#4&pYP$)L-A&L^[&sW)l"oDkB/#cZ$pEKm%hm9C;u#:2#K&0.&m@e]o4`D*komQK>_"p*La$d*]9D3#\<p'1-JnEW*X(oL^RDa+W-HQ70HM4.Cdf5n4Re;RSC,'Go1s/aoRJX9':]^=mT=Y!]V&:[c$;mtjgls?oM?6t?qEtW[99msD"NW1@2^tn4C66i*ft"GZsgr)Wf4K"&B.K^[6F`X!U+dG]P\Obj,NX+?)3K^a+"oi+*<X:WM_E@P&^r*@bp+i,IUJ654&S5gJ??f\HPk?@Dt3(Flu:U'i0\:9r1"+gr$(FjPIMkXc$pbls\uS6oDn50N]>"gVZiF'^G/AB3St@rsX3<!FE?TNW~>endstream
endobj
23 0 obj
<<
/Filter [ /ASCII85Decode /FlateDecode ] /Length 1031
>>
stream
GatU2gN(as&:O"Km.@,''P#7O`%\hX:bKY^cobp;UWQ1Q7^cQ-9_j$98n'2_+X,m6N9sp>ffeLh$@rmE&q>0/n8\k3cNt-idlELPa^P#H?;HW"NlX8fUe+_:MSQ_I$)u&S^Vb"W;LBUKA<[f'1<E0Mc3l=a,HOH@Qia,o6;Se-KU;mm;453Im=YWjpp-/D?J&2DIY6m[!<*/*q\mP*DdXN<`9+rs<Id^%AJQtgOms8trQn(DN]u`SQ5-A3i13iqiWFaEl_JZW&_qaMD>'c,cY-?a5N,63HA=\j19'h,p3D,hV*i,9K3ZJm.+sLFjtC&3Dj%HW]2dh;N#(O2jE1I6H;8%h('8(mR\oT>in`sCh]f?AXcmhJR?P2cpS/Bu$g9q14\LW9B,H\@hHta2[.!2%>1$TU!;u\Z$akV1A.n>Pe?5n$+lNt!8@?3WfU;uSBXJ-N`;;,$O"Wl]S+['OPGP^YF:A,Zig/o-;o-LL*2@&r8onZJlRb'DTlS#dn[[^R!DTLjUF%IJ_0*qTENr.2Z:E:rIn&[I6dho;1+RlA(OPI28f5.T!Wtj]DaqoARH/Yi(Ij>)ODm1S?NV5T[3!sl@GoDb9:3ngWGQ[X`*"@s<O>i/QhCc3ECMJ;bmWq#^4,s5oHN/8<]Z(5cNB7@%dCT/)"#4=\>j*R0K'@=576^Zlg?14!bC.*1#W#V4?X'Gr/s/<`X:0bZgK#dOXF]1([YqIM'"AK]=[r8NN9%:lYB/eNYudKfmu2q6uWt:s'E!En)8(J944_T'J_"YU9.SI+:Qa@=s#n>oWYsP7d<C2)XI+@8271k.hjn;Ya&BrMk7;^dp:V$,cS*>_sF5[:&NpZj=<T?Q#*8.O"MM4!XgtIcGl1Z%rCn0NQ:jo'5,/9k!q+qDNOc-^!4BfFbDKc5rl&jR5`BRE`,"ZD_\4Ln\^D^UN)<5DFOl8m[aNFC[?LmqLg.;<7j8qY!'K-qartKi%a/]b.S,oa8Bd._d'K_r)9jU<A5@Y2;J`N'U'`_Z](t6J>8a1H?ud~>endstream
endobj
xref
0 24
0000000000 65535 f
0000000073 00000 n
0000000124 00000 n
0000000231 00000 n
0000000343 00000 n
0000000548 00000 n
0000000753 00000 n
0000000830 00000 n
0000001035 00000 n
0000001240 00000 n
0000001445 00000 n
0000001651 00000 n
0000001857 00000 n
0000002063 00000 n
0000002133 00000 n
0000002450 00000 n
0000002555 00000 n
0000004536 00000 n
0000006627 00000 n
0000008364 00000 n
0000009938 00000 n
0000011507 00000 n
0000013174 00000 n
0000014430 00000 n
trailer
<<
/ID
[<8b5ac18869754bc73be1f4958d9d786f><8b5ac18869754bc73be1f4958d9d786f>]
% ReportLab generated PDF document -- digest (http://www.reportlab.com)
/Info 14 0 R
/Root 13 0 R
/Size 24
>>
startxref
15553
%%EOF

213
output/rapport_timing.pdf Normal file
View File

@@ -0,0 +1,213 @@
%PDF-1.4
%“Œ‹ž ReportLab Generated PDF document http://www.reportlab.com
1 0 obj
<<
/F1 2 0 R /F2 3 0 R /F3 4 0 R
>>
endobj
2 0 obj
<<
/BaseFont /Helvetica /Encoding /WinAnsiEncoding /Name /F1 /Subtype /Type1 /Type /Font
>>
endobj
3 0 obj
<<
/BaseFont /Helvetica-Bold /Encoding /WinAnsiEncoding /Name /F2 /Subtype /Type1 /Type /Font
>>
endobj
4 0 obj
<<
/BaseFont /Helvetica-BoldOblique /Encoding /WinAnsiEncoding /Name /F3 /Subtype /Type1 /Type /Font
>>
endobj
5 0 obj
<<
/Contents 16 0 R /MediaBox [ 0 0 595.2756 841.8898 ] /Parent 15 0 R /Resources <<
/Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ]
>> /Rotate 0 /Trans <<
>>
/Type /Page
>>
endobj
6 0 obj
<<
/Contents 17 0 R /MediaBox [ 0 0 595.2756 841.8898 ] /Parent 15 0 R /Resources <<
/Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ]
>> /Rotate 0 /Trans <<
>>
/Type /Page
>>
endobj
7 0 obj
<<
/Contents 18 0 R /MediaBox [ 0 0 595.2756 841.8898 ] /Parent 15 0 R /Resources <<
/Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ]
>> /Rotate 0 /Trans <<
>>
/Type /Page
>>
endobj
8 0 obj
<<
/Contents 19 0 R /MediaBox [ 0 0 595.2756 841.8898 ] /Parent 15 0 R /Resources <<
/Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ]
>> /Rotate 0 /Trans <<
>>
/Type /Page
>>
endobj
9 0 obj
<<
/Contents 20 0 R /MediaBox [ 0 0 595.2756 841.8898 ] /Parent 15 0 R /Resources <<
/Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ]
>> /Rotate 0 /Trans <<
>>
/Type /Page
>>
endobj
10 0 obj
<<
/Contents 21 0 R /MediaBox [ 0 0 595.2756 841.8898 ] /Parent 15 0 R /Resources <<
/Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ]
>> /Rotate 0 /Trans <<
>>
/Type /Page
>>
endobj
11 0 obj
<<
/Contents 22 0 R /MediaBox [ 0 0 595.2756 841.8898 ] /Parent 15 0 R /Resources <<
/Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ]
>> /Rotate 0 /Trans <<
>>
/Type /Page
>>
endobj
12 0 obj
<<
/Contents 23 0 R /MediaBox [ 0 0 595.2756 841.8898 ] /Parent 15 0 R /Resources <<
/Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ]
>> /Rotate 0 /Trans <<
>>
/Type /Page
>>
endobj
13 0 obj
<<
/PageMode /UseNone /Pages 15 0 R /Type /Catalog
>>
endobj
14 0 obj
<<
/Author (\(anonymous\)) /CreationDate (D:20260421112058+02'00') /Creator (\(unspecified\)) /Keywords () /ModDate (D:20260421112058+02'00') /Producer (ReportLab PDF Library - www.reportlab.com)
/Subject (\(unspecified\)) /Title (\(anonymous\)) /Trapped /False
>>
endobj
15 0 obj
<<
/Count 8 /Kids [ 5 0 R 6 0 R 7 0 R 8 0 R 9 0 R 10 0 R 11 0 R 12 0 R ] /Type /Pages
>>
endobj
16 0 obj
<<
/Filter [ /ASCII85Decode /FlateDecode ] /Length 2001
>>
stream
Gb!#]gNM:1'Rf-po[^Bb`K?0u2K-:U:-),''%3\Z`?N.?d(quW9W*A)OtFiiYq4gI_?s[m[*RU?SW+cuWs:)G*t!\XNR5X7JdA$s,9e[IB_2H;7_Rt+0p)MMO[2Huj>%mHaAbCSN6CAV;bnPJ$`^cS$4mb?2'@F(,EMmudo<`9VW_hU=fn"U/XjDB/10uGRiG.D[*=NZ#2K;No_^4Hd.;bLIA$N;r*d=p9ja[C:GdBMc@%+[o=K=UEMZg&/$6;oPa0rqWb7sl-moE$[+8#dSg,?oQsB[rJaOpbI7YN"T;OQG/f*5N6-q:Xs1+J8X?InCs)n+9[jVgq`'foeBr5Ied7k/n+A$iN2101iaKQ*ZN<6RF7a#42b@)6&nXEf]Nks1lGs@]%j[te+#f7.n_F^(*$(PQt9c,0UU-q3Jf*&HSP,d'LBu1aakSt;A*'M%#,oOl[+TJ;+,$MUWeZ0a6$p,LG%Y2Mg_m\n&:ttYbJ[VWN5U1$d%1hlq<tjl##bcuUl8<R)V'gc)SiuO_BC;<e8@*sUf(A_lRHM2i'C7?^]q+j@/#tA,Qc8p74;+O7c"<9F2e]gpbdQVbN:AS=KXM,c#h[J/RQT[]`H(:Hn5aY[=/J9*>Xa%mQ%qk9_5]>qnpcp\L[AogLa=bej=a17-3B&.9(t(UbMW,)Oe[h\fHPT7Io^M(bTVQuoUnVcR*I5j_OJXcXOh47Qmp*d;f"MR&?)"lGOso`3O&uJFEb0bCi_G*'l"W"N[0-GJuX)qQE+$"T'fFh5a1Rn?`4Yg>6NfU]/$#%W^+qWY0)iF<B]VgZY4Nl^=4IG<fXc-rtmhK:.P@U+1,pLE130O`1/1DS%raTIM6UfHoVZCT7]MIBAa?jo@ro!dVA,kZb<=1ILfF[QDo'W%i/4nE8>tJD>d;&X-;4AD526sFq*u8,*pP7)E#=+Z?'S@TOUga#W"ed7PW*+=T+@m21:G8FQL?-X@X`BPA4Ck^",VM)4%/l.(*oGe16G8-AF&oNm--)aNE%%O`@G)#]eKGe,u#=WZnsc<MkOE>;aAhU/e!r_#^C+$I0B:W>Bl/hs\#Q8Z9g^YVT+=84fVrcu/_#ZZAsCE1b38JUP%G0$89OS<("q8Mj+bT*C*8iQ'>Bm^^:JS4(IaAHes#j%.Pf>WDW331^"'HQWIo,`YMn\<FW`6F3e?GB`cRci%U++:j*Lgg"C<TeUmt/?:3[Bd=*&3Jr@2*:#;J.`3reS39PPR_ls%(cYFOoXOQ:Lr1HJ9Fp/kT]A`^)<&B0lhsRMD%Q26Bn=$<LSs2k0ZW:XQHWRn'H_M;DI/k?-^*\:Osrr!:5o-Qm3HE5,ZVBu9prRTbXpO(J<P)*3o$a<l(6!"a(-s_A2;29$K#A$a(5$mE'klA=C_jIl#Ddo"n",'%0>bUVbVP&H^u-A<:a,$cha@WUS.JeMA&[n%,+K"W=:iP%[UrqocE>;9q_@RU/TSp&2;?/:]dTrojL1@IM6^#STeJq%@60kg?hiUC:h+K5hitO(MLFgg9\;[+m,S^l5O#:M_eYtP,<!&J#-["iT8>'-@#00'aQ.#RK*R?p9LFnfs=/r7'/?3F;mVcA5JjEP[`m!\_0`dSf?J"/(?QnR5?TC1(6)1j5p/&#34\#rU&P69D<B^i5'b5oaisR"dOXH/)CI`rsl86jkGGR7$e?F6C7(,+Ju1G/P&j-%1_\:`.S9]_-(&%n7M1clg8Y=p%J7Uk5Fdie1Jpg,<R<tL?bBG,0F_<km[11Sl<)8`3G+\)`[UJ\/JV5DT:RgKA.K#DKWB(ff/^[e2<p'KN>:AB7n)8#PEQ-&S3l)>**Ye>[:ZsaZ-MbCLsqUBTZG+2A-?<\cHQ"g#.m]Ag0WZUUA0pR&mmJ^'B.ucg#WdSZC>Jj05#+f%Pg`;Ra'?JH9Q\^UIDUb\WRZlALBU8Qe&l]"*:I["?B!fdb6MIF5E#cDinQmIm8l&"5L-'2dJtOI;:V+a(SAFg&:PV(h8q4+8VH^&J';+F9F~>endstream
endobj
17 0 obj
<<
/Filter [ /ASCII85Decode /FlateDecode ] /Length 1684
>>
stream
Gb"/(>uTK;'Re<2cm.odWkN'97YBs&$_\$,:X!@T1be/,@"Xm8rqhtqY%>YZ@deL(lt/#7R!WpsYB4WP*%3#n7C1l1CP:QbkhR[VPbIjf;1Sn.cVP=:rYX#aW>JYZ$RsLr@N)8nN&+n*Kf=3#_a&d;UNgV]3MJ>X9^*$>5)^)?!IjlkqZb$s;#E5Bij3o1dqF=8V9Aq=KJa2K[1\q&k.@&V+WV@'84\c;i#Ecc!,\%cp8oK4?R7$AD&=A$@X_o4L+kFFB-sa'H'lM#6>ONN[42]jCb<!5b?JcQX[HreG%\KMALPV\M%u"a[@8uU3c2BZPA;f8D_Hst>t&6b#;],[el2_V,>9*jEQCgRjG9c[.[tP9\X8[WGtqEOK@20&f@/[=Lsg`d8=D3Rb9gMZ,t]5B`VjgR8d,r:9DR?r$(a9c%R)K4QHqu(>7<Ti:_9UTdo0sT^\fn@/67W'FFA,ulh-`5Gnc43=!"'DdTG<g4Q]j'BI+!<eggclpJee15FDYg/g$8,mHS;GX<%W>BL,/?,j<hjMHY:9qf+DKLOtDcL$G"Wa?(j)CmH`D6!I/>OC$DA]Q)fc5Mfpf+BUU6mXh=ngj.'_-]-OO-+\A)^YJ"uKRl_UI)K@(oDno)I_Le\^pGdkN9:$(_[(>U*KKH.oup2bn'P\^,'JLdr_+l9"`Y*Ma1WK#.^J\?[mT9j6KT]*6fo"Jk.J,ijq:"V?4X$`#]!Rr<>)m/K<A+6[1$T2!3aYnXm,/XQ]j5&o)20ZJ;\H-4u\-2kW<JmRUfTu_Q+\"'EC5sOJ8uEVYk[6(9;fSPhcF3IMF90[cYGcn;oAX=eM.J#]l8[n0fb+MNF2k[C:%)<RWelEiP&*?!YuOgU0usBtL`e8DHs2nY@ihlFOr'HG\Y+e>tkT!+kjgPNET>rp.Z,VEoa#A/9@:E<*h]7WWBlNEa:Ea*CMl8\\DI::)n>10Gk[2-AIp[!O5g?-lEo1'$fc1B&Sgc_Br01cal.Nf'>jH^4Z);E1=G3^=d:GN<QMmfL?g<<4eWC4%`V8$htMSm4tP?R@-tGC;0V.1s#2"6;=Lg/B)$1DR<>oqtXl"cdqe"Q3k`n`":A5<k`G?&iQ]\@Xd=7Z"<2JF65T?p3TXNa$Yi<d=\(cD'oD)ILcSc(_6lT"TbRPkh<]-u[84Xl9?GmS-a=\C+:l!;#&04uo6/kA9R"l*;oY7CfTSJ;V]T(I1(M\H8IP[p2R+e5qpl\J7a_COV8t^<bM*Z8A-u-=<P8)XfPCkE\cs)@q?.NVCof0#<G4bYfiBWk<$gZAhMpjl\,9<1*,TVV91N.aFm3pF)$=72^<L3^FIW60K#*JdAH0dVY1['@Y4o&G*,g-H.)]U67bC/bD.J'n(#H;!mHa;KG$$7I2VD]k-sGQJhhImY=o!ieR_%JS!K_T%R>&kW`o%DFr"&YRI#lDf6N]/OQnS$jU!k<"!NV!GJCB2!Y<q+)Ml64\Df**-YVAs!r!uglib[4i$ob4b35]p0cCq^)i7.B=;..h<aD9os"*=EgIlRD%+fLnJZ`SG+/ouYP=&>!"LdX.W`\s2ZRq)lO0p<lO2J`T<ed<Ia29]&\7UGgEYFG4MZ9c.ub@;Yufq2q0M-FQ_h*$'FC+OqemBAcJpNA^u5gkkB@$cU'"`Fn:Ag;r#Q-PgH?*cGC)YcS]>F92ncC:Yl~>endstream
endobj
18 0 obj
<<
/Filter [ /ASCII85Decode /FlateDecode ] /Length 1684
>>
stream
Gb"/)>uTcA'Re<2cm-.YBVd6$Z?Tl3fk/FJ2OJo%-Bk`daVFsfB%m7]b$U=&aB%X/jWTfga1b&FpKktid@!g!oS;T/Y7lRQa6:u,72/RGK.+b[`@!'k7t6P4M3J-u5sRGnS7/E!V;#]?<a65%c-,BqFKZXg!-,iZi/F@X)PYa`h0d]^ZVLnT:E:"0pSf<I=;$NS/h!LCO/oKE!g-V!ZmS&1pa:q`Xs4!!notW5GV]7ERN3H?:<mH*"*ZO>L):'G<oK5]#a/UmPZ]7s$^?JZ1Ie0o55`e@FHNn!"J2]j,:VnNWbOqi0<#9bd[-/>V3K5sYPR_N#RdBeV.ffgrA)4urKY\5Js'Tsgn>,S^s%c(\[aG,dX4g6@uYHfo`V<5oNg,\PdSa6<B$cq%=)9ebZ]ER7L2sjW6B!oN0suY<$sJkS'q4=rirY/!'!fd4d(c`:kUBH`EE6EZP&qg6)!V2eJX,b\^7`i]BU<(Ep4.Q:k`Jkg&`B_c%#\7XJ!/Ifk>jreode-U63-ZHfnbULe3IGJ)&PN6*hN:PR&JuBdaj<WM<e3<_J-eXqb`q$#sC$SceJ/k'VttfO>.4cFc92Pr$gBA*M4[j&\4hD"r-+lb5u-Z-WR[gQm,Y*QWVR3P&[Orr/EG=/0SuBPe1SFcqn[ir]Piqh4EjcAESqIR(bmGMTOfjWRuPQhQ-L.%@Do&KVM70+@eok9YC[AOTapoHBd_/I$o.\mgNS:]5lQq*M=[D19*A.O3U8YZ1t*US(ug<7JKdr11"Qb>`u'g,o?-lGK8S8rpVd*(nf!=Phn!'LOXS&u@8F'n@jt<4kaCFT=WApZ_6\Gs+ri%tj"Xl&I)9kVjRb>)OUIO6`JoPcc.flf>qs"#"7aZs#&Q=+c7#oK[_F$cU'[I.qTN:BM)A8Dg85IXN#2jtKO&^b=(-F7O][X9eu]./]2T2j\=C)2?=GgNB''WR+/i$MJ+`DYdFYP\p.(6>)j#H[=MDDiI>,j`Qd$2(!!5a6_BE82D>s_bc=@PRTr;@ZWJNd>1'W_:02B.)md8T@HY9UK2ugQ,5hc>59HTAS(V_5Dk\r9?$%`cBib=0n098r#@CP5FAT-&>h^b,9[I\$A;QDIIY[`Xts`!]4qlq2j`h#lD@SkVf!^O.`Z*&.@5n:j0IOuYh_&tLJ&#8s*8D]=(b-`STO3^)[B'k/8Eih2GT^La[J6d)cX&.EhLW2fM`")4Ch6_nRXO;kq7a6/pq;J$V`&>*OD%&SDBD><-;mKBa:Z#fD,8[*)5J2G]J6kq`[#t4<d,BRSp>H:dM8bUeaLZYW7VFZqXEB%S@`4A8-SA8TYlA`>>k!e*-A7-Tff"T:LORjVp>bD'(pdY`jTTjCNiXdF\!5l0S'3m.+UJS]'?@R:bd'DBgfegg\bAeh_&ZV:PH4bsL0L]ltjU[8!i![Eb8i$`J1gA>u'W6+=Z(r`PRl0XPi3'LQYY98;$cedO'U/#Ql^@O;A!-$>.S*0u-,&.KN(RfEA]+koaKUd43ZlpSa^B_[(5LAfZ6f+8BO*&-&!N0b=iH,=a!iD)52Mh^Qqj3:"[Q9`bV\J#ErU>\j(ll_[`lp='6gtE#\--Q?q>;cn7XXfHKfZ$'8<5\a=ZU#+i%CT?k@$&G6]eq]m)2W37Kl)@U-FZ2'>Bu4A`NNBI?cNuZH-<ht'akrY$^e@Z/H~>endstream
endobj
19 0 obj
<<
/Filter [ /ASCII85Decode /FlateDecode ] /Length 1680
>>
stream
Gb"/(>>O9='RoMSn09_%*oAW`0dY%eQHO(No7U(cR=[ImJLs0oqsW-.*'7l*\1'`eD,m6'cKCC4HsE;i*uH-l_StEu"TY/nnECbl9L*n+0S9e0-QktcIh/bP8d(CjQiWm;`*-h1cBt;;)A1>D>M]kXbohuGitQN'.G2ZJ/8*o'UN)[9/4>X4Urt3";5[CcF_X0m&ZA7V5j[i.aG]:+G&kgoC3CGU3k$`W*r,faT-4*BM@bjce)l2$UZ$.5A9`P]9ZH=*3]]KpHlj@TiSdlf83$.70n'HSM565H9Ki$*&/iJcXrsQ3HL1S'ra@gV[H%;j[Q#2IdK)"aYNM84am%d;ji)1$9"WPn_rBo@kQ^93Ca;/5/WN9JF26i^3DIfIMoiGJEqqjr4?!Vr=EY1s<=@;&kF`?8[H0i%jXlX^"."l:nE=t92SkTC2-o>*7`DFjTVN%^noE+N]VIuPfQSs0'o?L%%DjOi9ri;tZ(,>QV0nL*C4:XB+@dbb$s)9+?NuUD?c??*^nTUgn%aXfiV'DO^:S>re@b6glScE/P%t8C<>j$+>;MYIb$aqtR_`6/#.'NE%-G]e9Pdjh&?6*S!`lCis4ge+G"*Zt3Tms'>rXY%XISM0ln5C8O5f8*RNPF?1EHfNU#Lsl/Zf1!+LM3uo=-5<?8AI8ADED`jkZ0Ec+F?[.BS+2+lo8ZRf@]kWM!jho7cf#fZYQmRrmM@p<LD]!EC+'rj\r0W9.SplSc#ue'LuHBqepZYBloQ2T8.``@BO"A"H,nlSgu5@%WL*-Ge9joSeBI76J>8bB3T/!M/JHM%(:2!NM.*E8s2!44V^njnR0bXLYUtFJs=9TbpCYV=Qta&c7CO'9a.l@,uj\<Hm9(R-gU"^?>5pKjfb?KHUjCm2(NQC)9h>]Z_a7#-s##H8jS.,jU=@OEg%,">)N`]l2BSfoqD'c,3!o=@]+Cj"[`#IeHRGSB`q^l"]\bpT"g/`IWZ+.h[W'[4hqg=-R6rRBXCrY5i+DVUF/Wd0/rKG+[#tk1A'urijok[I3McnUBdii*%*h4g)8R_7HA!29m(rJX%`7=Y=@5bH4BE4eQ,B-0<#>I.qSc/-AB62UAgLqE;Gq15B"E$9nXEc\ptuE_k=CLsfX_C"?s+43qlQ0Q5QcZDCQ[!L?.%"2dg<mO3#J%796KjZU:p&tV&EXh8O\SiPs3\o&]LmYI>-+S?eS.j:Xg=$]'OMe\8U#ps.%$Dgu&V0POAO3g*"ZsQI;F3^ZS47H@"!tO<1O<Wg/"UUol&-.P"6ui:,a?N)V<2YllAlfF.'BW1u?Gk9miA=6(\t"M#eI'(YK\1.9;\q4V%JlA.3N%1BqX7o%\2p4-m&6]VXIWAiYb\*uX;tLCOGdqD25jn9M+kMpF^uD4o=R7^L6p$GUjG/8EtUR;4"+7Y2Bg'dYCf@=2jOBr</,Uor:Q5m]^Q`&`dB$m<]gV(04'.MYFhQR28?(Jk+EZXc!_i.H^XF@e]?OE[Sj17IlLW><u1e0Ei.X%@W!Dn4iG$gnCKsl\f%(A[P5@<capuFToV:2(j]t"1A(:EAm!_j3??K];N=j0WAD:c=hng/L.'+Os5'KDBl"`FL-jrsTmA()mR4rO'Fjr?Ffur,Ebp3]=u9atZq:@CU>c,S1upeGjO]J%fD\@QP72Yu+kTA@Rn8?Bn/k^j$T.~>endstream
endobj
20 0 obj
<<
/Filter [ /ASCII85Decode /FlateDecode ] /Length 1741
>>
stream
Gb"/(hc&8h&:Vr4Th!fSFOo`D`>]8(0>.E5Qp*6ga\fsO7t:e"^&.7o[UiT:/LsT[%+AWuS!`%1G#p1uT>)!QkoWh&HaQ9*?&JW+:CmPk?6d<@6g5t_UndB'@QXg%Tg028-,gk"cuGhe:'X(d_tR#-RTDEmSV#Lq'W&u.UFHpDO`'XOP&c`3(UrU:IZlphK/Y4WL=3P"+_Ro^1;^:-KHWXtab:n4$34Lj"\=Y-'ucL`qcsd=!\pjYB9]-=&u/H]Y2>8D@OfelXcGLgMRu4I9'IGXUS=H\&qZdH%0`T!c*]f.Il$15!$j:;L8($k)&u"snA;h+H_9tiS,p0,!ct)hEh(VY*^%^nN\PKlHm`:-]6nV3\=2T=qn)8Ed$ml#2<oi@s5pBXPs9rm(fM>E-fdC^k>/YKmV^TbGP3YCOp6XDQGGVrT8`eDB%(:<O\@t308GNaO+A$Zb#f;8EONPbkPK`k73edj$O#1hN`B<De!"c,9b5^pl,i;8j='82cpj3Ie=h#u"H\0=Xmb93mXCGsFsni3;5G?DFD2cAPE2UXe(O9Mai4(#3_B5'ZXMhdXQp)X=l2JkN#FnrB[8^dT9A6q,X%cJSgG7\!lM?A"@Cp%Y04oLCtl;Arp:$bc-$3[=iY9(*Zc=t:1e&!g!t4X2G/]BZ_!D7g9RkEGFe78Tpr3[.0qeB_1Qr8II$bgD0)=lF]9@-+8+N0,KqB</j\fqdgmZsd1:RD0:N'C\@b8nV($Eo;<uhrj64!tJ;WsQ2<i<<Ufp'aaeDRDa.TVNK0GJ>K>+>p[+,G)d^QR7aVgI[Q6k#s:#.(,jkL2arOoIf:t;o[Zb:&=Pd>*oL#$(bp9QV+ASIV6Jk<&VZq_0d7:k(EMsDN%_o=E%`q=l654tT9+E`N\XC<tV:O90g"5c`iMaP7RW?l=Br@g]?`VAEXFdOg[`LJ9>'MRe\f03uYUr(oJ`#eL$O"A-NO>%1IlppK@\8C;E:)cIdB"9MODH\!pm3]Crghp^C>)CNOgB8$`m%\c0"3C$>=2'sth4fa\*I<?h&hG>k('>`lq[qQfh,SR4M>jgkf3aGb4HrY?`SFR+R..L=_uUOhb0W(j\KjtO@SnnFhrjUcCo`^-'O,VW333BXmJFr!WSf.WNCkli"4r'B-[f%.F=_J2m;h[fYKJk/eNl6q>+c?OSMEeq=H6pmPqZ;oVuTufWAIgCkQ6(eff#nI^^]*/JiHb@Sl`_P.PO\@al?eeY\G7+X&\l#g1gTl+W?R\Wbq@qpAV)I":Wd<\IHcegsq->b]>r@$sc"JT5L\W_NmViGV.M2O@_[WBZQua;_8`&81(I6LJ0`o`F7YuEt)5kU:Vc"Yf>ZFG>50tNBI^FAJ/&E;9c/;T(POc7UBh$@tcf?QX4Q$V6g`I=u$3r41SZD_cOtLGEWHQU5Z,jqLjl1c#@mOE0.#1UOnYI,;(U"KuRbrrSnj"((M!FD:gnSnuIH`N6V2'`jV@G(_kS<<)?kI3Jq6A#*kYfXEJ.?]_thbHqr\o+r*J<!fNEW0<G?!0ej0Q68Ja2*;lM)+cFubU7kt4(BN3g>IJ<g.NbYV8)Aeup&a\J/UMKHAsYkQ3ht[#,gmQhS^fHij(p6o&cP]Hj<,WOCm\7:`11JekR>mYM9]cp4"GCWB@n&[N:VGnS,jTVcS8LsgejY!=Ms2[,O7IY49saC`8*s5H4G?uf('gI+;=Ri(df&)D`h!-/Y[l=r%>"0l*NMNdHH&jpb/o~>endstream
endobj
21 0 obj
<<
/Filter [ /ASCII85Decode /FlateDecode ] /Length 1695
>>
stream
Gb"/'gJStN&:O:Sk`MYJX]fr=7a*.D/=49`H(rIC-&-FU"#3/Sp[;1)dqG9!aEC+.:m;@S)4bYf95<_T!$_+=`W(i"6>ocoa'1eo;0n(L@ueu)Pb`r8"/q<=?nE[DUo;(:Up5*O)&jm4!jqg;]GfR-42DLF$k(>tg'*J%1N`HHqTM/=KZPi;`37.&(m-"C$RsMt8/Kt+.Mquf:.?AO:qAnRa`9Cg=PgeZknfSuY#+pb"AL<IX;%Ve"'N&!m?WXHkfref`UmngO#T#OoNf#\XD_+klt>#<-C^]eLW.1(3>4+$2Mfd'nHU^S0(82bQN>Z:EFJ$Ija6oCJ/S2a9Hlc\Ef"%r;u=F+B`?jO\7X0<:Y]`Dkf2ABjYb\g]"p!9YJEDf%@#!jZb.OW:c\GUI%#AC'MCfQ/IX=8:aP^ZkQVU[!+/rG["d:2o<HMph)*$`F-'0n2P"3M]4/&3GpD,T`YGCJg?T,F_@37H;_=s]#W%nKE(*.sV8j%M7]ilJKQIu9X.TpTe>o<@Vqi:`T@<4VV<,(2(NGP:V!RH%C4RT0J]hO#@-=Io7Lg`L.!Ef=SGm^K!/&ji$L2%iT5DEi0BX/#Cjp`[D+,2WG-*LF/GV5/:+sI29PDWe;4bmD2U*9u&)Q/>TmnJLWn]jM(``&4B_Z3q)(3>.A9?Hg*6q%27n19;l%2/#luI=.gOB8j,@tV>OgH+49P\ln4A<cZIQBMMSpVFs,lJ$1CDfdl+jVT;Oo-2BIW]_DS:q_,P#1+>,Y857%[3[K3'Eg[(aisg,0;hq'2-Uo3Jl"OK8/QLZeAV//I+C4hOg<t-V+'SB;`Z;..,@(R/r9nk+HM6R_qU,NRie6,3_*q\MX$kN^h&&3XMnO3]gsXTfR5I3@G9cVb><$HV1FnKil<:A-K6>gb-R@Ki[@Nh*sGL&W[>,@cOjAB][tr6ht0WP7f?T]VhQ$%Bu<dq2Y$pgM\:i249bmBmR$sZe&TW*h@Io>"rWA6N,9L%@S(HQT*O2RoV"53ElZ$WumdR-?qO@H+SF%gOlS&8;0@!+K6#P@&`HbOKaq9:Nd97FVAIVeCs,$,"(1-B\`>[`r*n205Ul*4F&kR*!"lE^5TBe`eg$MjMkcjbR\fGqXo3$EV]o&_#O6oG8&c?kAEa.n_DB/>E6<emI,@.#$kR0MEAr;/X!X;KsC>;$'i,Umo#Vilk.n1Yj/AU(:u^Dg]%+_X"Z$pPq^]/=.=nP$bI7=LLkalc>KuQok^[j.T^XV<p<sB#fbZej1^CY.ljAJ,WG$1K\-/R^N.OSqs/XmjKJ/V>K$W6N%GZt;-k(CCFZ2lX-'?.d>\3(jdJeSM`VkCc])d9D5D=Zhd9e9ECfTYQj'XClbu]2&du"fP[:`)-a0Z6a0e^ON*_]C3adJ5HB.RV^.%6(BDIt`2p$e5k!uu>`#Ijk_h"F,FmW3<lS/a09?%+C2ZOS'Q]*[)pt:fR)".(i+rS*cL<iRLN/CB%A16)K-lK&J//cIH-O1A`n``VZL*;9BH"_q07FXV;8;V\>RUL<\C*X>?jGRXFCc+T,p6PshdQ5a*T`Y-#eI[E)r,42,ZLq`qao*bsKX*3Ri(%lEof2eIFar:H-*+-%5lfXaRq[#q:&Y_]ZHAA5^a_cW:D`e7KoC0r0P^ssO!g!fn#4??\j15\/l)]GUAJ>#_06kQ^Zs*]Lpo=<_>b,"9o/~>endstream
endobj
22 0 obj
<<
/Filter [ /ASCII85Decode /FlateDecode ] /Length 1702
>>
stream
Gb"/)>>lJ"'Roe[cm-X@l5nd#)_k"N1dGfA4>Gli`%Xq@&@5'aIpZnCZIW?alm55;b':^fopqk!FEI?P"$h]g61OhmNmO7(rGi/L#g0:]0[*Ae*i7QJb5a#f9X#-2(_RH8BVCEVl,Hm6-3:6_0<PPheh0gUEJccO'^^K=M^c5`D4K<]L!`I2,iVphW*dhrpn]2"(Ksa0MKpt=@O_[^`CuG0*mL&E6uo(Lb3!C#_o;<@!R7ccmhY)N_t;n&b!)TeFbR<t#Wa+CY`p8G?Y%]q1B=B^UMN!+2Z\;phWD/Fg#YXd]=[GD6fj?/[1#*k&E#u3r@;5[>kX/MElI1V[Yo^a_D#7HVN6XA"fOO/>7F5M@J&^Em]optN9EH8=)PGc]3I&eH#Cbg7@0),a.$Q6oaRYfQhZbW:Q9S\kOS[(+rN>OCup*CG(;%<>3r-ic)[&f#+_3$gubm_Y-I=hRN77^g-PiV\m_>"2Wc"L3_ZUB0W0]X@9Rf/3?c$FdrN>b8$<.F7$J?r6ZA#G\DN4rnsC-p$Ve#(+?8LO$@C"*"7/Pni(N,*WM(Y>>8pd9]e&3hJLu(p0tTaG`T#YD.b>*KSb\d0D_+QpWX1tY-p]+KQjW`,SWBT>%)n\"`#(Ag^;2Z=pA0G(,4)]2"lUTS(6t8Bp(g!q*-6<s1q0;K$-\<cGR;[p^(5`[.82_kYbR5"hedC*Yutkl1J7fTF_sIU_NZCq1HE]5o#KO<2t'B&SdI&"2\;A]#<Wt8In_<NFEj+3hKMc9dQ'EXVSGL>S0S->9AY6grX;23DU$mB,VKBRo,=2?&(>O,T8cU+-Qbh`Bm5<W>/h1saE'[Y,X7&9kfYfi6I!JSiFjK.#>F$Q8*P#:3r(I)cTXg]F&ijPLs+(0fd]Em9?oi@`FH:K(<O`#:XaM8BB.+]rpe\+E'2:S'6@dUFm5P<Pg*V]AL$m!jcT0TY[![p#=kQL#ttCn]$AT(XYRo(j;a>;k/$0ATH.7>6AX9SCIsE%P*2<s<!0+UV:9gIGiX`0-<rp<<o/7FAM7PcPn4O;;&(*m^]5DH*'I*S`CO"R,)!P4N#NH]l=RZocc]W=FBP_t[FL7J5NSuJOmR@P\j+:$3)C#U#>#p@^d?Stf%^te(;#2f]0_qtQ-uZ^A70YZjO/H(A[GNfW<F!+n`9)abTY%$T<@0idEk35M24Eij3/$5+,'\_SGiQTUCdV7DUWYgUQ'M9kI:uAmA)Z"\"2Y>r3l4NfM"D-$3=-j4r2HiIl'^U`Xe`M&!@L/S$61-Z@Y64HO6dbl]+Du3l^-[QNg<VYCn(m38Z=s?A]U*O/4C\o"4hZB%ec2aq^Ig\t(GTP^46J)*op$Uin#l)]lLJI%_"oEqAOCkN',D=2!UD<ke;-<9dk_XE'@DY18Xpj"FTlIncuMf<nD_FB"L*kbO6;H_)I/h)>V1VsoNID7!$h`>Z\B2I0CO"$]TH)NYAM6o$"pY^$;36$?sfC^p0rOs.'J)s]pJI$"he3ls)Jr4Xd$_OR\?YSYFNRn8@h8ScUFD_)cDOIa9YZJ/\Fge&-#<`'US+_dmtl`+B<Ac=*o0Np8fKFme/$&35FZOSI>,V!*7.#'sU@L,A1T`B\?%Z&&"!PX>$#RU2%D_E$obsXq8r%.jGJ't<ff:F0[<A'jm#g'!C;Jji!8bT[Zr<O7q<TPr#]2&GG4\`A2-DLM-6%aXe2>0bg~>endstream
endobj
23 0 obj
<<
/Filter [ /ASCII85Decode /FlateDecode ] /Length 1249
>>
stream
Gb!#\9iKe#&A@7.kQoC3e[MX:+IG&$!_jY0RE8u;_h?#4Jhq9DI3i*`mDQG(:7VgGb!)rae#p%c(a/dng$_?2^dSAi?X\HkL`QS/OFcU"KMh3?LFlCJ(^P[1&6M9#K[TJ!)(I)&`*i>MH0W)1H%H%9.HHFcn-K>-'8+=]mF6Lj$tE!KT4]AGSl'H[B8+!YAYU`9?f!3;k*Iu@o'Ji?8<h(f6aG&O&7gnL2Qlo",-W%pN^8n[PKW?*8i_nt\k_Fhp_6-B+?HiJP9-hi#fTV4/=e;W+Srh<TUUUHDe@kPTAk(<@*c`G-s0"!YiRUC/0Fm`2tLU\hkhcFhl!ABnZX(f5s1C5cr`KFXRhMn[1h+-3J`2bfq^#k?8[;+nOpH@>V>1'ErC"e#O;jI#To?C!`sVWnQ6dS_7H?I6AKPgGp\679t]:%'a!\%*OIB>'B`i4?=[ccLcT-blfPFZo9;72;]YWM/@NZDQ/;m<P0!UPp>+5_C]3k[K)q*.h\`uOdFTG8i-0@V+ct>;Z3"P7NP"J7_$s!uWZ.&sg-AhRQjQeMl(Kot1/g'pTekru;Dm]I@8\rmW[&a'*+VWlf,4"?!3NA!/'HOG0,>p'j?%9.\3Zh^8+nC4\faftU@\i5O:s':<Gr"ZV&\Eq<a?'2k%]Kbnj8UeEH5da-_2nli&/^?09oM8PAr/Ydr4>OO<CP/!K[G98.HaWk/GdT5fFGcPA60H^7\MaS%F2'YK]d-c"V5,d,hXF,H,fHh.#`=Q]SZs<b?(]/F-[AS3)sc4R;l:E:in4"cS'6&l'q/5t<AD[t^\Tk8LHr$X7NJ@LD2tU_LqnP]8`[[qQ"PDhW0)<[_\<@*^_ji74M#/Y%g;rZiK=FDj\6I('aUD*\J&n8@LG'CWa&?S/@%+gqsAdH,nhY5[7]+-*)eBQ,o#4U`s\DM;u:?_N*I$'?9[%\'joEEe=cCWte:8#6<J_s=qVBQe_dS;d??6.@L4:%QPLck"3==H>R6@:N6H-dMh2S+&<U7cW2#.%EDEK'-bAeN#%C^>sC_p>dL<g#X8\%[\X,q;q!O35`(gS1\oo=d\u+3@OF_EmTh6B+`")jr.22T;l?u)q"5L'hPb/-e\JRCJn-rf/V3#Fe?,6XS-EM%9#o0Aii*[D!CHgqp(*3)pO=.0dq>-J7W^Vk2O(]&u"l0AURc;..*8*4@[?Y#)0auY@Cg'*2qGsNc>@o;#E,)lQDX(G;SG7OIBViW5&Vc/.[(,!6C2i]D~>endstream
endobj
xref
0 24
0000000000 65535 f
0000000073 00000 n
0000000124 00000 n
0000000231 00000 n
0000000343 00000 n
0000000462 00000 n
0000000667 00000 n
0000000872 00000 n
0000001077 00000 n
0000001282 00000 n
0000001487 00000 n
0000001693 00000 n
0000001899 00000 n
0000002105 00000 n
0000002175 00000 n
0000002459 00000 n
0000002564 00000 n
0000004657 00000 n
0000006433 00000 n
0000008209 00000 n
0000009981 00000 n
0000011814 00000 n
0000013601 00000 n
0000015395 00000 n
trailer
<<
/ID
[<901f406f6cfbf9b640977a323bae9dd6><901f406f6cfbf9b640977a323bae9dd6>]
% ReportLab generated PDF document -- digest (http://www.reportlab.com)
/Info 14 0 R
/Root 13 0 R
/Size 24
>>
startxref
16736
%%EOF

782
output/timing_stats.json Normal file
View File

@@ -0,0 +1,782 @@
[
{
"fichier": "23_20190411093049_00001.pdf",
"debut": "2026-04-21T10:17:12.538647",
"fin": "2026-04-21T10:26:15.952573",
"duree_totale_s": 543.41,
"nb_pages_total": 6,
"pages": [
{
"page": 1,
"type": "FICHE_RECUEIL",
"duree_identification_s": 11.69,
"duree_extraction_s": 97.82,
"statut": "ok",
"erreur": null
},
{
"page": 2,
"type": "FICHE_RECUEIL",
"duree_identification_s": 12.24,
"duree_extraction_s": 77.88,
"statut": "ok",
"erreur": null
},
{
"page": 3,
"type": "SEJOUR_MANUSCRIT",
"duree_identification_s": 15.92,
"duree_extraction_s": null,
"statut": "ignoree",
"erreur": null
},
{
"page": 4,
"type": "ELEMENTS_PREUVE",
"duree_identification_s": 13.07,
"duree_extraction_s": 81.06,
"statut": "ok",
"erreur": null
},
{
"page": 5,
"type": "FICHE_ADMIN_1_2",
"duree_identification_s": 7.02,
"duree_extraction_s": 176.77,
"statut": "ok",
"erreur": null
},
{
"page": 6,
"type": "FICHE_ADMIN_2_2",
"duree_identification_s": 8.1,
"duree_extraction_s": 41.14,
"statut": "ok",
"erreur": null
}
],
"erreurs": [],
"blocages_429": [],
"retries_total": 0
},
{
"fichier": "OGC 358.pdf",
"debut": "2026-04-21T10:26:15.976638",
"fin": "2026-04-21T10:30:11.701132",
"duree_totale_s": 235.72,
"nb_pages_total": 6,
"pages": [
{
"page": 1,
"type": "FICHE_RECUEIL",
"duree_identification_s": 11.94,
"duree_extraction_s": 54.89,
"statut": "ok",
"erreur": null
},
{
"page": 2,
"type": "FICHE_CONCERTATION_VIDE",
"duree_identification_s": 8.28,
"duree_extraction_s": null,
"statut": "ignoree",
"erreur": null
},
{
"page": 3,
"type": "SEJOUR_MANUSCRIT",
"duree_identification_s": 10.99,
"duree_extraction_s": null,
"statut": "ignoree",
"erreur": null
},
{
"page": 4,
"type": "ELEMENTS_PREUVE",
"duree_identification_s": 12.63,
"duree_extraction_s": 36.32,
"statut": "ok",
"erreur": null
},
{
"page": 5,
"type": "FICHE_ADMIN_2_2",
"duree_identification_s": 13.53,
"duree_extraction_s": 49.68,
"statut": "ok",
"erreur": null
},
{
"page": 6,
"type": "FICHE_ADMIN_1_2",
"duree_identification_s": 10.64,
"duree_extraction_s": 25.93,
"statut": "ok",
"erreur": null
}
],
"erreurs": [],
"blocages_429": [],
"retries_total": 0
},
{
"fichier": "OGC 368.pdf",
"debut": "2026-04-21T10:30:11.703536",
"fin": "2026-04-21T10:34:08.640839",
"duree_totale_s": 236.94,
"nb_pages_total": 6,
"pages": [
{
"page": 1,
"type": "FICHE_RECUEIL",
"duree_identification_s": 16.14,
"duree_extraction_s": 64.08,
"statut": "ok",
"erreur": null
},
{
"page": 2,
"type": "FICHE_CONCERTATION_VIDE",
"duree_identification_s": 10.97,
"duree_extraction_s": null,
"statut": "ignoree",
"erreur": null
},
{
"page": 3,
"type": "SEJOUR_MANUSCRIT",
"duree_identification_s": 14.35,
"duree_extraction_s": null,
"statut": "ignoree",
"erreur": null
},
{
"page": 4,
"type": "ELEMENTS_PREUVE",
"duree_identification_s": 9.12,
"duree_extraction_s": 48.81,
"statut": "ok",
"erreur": null
},
{
"page": 5,
"type": "FICHE_ADMIN_2_2",
"duree_identification_s": 8.32,
"duree_extraction_s": 22.88,
"statut": "ok",
"erreur": null
},
{
"page": 6,
"type": "FICHE_ADMIN_1_2",
"duree_identification_s": 13.82,
"duree_extraction_s": 27.6,
"statut": "ok",
"erreur": null
}
],
"erreurs": [],
"blocages_429": [],
"retries_total": 0
},
{
"fichier": "OGC 371.pdf",
"debut": "2026-04-21T10:34:08.654725",
"fin": "2026-04-21T10:38:03.504814",
"duree_totale_s": 234.85,
"nb_pages_total": 6,
"pages": [
{
"page": 1,
"type": "FICHE_RECUEIL",
"duree_identification_s": 15.61,
"duree_extraction_s": 70.77,
"statut": "ok",
"erreur": null
},
{
"page": 2,
"type": "FICHE_CONCERTATION_VIDE",
"duree_identification_s": 11.81,
"duree_extraction_s": null,
"statut": "ignoree",
"erreur": null
},
{
"page": 3,
"type": "ELEMENTS_PREUVE",
"duree_identification_s": 11.32,
"duree_extraction_s": 49.28,
"statut": "ok",
"erreur": null
},
{
"page": 4,
"type": "SEJOUR_MANUSCRIT",
"duree_identification_s": 6.82,
"duree_extraction_s": null,
"statut": "ignoree",
"erreur": null
},
{
"page": 5,
"type": "FICHE_ADMIN_2_2",
"duree_identification_s": 11.32,
"duree_extraction_s": 18.73,
"statut": "ok",
"erreur": null
},
{
"page": 6,
"type": "FICHE_ADMIN_1_2",
"duree_identification_s": 9.94,
"duree_extraction_s": 28.28,
"statut": "ok",
"erreur": null
}
],
"erreurs": [],
"blocages_429": [],
"retries_total": 0
},
{
"fichier": "OGC 373.pdf",
"debut": "2026-04-21T10:38:03.508522",
"fin": "2026-04-21T10:42:37.600479",
"duree_totale_s": 274.09,
"nb_pages_total": 6,
"pages": [
{
"page": 1,
"type": "FICHE_RECUEIL",
"duree_identification_s": 11.39,
"duree_extraction_s": 97.01,
"statut": "ok",
"erreur": null
},
{
"page": 2,
"type": "FICHE_CONCERTATION_VIDE",
"duree_identification_s": 11.14,
"duree_extraction_s": null,
"statut": "ignoree",
"erreur": null
},
{
"page": 3,
"type": "SEJOUR_MANUSCRIT",
"duree_identification_s": 11.22,
"duree_extraction_s": null,
"statut": "ignoree",
"erreur": null
},
{
"page": 4,
"type": "ELEMENTS_PREUVE",
"duree_identification_s": 13.87,
"duree_extraction_s": 58.78,
"statut": "ok",
"erreur": null
},
{
"page": 5,
"type": "FICHE_ADMIN_1_2",
"duree_identification_s": 11.0,
"duree_extraction_s": 21.31,
"statut": "ok",
"erreur": null
},
{
"page": 6,
"type": "FICHE_ADMIN_2_2",
"duree_identification_s": 10.34,
"duree_extraction_s": 27.16,
"statut": "ok",
"erreur": null
}
],
"erreurs": [],
"blocages_429": [],
"retries_total": 0
},
{
"fichier": "OGC 385.pdf",
"debut": "2026-04-21T10:42:37.603168",
"fin": "2026-04-21T10:47:43.613674",
"duree_totale_s": 306.01,
"nb_pages_total": 6,
"pages": [
{
"page": 1,
"type": "FICHE_RECUEIL",
"duree_identification_s": 12.89,
"duree_extraction_s": 153.67,
"statut": "ok",
"erreur": null
},
{
"page": 2,
"type": "FICHE_CONCERTATION_VIDE",
"duree_identification_s": 7.35,
"duree_extraction_s": null,
"statut": "ignoree",
"erreur": null
},
{
"page": 3,
"type": "ELEMENTS_PREUVE",
"duree_identification_s": 13.16,
"duree_extraction_s": 39.37,
"statut": "ok",
"erreur": null
},
{
"page": 4,
"type": "SEJOUR_MANUSCRIT",
"duree_identification_s": 11.77,
"duree_extraction_s": null,
"statut": "ignoree",
"erreur": null
},
{
"page": 5,
"type": "FICHE_ADMIN_2_2",
"duree_identification_s": 9.31,
"duree_extraction_s": 19.19,
"statut": "ok",
"erreur": null
},
{
"page": 6,
"type": "FICHE_ADMIN_1_2",
"duree_identification_s": 11.48,
"duree_extraction_s": 26.72,
"statut": "ok",
"erreur": null
}
],
"erreurs": [],
"blocages_429": [],
"retries_total": 0
},
{
"fichier": "OGC 397.pdf",
"debut": "2026-04-21T10:47:43.619457",
"fin": "2026-04-21T10:51:51.030768",
"duree_totale_s": 247.41,
"nb_pages_total": 6,
"pages": [
{
"page": 1,
"type": "FICHE_RECUEIL",
"duree_identification_s": 9.27,
"duree_extraction_s": 76.42,
"statut": "ok",
"erreur": null
},
{
"page": 2,
"type": "FICHE_CONCERTATION_VIDE",
"duree_identification_s": 10.26,
"duree_extraction_s": null,
"statut": "ignoree",
"erreur": null
},
{
"page": 3,
"type": "SEJOUR_MANUSCRIT",
"duree_identification_s": 10.22,
"duree_extraction_s": null,
"statut": "ignoree",
"erreur": null
},
{
"page": 4,
"type": "ELEMENTS_PREUVE",
"duree_identification_s": 12.02,
"duree_extraction_s": 62.89,
"statut": "ok",
"erreur": null
},
{
"page": 5,
"type": "FICHE_ADMIN_1_2",
"duree_identification_s": 7.81,
"duree_extraction_s": 31.15,
"statut": "ok",
"erreur": null
},
{
"page": 6,
"type": "FICHE_ADMIN_2_2",
"duree_identification_s": 6.48,
"duree_extraction_s": 20.03,
"statut": "ok",
"erreur": null
}
],
"erreurs": [],
"blocages_429": [],
"retries_total": 0
},
{
"fichier": "OGC 398.pdf",
"debut": "2026-04-21T10:51:51.034973",
"fin": "2026-04-21T10:56:46.034162",
"duree_totale_s": 295.0,
"nb_pages_total": 6,
"pages": [
{
"page": 1,
"type": "FICHE_RECUEIL",
"duree_identification_s": 12.35,
"duree_extraction_s": 77.87,
"statut": "ok",
"erreur": null
},
{
"page": 2,
"type": "FICHE_CONCERTATION_VIDE",
"duree_identification_s": 10.64,
"duree_extraction_s": null,
"statut": "ignoree",
"erreur": null
},
{
"page": 3,
"type": "ELEMENTS_PREUVE",
"duree_identification_s": 9.77,
"duree_extraction_s": 84.09,
"statut": "ok",
"erreur": null
},
{
"page": 4,
"type": "SEJOUR_MANUSCRIT",
"duree_identification_s": 8.03,
"duree_extraction_s": null,
"statut": "ignoree",
"erreur": null
},
{
"page": 5,
"type": "FICHE_ADMIN_2_2",
"duree_identification_s": 6.18,
"duree_extraction_s": 31.56,
"statut": "ok",
"erreur": null
},
{
"page": 6,
"type": "FICHE_ADMIN_1_2",
"duree_identification_s": 8.34,
"duree_extraction_s": 45.3,
"statut": "ok",
"erreur": null
}
],
"erreurs": [],
"blocages_429": [],
"retries_total": 0
},
{
"fichier": "OGC 404.pdf",
"debut": "2026-04-21T10:56:46.039051",
"fin": "2026-04-21T11:01:41.285242",
"duree_totale_s": 295.25,
"nb_pages_total": 6,
"pages": [
{
"page": 1,
"type": "FICHE_RECUEIL",
"duree_identification_s": 8.05,
"duree_extraction_s": 121.21,
"statut": "ok",
"erreur": null
},
{
"page": 2,
"type": "FICHE_CONCERTATION_VIDE",
"duree_identification_s": 6.92,
"duree_extraction_s": null,
"statut": "ignoree",
"erreur": null
},
{
"page": 3,
"type": "ELEMENTS_PREUVE",
"duree_identification_s": 9.45,
"duree_extraction_s": 40.67,
"statut": "ok",
"erreur": null
},
{
"page": 4,
"type": "SEJOUR_MANUSCRIT",
"duree_identification_s": 12.45,
"duree_extraction_s": null,
"statut": "ignoree",
"erreur": null
},
{
"page": 5,
"type": "FICHE_ADMIN_2_2",
"duree_identification_s": 11.47,
"duree_extraction_s": 38.9,
"statut": "ok",
"erreur": null
},
{
"page": 6,
"type": "FICHE_ADMIN_1_2",
"duree_identification_s": 14.06,
"duree_extraction_s": 31.22,
"statut": "ok",
"erreur": null
}
],
"erreurs": [],
"blocages_429": [],
"retries_total": 0
},
{
"fichier": "OGC 411.pdf",
"debut": "2026-04-21T11:01:41.288964",
"fin": "2026-04-21T11:07:47.867790",
"duree_totale_s": 366.58,
"nb_pages_total": 6,
"pages": [
{
"page": 1,
"type": "FICHE_RECUEIL",
"duree_identification_s": 9.23,
"duree_extraction_s": 173.09,
"statut": "ok",
"erreur": null
},
{
"page": 2,
"type": "FICHE_CONCERTATION_VIDE",
"duree_identification_s": 7.92,
"duree_extraction_s": null,
"statut": "ignoree",
"erreur": null
},
{
"page": 3,
"type": "ELEMENTS_PREUVE",
"duree_identification_s": 11.49,
"duree_extraction_s": 58.97,
"statut": "ok",
"erreur": null
},
{
"page": 4,
"type": "SEJOUR_MANUSCRIT",
"duree_identification_s": 10.21,
"duree_extraction_s": null,
"statut": "ignoree",
"erreur": null
},
{
"page": 5,
"type": "FICHE_ADMIN_2_2",
"duree_identification_s": 12.2,
"duree_extraction_s": 24.99,
"statut": "ok",
"erreur": null
},
{
"page": 6,
"type": "FICHE_ADMIN_1_2",
"duree_identification_s": 10.47,
"duree_extraction_s": 47.16,
"statut": "ok",
"erreur": null
}
],
"erreurs": [],
"blocages_429": [],
"retries_total": 0
},
{
"fichier": "OGC 413.pdf",
"debut": "2026-04-21T11:07:47.870357",
"fin": "2026-04-21T11:13:01.604612",
"duree_totale_s": 313.74,
"nb_pages_total": 6,
"pages": [
{
"page": 1,
"type": "FICHE_RECUEIL",
"duree_identification_s": 11.21,
"duree_extraction_s": 140.94,
"statut": "ok",
"erreur": null
},
{
"page": 2,
"type": "FICHE_CONCERTATION_VIDE",
"duree_identification_s": 7.76,
"duree_extraction_s": null,
"statut": "ignoree",
"erreur": null
},
{
"page": 3,
"type": "ELEMENTS_PREUVE",
"duree_identification_s": 10.87,
"duree_extraction_s": 44.94,
"statut": "ok",
"erreur": null
},
{
"page": 4,
"type": "SEJOUR_MANUSCRIT",
"duree_identification_s": 11.68,
"duree_extraction_s": null,
"statut": "ignoree",
"erreur": null
},
{
"page": 5,
"type": "FICHE_ADMIN_1_2",
"duree_identification_s": 8.19,
"duree_extraction_s": 31.99,
"statut": "ok",
"erreur": null
},
{
"page": 6,
"type": "FICHE_ADMIN_2_2",
"duree_identification_s": 8.74,
"duree_extraction_s": 36.54,
"statut": "ok",
"erreur": null
}
],
"erreurs": [],
"blocages_429": [],
"retries_total": 0
},
{
"fichier": "OGC 425.pdf",
"debut": "2026-04-21T11:13:01.615261",
"fin": "2026-04-21T11:16:55.314927",
"duree_totale_s": 233.7,
"nb_pages_total": 6,
"pages": [
{
"page": 1,
"type": "FICHE_RECUEIL",
"duree_identification_s": 16.2,
"duree_extraction_s": 83.81,
"statut": "ok",
"erreur": null
},
{
"page": 2,
"type": "FICHE_CONCERTATION_VIDE",
"duree_identification_s": 7.65,
"duree_extraction_s": null,
"statut": "ignoree",
"erreur": null
},
{
"page": 3,
"type": "SEJOUR_MANUSCRIT",
"duree_identification_s": 9.84,
"duree_extraction_s": null,
"statut": "ignoree",
"erreur": null
},
{
"page": 4,
"type": "ELEMENTS_PREUVE",
"duree_identification_s": 8.8,
"duree_extraction_s": 37.99,
"statut": "ok",
"erreur": null
},
{
"page": 5,
"type": "FICHE_ADMIN_1_2",
"duree_identification_s": 9.78,
"duree_extraction_s": 19.28,
"statut": "ok",
"erreur": null
},
{
"page": 6,
"type": "FICHE_ADMIN_2_2",
"duree_identification_s": 14.47,
"duree_extraction_s": 24.91,
"statut": "ok",
"erreur": null
}
],
"erreurs": [],
"blocages_429": [],
"retries_total": 0
},
{
"fichier": "OGC 429.pdf",
"debut": "2026-04-21T11:16:55.318401",
"fin": "2026-04-21T11:20:58.656749",
"duree_totale_s": 243.34,
"nb_pages_total": 6,
"pages": [
{
"page": 1,
"type": "FICHE_RECUEIL",
"duree_identification_s": 10.55,
"duree_extraction_s": 71.53,
"statut": "ok",
"erreur": null
},
{
"page": 2,
"type": "FICHE_CONCERTATION_VIDE",
"duree_identification_s": 10.12,
"duree_extraction_s": null,
"statut": "ignoree",
"erreur": null
},
{
"page": 3,
"type": "SEJOUR_MANUSCRIT",
"duree_identification_s": 10.72,
"duree_extraction_s": null,
"statut": "ignoree",
"erreur": null
},
{
"page": 4,
"type": "ELEMENTS_PREUVE",
"duree_identification_s": 10.83,
"duree_extraction_s": 37.92,
"statut": "ok",
"erreur": null
},
{
"page": 5,
"type": "FICHE_ADMIN_1_2",
"duree_identification_s": 12.02,
"duree_extraction_s": 27.99,
"statut": "ok",
"erreur": null
},
{
"page": 6,
"type": "FICHE_ADMIN_2_2",
"duree_identification_s": 7.75,
"duree_extraction_s": 43.06,
"statut": "ok",
"erreur": null
}
],
"erreurs": [],
"blocages_429": [],
"retries_total": 0
}
]