From b0698059882245f3d2651fc189c9c901e10e298b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Miquel?= Date: Tue, 3 Nov 2026 11:38:39 +0100 Subject: [PATCH] Improve web finalisation navigation, caching and Anot support --- copienator/annotation_read_cache.py | 3 +- copienator/commands/add_final_score.py | 12 ++- copienator/commands/annotating.py | 11 ++- copienator/commands/finalise_web.py | 2 +- .../commands/reading_grouped_annotations.py | 2 +- copienator/commands/regenerate_reviewed.py | 22 ++++- copienator/final_scores.py | 46 +++++++++ copienator/finalisation.py | 16 +++- copienator/finalisation_server.py | 2 +- copienator/reviewed_cache.py | 5 +- ...{index-NHKKhh88.css => index-CZ3oiwq9.css} | 2 +- .../web_static/assets/index-D6hPIrMO.js | 15 --- .../web_static/assets/index-QxonPU25.js | 15 +++ copienator/web_static/index.html | 4 +- copienator_gui/app.py | 43 ++++++--- docs/finalisation_web.md | 30 +++++- tests/test_add_final_score.py | 2 + tests/test_final_scores.py | 42 +++++++++ tests/test_finalisation_web.py | 94 ++++++++++++++++++- web/src/main.tsx | 25 ++++- web/src/style.css | 4 + 21 files changed, 339 insertions(+), 58 deletions(-) create mode 100644 copienator/final_scores.py rename copienator/web_static/assets/{index-NHKKhh88.css => index-CZ3oiwq9.css} (94%) delete mode 100644 copienator/web_static/assets/index-D6hPIrMO.js create mode 100644 copienator/web_static/assets/index-QxonPU25.js create mode 100644 tests/test_final_scores.py diff --git a/copienator/annotation_read_cache.py b/copienator/annotation_read_cache.py index b96628a..23b29f8 100644 --- a/copienator/annotation_read_cache.py +++ b/copienator/annotation_read_cache.py @@ -41,7 +41,8 @@ class AnnotationReadCache: common = (_files_digest(shared), load_return_answer_options(root), configuration.RETURN_ANSWERS_ENABLED, configuration.RETURN_JPEG_ENABLED, configuration.RETURN_PDF_ENABLED, - configuration.LATEX_ANOT_BEFORE, configuration.LATEX_ANOT_AFTER) + getattr(configuration.LATEX_ANOT_BEFORE, "template", configuration.LATEX_ANOT_BEFORE), + configuration.LATEX_ANOT_AFTER) remarks = load_remarks(root) general = general_remarks.load_remarks(root) for copy_id, labels in data.items(): diff --git a/copienator/commands/add_final_score.py b/copienator/commands/add_final_score.py index 0acc022..4f65a6c 100644 --- a/copienator/commands/add_final_score.py +++ b/copienator/commands/add_final_score.py @@ -1,5 +1,6 @@ import argparse import math +import re import shutil import sys from decimal import Decimal, InvalidOperation, ROUND_CEILING @@ -37,7 +38,7 @@ def get_rounded_score(score): """Round score to one decimal place below (floor).""" try: val = float(score) - return math.floor(val * 10) / 10 + return math.floor(val * 10) / 10 if math.isfinite(val) else None except (ValueError, TypeError): return None @@ -130,6 +131,7 @@ def process_images(base_dir, output_dir, *, copy_merged_histogramme=False): print(f"Error: Directory '{search_path}' not found.") sys.exit(1) + exported_marks = {} for student_source in sorted(path for path in search_path.iterdir() if path.is_dir()): image_paths = sorted(student_source.glob("*.jpg")) pdf_paths = sorted(student_source.glob("*.pdf")) @@ -159,6 +161,7 @@ def process_images(base_dir, output_dir, *, copy_merged_histogramme=False): if score is None: print(f"Error: Invalid score '{raw_score}' for '{student_name}'.") else: + score_published = not image_paths # 5. Process Images for img_path in image_paths: try: @@ -180,13 +183,20 @@ def process_images(base_dir, output_dir, *, copy_merged_histogramme=False): draw.text((x, y), text, fill=(255, 0, 0), font=font) img.save(student_output / img_path.name) + score_published = True print(f"Processed: {student_name} -> {score}") except Exception as e: print(f"Error processing image for '{student_name}': {e}") + match = re.search(r'\((\d+)\)$', student_source.name) + if match and score_published: + exported_marks[str(int(match[1]))] = {'name': student_name, 'score': str(score)} + for pdf_path in pdf_paths: shutil.copy2(pdf_path, student_output / pdf_path.name) + from copienator.final_scores import FINAL_SCORES_FILE + atomic_write_json(base_dir / FINAL_SCORES_FILE, {'version': 1, 'copies': exported_marks}) write_score_statistics(search_path, output_dir) copy_histogram(output_dir, copy_merged_histogramme=copy_merged_histogramme) diff --git a/copienator/commands/annotating.py b/copienator/commands/annotating.py index 7cc966f..888e562 100644 --- a/copienator/commands/annotating.py +++ b/copienator/commands/annotating.py @@ -516,6 +516,7 @@ def process_student(student_id, labels_data, root_dir, all_labels, overwrite): d_notes = dict.fromkeys(all_labels, "") label_images = [] answer_labels = [] + reviewed_layouts = {} sorted_labels = sorted(labels_data.items(), key=lambda item: natural_key(item[0])) for label, content in sorted_labels: @@ -534,7 +535,7 @@ def process_student(student_id, labels_data, root_dir, all_labels, overwrite): result = content.get('result', {}) coordinates = content.get('coordinates', (0, 0)) d_notes[label] = str(result.get('score', 0)) - final_img, _ = compose_label_image( + final_img, header_height = compose_label_image( base_img, label, result, @@ -543,6 +544,8 @@ def process_student(student_id, labels_data, root_dir, all_labels, overwrite): render_fn=render_real_latex_text, source_pdf=pdf_full_path, ) + reviewed_layouts[label] = {'img': None, 'old_header_h': header_height, + 'layout': final_img.info.get('annotation_layout', layout_for(pdf_full_path))} final_img.save(staging / f"{label}.jpg") if result.get('error', "") != "empty-answer": label_images.append(final_img) @@ -561,7 +564,13 @@ def process_student(student_id, labels_data, root_dir, all_labels, overwrite): canvas.paste(image, (0, current_y)) current_y += image.height canvas.save(staging / "Concat.jpg") + if not problems: + from copienator.review_snapshot import stage + stage(output_dir, staging, labels_data, reviewed_layouts, engine='grouped') # An all-empty copy still has valid individual return images. + if not problems: + from copienator.reviewed_cache import ReviewedReadCache + ReviewedReadCache(EvaluationWorkspace(Path(root_dir)), "Anot", [output_dir]).remember([student_id]) return "partial" if problems else "success" diff --git a/copienator/commands/finalise_web.py b/copienator/commands/finalise_web.py index 1432a6b..76d12cc 100644 --- a/copienator/commands/finalise_web.py +++ b/copienator/commands/finalise_web.py @@ -8,7 +8,7 @@ from copienator import evaluation_parser def main(argv=None): parser = evaluation_parser('Open the local finalisation workspace') - parser.add_argument('--annotation-dir', choices=('BGnot', 'Bnot'), default='BGnot') + parser.add_argument('--annotation-dir', choices=('BGnot', 'Bnot', 'Anot'), default='BGnot') parser.add_argument('--no-browser', action='store_true') args = parser.parse_args(argv) from copienator.finalisation_server import WebSession diff --git a/copienator/commands/reading_grouped_annotations.py b/copienator/commands/reading_grouped_annotations.py index 1031783..ae4fe59 100644 --- a/copienator/commands/reading_grouped_annotations.py +++ b/copienator/commands/reading_grouped_annotations.py @@ -455,7 +455,7 @@ def apply_actions_and_regenerate_grouped( [(label, dirty_images[label]) for label in filtered_labels], all_labels, staging / "Concat_F.pdf", general=general, ) - if annotation_dir in {"Bnot", "BGnot"}: + if annotation_dir in {"Bnot", "BGnot", "Anot"}: review_snapshot.stage(output_dir, staging, reviewed_data, label_notes, engine="grouped", selected=selected_labels, force_filtered=(set(filtered_labels) - selected_labels) if selected_labels else (force_filtered or ())) diff --git a/copienator/commands/regenerate_reviewed.py b/copienator/commands/regenerate_reviewed.py index a8c6d83..606dd6f 100644 --- a/copienator/commands/regenerate_reviewed.py +++ b/copienator/commands/regenerate_reviewed.py @@ -8,6 +8,26 @@ from copienator.commands.reading_grouped_annotations import apply_actions_and_re def run(workspace: EvaluationWorkspace, mode: str, *, incremental: bool = False): directories = sorted((p for p in (workspace.root / mode).glob('Copie*') if p.is_dir() and p.name[5:].isdigit() and (p / 'score.json').is_file())) + # Legacy Anot outputs predate saved rendering inputs; create them without + # replacing any existing score or annotated image. + missing = [d for d in directories if not (d / FILENAME).is_file()] + if mode == 'Anot' and missing: + from copienator.annotation_data import load_annotation_data + from copienator.annotation_layout import layout_for + from copienator.filesystem import staged_files + from copienator.review_snapshot import stage + loaded = load_annotation_data(workspace) + if loaded.warnings: + raise ValueError("Relancez la génération Anot : " + "; ".join(loaded.warnings)) + for directory in missing: + cid = directory.name[5:] + if cid not in loaded.data: + raise ValueError(f"Données Anot absentes pour {directory.name}.") + data = loaded.data[cid] + notes = {label: {'img': None, 'old_header_h': 0, 'layout': layout_for(content['pdf_path'])} + for label, content in data.items()} + with staged_files(directory) as staging: + stage(directory, staging, data, notes, engine='grouped') from copienator.reviewed_cache import ReviewedReadCache cache = ReviewedReadCache(workspace, mode, directories) if incremental else None if cache: @@ -47,6 +67,6 @@ def run(workspace: EvaluationWorkspace, mode: str, *, incremental: bool = False) def main(argv=None): parser = evaluation_parser('Regenerate from saved reviewed inputs without rescanning handwriting') - parser.add_argument('--annotation-dir', choices=('Bnot', 'BGnot'), required=True) + parser.add_argument('--annotation-dir', choices=('Bnot', 'BGnot', 'Anot'), required=True) parser.add_argument("--incremental", action="store_true", help="Skip unchanged copies") return execute(parser, argv, lambda args: run(workspace_from_args(args), args.annotation_dir, incremental=args.incremental)) diff --git a/copienator/final_scores.py b/copienator/final_scores.py new file mode 100644 index 0000000..562f760 --- /dev/null +++ b/copienator/final_scores.py @@ -0,0 +1,46 @@ +"""Last exported overall marks, keyed by stable copy ID rather than student name.""" +from pathlib import Path + +from copienator import read_json, configuration +from copienator.return_identity import return_folders, RETURN_FOLDER_PATTERN + +FINAL_SCORES_FILE = Path('.copienator') / 'final_scores.json' + + +def exported_scores(root: Path, repository: Path) -> dict[str, str]: + saved = root / FINAL_SCORES_FILE + if saved.is_file(): + data = read_json(saved) + return {str(int(cid)): entry['score'] for cid, entry in data.get('copies', {}).items() + if cid.isdecimal() and isinstance(entry, dict) and isinstance(entry.get('score'), str)} + + # Older exports have no machine-readable overall mark. Only use their ODS + # when it predates the exported media; a newer sheet may contain other marks. + output = Path(configuration.FINAL_SCORE_OUTPUT_DIR).expanduser() + ods = Path(configuration.FINAL_SCORE_ODS_PATH).expanduser() + output = output if output.is_absolute() else repository / output + ods = ods if ods.is_absolute() else repository / ods + if not ods.is_file() or not (output / root.name).is_dir(): + return {} + candidates = {} + for cid, folder in return_folders(root).items(): + name = RETURN_FOLDER_PATTERN.fullmatch(folder.name)['name'] + media = [p for p in (output / root.name / name).glob('*') + if p.suffix.lower() in ('.jpg', '.pdf') and p.is_file()] + if media and ods.stat().st_mtime_ns <= min(p.stat().st_mtime_ns for p in media): + candidates[str(cid)] = name + if not candidates: + return {} + try: + import pandas as pd + from copienator.commands.add_final_score import get_rounded_score + sheet = pd.read_excel(ods, engine='odf', header=None) + values = dict(zip(sheet[0], sheet[1])) + result = {} + for cid, name in candidates.items(): + score = get_rounded_score(values.get(name)) + if score is not None: + result[cid] = str(score) + return result + except (OSError, ValueError, KeyError, ImportError, OverflowError): + return {} diff --git a/copienator/finalisation.py b/copienator/finalisation.py index 2836a30..eb3e6eb 100644 --- a/copienator/finalisation.py +++ b/copienator/finalisation.py @@ -20,8 +20,8 @@ class Finalisation: def __init__(self, root: Path, mode: str, token: str, lock_fd: int | None = None, *, repository: Path | None = None): self.root = root.resolve() self.repository = (repository or Path.cwd()).resolve() - if mode not in ('Bnot', 'BGnot'): - raise ValueError('Choisissez Bnot ou BGnot.') + if mode not in ('Bnot', 'BGnot', 'Anot'): + raise ValueError('Choisissez Anot, Bnot ou BGnot.') self.mode, self.token = mode, token self.lock_fd = lock_fd self.labels = utils.read_all_labels(self.root) @@ -66,6 +66,8 @@ class Finalisation: def state(self): with self.mutex: folders = return_folders(self.root) + from copienator.final_scores import exported_scores + final_scores = exported_scores(self.root, self.repository) copies = [] for directory in self.copies(): cid = directory.name[5:] @@ -75,7 +77,7 @@ class Finalisation: scores = read_json(directory / 'score.json') info = read_json(directory / 'info.json', default={}) base = read_json(directory / BASELINE, default={}) - copies.append({'id': cid, 'name': name, 'general': general_remarks.remarks_for_copy(self.root, cid), + copies.append({'id': cid, 'name': name, 'finalScore': final_scores.get(str(int(cid))), 'general': general_remarks.remarks_for_copy(self.root, cid), 'answers': [{'label': label, 'score': str(scores.get(label, '')), 'remark': custom_remarks.remarks_for_copy(self.root, cid).get(label, ''), 'image': (directory / f'{label}.jpg').is_file(), @@ -98,6 +100,8 @@ class Finalisation: raise ValueError('Les données ont changé. Rechargez la page avant de réessayer.') kind, value = data['kind'], data['value'] if kind == 'draft': + if self.mode == 'Anot': + raise ValueError('Les coupes et transferts nécessitent Bnot ou BGnot.') instructions = read_instructions(value, self.mode) validate_instructions(self.root, self.mode, instructions) # Same filesystem and atomic replacement; retain the GUI-readable format. @@ -137,6 +141,8 @@ class Finalisation: with self.mutex: if self.job['running'] or self.closing or revision != self.revision(): raise ValueError('Traitement déjà en cours ou données modifiées. Rechargez la page.') + if apply_draft and self.mode == 'Anot': + raise ValueError('Les coupes et transferts nécessitent Bnot ou BGnot.') if apply_draft: validate_instructions(self.root, self.mode, read_instructions(self.draft(), self.mode)) if not (self.root / DRAFT).exists(): @@ -166,7 +172,7 @@ class Finalisation: outputs = [] for directory in directories: info = read_json(directory / 'info.json', default={}) - paths = [directory / 'info.json', directory / BASELINE] + paths = [directory / 'info.json', directory / (FILENAME if self.mode == 'Anot' else BASELINE)] paths += [directory / f'{label}.jpg' for label, entry in info.items() if entry['present']] paths += list(directory.glob('Concat*.*')) if any(not path.is_file() for path in paths): @@ -194,7 +200,7 @@ class Finalisation: commands = [['giving-names', str(self.root), self.mode]] with self.mutex: self.job['log'] += 'Noms seuls modifiés : conservation des images et PDF de correction.\n' - elif all((directory / FILENAME).is_file() for directory in self.copies()): + elif self.mode == 'Anot' or all((directory / FILENAME).is_file() for directory in self.copies()): commands[0] = ['regenerate-reviewed', str(self.root), '--annotation-dir', self.mode] elif (self.root / 'BRnot').is_dir(): with self.mutex: diff --git a/copienator/finalisation_server.py b/copienator/finalisation_server.py index 0cf5d26..461d3b2 100644 --- a/copienator/finalisation_server.py +++ b/copienator/finalisation_server.py @@ -181,7 +181,7 @@ class WebSession: try: self.service = Finalisation(root, mode, self.lease.token, self.lease.stream.fileno(), repository=repository) if not self.service.copies(): - raise ValueError('Lisez les annotations manuscrites dans ce mode avant d’ouvrir la finalisation web.') + raise ValueError('Générez les copies Anot, ou lisez les annotations Bnot/BGnot, avant d’ouvrir la finalisation web.') self.token = secrets.token_urlsafe(32) self.socket = socket.socket() self.socket.bind(('127.0.0.1', 0)) diff --git a/copienator/reviewed_cache.py b/copienator/reviewed_cache.py index a73d91d..49c0171 100644 --- a/copienator/reviewed_cache.py +++ b/copienator/reviewed_cache.py @@ -29,10 +29,11 @@ class ReviewedReadCache(AnnotationReadCache): shared = [root / 'labels'] for folder in ('Text2', 'Sol2'): shared.extend((root / folder).glob('*.pdf')) - common = (_files_digest(shared), configuration.LATEX_ANOT_BEFORE, configuration.LATEX_ANOT_AFTER) + common = (_files_digest(shared), getattr(configuration.LATEX_ANOT_BEFORE, "template", configuration.LATEX_ANOT_BEFORE), + configuration.LATEX_ANOT_AFTER) remarks, general = load_remarks(root), general_remarks.load_remarks(root) applied = root / mode / APPLIED - instructions = read_instructions(applied.read_text(), mode) if applied.is_file() else [] + instructions = read_instructions(applied.read_text(), mode) if applied.is_file() and mode != "Anot" else [] for directory in directories: cid = directory.name[5:] saved = read_json(directory / FILENAME) diff --git a/copienator/web_static/assets/index-NHKKhh88.css b/copienator/web_static/assets/index-CZ3oiwq9.css similarity index 94% rename from copienator/web_static/assets/index-NHKKhh88.css rename to copienator/web_static/assets/index-CZ3oiwq9.css index 212c2e7..02fff85 100644 --- a/copienator/web_static/assets/index-NHKKhh88.css +++ b/copienator/web_static/assets/index-CZ3oiwq9.css @@ -1 +1 @@ -:root{font-family:Inter,ui-sans-serif,system-ui,sans-serif;color:#23323a;background:#f3f5f4;font-synthesis:none;font-size:14px}*{box-sizing:border-box}body{margin:0}button,input,select,textarea{font:inherit}button,a,input,select,textarea{outline-offset:3px}button{border:1px solid #c8d3ce;border-radius:7px;background:#fff;color:#244b40;padding:9px 13px;cursor:pointer;font-weight:550}button:hover:not(:disabled){background:#e9f1ed;border-color:#769b88}button:disabled{opacity:.45;cursor:default}.primary{background:#205c48;color:#fff;border-color:#205c48}.primary:hover:not(:disabled){background:#174633;color:#fff}a{color:#21654e;text-decoration:none}a:hover{text-decoration:underline}header{display:flex;align-items:center;gap:32px;padding:20px 36px;border-bottom:1px solid #dbe3de;background:#fff}.brand{display:flex;align-items:center;gap:10px;font-size:23px;font-weight:800;color:#28684f}.brand span{font-size:16px;font-weight:650}.heading{flex:1;border-left:1px solid #dbe3de;padding-left:30px}h1{font-size:22px;margin:3px 0 0}h2{font-size:20px;margin:0 0 8px}h3{font-size:19px;margin:7px 0}p{line-height:1.55;margin:8px 0;color:#56666b}.eyebrow{font-size:11px;letter-spacing:.09em;color:#5c7470;font-weight:650}main{max-width:1540px;margin:auto;padding:30px 36px 60px}.toolbar{display:flex;align-items:end;justify-content:space-between;gap:24px;margin-bottom:24px}.filters{display:flex;gap:12px;align-items:end}label{display:flex;flex-direction:column;gap:6px;color:#405650;font-size:12px;font-weight:600}input,select,textarea{border:1px solid #c5d1cb;border-radius:6px;background:#fff;padding:9px 10px;color:#263d34;font-size:14px;min-width:0}textarea{resize:vertical;min-height:76px;line-height:1.5}input:focus,textarea:focus,select:focus{outline:2px solid #80b69c;border-color:#4d8269}input[type=checkbox]{width:16px;height:16px;accent-color:#205c48}.check{display:flex;flex-direction:row;align-items:center;max-width:310px;font-size:12px;line-height:1.4}.publish{display:flex;align-items:center;gap:16px;background:#e8f0eb;border:1px solid #d0e0d5;border-radius:10px;padding:17px 20px;margin:20px 0}.publish>div{flex:1}.publish small{display:block;margin-top:5px;color:#5b6e64}.panel{padding:18px 20px;background:#fff;border:1px solid #d9e2dd;border-radius:9px;margin-bottom:14px}summary{cursor:pointer;font-weight:600}summary span{float:right;font-size:12px;font-weight:400;color:#65766f}.identity{border-top:1px solid #e1e7e3;padding:18px 0;display:grid;grid-template-columns:280px 1fr;gap:28px}.identity-name{display:flex;flex-direction:column;gap:10px;align-items:start}.identity-name label{width:100%}.general button{margin:5px 6px 0 0}.remark-row{display:flex;align-items:center;gap:6px;margin-bottom:8px}.remark-row textarea{flex:1}.instructions{width:100%;font-family:ui-monospace,monospace;min-height:140px;margin:10px 0}.panel details{margin-top:16px}.results{display:flex;justify-content:space-between;align-items:center;margin:30px 0 12px}.results span{color:#677872;font-size:12px}.answer-grid{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:22px}.answer{border:1px solid #d9e1dd;background:#fff;border-radius:10px;overflow:hidden}.card-heading{display:flex;justify-content:space-between;align-items:center;padding:18px 20px;gap:12px}.badge{font-size:11px;background:#edf1ee;color:#5a6e62;border-radius:4px;padding:5px 7px;white-space:nowrap}.warning{background:#fff2d8;color:#8a620b}.image-space{height:290px;overflow:hidden;background:#e7ece9;border-top:1px solid #e2e8e3;border-bottom:1px solid #e2e8e3;display:flex;justify-content:center;align-items:start;padding:12px}.image-button{position:relative;border:0;padding:0;background:#fff;width:100%;height:100%;overflow:hidden;border-radius:0}.image-button img{width:100%;display:block}.image-button span{position:absolute;bottom:8px;right:8px;background:#203d32e8;color:#fff;border-radius:5px;padding:7px 10px;font-size:12px}.answer-form{display:grid;grid-template-columns:88px 1fr;gap:15px;padding:18px 20px 10px}.card-actions{display:flex;flex-wrap:wrap;align-items:center;gap:10px;padding:8px 20px 20px}.card-actions a{font-size:12px}.empty{padding:32px;color:#77877e;font-style:italic;text-align:center}.load-more{display:block;margin:24px auto}.alert{background:#fff0eb;color:#8f3827;border:1px solid #e9b6a9;border-radius:7px;padding:12px;display:flex;gap:12px;align-items:center}.alert small{font-size:12px}.notice{color:#216044}.muted{font-size:12px}fieldset{padding:0;margin:0;border:0;min-width:0}.overlay{position:fixed;inset:0;background:#142d23b8;z-index:10;display:flex;align-items:center;justify-content:center;padding:24px}.modal{width:min(1300px,100%);max-height:94vh;overflow:auto;border-radius:12px;background:#f8faf8;padding:24px;box-shadow:0 24px 80px #001c2e55}.modal-head{display:flex;justify-content:space-between;align-items:center;gap:20px}.cut-controls{display:flex;gap:15px;flex-wrap:wrap;margin:20px 0}.compare{display:grid;grid-template-columns:1fr 1fr;gap:24px}.compare>div{min-width:0}.compare img{width:100%;display:block}.cut-image{position:relative;cursor:crosshair}.cut-line{position:absolute;left:0;right:0;height:0;border-top:2px dashed #e15635;pointer-events:none}.cut-line span{position:absolute;right:0;top:0;background:#e15635;color:#fff;padding:3px}.instruction-line{display:block;background:#e7eee9;padding:12px;margin:18px 0;overflow:auto}.modal-actions{display:flex;gap:12px}.viewer{display:flex;flex-direction:column;height:94vh}.zoom-scroll{overflow:auto;flex:1;background:#e2e8e3;margin-top:16px}.zoom-scroll img{display:block}.log{white-space:pre-wrap;background:#15281f;color:#dcecdf;padding:20px;max-height:400px;overflow:auto}.end{max-width:650px;margin:15vh auto}pre{white-space:pre-wrap;overflow-wrap:anywhere}@media(max-width:1000px){header{padding:16px;gap:16px}.brand span{display:none}main{padding:20px}.toolbar,.publish{flex-wrap:wrap}.toolbar>div,.publish>div{width:100%}.answer-grid,.identity{grid-template-columns:1fr}.compare{gap:12px}}@media(max-width:600px){.filters{flex-wrap:wrap}.heading{padding-left:15px}.quiet{max-width:150px}.compare{grid-template-columns:1fr}.overlay{padding:8px}.modal{padding:16px}.remark-row{flex-wrap:wrap}.remark-row textarea{flex-basis:100%}.results span{display:none}}.draft-list{margin:16px 0}.draft-row{display:flex;align-items:center;gap:8px;padding:8px 0;border-bottom:1px solid #e2e8e3}.draft-row code{flex:1;overflow-wrap:anywhere}.draft-row button{padding:6px 9px}.publish>div{min-width:190px}@media(max-width:1000px){.publish>div{flex:1 0 100%}}.identity-overview{margin-top:18px;padding:16px;background:#f3f6f4;border-radius:7px}.identity-overview .check{max-width:none;margin-top:14px}.missing-names{display:flex;flex-wrap:wrap;gap:6px 24px;padding-left:20px;margin:10px 0 16px} +:root{font-family:Inter,ui-sans-serif,system-ui,sans-serif;color:#23323a;background:#f3f5f4;font-synthesis:none;font-size:14px}*{box-sizing:border-box}body{margin:0}button,input,select,textarea{font:inherit}button,a,input,select,textarea{outline-offset:3px}button{border:1px solid #c8d3ce;border-radius:7px;background:#fff;color:#244b40;padding:9px 13px;cursor:pointer;font-weight:550}button:hover:not(:disabled){background:#e9f1ed;border-color:#769b88}button:disabled{opacity:.45;cursor:default}.primary{background:#205c48;color:#fff;border-color:#205c48}.primary:hover:not(:disabled){background:#174633;color:#fff}a{color:#21654e;text-decoration:none}a:hover{text-decoration:underline}header{display:flex;align-items:center;gap:32px;padding:20px 36px;border-bottom:1px solid #dbe3de;background:#fff}.brand{display:flex;align-items:center;gap:10px;font-size:23px;font-weight:800;color:#28684f}.brand span{font-size:16px;font-weight:650}.heading{flex:1;border-left:1px solid #dbe3de;padding-left:30px}h1{font-size:22px;margin:3px 0 0}h2{font-size:20px;margin:0 0 8px}h3{font-size:19px;margin:7px 0}p{line-height:1.55;margin:8px 0;color:#56666b}.eyebrow{font-size:11px;letter-spacing:.09em;color:#5c7470;font-weight:650}main{max-width:1540px;margin:auto;padding:30px 36px 60px}.toolbar{display:flex;align-items:end;justify-content:space-between;gap:24px;margin-bottom:24px}.filters{display:flex;gap:12px;align-items:end}label{display:flex;flex-direction:column;gap:6px;color:#405650;font-size:12px;font-weight:600}input,select,textarea{border:1px solid #c5d1cb;border-radius:6px;background:#fff;padding:9px 10px;color:#263d34;font-size:14px;min-width:0}textarea{resize:vertical;min-height:76px;line-height:1.5}input:focus,textarea:focus,select:focus{outline:2px solid #80b69c;border-color:#4d8269}input[type=checkbox]{width:16px;height:16px;accent-color:#205c48}.check{display:flex;flex-direction:row;align-items:center;max-width:310px;font-size:12px;line-height:1.4}.publish{display:flex;align-items:center;gap:16px;background:#e8f0eb;border:1px solid #d0e0d5;border-radius:10px;padding:17px 20px;margin:20px 0}.publish>div{flex:1}.publish small{display:block;margin-top:5px;color:#5b6e64}.panel{padding:18px 20px;background:#fff;border:1px solid #d9e2dd;border-radius:9px;margin-bottom:14px}summary{cursor:pointer;font-weight:600}summary span{float:right;font-size:12px;font-weight:400;color:#65766f}.identity{border-top:1px solid #e1e7e3;padding:18px 0;display:grid;grid-template-columns:280px 1fr;gap:28px}.identity-name{display:flex;flex-direction:column;gap:10px;align-items:start}.identity-name label{width:100%}.general button{margin:5px 6px 0 0}.remark-row{display:flex;align-items:center;gap:6px;margin-bottom:8px}.remark-row textarea{flex:1}.instructions{width:100%;font-family:ui-monospace,monospace;min-height:140px;margin:10px 0}.panel details{margin-top:16px}.results{display:flex;justify-content:space-between;align-items:center;margin:30px 0 12px}.results span{color:#677872;font-size:12px}.answer-grid{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:22px}.answer{border:1px solid #d9e1dd;background:#fff;border-radius:10px;overflow:hidden}.card-heading{display:flex;justify-content:space-between;align-items:center;padding:18px 20px;gap:12px}.badge{font-size:11px;background:#edf1ee;color:#5a6e62;border-radius:4px;padding:5px 7px;white-space:nowrap}.warning{background:#fff2d8;color:#8a620b}.image-space{height:290px;overflow:hidden;background:#e7ece9;border-top:1px solid #e2e8e3;border-bottom:1px solid #e2e8e3;display:flex;justify-content:center;align-items:start;padding:12px}.image-button{position:relative;border:0;padding:0;background:#fff;width:100%;height:100%;overflow:hidden;border-radius:0}.image-button img{width:100%;display:block}.image-button span{position:absolute;bottom:8px;right:8px;background:#203d32e8;color:#fff;border-radius:5px;padding:7px 10px;font-size:12px}.answer-form{display:grid;grid-template-columns:88px 1fr;gap:15px;padding:18px 20px 10px}.card-actions{display:flex;flex-wrap:wrap;align-items:center;gap:10px;padding:8px 20px 20px}.card-actions a{font-size:12px}.empty{padding:32px;color:#77877e;font-style:italic;text-align:center}.load-more{display:block;margin:24px auto}.alert{background:#fff0eb;color:#8f3827;border:1px solid #e9b6a9;border-radius:7px;padding:12px;display:flex;gap:12px;align-items:center}.alert small{font-size:12px}.notice{color:#216044}.muted{font-size:12px}fieldset{padding:0;margin:0;border:0;min-width:0}.overlay{position:fixed;inset:0;background:#142d23b8;z-index:10;display:flex;align-items:center;justify-content:center;padding:24px}.modal{width:min(1300px,100%);max-height:94vh;overflow:auto;border-radius:12px;background:#f8faf8;padding:24px;box-shadow:0 24px 80px #001c2e55}.modal-head{display:flex;justify-content:space-between;align-items:center;gap:20px}.cut-controls{display:flex;gap:15px;flex-wrap:wrap;margin:20px 0}.compare{display:grid;grid-template-columns:1fr 1fr;gap:24px}.compare>div{min-width:0}.compare img{width:100%;display:block}.cut-image{position:relative;cursor:crosshair}.cut-line{position:absolute;left:0;right:0;height:0;border-top:2px dashed #e15635;pointer-events:none}.cut-line span{position:absolute;right:0;top:0;background:#e15635;color:#fff;padding:3px}.instruction-line{display:block;background:#e7eee9;padding:12px;margin:18px 0;overflow:auto}.modal-actions{display:flex;gap:12px}.viewer{display:flex;flex-direction:column;height:94vh}.zoom-scroll{overflow:auto;flex:1;background:#e2e8e3;margin-top:16px}.zoom-scroll img{display:block}.log{white-space:pre-wrap;background:#15281f;color:#dcecdf;padding:20px;max-height:400px;overflow:auto}.end{max-width:650px;margin:15vh auto}pre{white-space:pre-wrap;overflow-wrap:anywhere}@media(max-width:1000px){header{padding:16px;gap:16px}.brand span{display:none}main{padding:20px}.toolbar,.publish{flex-wrap:wrap}.toolbar>div,.publish>div{width:100%}.answer-grid,.identity{grid-template-columns:1fr}.compare{gap:12px}}@media(max-width:600px){.filters{flex-wrap:wrap}.heading{padding-left:15px}.quiet{max-width:150px}.compare{grid-template-columns:1fr}.overlay{padding:8px}.modal{padding:16px}.remark-row{flex-wrap:wrap}.remark-row textarea{flex-basis:100%}.results span{display:none}}.draft-list{margin:16px 0}.draft-row{display:flex;align-items:center;gap:8px;padding:8px 0;border-bottom:1px solid #e2e8e3}.draft-row code{flex:1;overflow-wrap:anywhere}.draft-row button{padding:6px 9px}.publish>div{min-width:190px}@media(max-width:1000px){.publish>div{flex:1 0 100%}}.identity-overview{margin-top:18px;padding:16px;background:#f3f6f4;border-radius:7px}.identity-overview .check{max-width:none;margin-top:14px}.missing-names{display:flex;flex-wrap:wrap;gap:6px 24px;padding-left:20px;margin:10px 0 16px}.filters{flex-wrap:wrap;justify-content:flex-end}.filters input[list=copy-names]{width:245px}.final-score{display:flex;align-items:center;justify-content:space-between;gap:16px;flex-wrap:wrap;padding:16px 20px;border:1px solid #b9d4c4;background:#e8f0eb;border-radius:9px;margin:16px 0}.final-score strong{font-size:20px;color:#205c48} diff --git a/copienator/web_static/assets/index-D6hPIrMO.js b/copienator/web_static/assets/index-D6hPIrMO.js deleted file mode 100644 index ea279f5..0000000 --- a/copienator/web_static/assets/index-D6hPIrMO.js +++ /dev/null @@ -1,15 +0,0 @@ -(function(){const X=document.createElement("link").relList;if(X&&X.supports&&X.supports("modulepreload"))return;for(const B of document.querySelectorAll('link[rel="modulepreload"]'))h(B);new MutationObserver(B=>{for(const $ of B)if($.type==="childList")for(const sl of $.addedNodes)sl.tagName==="LINK"&&sl.rel==="modulepreload"&&h(sl)}).observe(document,{childList:!0,subtree:!0});function G(B){const $={};return B.integrity&&($.integrity=B.integrity),B.referrerPolicy&&($.referrerPolicy=B.referrerPolicy),B.crossOrigin==="use-credentials"?$.credentials="include":B.crossOrigin==="anonymous"?$.credentials="omit":$.credentials="same-origin",$}function h(B){if(B.ep)return;B.ep=!0;const $=G(B);fetch(B.href,$)}})();var zs={exports:{}},cn={};var lv;function iy(){if(lv)return cn;lv=1;var N=Symbol.for("react.transitional.element"),X=Symbol.for("react.fragment");function G(h,B,$){var sl=null;if($!==void 0&&(sl=""+$),B.key!==void 0&&(sl=""+B.key),"key"in B){$={};for(var Bl in B)Bl!=="key"&&($[Bl]=B[Bl])}else $=B;return B=$.ref,{$$typeof:N,type:h,key:sl,ref:B!==void 0?B:null,props:$}}return cn.Fragment=X,cn.jsx=G,cn.jsxs=G,cn}var tv;function cy(){return tv||(tv=1,zs.exports=iy()),zs.exports}var r=cy(),Ns={exports:{}},L={};var ev;function fy(){if(ev)return L;ev=1;var N=Symbol.for("react.transitional.element"),X=Symbol.for("react.portal"),G=Symbol.for("react.fragment"),h=Symbol.for("react.strict_mode"),B=Symbol.for("react.profiler"),$=Symbol.for("react.consumer"),sl=Symbol.for("react.context"),Bl=Symbol.for("react.forward_ref"),el=Symbol.for("react.suspense"),Al=Symbol.for("react.memo"),R=Symbol.for("react.lazy"),T=Symbol.for("react.activity"),M=Symbol.for("react.view_transition"),zl=Symbol.iterator;function Gl(o){return o===null||typeof o!="object"?null:(o=zl&&o[zl]||o["@@iterator"],typeof o=="function"?o:null)}var Dl={isMounted:function(){return!1},enqueueForceUpdate:function(){},enqueueReplaceState:function(){},enqueueSetState:function(){}},il=Object.assign,et={};function Nl(o,O,x){this.props=o,this.context=O,this.refs=et,this.updater=x||Dl}Nl.prototype.isReactComponent={},Nl.prototype.setState=function(o,O){if(typeof o!="object"&&typeof o!="function"&&o!=null)throw Error("takes an object of state variables to update or a function which returns an object of state variables.");this.updater.enqueueSetState(this,o,O,"setState")},Nl.prototype.forceUpdate=function(o){this.updater.enqueueForceUpdate(this,o,"forceUpdate")};function St(){}St.prototype=Nl.prototype;function Xl(o,O,x){this.props=o,this.context=O,this.refs=et,this.updater=x||Dl}var ut=Xl.prototype=new St;ut.constructor=Xl,il(ut,Nl.prototype),ut.isPureReactComponent=!0;var Rl=Array.isArray;function K(){}var k={H:null,A:null,T:null,S:null},it=Object.prototype.hasOwnProperty;function Jl(o,O,x){var H=x.ref;return{$$typeof:N,type:o,key:O,ref:H!==void 0?H:null,props:x}}function wl(o,O){return Jl(o.type,O,o.props)}function Ml(o){return typeof o=="object"&&o!==null&&o.$$typeof===N}function at(o){var O={"=":"=0",":":"=2"};return"$"+o.replace(/[=:]/g,function(x){return O[x]})}var Z=/\/+/g;function gl(o,O){return typeof o=="object"&&o!==null&&o.key!=null?at(""+o.key):O.toString(36)}function j(o){switch(o.status){case"fulfilled":return o.value;case"rejected":throw o.reason;default:switch(typeof o.status=="string"?o.then(K,K):(o.status="pending",o.then(function(O){o.status==="pending"&&(o.status="fulfilled",o.value=O)},function(O){o.status==="pending"&&(o.status="rejected",o.reason=O)})),o.status){case"fulfilled":return o.value;case"rejected":throw o.reason}}throw o}function Q(o,O,x,H,F){var b=typeof o;(b==="undefined"||b==="boolean")&&(o=null);var _=!1;if(o===null)_=!0;else switch(b){case"bigint":case"string":case"number":_=!0;break;case"object":switch(o.$$typeof){case N:case X:_=!0;break;case R:return _=o._init,Q(_(o._payload),O,x,H,F)}}if(_)return F=F(o),_=H===""?"."+gl(o,0):H,Rl(F)?(x="",_!=null&&(x=_.replace(Z,"$&/")+"/"),Q(F,O,x,"",function(ol){return ol})):F!=null&&(Ml(F)&&(F=wl(F,x+(F.key==null||o&&o.key===F.key?"":(""+F.key).replace(Z,"$&/")+"/")+_)),O.push(F)),1;_=0;var A=H===""?".":H+":";if(Rl(o))for(var D=0;D>>1,al=j[ul];if(0>>1;ulB(bt,Y))oB(O,bt)?(j[ul]=O,j[o]=Y,ul=o):(j[ul]=bt,j[pt]=Y,ul=pt);else if(oB(O,Y))j[ul]=O,j[o]=Y,ul=o;else break l}}return Q}function B(j,Q){var Y=j.sortIndex-Q.sortIndex;return Y!==0?Y:j.id-Q.id}if(N.unstable_now=void 0,typeof performance=="object"&&typeof performance.now=="function"){var $=performance;N.unstable_now=function(){return $.now()}}else{var sl=Date,Bl=sl.now();N.unstable_now=function(){return sl.now()-Bl}}var el=[],Al=[],R=1,T=null,M=3,zl=!1,Gl=!1,Dl=!1,il=!1,et=typeof setTimeout=="function"?setTimeout:null,Nl=typeof clearTimeout=="function"?clearTimeout:null,St=typeof setImmediate<"u"?setImmediate:null;function Xl(j){for(var Q=G(Al);Q!==null;){if(Q.callback===null)h(Al);else if(Q.startTime<=j)h(Al),Q.sortIndex=Q.expirationTime,X(el,Q);else break;Q=G(Al)}}function ut(j){if(Dl=!1,Xl(j),!Gl)if(G(el)!==null)Gl=!0,Rl||(Rl=!0,Ml());else{var Q=G(Al);Q!==null&&gl(ut,Q.startTime-j)}}var Rl=!1,K=-1,k=5,it=-1;function Jl(){return il?!0:!(N.unstable_now()-itj&&Jl());){var ul=T.callback;if(typeof ul=="function"){T.callback=null,M=T.priorityLevel;var al=ul(T.expirationTime<=j);if(j=N.unstable_now(),typeof al=="function"){T.callback=al,Xl(j),Q=!0;break t}T===G(el)&&h(el),Xl(j)}else h(el);T=G(el)}if(T!==null)Q=!0;else{var rt=G(Al);rt!==null&&gl(ut,rt.startTime-j),Q=!1}}break l}finally{T=null,M=Y,zl=!1}Q=void 0}}finally{Q?Ml():Rl=!1}}}var Ml;if(typeof St=="function")Ml=function(){St(wl)};else if(typeof MessageChannel<"u"){var at=new MessageChannel,Z=at.port2;at.port1.onmessage=wl,Ml=function(){Z.postMessage(null)}}else Ml=function(){et(wl,0)};function gl(j,Q){K=et(function(){j(N.unstable_now())},Q)}N.unstable_IdlePriority=5,N.unstable_ImmediatePriority=1,N.unstable_LowPriority=4,N.unstable_NormalPriority=3,N.unstable_Profiling=null,N.unstable_UserBlockingPriority=2,N.unstable_cancelCallback=function(j){j.callback=null},N.unstable_forceFrameRate=function(j){0>j||125ul?(j.sortIndex=Y,X(Al,j),G(el)===null&&j===G(Al)&&(Dl?(Nl(K),K=-1):Dl=!0,gl(ut,Y-ul))):(j.sortIndex=al,X(el,j),Gl||zl||(Gl=!0,Rl||(Rl=!0,Ml()))),j},N.unstable_shouldYield=Jl,N.unstable_wrapCallback=function(j){var Q=M;return function(){var Y=M;M=Q;try{return j.apply(this,arguments)}finally{M=Y}}}})(As)),As}var nv;function oy(){return nv||(nv=1,Os.exports=sy()),Os.exports}var Cs={exports:{}},tt={};var iv;function ry(){if(iv)return tt;iv=1;var N=js();function X(R){var T="https://react.dev/errors/"+R;if(1"u"||typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE!="function"))try{__REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE(N)}catch(X){console.error(X)}}return N(),Cs.exports=ry(),Cs.exports}var fv;function vy(){if(fv)return fn;fv=1;var N=oy(),X=js(),G=dy();function h(l){var t="https://react.dev/errors/"+l;if(1Ft||(l.current=pl[Ft],pl[Ft]=null,Ft--)}function bl(l,t){Ft++,pl[Ft]=l.current,l.current=t}var Wt=Ut(null),da=Ut(null),Ne=Ut(null),on=Ut(null);function rn(l,t){switch(bl(Ne,t),bl(da,l),bl(Wt,null),t.nodeType){case 9:case 11:l=(l=t.documentElement)&&(l=l.namespaceURI)?s0(l):0;break;default:if(l=t.tagName,t=t.namespaceURI)t=s0(t),l=o0(t,l);else switch(l){case"svg":l=1;break;case"math":l=2;break;default:l=0}}$l(Wt),bl(Wt,l)}function Eu(){$l(Wt),$l(da),$l(Ne)}function Qi(l){var t=l.memoizedState;t!==null&&(fa._currentValue=t.memoizedState,bl(on,l)),t=Wt.current;var e=o0(t,l.type);t!==e&&(bl(da,l),bl(Wt,e))}function dn(l){da.current===l&&($l(Wt),$l(da)),on.current===l&&($l(on),fa._currentValue=ol)}var Vi,Ds;function _e(l){if(Vi===void 0)try{throw Error()}catch(e){var t=e.stack.trim().match(/\n( *(at )?)/);Vi=t&&t[1]||"",Ds=-1)":-1a||f[u]!==m[a]){var S=` -`+f[u].replace(" at new "," at ");return l.displayName&&S.includes("")&&(S=S.replace("",l.displayName)),S}while(1<=u&&0<=a);break}}}finally{Zi=!1,Error.prepareStackTrace=e}return(e=l?l.displayName||l.name:"")?_e(e):""}function ov(l,t){switch(l.tag){case 26:case 27:case 5:return _e(l.type);case 16:return _e("Lazy");case 13:return l.child!==t&&t!==null?_e("Suspense Fallback"):_e("Suspense");case 19:return _e("SuspenseList");case 0:case 15:return Li(l.type,!1);case 11:return Li(l.type.render,!1);case 1:return Li(l.type,!0);case 31:return _e("Activity");case 30:return _e("ViewTransition");default:return""}}function Ms(l){try{var t="",e=null;do t+=ov(l,e),e=l,l=l.return;while(l);return t}catch(u){return` -Error generating stack: `+u.message+` -`+u.stack}}var Ki=Object.prototype.hasOwnProperty,Ji=N.unstable_scheduleCallback,wi=N.unstable_cancelCallback,rv=N.unstable_shouldYield,dv=N.unstable_requestPaint,Tt=N.unstable_now,vv=N.unstable_getCurrentPriorityLevel,ps=N.unstable_ImmediatePriority,Us=N.unstable_UserBlockingPriority,vn=N.unstable_NormalPriority,mv=N.unstable_LowPriority,Rs=N.unstable_IdlePriority,hv=N.log,yv=N.unstable_setDisableYieldValue,va=null,Et=null;function Oe(l){if(typeof hv=="function"&&yv(l),Et&&typeof Et.setStrictMode=="function")try{Et.setStrictMode(va,l)}catch{}}var zt=Math.clz32?Math.clz32:bv,gv=Math.log,Sv=Math.LN2;function bv(l){return l>>>=0,l===0?32:31-(gv(l)/Sv|0)|0}var mn=256,hn=262144,yn=4194304;function Ie(l){var t=l&42;if(t!==0)return t;switch(l&-l){case 1:return 1;case 2:return 2;case 4:return 4;case 8:return 8;case 16:return 16;case 32:return 32;case 64:return 64;case 128:return 128;case 256:case 512:case 1024:case 2048:case 4096:case 8192:case 16384:case 32768:case 65536:case 131072:return l&-l;case 262144:case 524288:case 1048576:case 2097152:return l&3932160;case 4194304:case 8388608:case 16777216:case 33554432:return l&62914560;case 67108864:return 67108864;case 134217728:return 134217728;case 268435456:return 268435456;case 536870912:return 536870912;case 1073741824:return 0;default:return l}}function gn(l,t,e){var u=l.pendingLanes;if(u===0)return 0;var a=0,n=l.suspendedLanes,i=l.pingedLanes;l=l.warmLanes;var c=u&134217727;return c!==0?(u=c&~n,u!==0?a=Ie(u):(i&=c,i!==0?a=Ie(i):e||(e=c&~l,e!==0&&(a=Ie(e))))):(c=u&~n,c!==0?a=Ie(c):i!==0?a=Ie(i):e||(e=u&~l,e!==0&&(a=Ie(e)))),a===0?0:t!==0&&t!==a&&(t&n)===0&&(n=a&-a,e=t&-t,n>=e||n===32&&(e&4194048)!==0)?t:a}function ma(l,t){return(l.pendingLanes&~(l.suspendedLanes&~l.pingedLanes)&t)===0}function xs(l,t){(t&8)!==0&&(t|=t&32);var e=l.entangledLanes;if(e!==0)for(l=l.entanglements,e&=t;0e;e++)t.push(l);return t}function ha(l,t){l.pendingLanes|=t,t!==268435456&&(l.suspendedLanes=0,l.pingedLanes=0,l.warmLanes=0)}function Ev(l,t,e,u,a,n){var i=l.pendingLanes;l.pendingLanes=e,l.suspendedLanes=0,l.pingedLanes=0,l.warmLanes=0,l.expiredLanes&=e,l.entangledLanes&=e,l.errorRecoveryDisabledLanes&=e,l.shellSuspendCounter=0;var c=l.entanglements,f=l.expirationTimes,m=l.hiddenUpdates;for(e=i&~e;0"u"||typeof window.document>"u"||typeof window.document.createElement>"u"),ac=!1;if(oe)try{var ba={};Object.defineProperty(ba,"passive",{get:function(){ac=!0}}),window.addEventListener("test",ba,ba),window.removeEventListener("test",ba,ba)}catch{ac=!1}var Ae=null,nc=null,Nn=null;function ao(){if(Nn)return Nn;var l,t=nc,e=t.length,u,a="value"in Ae?Ae.value:Ae.textContent,n=a.length;for(l=0;l=za),oo=" ",ro=!1;function vo(l,t){switch(l){case"keyup":return um.indexOf(t.keyCode)!==-1;case"keydown":return t.keyCode!==229;case"keypress":case"mousedown":case"focusout":return!0;default:return!1}}function mo(l){return l=l.detail,typeof l=="object"&&"data"in l?l.data:null}var Mu=!1;function nm(l,t){switch(l){case"compositionend":return mo(t);case"keypress":return t.which!==32?null:(ro=!0,oo);case"textInput":return l=t.data,l===oo&&ro?null:l;default:return null}}function im(l,t){if(Mu)return l==="compositionend"||!oc&&vo(l,t)?(l=ao(),Nn=nc=Ae=null,Mu=!1,l):null;switch(l){case"paste":return null;case"keypress":if(!(t.ctrlKey||t.altKey||t.metaKey)||t.ctrlKey&&t.altKey){if(t.char&&1"u")return null;try{return l.activeElement||l.body}catch{return l.body}}function zo(l){for(;l&&l.firstChild;)l=l.firstChild;return l}function No(l,t){var e=zo(l);l=0;for(var u;e;){if(e.nodeType===3){if(u=l+e.textContent.length,l<=t&&u>=t)return{node:e,offset:t-l};l=u}l:{for(;e;){if(e.nextSibling){e=e.nextSibling;break l}e=e.parentNode}e=void 0}e=zo(e)}}function _o(l,t){return l&&t?l===t?!0:l&&l.nodeType===3?!1:t&&t.nodeType===3?_o(l,t.parentNode):"contains"in l?l.contains(t):l.compareDocumentPosition?!!(l.compareDocumentPosition(t)&16):!1:!1}function Oo(l){l=l!=null&&l.ownerDocument!=null&&l.ownerDocument.defaultView!=null?l.ownerDocument.defaultView:window;for(var t=vc(l.document);t instanceof l.HTMLIFrameElement;){try{var e=typeof t.contentWindow.location.href=="string"}catch{e=!1}if(e)l=t.contentWindow;else break;t=vc(l.document)}return t}function mc(l){var t=l&&l.nodeName&&l.nodeName.toLowerCase();return t&&(t==="input"&&(l.type==="text"||l.type==="search"||l.type==="tel"||l.type==="url"||l.type==="password")||t==="textarea"||l.contentEditable==="true")}var mm=oe&&"documentMode"in document&&11>=document.documentMode,pu=null,hc=null,Aa=null,yc=!1;function Ao(l,t,e){var u=e.window===e?e.document:e.nodeType===9?e:e.ownerDocument;yc||pu==null||pu!==vc(u)||(u=pu,"selectionStart"in u&&mc(u)?u={start:u.selectionStart,end:u.selectionEnd}:(u=(u.ownerDocument&&u.ownerDocument.defaultView||window).getSelection(),u={anchorNode:u.anchorNode,anchorOffset:u.anchorOffset,focusNode:u.focusNode,focusOffset:u.focusOffset}),Aa&&Oa(Aa,u)||(Aa=u,u=ji(hc,"onSelect"),0>=i,a-=i,It=1<<32-zt(t)+a|e<V?(Yl=q,q=null):Yl=q.sibling;var nl=d(v,q,y[V],E);if(nl===null){q===null&&(q=Yl);break}l&&q&&nl.alternate===null&&t(v,q),s=n(nl,s,V),tl===null?p=nl:tl.sibling=nl,tl=nl,q=Yl}if(V===y.length)return e(v,q),W&&me(v,V),p;if(q===null){for(;VV?(Yl=q,q=null):Yl=q.sibling;var ke=d(v,q,nl.value,E);if(ke===null){q===null&&(q=Yl);break}l&&q&&ke.alternate===null&&t(v,q),s=n(ke,s,V),tl===null?p=ke:tl.sibling=ke,tl=ke,q=Yl}if(nl.done)return e(v,q),W&&me(v,V),p;if(q===null){for(;!nl.done;V++,nl=y.next())nl=z(v,nl.value,E),nl!==null&&(s=n(nl,s,V),tl===null?p=nl:tl.sibling=nl,tl=nl);return W&&me(v,V),p}for(q=u(q);!nl.done;V++,nl=y.next())nl=g(q,v,V,nl.value,E),nl!==null&&(l&&(Yl=nl.alternate,Yl!==null&&q.delete(Yl.key===null?V:Yl.key)),s=n(nl,s,V),tl===null?p=nl:tl.sibling=nl,tl=nl);return l&&q.forEach(function(ny){return t(v,ny)}),W&&me(v,V),p}function w(v,s,y,E){if(typeof y=="object"&&y!==null&&y.type===wl&&y.key===null&&y.props.ref===void 0&&(y=y.props.children),typeof y=="object"&&y!==null){switch(y.$$typeof){case it:l:{for(var p=y.key;s!==null;){if(s.key===p){if(p=y.type,p===wl){if(s.tag===7){e(v,s.sibling),E=a(s,y.props.children),Ue(E,y),E.return=v,v=E;break l}}else if(s.elementType===p||typeof p=="object"&&p!==null&&p.$$typeof===al&&ru(p)===s.type){e(v,s.sibling),E=a(s,y.props),Ue(E,y),E.return=v,v=E;break l}e(v,s);break}else t(v,s);s=s.sibling}y.type===wl?(E=au(y.props.children,v.mode,E,y.key),Ue(E,y),E.return=v,v=E):(E=Rn(y.type,y.key,y.props,null,v.mode,E),Ue(E,y),E.return=v,v=E)}return i(v);case Jl:l:{for(p=y.key;s!==null;){if(s.key===p)if(s.tag===4&&s.stateNode.containerInfo===y.containerInfo&&s.stateNode.implementation===y.implementation){e(v,s.sibling),E=a(s,y.children||[]),E.return=v,v=E;break l}else{e(v,s);break}else t(v,s);s=s.sibling}E=Nc(y,v.mode,E),E.return=v,v=E}return i(v);case al:return y=ru(y),w(v,s,y,E)}if(_(y))return C(v,s,y,E);if(H(y)){if(p=H(y),typeof p!="function")throw Error(h(150));return y=p.call(y),U(v,s,y,E)}if(typeof y.then=="function")return w(v,s,Zn(y),E);if(y.$$typeof===gl)return w(v,s,Gn(v,y),E);Ln(v,y)}return typeof y=="string"&&y!==""||typeof y=="number"||typeof y=="bigint"?(y=""+y,s!==null&&s.tag===6?(e(v,s.sibling),E=a(s,y),E.return=v,v=E):(e(v,s),E=zc(y,v.mode,E),E.return=v,v=E),i(v)):e(v,s)}return function(v,s,y,E){try{Ua=0;var p=w(v,s,y,E);return Xu=null,p}catch(q){if(q===Gu||q===Qn)throw q;var tl=vt(29,q,null,v.mode);return tl.lanes=E,tl.return=v,tl}}}var vu=Wo(!0),ko=Wo(!1),Re=!1;function Rc(l){l.updateQueue={baseState:l.memoizedState,firstBaseUpdate:null,lastBaseUpdate:null,shared:{pending:null,lanes:0,hiddenCallbacks:null},callbacks:null}}function xc(l,t){l=l.updateQueue,t.updateQueue===l&&(t.updateQueue={baseState:l.baseState,firstBaseUpdate:l.firstBaseUpdate,lastBaseUpdate:l.lastBaseUpdate,shared:l.shared,callbacks:null})}function xe(l){return{lane:l,tag:0,payload:null,callback:null,next:null}}function He(l,t,e){var u=l.updateQueue;if(u===null)return null;if(u=u.shared,(fl&2)!==0){var a=u.pending;return a===null?t.next=t:(t.next=a.next,a.next=t),u.pending=t,t=Un(l),xo(l,null,e),t}return pn(l,u,t,e),Un(l)}function Ra(l,t,e){if(t=t.updateQueue,t!==null&&(t=t.shared,(e&4194048)!==0)){var u=t.lanes;u&=l.pendingLanes,e|=u,t.lanes=e,Ys(l,e)}}function Hc(l,t){var e=l.updateQueue,u=l.alternate;if(u!==null&&(u=u.updateQueue,e===u)){var a=null,n=null;if(e=e.firstBaseUpdate,e!==null){do{var i={lane:e.lane,tag:e.tag,payload:e.payload,callback:null,next:null};n===null?a=n=i:n=n.next=i,e=e.next}while(e!==null);n===null?a=n=t:n=n.next=t}else a=n=t;e={baseState:u.baseState,firstBaseUpdate:a,lastBaseUpdate:n,shared:u.shared,callbacks:u.callbacks},l.updateQueue=e;return}l=e.lastBaseUpdate,l===null?e.firstBaseUpdate=t:l.next=t,e.lastBaseUpdate=t}var qc=!1;function xa(){if(qc){var l=Bu;if(l!==null)throw l}}function Ha(l,t,e,u){qc=!1;var a=l.updateQueue;Re=!1;var n=a.firstBaseUpdate,i=a.lastBaseUpdate,c=a.shared.pending;if(c!==null){a.shared.pending=null;var f=c,m=f.next;f.next=null,i===null?n=m:i.next=m,i=f;var S=l.alternate;S!==null&&(S=S.updateQueue,c=S.lastBaseUpdate,c!==i&&(c===null?S.firstBaseUpdate=m:c.next=m,S.lastBaseUpdate=f))}if(n!==null){var z=a.baseState;i=0,S=m=f=null,c=n;do{var d=c.lane&-536870913,g=d!==c.lane;if(g?(ll&d)===d:(u&d)===d){d!==0&&d===su&&(qc=!0),S!==null&&(S=S.next={lane:0,tag:c.tag,payload:c.payload,callback:null,next:null});l:{var C=l,U=c;d=t;var w=e;switch(U.tag){case 1:if(C=U.payload,typeof C=="function"){z=C.call(w,z,d);break l}z=C;break l;case 3:C.flags=C.flags&-65537|128;case 0:if(C=U.payload,d=typeof C=="function"?C.call(w,z,d):C,d==null)break l;z=K({},z,d);break l;case 2:Re=!0}}d=c.callback,d!==null&&(l.flags|=64,g&&(l.flags|=8192),g=a.callbacks,g===null?a.callbacks=[d]:g.push(d))}else g={lane:d,tag:c.tag,payload:c.payload,callback:c.callback,next:null},S===null?(m=S=g,f=z):S=S.next=g,i|=d;if(c=c.next,c===null){if(c=a.shared.pending,c===null)break;g=c,c=g.next,g.next=null,a.lastBaseUpdate=g,a.shared.pending=null}}while(!0);S===null&&(f=z),a.baseState=f,a.firstBaseUpdate=m,a.lastBaseUpdate=S,n===null&&(a.shared.lanes=0),Ve|=i,l.lanes=i,l.memoizedState=z}}function Io(l,t){if(typeof l!="function")throw Error(h(191,l));l.call(t)}function Po(l,t){var e=l.callbacks;if(e!==null)for(l.callbacks=null,l=0;ln?n:8;var i=A.T,c={};c.types=i!==null?i.types:null,A.T=c,ef(l,!1,t,e);try{var f=a(),m=A.S;if(m!==null&&m(c,f),f!==null&&typeof f=="object"&&typeof f.then=="function"){var S=Om(f,u);Ga(l,t,S,Dt(l))}else Ga(l,t,u,Dt(l))}catch(z){Ga(l,t,{then:function(){},status:"rejected",reason:z},Dt())}finally{D.p=n,i!==null&&c.types!==null&&(i.types=c.types),A.T=i}}function pm(){}function lf(l,t,e,u){if(l.tag!==5)throw Error(h(476));var a=pr(l).queue;Mr(l,a,t,ol,e===null?pm:function(){return Ur(l),e(u)})}function pr(l){var t=l.memoizedState;if(t!==null)return t;t={memoizedState:ol,baseState:ol,baseQueue:null,queue:{pending:null,lanes:0,dispatch:null,lastRenderedReducer:Se,lastRenderedState:ol},next:null};var e={};return t.next={memoizedState:e,baseState:e,baseQueue:null,queue:{pending:null,lanes:0,dispatch:null,lastRenderedReducer:Se,lastRenderedState:e},next:null},l.memoizedState=t,l=l.alternate,l!==null&&(l.memoizedState=t),t}function Ur(l){var t=pr(l);t.next===null&&(t=l.alternate.memoizedState),Ga(l,t.next.queue,{},Dt())}function tf(){return Wl(fa)}function Rr(){return Ul().memoizedState}function xr(){return Ul().memoizedState}function Um(l){for(var t=l.return;t!==null;){switch(t.tag){case 24:case 3:var e=Dt();l=xe(e);var u=He(t,l,e);u!==null&&(gt(u,t,e),Ra(u,t,e)),t={cache:Dc()},l.payload=t;return}t=t.return}}function Rm(l,t,e){var u=Dt();e={lane:u,revertLane:0,gesture:null,action:e,hasEagerState:!1,eagerState:null,next:null},li(l)?qr(t,e):(e=Tc(l,t,e,u),e!==null&&(gt(e,l,u),Yr(e,t,u)))}function Hr(l,t,e){var u=Dt();Ga(l,t,e,u)}function Ga(l,t,e,u){var a={lane:u,revertLane:0,gesture:null,action:e,hasEagerState:!1,eagerState:null,next:null};if(li(l))qr(t,a);else{var n=l.alternate;if(l.lanes===0&&(n===null||n.lanes===0)&&(n=t.lastRenderedReducer,n!==null))try{var i=t.lastRenderedState,c=n(i,e);if(a.hasEagerState=!0,a.eagerState=c,_t(c,i))return pn(l,t,a,0),Sl===null&&Mn(),!1}catch{}if(e=Tc(l,t,a,u),e!==null)return gt(e,l,u),Yr(e,t,u),!0}return!1}function ef(l,t,e,u){if(u={lane:2,revertLane:wf(),gesture:null,action:u,hasEagerState:!1,eagerState:null,next:null},li(l)){if(t)throw Error(h(479))}else t=Tc(l,e,u,2),t!==null&>(t,l,2)}function li(l){var t=l.alternate;return l===J||t!==null&&t===J}function qr(l,t){Qu=wn=!0;var e=l.pending;e===null?t.next=t:(t.next=e.next,e.next=t),l.pending=t}function Yr(l,t,e){if((e&4194048)!==0){var u=t.lanes;u&=l.pendingLanes,e|=u,t.lanes=e,Ys(l,e)}}var ti={readContext:Wl,use:Wn,useCallback:Cl,useContext:Cl,useEffect:Cl,useImperativeHandle:Cl,useLayoutEffect:Cl,useInsertionEffect:Cl,useMemo:Cl,useReducer:Cl,useRef:Cl,useState:Cl,useDebugValue:Cl,useDeferredValue:Cl,useTransition:Cl,useSyncExternalStore:Cl,useId:Cl,useHostTransitionStatus:Cl,useFormState:Cl,useActionState:Cl,useOptimistic:Cl,useMemoCache:Cl,useCacheRefresh:Cl,useEffectEvent:Cl},Br={readContext:Wl,use:Wn,useCallback:function(l,t){return ft().memoizedState=[l,t===void 0?null:t],l},useContext:Wl,useEffect:Er,useImperativeHandle:function(l,t,e){e=e!=null?e.concat([l]):null,In(4194308,4,Or.bind(null,t,l),e)},useLayoutEffect:function(l,t){return In(4194308,4,l,t)},useInsertionEffect:function(l,t){In(4,2,l,t)},useMemo:function(l,t){var e=ft();t=t===void 0?null:t;var u=l();if(mu){Oe(!0);try{l()}finally{Oe(!1)}}return e.memoizedState=[u,t],u},useReducer:function(l,t,e){var u=ft();if(e!==void 0){var a=e(t);if(mu){Oe(!0);try{e(t)}finally{Oe(!1)}}}else a=t;return u.memoizedState=u.baseState=a,l={pending:null,lanes:0,dispatch:null,lastRenderedReducer:l,lastRenderedState:a},u.queue=l,l=l.dispatch=Rm.bind(null,J,l),[u.memoizedState,l]},useRef:function(l){var t=ft();return l={current:l},t.memoizedState=l},useState:function(l){l=Fc(l);var t=l.queue,e=Hr.bind(null,J,t);return t.dispatch=e,[l.memoizedState,e]},useDebugValue:Ic,useDeferredValue:function(l,t){var e=ft();return Pc(e,l,t)},useTransition:function(){var l=Fc(!1);return l=Mr.bind(null,J,l.queue,!0,!1),ft().memoizedState=l,[!1,l]},useSyncExternalStore:function(l,t,e){var u=J,a=ft();if(W){if(e===void 0)throw Error(h(407));e=e()}else{if(e=t(),Sl===null)throw Error(h(349));(ll&127)!==0||nr(u,t,e)}a.memoizedState=e;var n={value:e,getSnapshot:t};return a.queue=n,Er(cr.bind(null,u,n,l),[l]),u.flags|=2048,Zu(9,{destroy:void 0},ir.bind(null,u,n,e,t),null),e},useId:function(){var l=ft(),t=Sl.identifierPrefix;if(W){var e=Pt,u=It;e=(u&~(1<<32-zt(u)-1)).toString(32)+e,t="_"+t+"R_"+e,e=$n++,0<\/script>",n=n.removeChild(n.firstChild);break;case"select":n=typeof u.is=="string"?i.createElement("select",{is:u.is}):i.createElement("select"),u.multiple?n.multiple=!0:u.size&&(n.size=u.size);break;default:n=typeof u.is=="string"?i.createElement(a,{is:u.is}):i.createElement(a)}}n[Fl]=t,n[dt]=u;l:for(i=t.child;i!==null;){if(i.tag===5||i.tag===6)n.appendChild(i.stateNode);else if(i.tag!==4&&i.tag!==27&&i.child!==null){i.child.return=i,i=i.child;continue}if(i===t)break l;for(;i.sibling===null;){if(i.return===null||i.return===t)break l;i=i.return}i.sibling.return=i.return,i=i.sibling}t.stateNode=n;l:switch(lt(n,a,u),a){case"button":case"input":case"select":case"textarea":u=!!u.autoFocus;break l;case"img":u=!0;break l;default:u=!1}u&&Te(t)}}return El(t),t.subtreeFlags&=-33554433,yf(t,t.type,l===null?null:l.memoizedProps,t.pendingProps,e),null;case 6:if(l&&t.stateNode!=null)l.memoizedProps!==u&&Te(t);else{if(typeof u!="string"&&t.stateNode===null)throw Error(h(166));if(l=Ne.current,Yu(t)){if(l=t.stateNode,e=t.memoizedProps,u=null,a=Zl,a!==null)switch(a.tag){case 27:case 5:u=a.memoizedProps}l[Fl]=t,l=!!(l.nodeValue===e||u!==null&&u.suppressHydrationWarning===!0||c0(l.nodeValue,e)),l||Me(t,!0)}else l=Ia(l).createTextNode(u),l[Fl]=t,t.stateNode=l}return El(t),null;case 31:if(e=t.memoizedState,l===null||l.memoizedState!==null){if(u=Yu(t),e!==null){if(l===null){if(!u)throw Error(h(318));if(l=t.memoizedState,l=l!==null?l.dehydrated:null,!l)throw Error(h(557));l[Fl]=t}else nu(),(t.flags&128)===0&&(t.memoizedState=null),t.flags|=4;El(t),l=!1}else e=Ac(),l!==null&&l.memoizedState!==null&&(l.memoizedState.hydrationErrors=e),l=!0;if(!l)return t.flags&256?(Ot(t),t):(Ot(t),null);if((t.flags&128)!==0)throw Error(h(558))}return El(t),null;case 13:if(u=t.memoizedState,l===null||l.memoizedState!==null&&l.memoizedState.dehydrated!==null){if(a=Yu(t),u!==null&&u.dehydrated!==null){if(l===null){if(!a)throw Error(h(318));if(a=t.memoizedState,a=a!==null?a.dehydrated:null,!a)throw Error(h(317));a[Fl]=t}else nu(),(t.flags&128)===0&&(t.memoizedState=null),t.flags|=4;El(t),a=!1}else a=Ac(),l!==null&&l.memoizedState!==null&&(l.memoizedState.hydrationErrors=a),a=!0;if(!a)return t.flags&256?(Ot(t),t):(Ot(t),null)}return Ot(t),(t.flags&128)!==0?(t.lanes=e,t):(e=u!==null,l=l!==null&&l.memoizedState!==null,e&&(u=t.child,a=null,u.alternate!==null&&u.alternate.memoizedState!==null&&u.alternate.memoizedState.cachePool!==null&&(a=u.alternate.memoizedState.cachePool.pool),n=null,u.memoizedState!==null&&u.memoizedState.cachePool!==null&&(n=u.memoizedState.cachePool.pool),n!==a&&(u.flags|=2048)),e!==l&&e&&(t.child.flags|=8192),ci(t,t.updateQueue),El(t),null);case 4:return Eu(),l===null&&kf(t.stateNode.containerInfo),t.flags|=67108864,El(t),null;case 10:return ye(t.type),El(t),null;case 19:if(Xc(t),u=t.memoizedState,u===null)return El(t),null;if(a=(t.flags&128)!==0,n=u.rendering,n===null)if(a)Qa(u,!1);else{if(jl!==0||l!==null&&(l.flags&128)!==0)for(l=t.child;l!==null;){if(n=Jn(l),n!==null){for(t.flags|=128,Qa(u,!1),l=n.updateQueue,t.updateQueue=l,ci(t,l),t.subtreeFlags=0,l=e,e=t.child;e!==null;)Ho(e,l),e=e.sibling;return qa(t,Il.current&1|2),W&&me(t,u.treeForkCount),t.child}l=l.sibling}u.tail!==null&&Tt()>bi&&(t.flags|=128,a=!0,Qa(u,!1),t.lanes=4194304)}else{if(!a)if(l=Jn(n),l!==null){if(t.flags|=128,a=!0,l=l.updateQueue,t.updateQueue=l,ci(t,l),Qa(u,!0),u.tail===null&&u.tailMode!=="collapsed"&&u.tailMode!=="visible"&&!n.alternate&&!W)return El(t),null}else 2*Tt()-u.renderingStartTime>bi&&e!==536870912&&(t.flags|=128,a=!0,Qa(u,!1),t.lanes=4194304);u.isBackwards?(n.sibling=t.child,t.child=n):(l=u.last,l!==null?l.sibling=n:t.child=n,u.last=n)}if(u.tail!==null){l=u.tail;l:{for(e=l;e!==null;){if(e.alternate!==null){e=!1;break l}e=e.sibling}e=!0}return u.rendering=l,u.tail=l.sibling,u.renderingStartTime=Tt(),l.sibling=null,n=Il.current,n=a?n&1|2:n&1,u.tailMode==="visible"||u.tailMode==="collapsed"||!e||W?qa(t,n):(e=n,bl(kl,t),bl(Il,e),nt===null&&(nt=t)),W&&me(t,u.treeForkCount),l}return El(t),null;case 22:case 23:return Ot(t),Bc(),u=t.memoizedState!==null,l!==null?l.memoizedState!==null!==u&&(t.flags|=8192):u&&(t.flags|=8192),u?(e&536870912)!==0&&(t.flags&128)===0&&(El(t),t.subtreeFlags&6&&(t.flags|=8192)):El(t),e=t.updateQueue,e!==null&&ci(t,e.retryQueue),e=null,l!==null&&l.memoizedState!==null&&l.memoizedState.cachePool!==null&&(e=l.memoizedState.cachePool.pool),u=null,t.memoizedState!==null&&t.memoizedState.cachePool!==null&&(u=t.memoizedState.cachePool.pool),u!==e&&(t.flags|=2048),l!==null&&$l(ou),null;case 24:return e=null,l!==null&&(e=l.memoizedState.cache),t.memoizedState.cache!==e&&(t.flags|=2048),ye(xl),El(t),null;case 25:return null;case 30:return t.flags|=33554432,El(t),null}throw Error(h(156,t.tag))}function Xm(l,t){switch(_c(t),t.tag){case 1:return l=t.flags,l&65536?(t.flags=l&-65537|128,t):null;case 3:return ye(xl),Eu(),l=t.flags,(l&65536)!==0&&(l&128)===0?(t.flags=l&-65537|128,t):null;case 26:case 27:case 5:return dn(t),null;case 31:if(t.memoizedState!==null){if(Ot(t),t.alternate===null)throw Error(h(340));nu()}return l=t.flags,l&65536?(t.flags=l&-65537|128,t):null;case 13:if(Ot(t),l=t.memoizedState,l!==null&&l.dehydrated!==null){if(t.alternate===null)throw Error(h(340));nu()}return l=t.flags,l&65536?(t.flags=l&-65537|128,t):null;case 19:return Xc(t),l=t.flags,l&65536?(t.flags=l&-65537|128,l=t.memoizedState,l!==null&&(l.rendering=null,l.tail=null),t.flags|=4,t):null;case 4:return Eu(),null;case 10:return ye(t.type),null;case 22:case 23:return Ot(t),Bc(),l!==null&&$l(ou),l=t.flags,l&65536?(t.flags=l&-65537|128,t):null;case 24:return ye(xl),null;case 25:return null;default:return null}}function sd(l,t){switch(_c(t),t.tag){case 3:ye(xl),Eu();break;case 26:case 27:case 5:dn(t);break;case 4:Eu();break;case 31:t.memoizedState!==null&&Ot(t);break;case 13:Ot(t);break;case 19:Xc(t);break;case 10:ye(t.type);break;case 22:case 23:Ot(t),Bc(),l!==null&&$l(ou);break;case 24:ye(xl)}}function Va(l,t){try{var e=t.updateQueue,u=e!==null?e.lastEffect:null;if(u!==null){var a=u.next;e=a;do{if((e.tag&l)===l){u=void 0;var n=e.create,i=e.inst;u=n(),i.destroy=u}e=e.next}while(e!==a)}}catch(c){ml(t,t.return,c)}}function Ge(l,t,e){try{var u=t.updateQueue,a=u!==null?u.lastEffect:null;if(a!==null){var n=a.next;u=n;do{if((u.tag&l)===l){var i=u.inst,c=i.destroy;if(c!==void 0){i.destroy=void 0,a=t;var f=e,m=c;try{m()}catch(S){ml(a,f,S)}}}u=u.next}while(u!==n)}}catch(S){ml(t,t.return,S)}}function od(l){var t=l.updateQueue;if(t!==null){var e=l.stateNode;try{Po(t,e)}catch(u){ml(l,l.return,u)}}}function rd(l,t,e){e.props=hu(l.type,l.memoizedProps),e.state=l.memoizedState;try{e.componentWillUnmount()}catch(u){ml(l,t,u)}}function le(l,t){try{var e=l.ref;if(e!==null){switch(l.tag){case 26:case 27:case 5:var u=l.stateNode;break;case 30:var a=l.stateNode,n=re(l.memoizedProps,a);(a.ref===null||a.ref.name!==n)&&(a.ref=S0(n)),u=a.ref;break;case 7:if(l.stateNode===null){var i=new Mt(l);T(l.child,!1,Mh,i,void 0,void 0),l.stateNode=i}u=l.stateNode;break;default:u=l.stateNode}typeof e=="function"?l.refCleanup=e(u):e.current=u}}catch(c){ml(l,t,c)}}function Pl(l,t){var e=l.ref,u=l.refCleanup;if(e!==null)if(typeof u=="function")try{u()}catch(a){ml(l,t,a)}finally{l.refCleanup=null,l=l.alternate,l!=null&&(l.refCleanup=null)}else if(typeof e=="function")try{e(null)}catch(a){ml(l,t,a)}else e.current=null}function fi(l,t){if((l.tag===5||l.tag===27||l.tag===6)&&l.alternate===null&&t!==null)for(var e=0;e title"))),lt(u,t,e),u[Fl]=l,Vl(u),t=u;break l;case"link":if(n=H0("link","href",a).get(t+(e.href||""))){for(i=0;iw&&(i=w,w=U,U=i);var v=No(c,U),s=No(c,w);if(v&&s&&(g.rangeCount!==1||g.anchorNode!==v.node||g.anchorOffset!==v.offset||g.focusNode!==s.node||g.focusOffset!==s.offset)){var y=z.createRange();y.setStart(v.node,v.offset),g.removeAllRanges(),U>w?(g.addRange(y),g.extend(s.node,s.offset)):(y.setEnd(s.node,s.offset),g.addRange(y))}}}}for(z=[],g=c;g=g.parentNode;)g.nodeType===1&&z.push({element:g,left:g.scrollLeft,top:g.scrollTop});for(typeof c.focus=="function"&&c.focus(),c=0;ce?32:e,A.T=null,e=Yf,Yf=null;var n=wt,i=ie;if(Ol=0,bu=wt=null,ie=0,(fl&6)!==0)throw Error(h(331));var c=fl;if(fl|=4,xd(n.current),pd(n,n.current,i,e),fl=c,Fa(0,!1),Et&&typeof Et.onPostCommitFiberRoot=="function")try{Et.onPostCommitFiberRoot(va,n)}catch{}return!0}finally{D.p=a,A.T=u,Fd(l,t)}}function Wd(l,t,e){t=Ht(e,t),t=nf(l.stateNode,t,2),l=He(l,t,2),l!==null&&(ha(l,2),ce(l))}function ml(l,t,e){if(l.tag===3)Wd(l,l,e);else for(;t!==null;){if(t.tag===3){Wd(t,l,e);break}else if(t.tag===1){var u=t.stateNode;if(typeof t.type.getDerivedStateFromError=="function"||typeof u.componentDidCatch=="function"&&(Ze===null||!Ze.has(u))){l=Ht(e,l),e=Jr(2),u=He(t,e,2),u!==null&&(wr(e,u,t,l),ha(u,2),ce(u));break}}t=t.return}}function Lf(l,t,e){var u=l.pingCache;if(u===null){u=l.pingCache=new Lm;var a=new Set;u.set(t,a)}else a=u.get(t),a===void 0&&(a=new Set,u.set(t,a));a.has(e)||(xf=!0,a.add(e),l=Im.bind(null,l,t,e),t.then(l,l))}function Im(l,t,e){var u=l.pingCache;u!==null&&u.delete(t),l.pingedLanes|=l.suspendedLanes&e,l.warmLanes&=~e,Sl===l&&(ll&e)===e&&((jl===4||jl===3&&(ll&62914560)===ll&&300>Tt()-Si)&&(fl&2)===0?la(l,0):gi|=e,Fu===ll&&(Fu=0)),ce(l)}function kd(l,t){t===0&&(t=Hs()),l=uu(l,t),l!==null&&(ha(l,t),ce(l))}function Pm(l){var t=l.memoizedState,e=0;t!==null&&(e=t.retryLane),kd(l,e)}function lh(l,t){var e=0;switch(l.tag){case 31:case 13:var u=l.stateNode,a=l.memoizedState;a!==null&&(e=a.retryLane);break;case 19:u=l.stateNode;break;case 22:u=l.stateNode._retryCache;break;default:throw Error(h(314))}u!==null&&u.delete(t),kd(l,e)}function th(l,t){return Ji(l,t)}var ea=null,ua=null,Kf=!1,Ai=!1,Jf=!1,Ke=0;function ce(l){l!==ua&&l.next===null&&(ua===null?ea=ua=l:ua=ua.next=l),Ai=!0,Kf||(Kf=!0,uh())}function Fa(l,t){if(!Jf&&Ai){Jf=!0;do for(var e=!1,u=ea;u!==null;){if(l!==0){var a=u.pendingLanes;if(a===0)var n=0;else{var i=u.suspendedLanes,c=u.pingedLanes;n=(1<<31-zt(42|l)+1)-1,n&=a&~(i&~c),n=n&201326741?n&201326741|1:n?n|2:0}n!==0&&(e=!0,t0(u,n))}else n=ll,n=gn(u,u===Sl?n:0,u.cancelPendingCommit!==null||u.timeoutHandle!==-1),(n&3)===0||ma(u,n)||(e=!0,t0(u,n));u=u.next}while(e);Jf=!1}}function eh(){Id()}function Id(){Ai=Kf=!1;var l=0;Ke!==0&&mh()&&(l=Ke);for(var t=Tt(),e=null,u=ea;u!==null;){var a=u.next,n=Pd(u,t);n===0?(u.next=null,e===null?ea=a:e.next=a,a===null&&(ua=e)):(e=u,(l!==0||(n&3)!==0)&&(Ai=!0)),u=a}Ol!==0&&Ol!==5||Fa(l),Ke!==0&&(Ke=0)}function Pd(l,t){for(var e=l.suspendedLanes,u=l.pingedLanes,a=l.expirationTimes,n=l.pendingLanes&-62914561;0c)break;var S=f.transferSize,z=f.initiatorType;S&&f0(z)&&(f=f.responseEnd,i+=S*(fpi){U.length=C;break}y=new Promise(Th.bind(y)),U.push(y)}}}if(0"u"?null:document;function p0(l,t,e){var u=na;if(u&&typeof t=="string"&&t){var a=Rt(t);a='link[rel="'+l+'"][href="'+a+'"]',typeof e=="string"&&(a+='[crossorigin="'+e+'"]'),M0.has(a)||(M0.add(a),l={rel:l,crossOrigin:e,href:t},u.querySelector(a)===null&&(t=u.createElement("link"),lt(t,"link",l),Vl(t),u.head.appendChild(t)))}}function Gh(l){ze.D(l),p0("dns-prefetch",l,null)}function Xh(l,t){ze.C(l,t),p0("preconnect",l,t)}function Qh(l,t,e){ze.L(l,t,e);var u=na;if(u&&l&&t){var a='link[rel="preload"][as="'+Rt(t)+'"]';t==="image"&&e&&e.imageSrcSet?(a+='[imagesrcset="'+Rt(e.imageSrcSet)+'"]',typeof e.imageSizes=="string"&&(a+='[imagesizes="'+Rt(e.imageSizes)+'"]')):a+='[href="'+Rt(l)+'"]';var n=a;switch(t){case"style":n=ia(l);break;case"script":n=ca(l)}if(!(Qt.has(n)||(l=K({rel:"preload",href:t==="image"&&e&&e.imageSrcSet?void 0:l,as:t},e),Qt.set(n,l),u.querySelector(a)!==null||t==="style"&&u.querySelector(ln(n))||t==="script"&&u.querySelector(tn(n))))){var i=u.createElement("link");lt(i,"link",l),t==="style"&&(i[Sn]=!0,i.onload=i.onerror=function(){Zs(i)}),Vl(i),u.head.appendChild(i)}}}function Vh(l,t){ze.m(l,t);var e=na;if(e&&l){var u=t&&typeof t.as=="string"?t.as:"script",a='link[rel="modulepreload"][as="'+Rt(u)+'"][href="'+Rt(l)+'"]',n=a;switch(u){case"audioworklet":case"paintworklet":case"serviceworker":case"sharedworker":case"worker":case"script":n=ca(l)}if(!Qt.has(n)&&(l=K({rel:"modulepreload",href:l},t),Qt.set(n,l),e.querySelector(a)===null)){switch(u){case"audioworklet":case"paintworklet":case"serviceworker":case"sharedworker":case"worker":case"script":if(e.querySelector(tn(n)))return}u=e.createElement("link"),lt(u,"link",l),Vl(u),e.head.appendChild(u)}}}function Zh(l,t,e){ze.S(l,t,e);var u=na;if(u&&l){var a=_u(u).hoistableStyles,n=ia(l);t=t||"default";var i=a.get(n);if(!i){var c={loading:0,preload:null};if(i=u.querySelector(ln(n)))c.loading=5;else{l=K({rel:"stylesheet",href:l,"data-precedence":t},e),(e=Qt.get(n))&&vs(l,e);var f=i=u.createElement("link");Vl(f),lt(f,"link",l),f._p=new Promise(function(m,S){f.onload=m,f.onerror=S}),f.addEventListener("load",function(){c.loading|=1}),f.addEventListener("error",function(){c.loading|=2}),c.loading|=4,Di(i,t,u)}i={type:"stylesheet",instance:i,count:1,state:c},a.set(n,i)}}}function Lh(l,t){ze.X(l,t);var e=na;if(e&&l){var u=_u(e).hoistableScripts,a=ca(l),n=u.get(a);n||(n=e.querySelector(tn(a)),n||(l=K({src:l,async:!0},t),(t=Qt.get(a))&&ms(l,t),n=e.createElement("script"),Vl(n),lt(n,"link",l),e.head.appendChild(n)),n={type:"script",instance:n,count:1,state:null},u.set(a,n))}}function Kh(l,t){ze.M(l,t);var e=na;if(e&&l){var u=_u(e).hoistableScripts,a=ca(l),n=u.get(a);n||(n=e.querySelector(tn(a)),n||(l=K({src:l,async:!0,type:"module"},t),(t=Qt.get(a))&&ms(l,t),n=e.createElement("script"),Vl(n),lt(n,"link",l),e.head.appendChild(n)),n={type:"script",instance:n,count:1,state:null},u.set(a,n))}}function U0(l,t,e,u){var a=(a=Ne.current)?Pa(a):null;if(!a)throw Error(h(446));switch(l){case"meta":case"title":return null;case"style":return typeof e.precedence=="string"&&typeof e.href=="string"?(e=ia(e.href),t=_u(a).hoistableStyles,u=t.get(e),u||(u={type:"style",instance:null,count:0,state:null},t.set(e,u)),u):{type:"void",instance:null,count:0,state:null};case"link":if(e.rel==="stylesheet"&&typeof e.href=="string"&&typeof e.precedence=="string"){l=ia(e.href);var n=_u(a).hoistableStyles,i=n.get(l);if(i||(a=a.ownerDocument||a,i={type:"stylesheet",instance:null,count:0,state:{loading:0,preload:null}},n.set(l,i),(n=a.querySelector(ln(l)))?n._p||(i.instance=n,i.state.loading=5):(n=Qt.get(l),n||(n={rel:"preload",as:"style",href:e.href,crossOrigin:e.crossOrigin,integrity:e.integrity,media:e.media,hrefLang:e.hrefLang,referrerPolicy:e.referrerPolicy},Qt.set(l,n)),Jh(a,l,n,i.state))),t&&u===null)throw Error(h(528,""));return i}if(t&&u!==null)throw Error(h(529,""));return null;case"script":return t=e.async,e=e.src,typeof e=="string"&&t&&typeof t!="function"&&typeof t!="symbol"?(e=ca(e),t=_u(a).hoistableScripts,u=t.get(e),u||(u={type:"script",instance:null,count:0,state:null},t.set(e,u)),u):{type:"void",instance:null,count:0,state:null};default:throw Error(h(444,l))}}function ia(l){return'href="'+Rt(l)+'"'}function ln(l){return'link[rel="stylesheet"]['+l+"]"}function R0(l){return K({},l,{"data-precedence":l.precedence,precedence:null})}function Jh(l,t,e,u){if(t=l.querySelector('link[rel="preload"][as="style"]['+t+"]")){if(t[Sn]!==!0){u.loading=1;return}}else t=l.createElement("link"),t[Sn]=!0,t.onload=t.onerror=Zs.bind(null,t),lt(t,"link",e),Vl(t),l.head.appendChild(t);u.preload=t,t.addEventListener("load",function(){return u.loading|=1}),t.addEventListener("error",function(){return u.loading|=2})}function ca(l){return'[src="'+Rt(l)+'"]'}function tn(l){return"script[async]"+l}function x0(l,t,e){if(t.count++,t.instance===null)switch(t.type){case"style":var u=l.querySelector('style[data-href~="'+Rt(e.href)+'"]');if(u)return t.instance=u,Vl(u),u;var a=K({},e,{"data-href":e.href,"data-precedence":e.precedence,href:null,precedence:null});return u=(l.ownerDocument||l).createElement("style"),Vl(u),lt(u,"style",a),Di(u,e.precedence,l),t.instance=u;case"stylesheet":a=ia(e.href);var n=l.querySelector(ln(a));if(n)return t.state.loading|=4,t.instance=n,Vl(n),n;u=R0(e),(a=Qt.get(a))&&vs(u,a),n=(l.ownerDocument||l).createElement("link"),Vl(n);var i=n;return i._p=new Promise(function(c,f){i.onload=c,i.onerror=f}),lt(n,"link",u),t.state.loading|=4,Di(n,e.precedence,l),t.instance=n;case"script":return n=ca(e.src),(a=l.querySelector(tn(n)))?(t.instance=a,Vl(a),a):(u=e,(a=Qt.get(n))&&(u=K({},e),ms(u,a)),l=l.ownerDocument||l,a=l.createElement("script"),Vl(a),lt(a,"link",u),l.head.appendChild(a),t.instance=a);case"void":return null;default:throw Error(h(443,t.type))}else t.type==="stylesheet"&&(t.state.loading&4)===0&&(u=t.instance,t.state.loading|=4,Di(u,e.precedence,l));return t.instance}function Di(l,t,e){for(var u=e.querySelectorAll('link[rel="stylesheet"][data-precedence],style[data-precedence]'),a=u.length?u[u.length-1]:null,n=a,i=0;i title"):null)}function wh(l,t,e){if(e===1||t.itemProp!=null)return!1;switch(l){case"meta":case"title":return!0;case"style":if(typeof t.precedence!="string"||typeof t.href!="string"||t.href==="")break;return!0;case"link":if(typeof t.rel!="string"||typeof t.href!="string"||t.href===""||t.onLoad||t.onError)break;return t.rel==="stylesheet"?(l=t.disabled,typeof t.precedence=="string"&&l==null):!0;case"script":if(t.async&&typeof t.async!="function"&&typeof t.async!="symbol"&&!t.onLoad&&!t.onError&&t.src&&typeof t.src=="string")return!0}return!1}function q0(l,t){return l==="img"&&t.src!=null&&t.src!==""&&t.onLoad==null&&t.loading!=="lazy"}function Y0(l){return!(l.type==="stylesheet"&&(l.state.loading&3)===0)}function B0(l){return(l.width||100)*(l.height||100)*(typeof devicePixelRatio=="number"?devicePixelRatio:1)*.25}function G0(l,t){typeof t.decode=="function"&&(l.imgCount++,t.complete||(l.imgBytes+=B0(t),l.suspenseyImages.push(t)),l=Wh.bind(l),t.decode().then(l,l))}function $h(l,t,e,u){if(e.type==="stylesheet"&&(typeof u.media!="string"||matchMedia(u.media).matches!==!1)&&(e.state.loading&4)===0){if(e.instance===null){var a=ia(u.href),n=t.querySelector(ln(a));if(n){t=n._p,t!==null&&typeof t=="object"&&typeof t.then=="function"&&(l.count++,l=en.bind(l),t.then(l,l)),e.state.loading|=4,e.instance=n,Vl(n);return}n=t.ownerDocument||t,u=R0(u),(a=Qt.get(a))&&vs(u,a),n=n.createElement("link"),Vl(n);var i=n;i._p=new Promise(function(c,f){i.onload=c,i.onerror=f}),lt(n,"link",u),e.instance=n}l.stylesheets===null&&(l.stylesheets=new Map),l.stylesheets.set(e,t),(t=e.state.preload)&&(e.state.loading&3)===0&&(l.count++,e=en.bind(l),t.addEventListener("load",e),t.addEventListener("error",e))}}var pi=0;function Fh(l,t){return l.stylesheets&&l.count===0&&Ri(l,l.stylesheets),0pi?50:800)+t);return l.unsuspend=e,function(){l.unsuspend=null,clearTimeout(u),clearTimeout(a)}}:null}function X0(l){if(l.count===0&&(l.imgCount===0||!l.waitingForImages)){if(l.stylesheets)Ri(l,l.stylesheets);else if(l.unsuspend){var t=l.unsuspend;l.unsuspend=null,t()}}}function en(){this.count--,X0(this)}function Wh(){this.imgCount--,X0(this)}var Ui=null;function Ri(l,t){l.stylesheets=null,l.unsuspend!==null&&(l.count++,Ui=new Map,t.forEach(kh,l),Ui=null,en.call(l))}function kh(l,t){if(!(t.state.loading&4)){var e=Ui.get(l);if(e)var u=e.get(null);else{e=new Map,Ui.set(l,e);for(var a=l.querySelectorAll("link[data-precedence],style[data-precedence]"),n=0;n"u"||typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE!="function"))try{__REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE(N)}catch(X){console.error(X)}}return N(),_s.exports=vy(),_s.exports}var hy=my();async function ra(N,X){const G=await fetch("/api/"+N,X===void 0?{}:{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(X)});if(!G.ok){let h;try{const B=await G.json();h=typeof B.detail=="string"?B.detail:JSON.stringify(B.detail)}catch{h=await G.text().catch(()=>G.statusText)}throw new Error(h||"Le serveur ne répond pas.")}return G.json()}const Xi=(N,X,G=!1,h="")=>"/api/image?"+new URLSearchParams({copy:N,label:X,body:String(G),v:h}),sn=(N,X,G="")=>"/api/document?"+new URLSearchParams({copy:N,kind:X,label:G}),Vt=(N,X="",G="")=>JSON.stringify([N,X,G]);function yy(){const[N,X]=dl.useState(null),[G,h]=dl.useState(""),[B,$]=dl.useState(""),[sl,Bl]=dl.useState(""),[el,Al]=dl.useState(""),[R,T]=dl.useState(20),[M,zl]=dl.useState({}),[Gl,Dl]=dl.useState(!1),[il,et]=dl.useState(!1),[Nl,St]=dl.useState(null),[Xl,ut]=dl.useState(null),[Rl,K]=dl.useState(!1),[k,it]=dl.useState(!1),[Jl,wl]=dl.useState(!0),Ml=async()=>{try{X(await ra("state")),h("")}catch(b){h(String(b))}};dl.useEffect(()=>{Ml()},[]),dl.useEffect(()=>{const b=_=>{Object.keys(M).length&&(_.preventDefault(),_.returnValue="")};return window.addEventListener("beforeunload",b),()=>window.removeEventListener("beforeunload",b)},[M]),dl.useEffect(()=>{if(!N?.job.running)return;const b=setInterval(async()=>{try{const _=await ra("job");X(A=>A&&{...A,job:_}),_.running||(await Ml(),$(_.status==="success"?"Les sorties ont été régénérées.":"La régénération est incomplète. Consultez le journal."))}catch(_){h(String(_))}},1e3);return()=>clearInterval(b)},[N?.job.running]);const at=(b,_,A,D)=>M[Vt(b,_,A)]?.value??D,Z=(b,_,A,D)=>zl(ol=>({...ol,[Vt(b,_,A)]:{kind:b,copy:_,label:A,value:D}})),gl=async b=>{if(!N)return;Dl(!0),h("");let _=N;try{for(const A of b){const D=M[A];D&&(_=await ra("change",{...D,revision:_.revision}),X(_),zl(ol=>{const pl={...ol};return delete pl[A],pl}))}$("Modifications enregistrées.")}catch(A){h(String(A))}finally{Dl(!1)}},j=async()=>{if(N){Dl(!0),h("");try{const b=await ra("regenerate",{revision:N.revision,apply_draft:il,incremental:Jl});X({...N,job:b}),$("")}catch(b){h(String(b))}finally{Dl(!1)}}},Q=async()=>{try{await ra("stop",{}),K(!0)}catch(b){h(String(b))}};if(Rl)return r.jsxs("main",{className:"end",children:[r.jsx("h1",{children:"Session terminée"}),r.jsx("p",{children:"Vous pouvez reprendre le travail dans Copienator."})]});if(!N)return r.jsxs("main",{className:"end",children:[r.jsx("h1",{children:"Copienator"}),r.jsx("p",{children:G||"Chargement de la finalisation…"}),r.jsx("button",{onClick:Ml,children:"Réessayer"})]});const Y=Gl||N.job.running,ul=Object.keys(M).length,al=at("draft","","",N.draft),rt=N.draft.trim()!==N.applied.trim(),pt=N.copies.filter(b=>!sl||Number(b.id)===Number(sl)),bt=pt.flatMap(b=>b.answers.filter(_=>!el||_.label===el).map(_=>({c:b,a:_}))),o=new Map;N.copies.forEach(b=>o.set(b.name.toLowerCase(),(o.get(b.name.toLowerCase())||0)+1));const O=N.copies.filter(b=>b.name.toLowerCase()==="unknown"||(o.get(b.name.toLowerCase())||0)>1),x=pt.filter(b=>!k||O.includes(b)),H=new Set(N.copies.map(b=>b.name.trim().toLocaleLowerCase("fr"))),F=N.expectedNames?.filter(b=>!H.has(b.trim().toLocaleLowerCase("fr")));return r.jsxs(r.Fragment,{children:[r.jsxs("header",{inert:!!Nl||!!Xl,children:[r.jsxs("div",{className:"brand",children:["C",r.jsx("span",{children:"Copienator"})]}),r.jsxs("div",{className:"heading",children:[r.jsxs("div",{className:"eyebrow",children:["FINALISATION · ",N.mode]}),r.jsx("h1",{children:N.evaluation})]}),r.jsx("button",{className:"quiet",disabled:Y||!!ul,onClick:Q,children:"Fermer et reprendre dans le GUI"})]}),r.jsxs("main",{inert:!!Nl||!!Xl,children:[r.jsxs("section",{className:"toolbar",children:[r.jsxs("div",{children:[r.jsx("h2",{children:"Vérifier les copies"}),r.jsx("p",{children:"Retrouvez une copie, une question, ou leur intersection."})]}),r.jsxs("div",{className:"filters",children:[r.jsxs("label",{children:["Copie",r.jsx("input",{type:"text",inputMode:"numeric",list:"copies",placeholder:"Toutes les copies",value:sl,onChange:b=>{Bl(b.target.value.replace(/\D/g,"")),T(20)}})]}),r.jsx("datalist",{id:"copies",children:N.copies.map(b=>r.jsx("option",{value:b.id,children:b.name},b.id))}),r.jsxs("label",{children:["Label",r.jsxs("select",{value:el,onChange:b=>{Al(b.target.value),T(20)},children:[r.jsx("option",{value:"",children:"Tous les labels"}),N.labels.map(b=>r.jsx("option",{children:b},b))]})]}),r.jsx("button",{onClick:()=>{Bl(""),Al(""),T(20)},children:"Réinitialiser"})]})]}),G&&r.jsxs("div",{role:"alert",className:"alert",children:[G,r.jsx("button",{onClick:Ml,children:"Recharger les données"}),r.jsx("small",{children:"Les saisies non enregistrées restent dans la page."})]}),B&&r.jsx("p",{role:"status",className:"notice",children:B}),r.jsxs("section",{className:"publish",children:[r.jsxs("div",{children:[r.jsx("strong",{children:N.job.running?"Régénération en cours…":ul?`${ul} modification(s) non enregistrée(s)`:N.dirty?"Enregistré · sorties à régénérer":"Modifications enregistrées"}),r.jsx("small",{children:"Les sorties comprennent les images, PDF et le dossier A Rendre configurés."})]}),r.jsx("button",{disabled:Y||!ul,onClick:()=>gl(Object.keys(M)),children:"Tout enregistrer"}),ul>0&&r.jsx("button",{disabled:Y,onClick:()=>zl({}),children:"Annuler les saisies"}),r.jsxs("label",{className:"check",children:[r.jsx("input",{type:"checkbox",checked:il,disabled:Y,onChange:b=>et(b.target.checked)}),"Appliquer aussi le brouillon de transferts",rt?" (différent du résultat actuel)":""]}),r.jsxs("label",{className:"check",children:[r.jsx("input",{type:"checkbox",checked:Jl,disabled:Y,onChange:b=>wl(b.target.checked)}),"Ignorer les copies inchangées"]}),r.jsx("button",{className:"primary",disabled:Y||!!ul,onClick:j,children:"Régénérer les sorties"})]}),r.jsxs("fieldset",{disabled:Y,children:[r.jsxs("details",{className:"panel",children:[r.jsxs("summary",{children:["Identités et remarques générales ",r.jsxs("span",{children:[O.length," nom(s) à vérifier"]})]}),r.jsxs("div",{className:"identity-overview",children:[r.jsxs("strong",{children:["Noms manquants",F?` (${F.length})`:""]}),F===void 0?r.jsx("p",{children:"Liste des noms attendus introuvable (fichier names)."}):F.length?r.jsx("ul",{className:"missing-names",children:F.map(b=>r.jsx("li",{children:b},b))}):r.jsx("p",{children:"Tous les noms attendus sont attribués."}),r.jsxs("label",{className:"check",children:[r.jsx("input",{type:"checkbox",checked:k,onChange:b=>it(b.target.checked)}),"Afficher uniquement les copies « Nom à vérifier »"]})]}),r.jsx("p",{children:"Les remarques sont composées en LaTeX. Leur ordre est celui de la liste."}),x.length===0&&r.jsx("p",{children:"Aucune copie ne correspond aux filtres sélectionnés."}),x.map(b=>{const _=at("general",b.id,"",b.general),A=D=>Z("general",b.id,"",D);return r.jsxs("section",{className:"identity",children:[r.jsxs("div",{className:"identity-name",children:[r.jsxs("strong",{children:["Copie ",b.id]}),r.jsxs("label",{children:["Nom",r.jsx("input",{value:at("name",b.id,"",b.name),onChange:D=>Z("name",b.id,"",D.target.value)})]}),O.includes(b)&&r.jsx("span",{className:"badge warning",children:"Nom à vérifier"}),r.jsx("a",{target:"_blank",rel:"noreferrer",href:sn(b.id,"original"),children:"Voir l’originale ↗"}),r.jsx("button",{disabled:!M[Vt("name",b.id)],onClick:()=>gl([Vt("name",b.id)]),children:"Enregistrer le nom"})]}),r.jsxs("div",{className:"general",children:[_.map((D,ol)=>r.jsxs("div",{className:"remark-row",children:[r.jsx("textarea",{"aria-label":`Remarque générale ${ol+1}, copie ${b.id}`,value:D,onChange:pl=>A(_.map((Ft,Ut)=>ol===Ut?pl.target.value:Ft))}),r.jsx("button",{disabled:ol===0,"aria-label":"Monter",onClick:()=>{const pl=[..._];[pl[ol-1],pl[ol]]=[pl[ol],pl[ol-1]],A(pl)},children:"↑"}),r.jsx("button",{disabled:ol===_.length-1,"aria-label":"Descendre",onClick:()=>{const pl=[..._];[pl[ol+1],pl[ol]]=[pl[ol],pl[ol+1]],A(pl)},children:"↓"}),r.jsx("button",{onClick:()=>A(_.filter((pl,Ft)=>Ft!==ol)),children:"Supprimer"})]},ol)),r.jsx("button",{onClick:()=>A([..._,""]),children:"+ Remarque générale"}),r.jsx("button",{disabled:!M[Vt("general",b.id)],onClick:()=>gl([Vt("general",b.id)]),children:"Enregistrer les remarques"})]})]},b.id)})]}),r.jsxs("details",{className:"panel",children:[r.jsxs("summary",{children:["Transferts et coupes ",r.jsx("span",{children:rt?"Brouillon non appliqué":"Brouillon identique aux modifications appliquées"})]}),r.jsx("p",{children:"Les en-têtes et scores restent à leur label. Enregistrer un brouillon ne l’applique pas. Pour annuler un transfert, retirez sa ligne puis régénérez en cochant « Appliquer aussi le brouillon »."}),r.jsx("div",{className:"draft-list",children:al.split(` -`).map((b,_,A)=>b.trim()&&!b.trim().startsWith("###")?r.jsxs("div",{className:"draft-row",children:[r.jsx("code",{children:b}),r.jsx("button",{"aria-label":`Monter l’instruction ${_}`,disabled:_===0||A[_-1].startsWith("###"),onClick:()=>{const D=[...A];[D[_-1],D[_]]=[D[_],D[_-1]],Z("draft","","",D.join(` -`))},children:"↑"}),r.jsx("button",{"aria-label":`Descendre l’instruction ${_}`,disabled:_===A.length-1||!A[_+1].trim(),onClick:()=>{const D=[...A];[D[_+1],D[_]]=[D[_],D[_+1]],Z("draft","","",D.join(` -`))},children:"↓"}),r.jsx("button",{onClick:()=>Z("draft","","",A.filter((D,ol)=>ol!==_).join(` -`)),children:"Retirer"})]},_):null)}),r.jsxs("details",{children:[r.jsx("summary",{children:"Éditer les instructions en texte"}),r.jsx("textarea",{className:"instructions","aria-label":"Brouillon des transferts",value:al,onChange:b=>Z("draft","","",b.target.value)})]}),r.jsx("button",{disabled:!M[Vt("draft")],onClick:()=>gl([Vt("draft")]),children:"Enregistrer le brouillon"}),r.jsxs("details",{children:[r.jsx("summary",{children:"Instructions actuellement appliquées"}),r.jsx("pre",{children:N.applied})]})]}),r.jsxs("div",{className:"results",children:[r.jsxs("h2",{children:[bt.length," réponse",bt.length!==1?"s":""]}),r.jsx("span",{children:!sl&&!el?"Vue d’ensemble · sélectionnez une copie ou un label pour cibler la vérification":"Images annotées après lecture manuscrite"})]}),r.jsx("div",{className:"answer-grid",children:bt.slice(0,R).map(({c:b,a:_})=>r.jsxs("article",{className:"answer",children:[r.jsxs("div",{className:"card-heading",children:[r.jsxs("div",{children:[r.jsxs("span",{className:"eyebrow",children:["COPIE ",b.id," · ",b.name]}),r.jsx("h3",{children:_.label})]}),r.jsx("span",{className:"badge",children:_.info.present?_.info.not_empty?_.info.touched?"Dans le PDF":"Hors PDF filtré":"Réponse vide":"Absente"})]}),r.jsx("div",{className:"image-space",children:_.image?r.jsxs("button",{className:"image-button","aria-label":`Agrandir copie ${b.id} ${_.label}`,onClick:()=>ut({copy:b.id,label:_.label}),children:[r.jsx("img",{loading:"lazy",src:Xi(b.id,_.label,!1,N.revision),alt:`Réponse annotée — copie ${b.id}, ${_.label}`}),r.jsx("span",{children:"Agrandir ↗"})]}):r.jsx("p",{className:"empty",children:"Aucune image pour ce label."})}),r.jsxs("div",{className:"answer-form",children:[r.jsxs("label",{children:["Score",r.jsx("input",{inputMode:"decimal",value:at("score",b.id,_.label,_.score),onChange:A=>Z("score",b.id,_.label,A.target.value)})]}),r.jsxs("label",{children:["Remarque personnelle",r.jsx("textarea",{placeholder:"Ajouter une remarque (LaTeX accepté)",value:at("remark",b.id,_.label,_.remark),onChange:A=>Z("remark",b.id,_.label,A.target.value)})]})]}),r.jsxs("div",{className:"card-actions",children:[r.jsx("button",{disabled:!M[Vt("score",b.id,_.label)]&&!M[Vt("remark",b.id,_.label)],onClick:()=>gl([Vt("score",b.id,_.label),Vt("remark",b.id,_.label)]),children:"Enregistrer"}),r.jsx("button",{disabled:!_.editableBody,onClick:()=>St({copy:b.id,label:_.label}),children:"Couper / transférer"}),r.jsx("a",{href:sn(b.id,"context",_.label),target:"_blank",rel:"noreferrer",children:"Contexte ↗"}),r.jsx("a",{href:sn(b.id,"question",_.label),target:"_blank",rel:"noreferrer",children:"Énoncé ↗"}),r.jsx("a",{href:sn(b.id,"solution",_.label),target:"_blank",rel:"noreferrer",children:"Corrigé ↗"}),r.jsx("a",{href:sn(b.id,"output"),target:"_blank",rel:"noreferrer",children:"PDF final ↗"})]})]},b.id+"|"+_.label))}),bt.length===0&&r.jsx("p",{className:"empty",children:"Aucune réponse ne correspond à ces filtres."}),bt.length>R&&r.jsx("button",{className:"load-more",onClick:()=>T(R+20),children:"Afficher les 20 suivantes"})]}),(N.job.log||N.job.running)&&r.jsxs("details",{className:"panel",open:N.job.status==="failed",children:[r.jsxs("summary",{children:["Journal de régénération · ",N.job.status==="failed"?"Échec / résultat incomplet":N.job.running?"En cours":"Terminée"]}),r.jsx("pre",{className:"log",children:N.job.log})]})]}),Nl&&r.jsx(Sy,{copy:Nl.copy,source:Nl.label,labels:N.labels,mode:N.mode,revision:N.revision,draft:al,close:()=>St(null),accept:b=>{Z("draft","","",b),St(null),$("Instruction ajoutée au brouillon. Enregistrez-le avant de l’appliquer.")}}),Xl&&r.jsx(gy,{copy:Xl.copy,label:Xl.label,revision:N.revision,close:()=>ut(null)})]})}function gy({copy:N,label:X,revision:G,close:h}){const[B,$]=dl.useState(100);return dl.useEffect(()=>{const sl=Bl=>{Bl.key==="Escape"&&h()};return window.addEventListener("keydown",sl),()=>window.removeEventListener("keydown",sl)},[]),r.jsx("div",{className:"overlay",children:r.jsxs("section",{className:"modal viewer",role:"dialog","aria-modal":"true","aria-label":`Copie ${N} ${X}`,children:[r.jsxs("div",{className:"modal-head",children:[r.jsxs("h2",{children:["Copie ",N," · ",X]}),r.jsxs("label",{children:["Zoom ",r.jsx("input",{type:"range",min:"40",max:"200",value:B,onChange:sl=>$(Number(sl.target.value))}),B,"%"]}),r.jsx("button",{autoFocus:!0,onClick:h,children:"Fermer"})]}),r.jsx("div",{className:"zoom-scroll",children:r.jsx("img",{src:Xi(N,X,!1,G),alt:`Copie ${N}, ${X}`,style:{width:B+"%",maxWidth:"none"}})})]})})}function Sy({copy:N,source:X,labels:G,mode:h,revision:B,draft:$,close:sl,accept:Bl}){const[el,Al]=dl.useState(G.find(Z=>Z!==X)||""),[R,T]=dl.useState("cut"),[M,zl]=dl.useState(50),[Gl,Dl]=dl.useState("1"),[il,et]=dl.useState(">"),[Nl,St]=dl.useState(!1),[Xl,ut]=dl.useState(""),[Rl,K]=dl.useState(null),[k,it]=dl.useState(!1),Jl=R==="cut"?`c{${M}}${Gl}${il}`:R,wl=`Copie${N} ${X} ${Jl} ${Nl?"|":""}${el}${Nl?"":"|"}`,Ml=$.trimEnd()+` -`+wl+` -`;dl.useEffect(()=>K(null),[el,R,M,Gl,il,Nl,$]);const at=async()=>{it(!0),ut("");try{K(await ra("preview",{copy:N,source:X,target:el,text:Ml}))}catch(Z){ut(String(Z))}finally{it(!1)}};return r.jsx("div",{className:"overlay",children:r.jsxs("section",{className:"modal",role:"dialog","aria-modal":"true","aria-label":"Couper ou transférer une réponse",children:[r.jsxs("div",{className:"modal-head",children:[r.jsxs("div",{children:[r.jsxs("span",{className:"eyebrow",children:["COPIE ",N," · ",h]}),r.jsx("h2",{children:"Couper ou transférer"})]}),r.jsx("button",{autoFocus:!0,onClick:sl,children:"Fermer"})]}),r.jsx("p",{children:"Seul le corps de la réponse est déplacé. Cliquez sur l’image source pour placer la coupe."}),Xl&&r.jsx("p",{role:"alert",className:"alert",children:Xl}),r.jsxs("div",{className:"cut-controls",children:[r.jsxs("label",{children:["Destination",r.jsx("select",{value:el,onChange:Z=>Al(Z.target.value),children:G.filter(Z=>Z!==X).map(Z=>r.jsx("option",{children:Z},Z))})]}),r.jsxs("label",{children:["Opération",r.jsxs("select",{value:R,onChange:Z=>T(Z.target.value),children:[r.jsx("option",{value:"cut",children:"Couper la source"}),r.jsx("option",{value:"x>",children:"Déplacer et ajouter"}),r.jsx("option",{value:"->",children:"Copier et ajouter"}),r.jsx("option",{value:"xx",children:"Déplacer et remplacer"}),r.jsx("option",{value:"-x",children:"Copier et remplacer"}),r.jsx("option",{value:"xs",children:"Vider la source"}),r.jsx("option",{value:"sx",children:"Vider la cible"}),r.jsx("option",{value:"ss",children:"Conserver les deux"})]})]}),R==="cut"&&r.jsxs(r.Fragment,{children:[r.jsxs("label",{children:["Coupe : ",M,"%",r.jsx("input",{type:"range",min:"1",max:"99",step:"0.1",value:M,onChange:Z=>zl(Number(Z.target.value))})]}),r.jsxs("label",{children:["Conserver à la source",r.jsxs("select",{value:Gl,onChange:Z=>Dl(Z.target.value),children:[r.jsx("option",{value:"1",children:"La partie haute"}),r.jsx("option",{value:"2",children:"La partie basse"})]})]}),r.jsxs("label",{children:["À la destination",r.jsxs("select",{value:il,onChange:Z=>et(Z.target.value),children:[r.jsx("option",{value:">",children:"Ajouter le fragment"}),r.jsx("option",{value:"x",children:"Remplacer le corps"})]})]})]}),r.jsxs("label",{className:"check",children:[r.jsx("input",{type:"checkbox",checked:Nl,onChange:Z=>St(Z.target.checked)}),"Placer avant la cible"]})]}),r.jsxs("div",{className:"compare",children:[r.jsxs("div",{children:[r.jsxs("h3",{children:["Source · ",X]}),r.jsxs("div",{className:"cut-image",onClick:Z=>{if(R==="cut"){const gl=Z.currentTarget.getBoundingClientRect();zl(Math.min(99,Math.max(1,Math.round((Z.clientY-gl.top)/gl.height*1e3)/10)))}},children:[r.jsx("img",{src:Xi(N,X,!0,B),alt:"Corps source sans en-tête"}),R==="cut"&&r.jsx("div",{className:"cut-line",style:{top:M+"%"},children:r.jsxs("span",{children:[M,"%"]})})]})]}),r.jsxs("div",{children:[r.jsxs("h3",{children:["Cible · ",el]}),r.jsx(by,{copy:N,label:el,revision:B},el)]})]}),r.jsx("code",{className:"instruction-line",children:wl}),r.jsxs("div",{className:"modal-actions",children:[r.jsx("button",{disabled:k||!el,onClick:at,children:k?"Calcul de l’aperçu…":"Aperçu du résultat"}),r.jsx("button",{className:"primary",disabled:!Rl||k,onClick:()=>Bl(Ml),children:"Ajouter au brouillon"})]}),Rl&&r.jsxs(r.Fragment,{children:[r.jsx("h3",{children:"Résultat proposé après toutes les instructions du brouillon"}),r.jsx("div",{className:"compare",children:[X,el].map(Z=>r.jsxs("div",{children:[r.jsx("h4",{children:Z}),Rl[Z]?r.jsx("img",{src:Rl[Z],alt:"Aperçu "+Z}):r.jsx("p",{className:"empty",children:"Corps vide"})]},Z))})]}),r.jsx("p",{className:"muted",children:"Une instruction par source ; une cible ne peut pas être source. Modifiez ou retirez une instruction existante dans le panneau « Transferts et coupes »."})]})})}function by({copy:N,label:X,revision:G}){const[h,B]=dl.useState(!1);return h?r.jsx("p",{className:"empty",children:"Pas de corps existant. Le transfert peut remplir cette cible."}):r.jsx("img",{src:Xi(N,X,!0,G),alt:"Corps cible sans en-tête",onError:()=>B(!0)})}hy.createRoot(document.getElementById("root")).render(r.jsx(yy,{})); diff --git a/copienator/web_static/assets/index-QxonPU25.js b/copienator/web_static/assets/index-QxonPU25.js new file mode 100644 index 0000000..b6530e8 --- /dev/null +++ b/copienator/web_static/assets/index-QxonPU25.js @@ -0,0 +1,15 @@ +(function(){const X=document.createElement("link").relList;if(X&&X.supports&&X.supports("modulepreload"))return;for(const Y of document.querySelectorAll('link[rel="modulepreload"]'))h(Y);new MutationObserver(Y=>{for(const k of Y)if(k.type==="childList")for(const ol of k.addedNodes)ol.tagName==="LINK"&&ol.rel==="modulepreload"&&h(ol)}).observe(document,{childList:!0,subtree:!0});function B(Y){const k={};return Y.integrity&&(k.integrity=Y.integrity),Y.referrerPolicy&&(k.referrerPolicy=Y.referrerPolicy),Y.crossOrigin==="use-credentials"?k.credentials="include":Y.crossOrigin==="anonymous"?k.credentials="omit":k.credentials="same-origin",k}function h(Y){if(Y.ep)return;Y.ep=!0;const k=B(Y);fetch(Y.href,k)}})();var Ns={exports:{}},fn={};var ev;function fy(){if(ev)return fn;ev=1;var T=Symbol.for("react.transitional.element"),X=Symbol.for("react.fragment");function B(h,Y,k){var ol=null;if(k!==void 0&&(ol=""+k),Y.key!==void 0&&(ol=""+Y.key),"key"in Y){k={};for(var ql in Y)ql!=="key"&&(k[ql]=Y[ql])}else k=Y;return Y=k.ref,{$$typeof:T,type:h,key:ol,ref:Y!==void 0?Y:null,props:k}}return fn.Fragment=X,fn.jsx=B,fn.jsxs=B,fn}var uv;function sy(){return uv||(uv=1,Ns.exports=fy()),Ns.exports}var o=sy(),_s={exports:{}},K={};var av;function oy(){if(av)return K;av=1;var T=Symbol.for("react.transitional.element"),X=Symbol.for("react.portal"),B=Symbol.for("react.fragment"),h=Symbol.for("react.strict_mode"),Y=Symbol.for("react.profiler"),k=Symbol.for("react.consumer"),ol=Symbol.for("react.context"),ql=Symbol.for("react.forward_ref"),cl=Symbol.for("react.suspense"),pl=Symbol.for("react.memo"),x=Symbol.for("react.lazy"),b=Symbol.for("react.activity"),j=Symbol.for("react.view_transition"),Al=Symbol.iterator;function Vl(r){return r===null||typeof r!="object"?null:(r=Al&&r[Al]||r["@@iterator"],typeof r=="function"?r:null)}var xl={isMounted:function(){return!1},enqueueForceUpdate:function(){},enqueueReplaceState:function(){},enqueueSetState:function(){}},rl=Object.assign,nt={};function Cl(r,_,R){this.props=r,this.context=_,this.refs=nt,this.updater=R||xl}Cl.prototype.isReactComponent={},Cl.prototype.setState=function(r,_){if(typeof r!="object"&&typeof r!="function"&&r!=null)throw Error("takes an object of state variables to update or a function which returns an object of state variables.");this.updater.enqueueSetState(this,r,_,"setState")},Cl.prototype.forceUpdate=function(r){this.updater.enqueueForceUpdate(this,r,"forceUpdate")};function Tt(){}Tt.prototype=Cl.prototype;function Zl(r,_,R){this.props=r,this.context=_,this.refs=nt,this.updater=R||xl}var it=Zl.prototype=new Tt;it.constructor=Zl,rl(it,Cl.prototype),it.isPureReactComponent=!0;var Yl=Array.isArray;function w(){}var ll={H:null,A:null,T:null,S:null},ft=Object.prototype.hasOwnProperty;function Rl(r,_,R){var M=R.ref;return{$$typeof:T,type:r,key:_,ref:M!==void 0?M:null,props:R}}function Ll(r,_){return Rl(r.type,_,r.props)}function Kl(r){return typeof r=="object"&&r!==null&&r.$$typeof===T}function xt(r){var _={"=":"=0",":":"=2"};return"$"+r.replace(/[=:]/g,function(R){return _[R]})}var $=/\/+/g;function zl(r,_){return typeof r=="object"&&r!==null&&r.key!=null?xt(""+r.key):_.toString(36)}function A(r){switch(r.status){case"fulfilled":return r.value;case"rejected":throw r.reason;default:switch(typeof r.status=="string"?r.then(w,w):(r.status="pending",r.then(function(_){r.status==="pending"&&(r.status="fulfilled",r.value=_)},function(_){r.status==="pending"&&(r.status="rejected",r.reason=_)})),r.status){case"fulfilled":return r.value;case"rejected":throw r.reason}}throw r}function q(r,_,R,M,I){var al=typeof r;(al==="undefined"||al==="boolean")&&(r=null);var fl=!1;if(r===null)fl=!0;else switch(al){case"bigint":case"string":case"number":fl=!0;break;case"object":switch(r.$$typeof){case T:case X:fl=!0;break;case x:return fl=r._init,q(fl(r._payload),_,R,M,I)}}if(fl)return I=I(r),fl=M===""?"."+zl(r,0):M,Yl(I)?(R="",fl!=null&&(R=fl.replace($,"$&/")+"/"),q(I,_,R,"",function(st){return st})):I!=null&&(Kl(I)&&(I=Ll(I,R+(I.key==null||r&&r.key===I.key?"":(""+I.key).replace($,"$&/")+"/")+fl)),_.push(I)),1;fl=0;var U=M===""?".":M+":";if(Yl(r))for(var Z=0;Z>>1,tl=A[yl];if(0>>1;ylY(Wt,V))rY(_,Wt)?(A[yl]=_,A[r]=V,yl=r):(A[yl]=Wt,A[Et]=V,yl=Et);else if(rY(_,V))A[yl]=_,A[r]=V,yl=r;else break l}}return q}function Y(A,q){var V=A.sortIndex-q.sortIndex;return V!==0?V:A.id-q.id}if(T.unstable_now=void 0,typeof performance=="object"&&typeof performance.now=="function"){var k=performance;T.unstable_now=function(){return k.now()}}else{var ol=Date,ql=ol.now();T.unstable_now=function(){return ol.now()-ql}}var cl=[],pl=[],x=1,b=null,j=3,Al=!1,Vl=!1,xl=!1,rl=!1,nt=typeof setTimeout=="function"?setTimeout:null,Cl=typeof clearTimeout=="function"?clearTimeout:null,Tt=typeof setImmediate<"u"?setImmediate:null;function Zl(A){for(var q=B(pl);q!==null;){if(q.callback===null)h(pl);else if(q.startTime<=A)h(pl),q.sortIndex=q.expirationTime,X(cl,q);else break;q=B(pl)}}function it(A){if(xl=!1,Zl(A),!Vl)if(B(cl)!==null)Vl=!0,Yl||(Yl=!0,Kl());else{var q=B(pl);q!==null&&zl(it,q.startTime-A)}}var Yl=!1,w=-1,ll=5,ft=-1;function Rl(){return rl?!0:!(T.unstable_now()-ftA&&Rl());){var yl=b.callback;if(typeof yl=="function"){b.callback=null,j=b.priorityLevel;var tl=yl(b.expirationTime<=A);if(A=T.unstable_now(),typeof tl=="function"){b.callback=tl,Zl(A),q=!0;break t}b===B(cl)&&h(cl),Zl(A)}else h(cl);b=B(cl)}if(b!==null)q=!0;else{var wl=B(pl);wl!==null&&zl(it,wl.startTime-A),q=!1}}break l}finally{b=null,j=V,Al=!1}q=void 0}}finally{q?Kl():Yl=!1}}}var Kl;if(typeof Tt=="function")Kl=function(){Tt(Ll)};else if(typeof MessageChannel<"u"){var xt=new MessageChannel,$=xt.port2;xt.port1.onmessage=Ll,Kl=function(){$.postMessage(null)}}else Kl=function(){nt(Ll,0)};function zl(A,q){w=nt(function(){A(T.unstable_now())},q)}T.unstable_IdlePriority=5,T.unstable_ImmediatePriority=1,T.unstable_LowPriority=4,T.unstable_NormalPriority=3,T.unstable_Profiling=null,T.unstable_UserBlockingPriority=2,T.unstable_cancelCallback=function(A){A.callback=null},T.unstable_forceFrameRate=function(A){0>A||125yl?(A.sortIndex=V,X(pl,A),B(cl)===null&&A===B(pl)&&(xl?(Cl(w),w=-1):xl=!0,zl(it,V-yl))):(A.sortIndex=tl,X(cl,A),Vl||Al||(Vl=!0,Yl||(Yl=!0,Kl()))),A},T.unstable_shouldYield=Rl,T.unstable_wrapCallback=function(A){var q=j;return function(){var V=j;j=q;try{return A.apply(this,arguments)}finally{j=V}}}})(Cs)),Cs}var cv;function dy(){return cv||(cv=1,As.exports=ry()),As.exports}var js={exports:{}},at={};var fv;function vy(){if(fv)return at;fv=1;var T=ps();function X(x){var b="https://react.dev/errors/"+x;if(1"u"||typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE!="function"))try{__REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE(T)}catch(X){console.error(X)}}return T(),js.exports=vy(),js.exports}var ov;function hy(){if(ov)return sn;ov=1;var T=dy(),X=ps(),B=my();function h(l){var t="https://react.dev/errors/"+l;if(1O||(l.current=N[O],N[O]=null,O--)}function G(l,t){O++,N[O]=l.current,l.current=t}var Tl=J(null),se=J(null),kt=J(null),rn=J(null);function dn(l,t){switch(G(kt,t),G(se,l),G(Tl,null),t.nodeType){case 9:case 11:l=(l=t.documentElement)&&(l=l.namespaceURI)?r0(l):0;break;default:if(l=t.tagName,t=t.namespaceURI)t=r0(t),l=d0(t,l);else switch(l){case"svg":l=1;break;case"math":l=2;break;default:l=0}}L(Tl),G(Tl,l)}function zu(){L(Tl),L(se),L(kt)}function Vi(l){var t=l.memoizedState;t!==null&&(sa._currentValue=t.memoizedState,G(rn,l)),t=Tl.current;var e=d0(t,l.type);t!==e&&(G(se,l),G(Tl,e))}function vn(l){se.current===l&&(L(Tl),L(se)),rn.current===l&&(L(rn),sa._currentValue=st)}var Zi,Ms;function Oe(l){if(Zi===void 0)try{throw Error()}catch(e){var t=e.stack.trim().match(/\n( *(at )?)/);Zi=t&&t[1]||"",Ms=-1)":-1a||f[u]!==m[a]){var S=` +`+f[u].replace(" at new "," at ");return l.displayName&&S.includes("")&&(S=S.replace("",l.displayName)),S}while(1<=u&&0<=a);break}}}finally{Li=!1,Error.prepareStackTrace=e}return(e=l?l.displayName||l.name:"")?Oe(e):""}function dv(l,t){switch(l.tag){case 26:case 27:case 5:return Oe(l.type);case 16:return Oe("Lazy");case 13:return l.child!==t&&t!==null?Oe("Suspense Fallback"):Oe("Suspense");case 19:return Oe("SuspenseList");case 0:case 15:return Ki(l.type,!1);case 11:return Ki(l.type.render,!1);case 1:return Ki(l.type,!0);case 31:return Oe("Activity");case 30:return Oe("ViewTransition");default:return""}}function Us(l){try{var t="",e=null;do t+=dv(l,e),e=l,l=l.return;while(l);return t}catch(u){return` +Error generating stack: `+u.message+` +`+u.stack}}var Ji=Object.prototype.hasOwnProperty,wi=T.unstable_scheduleCallback,$i=T.unstable_cancelCallback,vv=T.unstable_shouldYield,mv=T.unstable_requestPaint,zt=T.unstable_now,hv=T.unstable_getCurrentPriorityLevel,xs=T.unstable_ImmediatePriority,Rs=T.unstable_UserBlockingPriority,mn=T.unstable_NormalPriority,yv=T.unstable_LowPriority,Hs=T.unstable_IdlePriority,gv=T.log,Sv=T.unstable_setDisableYieldValue,ma=null,Nt=null;function Ae(l){if(typeof gv=="function"&&Sv(l),Nt&&typeof Nt.setStrictMode=="function")try{Nt.setStrictMode(ma,l)}catch{}}var _t=Math.clz32?Math.clz32:Ev,bv=Math.log,Tv=Math.LN2;function Ev(l){return l>>>=0,l===0?32:31-(bv(l)/Tv|0)|0}var hn=256,yn=262144,gn=4194304;function Pe(l){var t=l&42;if(t!==0)return t;switch(l&-l){case 1:return 1;case 2:return 2;case 4:return 4;case 8:return 8;case 16:return 16;case 32:return 32;case 64:return 64;case 128:return 128;case 256:case 512:case 1024:case 2048:case 4096:case 8192:case 16384:case 32768:case 65536:case 131072:return l&-l;case 262144:case 524288:case 1048576:case 2097152:return l&3932160;case 4194304:case 8388608:case 16777216:case 33554432:return l&62914560;case 67108864:return 67108864;case 134217728:return 134217728;case 268435456:return 268435456;case 536870912:return 536870912;case 1073741824:return 0;default:return l}}function Sn(l,t,e){var u=l.pendingLanes;if(u===0)return 0;var a=0,n=l.suspendedLanes,i=l.pingedLanes;l=l.warmLanes;var c=u&134217727;return c!==0?(u=c&~n,u!==0?a=Pe(u):(i&=c,i!==0?a=Pe(i):e||(e=c&~l,e!==0&&(a=Pe(e))))):(c=u&~n,c!==0?a=Pe(c):i!==0?a=Pe(i):e||(e=u&~l,e!==0&&(a=Pe(e)))),a===0?0:t!==0&&t!==a&&(t&n)===0&&(n=a&-a,e=t&-t,n>=e||n===32&&(e&4194048)!==0)?t:a}function ha(l,t){return(l.pendingLanes&~(l.suspendedLanes&~l.pingedLanes)&t)===0}function qs(l,t){(t&8)!==0&&(t|=t&32);var e=l.entangledLanes;if(e!==0)for(l=l.entanglements,e&=t;0e;e++)t.push(l);return t}function ya(l,t){l.pendingLanes|=t,t!==268435456&&(l.suspendedLanes=0,l.pingedLanes=0,l.warmLanes=0)}function Nv(l,t,e,u,a,n){var i=l.pendingLanes;l.pendingLanes=e,l.suspendedLanes=0,l.pingedLanes=0,l.warmLanes=0,l.expiredLanes&=e,l.entangledLanes&=e,l.errorRecoveryDisabledLanes&=e,l.shellSuspendCounter=0;var c=l.entanglements,f=l.expirationTimes,m=l.hiddenUpdates;for(e=i&~e;0"u"||typeof window.document>"u"||typeof window.document.createElement>"u"),nc=!1;if(de)try{var Ta={};Object.defineProperty(Ta,"passive",{get:function(){nc=!0}}),window.addEventListener("test",Ta,Ta),window.removeEventListener("test",Ta,Ta)}catch{nc=!1}var Ce=null,ic=null,_n=null;function io(){if(_n)return _n;var l,t=ic,e=t.length,u,a="value"in Ce?Ce.value:Ce.textContent,n=a.length;for(l=0;l=Na),vo=" ",mo=!1;function ho(l,t){switch(l){case"keyup":return nm.indexOf(t.keyCode)!==-1;case"keydown":return t.keyCode!==229;case"keypress":case"mousedown":case"focusout":return!0;default:return!1}}function yo(l){return l=l.detail,typeof l=="object"&&"data"in l?l.data:null}var Mu=!1;function cm(l,t){switch(l){case"compositionend":return yo(t);case"keypress":return t.which!==32?null:(mo=!0,vo);case"textInput":return l=t.data,l===vo&&mo?null:l;default:return null}}function fm(l,t){if(Mu)return l==="compositionend"||!rc&&ho(l,t)?(l=io(),_n=ic=Ce=null,Mu=!1,l):null;switch(l){case"paste":return null;case"keypress":if(!(t.ctrlKey||t.altKey||t.metaKey)||t.ctrlKey&&t.altKey){if(t.char&&1"u")return null;try{return l.activeElement||l.body}catch{return l.body}}function _o(l){for(;l&&l.firstChild;)l=l.firstChild;return l}function Oo(l,t){var e=_o(l);l=0;for(var u;e;){if(e.nodeType===3){if(u=l+e.textContent.length,l<=t&&u>=t)return{node:e,offset:t-l};l=u}l:{for(;e;){if(e.nextSibling){e=e.nextSibling;break l}e=e.parentNode}e=void 0}e=_o(e)}}function Ao(l,t){return l&&t?l===t?!0:l&&l.nodeType===3?!1:t&&t.nodeType===3?Ao(l,t.parentNode):"contains"in l?l.contains(t):l.compareDocumentPosition?!!(l.compareDocumentPosition(t)&16):!1:!1}function Co(l){l=l!=null&&l.ownerDocument!=null&&l.ownerDocument.defaultView!=null?l.ownerDocument.defaultView:window;for(var t=mc(l.document);t instanceof l.HTMLIFrameElement;){try{var e=typeof t.contentWindow.location.href=="string"}catch{e=!1}if(e)l=t.contentWindow;else break;t=mc(l.document)}return t}function hc(l){var t=l&&l.nodeName&&l.nodeName.toLowerCase();return t&&(t==="input"&&(l.type==="text"||l.type==="search"||l.type==="tel"||l.type==="url"||l.type==="password")||t==="textarea"||l.contentEditable==="true")}var ym=de&&"documentMode"in document&&11>=document.documentMode,Uu=null,yc=null,Ca=null,gc=!1;function jo(l,t,e){var u=e.window===e?e.document:e.nodeType===9?e:e.ownerDocument;gc||Uu==null||Uu!==mc(u)||(u=Uu,"selectionStart"in u&&hc(u)?u={start:u.selectionStart,end:u.selectionEnd}:(u=(u.ownerDocument&&u.ownerDocument.defaultView||window).getSelection(),u={anchorNode:u.anchorNode,anchorOffset:u.anchorOffset,focusNode:u.focusNode,focusOffset:u.focusOffset}),Ca&&Aa(Ca,u)||(Ca=u,u=Di(yc,"onSelect"),0>=i,a-=i,Pt=1<<32-_t(t)+a|e<Q?(Ql=H,H=null):Ql=H.sibling;var sl=d(v,H,y[Q],E);if(sl===null){H===null&&(H=Ql);break}l&&H&&sl.alternate===null&&t(v,H),s=n(sl,s,Q),il===null?D=sl:il.sibling=sl,il=sl,H=Ql}if(Q===y.length)return e(v,H),P&&ye(v,Q),D;if(H===null){for(;QQ?(Ql=H,H=null):Ql=H.sibling;var Ie=d(v,H,sl.value,E);if(Ie===null){H===null&&(H=Ql);break}l&&H&&Ie.alternate===null&&t(v,H),s=n(Ie,s,Q),il===null?D=Ie:il.sibling=Ie,il=Ie,H=Ql}if(sl.done)return e(v,H),P&&ye(v,Q),D;if(H===null){for(;!sl.done;Q++,sl=y.next())sl=z(v,sl.value,E),sl!==null&&(s=n(sl,s,Q),il===null?D=sl:il.sibling=sl,il=sl);return P&&ye(v,Q),D}for(H=u(H);!sl.done;Q++,sl=y.next())sl=g(H,v,Q,sl.value,E),sl!==null&&(l&&(Ql=sl.alternate,Ql!==null&&H.delete(Ql.key===null?Q:Ql.key)),s=n(sl,s,Q),il===null?D=sl:il.sibling=sl,il=sl);return l&&H.forEach(function(cy){return t(v,cy)}),P&&ye(v,Q),D}function W(v,s,y,E){if(typeof y=="object"&&y!==null&&y.type===Ll&&y.key===null&&y.props.ref===void 0&&(y=y.props.children),typeof y=="object"&&y!==null){switch(y.$$typeof){case ft:l:{for(var D=y.key;s!==null;){if(s.key===D){if(D=y.type,D===Ll){if(s.tag===7){e(v,s.sibling),E=a(s,y.props.children),xe(E,y),E.return=v,v=E;break l}}else if(s.elementType===D||typeof D=="object"&&D!==null&&D.$$typeof===tl&&du(D)===s.type){e(v,s.sibling),E=a(s,y.props),xe(E,y),E.return=v,v=E;break l}e(v,s);break}else t(v,s);s=s.sibling}y.type===Ll?(E=nu(y.props.children,v.mode,E,y.key),xe(E,y),E.return=v,v=E):(E=Rn(y.type,y.key,y.props,null,v.mode,E),xe(E,y),E.return=v,v=E)}return i(v);case Rl:l:{for(D=y.key;s!==null;){if(s.key===D)if(s.tag===4&&s.stateNode.containerInfo===y.containerInfo&&s.stateNode.implementation===y.implementation){e(v,s.sibling),E=a(s,y.children||[]),E.return=v,v=E;break l}else{e(v,s);break}else t(v,s);s=s.sibling}E=_c(y,v.mode,E),E.return=v,v=E}return i(v);case tl:return y=du(y),W(v,s,y,E)}if(fl(y))return C(v,s,y,E);if(M(y)){if(D=M(y),typeof D!="function")throw Error(h(150));return y=D.call(y),p(v,s,y,E)}if(typeof y.then=="function")return W(v,s,Ln(y),E);if(y.$$typeof===zl)return W(v,s,Xn(v,y),E);Kn(v,y)}return typeof y=="string"&&y!==""||typeof y=="number"||typeof y=="bigint"?(y=""+y,s!==null&&s.tag===6?(e(v,s.sibling),E=a(s,y),E.return=v,v=E):(e(v,s),E=Nc(y,v.mode,E),E.return=v,v=E),i(v)):e(v,s)}return function(v,s,y,E){try{xa=0;var D=W(v,s,y,E);return Qu=null,D}catch(H){if(H===Xu||H===Vn)throw H;var il=ht(29,H,null,v.mode);return il.lanes=E,il.return=v,il}}}var mu=Io(!0),Po=Io(!1),Re=!1;function Rc(l){l.updateQueue={baseState:l.memoizedState,firstBaseUpdate:null,lastBaseUpdate:null,shared:{pending:null,lanes:0,hiddenCallbacks:null},callbacks:null}}function Hc(l,t){l=l.updateQueue,t.updateQueue===l&&(t.updateQueue={baseState:l.baseState,firstBaseUpdate:l.firstBaseUpdate,lastBaseUpdate:l.lastBaseUpdate,shared:l.shared,callbacks:null})}function He(l){return{lane:l,tag:0,payload:null,callback:null,next:null}}function qe(l,t,e){var u=l.updateQueue;if(u===null)return null;if(u=u.shared,(vl&2)!==0){var a=u.pending;return a===null?t.next=t:(t.next=a.next,a.next=t),u.pending=t,t=xn(l),qo(l,null,e),t}return Un(l,u,t,e),xn(l)}function Ra(l,t,e){if(t=t.updateQueue,t!==null&&(t=t.shared,(e&4194048)!==0)){var u=t.lanes;u&=l.pendingLanes,e|=u,t.lanes=e,Gs(l,e)}}function qc(l,t){var e=l.updateQueue,u=l.alternate;if(u!==null&&(u=u.updateQueue,e===u)){var a=null,n=null;if(e=e.firstBaseUpdate,e!==null){do{var i={lane:e.lane,tag:e.tag,payload:e.payload,callback:null,next:null};n===null?a=n=i:n=n.next=i,e=e.next}while(e!==null);n===null?a=n=t:n=n.next=t}else a=n=t;e={baseState:u.baseState,firstBaseUpdate:a,lastBaseUpdate:n,shared:u.shared,callbacks:u.callbacks},l.updateQueue=e;return}l=e.lastBaseUpdate,l===null?e.firstBaseUpdate=t:l.next=t,e.lastBaseUpdate=t}var Yc=!1;function Ha(){if(Yc){var l=Gu;if(l!==null)throw l}}function qa(l,t,e,u){Yc=!1;var a=l.updateQueue;Re=!1;var n=a.firstBaseUpdate,i=a.lastBaseUpdate,c=a.shared.pending;if(c!==null){a.shared.pending=null;var f=c,m=f.next;f.next=null,i===null?n=m:i.next=m,i=f;var S=l.alternate;S!==null&&(S=S.updateQueue,c=S.lastBaseUpdate,c!==i&&(c===null?S.firstBaseUpdate=m:c.next=m,S.lastBaseUpdate=f))}if(n!==null){var z=a.baseState;i=0,S=m=f=null,c=n;do{var d=c.lane&-536870913,g=d!==c.lane;if(g?(nl&d)===d:(u&d)===d){d!==0&&d===ou&&(Yc=!0),S!==null&&(S=S.next={lane:0,tag:c.tag,payload:c.payload,callback:null,next:null});l:{var C=l,p=c;d=t;var W=e;switch(p.tag){case 1:if(C=p.payload,typeof C=="function"){z=C.call(W,z,d);break l}z=C;break l;case 3:C.flags=C.flags&-65537|128;case 0:if(C=p.payload,d=typeof C=="function"?C.call(W,z,d):C,d==null)break l;z=w({},z,d);break l;case 2:Re=!0}}d=c.callback,d!==null&&(l.flags|=64,g&&(l.flags|=8192),g=a.callbacks,g===null?a.callbacks=[d]:g.push(d))}else g={lane:d,tag:c.tag,payload:c.payload,callback:c.callback,next:null},S===null?(m=S=g,f=z):S=S.next=g,i|=d;if(c=c.next,c===null){if(c=a.shared.pending,c===null)break;g=c,c=g.next,g.next=null,a.lastBaseUpdate=g,a.shared.pending=null}}while(!0);S===null&&(f=z),a.baseState=f,a.firstBaseUpdate=m,a.lastBaseUpdate=S,n===null&&(a.shared.lanes=0),Ze|=i,l.lanes=i,l.memoizedState=z}}function lr(l,t){if(typeof l!="function")throw Error(h(191,l));l.call(t)}function tr(l,t){var e=l.callbacks;if(e!==null)for(l.callbacks=null,l=0;ln?n:8;var i=U.T,c={};c.types=i!==null?i.types:null,U.T=c,uf(l,!1,t,e);try{var f=a(),m=U.S;if(m!==null&&m(c,f),f!==null&&typeof f=="object"&&typeof f.then=="function"){var S=Cm(f,u);Xa(l,t,S,Mt(l))}else Xa(l,t,u,Mt(l))}catch(z){Xa(l,t,{then:function(){},status:"rejected",reason:z},Mt())}finally{Z.p=n,i!==null&&c.types!==null&&(i.types=c.types),U.T=i}}function xm(){}function tf(l,t,e,u){if(l.tag!==5)throw Error(h(476));var a=xr(l).queue;Ur(l,a,t,st,e===null?xm:function(){return Rr(l),e(u)})}function xr(l){var t=l.memoizedState;if(t!==null)return t;t={memoizedState:st,baseState:st,baseQueue:null,queue:{pending:null,lanes:0,dispatch:null,lastRenderedReducer:Te,lastRenderedState:st},next:null};var e={};return t.next={memoizedState:e,baseState:e,baseQueue:null,queue:{pending:null,lanes:0,dispatch:null,lastRenderedReducer:Te,lastRenderedState:e},next:null},l.memoizedState=t,l=l.alternate,l!==null&&(l.memoizedState=t),t}function Rr(l){var t=xr(l);t.next===null&&(t=l.alternate.memoizedState),Xa(l,t.next.queue,{},Mt())}function ef(){return Pl(sa)}function Hr(){return Hl().memoizedState}function qr(){return Hl().memoizedState}function Rm(l){for(var t=l.return;t!==null;){switch(t.tag){case 24:case 3:var e=Mt();l=He(e);var u=qe(t,l,e);u!==null&&(bt(u,t,e),Ra(u,t,e)),t={cache:pc()},l.payload=t;return}t=t.return}}function Hm(l,t,e){var u=Mt();e={lane:u,revertLane:0,gesture:null,action:e,hasEagerState:!1,eagerState:null,next:null},ti(l)?Br(t,e):(e=Ec(l,t,e,u),e!==null&&(bt(e,l,u),Gr(e,t,u)))}function Yr(l,t,e){var u=Mt();Xa(l,t,e,u)}function Xa(l,t,e,u){var a={lane:u,revertLane:0,gesture:null,action:e,hasEagerState:!1,eagerState:null,next:null};if(ti(l))Br(t,a);else{var n=l.alternate;if(l.lanes===0&&(n===null||n.lanes===0)&&(n=t.lastRenderedReducer,n!==null))try{var i=t.lastRenderedState,c=n(i,e);if(a.hasEagerState=!0,a.eagerState=c,At(c,i))return Un(l,t,a,0),Nl===null&&Mn(),!1}catch{}if(e=Ec(l,t,a,u),e!==null)return bt(e,l,u),Gr(e,t,u),!0}return!1}function uf(l,t,e,u){if(u={lane:2,revertLane:$f(),gesture:null,action:u,hasEagerState:!1,eagerState:null,next:null},ti(l)){if(t)throw Error(h(479))}else t=Ec(l,e,u,2),t!==null&&bt(t,l,2)}function ti(l){var t=l.alternate;return l===F||t!==null&&t===F}function Br(l,t){Vu=$n=!0;var e=l.pending;e===null?t.next=t:(t.next=e.next,e.next=t),l.pending=t}function Gr(l,t,e){if((e&4194048)!==0){var u=t.lanes;u&=l.pendingLanes,e|=u,t.lanes=e,Gs(l,e)}}var ei={readContext:Pl,use:kn,useCallback:Ml,useContext:Ml,useEffect:Ml,useImperativeHandle:Ml,useLayoutEffect:Ml,useInsertionEffect:Ml,useMemo:Ml,useReducer:Ml,useRef:Ml,useState:Ml,useDebugValue:Ml,useDeferredValue:Ml,useTransition:Ml,useSyncExternalStore:Ml,useId:Ml,useHostTransitionStatus:Ml,useFormState:Ml,useActionState:Ml,useOptimistic:Ml,useMemoCache:Ml,useCacheRefresh:Ml,useEffectEvent:Ml},Xr={readContext:Pl,use:kn,useCallback:function(l,t){return rt().memoizedState=[l,t===void 0?null:t],l},useContext:Pl,useEffect:Nr,useImperativeHandle:function(l,t,e){e=e!=null?e.concat([l]):null,Pn(4194308,4,Cr.bind(null,t,l),e)},useLayoutEffect:function(l,t){return Pn(4194308,4,l,t)},useInsertionEffect:function(l,t){Pn(4,2,l,t)},useMemo:function(l,t){var e=rt();t=t===void 0?null:t;var u=l();if(hu){Ae(!0);try{l()}finally{Ae(!1)}}return e.memoizedState=[u,t],u},useReducer:function(l,t,e){var u=rt();if(e!==void 0){var a=e(t);if(hu){Ae(!0);try{e(t)}finally{Ae(!1)}}}else a=t;return u.memoizedState=u.baseState=a,l={pending:null,lanes:0,dispatch:null,lastRenderedReducer:l,lastRenderedState:a},u.queue=l,l=l.dispatch=Hm.bind(null,F,l),[u.memoizedState,l]},useRef:function(l){var t=rt();return l={current:l},t.memoizedState=l},useState:function(l){l=Wc(l);var t=l.queue,e=Yr.bind(null,F,t);return t.dispatch=e,[l.memoizedState,e]},useDebugValue:Pc,useDeferredValue:function(l,t){var e=rt();return lf(e,l,t)},useTransition:function(){var l=Wc(!1);return l=Ur.bind(null,F,l.queue,!0,!1),rt().memoizedState=l,[!1,l]},useSyncExternalStore:function(l,t,e){var u=F,a=rt();if(P){if(e===void 0)throw Error(h(407));e=e()}else{if(e=t(),Nl===null)throw Error(h(349));(nl&127)!==0||cr(u,t,e)}a.memoizedState=e;var n={value:e,getSnapshot:t};return a.queue=n,Nr(sr.bind(null,u,n,l),[l]),u.flags|=2048,Lu(9,{destroy:void 0},fr.bind(null,u,n,e,t),null),e},useId:function(){var l=rt(),t=Nl.identifierPrefix;if(P){var e=le,u=Pt;e=(u&~(1<<32-_t(u)-1)).toString(32)+e,t="_"+t+"R_"+e,e=Fn++,0<\/script>",n=n.removeChild(n.firstChild);break;case"select":n=typeof u.is=="string"?i.createElement("select",{is:u.is}):i.createElement("select"),u.multiple?n.multiple=!0:u.size&&(n.size=u.size);break;default:n=typeof u.is=="string"?i.createElement(a,{is:u.is}):i.createElement(a)}}n[Il]=t,n[mt]=u;l:for(i=t.child;i!==null;){if(i.tag===5||i.tag===6)n.appendChild(i.stateNode);else if(i.tag!==4&&i.tag!==27&&i.child!==null){i.child.return=i,i=i.child;continue}if(i===t)break l;for(;i.sibling===null;){if(i.return===null||i.return===t)break l;i=i.return}i.sibling.return=i.return,i=i.sibling}t.stateNode=n;l:switch(ut(n,a,u),a){case"button":case"input":case"select":case"textarea":u=!!u.autoFocus;break l;case"img":u=!0;break l;default:u=!1}u&&ze(t)}}return Ol(t),t.subtreeFlags&=-33554433,gf(t,t.type,l===null?null:l.memoizedProps,t.pendingProps,e),null;case 6:if(l&&t.stateNode!=null)l.memoizedProps!==u&&ze(t);else{if(typeof u!="string"&&t.stateNode===null)throw Error(h(166));if(l=kt.current,Bu(t)){if(l=t.stateNode,e=t.memoizedProps,u=null,a=Fl,a!==null)switch(a.tag){case 27:case 5:u=a.memoizedProps}l[Il]=t,l=!!(l.nodeValue===e||u!==null&&u.suppressHydrationWarning===!0||s0(l.nodeValue,e)),l||Me(t,!0)}else l=Pa(l).createTextNode(u),l[Il]=t,t.stateNode=l}return Ol(t),null;case 31:if(e=t.memoizedState,l===null||l.memoizedState!==null){if(u=Bu(t),e!==null){if(l===null){if(!u)throw Error(h(318));if(l=t.memoizedState,l=l!==null?l.dehydrated:null,!l)throw Error(h(557));l[Il]=t}else iu(),(t.flags&128)===0&&(t.memoizedState=null),t.flags|=4;Ol(t),l=!1}else e=Cc(),l!==null&&l.memoizedState!==null&&(l.memoizedState.hydrationErrors=e),l=!0;if(!l)return t.flags&256?(Ct(t),t):(Ct(t),null);if((t.flags&128)!==0)throw Error(h(558))}return Ol(t),null;case 13:if(u=t.memoizedState,l===null||l.memoizedState!==null&&l.memoizedState.dehydrated!==null){if(a=Bu(t),u!==null&&u.dehydrated!==null){if(l===null){if(!a)throw Error(h(318));if(a=t.memoizedState,a=a!==null?a.dehydrated:null,!a)throw Error(h(317));a[Il]=t}else iu(),(t.flags&128)===0&&(t.memoizedState=null),t.flags|=4;Ol(t),a=!1}else a=Cc(),l!==null&&l.memoizedState!==null&&(l.memoizedState.hydrationErrors=a),a=!0;if(!a)return t.flags&256?(Ct(t),t):(Ct(t),null)}return Ct(t),(t.flags&128)!==0?(t.lanes=e,t):(e=u!==null,l=l!==null&&l.memoizedState!==null,e&&(u=t.child,a=null,u.alternate!==null&&u.alternate.memoizedState!==null&&u.alternate.memoizedState.cachePool!==null&&(a=u.alternate.memoizedState.cachePool.pool),n=null,u.memoizedState!==null&&u.memoizedState.cachePool!==null&&(n=u.memoizedState.cachePool.pool),n!==a&&(u.flags|=2048)),e!==l&&e&&(t.child.flags|=8192),fi(t,t.updateQueue),Ol(t),null);case 4:return zu(),l===null&&If(t.stateNode.containerInfo),t.flags|=67108864,Ol(t),null;case 10:return Se(t.type),Ol(t),null;case 19:if(Qc(t),u=t.memoizedState,u===null)return Ol(t),null;if(a=(t.flags&128)!==0,n=u.rendering,n===null)if(a)Va(u,!1);else{if(Ul!==0||l!==null&&(l.flags&128)!==0)for(l=t.child;l!==null;){if(n=wn(l),n!==null){for(t.flags|=128,Va(u,!1),l=n.updateQueue,t.updateQueue=l,fi(t,l),t.subtreeFlags=0,l=e,e=t.child;e!==null;)Yo(e,l),e=e.sibling;return Ya(t,tt.current&1|2),P&&ye(t,u.treeForkCount),t.child}l=l.sibling}u.tail!==null&&zt()>Ti&&(t.flags|=128,a=!0,Va(u,!1),t.lanes=4194304)}else{if(!a)if(l=wn(n),l!==null){if(t.flags|=128,a=!0,l=l.updateQueue,t.updateQueue=l,fi(t,l),Va(u,!0),u.tail===null&&u.tailMode!=="collapsed"&&u.tailMode!=="visible"&&!n.alternate&&!P)return Ol(t),null}else 2*zt()-u.renderingStartTime>Ti&&e!==536870912&&(t.flags|=128,a=!0,Va(u,!1),t.lanes=4194304);u.isBackwards?(n.sibling=t.child,t.child=n):(l=u.last,l!==null?l.sibling=n:t.child=n,u.last=n)}if(u.tail!==null){l=u.tail;l:{for(e=l;e!==null;){if(e.alternate!==null){e=!1;break l}e=e.sibling}e=!0}return u.rendering=l,u.tail=l.sibling,u.renderingStartTime=zt(),l.sibling=null,n=tt.current,n=a?n&1|2:n&1,u.tailMode==="visible"||u.tailMode==="collapsed"||!e||P?Ya(t,n):(e=n,G(lt,t),G(tt,e),ct===null&&(ct=t)),P&&ye(t,u.treeForkCount),l}return Ol(t),null;case 22:case 23:return Ct(t),Gc(),u=t.memoizedState!==null,l!==null?l.memoizedState!==null!==u&&(t.flags|=8192):u&&(t.flags|=8192),u?(e&536870912)!==0&&(t.flags&128)===0&&(Ol(t),t.subtreeFlags&6&&(t.flags|=8192)):Ol(t),e=t.updateQueue,e!==null&&fi(t,e.retryQueue),e=null,l!==null&&l.memoizedState!==null&&l.memoizedState.cachePool!==null&&(e=l.memoizedState.cachePool.pool),u=null,t.memoizedState!==null&&t.memoizedState.cachePool!==null&&(u=t.memoizedState.cachePool.pool),u!==e&&(t.flags|=2048),l!==null&&L(ru),null;case 24:return e=null,l!==null&&(e=l.memoizedState.cache),t.memoizedState.cache!==e&&(t.flags|=2048),Se(Bl),Ol(t),null;case 25:return null;case 30:return t.flags|=33554432,Ol(t),null}throw Error(h(156,t.tag))}function Vm(l,t){switch(Oc(t),t.tag){case 1:return l=t.flags,l&65536?(t.flags=l&-65537|128,t):null;case 3:return Se(Bl),zu(),l=t.flags,(l&65536)!==0&&(l&128)===0?(t.flags=l&-65537|128,t):null;case 26:case 27:case 5:return vn(t),null;case 31:if(t.memoizedState!==null){if(Ct(t),t.alternate===null)throw Error(h(340));iu()}return l=t.flags,l&65536?(t.flags=l&-65537|128,t):null;case 13:if(Ct(t),l=t.memoizedState,l!==null&&l.dehydrated!==null){if(t.alternate===null)throw Error(h(340));iu()}return l=t.flags,l&65536?(t.flags=l&-65537|128,t):null;case 19:return Qc(t),l=t.flags,l&65536?(t.flags=l&-65537|128,l=t.memoizedState,l!==null&&(l.rendering=null,l.tail=null),t.flags|=4,t):null;case 4:return zu(),null;case 10:return Se(t.type),null;case 22:case 23:return Ct(t),Gc(),l!==null&&L(ru),l=t.flags,l&65536?(t.flags=l&-65537|128,t):null;case 24:return Se(Bl),null;case 25:return null;default:return null}}function rd(l,t){switch(Oc(t),t.tag){case 3:Se(Bl),zu();break;case 26:case 27:case 5:vn(t);break;case 4:zu();break;case 31:t.memoizedState!==null&&Ct(t);break;case 13:Ct(t);break;case 19:Qc(t);break;case 10:Se(t.type);break;case 22:case 23:Ct(t),Gc(),l!==null&&L(ru);break;case 24:Se(Bl)}}function Za(l,t){try{var e=t.updateQueue,u=e!==null?e.lastEffect:null;if(u!==null){var a=u.next;e=a;do{if((e.tag&l)===l){u=void 0;var n=e.create,i=e.inst;u=n(),i.destroy=u}e=e.next}while(e!==a)}}catch(c){Sl(t,t.return,c)}}function Xe(l,t,e){try{var u=t.updateQueue,a=u!==null?u.lastEffect:null;if(a!==null){var n=a.next;u=n;do{if((u.tag&l)===l){var i=u.inst,c=i.destroy;if(c!==void 0){i.destroy=void 0,a=t;var f=e,m=c;try{m()}catch(S){Sl(a,f,S)}}}u=u.next}while(u!==n)}}catch(S){Sl(t,t.return,S)}}function dd(l){var t=l.updateQueue;if(t!==null){var e=l.stateNode;try{tr(t,e)}catch(u){Sl(l,l.return,u)}}}function vd(l,t,e){e.props=yu(l.type,l.memoizedProps),e.state=l.memoizedState;try{e.componentWillUnmount()}catch(u){Sl(l,t,u)}}function te(l,t){try{var e=l.ref;if(e!==null){switch(l.tag){case 26:case 27:case 5:var u=l.stateNode;break;case 30:var a=l.stateNode,n=ve(l.memoizedProps,a);(a.ref===null||a.ref.name!==n)&&(a.ref=T0(n)),u=a.ref;break;case 7:if(l.stateNode===null){var i=new Ut(l);b(l.child,!1,Uh,i,void 0,void 0),l.stateNode=i}u=l.stateNode;break;default:u=l.stateNode}typeof e=="function"?l.refCleanup=e(u):e.current=u}}catch(c){Sl(l,t,c)}}function et(l,t){var e=l.ref,u=l.refCleanup;if(e!==null)if(typeof u=="function")try{u()}catch(a){Sl(l,t,a)}finally{l.refCleanup=null,l=l.alternate,l!=null&&(l.refCleanup=null)}else if(typeof e=="function")try{e(null)}catch(a){Sl(l,t,a)}else e.current=null}function si(l,t){if((l.tag===5||l.tag===27||l.tag===6)&&l.alternate===null&&t!==null)for(var e=0;e title"))),ut(u,t,e),u[Il]=l,$l(u),t=u;break l;case"link":if(n=Y0("link","href",a).get(t+(e.href||""))){for(i=0;iW&&(i=W,W=p,p=i);var v=Oo(c,p),s=Oo(c,W);if(v&&s&&(g.rangeCount!==1||g.anchorNode!==v.node||g.anchorOffset!==v.offset||g.focusNode!==s.node||g.focusOffset!==s.offset)){var y=z.createRange();y.setStart(v.node,v.offset),g.removeAllRanges(),p>W?(g.addRange(y),g.extend(s.node,s.offset)):(y.setEnd(s.node,s.offset),g.addRange(y))}}}}for(z=[],g=c;g=g.parentNode;)g.nodeType===1&&z.push({element:g,left:g.scrollLeft,top:g.scrollTop});for(typeof c.focus=="function"&&c.focus(),c=0;ce?32:e,U.T=null,e=Bf,Bf=null;var n=$t,i=ce;if(Dl=0,Tu=$t=null,ce=0,(vl&6)!==0)throw Error(h(331));var c=vl;if(vl|=4,qd(n.current),xd(n,n.current,i,e),vl=c,Wa(0,!1),Nt&&typeof Nt.onPostCommitFiberRoot=="function")try{Nt.onPostCommitFiberRoot(ma,n)}catch{}return!0}finally{Z.p=a,U.T=u,kd(l,t)}}function Id(l,t,e){t=qt(e,t),t=cf(l.stateNode,t,2),l=qe(l,t,2),l!==null&&(ya(l,2),fe(l))}function Sl(l,t,e){if(l.tag===3)Id(l,l,e);else for(;t!==null;){if(t.tag===3){Id(t,l,e);break}else if(t.tag===1){var u=t.stateNode;if(typeof t.type.getDerivedStateFromError=="function"||typeof u.componentDidCatch=="function"&&(Le===null||!Le.has(u))){l=qt(e,l),e=$r(2),u=qe(t,e,2),u!==null&&(Fr(e,u,t,l),ya(u,2),fe(u));break}}t=t.return}}function Kf(l,t,e){var u=l.pingCache;if(u===null){u=l.pingCache=new Jm;var a=new Set;u.set(t,a)}else a=u.get(t),a===void 0&&(a=new Set,u.set(t,a));a.has(e)||(Hf=!0,a.add(e),l=lh.bind(null,l,t,e),t.then(l,l))}function lh(l,t,e){var u=l.pingCache;u!==null&&u.delete(t),l.pingedLanes|=l.suspendedLanes&e,l.warmLanes&=~e,Nl===l&&(nl&e)===e&&((Ul===4||Ul===3&&(nl&62914560)===nl&&300>zt()-bi)&&(vl&2)===0?ta(l,0):Si|=e,Wu===nl&&(Wu=0)),fe(l)}function Pd(l,t){t===0&&(t=Ys()),l=au(l,t),l!==null&&(ya(l,t),fe(l))}function th(l){var t=l.memoizedState,e=0;t!==null&&(e=t.retryLane),Pd(l,e)}function eh(l,t){var e=0;switch(l.tag){case 31:case 13:var u=l.stateNode,a=l.memoizedState;a!==null&&(e=a.retryLane);break;case 19:u=l.stateNode;break;case 22:u=l.stateNode._retryCache;break;default:throw Error(h(314))}u!==null&&u.delete(t),Pd(l,e)}function uh(l,t){return wi(l,t)}var ua=null,aa=null,Jf=!1,Ci=!1,wf=!1,Je=0;function fe(l){l!==aa&&l.next===null&&(aa===null?ua=aa=l:aa=aa.next=l),Ci=!0,Jf||(Jf=!0,nh())}function Wa(l,t){if(!wf&&Ci){wf=!0;do for(var e=!1,u=ua;u!==null;){if(l!==0){var a=u.pendingLanes;if(a===0)var n=0;else{var i=u.suspendedLanes,c=u.pingedLanes;n=(1<<31-_t(42|l)+1)-1,n&=a&~(i&~c),n=n&201326741?n&201326741|1:n?n|2:0}n!==0&&(e=!0,u0(u,n))}else n=nl,n=Sn(u,u===Nl?n:0,u.cancelPendingCommit!==null||u.timeoutHandle!==-1),(n&3)===0||ha(u,n)||(e=!0,u0(u,n));u=u.next}while(e);wf=!1}}function ah(){l0()}function l0(){Ci=Jf=!1;var l=0;Je!==0&&yh()&&(l=Je);for(var t=zt(),e=null,u=ua;u!==null;){var a=u.next,n=t0(u,t);n===0?(u.next=null,e===null?ua=a:e.next=a,a===null&&(aa=e)):(e=u,(l!==0||(n&3)!==0)&&(Ci=!0)),u=a}Dl!==0&&Dl!==5||Wa(l),Je!==0&&(Je=0)}function t0(l,t){for(var e=l.suspendedLanes,u=l.pingedLanes,a=l.expirationTimes,n=l.pendingLanes&-62914561;0c)break;var S=f.transferSize,z=f.initiatorType;S&&o0(z)&&(f=f.responseEnd,i+=S*(fUi){p.length=C;break}y=new Promise(zh.bind(y)),p.push(y)}}}if(0"u"?null:document;function x0(l,t,e){var u=ia;if(u&&typeof t=="string"&&t){var a=Rt(t);a='link[rel="'+l+'"][href="'+a+'"]',typeof e=="string"&&(a+='[crossorigin="'+e+'"]'),U0.has(a)||(U0.add(a),l={rel:l,crossOrigin:e,href:t},u.querySelector(a)===null&&(t=u.createElement("link"),ut(t,"link",l),$l(t),u.head.appendChild(t)))}}function Qh(l){_e.D(l),x0("dns-prefetch",l,null)}function Vh(l,t){_e.C(l,t),x0("preconnect",l,t)}function Zh(l,t,e){_e.L(l,t,e);var u=ia;if(u&&l&&t){var a='link[rel="preload"][as="'+Rt(t)+'"]';t==="image"&&e&&e.imageSrcSet?(a+='[imagesrcset="'+Rt(e.imageSrcSet)+'"]',typeof e.imageSizes=="string"&&(a+='[imagesizes="'+Rt(e.imageSizes)+'"]')):a+='[href="'+Rt(l)+'"]';var n=a;switch(t){case"style":n=ca(l);break;case"script":n=fa(l)}if(!(Vt.has(n)||(l=w({rel:"preload",href:t==="image"&&e&&e.imageSrcSet?void 0:l,as:t},e),Vt.set(n,l),u.querySelector(a)!==null||t==="style"&&u.querySelector(tn(n))||t==="script"&&u.querySelector(en(n))))){var i=u.createElement("link");ut(i,"link",l),t==="style"&&(i[bn]=!0,i.onload=i.onerror=function(){Ks(i)}),$l(i),u.head.appendChild(i)}}}function Lh(l,t){_e.m(l,t);var e=ia;if(e&&l){var u=t&&typeof t.as=="string"?t.as:"script",a='link[rel="modulepreload"][as="'+Rt(u)+'"][href="'+Rt(l)+'"]',n=a;switch(u){case"audioworklet":case"paintworklet":case"serviceworker":case"sharedworker":case"worker":case"script":n=fa(l)}if(!Vt.has(n)&&(l=w({rel:"modulepreload",href:l},t),Vt.set(n,l),e.querySelector(a)===null)){switch(u){case"audioworklet":case"paintworklet":case"serviceworker":case"sharedworker":case"worker":case"script":if(e.querySelector(en(n)))return}u=e.createElement("link"),ut(u,"link",l),$l(u),e.head.appendChild(u)}}}function Kh(l,t,e){_e.S(l,t,e);var u=ia;if(u&&l){var a=Ou(u).hoistableStyles,n=ca(l);t=t||"default";var i=a.get(n);if(!i){var c={loading:0,preload:null};if(i=u.querySelector(tn(n)))c.loading=5;else{l=w({rel:"stylesheet",href:l,"data-precedence":t},e),(e=Vt.get(n))&&ms(l,e);var f=i=u.createElement("link");$l(f),ut(f,"link",l),f._p=new Promise(function(m,S){f.onload=m,f.onerror=S}),f.addEventListener("load",function(){c.loading|=1}),f.addEventListener("error",function(){c.loading|=2}),c.loading|=4,pi(i,t,u)}i={type:"stylesheet",instance:i,count:1,state:c},a.set(n,i)}}}function Jh(l,t){_e.X(l,t);var e=ia;if(e&&l){var u=Ou(e).hoistableScripts,a=fa(l),n=u.get(a);n||(n=e.querySelector(en(a)),n||(l=w({src:l,async:!0},t),(t=Vt.get(a))&&hs(l,t),n=e.createElement("script"),$l(n),ut(n,"link",l),e.head.appendChild(n)),n={type:"script",instance:n,count:1,state:null},u.set(a,n))}}function wh(l,t){_e.M(l,t);var e=ia;if(e&&l){var u=Ou(e).hoistableScripts,a=fa(l),n=u.get(a);n||(n=e.querySelector(en(a)),n||(l=w({src:l,async:!0,type:"module"},t),(t=Vt.get(a))&&hs(l,t),n=e.createElement("script"),$l(n),ut(n,"link",l),e.head.appendChild(n)),n={type:"script",instance:n,count:1,state:null},u.set(a,n))}}function R0(l,t,e,u){var a=(a=kt.current)?ln(a):null;if(!a)throw Error(h(446));switch(l){case"meta":case"title":return null;case"style":return typeof e.precedence=="string"&&typeof e.href=="string"?(e=ca(e.href),t=Ou(a).hoistableStyles,u=t.get(e),u||(u={type:"style",instance:null,count:0,state:null},t.set(e,u)),u):{type:"void",instance:null,count:0,state:null};case"link":if(e.rel==="stylesheet"&&typeof e.href=="string"&&typeof e.precedence=="string"){l=ca(e.href);var n=Ou(a).hoistableStyles,i=n.get(l);if(i||(a=a.ownerDocument||a,i={type:"stylesheet",instance:null,count:0,state:{loading:0,preload:null}},n.set(l,i),(n=a.querySelector(tn(l)))?n._p||(i.instance=n,i.state.loading=5):(n=Vt.get(l),n||(n={rel:"preload",as:"style",href:e.href,crossOrigin:e.crossOrigin,integrity:e.integrity,media:e.media,hrefLang:e.hrefLang,referrerPolicy:e.referrerPolicy},Vt.set(l,n)),$h(a,l,n,i.state))),t&&u===null)throw Error(h(528,""));return i}if(t&&u!==null)throw Error(h(529,""));return null;case"script":return t=e.async,e=e.src,typeof e=="string"&&t&&typeof t!="function"&&typeof t!="symbol"?(e=fa(e),t=Ou(a).hoistableScripts,u=t.get(e),u||(u={type:"script",instance:null,count:0,state:null},t.set(e,u)),u):{type:"void",instance:null,count:0,state:null};default:throw Error(h(444,l))}}function ca(l){return'href="'+Rt(l)+'"'}function tn(l){return'link[rel="stylesheet"]['+l+"]"}function H0(l){return w({},l,{"data-precedence":l.precedence,precedence:null})}function $h(l,t,e,u){if(t=l.querySelector('link[rel="preload"][as="style"]['+t+"]")){if(t[bn]!==!0){u.loading=1;return}}else t=l.createElement("link"),t[bn]=!0,t.onload=t.onerror=Ks.bind(null,t),ut(t,"link",e),$l(t),l.head.appendChild(t);u.preload=t,t.addEventListener("load",function(){return u.loading|=1}),t.addEventListener("error",function(){return u.loading|=2})}function fa(l){return'[src="'+Rt(l)+'"]'}function en(l){return"script[async]"+l}function q0(l,t,e){if(t.count++,t.instance===null)switch(t.type){case"style":var u=l.querySelector('style[data-href~="'+Rt(e.href)+'"]');if(u)return t.instance=u,$l(u),u;var a=w({},e,{"data-href":e.href,"data-precedence":e.precedence,href:null,precedence:null});return u=(l.ownerDocument||l).createElement("style"),$l(u),ut(u,"style",a),pi(u,e.precedence,l),t.instance=u;case"stylesheet":a=ca(e.href);var n=l.querySelector(tn(a));if(n)return t.state.loading|=4,t.instance=n,$l(n),n;u=H0(e),(a=Vt.get(a))&&ms(u,a),n=(l.ownerDocument||l).createElement("link"),$l(n);var i=n;return i._p=new Promise(function(c,f){i.onload=c,i.onerror=f}),ut(n,"link",u),t.state.loading|=4,pi(n,e.precedence,l),t.instance=n;case"script":return n=fa(e.src),(a=l.querySelector(en(n)))?(t.instance=a,$l(a),a):(u=e,(a=Vt.get(n))&&(u=w({},e),hs(u,a)),l=l.ownerDocument||l,a=l.createElement("script"),$l(a),ut(a,"link",u),l.head.appendChild(a),t.instance=a);case"void":return null;default:throw Error(h(443,t.type))}else t.type==="stylesheet"&&(t.state.loading&4)===0&&(u=t.instance,t.state.loading|=4,pi(u,e.precedence,l));return t.instance}function pi(l,t,e){for(var u=e.querySelectorAll('link[rel="stylesheet"][data-precedence],style[data-precedence]'),a=u.length?u[u.length-1]:null,n=a,i=0;i title"):null)}function Fh(l,t,e){if(e===1||t.itemProp!=null)return!1;switch(l){case"meta":case"title":return!0;case"style":if(typeof t.precedence!="string"||typeof t.href!="string"||t.href==="")break;return!0;case"link":if(typeof t.rel!="string"||typeof t.href!="string"||t.href===""||t.onLoad||t.onError)break;return t.rel==="stylesheet"?(l=t.disabled,typeof t.precedence=="string"&&l==null):!0;case"script":if(t.async&&typeof t.async!="function"&&typeof t.async!="symbol"&&!t.onLoad&&!t.onError&&t.src&&typeof t.src=="string")return!0}return!1}function B0(l,t){return l==="img"&&t.src!=null&&t.src!==""&&t.onLoad==null&&t.loading!=="lazy"}function G0(l){return!(l.type==="stylesheet"&&(l.state.loading&3)===0)}function X0(l){return(l.width||100)*(l.height||100)*(typeof devicePixelRatio=="number"?devicePixelRatio:1)*.25}function Q0(l,t){typeof t.decode=="function"&&(l.imgCount++,t.complete||(l.imgBytes+=X0(t),l.suspenseyImages.push(t)),l=Ih.bind(l),t.decode().then(l,l))}function Wh(l,t,e,u){if(e.type==="stylesheet"&&(typeof u.media!="string"||matchMedia(u.media).matches!==!1)&&(e.state.loading&4)===0){if(e.instance===null){var a=ca(u.href),n=t.querySelector(tn(a));if(n){t=n._p,t!==null&&typeof t=="object"&&typeof t.then=="function"&&(l.count++,l=un.bind(l),t.then(l,l)),e.state.loading|=4,e.instance=n,$l(n);return}n=t.ownerDocument||t,u=H0(u),(a=Vt.get(a))&&ms(u,a),n=n.createElement("link"),$l(n);var i=n;i._p=new Promise(function(c,f){i.onload=c,i.onerror=f}),ut(n,"link",u),e.instance=n}l.stylesheets===null&&(l.stylesheets=new Map),l.stylesheets.set(e,t),(t=e.state.preload)&&(e.state.loading&3)===0&&(l.count++,e=un.bind(l),t.addEventListener("load",e),t.addEventListener("error",e))}}var Ui=0;function kh(l,t){return l.stylesheets&&l.count===0&&Ri(l,l.stylesheets),0Ui?50:800)+t);return l.unsuspend=e,function(){l.unsuspend=null,clearTimeout(u),clearTimeout(a)}}:null}function V0(l){if(l.count===0&&(l.imgCount===0||!l.waitingForImages)){if(l.stylesheets)Ri(l,l.stylesheets);else if(l.unsuspend){var t=l.unsuspend;l.unsuspend=null,t()}}}function un(){this.count--,V0(this)}function Ih(){this.imgCount--,V0(this)}var xi=null;function Ri(l,t){l.stylesheets=null,l.unsuspend!==null&&(l.count++,xi=new Map,t.forEach(Ph,l),xi=null,un.call(l))}function Ph(l,t){if(!(t.state.loading&4)){var e=xi.get(l);if(e)var u=e.get(null);else{e=new Map,xi.set(l,e);for(var a=l.querySelectorAll("link[data-precedence],style[data-precedence]"),n=0;n"u"||typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE!="function"))try{__REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE(T)}catch(X){console.error(X)}}return T(),Os.exports=hy(),Os.exports}var gy=yy();async function va(T,X){const B=await fetch("/api/"+T,X===void 0?{}:{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(X)});if(!B.ok){let h;try{const Y=await B.json();h=typeof Y.detail=="string"?Y.detail:JSON.stringify(Y.detail)}catch{h=await B.text().catch(()=>B.statusText)}throw new Error(h||"Le serveur ne répond pas.")}return B.json()}const Qi=(T,X,B=!1,h="")=>"/api/image?"+new URLSearchParams({copy:T,label:X,body:String(B),v:h}),on=(T,X,B="")=>"/api/document?"+new URLSearchParams({copy:T,kind:X,label:B}),Zt=(T,X="",B="")=>JSON.stringify([T,X,B]),da=T=>T.normalize("NFD").replace(new RegExp("\\p{M}","gu"),"").toLocaleLowerCase("fr").trim(),Ds=T=>`${T.name} · copie ${T.id}`;function Sy(){const[T,X]=ml.useState(null),[B,h]=ml.useState(""),[Y,k]=ml.useState(""),[ol,ql]=ml.useState(""),[cl,pl]=ml.useState(""),[x,b]=ml.useState(20),[j,Al]=ml.useState({}),[Vl,xl]=ml.useState(!1),[rl,nt]=ml.useState(!1),[Cl,Tt]=ml.useState(null),[Zl,it]=ml.useState(null),[Yl,w]=ml.useState(!1),[ll,ft]=ml.useState(!1),[Rl,Ll]=ml.useState(""),[Kl,xt]=ml.useState(!0),$=async()=>{try{X(await va("state")),h("")}catch(N){h(String(N))}};ml.useEffect(()=>{$()},[]),ml.useEffect(()=>{const N=O=>{Object.keys(j).length&&(O.preventDefault(),O.returnValue="")};return window.addEventListener("beforeunload",N),()=>window.removeEventListener("beforeunload",N)},[j]),ml.useEffect(()=>{if(!T?.job.running)return;const N=setInterval(async()=>{try{const O=await va("job");X(J=>J&&{...J,job:O}),O.running||(await $(),k(O.status==="success"?"Les sorties ont été régénérées.":"La régénération est incomplète. Consultez le journal."))}catch(O){h(String(O))}},1e3);return()=>clearInterval(N)},[T?.job.running]);const zl=(N,O,J,L)=>j[Zt(N,O,J)]?.value??L,A=(N,O,J,L)=>Al(G=>({...G,[Zt(N,O,J)]:{kind:N,copy:O,label:J,value:L}})),q=async N=>{if(!T)return;xl(!0),h("");let O=T;try{for(const J of N){const L=j[J];L&&(O=await va("change",{...L,revision:O.revision}),X(O),Al(G=>{const Tl={...G};return delete Tl[J],Tl}))}k("Modifications enregistrées.")}catch(J){h(String(J))}finally{xl(!1)}},V=async()=>{if(T){xl(!0),h("");try{const N=await va("regenerate",{revision:T.revision,apply_draft:rl,incremental:Kl});X({...T,job:N}),k("")}catch(N){h(String(N))}finally{xl(!1)}}},yl=async()=>{try{await va("stop",{}),w(!0)}catch(N){h(String(N))}};if(Yl)return o.jsxs("main",{className:"end",children:[o.jsx("h1",{children:"Session terminée"}),o.jsx("p",{children:"Vous pouvez reprendre le travail dans Copienator."})]});if(!T)return o.jsxs("main",{className:"end",children:[o.jsx("h1",{children:"Copienator"}),o.jsx("p",{children:B||"Chargement de la finalisation…"}),o.jsx("button",{onClick:$,children:"Réessayer"})]});const tl=Vl||T.job.running,wl=Object.keys(j).length,Et=zl("draft","","",T.draft),Wt=T.draft.trim()!==T.applied.trim(),r=ol?T.copies.find(N=>Number(N.id)===Number(ol)):void 0,_=[...T.copies].sort((N,O)=>N.name.localeCompare(O.name,"fr")||Number(N.id)-Number(O.id)),R=N=>{b(20);const O=T.copies.find(G=>Ds(G)===N),J=T.copies.filter(G=>da(G.name)===da(N)),L=O||(J.length===1?J[0]:void 0);ql(L?.id||""),Ll(L?"":N)},M=T.copies.filter(N=>(!ol||Number(N.id)===Number(ol))&&(!Rl||da(N.name).includes(da(Rl)))),I=M.flatMap(N=>N.answers.filter(O=>!cl||O.label===cl).map(O=>({c:N,a:O}))),al=new Map;T.copies.forEach(N=>al.set(N.name.toLowerCase(),(al.get(N.name.toLowerCase())||0)+1));const fl=T.copies.filter(N=>N.name.toLowerCase()==="unknown"||(al.get(N.name.toLowerCase())||0)>1),U=M.filter(N=>!ll||fl.includes(N)),Z=new Set(T.copies.map(N=>N.name.trim().toLocaleLowerCase("fr"))),st=T.expectedNames?.filter(N=>!Z.has(N.trim().toLocaleLowerCase("fr")));return o.jsxs(o.Fragment,{children:[o.jsxs("header",{inert:!!Cl||!!Zl,children:[o.jsxs("div",{className:"brand",children:["C",o.jsx("span",{children:"Copienator"})]}),o.jsxs("div",{className:"heading",children:[o.jsxs("div",{className:"eyebrow",children:["FINALISATION · ",T.mode]}),o.jsx("h1",{children:T.evaluation})]}),o.jsx("button",{className:"quiet",disabled:tl||!!wl,onClick:yl,children:"Fermer et reprendre dans le GUI"})]}),o.jsxs("main",{inert:!!Cl||!!Zl,children:[o.jsxs("section",{className:"toolbar",children:[o.jsxs("div",{children:[o.jsx("h2",{children:"Vérifier les copies"}),o.jsx("p",{children:"Retrouvez une copie, une question, ou leur intersection."})]}),o.jsxs("div",{className:"filters",children:[o.jsxs("label",{children:["Copie",o.jsx("input",{type:"text",inputMode:"numeric",list:"copies",placeholder:"Toutes les copies",value:ol,onChange:N=>{ql(N.target.value.replace(/\D/g,"")),Ll(""),b(20)}})]}),o.jsx("datalist",{id:"copies",children:T.copies.map(N=>o.jsx("option",{value:N.id,children:N.name},N.id))}),o.jsxs("label",{children:["Nom",o.jsx("input",{type:"text",list:"copy-names",placeholder:"Rechercher un nom…",autoComplete:"off",value:r?Ds(r):Rl,onChange:N=>R(N.target.value)})]}),o.jsx("datalist",{id:"copy-names",children:_.filter(N=>!Rl||da(N.name).includes(da(Rl))).map(N=>o.jsx("option",{value:Ds(N)},N.id))}),o.jsxs("label",{children:["Label",o.jsxs("select",{value:cl,onChange:N=>{pl(N.target.value),b(20)},children:[o.jsx("option",{value:"",children:"Tous les labels"}),T.labels.map(N=>o.jsx("option",{children:N},N))]})]}),o.jsx("button",{onClick:()=>{ql(""),Ll(""),pl(""),b(20)},children:"Réinitialiser"})]})]}),M.length===1&&(ol||Rl)&&M[0].finalScore!=null&&o.jsxs("div",{className:"final-score",role:"status",children:[o.jsxs("span",{children:["Copie ",M[0].id," · ",M[0].name]}),o.jsxs("strong",{children:["Score final exporté : ",M[0].finalScore.replace(".",",")]})]}),B&&o.jsxs("div",{role:"alert",className:"alert",children:[B,o.jsx("button",{onClick:$,children:"Recharger les données"}),o.jsx("small",{children:"Les saisies non enregistrées restent dans la page."})]}),Y&&o.jsx("p",{role:"status",className:"notice",children:Y}),o.jsxs("section",{className:"publish",children:[o.jsxs("div",{children:[o.jsx("strong",{children:T.job.running?"Régénération en cours…":wl?`${wl} modification(s) non enregistrée(s)`:T.dirty?"Enregistré · sorties à régénérer":"Modifications enregistrées"}),o.jsx("small",{children:"Les sorties comprennent les images, PDF et le dossier A Rendre configurés."})]}),o.jsx("button",{disabled:tl||!wl,onClick:()=>q(Object.keys(j)),children:"Tout enregistrer"}),wl>0&&o.jsx("button",{disabled:tl,onClick:()=>Al({}),children:"Annuler les saisies"}),o.jsxs("label",{className:"check",children:[o.jsx("input",{type:"checkbox",checked:rl,disabled:tl||T.mode==="Anot",onChange:N=>nt(N.target.checked)}),"Appliquer aussi le brouillon de transferts",Wt?" (différent du résultat actuel)":""]}),o.jsxs("label",{className:"check",children:[o.jsx("input",{type:"checkbox",checked:Kl,disabled:tl,onChange:N=>xt(N.target.checked)}),"Ignorer les copies inchangées"]}),o.jsx("button",{className:"primary",disabled:tl||!!wl,onClick:V,children:"Régénérer les sorties"})]}),o.jsxs("fieldset",{disabled:tl,children:[o.jsxs("details",{className:"panel",children:[o.jsxs("summary",{children:["Identités et remarques générales ",o.jsxs("span",{children:[fl.length," nom(s) à vérifier"]})]}),o.jsxs("div",{className:"identity-overview",children:[o.jsxs("strong",{children:["Noms manquants",st?` (${st.length})`:""]}),st===void 0?o.jsx("p",{children:"Liste des noms attendus introuvable (fichier names)."}):st.length?o.jsx("ul",{className:"missing-names",children:st.map(N=>o.jsx("li",{children:N},N))}):o.jsx("p",{children:"Tous les noms attendus sont attribués."}),o.jsxs("label",{className:"check",children:[o.jsx("input",{type:"checkbox",checked:ll,onChange:N=>ft(N.target.checked)}),"Afficher uniquement les copies « Nom à vérifier »"]})]}),o.jsx("p",{children:"Les remarques sont composées en LaTeX. Leur ordre est celui de la liste."}),U.length===0&&o.jsx("p",{children:"Aucune copie ne correspond aux filtres sélectionnés."}),U.map(N=>{const O=zl("general",N.id,"",N.general),J=L=>A("general",N.id,"",L);return o.jsxs("section",{className:"identity",children:[o.jsxs("div",{className:"identity-name",children:[o.jsxs("strong",{children:["Copie ",N.id]}),o.jsxs("label",{children:["Nom",o.jsx("input",{value:zl("name",N.id,"",N.name),onChange:L=>A("name",N.id,"",L.target.value)})]}),fl.includes(N)&&o.jsx("span",{className:"badge warning",children:"Nom à vérifier"}),o.jsx("a",{target:"_blank",rel:"noreferrer",href:on(N.id,"original"),children:"Voir l’originale ↗"}),o.jsx("button",{disabled:!j[Zt("name",N.id)],onClick:()=>q([Zt("name",N.id)]),children:"Enregistrer le nom"})]}),o.jsxs("div",{className:"general",children:[O.map((L,G)=>o.jsxs("div",{className:"remark-row",children:[o.jsx("textarea",{"aria-label":`Remarque générale ${G+1}, copie ${N.id}`,value:L,onChange:Tl=>J(O.map((se,kt)=>G===kt?Tl.target.value:se))}),o.jsx("button",{disabled:G===0,"aria-label":"Monter",onClick:()=>{const Tl=[...O];[Tl[G-1],Tl[G]]=[Tl[G],Tl[G-1]],J(Tl)},children:"↑"}),o.jsx("button",{disabled:G===O.length-1,"aria-label":"Descendre",onClick:()=>{const Tl=[...O];[Tl[G+1],Tl[G]]=[Tl[G],Tl[G+1]],J(Tl)},children:"↓"}),o.jsx("button",{onClick:()=>J(O.filter((Tl,se)=>se!==G)),children:"Supprimer"})]},G)),o.jsx("button",{onClick:()=>J([...O,""]),children:"+ Remarque générale"}),o.jsx("button",{disabled:!j[Zt("general",N.id)],onClick:()=>q([Zt("general",N.id)]),children:"Enregistrer les remarques"})]})]},N.id)})]}),T.mode!=="Anot"&&o.jsxs("details",{className:"panel",children:[o.jsxs("summary",{children:["Transferts et coupes ",o.jsx("span",{children:Wt?"Brouillon non appliqué":"Brouillon identique aux modifications appliquées"})]}),o.jsx("p",{children:"Les en-têtes et scores restent à leur label. Enregistrer un brouillon ne l’applique pas. Pour annuler un transfert, retirez sa ligne puis régénérez en cochant « Appliquer aussi le brouillon »."}),o.jsx("div",{className:"draft-list",children:Et.split(` +`).map((N,O,J)=>N.trim()&&!N.trim().startsWith("###")?o.jsxs("div",{className:"draft-row",children:[o.jsx("code",{children:N}),o.jsx("button",{"aria-label":`Monter l’instruction ${O}`,disabled:O===0||J[O-1].startsWith("###"),onClick:()=>{const L=[...J];[L[O-1],L[O]]=[L[O],L[O-1]],A("draft","","",L.join(` +`))},children:"↑"}),o.jsx("button",{"aria-label":`Descendre l’instruction ${O}`,disabled:O===J.length-1||!J[O+1].trim(),onClick:()=>{const L=[...J];[L[O+1],L[O]]=[L[O],L[O+1]],A("draft","","",L.join(` +`))},children:"↓"}),o.jsx("button",{onClick:()=>A("draft","","",J.filter((L,G)=>G!==O).join(` +`)),children:"Retirer"})]},O):null)}),o.jsxs("details",{children:[o.jsx("summary",{children:"Éditer les instructions en texte"}),o.jsx("textarea",{className:"instructions","aria-label":"Brouillon des transferts",value:Et,onChange:N=>A("draft","","",N.target.value)})]}),o.jsx("button",{disabled:!j[Zt("draft")],onClick:()=>q([Zt("draft")]),children:"Enregistrer le brouillon"}),o.jsxs("details",{children:[o.jsx("summary",{children:"Instructions actuellement appliquées"}),o.jsx("pre",{children:T.applied})]})]}),o.jsxs("div",{className:"results",children:[o.jsxs("h2",{children:[I.length," réponse",I.length!==1?"s":""]}),o.jsx("span",{children:!ol&&!cl?"Vue d’ensemble · sélectionnez une copie ou un label pour cibler la vérification":"Images annotées après lecture manuscrite"})]}),o.jsx("div",{className:"answer-grid",children:I.slice(0,x).map(({c:N,a:O})=>o.jsxs("article",{className:"answer",children:[o.jsxs("div",{className:"card-heading",children:[o.jsxs("div",{children:[o.jsxs("span",{className:"eyebrow",children:["COPIE ",N.id," · ",N.name]}),o.jsx("h3",{children:O.label})]}),o.jsx("span",{className:"badge",children:O.info.present?O.info.not_empty?O.info.touched?"Dans le PDF":"Hors PDF filtré":"Réponse vide":"Absente"})]}),o.jsx("div",{className:"image-space",children:O.image?o.jsxs("button",{className:"image-button","aria-label":`Agrandir copie ${N.id} ${O.label}`,onClick:()=>it({copy:N.id,label:O.label}),children:[o.jsx("img",{loading:"lazy",src:Qi(N.id,O.label,!1,T.revision),alt:`Réponse annotée — copie ${N.id}, ${O.label}`}),o.jsx("span",{children:"Agrandir ↗"})]}):o.jsx("p",{className:"empty",children:"Aucune image pour ce label."})}),o.jsxs("div",{className:"answer-form",children:[o.jsxs("label",{children:["Score",o.jsx("input",{inputMode:"decimal",value:zl("score",N.id,O.label,O.score),onChange:J=>A("score",N.id,O.label,J.target.value)})]}),o.jsxs("label",{children:["Remarque personnelle",o.jsx("textarea",{placeholder:"Ajouter une remarque (LaTeX accepté)",value:zl("remark",N.id,O.label,O.remark),onChange:J=>A("remark",N.id,O.label,J.target.value)})]})]}),o.jsxs("div",{className:"card-actions",children:[o.jsx("button",{disabled:!j[Zt("score",N.id,O.label)]&&!j[Zt("remark",N.id,O.label)],onClick:()=>q([Zt("score",N.id,O.label),Zt("remark",N.id,O.label)]),children:"Enregistrer"}),o.jsx("button",{disabled:!O.editableBody,onClick:()=>Tt({copy:N.id,label:O.label}),children:"Couper / transférer"}),o.jsx("a",{href:on(N.id,"context",O.label),target:"_blank",rel:"noreferrer",children:"Contexte ↗"}),o.jsx("a",{href:on(N.id,"question",O.label),target:"_blank",rel:"noreferrer",children:"Énoncé ↗"}),o.jsx("a",{href:on(N.id,"solution",O.label),target:"_blank",rel:"noreferrer",children:"Corrigé ↗"}),o.jsx("a",{href:on(N.id,"output"),target:"_blank",rel:"noreferrer",children:"PDF final ↗"})]})]},N.id+"|"+O.label))}),I.length===0&&o.jsx("p",{className:"empty",children:"Aucune réponse ne correspond à ces filtres."}),I.length>x&&o.jsx("button",{className:"load-more",onClick:()=>b(x+20),children:"Afficher les 20 suivantes"})]}),(T.job.log||T.job.running)&&o.jsxs("details",{className:"panel",open:T.job.status==="failed",children:[o.jsxs("summary",{children:["Journal de régénération · ",T.job.status==="failed"?"Échec / résultat incomplet":T.job.running?"En cours":"Terminée"]}),o.jsx("pre",{className:"log",children:T.job.log})]})]}),Cl&&o.jsx(Ty,{copy:Cl.copy,source:Cl.label,labels:T.labels,mode:T.mode,revision:T.revision,draft:Et,close:()=>Tt(null),accept:N=>{A("draft","","",N),Tt(null),k("Instruction ajoutée au brouillon. Enregistrez-le avant de l’appliquer.")}}),Zl&&o.jsx(by,{copy:Zl.copy,label:Zl.label,revision:T.revision,close:()=>it(null)})]})}function by({copy:T,label:X,revision:B,close:h}){const[Y,k]=ml.useState(100);return ml.useEffect(()=>{const ol=ql=>{ql.key==="Escape"&&h()};return window.addEventListener("keydown",ol),()=>window.removeEventListener("keydown",ol)},[]),o.jsx("div",{className:"overlay",children:o.jsxs("section",{className:"modal viewer",role:"dialog","aria-modal":"true","aria-label":`Copie ${T} ${X}`,children:[o.jsxs("div",{className:"modal-head",children:[o.jsxs("h2",{children:["Copie ",T," · ",X]}),o.jsxs("label",{children:["Zoom ",o.jsx("input",{type:"range",min:"40",max:"200",value:Y,onChange:ol=>k(Number(ol.target.value))}),Y,"%"]}),o.jsx("button",{autoFocus:!0,onClick:h,children:"Fermer"})]}),o.jsx("div",{className:"zoom-scroll",children:o.jsx("img",{src:Qi(T,X,!1,B),alt:`Copie ${T}, ${X}`,style:{width:Y+"%",maxWidth:"none"}})})]})})}function Ty({copy:T,source:X,labels:B,mode:h,revision:Y,draft:k,close:ol,accept:ql}){const[cl,pl]=ml.useState(B.find($=>$!==X)||""),[x,b]=ml.useState("cut"),[j,Al]=ml.useState(50),[Vl,xl]=ml.useState("1"),[rl,nt]=ml.useState(">"),[Cl,Tt]=ml.useState(!1),[Zl,it]=ml.useState(""),[Yl,w]=ml.useState(null),[ll,ft]=ml.useState(!1),Rl=x==="cut"?`c{${j}}${Vl}${rl}`:x,Ll=`Copie${T} ${X} ${Rl} ${Cl?"|":""}${cl}${Cl?"":"|"}`,Kl=k.trimEnd()+` +`+Ll+` +`;ml.useEffect(()=>w(null),[cl,x,j,Vl,rl,Cl,k]);const xt=async()=>{ft(!0),it("");try{w(await va("preview",{copy:T,source:X,target:cl,text:Kl}))}catch($){it(String($))}finally{ft(!1)}};return o.jsx("div",{className:"overlay",children:o.jsxs("section",{className:"modal",role:"dialog","aria-modal":"true","aria-label":"Couper ou transférer une réponse",children:[o.jsxs("div",{className:"modal-head",children:[o.jsxs("div",{children:[o.jsxs("span",{className:"eyebrow",children:["COPIE ",T," · ",h]}),o.jsx("h2",{children:"Couper ou transférer"})]}),o.jsx("button",{autoFocus:!0,onClick:ol,children:"Fermer"})]}),o.jsx("p",{children:"Seul le corps de la réponse est déplacé. Cliquez sur l’image source pour placer la coupe."}),Zl&&o.jsx("p",{role:"alert",className:"alert",children:Zl}),o.jsxs("div",{className:"cut-controls",children:[o.jsxs("label",{children:["Destination",o.jsx("select",{value:cl,onChange:$=>pl($.target.value),children:B.filter($=>$!==X).map($=>o.jsx("option",{children:$},$))})]}),o.jsxs("label",{children:["Opération",o.jsxs("select",{value:x,onChange:$=>b($.target.value),children:[o.jsx("option",{value:"cut",children:"Couper la source"}),o.jsx("option",{value:"x>",children:"Déplacer et ajouter"}),o.jsx("option",{value:"->",children:"Copier et ajouter"}),o.jsx("option",{value:"xx",children:"Déplacer et remplacer"}),o.jsx("option",{value:"-x",children:"Copier et remplacer"}),o.jsx("option",{value:"xs",children:"Vider la source"}),o.jsx("option",{value:"sx",children:"Vider la cible"}),o.jsx("option",{value:"ss",children:"Conserver les deux"})]})]}),x==="cut"&&o.jsxs(o.Fragment,{children:[o.jsxs("label",{children:["Coupe : ",j,"%",o.jsx("input",{type:"range",min:"1",max:"99",step:"0.1",value:j,onChange:$=>Al(Number($.target.value))})]}),o.jsxs("label",{children:["Conserver à la source",o.jsxs("select",{value:Vl,onChange:$=>xl($.target.value),children:[o.jsx("option",{value:"1",children:"La partie haute"}),o.jsx("option",{value:"2",children:"La partie basse"})]})]}),o.jsxs("label",{children:["À la destination",o.jsxs("select",{value:rl,onChange:$=>nt($.target.value),children:[o.jsx("option",{value:">",children:"Ajouter le fragment"}),o.jsx("option",{value:"x",children:"Remplacer le corps"})]})]})]}),o.jsxs("label",{className:"check",children:[o.jsx("input",{type:"checkbox",checked:Cl,onChange:$=>Tt($.target.checked)}),"Placer avant la cible"]})]}),o.jsxs("div",{className:"compare",children:[o.jsxs("div",{children:[o.jsxs("h3",{children:["Source · ",X]}),o.jsxs("div",{className:"cut-image",onClick:$=>{if(x==="cut"){const zl=$.currentTarget.getBoundingClientRect();Al(Math.min(99,Math.max(1,Math.round(($.clientY-zl.top)/zl.height*1e3)/10)))}},children:[o.jsx("img",{src:Qi(T,X,!0,Y),alt:"Corps source sans en-tête"}),x==="cut"&&o.jsx("div",{className:"cut-line",style:{top:j+"%"},children:o.jsxs("span",{children:[j,"%"]})})]})]}),o.jsxs("div",{children:[o.jsxs("h3",{children:["Cible · ",cl]}),o.jsx(Ey,{copy:T,label:cl,revision:Y},cl)]})]}),o.jsx("code",{className:"instruction-line",children:Ll}),o.jsxs("div",{className:"modal-actions",children:[o.jsx("button",{disabled:ll||!cl,onClick:xt,children:ll?"Calcul de l’aperçu…":"Aperçu du résultat"}),o.jsx("button",{className:"primary",disabled:!Yl||ll,onClick:()=>ql(Kl),children:"Ajouter au brouillon"})]}),Yl&&o.jsxs(o.Fragment,{children:[o.jsx("h3",{children:"Résultat proposé après toutes les instructions du brouillon"}),o.jsx("div",{className:"compare",children:[X,cl].map($=>o.jsxs("div",{children:[o.jsx("h4",{children:$}),Yl[$]?o.jsx("img",{src:Yl[$],alt:"Aperçu "+$}):o.jsx("p",{className:"empty",children:"Corps vide"})]},$))})]}),o.jsx("p",{className:"muted",children:"Une instruction par source ; une cible ne peut pas être source. Modifiez ou retirez une instruction existante dans le panneau « Transferts et coupes »."})]})})}function Ey({copy:T,label:X,revision:B}){const[h,Y]=ml.useState(!1);return h?o.jsx("p",{className:"empty",children:"Pas de corps existant. Le transfert peut remplir cette cible."}):o.jsx("img",{src:Qi(T,X,!0,B),alt:"Corps cible sans en-tête",onError:()=>Y(!0)})}gy.createRoot(document.getElementById("root")).render(o.jsx(Sy,{})); diff --git a/copienator/web_static/index.html b/copienator/web_static/index.html index 12444b3..781902e 100644 --- a/copienator/web_static/index.html +++ b/copienator/web_static/index.html @@ -1,3 +1,3 @@ -Copienator · Finalisation - +Copienator · Finalisation +
diff --git a/copienator_gui/app.py b/copienator_gui/app.py index badfc2f..a5b5342 100644 --- a/copienator_gui/app.py +++ b/copienator_gui/app.py @@ -365,7 +365,7 @@ class CopienatorApp(tk.Tk): ) self.finalisation_web_button.grid(row=0, column=6, padx=(6, 0)) attach_tooltip(self.finalisation_web_button, - "Disponible après une première lecture des annotations manuscrites (Bnot ou BGnot).") + "Disponible après génération Anot ou lecture des annotations manuscrites Bnot/BGnot.") ttk.Button(top, text="Diagnostic…", command=self._show_diagnostics).grid(row=0, column=7, padx=(6, 0)) ttk.Label(top, text="Clé Gemini").grid(row=1, column=0, sticky="w", padx=(0, 8), pady=(7, 0)) @@ -552,7 +552,7 @@ class CopienatorApp(tk.Tk): return any( directory.is_dir() and directory.name[5:].isdigit() and (directory / "score.json").is_file() and (directory / "info.json").is_file() - for mode in ("Bnot", "BGnot") + for mode in ("Bnot", "BGnot", "Anot") for directory in (evaluation / mode).glob("Copie*") ) @@ -564,7 +564,7 @@ class CopienatorApp(tk.Tk): messagebox.showerror("Évaluation absente", "Chargez d’abord une évaluation.") return if not self._has_finalisation_outputs(): - messagebox.showinfo("Finalisation web", "Exécutez d’abord « Lire les annotations manuscrites ».") + messagebox.showinfo("Finalisation web", "Générez d’abord les annotations Anot, ou lisez les annotations manuscrites Bnot/BGnot.") return self._save_current_form() dialog = tk.Toplevel(self) @@ -573,10 +573,17 @@ class CopienatorApp(tk.Tk): dialog.resizable(False, False) frame = ttk.Frame(dialog, padding=24) frame.pack(fill="both", expand=True) - text = tk.StringVar(value="Choisissez le mode utilisé pour lire les annotations manuscrites.") + text = tk.StringVar(value="Choisissez le dossier des copies générées ou relues.") ttk.Label(frame, textvariable=text, wraplength=500).pack(pady=(0, 12)) - mode = tk.StringVar(value=annotation_mode_for_reader(self.state_store.step("read_annotations"))) - choice = ttk.Combobox(frame, textvariable=mode, values=("BGnot", "Bnot"), state="readonly") + preferred_mode = annotation_mode_for_reader(self.state_store.step("read_annotations")) + ready_modes = [mode for mode in ANNOTATION_DIRECTORIES + if any((d / "score.json").is_file() and (d / "info.json").is_file() + for d in (self.evaluation / mode).glob("Copie*"))] + annotation = self.state_store.step("annotation") + if annotation.get("last_run_variant", annotation.get("variant")) == "simple" and "Anot" in ready_modes: + preferred_mode = "Anot" + mode = tk.StringVar(value=preferred_mode if preferred_mode in ready_modes else ready_modes[0]) + choice = ttk.Combobox(frame, textvariable=mode, values=ready_modes, state="readonly") choice.pack(fill="x", pady=8) url = tk.StringVar() link = ttk.Entry(frame, textvariable=url, state="readonly", width=65) @@ -597,15 +604,21 @@ class CopienatorApp(tk.Tk): reader = self.state_store.step("read_annotations") values = dict(reader.get("values", {})) values["update_score"] = True - if data["dirty"] or session.service.job["status"] != "idle": - self.state_store.invalidate_after(self._progression_ids("read_annotations"), "read_annotations") - self.state_store.update_step("read_annotations", variant="standard" if session.service.mode == "Bnot" else "grouped") - if data["dirty"] or session.service.job["status"] == "failed": - self.state_store.update_step("read_annotations", status="stale", values=values) - self.state_store.update_step("giving_names", status="stale") - elif session.service.job["status"] == "success": - self.state_store.update_step("read_annotations", status="success", values=values) - self.state_store.update_step("giving_names", status="detected") + if session.service.mode == "Anot": + if data["dirty"] or session.service.job["status"] != "idle": + self.state_store.invalidate_after(self._progression_ids("annotation"), "annotation") + self.state_store.update_step("annotation", variant="simple", status="stale" if data["dirty"] else "success") + self.state_store.update_step("giving_names", status="stale" if data["dirty"] else "detected") + else: + if data["dirty"] or session.service.job["status"] != "idle": + self.state_store.invalidate_after(self._progression_ids("read_annotations"), "read_annotations") + self.state_store.update_step("read_annotations", variant="standard" if session.service.mode == "Bnot" else "grouped") + if data["dirty"] or session.service.job["status"] == "failed": + self.state_store.update_step("read_annotations", status="stale", values=values) + self.state_store.update_step("giving_names", status="stale") + elif session.service.job["status"] == "success": + self.state_store.update_step("read_annotations", status="success", values=values) + self.state_store.update_step("giving_names", status="detected") self._populate_tree() self._render_step() self._update_controls() diff --git a/docs/finalisation_web.md b/docs/finalisation_web.md index 9d738b8..7a5ae7e 100644 --- a/docs/finalisation_web.md +++ b/docs/finalisation_web.md @@ -6,8 +6,9 @@ Elle fonctionne sur cet ordinateur, sans hébergement ni nouvel appel à Gemini. ## Ouvrir -Après **Lire les annotations manuscrites**, cliquez sur **Finalisation web…** -en haut du GUI, choisissez **Bnot** ou **BGnot**, puis **Ouvrir**. Le GUI reste +Après génération des annotations **Anot**, ou après **Lire les annotations +manuscrites** pour **Bnot/BGnot**, cliquez sur **Finalisation web…** en haut du GUI, +choisissez le dossier disponible, puis **Ouvrir**. Le GUI reste verrouillé par une fenêtre modale tant que le serveur fonctionne. Le bouton **Arrêter le serveur et reprendre** ferme la session et recharge les éditeurs. Fermer seulement l’onglet du navigateur ne ferme pas le serveur. @@ -26,7 +27,10 @@ restant sur disque n’empêche pas la prochaine ouverture. ## Vérifier et modifier -- **Copie** seule : toutes les réponses de cette copie. +- **Copie** seule : toutes les réponses de cette copie. Le champ **Nom** propose + une complétion ; vous pouvez chercher une partie du nom, sans tenir compte des + accents ou des majuscules. Choisir un nom renseigne l’identifiant de copie, et + inversement. Les suggestions indiquent l’identifiant pour distinguer les doublons. - **Label** seul : toutes les copies pour ce label. - Les deux : leur intersection. Sans filtre, la page présente toutes les réponses par lots de vingt, avec chargement différé des images. @@ -45,6 +49,19 @@ les modifications avant de régénérer. Si une autre page a changé les fichier une sauvegarde périmée est refusée ; **Recharger les données** actualise les valeurs enregistrées en conservant les saisies locales à réexaminer. +## Score final exporté + +Après **Ajouter le score final**, sélectionner une copie par identifiant ou nom +fait apparaître son **Score final exporté** au-dessus des réponses. Cette note +est celle du dernier export, arrondie comme sur le JPEG ; modifier les scores par +question ne la recalcule pas. Le passage enregistre désormais les notes dans +`.copienator/final_scores.json`, par identifiant, afin de conserver leur association +après un changement de nom. + +Pour les anciens exports, la note peut être récupérée du fichier ODS uniquement +si ce fichier n’est pas plus récent que les documents exportés. Sinon, relancez +**Ajouter le score final** pour enregistrer la note de façon explicite. + ## Brouillon, application et régénération **Ajouter au brouillon** ne modifie pas les images. **Enregistrer le brouillon** @@ -106,8 +123,11 @@ repassez par **Lire les annotations manuscrites** dans le workflow existant avan de revenir au navigateur. `regenerate-reviewed` réutilise l’interprétation sauvegardée ; il ne recherche pas de nouvelles annotations. -Anot reste géré par le workflow existant. La finalisation web concerne Bnot et -BGnot, les deux modes qui disposent de corps de réponses éditables. +Le mode **Anot** donne accès aux noms, scores, remarques et à leur régénération +dès la génération initiale, sans lecture manuscrite intermédiaire. Les coupes et +transferts restent réservés à **Bnot/BGnot**, qui disposent des limites exactes +des corps de réponses relus. Les anciens résultats Anot peuvent créer leur état +de rendu lors de la première régénération, sans remplacer leurs scores enregistrés. ## Développement diff --git a/tests/test_add_final_score.py b/tests/test_add_final_score.py index 2e8710f..8cf4744 100644 --- a/tests/test_add_final_score.py +++ b/tests/test_add_final_score.py @@ -103,6 +103,8 @@ class AddFinalScoreTests(unittest.TestCase): self.assertFalse((student / "answers" / "001 - Ex 1.jpg").exists()) self.assertEqual((output / "histogramme.pdf").read_bytes(), b"histogram") self.assertEqual(read_json(output / "stat.json"), {"Ex 1": "4.0"}) + self.assertEqual(read_json(root / '.copienator/final_scores.json'), + {'version': 1, 'copies': {'1': {'name': 'Student', 'score': '12.3'}}}) def test_omits_answers_directory_when_it_was_not_generated(self): with tempfile.TemporaryDirectory() as temporary: diff --git a/tests/test_final_scores.py b/tests/test_final_scores.py new file mode 100644 index 0000000..15e084d --- /dev/null +++ b/tests/test_final_scores.py @@ -0,0 +1,42 @@ +import os +from pathlib import Path +import tempfile +import unittest +from unittest.mock import patch +import pandas as pd +from copienator import atomic_write_json +from copienator.final_scores import exported_scores + + +class ExportedFinalScoresTests(unittest.TestCase): + def test_legacy_export_uses_only_sheet_predating_export(self): + with tempfile.TemporaryDirectory() as temporary: + root = Path(temporary)/'Interro' + (root/'A Rendre/Alice (01)').mkdir(parents=True) + ods = root/'marks.ods' + ods.write_bytes(b'sheet') + image = root/'output/Interro/Alice/Alice.jpg' + image.parent.mkdir(parents=True) + image.write_bytes(b'export') + os.utime(ods, ns=(1000000,1000000)) + os.utime(image, ns=(2000000,2000000)) + with patch('copienator.final_scores.configuration.FINAL_SCORE_OUTPUT_DIR',root/'output'), \ + patch('copienator.final_scores.configuration.FINAL_SCORE_ODS_PATH',ods), \ + patch('pandas.read_excel',return_value=pd.DataFrame({0:['Alice'],1:[12.39]})) as read: + self.assertEqual(exported_scores(root,root), {'1':'12.3'}) + os.utime(ods, ns=(3000000,3000000)) + read.reset_mock() + self.assertEqual(exported_scores(root,root), {}) + read.assert_not_called() + + def test_no_final_mark_before_export_and_saved_marks_do_not_read_live_sheet(self): + with tempfile.TemporaryDirectory() as temporary: + root=Path(temporary) + with patch('copienator.final_scores.configuration.FINAL_SCORE_OUTPUT_DIR',root/'output'), \ + patch('copienator.final_scores.configuration.FINAL_SCORE_ODS_PATH',root/'missing.ods'), \ + patch('pandas.read_excel') as read: + self.assertEqual(exported_scores(root,root), {}) + atomic_write_json(root/'.copienator/final_scores.json', + {'version':1,'copies':{'01':{'score':'0.0','name':'Alice'}}}) + self.assertEqual(exported_scores(root,root), {'1':'0.0'}) + read.assert_not_called() diff --git a/tests/test_finalisation_web.py b/tests/test_finalisation_web.py index e3040ee..37dc159 100644 --- a/tests/test_finalisation_web.py +++ b/tests/test_finalisation_web.py @@ -212,6 +212,14 @@ class WebTests(unittest.TestCase): self.service._regenerate(False) self.assertEqual(calls, ['regenerate-reviewed', 'giving-names']) + def test_exported_final_score_is_bound_to_copy_id_after_rename(self): + self.assertIsNone(self.client.get('/api/state').json()['copies'][0]['finalScore']) + atomic_write_json(self.root/'.copienator/final_scores.json', + {'version':1,'copies':{'1':{'name':'Old name','score':'12.3'}}}) + self.assertEqual(self.client.get('/api/state').json()['copies'][0]['finalScore'], '12.3') + self.save('name', 'New name') + self.assertEqual(self.client.get('/api/state').json()['copies'][0]['finalScore'], '12.3') + def test_os_lock_blocks_cli_and_releases(self): with EvaluationLock(self.root): with self.assertRaises(CliError): @@ -277,7 +285,7 @@ class SnapshotTests(unittest.TestCase): from copienator.commands import regenerate_reviewed from copienator.commands import annotating from copienator.custom_remarks import set_remark - for mode in ('Bnot', 'BGnot'): + for mode in ('Bnot', 'BGnot', 'Anot'): with self.subTest(mode=mode), tempfile.TemporaryDirectory() as temporary: root = Path(temporary) seed(root, mode) @@ -331,6 +339,27 @@ class WebGuiTests(unittest.TestCase): app.state_store.evaluation = None self.assertEqual(state(), 'disabled') + def test_anot_generation_enables_button_and_selects_anot(self): + from copienator_gui.app import CopienatorApp + with tempfile.TemporaryDirectory() as temporary: + root = Path(temporary) + seed(root, 'Anot') + app = CopienatorApp(Path.cwd(), False, root) + self.addCleanup(app.destroy) + app._update_controls() + self.assertEqual(str(app.finalisation_web_button.cget('state')), 'normal') + app._open_finalisation_web() + dialog = app.grab_current() + def descendants(widget): + for child in widget.winfo_children(): + yield child + yield from descendants(child) + combo = next(w for w in descendants(dialog) if w.winfo_class() == 'TCombobox') + self.assertEqual(combo.get(), 'Anot') + self.assertEqual(tuple(combo.cget('values')), ('Anot',)) + dialog.grab_release() + dialog.destroy() + def test_modal_lock_and_return_to_existing_workflow(self): from copienator_gui.app import CopienatorApp from copienator.finalisation_server import WebSession @@ -457,3 +486,66 @@ class IncrementalReviewedTests(unittest.TestCase): (root/'A Rendre/Bob (02)/info.json').unlink() run(1) self.assertTrue((root/'A Rendre/Bob (02)/info.json').is_file()) + + +class CrossProcessCacheTests(unittest.TestCase): + def test_reviewed_cache_survives_worker_restart_and_selects_only_two_score_edits(self): + from copienator.review_snapshot import stage + import shutil + with tempfile.TemporaryDirectory() as temporary: + root = Path(temporary) + seed(root, 'BGnot') + output = root/'BGnot/Copie01' + data = {'Ex 1': {'pdf_path':root/'Copies/Copie01/Ex 1.pdf', + 'result':{'score':3,'feedback':[]},'coordinates':[0,0]}} + with staged_files(output) as staging: + stage(output, staging, data, {}, engine='grouped') + for cid in ('02','03','04'): + shutil.copytree(output,root/'BGnot'/f'Copie{cid}') + script = ''' +import json, sys +from pathlib import Path +from copienator import EvaluationWorkspace, configuration +from copienator.reviewed_cache import ReviewedReadCache +from string import Template +configuration.LATEX_ANOT_BEFORE = Template(sys.argv[3]) +root=Path(sys.argv[1]) +directories=sorted((root/'BGnot').glob('Copie*')) +cache=ReviewedReadCache(EvaluationWorkspace(root),'BGnot',directories) +if sys.argv[2]=='remember': + cache.remember([d.name[5:] for d in directories]) +print(json.dumps([d.name for d in directories if not cache.unchanged(d.name[5:])])) +''' + def run(action='check', template='Stable ${width_in} template'): + return __import__('json').loads(subprocess.check_output( + [sys.executable,'-c',script,str(root),action,template],text=True)) + self.assertEqual(run('remember'), []) + self.assertEqual(run(), []) + set_score(root/'BGnot/Copie01/score.json','Ex 1','1') + set_score(root/'BGnot/Copie03/score.json','Ex 1','2') + self.assertEqual(run(), ['Copie01','Copie03']) + self.assertEqual(run('remember'), []) + self.assertEqual(run(), []) + self.assertEqual(run(template='Changed template'), ['Copie01','Copie02','Copie03','Copie04']) + + def test_legacy_reader_cache_template_is_stable_across_workers(self): + with tempfile.TemporaryDirectory() as temporary: + root = Path(temporary) + seed(root) + atomic_write_json(root/'Bnot/Copie01/review_snapshot.json', {}) + script = ''' +import json, sys +from pathlib import Path +from string import Template +from copienator import EvaluationWorkspace, configuration +from copienator.annotation_read_cache import AnnotationReadCache +configuration.LATEX_ANOT_BEFORE=Template('Stable ${width_in} template') +root=Path(sys.argv[1]) +data={'01':{'Ex 1':{'pdf_path':root/'Copies/Copie01/Ex 1.pdf'}}} +cache=AnnotationReadCache(EvaluationWorkspace(root),'Bnot',data) +if sys.argv[2]=='remember': cache.remember(['01']) +print(json.dumps(cache.unchanged('01'))) +''' + for action in ('remember','check'): + result=subprocess.check_output([sys.executable,'-c',script,str(root),action],text=True) + self.assertEqual(result.strip(),'true') diff --git a/web/src/main.tsx b/web/src/main.tsx index 7be9f75..6094051 100644 --- a/web/src/main.tsx +++ b/web/src/main.tsx @@ -3,7 +3,7 @@ import {createRoot} from 'react-dom/client'; import './style.css'; type Answer = {label:string;score:string;remark:string;image:boolean;editableBody:boolean;info:{present?:boolean;not_empty?:boolean;touched?:boolean}}; -type Copy = {id:string;name:string;general:string[];answers:Answer[]}; +type Copy = {id:string;name:string;finalScore?:string|null;general:string[];answers:Answer[]}; type Job = {running:boolean;status:string;log:string}; type State = {evaluation:string;mode:string;labels:string[];copies:Copy[];expectedNames:string[]|null;draft:string;applied:string;revision:string;dirty:boolean;job:Job}; type Edit = {kind:string;copy:string;label:string;value:string|string[]}; @@ -15,6 +15,8 @@ async function api(path:string, data?:unknown) { const imageUrl=(copy:string,label:string,body=false,revision='')=>'/api/image?'+new URLSearchParams({copy,label,body:String(body),v:revision}); const documentUrl=(copy:string,kind:string,label='')=>'/api/document?'+new URLSearchParams({copy,kind,label}); const keyOf=(kind:string,copy='',label='')=>JSON.stringify([kind,copy,label]); +const searchName=(text:string)=>text.normalize('NFD').replace(/\p{M}/gu,'').toLocaleLowerCase('fr').trim(); +const copyName=(copy:Copy)=>`${copy.name} · copie ${copy.id}`; function App(){ const [state,setState]=useState(null),[error,setError]=useState(''),[notice,setNotice]=useState(''); @@ -23,6 +25,7 @@ function App(){ const [cut,setCut]=useState<{copy:string;label:string}|null>(null),[zoom,setZoom]=useState<{copy:string;label:string}|null>(null); const [stopped,setStopped]=useState(false); const [onlyNameIssues,setOnlyNameIssues]=useState(false); + const [nameQuery,setNameQuery]=useState(''); const [incremental,setIncremental]=useState(true); const refresh=async()=>{try{setState(await api('state'));setError('')}catch(e){setError(String(e))}}; useEffect(()=>{void refresh()},[]); @@ -39,7 +42,18 @@ function App(){ const pending=Object.keys(edits).length; const draft=value('draft','','',state.draft) as string; const draftDiff=state.draft.trim()!==state.applied.trim(); - const matches=state.copies.filter(c=>!copyFilter||Number(c.id)===Number(copyFilter)); + const selectedCopy=copyFilter?state.copies.find(c=>Number(c.id)===Number(copyFilter)):undefined; + const nameChoices=[...state.copies].sort((a,b)=>a.name.localeCompare(b.name,'fr')||Number(a.id)-Number(b.id)); + const selectName=(text:string)=>{ + setLimit(20); + const selection=state.copies.find(c=>copyName(c)===text); + const exact=state.copies.filter(c=>searchName(c.name)===searchName(text)); + const copy=selection||(exact.length===1?exact[0]:undefined); + setCopyFilter(copy?.id||''); + setNameQuery(copy?'':text); + }; + const matches=state.copies.filter(c=>(!copyFilter||Number(c.id)===Number(copyFilter)) + &&(!nameQuery||searchName(c.name).includes(searchName(nameQuery)))); const cards=matches.flatMap(c=>c.answers.filter(a=>!labelFilter||a.label===labelFilter).map(a=>({c,a}))); const names=new Map();state.copies.forEach(c=>names.set(c.name.toLowerCase(),(names.get(c.name.toLowerCase())||0)+1)); const issues=state.copies.filter(c=>c.name.toLowerCase()==='unknown'||(names.get(c.name.toLowerCase())||0)>1); @@ -49,13 +63,14 @@ function App(){ return <>
CCopienator
FINALISATION · {state.mode}

{state.evaluation}

-

Vérifier les copies

Retrouvez une copie, une question, ou leur intersection.

{state.copies.map(c=>)}
+

Vérifier les copies

Retrouvez une copie, une question, ou leur intersection.

{state.copies.map(c=>)}{nameChoices.filter(c=>!nameQuery||searchName(c.name).includes(searchName(nameQuery))).map(c=>
+ {matches.length===1&&(copyFilter||nameQuery)&&matches[0].finalScore!=null&&
Copie {matches[0].id} · {matches[0].name}Score final exporté : {matches[0].finalScore.replace('.', ',')}
} {error&&
{error}Les saisies non enregistrées restent dans la page.
} {notice&&

{notice}

} -
{state.job.running?'Régénération en cours…':pending?`${pending} modification(s) non enregistrée(s)`:state.dirty?'Enregistré · sorties à régénérer':'Modifications enregistrées'}Les sorties comprennent les images, PDF et le dossier A Rendre configurés.
{pending>0&&}
+
{state.job.running?'Régénération en cours…':pending?`${pending} modification(s) non enregistrée(s)`:state.dirty?'Enregistré · sorties à régénérer':'Modifications enregistrées'}Les sorties comprennent les images, PDF et le dossier A Rendre configurés.
{pending>0&&}
Identités et remarques générales {issues.length} nom(s) à vérifier
Noms manquants{missingNames?` (${missingNames.length})`:''}{missingNames===undefined?

Liste des noms attendus introuvable (fichier names).

:missingNames.length?
    {missingNames.map(name=>
  • {name}
  • )}
:

Tous les noms attendus sont attribués.

}

Les remarques sont composées en LaTeX. Leur ordre est celui de la liste.

{identityMatches.length===0&&

Aucune copie ne correspond aux filtres sélectionnés.

}{identityMatches.map(c=>{const general=value('general',c.id,'',c.general) as string[];const changeGeneral=(next:string[])=>edit('general',c.id,'',next);return
Copie {c.id}{issues.includes(c)&&Nom à vérifier}Voir l’originale ↗
{general.map((text,i)=>