Compare commits
8 Commits
7e7b50cff7
...
master
| Author | SHA1 | Date | |
|---|---|---|---|
| 275dc1c380 | |||
|
|
483c36ddfe | ||
| b2e9a0d3c9 | |||
| ab3f103ec5 | |||
| 20bf839d98 | |||
|
|
ffd5e6ff7f | ||
|
|
7f31800b45 | ||
|
|
ee7351bee3 |
54807
1_NAHRAT_NA_SERVER.txt
54807
1_NAHRAT_NA_SERVER.txt
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@@ -7,7 +7,7 @@ import os
|
||||
|
||||
HOSTNAME = platform.node().upper()
|
||||
|
||||
if HOSTNAME in {"SESTRA", "POHODA"}:
|
||||
if HOSTNAME in {"SESTRA", "POHODA","LENOVO"}:
|
||||
DROPBOX_DRIVE = Path(r"Z:\\")
|
||||
elif HOSTNAME == "Z230":
|
||||
DROPBOX_DRIVE = Path(r"U:\\")
|
||||
|
||||
@@ -4,7 +4,7 @@ from pathlib import Path
|
||||
|
||||
# ================= DB CONFIG =================
|
||||
db_config = {
|
||||
'host': '192.168.1.76',
|
||||
'host': '127.0.0.1',
|
||||
'port': 3307,
|
||||
'user': 'root',
|
||||
'password': 'Vlado9674+',
|
||||
|
||||
65
Davky/30 Avety.py
Normal file
65
Davky/30 Avety.py
Normal file
@@ -0,0 +1,65 @@
|
||||
import mysql.connector
|
||||
|
||||
|
||||
def parse_a_vety_bulk():
|
||||
db_config = {
|
||||
'host': '192.168.1.76',
|
||||
'port': 3307,
|
||||
'user': 'root',
|
||||
'password': 'Vlado9674+',
|
||||
'database': 'ordinace'
|
||||
}
|
||||
|
||||
conn = mysql.connector.connect(**db_config)
|
||||
cursor = conn.cursor(dictionary=True)
|
||||
|
||||
# 1. Načtení všech 'A' vět z archivu
|
||||
print("Načítám věty typu A z databáze...")
|
||||
cursor.execute("SELECT id_davky, obsah_radku FROM vety WHERE typ_vety = 'A'")
|
||||
raw_records = cursor.fetchall()
|
||||
|
||||
if not raw_records:
|
||||
print("Nenalezeny žádné věty typu A ke zpracování.")
|
||||
return
|
||||
|
||||
# 2. Příprava seznamu dat pro hromadný insert
|
||||
data_to_insert = []
|
||||
|
||||
for row in raw_records:
|
||||
s = row['obsah_radku']
|
||||
|
||||
# Extrakce polí podle tvé specifikace (pozice + délka)
|
||||
# Slicing v Pythonu: s[start : start + delka]
|
||||
tuple_data = (
|
||||
row['id_davky'], # id_davky
|
||||
s[13:16].strip(), # HCPO (Pojišťovna)
|
||||
s[17:25].strip(), # HICO (IČP)
|
||||
s[31:34].strip(), # HODB (Odbornost)
|
||||
s[1:8].strip(), # HCID (Číslo dokladu)
|
||||
s[34:44].strip(), # HROD (Číslo pojištěnce / RČ)
|
||||
s[44:49].strip() # HZDG (Diagnóza)
|
||||
)
|
||||
data_to_insert.append(tuple_data)
|
||||
|
||||
# 3. Hromadné vložení (Insert Many)
|
||||
sql = """
|
||||
INSERT INTO doklady
|
||||
(id_davky, pojistovna, icp, odbornost, cislo_poradove, rodne_cislo, diagnoza)
|
||||
VALUES (%s, %s, %s, %s, %s, %s, %s)
|
||||
"""
|
||||
|
||||
try:
|
||||
print(f"Vkládám {len(data_to_insert)} záznamů do tabulky doklady...")
|
||||
cursor.executemany(sql, data_to_insert)
|
||||
conn.commit()
|
||||
print("Hromadný import dokladů byl úspěšně dokončen.")
|
||||
except mysql.connector.Error as err:
|
||||
print(f"Chyba při hromadném vkládání: {err}")
|
||||
conn.rollback()
|
||||
finally:
|
||||
cursor.close()
|
||||
conn.close()
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
parse_a_vety_bulk()
|
||||
113
Davky/40 Vvety.py
Normal file
113
Davky/40 Vvety.py
Normal file
@@ -0,0 +1,113 @@
|
||||
import mysql.connector
|
||||
import sys
|
||||
|
||||
# --- KONFIGURACE ---
|
||||
db_config = {
|
||||
'host': '192.168.1.76',
|
||||
'port': 3307,
|
||||
'user': 'root',
|
||||
'password': 'Vlado9674+',
|
||||
'database': 'ordinace'
|
||||
}
|
||||
|
||||
|
||||
def transform_archive_to_results():
|
||||
# Vynucený výpis hned na začátku
|
||||
print(">>> Startuji proces transformace...", flush=True)
|
||||
|
||||
try:
|
||||
print("Navazuji spojení s MySQL serverem (port 3307)...", flush=True)
|
||||
conn = mysql.connector.connect(**db_config)
|
||||
cursor = conn.cursor(dictionary=True)
|
||||
print("Spojení navázáno.", flush=True)
|
||||
|
||||
# 1. KROK: VYMAZÁNÍ CÍLOVÝCH TABULEK
|
||||
print("Mažu stará data z tabulek: vykony, leciva, doklady...", flush=True)
|
||||
# Mažeme v pořadí od dětí k rodičům kvůli integritě
|
||||
cursor.execute("DELETE FROM vykony")
|
||||
cursor.execute("DELETE FROM leciva")
|
||||
cursor.execute("DELETE FROM doklady")
|
||||
conn.commit()
|
||||
print("Tabulky jsou prázdné.", flush=True)
|
||||
|
||||
# 2. KROK: PARSOVÁNÍ DOKLADŮ (Věty A)
|
||||
print("Načítám věty typu A z archivu (vety)...", flush=True)
|
||||
cursor.execute("SELECT id_vety, id_davky, obsah_radku FROM vety WHERE typ_vety = 'A'")
|
||||
a_vety_raw = cursor.fetchall()
|
||||
|
||||
mapping_veta_to_doklad = {}
|
||||
insert_a_sql = """
|
||||
INSERT INTO doklady (id_davky, pojistovna, icp, odbornost, cislo_poradove, rodne_cislo, diagnoza)
|
||||
VALUES (%s, %s, %s, %s, %s, %s, %s)
|
||||
"""
|
||||
|
||||
for row in a_vety_raw:
|
||||
s = row['obsah_radku']
|
||||
# Extrakce dat dle specifikace
|
||||
vals = (
|
||||
row['id_davky'],
|
||||
s[13:16].strip(), # HCPO - Pojišťovna
|
||||
s[17:25].strip(), # HICO - IČP
|
||||
s[31:34].strip(), # HODB - Odbornost
|
||||
s[1:8].strip(), # HCID - Číslo dokladu
|
||||
s[34:44].strip(), # HROD - Číslo pojištěnce (RČ)
|
||||
s[44:49].strip() # HZDG - Diagnóza
|
||||
)
|
||||
cursor.execute(insert_a_sql, vals)
|
||||
mapping_veta_to_doklad[row['id_vety']] = cursor.lastrowid
|
||||
|
||||
conn.commit()
|
||||
print(f"Úspěšně zpracováno {len(a_vety_raw)} dokladů.", flush=True)
|
||||
|
||||
# 3. KROK: PARSOVÁNÍ VÝKONŮ (Věty V)
|
||||
print("Provazuji a vkládám výkony (V)...", flush=True)
|
||||
cursor.execute("SELECT id_dokladu_vazba, obsah_radku FROM vety WHERE typ_vety = 'V'")
|
||||
v_vety_raw = cursor.fetchall()
|
||||
|
||||
v_bulk_data = []
|
||||
for row in v_vety_raw:
|
||||
v = row['obsah_radku']
|
||||
vazba_a = row['id_dokladu_vazba']
|
||||
|
||||
if vazba_a in mapping_veta_to_doklad:
|
||||
d = v[1:9] # VDAT (Datum DDMMYYYY)
|
||||
datum_sql = f"{d[4:8]}-{d[2:4]}-{d[0:2]}"
|
||||
|
||||
# Body VBOD (pozice 23, délka 7)
|
||||
body_val = v[23:30].strip()
|
||||
body = int(body_val) if body_val.isdigit() else 0
|
||||
|
||||
v_bulk_data.append((
|
||||
mapping_veta_to_doklad[vazba_a], # id_dokladu (nový PK)
|
||||
datum_sql, # datum_vykonu
|
||||
v[9:14].strip(), # VKOD - Kód výkonu
|
||||
int(v[14:15]) if v[14:15].isdigit() else 1, # VPOC - Počet
|
||||
v[15:18].strip(), # VODB - Odbornost
|
||||
v[18:23].strip(), # VDIA - Diagnóza
|
||||
body # body
|
||||
))
|
||||
|
||||
if v_bulk_data:
|
||||
insert_v_sql = """
|
||||
INSERT INTO vykony (id_dokladu, datum_vykonu, kod_vykonu, pocet, odbornost, diagnoza, body)
|
||||
VALUES (%s, %s, %s, %s, %s, %s, %s)
|
||||
"""
|
||||
cursor.executemany(insert_v_sql, v_bulk_data)
|
||||
conn.commit()
|
||||
print(f"Hromadně vloženo {len(v_bulk_data)} výkonů.", flush=True)
|
||||
|
||||
print("-" * 30, flush=True)
|
||||
print("Transformace dokončena.", flush=True)
|
||||
|
||||
except mysql.connector.Error as err:
|
||||
print(f"Chyba databáze: {err}", flush=True)
|
||||
except Exception as e:
|
||||
print(f"Neočekávaná chyba: {e}", flush=True)
|
||||
finally:
|
||||
if 'conn' in locals() and conn.is_connected():
|
||||
cursor.close()
|
||||
conn.close()
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
transform_archive_to_results()
|
||||
126
ECG/30 ECG test3.py
Normal file
126
ECG/30 ECG test3.py
Normal file
@@ -0,0 +1,126 @@
|
||||
#!/usr/bin/env python3
|
||||
# -*- coding: utf-8 -*-
|
||||
|
||||
|
||||
|
||||
import fitz
|
||||
import os
|
||||
import re
|
||||
import time
|
||||
import io
|
||||
import pytesseract
|
||||
from pathlib import Path
|
||||
from PIL import Image
|
||||
from FunkceWhereIsDropbox import get_dropbox_path
|
||||
|
||||
# --- CONFIGURATION ---
|
||||
#Get cesta to Dropbox on working computer
|
||||
dropbox=get_dropbox_path()
|
||||
BASE_DIR=dropbox/"Ordinace"/"Dokumentace_ke_zpracování"/"EKGforProcessing"
|
||||
FLAG = "rotated-by-script"
|
||||
|
||||
|
||||
# Point to your Tesseract executable if it's not in your PATH:
|
||||
pytesseract.pytesseract.tesseract_cmd = r'C:\Program Files\Tesseract-OCR\tesseract.exe'
|
||||
|
||||
def ocr_page(page):
|
||||
"""Perform OCR using Tesseract with high DPI for better accuracy."""
|
||||
# Increasing DPI to 300 is crucial for small text on EKG strips
|
||||
pix = page.get_pixmap(dpi=300)
|
||||
img = Image.frombytes("RGB", [pix.width, pix.height], pix.samples)
|
||||
|
||||
# Using 'ces' for Czech language support
|
||||
# PSM 6: Assume a single uniform block of text
|
||||
text = pytesseract.image_to_string(img, lang='ces', config='--psm 6')
|
||||
return text
|
||||
|
||||
|
||||
def extract_rodne_cislo(text):
|
||||
"""Extracts RC (6 digits + optional slash/spaces + 3-4 digits)."""
|
||||
m = re.search(r"(\d{6})\s*/?\s*(\d{3,4})", text)
|
||||
if not m:
|
||||
return None
|
||||
left = m.group(1)
|
||||
right = m.group(2).zfill(4)
|
||||
return left + right
|
||||
|
||||
|
||||
def extract_date(text):
|
||||
"""Extracts date with high tolerance for OCR spacing errors."""
|
||||
# Matches D.M.YYYY, D. M. YYYY, DD.MM.YYYY, etc.
|
||||
# It also handles if OCR accidentally puts a comma instead of a dot
|
||||
m = re.search(r"(\d{1,2})[\.,]\s*(\d{1,2})[\.,]\s*(\d{4})", text)
|
||||
if m:
|
||||
return m.groups()
|
||||
return None
|
||||
|
||||
|
||||
def convert_date_to_iso(date_tuple):
|
||||
"""Converts (D, M, Y) -> YYYY-MM-DD."""
|
||||
d, m, y = date_tuple
|
||||
return f"{y}-{m.zfill(2)}-{d.zfill(2)}"
|
||||
|
||||
|
||||
# --- MAIN PROCESS ---
|
||||
for pdf_path in BASE_DIR.glob("*.pdf"):
|
||||
if ".tmp" in pdf_path.name: continue
|
||||
|
||||
print(f"\n{'=' * 60}")
|
||||
print(f"PROCESSING: {pdf_path.name}")
|
||||
print(f"{'=' * 60}")
|
||||
|
||||
doc = fitz.open(pdf_path)
|
||||
meta = doc.metadata
|
||||
keywords = meta.get("keywords", "") or ""
|
||||
|
||||
# 1. HANDLE ROTATION
|
||||
if FLAG not in keywords:
|
||||
print(" [Action] Rotating page...")
|
||||
page = doc[0]
|
||||
page.set_rotation((page.rotation + 90) % 360)
|
||||
if doc.page_count > 1:
|
||||
doc.delete_page(1)
|
||||
meta["keywords"] = (keywords + " " + FLAG).strip()
|
||||
doc.set_metadata(meta)
|
||||
tmp = pdf_path.with_suffix(".tmp.pdf")
|
||||
doc.save(tmp, deflate=True)
|
||||
doc.close()
|
||||
os.replace(tmp, pdf_path)
|
||||
doc = fitz.open(pdf_path)
|
||||
|
||||
# 2. PERFORM OCR
|
||||
raw_text = ocr_page(doc[0])
|
||||
|
||||
# --- DEBUG PRINTOUT ---
|
||||
print("\n--- START OF EXTRACTED TEXT ---")
|
||||
print(raw_text)
|
||||
print("--- END OF EXTRACTED TEXT ---\n")
|
||||
# ---------------------
|
||||
|
||||
rc = extract_rodne_cislo(raw_text)
|
||||
date_tuple = extract_date(raw_text)
|
||||
|
||||
print(f"RESULT -> RC: {rc if rc else 'NOT FOUND'}")
|
||||
print(f"RESULT -> Date: {date_tuple if date_tuple else 'NOT FOUND'}")
|
||||
|
||||
doc.close()
|
||||
|
||||
# 3. RENAME LOGIC
|
||||
if rc and date_tuple:
|
||||
date_iso = convert_date_to_iso(date_tuple)
|
||||
new_name = f"{rc} {date_iso} [EKG] [bez hodnocení].pdf"
|
||||
new_path = pdf_path.with_name(new_name)
|
||||
|
||||
if not new_path.exists():
|
||||
try:
|
||||
# Close the handle properly before renaming
|
||||
pdf_path.rename(new_path)
|
||||
print(f"✅ Success: Renamed to {new_name}")
|
||||
except Exception as e:
|
||||
print(f"❌ Rename error: {e}")
|
||||
else:
|
||||
print(f"⚠ Skipping: {new_name} already exists.")
|
||||
else:
|
||||
print("❌ Script could not find all data. Check the extracted text above.")
|
||||
|
||||
print("\nAll files processed.")
|
||||
33
PDF/VložstranydoPDF.py
Normal file
33
PDF/VložstranydoPDF.py
Normal file
@@ -0,0 +1,33 @@
|
||||
import pypdf
|
||||
|
||||
# Název nahraného souboru a název výsledku
|
||||
input_pdf = "u:\Dropbox\!!!Days\Downloads Z230\zkouska-matematicke-metody-pro-statistiky (1).pdf"
|
||||
output_pdf = "u:\Dropbox\!!!Days\Downloads Z230\zkouska_s_poznamkami.pdf"
|
||||
|
||||
|
||||
def uprav_pdf_pro_poznamky(vstup, vystup):
|
||||
reader = pypdf.PdfReader(vstup)
|
||||
writer = pypdf.PdfWriter()
|
||||
|
||||
# Standardní rozměry A4 v bodech (72 DPI)
|
||||
A4_WIDTH = 595
|
||||
A4_HEIGHT = 842
|
||||
|
||||
for i, strana in enumerate(reader.pages):
|
||||
# 1. Přidáme původní stranu ze souboru
|
||||
writer.add_page(strana)
|
||||
|
||||
# 2. Za každou druhou stranu (2, 4, 6...) vložíme 2 prázdné listy
|
||||
# Index i začíná od 0, proto kontrolujeme (i + 1)
|
||||
if (i + 1) % 2 == 0:
|
||||
writer.add_blank_page(width=A4_WIDTH, height=A4_HEIGHT)
|
||||
writer.add_blank_page(width=A4_WIDTH, height=A4_HEIGHT)
|
||||
|
||||
# Uložení nového PDF
|
||||
with open(vystup, "wb") as f:
|
||||
writer.write(f)
|
||||
print(f"Soubor '{vystup}' byl úspěšně vytvořen.")
|
||||
|
||||
|
||||
# Spuštění procesu
|
||||
uprav_pdf_pro_poznamky(input_pdf, output_pdf)
|
||||
55855
SEZNAM_K_NAHRANI.txt
55855
SEZNAM_K_NAHRANI.txt
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@@ -1 +0,0 @@
|
||||
/mnt/user/#ColdData/physical_files_list.txt
|
||||
@@ -1,4 +0,0 @@
|
||||
TOTO JSOU ZÁZNAMY V DB, KTERÉ NA DISKU NEEXISTUJÍ:
|
||||
/mnt/user/#ColdData/#40 SP1 SBS2003 ENG SP1/#2 WSS2003SP1-kb841876-fullfile-ENU_2.exe
|
||||
/mnt/user/#ColdData/#40 SP1 SBS2003 ENG SP1/tcmd852ax32.exe
|
||||
/mnt/user/#ColdData/#40 SP1 SBS2003 ENG SP1/#2 WSS2003SP1-kb841876-fullfile-ENU.exe
|
||||
File diff suppressed because it is too large
Load Diff
@@ -1,52 +0,0 @@
|
||||
záleský vojtěch - převzetí (2025)/01 - [vojtěch záleský] - převzetí.mp3
|
||||
záleský vojtěch - převzetí (2025)/02 - [vojtěch záleský] - převzetí.mp3
|
||||
záleský vojtěch - převzetí (2025)/03 - [vojtěch záleský] - převzetí.mp3
|
||||
záleský vojtěch - převzetí (2025)/04 - [vojtěch záleský] - převzetí.mp3
|
||||
záleský vojtěch - převzetí (2025)/05 - [vojtěch záleský] - převzetí.mp3
|
||||
záleský vojtěch - převzetí (2025)/06 - [vojtěch záleský] - převzetí.mp3
|
||||
záleský vojtěch - převzetí (2025)/07 - [vojtěch záleský] - převzetí.mp3
|
||||
záleský vojtěch - převzetí (2025)/08 - [vojtěch záleský] - převzetí.mp3
|
||||
záleský vojtěch - převzetí (2025)/09 - [vojtěch záleský] - převzetí.mp3
|
||||
záleský vojtěch - převzetí (2025)/10 - [vojtěch záleský] - převzetí.mp3
|
||||
záleský vojtěch - převzetí (2025)/11 - [vojtěch záleský] - převzetí.mp3
|
||||
záleský vojtěch - převzetí (2025)/12 - [vojtěch záleský] - převzetí.mp3
|
||||
záleský vojtěch - převzetí (2025)/13 - [vojtěch záleský] - převzetí.mp3
|
||||
záleský vojtěch - převzetí (2025)/14 - [vojtěch záleský] - převzetí.mp3
|
||||
záleský vojtěch - převzetí (2025)/15 - [vojtěch záleský] - převzetí.mp3
|
||||
záleský vojtěch - převzetí (2025)/16 - [vojtěch záleský] - převzetí.mp3
|
||||
záleský vojtěch - převzetí (2025)/17 - [vojtěch záleský] - převzetí.mp3
|
||||
záleský vojtěch - převzetí (2025)/18 - [vojtěch záleský] - převzetí.mp3
|
||||
záleský vojtěch - převzetí (2025)/19 - [vojtěch záleský] - převzetí.mp3
|
||||
záleský vojtěch - převzetí (2025)/20 - [vojtěch záleský] - převzetí.mp3
|
||||
záleský vojtěch - převzetí (2025)/21 - [vojtěch záleský] - převzetí.mp3
|
||||
záleský vojtěch - převzetí (2025)/22 - [vojtěch záleský] - převzetí.mp3
|
||||
záleský vojtěch - převzetí (2025)/23 - [vojtěch záleský] - převzetí.mp3
|
||||
záleský vojtěch - převzetí (2025)/24 - [vojtěch záleský] - převzetí.mp3
|
||||
záleský vojtěch - převzetí (2025)/25 - [vojtěch záleský] - převzetí.mp3
|
||||
záleský vojtěch - převzetí (2025)/26 - [vojtěch záleský] - převzetí.mp3
|
||||
záleský vojtěch - převzetí (2025)/27 - [vojtěch záleský] - převzetí.mp3
|
||||
záleský vojtěch - převzetí (2025)/28 - [vojtěch záleský] - převzetí.mp3
|
||||
záleský vojtěch - převzetí (2025)/29 - [vojtěch záleský] - převzetí.mp3
|
||||
záleský vojtěch - převzetí (2025)/30 - [vojtěch záleský] - převzetí.mp3
|
||||
záleský vojtěch - převzetí (2025)/31 - [vojtěch záleský] - převzetí.mp3
|
||||
záleský vojtěch - převzetí (2025)/32 - [vojtěch záleský] - převzetí.mp3
|
||||
záleský vojtěch - převzetí (2025)/33 - [vojtěch záleský] - převzetí.mp3
|
||||
záleský vojtěch - převzetí (2025)/34 - [vojtěch záleský] - převzetí.mp3
|
||||
záleský vojtěch - převzetí (2025)/35 - [vojtěch záleský] - převzetí.mp3
|
||||
záleský vojtěch - převzetí (2025)/36 - [vojtěch záleský] - převzetí.mp3
|
||||
záleský vojtěch - převzetí (2025)/37 - [vojtěch záleský] - převzetí.mp3
|
||||
záleský vojtěch - převzetí (2025)/38 - [vojtěch záleský] - převzetí.mp3
|
||||
záleský vojtěch - převzetí (2025)/39 - [vojtěch záleský] - převzetí.mp3
|
||||
záleský vojtěch - převzetí (2025)/40 - [vojtěch záleský] - převzetí.mp3
|
||||
záleský vojtěch - převzetí (2025)/41 - [vojtěch záleský] - převzetí.mp3
|
||||
záleský vojtěch - převzetí (2025)/42 - [vojtěch záleský] - převzetí.mp3
|
||||
záleský vojtěch - převzetí (2025)/43 - [vojtěch záleský] - převzetí.mp3
|
||||
záleský vojtěch - převzetí (2025)/44 - [vojtěch záleský] - převzetí.mp3
|
||||
záleský vojtěch - převzetí (2025)/45 - [vojtěch záleský] - převzetí.mp3
|
||||
záleský vojtěch - převzetí (2025)/46 - [vojtěch záleský] - převzetí.mp3
|
||||
záleský vojtěch - převzetí (2025)/47 - [vojtěch záleský] - převzetí.mp3
|
||||
záleský vojtěch - převzetí (2025)/48 - [vojtěch záleský] - převzetí.mp3
|
||||
záleský vojtěch - převzetí (2025)/audiokniha-prevzeti-vojtech-zalesky-original.jpg
|
||||
záleský vojtěch - převzetí (2025)/audiokniha-prevzeti-vojtech-zalesky.jpg
|
||||
záleský vojtěch - převzetí (2025)/folder.jpg
|
||||
záleský vojtěch - převzetí (2025)/info.txt
|
||||
56068
report_NOVE_SOUBORY.txt
56068
report_NOVE_SOUBORY.txt
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
Reference in New Issue
Block a user