דילוג לתוכן
  • חוקי הפורום
  • פופולרי
  • לא נפתר
  • משתמשים
  • חיפוש גוגל בפורום
  • צור קשר
עיצובים
  • Light
  • Brite
  • Cerulean
  • Cosmo
  • Flatly
  • Journal
  • Litera
  • Lumen
  • Lux
  • Materia
  • Minty
  • Morph
  • Pulse
  • Sandstone
  • Simplex
  • Sketchy
  • Spacelab
  • United
  • Yeti
  • Zephyr
  • Dark
  • Cyborg
  • Darkly
  • Quartz
  • Slate
  • Solar
  • Superhero
  • Vapor

  • ברירת מחדל (ללא עיצוב (ברירת מחדל))
  • ללא עיצוב (ברירת מחדל)
כיווץ
מתמחים טופ
  1. דף הבית
  2. קטגוריות בהרצה
  3. תכנות
  4. בינה מלאכותית - AI
  5. עזרה הדדית - בינה מלאכותית
  6. שיתוף | תוכנת בית משפט מתקדמת.

שיתוף | תוכנת בית משפט מתקדמת.

מתוזמן נעוץ נעול הועבר עזרה הדדית - בינה מלאכותית
40 פוסטים 16 כותבים 630 צפיות 14 עוקבים
  • מהישן לחדש
  • מהחדש לישן
  • הכי הרבה הצבעות
תגובה
  • תגובה כנושא
התחברו כדי לפרסם תגובה
נושא זה נמחק. רק משתמשים עם הרשאות מתאימות יוכלו לצפות בו.
  • CSS 0C מנותק
    CSS 0C מנותק
    CSS 0
    כתב נערך לאחרונה על ידי CSS 0
    #18

    גרסה חמישית ואחרונה כבר פה.

    השיפורים:

    • יש אפשרות לכל צד לעלות ראיות של קבצי טקסט ותמונה, עד 5 לכל צד.
    • המשפט עכשיו עובר אצל 3 שופטים עם אופי שונה והמערכת בסוף מוציאה פסק על פי רוב.
    • תוקנה השגיאה ביצוא ל PDF.

    עודכן בפוסט הראשון.

    י CSS 0C 2 תגובות תגובה אחרונה
    3
    • CSS 0C CSS 0

      גרסה חמישית ואחרונה כבר פה.

      השיפורים:

      • יש אפשרות לכל צד לעלות ראיות של קבצי טקסט ותמונה, עד 5 לכל צד.
      • המשפט עכשיו עובר אצל 3 שופטים עם אופי שונה והמערכת בסוף מוציאה פסק על פי רוב.
      • תוקנה השגיאה ביצוא ל PDF.

      עודכן בפוסט הראשון.

      י מנותק
      י מנותק
      י.ר.ק
      כתב נערך לאחרונה על ידי
      #19

      @CSS-0 אתה לא נורמלי [בצחוק]

      תגובה 1 תגובה אחרונה
      1
      • CSS 0C CSS 0

        גרסה חמישית ואחרונה כבר פה.

        השיפורים:

        • יש אפשרות לכל צד לעלות ראיות של קבצי טקסט ותמונה, עד 5 לכל צד.
        • המשפט עכשיו עובר אצל 3 שופטים עם אופי שונה והמערכת בסוף מוציאה פסק על פי רוב.
        • תוקנה השגיאה ביצוא ל PDF.

        עודכן בפוסט הראשון.

        CSS 0C מנותק
        CSS 0C מנותק
        CSS 0
        כתב נערך לאחרונה על ידי
        #20

        עוד מעט יהיה עדכון בתוכנה של ה AI שמדבר עם עצמו.......

        תגובה 1 תגובה אחרונה
        1
        • י י.ר.ק

          @CSS-0 בהמשך לאתמול על הדיון של ג'מיני מול gpt היום בגרסא 4 ג'מיני אני מגיש ערעורפסק_דין_תמונה_מי_ישלוט_בעולם_הai.png

          ק מנותק
          ק מנותק
          קרט
          כתב נערך לאחרונה על ידי
          #21

          @י.ר.ק כתב בשיתוף | תוכנת בית משפט מתקדמת.:

          בהמשך לאתמול על הדיון של ג'מיני מול gpt היום בגרסא 4 ג'מיני אני מגיש ערעור

          השופט משוחד

          י תגובה 1 תגובה אחרונה
          0
          • ק קרט

            @י.ר.ק כתב בשיתוף | תוכנת בית משפט מתקדמת.:

            בהמשך לאתמול על הדיון של ג'מיני מול gpt היום בגרסא 4 ג'מיני אני מגיש ערעור

            השופט משוחד

            י מנותק
            י מנותק
            י.ר.ק
            כתב נערך לאחרונה על ידי י.ר.ק
            #22

            @קרט

            אז למה אתמול הוא פסק gpt (גרסא 2)

            תגובה 1 תגובה אחרונה
            0
            • CSS 0C CSS 0

              בניתי תוכנת "בית משפט" זאת אומרת התוכנה מקבלת טענות משתי צדדים ובעזרת AI פוסקת את הדין התוכנה כוללת

              • עיצוב מקצועי.
              • יצוא ל PNG / PDF.
              • ארכיון לשמירה שכולם יוכלו לראות את הפסק.
              • לילוק על פסקים בארכיון.
              • הגשת ערור על המשפט, כולל קבלת קטגור וסנגור AI.
                אין מדובר על משפט אמת וגם זה לא על בסיס חוקים אמיתיים!

              גרסאות:
              גרסה 1
              גרסה 2
              גרסה 3
              גרסה 4
              גרסה חמישית משופרת ואחרונה:
              גרסה 5

              א מנותק
              א מנותק
              אברהם גלסר
              כתב נערך לאחרונה על ידי אברהם גלסר
              #23

              @CSS-0 יהיה נחמד אם תכתוב על זה פה עם קישור גם לנושא הזה, שיהיה מרוכז.

              ב תגובה 1 תגובה אחרונה
              0
              • CSS 0C CSS 0 התייחס לנושא זה
              • א אברהם גלסר

                @CSS-0 יהיה נחמד אם תכתוב על זה פה עם קישור גם לנושא הזה, שיהיה מרוכז.

                ב מנותק
                ב מנותק
                בנימין כפיר
                כתב נערך לאחרונה על ידי בנימין כפיר
                #24

                @css-0 אפשר פליזזזז את קוד המקור?

                CSS 0C תגובה 1 תגובה אחרונה
                0
                • ב בנימין כפיר

                  @css-0 אפשר פליזזזז את קוד המקור?

                  CSS 0C מנותק
                  CSS 0C מנותק
                  CSS 0
                  כתב נערך לאחרונה על ידי
                  #25

                  @בנימין-כפיר בבקשה:

                  import React, { useState, useRef, useEffect } from 'react';
                  import { Scale, Gavel, UserPlus, Trash2, AlertCircle, Loader2, MessageSquare, Award, FileText, Image as ImageIcon, Briefcase, Shield, RefreshCw, Send, Library, X, Landmark, Clock, Check, ThumbsUp, HelpCircle, ArrowDownUp, Wand2, Search, FileUp, XCircle, Paperclip } from 'lucide-react';
                  import { initializeApp } from 'firebase/app';
                  import { getAuth, signInAnonymously, onAuthStateChanged, signInWithCustomToken } from 'firebase/auth';
                  import { getFirestore, collection, addDoc, onSnapshot, doc, updateDoc, arrayUnion, arrayRemove } from 'firebase/firestore';
                  
                  const apiKey = ""; // The execution environment provides the key at runtime
                  
                  // --- Firebase Setup ---
                  const firebaseConfig = typeof __firebase_config !== 'undefined' ? JSON.parse(__firebase_config) : null;
                  const appId = typeof __app_id !== 'undefined' ? __app_id : 'default-app-id';
                  
                  let app, auth, db;
                  if (firebaseConfig) {
                    app = initializeApp(firebaseConfig);
                    auth = getAuth(app);
                    db = getFirestore(app);
                  }
                  
                  export default function App() {
                    const [topic, setTopic] = useState('');
                    const [parties, setParties] = useState([
                      { id: 1, name: '', claim: '', evidence: [] },
                      { id: 2, name: '', claim: '', evidence: [] }
                    ]);
                    
                    const [verdict, setVerdict] = useState(null);
                    const [winner, setWinner] = useState(null);
                    const [isLoading, setIsLoading] = useState(false);
                    const [isExporting, setIsExporting] = useState(null);
                    const [error, setError] = useState('');
                    const [counselLoadingId, setCounselLoadingId] = useState(null);
                  
                    // Appeal States
                    const [appealState, setAppealState] = useState('none');
                    const [appellantName, setAppellantName] = useState('');
                    const [appealInput, setAppealInput] = useState('');
                    const [debateMessages, setDebateMessages] = useState([]);
                    const [isDebating, setIsDebating] = useState(false);
                    const [debateStatus, setDebateStatus] = useState('');
                    const [finalVerdict, setFinalVerdict] = useState(null);
                    const [finalWinner, setFinalWinner] = useState(null);
                    
                    // Archive & Database States
                    const [user, setUser] = useState(null);
                    const [currentView, setCurrentView] = useState('court'); // 'court', 'archive'
                    const [archiveItems, setArchiveItems] = useState([]);
                    const [archiveSort, setArchiveSort] = useState('newest');
                    const [expandedArchiveItem, setExpandedArchiveItem] = useState(null);
                    const [isSavingToArchive, setIsSavingToArchive] = useState(false);
                    const [savedStatus, setSavedStatus] = useState(''); 
                    const [archiveCategoryFilter, setArchiveCategoryFilter] = useState('all');
                    const [archiveSearchTerm, setArchiveSearchTerm] = useState('');
                  
                    const debateEndRef = useRef(null);
                  
                    const LEGAL_CATEGORIES = [
                      "דיני חוזים והסכמים", "סכסוכי שכנים ומקרקעין", "דיני עבודה ותעסוקה", "קניין רוחני וזכויות יוצרים",
                      "לשון הרע ופגיעה בפרטיות", "הגנת הצרכן ושירות", "תביעות נזיקין כלליות", "סכסוכים עסקיים ושותפויות",
                      "תביעות חוב והוצאה לפועל", "עוולות מסחריות ותחרות הוגנת", "דיני אינטרנט וסייבר", "נזקי רכוש וביטוח",
                      "סכסוכי ועדי בתים", "הגנת נתונים (פרטיות מידע)", "תביעות קטנות וסכסוכים כלליים"
                    ];
                  
                    useEffect(() => {
                      if (appealState === 'debating') debateEndRef.current?.scrollIntoView({ behavior: 'smooth' });
                    }, [debateMessages, appealState]);
                  
                    // Firebase Auth Initialization
                    useEffect(() => {
                      if (!auth) return;
                      const initAuth = async () => {
                        try {
                          if (typeof __initial_auth_token !== 'undefined' && __initial_auth_token) {
                            await signInWithCustomToken(auth, __initial_auth_token);
                          } else {
                            await signInAnonymously(auth);
                          }
                        } catch (err) {
                          console.error("Auth init failed:", err);
                        }
                      };
                      initAuth();
                      const unsubscribe = onAuthStateChanged(auth, setUser);
                      return () => unsubscribe();
                    }, []);
                  
                    // Fetch Public Archive
                    useEffect(() => {
                      if (!user || !db) return;
                      const archiveRef = collection(db, 'artifacts', appId, 'public', 'data', 'court_archive');
                      const unsubArchive = onSnapshot(archiveRef, (snapshot) => {
                        const items = snapshot.docs.map(doc => ({ id: doc.id, ...doc.data() }));
                        setArchiveItems(items);
                      });
                  
                      return () => unsubArchive();
                    }, [user]);
                  
                    // --- Strict System Prompts ---
                    const baseRules = `
                  איסור מוחלט על נושאי דת: אסור להשתמש במושגים מהתורה, הלכה, פסוקים, קבלה, או שום הקשר דתי. בית המשפט הוא חילוני, לוגי-אזרחי בלבד. פעל לפי ההיגיון הטבעי.
                  חובה לשמור על שפה מקצועית, נקייה ומוסרית. אסור לדון באלימות קשה, פשעים חמורים או תכנים שאינם הולמים. הדיון הוא אזרחי, עסקי או בין-אישי.`;
                  
                    const counselPrompt = `אתה עוזר משפטי. תפקידך לשכתב את טענת המשתמש לשפה משפטית, רשמית, מקצועית ומכובדת (בגוף ראשון).
                  כלל ברזל: אסור לך להוסיף, להמציא או להניח שום עובדה, שם, תאריך, סכום או אירוע שלא הוזכרו במפורש בטקסט המקורי. המטרה היא רק להעלות את המשלב הלשוני.
                  ${baseRules}`;
                  
                    const judgePrompt = `אתה שופט רשמי בבית משפט אזרחי.
                  תפקידך: לנתח את טענות הצדדים ואת הראיות המצורפות (טקסט ותמונות) בצורה לוגית קרה ולכתוב פסק דין מנומק.
                  חובה להכריע צד אחד בלבד שניצח! איסור מוחלט להציע פשרה.
                  מבנה התשובה הנדרש:
                  - 'ניתוח המקרה והראיות'
                  - 'מסקנות בית המשפט'
                  - 'פסק הדין המוחלט'
                  חובה לסיים בשורה: "הצודק: [שם המנצח]".
                  ${baseRules}`;
                  
                    const supremeJudgePrompt = `אתה שופט בבית המשפט לערעורים. 
                  סקור את הדיון ושפוט ללא פשרות.
                  חובה להכריע צד אחד בלבד שזוכה!
                  ${baseRules}`;
                  
                    const lawyerPrompt = `אתה עורך דין ממולח המייצג את המערער. נסח את הטענה של הלקוח כטיעון משפטי אגרסיבי שיבטל את הפסק. אל תסכים עם הצד השני.${baseRules}`;
                    const opponentPrompt = `אתה בא-כוח המשיב. סתור באלגנטיות את טענות המערער והגן על הפסק המקורי.${baseRules}`;
                  
                    // --- API Helper handling multimodal parts ---
                    const fetchAI = async (partsArray, systemInstruction) => {
                      const url = `https://generativelanguage.googleapis.com/v1beta/models/gemini-2.5-flash-preview-09-2025:generateContent?key=${apiKey}`;
                      const payload = {
                        contents: [{ role: 'user', parts: partsArray }],
                        systemInstruction: { parts: [{ text: systemInstruction }] }
                      };
                      
                      let delay = 1000;
                      for(let i=0; i<3; i++) {
                        try {
                          const res = await fetch(url, { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify(payload) });
                          if (!res.ok) throw new Error(`API Error ${res.status}`);
                          const data = await res.json();
                          return data.candidates?.[0]?.content?.parts?.[0]?.text || 'שגיאה בפענוח';
                        } catch (err) {
                          if(i === 2) throw err;
                          await new Promise(r => setTimeout(r, delay));
                          delay *= 2;
                        }
                      }
                    };
                  
                    // --- Handlers ---
                    const handleAddParty = () => {
                      const newId = parties.length > 0 ? Math.max(...parties.map(p => p.id)) + 1 : 1;
                      setParties([...parties, { id: newId, name: '', claim: '', evidence: [] }]);
                    };
                  
                    const handleRemoveParty = (idToRemove) => {
                      if (parties.length <= 2) { setError('חובה לפחות 2 צדדים.'); setTimeout(() => setError(''), 3000); return; }
                      setParties(parties.filter(p => p.id !== idToRemove));
                    };
                  
                    const handleChange = (id, field, value) => {
                      setParties(parties.map(p => p.id === id ? { ...p, [field]: value } : p));
                    };
                    
                    // Evidence Upload Logic
                    const handleFileChange = async (partyId, e) => {
                      const files = Array.from(e.target.files);
                      if (files.length === 0) return;
                  
                      const party = parties.find(p => p.id === partyId);
                      const currentEvidence = party.evidence || [];
                      const slotsLeft = 5 - currentEvidence.length;
                      if (slotsLeft <= 0) {
                        setError('ניתן לצרף עד 5 ראיות לכל צד.');
                        setTimeout(() => setError(''), 3000);
                        return;
                      }
                      const filesToProcess = files.slice(0, slotsLeft);
                  
                      const newEvidences = await Promise.all(filesToProcess.map(async file => {
                        return new Promise((resolve) => {
                          const reader = new FileReader();
                          if (file.type.startsWith('image/')) {
                            reader.onload = (ev) => resolve({ type: 'image', name: file.name, mimeType: file.type, data: ev.target.result.split(',')[1] });
                            reader.readAsDataURL(file);
                          } else if (file.type === 'text/plain') {
                            // Limit text evidence to 1500 chars to avoid overload
                            reader.onload = (ev) => resolve({ type: 'text', name: file.name, data: ev.target.result.substring(0, 1500) });
                            reader.readAsText(file);
                          } else {
                             resolve(null);
                          }
                        });
                      }));
                  
                      const validEvidences = newEvidences.filter(ev => ev !== null);
                      
                      setParties(prev => prev.map(p => p.id === partyId ? { ...p, evidence: [...(p.evidence || []), ...validEvidences] } : p));
                    };
                  
                    const removeEvidence = (partyId, evIndex) => {
                      setParties(prev => prev.map(p => {
                        if (p.id === partyId) {
                          const newEv = [...p.evidence];
                          newEv.splice(evIndex, 1);
                          return { ...p, evidence: newEv };
                        }
                        return p;
                      }));
                    };
                  
                    const handleArchiveSearchChange = (e) => setArchiveSearchTerm(e.target.value);
                  
                    // --- AI Counsel (Rewrite claim) ---
                    const handleLegalCounsel = async (partyId, currentClaim) => {
                      if (!currentClaim.trim()) return;
                      setCounselLoadingId(partyId);
                      try {
                        const newClaim = await fetchAI([{ text: `שכתב את הטענה הבאה. זכור: אל תוסיף שום עובדה חדשה!\n\nהטענה: "${currentClaim}"`}], counselPrompt);
                        handleChange(partyId, 'claim', newClaim.trim());
                      } catch (err) {
                        console.error(err);
                        setError('שגיאה בהתייעצות עם העו"ד.');
                      } finally {
                        setCounselLoadingId(null);
                      }
                    };
                  
                    // --- SORT & FILTER ARCHIVE ---
                    const getSortedArchive = () => {
                      let filtered = archiveItems;
                      if (archiveCategoryFilter !== 'all') filtered = filtered.filter(item => item.category === archiveCategoryFilter);
                      if (archiveSearchTerm.trim() !== '') {
                        const lowerTerm = archiveSearchTerm.toLowerCase();
                        filtered = filtered.filter(item => 
                          item.topic?.toLowerCase().includes(lowerTerm) || 
                          item.winner?.toLowerCase().includes(lowerTerm) ||
                          item.verdict?.toLowerCase().includes(lowerTerm)
                        );
                      }
                      let sorted = [...filtered];
                      sorted.sort((a, b) => archiveSort === 'top' ? (b.upvotes?.length || 0) - (a.upvotes?.length || 0) : b.createdAt - a.createdAt);
                      return sorted;
                    };
                  
                    // --- Court Process ---
                    const initiateCase = async () => {
                      if (!topic.trim()) { setError('אנא הזן נושא.'); return; }
                      if (parties.some(p => !p.name.trim() || !p.claim.trim())) { setError('מלא שמות ותצהירים לכל הצדדים.'); return; }
                  
                      setError(''); setIsLoading(true); setVerdict(null); setWinner(null); setAppealState('none'); setSavedStatus('');
                  
                      let parts = [{ text: `נושא הדיון האזרחי: ${topic}\n\nתצהירי וראיות הצדדים:\n` }];
                      
                      parties.forEach(p => { 
                        let partyIntro = `- תצהיר של ${p.name}: "${p.claim}"\n`;
                        const textEvs = (p.evidence || []).filter(e => e.type === 'text');
                        if (textEvs.length > 0) {
                           partyIntro += `* ראיות טקסט מצורפות מאת ${p.name}:\n` + textEvs.map(e => `[מסמך ${e.name}]:\n${e.data}`).join('\n\n') + '\n';
                        }
                        parts.push({ text: partyIntro });
                  
                        // Add image parts sequentially
                        const imgEvs = (p.evidence || []).filter(e => e.type === 'image');
                        imgEvs.forEach(img => {
                          parts.push({ text: `[ראיה ויזואלית מצורפת מאת ${p.name} - קובץ ${img.name}]:` });
                          parts.push({ inlineData: { mimeType: img.mimeType, data: img.data } });
                        });
                      });
                  
                      try {
                        let text = await fetchAI(parts, judgePrompt);
                        const lines = text.split('\n');
                        const winnerLineIndex = lines.findLastIndex(line => line.includes('הצודק:'));
                        if (winnerLineIndex !== -1) {
                          setWinner(lines[winnerLineIndex].replace(/.*הצודק:\s*/, '').replace(/\*\*/g, '').trim());
                          lines.splice(winnerLineIndex, 1);
                          text = lines.join('\n').trim();
                        }
                        setVerdict(text);
                        setTimeout(() => document.getElementById('verdict-section')?.scrollIntoView({ behavior: 'smooth' }), 100);
                      } catch (err) {
                        setError('אירעה שגיאה בבחינת התיק.');
                      } finally {
                        setIsLoading(false);
                      }
                    };
                  
                    const handleAppealRound = async () => {
                      if (!appealInput.trim()) return;
                      setIsDebating(true); setError('');
                      const currentInput = appealInput; setAppealInput('');
                  
                      try {
                        setDebateStatus('עורך הדין מנסח כתב טענות...');
                        let debateContext = debateMessages.map(m => `${m.role === 'lawyer' ? 'עו"ד מערער' : 'בא-כוח משיב'}: ${m.content}`).join('\n\n');
                        let promptToLawyer = `נושא התיק: ${topic}\nפסק דין מקורי: ${verdict}\nהיסטוריה:\n${debateContext}\n\nהלקוח המערער (${appellantName}) מסר: "${currentInput}". נסח טענה אגרסיבית.`;
                        
                        const lawyerRes = await fetchAI([{ text: promptToLawyer }], lawyerPrompt);
                        const newMessages = [...debateMessages, { role: 'lawyer', content: lawyerRes, rawInput: currentInput }];
                        setDebateMessages(newMessages);
                  
                        setDebateStatus('בא-כוח המשיב מתגונן...');
                        let promptToOpponent = `נושא התיק: ${topic}\nפסק מקורי: ${verdict}\n\nעו"ד המערער טען כעת:\n"${lawyerRes}"\n\nנסח תגובת נגד עוקצנית ומשפטית.`;
                        
                        const opponentRes = await fetchAI([{ text: promptToOpponent }], opponentPrompt);
                        setDebateMessages([...newMessages, { role: 'opponent', content: opponentRes }]);
                      } catch (err) { setError('שגיאה בניהול הערעור.'); } 
                      finally { setIsDebating(false); setDebateStatus(''); setAppealState('debating'); }
                    };
                  
                    // --- SUPREME COURT PANEL (3 JUDGES) ---
                    const handleFinalSupremeVerdict = async () => {
                      setIsDebating(true); setDebateStatus('הרכב של 3 שופטי עליון דן בתיק במקביל...'); setSavedStatus('');
                      try {
                        let debateContext = debateMessages.map(m => `${m.role === 'lawyer' ? 'עו"ד המערער' : 'בא-כוח משיב'}: ${m.content}`).join('\n\n');
                        let basePrompt = `נושא התיק: ${topic}\nפסק דין ראשוני: ${verdict}\n\nפרוטוקול הערעור:\n${debateContext}\n\n`;
                  
                        // Parallel execution of 3 different judicial personas
                        const p1 = fetchAI([{ text: basePrompt + "שפוט תיק זה בגישה מחמירה ופורמליסטית (היצמדות לחוק היבש, ללשון התצהיר ולכללים הנוקשים)." }], supremeJudgePrompt);
                        const p2 = fetchAI([{ text: basePrompt + "שפוט תיק זה בגישה מסחרית ופרגמטית (חיפוש הפתרון היעיל ביותר, מבחן הסבירות וההיגיון הכלכלי)." }], supremeJudgePrompt);
                        const p3 = fetchAI([{ text: basePrompt + "שפוט תיק זה בגישה אנליטית (ירידה לשורש כוונת הצדדים, ניתוח פסיכולוגי של העדויות והראיות)." }], supremeJudgePrompt);
                  
                        const [j1, j2, j3] = await Promise.all([p1, p2, p3]);
                  
                        setDebateStatus('נשיא העליון משקלל קולות ומנסח פסק דין...');
                        const summarizerPrompt = `נשיא העליון, לפניך 3 פסקי דין שכתבו שופטי ההרכב בערעור:
                        --- שופט מחמיר ---
                        ${j1}
                        --- שופט פרגמטי ---
                        ${j2}
                        --- שופט אנליטי ---
                        ${j3}
                        
                        תפקידך:
                        1. זהה מי הצד שניצח לפי רוב הקולות של השופטים (מי קיבל לפחות 2 קולות).
                        2. נסח פסק דין חלוט שמייצג את דעת הרוב.
                        3. הצג בנפרד פסקת "דעת המיעוט" (אם הייתה דעה חולקת של אחד השופטים).
                        4. חובה להכריע צד אחד בלבד שזוכה בערעור!
                        
                        מבנה התשובה הנדרש:
                        - 'עמדות שופטי ההרכב' (סיכום קצר)
                        - 'הכרעת הרוב'
                        - 'דעת המיעוט' (אם רלוונטי)
                        חובה לסיים בדיוק בשורה: "הצודק: [שם המנצח]".`;
                  
                        let text = await fetchAI([{ text: summarizerPrompt }], baseRules);
                        const lines = text.split('\n');
                        const winnerLineIndex = lines.findLastIndex(line => line.includes('הצודק:'));
                        if (winnerLineIndex !== -1) {
                          setFinalWinner(lines[winnerLineIndex].replace(/.*הצודק:\s*/, '').replace(/\*\*/g, '').trim());
                          lines.splice(winnerLineIndex, 1);
                          text = lines.join('\n').trim();
                        }
                        setFinalVerdict(text); setAppealState('final');
                        setTimeout(() => document.getElementById('supreme-verdict-section')?.scrollIntoView({ behavior: 'smooth' }), 100);
                      } catch(err) { setError('שגיאה במתן הפסק העליון.'); } 
                      finally { setIsDebating(false); setDebateStatus(''); }
                    };
                  
                    const saveToArchive = async (type) => {
                      if (!user || !db) return;
                      setIsSavingToArchive(true);
                      try {
                        const categoryPrompt = `אנא קטלג את התביעה ל-1 מ-15 הקטגוריות. נושא: "${topic}". רשימה: ${LEGAL_CATEGORIES.join(', ')}`;
                        let aiCategory = await fetchAI([{text: categoryPrompt}], "פקיד רישום אזרחי. החזר רק מחרוזת מדויקת.");
                        aiCategory = aiCategory.trim().replace(/['"]/g, '');
                        if (!LEGAL_CATEGORIES.includes(aiCategory)) aiCategory = "תביעות קטנות וסכסוכים כלליים";
                  
                        const archiveRef = collection(db, 'artifacts', appId, 'public', 'data', 'court_archive');
                        await addDoc(archiveRef, {
                          topic,
                          verdict: type === 'supreme' ? finalVerdict : verdict,
                          winner: type === 'supreme' ? finalWinner : winner,
                          type: type,
                          category: aiCategory,
                          createdAt: Date.now(),
                          userId: user.uid,
                          upvotes: []
                        });
                        setSavedStatus(type);
                      } catch (err) { setError('שגיאה בתיעוד התיק בארכיון.'); } 
                      finally { setIsSavingToArchive(false); }
                    };
                  
                    const toggleUpvote = async (e, docId, upvotesArray) => {
                      e.stopPropagation();
                      if (!user || !db) return;
                      const docRef = doc(db, 'artifacts', appId, 'public', 'data', 'court_archive', docId);
                      const hasUpvoted = upvotesArray?.includes(user.uid);
                      try { await updateDoc(docRef, { upvotes: hasUpvoted ? arrayRemove(user.uid) : arrayUnion(user.uid) }); } 
                      catch (err) { console.error("Upvote error:", err); }
                    };
                  
                    const resetCourt = () => {
                      setTopic(''); setParties([{ id: 1, name: '', claim: '', evidence: [] }, { id: 2, name: '', claim: '', evidence: [] }]);
                      setVerdict(null); setWinner(null);
                      setAppealState('none'); setDebateMessages([]); setFinalVerdict(null); setFinalWinner(null);
                      setSavedStatus('');
                      window.scrollTo({ top: 0, behavior: 'smooth' });
                    };
                  
                    // --- Export Utilities ---
                    const loadScript = (src) => new Promise((resolve, reject) => {
                      if (document.querySelector(`script[src="${src}"]`)) return resolve();
                      const s = document.createElement('script'); s.src = src; s.onload = resolve; s.onerror = reject; document.head.appendChild(s);
                    });
                  
                    const handleExportPDF = async (elementId, filename) => {
                      try {
                        setIsExporting(elementId);
                        await loadScript('https://cdnjs.cloudflare.com/ajax/libs/html2canvas/1.4.1/html2canvas.min.js');
                        await loadScript('https://cdnjs.cloudflare.com/ajax/libs/jspdf/2.5.1/jspdf.umd.min.js');
                        
                        const element = document.getElementById(elementId);
                        
                        // Capture with high scale for good quality
                        const canvas = await window.html2canvas(element, { scale: 2, useCORS: true, backgroundColor: '#ffffff' });
                        const imgData = canvas.toDataURL('image/jpeg', 0.95);
                        
                        const { jsPDF } = window.jspdf;
                        const pdf = new jsPDF('p', 'mm', 'a4');
                        const pdfWidth = pdf.internal.pageSize.getWidth();
                        const pdfHeight = pdf.internal.pageSize.getHeight();
                        
                        // Calculate total height of the image on the PDF canvas
                        const imgHeight = (canvas.height * pdfWidth) / canvas.width;
                        let heightLeft = imgHeight;
                        let position = 0;
                        
                        // Add first page
                        pdf.addImage(imgData, 'JPEG', 0, position, pdfWidth, imgHeight);
                        heightLeft -= pdfHeight;
                        
                        // Add new pages if height exceeds one page
                        while (heightLeft > 0) {
                          position = position - pdfHeight;
                          pdf.addPage();
                          pdf.addImage(imgData, 'JPEG', 0, position, pdfWidth, imgHeight);
                          heightLeft -= pdfHeight;
                        }
                        
                        pdf.save(`${filename}.pdf`);
                      } catch (err) { setError('אירעה שגיאה בייצוא המסמך.'); } finally { setIsExporting(null); }
                    };
                  
                    const handleExportImage = async (elementId, filename) => {
                      try {
                        setIsExporting(elementId);
                        await loadScript('https://cdnjs.cloudflare.com/ajax/libs/html2canvas/1.4.1/html2canvas.min.js');
                        const element = document.getElementById(elementId);
                        const canvas = await window.html2canvas(element, { scale: 2, useCORS: true, backgroundColor: '#ffffff' });
                        const link = document.createElement('a'); link.download = `${filename}.png`; link.href = canvas.toDataURL('image/png'); link.click();
                      } catch (err) { setError('אירעה שגיאה בייצוא התמונה.'); } finally { setIsExporting(null); }
                    };
                  
                    // --- Formatting ---
                    const renderFormattedText = (text) => {
                      if (!text) return null;
                      const formatInline = (t) => {
                        return t.split(/(\*\*.*?\*\*|\*.*?\*)/g).map((part, i) => {
                          if (part.startsWith('**') && part.endsWith('**')) return <strong key={i} className="font-bold text-slate-900">{part.slice(2, -2)}</strong>;
                          if (part.startsWith('*') && part.endsWith('*')) return <em key={i} className="italic text-slate-800">{part.slice(1, -1)}</em>;
                          return part;
                        });
                      };
                  
                      return text.split('\n').map((line, lineIndex) => {
                        const tLine = line.trim();
                        if (tLine.startsWith('### ')) return <h4 key={lineIndex} className="text-xl font-black text-slate-800 mt-5 mb-2">{formatInline(tLine.replace(/^###\s/, ''))}</h4>;
                        if (tLine.startsWith('## ')) return <h3 key={lineIndex} className="text-2xl font-black text-slate-900 mt-6 mb-3 border-b border-slate-200 pb-2">{formatInline(tLine.replace(/^##\s/, ''))}</h3>;
                        if (tLine.startsWith('# ')) return <h2 key={lineIndex} className="text-3xl font-black text-indigo-900 mt-8 mb-4">{formatInline(tLine.replace(/^#\s/, ''))}</h2>;
                        if (tLine.startsWith('- ') || (tLine.startsWith('* ') && !tLine.endsWith('*'))) return <div key={lineIndex} className="flex gap-3 my-2 md:mr-6"><span className="text-indigo-500 font-bold mt-0.5">•</span><span className="flex-1">{formatInline(tLine.replace(/^[-*]\s/, ''))}</span></div>;
                        if (tLine.match(/^\d+\.\s/)) return <div key={lineIndex} className="flex gap-3 my-2 md:mr-6"><span className="text-indigo-600 font-black mt-0.5 min-w-[20px]">{tLine.match(/^\d+\./)[0]}</span><span className="flex-1">{formatInline(tLine.replace(/^\d+\.\s/, ''))}</span></div>;
                        if (tLine === '') return <div key={lineIndex} className="h-3"></div>;
                        return <div key={lineIndex} className="mb-2 leading-relaxed">{formatInline(line)}</div>;
                      });
                    };
                  
                    const formatDate = (timestamp) => {
                      if (!timestamp) return '';
                      const date = new Date(timestamp);
                      return date.toLocaleDateString('he-IL') + ' ' + date.toLocaleTimeString('he-IL', { hour: '2-digit', minute: '2-digit' });
                    };
                  
                  
                    // --- RENDER VIEWS ---
                  
                    // --- ARCHIVE VIEW COMPONENT ---
                    if (currentView === 'archive') {
                      const sortedArchive = getSortedArchive();
                      
                      return (
                        <div dir="rtl" className="min-h-screen bg-slate-100 text-slate-800 font-sans p-4 md:p-8 animate-in fade-in">
                          <div className="max-w-5xl mx-auto">
                            {/* Archive Header */}
                            <header className="bg-slate-900 rounded-2xl shadow-xl border border-slate-700 p-6 flex flex-col md:flex-row items-center justify-between text-white relative overflow-hidden mb-8">
                               <div className="flex items-center gap-4 relative z-10">
                                 <div className="p-4 bg-amber-500/20 border border-amber-500/40 text-amber-500 rounded-full"><Library className="w-8 h-8" /></div>
                                 <div><h1 className="text-3xl font-black text-transparent bg-clip-text bg-gradient-to-l from-amber-200 to-amber-500">ארכיון התקדימים</h1><p className="text-slate-400 font-medium">מאגר הפסיקה הרשמי</p></div>
                               </div>
                               <button onClick={() => setCurrentView('court')} className="mt-4 md:mt-0 flex items-center gap-2 bg-slate-800 hover:bg-slate-700 border border-slate-600 px-6 py-3 rounded-xl font-bold transition-colors z-10">
                                 <X className="w-5 h-5" /> חזור לאולם הדיונים
                               </button>
                               <div className="absolute top-0 left-0 opacity-5 transform scale-[2] -translate-y-10 -translate-x-10 pointer-events-none"><Landmark className="w-64 h-64" /></div>
                            </header>
                  
                            {/* Search, Sort & Filter Controls */}
                            {archiveItems.length > 0 && (
                              <div className="flex flex-col gap-4 mb-6 bg-white p-4 rounded-xl shadow-sm border border-slate-200">
                                <div className="relative w-full">
                                  <div className="absolute inset-y-0 right-0 flex items-center pr-3 pointer-events-none"><Search className="w-5 h-5 text-slate-400" /></div>
                                  <input type="text" value={archiveSearchTerm} onChange={handleArchiveSearchChange} placeholder="חיפוש בארכיון לפי נושא, זוכה או פסק דין..." className="w-full bg-slate-50 border border-slate-300 text-slate-800 rounded-xl focus:ring-indigo-500 focus:border-indigo-500 block pr-10 p-3 font-medium transition-all" />
                                </div>
                                <div className="flex flex-col md:flex-row items-start md:items-center justify-between gap-4 pt-2 border-t border-slate-100">
                                  <div className="flex items-center gap-2">
                                    <span className="text-sm font-bold text-slate-500 px-2 flex items-center gap-1"><Library className="w-4 h-4"/> מדור:</span>
                                    <select value={archiveCategoryFilter} onChange={(e) => setArchiveCategoryFilter(e.target.value)} className="bg-slate-50 border border-slate-300 text-slate-700 text-sm rounded-lg focus:ring-indigo-500 block p-2 font-bold">
                                      <option value="all">כל התיקים</option>{LEGAL_CATEGORIES.map(cat => <option key={cat} value={cat}>{cat}</option>)}
                                    </select>
                                  </div>
                                  <div className="flex items-center gap-2">
                                    <button onClick={() => setArchiveSort('newest')} className={`px-4 py-1.5 rounded-lg text-sm font-bold transition-colors ${archiveSort === 'newest' ? 'bg-indigo-100 text-indigo-700' : 'text-slate-600 hover:bg-slate-100'}`}>הכי חדשים</button>
                                    <button onClick={() => setArchiveSort('top')} className={`px-4 py-1.5 rounded-lg text-sm font-bold transition-colors ${archiveSort === 'top' ? 'bg-amber-100 text-amber-700' : 'text-slate-600 hover:bg-slate-100'}`}>תקדימים מובילים</button>
                                  </div>
                                </div>
                              </div>
                            )}
                  
                            {/* Archive List */}
                            {sortedArchive.length === 0 ? (
                              <div className="bg-white rounded-2xl p-12 text-center shadow border border-slate-200 text-slate-500">
                                <Library className="w-16 h-16 mx-auto mb-4 opacity-20" /><p className="text-xl font-bold">לא נמצאו תיקים תואמים.</p>
                              </div>
                            ) : (
                              <div className="grid grid-cols-1 gap-6">
                                {sortedArchive.map((item) => {
                                  const hasUpvoted = item.upvotes?.includes(user?.uid);
                                  const upvotesCount = item.upvotes?.length || 0;
                                  
                                  return (
                                  <div key={item.id} className="bg-white rounded-2xl shadow-sm border border-slate-200 overflow-hidden transition-all hover:shadow-md">
                                    <div onClick={() => setExpandedArchiveItem(expandedArchiveItem === item.id ? null : item.id)} className="p-6 cursor-pointer flex flex-col md:flex-row md:items-center justify-between gap-4 bg-slate-50/50 hover:bg-slate-50">
                                      <div className="flex-1">
                                        <div className="flex items-center flex-wrap gap-3 mb-3">
                                          {item.type === 'supreme' ? <span className="bg-red-100 text-red-700 border border-red-200 text-xs font-black px-3 py-1 rounded-full uppercase tracking-wider shadow-sm">פסק דין חלוט (העליון)</span> : <span className="bg-indigo-100 text-indigo-700 border border-indigo-200 text-xs font-bold px-3 py-1 rounded-full shadow-sm">ערכאה ראשונה</span>}
                                          <span className="bg-slate-200 text-slate-700 border border-slate-300 text-xs font-bold px-3 py-1 rounded-full flex items-center gap-1"><Briefcase className="w-3 h-3" /> {item.category || "סכסוכים כלליים"}</span>
                                          <span className="text-slate-400 text-sm flex items-center gap-1 font-mono"><Clock className="w-3 h-3"/> {formatDate(item.createdAt)}</span>
                                        </div>
                                        <h3 className="text-xl font-black text-slate-800">{item.topic}</h3>
                                      </div>
                                      <div className="shrink-0 flex items-center gap-4">
                                        <button onClick={(e) => toggleUpvote(e, item.id, item.upvotes)} className={`flex items-center gap-2 px-4 py-2 rounded-xl border transition-all ${hasUpvoted ? 'bg-indigo-50 border-indigo-200 text-indigo-700 shadow-inner' : 'bg-white border-slate-200 text-slate-500 hover:bg-slate-50'}`}>
                                          <ThumbsUp className={`w-5 h-5 ${hasUpvoted ? 'fill-indigo-500 text-indigo-500' : ''}`} /><span className="font-bold">{upvotesCount}</span>
                                        </button>
                                        <div className="flex items-center gap-2 bg-white px-4 py-2 rounded-xl border border-slate-200 shadow-sm"><span className="text-xs font-bold text-slate-500">זכה:</span><span className="text-lg font-black text-amber-600 truncate max-w-[150px]">{item.winner}</span></div>
                                      </div>
                                    </div>
                                    {expandedArchiveItem === item.id && (
                                      <div className="p-6 border-t border-slate-100 bg-slate-100 rounded-b-2xl">
                                        <div id={`archive-export-${item.id}`} className={`bg-white rounded-3xl shadow-xl overflow-hidden relative pb-6 ${item.type === 'supreme' ? 'border-4 border-slate-900' : 'border border-slate-300'}`}>
                                          {item.type === 'supreme' && <div className="absolute top-16 left-8 border-8 border-red-600 text-red-600 rounded-full w-40 h-40 flex items-center justify-center -rotate-12 opacity-20 font-black text-4xl">חלוט</div>}
                                          <div className={`flex flex-col items-center text-center ${item.type === 'supreme' ? 'bg-slate-900 border-b-8 border-amber-500 p-10' : 'bg-slate-900 border-b-4 border-amber-500 p-8'}`}>
                                            {item.type === 'supreme' ? <><Scale className="w-16 h-16 text-amber-500 mb-4" /><h2 className="text-4xl font-black text-white">העליון</h2><p className="text-amber-400 font-bold mt-2">פסק דין חלוט</p></> : <><Award className="w-14 h-14 text-amber-500 mb-3" /><h2 className="text-3xl font-black text-white">ערכאה ראשונה</h2><p className="text-slate-300 font-medium mt-2">{item.topic}</p></>}
                                          </div>
                                          <div className="p-8 md:p-12 prose prose-slate prose-lg max-w-none text-slate-800 whitespace-pre-wrap">{renderFormattedText(item.verdict)}</div>
                                        </div>
                                        <div className="mt-6 flex justify-center gap-4">
                                          <button onClick={() => handleExportImage(`archive-export-${item.id}`, `פסק_תמונה_${item.id}`)} disabled={isExporting !== null} className="flex items-center gap-2 bg-blue-100 text-blue-700 px-6 py-3 rounded-xl font-bold border border-blue-200 hover:bg-blue-200">
                                            {isExporting === `archive-export-${item.id}` ? <Loader2 className="w-5 h-5 animate-spin" /> : <ImageIcon className="w-5 h-5" />} תמונה
                                          </button>
                                          <button onClick={() => handleExportPDF(`archive-export-${item.id}`, `פסק_${item.id}`)} disabled={isExporting !== null} className="flex items-center gap-2 bg-rose-100 text-rose-700 px-6 py-3 rounded-xl font-bold border border-rose-200 hover:bg-rose-200">
                                            {isExporting === `archive-export-${item.id}` ? <Loader2 className="w-5 h-5 animate-spin" /> : <FileText className="w-5 h-5" />} PDF
                                          </button>
                                        </div>
                                      </div>
                                    )}
                                  </div>
                                )})}
                              </div>
                            )}
                          </div>
                        </div>
                      );
                    }
                  
                    // --- MAIN COURT COMPONENT ---
                    return (
                      <div dir="rtl" className="min-h-screen bg-slate-100 text-slate-800 font-sans p-4 md:p-8">
                        <div className="max-w-4xl mx-auto space-y-8">
                          
                          <header className="bg-slate-900 rounded-2xl shadow-xl border border-slate-700 p-6 text-center text-white relative overflow-hidden">
                            <div className="absolute top-4 left-4 z-20 flex gap-2">
                              <button onClick={() => setCurrentView('archive')} className="flex items-center gap-2 bg-slate-800 hover:bg-slate-700 border border-slate-600 text-slate-200 px-4 py-2 rounded-xl text-sm font-bold transition-colors shadow-md">
                                <Library className="w-4 h-4 text-amber-400" /> מאגר הפסיקה
                              </button>
                            </div>
                            <div className="absolute top-0 right-0 opacity-10 transform scale-150 -translate-y-10 translate-x-10"><Scale className="w-64 h-64" /></div>
                            <div className="flex justify-center mb-4 relative z-10"><div className="p-4 bg-slate-800 border border-slate-600 text-amber-500 rounded-full shadow-lg"><Scale className="w-10 h-10" /></div></div>
                            <h1 className="text-3xl font-black mb-2 relative z-10 tracking-wide text-transparent bg-clip-text bg-gradient-to-l from-amber-200 to-amber-500">בית המשפט האזרחי</h1>
                            <p className="text-slate-400 relative z-10 font-medium">ערכאת שפיטה מבוססת בינה מלאכותית לפי היגיון טבעי.</p>
                          </header>
                  
                          {appealState === 'none' && !verdict && (
                            <div className="space-y-6 animate-in fade-in">
                              <div className="bg-white rounded-2xl shadow-md border border-slate-200 p-6">
                                <label className="block text-lg font-bold text-slate-800 mb-3 flex items-center gap-2"><AlertCircle className="w-5 h-5 text-indigo-600" /> מהות התביעה / הסכסוך</label>
                                <input type="text" value={topic} onChange={(e) => setTopic(e.target.value)} placeholder="לדוגמה: הפרת חוזה, סכסוך בעלות..." className="w-full bg-slate-50 border border-slate-300 rounded-xl px-4 py-3 text-slate-800 focus:outline-none focus:ring-2 focus:ring-indigo-500 font-medium" />
                              </div>
                  
                              <div className="space-y-4">
                                <div className="flex items-center justify-between px-2">
                                  <h2 className="text-xl font-bold text-slate-800 flex items-center gap-2"><Briefcase className="w-5 h-5 text-indigo-600" /> תצהירי וראיות הצדדים</h2>
                                  <button onClick={handleAddParty} className="flex items-center gap-1 text-sm font-bold text-indigo-700 bg-indigo-100 px-4 py-2 rounded-lg hover:bg-indigo-200 transition-colors"><UserPlus className="w-4 h-4" /> הוסף צד</button>
                                </div>
                  
                                <div className="grid grid-cols-1 gap-4">
                                  {parties.map((party, index) => (
                                    <div key={party.id} className="bg-white rounded-2xl shadow-sm border border-slate-200 p-5 md:p-6 relative group border-t-4 border-t-slate-700">
                                      {parties.length > 2 && <button onClick={() => handleRemoveParty(party.id)} className="absolute top-4 left-4 text-slate-300 hover:text-red-500"><Trash2 className="w-5 h-5" /></button>}
                                      
                                      <div className="mb-4">
                                        <label className="block text-sm font-bold text-slate-500 mb-1">שם הצד המעורב ({index + 1})</label>
                                        <input type="text" value={party.name} onChange={(e) => handleChange(party.id, 'name', e.target.value)} placeholder="שם מלא / חברה..." className="w-full border-b-2 border-slate-200 px-2 py-2 text-lg font-bold bg-transparent focus:border-indigo-500 transition-colors outline-none" />
                                      </div>
                                      
                                      <div className="mb-4">
                                        <div className="flex justify-between items-end mb-1">
                                          <label className="block text-sm font-bold text-slate-500">תצהיר משפטי (טענה)</label>
                                          {party.claim.trim().length > 5 && (
                                            <button onClick={() => handleLegalCounsel(party.id, party.claim)} disabled={counselLoadingId !== null} className="text-xs font-bold text-indigo-600 hover:text-indigo-800 flex items-center gap-1 bg-indigo-50 hover:bg-indigo-100 px-2 py-1 rounded transition-colors">
                                              {counselLoadingId === party.id ? <Loader2 className="w-3 h-3 animate-spin"/> : <Wand2 className="w-3 h-3"/>} נסח בעזרת עו"ד
                                            </button>
                                          )}
                                        </div>
                                        <textarea value={party.claim} onChange={(e) => handleChange(party.id, 'claim', e.target.value)} disabled={counselLoadingId === party.id} placeholder="פרט את גרסתך המלאה לאירועים..." className={`w-full border border-slate-200 rounded-xl px-4 py-3 text-slate-700 min-h-[100px] resize-y focus:ring-2 focus:ring-indigo-500 transition-all ${counselLoadingId === party.id ? 'bg-indigo-50 animate-pulse' : 'bg-slate-50'}`} />
                                      </div>
                  
                                      {/* Evidence Upload Section */}
                                      <div className="bg-slate-100 p-4 rounded-xl border border-slate-200">
                                        <div className="flex items-center justify-between mb-3">
                                          <span className="text-xs font-bold text-slate-500 flex items-center gap-1"><Paperclip className="w-4 h-4"/> הוכחות וראיות (עד 5 תמונות/מסמכים)</span>
                                          <label className={`cursor-pointer text-xs font-bold flex items-center gap-1 px-3 py-1.5 rounded shadow-sm transition-colors ${party.evidence?.length >= 5 ? 'bg-slate-200 text-slate-400 cursor-not-allowed' : 'bg-white text-indigo-600 hover:text-indigo-800 hover:bg-indigo-50 border border-indigo-200'}`}>
                                            <FileUp className="w-4 h-4" /> צרף קובץ
                                            <input type="file" multiple accept="image/*,.txt" className="hidden" onChange={(e) => handleFileChange(party.id, e)} disabled={party.evidence?.length >= 5} />
                                          </label>
                                        </div>
                                        <div className="flex flex-wrap gap-2">
                                          {(!party.evidence || party.evidence.length === 0) ? (
                                            <span className="text-xs text-slate-400 italic">לא צורפו ראיות מטעם צד זה.</span>
                                          ) : (
                                            party.evidence.map((ev, idx) => (
                                              <div key={idx} className="flex items-center gap-2 bg-white border border-slate-300 pl-2 pr-3 py-1.5 rounded-lg text-xs shadow-sm animate-in zoom-in-95">
                                                {ev.type === 'image' ? <ImageIcon className="w-4 h-4 text-blue-500"/> : <FileText className="w-4 h-4 text-amber-500"/>}
                                                <span className="truncate max-w-[120px] font-medium text-slate-700" title={ev.name}>{ev.name}</span>
                                                <button onClick={() => removeEvidence(party.id, idx)} className="text-slate-300 hover:text-red-500 transition-colors ml-1"><XCircle className="w-4 h-4"/></button>
                                              </div>
                                            ))
                                          )}
                                        </div>
                                      </div>
                  
                                    </div>
                                  ))}
                                </div>
                              </div>
                  
                              {error && <div className="bg-red-50 border border-red-200 text-red-700 px-4 py-3 rounded-xl flex items-center gap-2 font-bold"><AlertCircle className="w-5 h-5 shrink-0" /><p>{error}</p></div>}
                  
                              <div className="flex justify-center pt-4">
                                <button onClick={initiateCase} disabled={isLoading} className="flex items-center gap-3 bg-slate-900 hover:bg-slate-800 text-white px-10 py-4 rounded-2xl font-bold text-xl shadow-lg transition-all disabled:opacity-70">
                                  {isLoading ? <><Loader2 className="w-6 h-6 animate-spin" /> מנתח תצהירים וראיות...</> : <><Scale className="w-6 h-6" /> הגש תצהירים לשופט וקבל פסק</>}
                                </button>
                              </div>
                            </div>
                          )}
                  
                          {/* --- INITIAL VERDICT DISPLAY --- */}
                          {verdict && appealState === 'none' && (
                            <div id="verdict-section" className="mt-8 animate-in slide-in-from-bottom-8 duration-700">
                              <div id="verdict-export-area" className="bg-white rounded-3xl shadow-2xl border border-slate-300 overflow-hidden relative pb-6">
                                <div className="bg-slate-900 border-b-4 border-amber-500 p-8 flex flex-col items-center text-center">
                                  <Award className="w-14 h-14 text-amber-500 mb-3" />
                                  <h2 className="text-3xl font-black text-white">פסק דין - ערכאה ראשונה</h2>
                                  <p className="text-slate-300 mt-2">תיק: {topic}</p>
                                </div>
                                <div className="p-8 md:p-12 prose prose-slate prose-lg max-w-none text-slate-800">{renderFormattedText(verdict)}</div>
                                {winner && (
                                  <div className="bg-slate-50 border border-slate-200 p-6 flex flex-col items-center justify-center text-center mx-8 rounded-2xl shadow-inner">
                                    <div className="text-slate-500 font-bold uppercase tracking-widest mb-3">בית המשפט פוסק כי הצד הזוכה הוא:</div>
                                    <div className="text-4xl font-black text-indigo-700 bg-white px-12 py-5 rounded-full shadow-md border border-indigo-100">{winner}</div>
                                  </div>
                                )}
                              </div>
                  
                              <div className="mt-6 flex flex-col gap-4">
                                <div className="flex flex-wrap justify-center gap-4 bg-white p-4 rounded-2xl shadow-sm border border-slate-200">
                                  <button onClick={() => saveToArchive('initial')} disabled={isSavingToArchive || savedStatus === 'initial'} className="flex items-center gap-2 bg-amber-100 text-amber-800 px-6 py-3 rounded-xl font-bold border border-amber-300 disabled:opacity-50 transition-colors hover:bg-amber-200">
                                    {isSavingToArchive ? <Loader2 className="w-5 h-5 animate-spin" /> : savedStatus === 'initial' ? <Check className="w-5 h-5" /> : <Library className="w-5 h-5" />} תעד בארכיון
                                  </button>
                                  <button onClick={() => handleExportImage('verdict-export-area', `פסק_דין_תמונה_${topic.replace(/\s+/g, '_')}`)} disabled={isExporting !== null} className="flex items-center gap-2 bg-blue-50 text-blue-700 hover:bg-blue-100 px-6 py-3 rounded-xl font-bold transition-colors border border-blue-200">
                                    {isExporting === 'verdict-export-area' ? <Loader2 className="w-5 h-5 animate-spin" /> : <ImageIcon className="w-5 h-5" />} שמור כתמונה
                                  </button>
                                  <button onClick={() => handleExportPDF('verdict-export-area', `פסק_דין_${topic.replace(/\s+/g, '_')}`)} disabled={isExporting !== null} className="flex items-center gap-2 bg-slate-100 text-slate-700 hover:bg-slate-200 px-6 py-3 rounded-xl font-bold transition-colors border border-slate-300">
                                    {isExporting === 'verdict-export-area' ? <Loader2 className="w-5 h-5 animate-spin" /> : <FileText className="w-5 h-5" />} ייצא כ-PDF (מרובה עמודים)
                                  </button>
                                </div>
                                <div className="flex flex-wrap justify-center gap-4">
                                  <button onClick={() => setAppealState('setup')} className="flex items-center gap-2 bg-rose-600 text-white px-6 py-3 rounded-xl font-bold shadow-md hover:bg-rose-700 transition-colors"><RefreshCw className="w-5 h-5" /> בקשת ערעור</button>
                                  <button onClick={resetCourt} className="bg-slate-200 px-6 py-3 rounded-xl font-bold hover:bg-slate-300 transition-colors">סגור תיק</button>
                                </div>
                              </div>
                            </div>
                          )}
                  
                          {/* Appeal Setup */}
                          {appealState === 'setup' && (
                            <div className="bg-white rounded-3xl shadow-xl border-2 border-indigo-200 overflow-hidden mt-8 animate-in zoom-in-95">
                              <div className="bg-indigo-50 border-b border-indigo-100 p-6">
                                <h3 className="text-2xl font-black text-indigo-900 flex items-center gap-3"><Briefcase className="w-7 h-7 text-indigo-600" /> הגשת ערעור</h3>
                              </div>
                              <div className="p-6 space-y-6">
                                <select value={appellantName} onChange={(e) => setAppellantName(e.target.value)} className="w-full bg-slate-50 border border-slate-300 rounded-xl px-4 py-3 font-bold">
                                  <option value="" disabled>בחר צד מערער...</option>{parties.map(p => <option key={p.id} value={p.name}>{p.name}</option>)}
                                </select>
                                <textarea value={appealInput} onChange={(e) => setAppealInput(e.target.value)} placeholder="הסבר לעורך הדין למה הפסק שגוי..." className="w-full bg-slate-50 border border-slate-300 rounded-xl px-4 py-3 min-h-[100px]" />
                                <div className="flex justify-end gap-3"><button onClick={handleAppealRound} disabled={!appellantName || !appealInput.trim() || isDebating} className="bg-indigo-600 text-white px-8 py-3 rounded-xl font-bold hover:bg-indigo-700 transition-colors">הפעל ייצוג משפטי</button></div>
                              </div>
                            </div>
                          )}
                  
                          {/* Debate */}
                          {appealState === 'debating' && (
                            <div className="bg-white rounded-3xl shadow-xl border-2 border-slate-300 overflow-hidden mt-8 flex flex-col h-[700px]">
                              <div className="bg-slate-900 p-5 text-white shrink-0"><h3 className="font-black text-lg">ערכאת הערעור</h3></div>
                              <div className="flex-1 overflow-y-auto p-6 space-y-6 bg-slate-50">
                                {debateMessages.map((msg, idx) => (
                                  <div key={idx} className={`flex gap-4 max-w-[85%] ${msg.role === 'lawyer' ? 'ml-auto flex-row' : 'mr-auto flex-row-reverse'}`}>
                                    <div className={`shrink-0 w-12 h-12 rounded-full flex items-center justify-center ${msg.role === 'lawyer' ? 'bg-indigo-600 text-white' : 'bg-rose-700 text-white'}`}>{msg.role === 'lawyer' ? <Briefcase className="w-6 h-6" /> : <Shield className="w-6 h-6" />}</div>
                                    <div className={`p-5 rounded-2xl shadow-sm border ${msg.role === 'lawyer' ? 'bg-indigo-50 border-indigo-100' : 'bg-rose-50 border-rose-100'}`}>
                                       <div className="text-slate-800">{renderFormattedText(msg.content)}</div>
                                    </div>
                                  </div>
                                ))}
                                {isDebating && <div className="text-center font-bold text-indigo-500 animate-pulse">{debateStatus}</div>}
                                <div ref={debateEndRef} />
                              </div>
                              <div className="bg-white border-t border-slate-200 p-5 shrink-0 space-y-4">
                                <div className="flex gap-3">
                                  <input type="text" value={appealInput} onChange={(e) => setAppealInput(e.target.value)} disabled={isDebating} className="flex-1 bg-slate-100 border border-slate-300 rounded-xl px-4" />
                                  <button onClick={handleAppealRound} disabled={isDebating || !appealInput.trim()} className="bg-indigo-600 text-white px-6 py-3 rounded-xl font-bold hover:bg-indigo-700 transition-colors"><Send className="w-5 h-5" /></button>
                                </div>
                                <button onClick={handleFinalSupremeVerdict} disabled={isDebating} className="w-full bg-amber-500 hover:bg-amber-600 transition-colors text-slate-900 py-3 rounded-xl font-black">בקש פסק דין עליון (הרכב 3 שופטים)</button>
                              </div>
                            </div>
                          )}
                  
                          {/* Supreme Verdict */}
                          {appealState === 'final' && finalVerdict && (
                             <div id="supreme-verdict-section" className="mt-12 animate-in zoom-in-95">
                               <div id="supreme-export-area" className="bg-white rounded-3xl shadow-2xl border-4 border-slate-900 overflow-hidden relative pb-6">
                                 <div className="absolute top-16 left-8 border-8 border-red-600 text-red-600 rounded-full w-40 h-40 flex items-center justify-center -rotate-12 pointer-events-none font-black text-4xl tracking-tighter opacity-20">חלוט</div>
                                 <div className="bg-slate-900 border-b-8 border-amber-500 p-10 text-center text-white">
                                   <Scale className="w-16 h-16 text-amber-500 mx-auto mb-4" />
                                   <h2 className="text-4xl font-black">בית המשפט העליון</h2>
                                   <p className="text-amber-400 font-bold mt-2 text-xl tracking-wider">פסק דין סופי וחלוט בערעור</p>
                                 </div>
                                 <div className="p-8 md:p-12 prose prose-slate prose-lg max-w-none text-slate-800">{renderFormattedText(finalVerdict)}</div>
                                 {finalWinner && (
                                   <div className="bg-slate-100 border border-slate-300 p-8 flex flex-col items-center justify-center text-center mx-8 mt-4 rounded-2xl shadow-inner">
                                     <div className="text-slate-500 font-black uppercase tracking-widest mb-4">הכרעת הרוב בהחלט - הצד הזוכה:</div>
                                     <div className="text-5xl font-black text-slate-900 bg-white px-16 py-6 rounded-full shadow-lg border-2 border-slate-400">{finalWinner}</div>
                                   </div>
                                 )}
                               </div>
                               
                               <div className="mt-8 flex flex-col gap-4">
                                 <div className="flex flex-wrap justify-center gap-4 bg-white p-4 rounded-2xl shadow-sm border border-slate-200">
                                    <button onClick={() => saveToArchive('supreme')} disabled={isSavingToArchive || savedStatus === 'supreme'} className="flex items-center gap-2 bg-amber-100 text-amber-800 hover:bg-amber-200 px-8 py-4 rounded-xl font-bold transition-colors disabled:opacity-50 border border-amber-300 shadow-md">
                                      {isSavingToArchive ? <Loader2 className="w-6 h-6 animate-spin" /> : savedStatus === 'supreme' ? <Check className="w-6 h-6" /> : <Library className="w-6 h-6" />}
                                      {savedStatus === 'supreme' ? 'הפסק חרוט בארכיון!' : 'תעד כחלוט בארכיון'}
                                    </button>
                                    <button onClick={() => handleExportImage('supreme-export-area', `פסק_עליון_תמונה_${topic.replace(/\s+/g, '_')}`)} disabled={isExporting !== null} className="flex items-center gap-2 bg-blue-50 text-blue-700 hover:bg-blue-100 px-8 py-4 rounded-xl font-bold transition-colors border border-blue-200">
                                      {isExporting === 'supreme-export-area' ? <Loader2 className="w-5 h-5 animate-spin" /> : <ImageIcon className="w-5 h-5" />} שמור כתמונה
                                    </button>
                                    <button onClick={() => handleExportPDF('supreme-export-area', `פסק_דין_עליון_${topic.replace(/\s+/g, '_')}`)} disabled={isExporting !== null} className="flex items-center gap-2 bg-slate-800 text-white hover:bg-slate-700 px-8 py-3 rounded-xl font-bold shadow-md transition-colors border border-slate-900">
                                      {isExporting === 'supreme-export-area' ? <Loader2 className="w-5 h-5 animate-spin" /> : <FileText className="w-5 h-5" />} ייצא מסמך (PDF)
                                    </button>
                                 </div>
                                 <div className="flex flex-wrap justify-center gap-4">
                                   <button onClick={resetCourt} className="flex items-center gap-2 bg-white border border-slate-300 text-slate-700 hover:bg-slate-50 px-8 py-3 rounded-xl font-bold shadow-sm transition-colors">
                                     סגור את התיק במערכת
                                   </button>
                                 </div>
                               </div>
                             </div>
                          )}
                  
                        </div>
                      </div>
                    );
                  }
                  

                  תגובה 1 תגובה אחרונה
                  1
                  • CSS 0C CSS 0

                    @אאA זה לא יתכן.. כי יש 7880 חוקים, ואין קובץ אחד עם כל החוקים ולעלות את כל החוקים אחד אחד זה משימה בלתי אפשרית...

                    יאיר דניאלי מנותק
                    יאיר דניאלי מנותק
                    יאיר דניאל
                    כתב נערך לאחרונה על ידי
                    #26

                    @CSS-0 כתב בשיתוף | תוכנת בית משפט מתקדמת.:

                    ואין קובץ אחד עם כל החוקים

                    יש בZIM של ויקיטקסט

                    CSS 0C תגובה 1 תגובה אחרונה
                    0
                    • CSS 0C CSS 0

                      בניתי תוכנת "בית משפט" זאת אומרת התוכנה מקבלת טענות משתי צדדים ובעזרת AI פוסקת את הדין התוכנה כוללת

                      • עיצוב מקצועי.
                      • יצוא ל PNG / PDF.
                      • ארכיון לשמירה שכולם יוכלו לראות את הפסק.
                      • לילוק על פסקים בארכיון.
                      • הגשת ערור על המשפט, כולל קבלת קטגור וסנגור AI.
                        אין מדובר על משפט אמת וגם זה לא על בסיס חוקים אמיתיים!

                      גרסאות:
                      גרסה 1
                      גרסה 2
                      גרסה 3
                      גרסה 4
                      גרסה חמישית משופרת ואחרונה:
                      גרסה 5

                      T מנותק
                      T מנותק
                      The_Yonatan
                      כתב נערך לאחרונה על ידי
                      #27

                      @CSS-0 אולי תחבר לו כבר מאגרים של נטהמשפט ועוד וזה יהפוך למשהוא אמיתי ואמין? זה מאוד יעזור

                      CSS 0C תגובה 1 תגובה אחרונה
                      0
                      • T The_Yonatan

                        @CSS-0 אולי תחבר לו כבר מאגרים של נטהמשפט ועוד וזה יהפוך למשהוא אמיתי ואמין? זה מאוד יעזור

                        CSS 0C מנותק
                        CSS 0C מנותק
                        CSS 0
                        כתב נערך לאחרונה על ידי
                        #28

                        @The_Yonatan תחשוב על זה שכל פעם שמישהו מגיש משפט ה AI צריך לסרוק את כל ה 7780 חוקים שיש... זה נועד בשביל הצחוק וההיגיון לא "על אמת"

                        תגובה 1 תגובה אחרונה
                        0
                        • יאיר דניאלי יאיר דניאל

                          @CSS-0 כתב בשיתוף | תוכנת בית משפט מתקדמת.:

                          ואין קובץ אחד עם כל החוקים

                          יש בZIM של ויקיטקסט

                          CSS 0C מנותק
                          CSS 0C מנותק
                          CSS 0
                          כתב נערך לאחרונה על ידי
                          #29

                          @יאיר-דניאל יש לך דרך לחלץ משם? וגם עם תחלץ, איך אני יעלה את זה הרי זה רץ בקנבס.

                          י יאיר דניאלי 2 תגובות תגובה אחרונה
                          0
                          • CSS 0C CSS 0

                            @יאיר-דניאל יש לך דרך לחלץ משם? וגם עם תחלץ, איך אני יעלה את זה הרי זה רץ בקנבס.

                            י מנותק
                            י מנותק
                            י.ר.ק
                            כתב נערך לאחרונה על ידי
                            #30

                            @CSS-0 תגיד לג'מיני שיכניס לו מערכת חוקים והחוקים זה הקובץ שהעלת לו

                            CSS 0C תגובה 1 תגובה אחרונה
                            0
                            • י י.ר.ק

                              @CSS-0 תגיד לג'מיני שיכניס לו מערכת חוקים והחוקים זה הקובץ שהעלת לו

                              CSS 0C מנותק
                              CSS 0C מנותק
                              CSS 0
                              כתב נערך לאחרונה על ידי
                              #31

                              @י.ר.ק הוא לא יוכל להכניס משהו באזור ה 20,000 שורות...

                              י תגובה 1 תגובה אחרונה
                              0
                              • CSS 0C CSS 0

                                @י.ר.ק הוא לא יוכל להכניס משהו באזור ה 20,000 שורות...

                                י מנותק
                                י מנותק
                                י.ר.ק
                                כתב נערך לאחרונה על ידי י.ר.ק
                                #32

                                @CSS-0 ניסית? כי אני הכנסתי לו למשהו מעל 2000 (נראה לי) וזה עבד אבל לא פרסמתי

                                CSS 0C ה 2 תגובות תגובה אחרונה
                                0
                                • י י.ר.ק

                                  @CSS-0 ניסית? כי אני הכנסתי לו למשהו מעל 2000 (נראה לי) וזה עבד אבל לא פרסמתי

                                  CSS 0C מנותק
                                  CSS 0C מנותק
                                  CSS 0
                                  כתב נערך לאחרונה על ידי CSS 0
                                  #33

                                  @י.ר.ק לא 2,000 את זה הוא בקלות עושה, אנחנו מדברים על 20,000!!!

                                  תגובה 1 תגובה אחרונה
                                  0
                                  • י י.ר.ק

                                    @CSS-0 ניסית? כי אני הכנסתי לו למשהו מעל 2000 (נראה לי) וזה עבד אבל לא פרסמתי

                                    ה מנותק
                                    ה מנותק
                                    המלאך
                                    כתב נערך לאחרונה על ידי
                                    #34

                                    @י.ר.ק יש מגבלת טוקנים.

                                    תגובה 1 תגובה אחרונה
                                    0
                                    • CSS 0C CSS 0

                                      @יאיר-דניאל יש לך דרך לחלץ משם? וגם עם תחלץ, איך אני יעלה את זה הרי זה רץ בקנבס.

                                      יאיר דניאלי מנותק
                                      יאיר דניאלי מנותק
                                      יאיר דניאל
                                      כתב נערך לאחרונה על ידי
                                      #35

                                      @CSS-0 כתב בשיתוף | תוכנת בית משפט מתקדמת.:

                                      יש לך דרך לחלץ משם

                                      לא, אני לא יודע איך עושים זאת, אל אולי מישהו פה יודע

                                      CSS 0C תגובה 1 תגובה אחרונה
                                      0
                                      • יאיר דניאלי יאיר דניאל

                                        @CSS-0 כתב בשיתוף | תוכנת בית משפט מתקדמת.:

                                        יש לך דרך לחלץ משם

                                        לא, אני לא יודע איך עושים זאת, אל אולי מישהו פה יודע

                                        CSS 0C מנותק
                                        CSS 0C מנותק
                                        CSS 0
                                        כתב נערך לאחרונה על ידי
                                        #36

                                        @יאיר-דניאל כתב בשיתוף | תוכנת בית משפט מתקדמת.:

                                        לא, אני לא יודע איך עושים זאת, אל אולי מישהו פה יודע

                                        גם עם היה זה לא משנה כי זה לא אפשרי לעבור על 20,000 שורות...

                                        א תגובה 1 תגובה אחרונה
                                        0
                                        • CSS 0C CSS 0

                                          @יאיר-דניאל כתב בשיתוף | תוכנת בית משפט מתקדמת.:

                                          לא, אני לא יודע איך עושים זאת, אל אולי מישהו פה יודע

                                          גם עם היה זה לא משנה כי זה לא אפשרי לעבור על 20,000 שורות...

                                          א מנותק
                                          א מנותק
                                          ארי
                                          כתב נערך לאחרונה על ידי
                                          #37

                                          @CSS-0 תחבר את זה לנוט בוק יצא עדכון שיכול לחבר את גמיני עם נוטבוק

                                          CSS 0C 2 תגובות תגובה אחרונה
                                          0

                                          • התחברות

                                          • אין לך חשבון עדיין? הרשמה

                                          • התחברו או הירשמו כדי לחפש.
                                          • פוסט ראשון
                                            פוסט אחרון
                                          0
                                          • חוקי הפורום
                                          • פופולרי
                                          • לא נפתר
                                          • משתמשים
                                          • חיפוש גוגל בפורום
                                          • צור קשר