summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPaul Buetow <paul@buetow.org>2008-08-09 01:08:47 +0000
committerPaul Buetow <paul@buetow.org>2008-08-09 01:08:47 +0000
commitbbccf49e3e8d05c73789672be62a3cf9e549b099 (patch)
tree083a983ad644c49b1b2fcb7d983631ae8e781d95
parent5394e194af61592a9f82ebe4b9bc310ac3dee1c1 (diff)
written a lot
-rw-r--r--LaTeX/chapters/implementierung.tex132
-rw-r--r--LaTeX/chapters/simulator.tex1
-rw-r--r--LaTeX/diplomarbeit.pdf5784
-rw-r--r--LaTeX/images/ss-protokollvariablen.pngbin0 -> 27355 bytes
-rw-r--r--ROADMAP3
-rw-r--r--sources/prefs/VSDefaultPrefs.java2
-rw-r--r--sources/protocols/VSAbstractProtocol.java2
7 files changed, 3175 insertions, 2749 deletions
diff --git a/LaTeX/chapters/implementierung.tex b/LaTeX/chapters/implementierung.tex
index 8b3b8a8..25dd82e 100644
--- a/LaTeX/chapters/implementierung.tex
+++ b/LaTeX/chapters/implementierung.tex
@@ -131,6 +131,7 @@ Die Klasse \textit{VSSimulatorEditor} dient f\"{u}r das Editieren der globalen S
F\"{u}r Protokolle gibt es keine separate Editor-Klasse, da sie bereits vom Prozesseditor aus editiert werden k\"{o}nnen. Dabei iteriert der Prozesseditor \"{u}ber alle f\"{u}r den jeweiligen Prozess verf\"{u}gbaren Protokollobjekte und f\"{u}gt deren Variablen zus\"{a}tzlich in den Prozesseditor ein. Somit erscheinen die Prozess- und die dazugeh\"{o}rigen Protokollvariablen im selben Editor, womit dem Benutzer eine bessere \"{U}bersicht geboten wird.
+\newpage
\section{Ereignisse}
\subsection{Funktionsweise von Ereignissen}
@@ -184,7 +185,7 @@ Des Weiteren werden folgende nicht-abstrakte Methoden von \textit{VSAbstractEven
Jede Ereiginsklasse hat zudem Zugriff auf folgende Attribute, die von \textit{VSAbstractEvent} vererbt werden:
\begin{itemize}
- \item \textit{protected VSPrefs prefs}: Eine Referenz auf das Simulationseinstellungsobjekt. Hier\"{u}ber lassen sich alle Simulationseinstellungen beziehen. \textit{prefs} ist nicht zu verwechseln mit den TODO
+ \item \textit{protected VSPrefs prefs}: Eine Referenz auf das Simulationseinstellungsobjekt. Hier\"{u}ber lassen sich alle Simulationseinstellungen beziehen.
\item \textit{protected VSAbstractProcess process}: Eine Referenz auf das Prozessobjekt des jeweiligen Prozesses, auf welches das Ereignis angewendet wird.
\end{itemize}
@@ -202,18 +203,19 @@ extends VSAbstractEvent implements VSCopyableEvent {
}
public void onInit() {
- setClassname(getClass().toString());
+ super.setClassname(super.getClass().toString());
}
public void onStart() {
if (!process.isCrashed()) {
process.isCrashed(true);
- logg(prefs.getString("lang.crashed"));
+ super.logg(prefs.getString("lang.crashed"));
}
}
}
\end{code}
+\newpage
\section{Zeitformate, Prozesse, Nachrichten sowie Task-Manager}
\subsection{Funktionsweise}
@@ -270,6 +272,7 @@ void createCrashAndRecoverExample(VSTaskManager taskManager,
In diesem Beispiel wurden zwei Ereignisse (Absturz- und Wiederbelebung eines gegebenen Prozesses) angelegt. Das Absturzereignis tritt bei der aktuellen lokalen Prozesszeit plus \textit{500ms} ein, w\"{a}hrend das Wiederbelebungsereignis bei einer globalen Zeit von \textit{2000ms} stattfindet. F\"{u}r den Fall, dass das Wiederbelebungsereignis vor dem Absturzereignis eintritt wird es nicht ausgef\"{u}hrt, da der Prozess noch nicht abgest\"{u}rzt ist.
+\newpage
\section{Protokolle}
\subsection{Funktionsweise des Protokoll-APIs}
@@ -281,11 +284,21 @@ In diesem Beispiel wurden zwei Ereignisse (Absturz- und Wiederbelebung eines geg
\label{fig:PackageProtocols}
\end{figure}
-In diesem Abschnitt wird auf die Implementierung der Protokolle eingegangen. Auf Abbildung \ref{fig:PackageProtocols} sind die Pakete \textit{protocols} und \textit{protocols.implementations} dargestellt, welche f\"{u}r die Protokollimplementierungen zust\"{a}ndig sind. \textit{VSAbstractProtocol} stellt lediglich gemeinsame Methoden und Attribute zur Verf\"{u}gung, die von allen Protokollen verwendet werden k\"{o}nnen. Jedes Protokoll hat im Paket \textit{protocols.implementations} seine eigene Klasse, die von \textit{VSAbstractProtocol} erbt. Wie bereits erw\"{a}hnt erbt \textit{VSAbstractProtocol} von \textit{VSAbstractEvent}, sodass jedes Protokoll auch als Ereignis (Server- beziehnungsweise Clientanfrage starten) eingesetzt werden kann.
+In diesem Abschnitt wird auf die Implementierung der Protokolle eingegangen. Auf Abbildung \ref{fig:PackageProtocols} sind die Pakete \textit{protocols} und \textit{protocols.implementations} dargestellt, welche f\"{u}r die Protokollimplementierungen zust\"{a}ndig sind. \textit{VSAbstractProtocol} stellt lediglich gemeinsame Methoden und Attribute zur Verf\"{u}gung, die von allen Protokollen verwendet werden k\"{o}nnen. Jedes Protokoll hat im Paket \textit{protocols.implementations} seine eigene Klasse, die von \textit{VSAbstractProtocol} erbt. Im Prinzip besitzt jedes Prozessobjekt von jedem Protokoll seine eigene Instanz. Bei \textit{10} Protokollen und \textit{3} beteiligten Prozessen werden also \textit{30} Protokollobjekte verwendet. Jedes Protokollobjekt verwaltet sowohl die Server- als auch die Clientseite eines Protokolls auf einmal. Dabei merkt sich \textit{VSAbstractProtocol} anhand eines Flags ob der aktuelle Kontext server- oder clientbezogen ist und f\"{u}hrt dementsprechen beim Eintreffen von Ereignissen die Server- beziehungsweise Clientmethoden des Protokolls auf. \textit{VSAbstractProtocol} \"{u}berpr\"{u}ft auch, ob Client oder Server \"{u}berhaupt aktiviert ist. Nur wenn der Server oder Client aktiviert ist, reagiert der Server beziehungsweise der Cleint wenn f\"{u}r sie ein Ereignis eintritt.
-Jede Protokollklasse mu die folgenden Methoden implementieren:
+\begin{figure}[h]
+ \centering
+ \includegraphics[width=10cm]{images/ss-protokollvariablen}
+ \caption{Protokollvariablen im Prozesseditor}
+ \label{fig:Protokollvariablen}
+\end{figure}
+
+Es ist bereits bekannt, dass Protokolle auch eigene vom Anwender im Prozesseditor editierbare Variablen haben k\"{o}nnen. Da \textit{VSAbstractProtocol} von \textit{VSAbstractEvent} erbt, was wiederum von \textit{VSPrefs} erbt, werden alle Protokollvariablen einfach in die Mutterklasse \textit{VSPrefs} abgelegt. Zum Beispiel kann mit \textit{super.setBoolean(``test'', true);} eine neue Protokollvariable ``true'' angelegt werden. Anhand eines sp\"{a}teren Beispiels wird dies noch weiter verdeutlicht.
+
+Da der Simulator daf\"{u}r ausgelegt wurde eigene Protokolle zu implementieren, werden im Folgenden alle verf\"{u}gbaren Protokoll-API-Methoden etwas ausf\"{u}hrlicher als gewohnt beschrieben. Jede Protokollklasse mu die folgenden Methoden implementieren:
\begin{itemize}
+ \setlength{\itemsep}{-2mm}
\item Einen \"{o}ffentlichen (\textit{public}) Konstruktor. Der Konstruktor mu angeben, ob bei dem gegebene Protokoll der Client oder der Server die Anfragen startet.
\item \textit{abstract public void onClientInit()}: Bevor das Protokollobjekt benutzt werden kann, mu es initialisiert werden. Diese Methode wird vor dem ersten Verwenden des Protokolls innerhalb einer Simulation ausgef\"{u}hrt. In der Regel werden hier Protokollvariablen unter Verwendung von \textit{VSPrefs} und Attribute der Protokollklasse initialisiert. Die hier initialisierten Protokollvariablen lassen sich vom Benutzer im Prozesseditor des jeweiligen Prozesses editieren.
\item \textit{abstract public void onClientReset()}: Dese Methode wird jedes Mal ausgef\"{u}hrt, wenn die Simulation zur\"{u}ckgesetzt wird.
@@ -295,13 +308,76 @@ Jede Protokollklasse mu die folgenden Methoden implementieren:
\item \textit{public String toString()}: Diese Methode ist nur optional. Hiermit lassen sich die Loggnachrichten eines Protokolls anpassen. Wenn diese Methode in einer Protokollimplementierung ausgelassen wird, so wird stets die \textit{toString}-Methode der Mutterklasse \textit{VSAbstractProtocol} verwendet.
\end{itemize}
-F\"{u}r alle hier aufgelisteten Client-Methoden sind auch die korespondierenen Server-Methoden anzugeben. Die Server-Methoden sind analog zu den Client-Methoden aufgebaut.
+F\"{u}r alle hier aufgelisteten Client-Methoden sind auch die korespondierenen Server-Methoden anzugeben. Die Server-Methoden sind analog zu den Client-Methoden aufgebaut, wobei lediglich \textit{Client} durch \textit{Server} ausgetauscht werden mu.
+
+Jede Protokollklasse bekommt folgende Methoden von \textit{VSAbstractProtocol} vererbt, welche allesamt vom Protokollentwickler verwendet werden k\"{o}nnen:
+
+\begin{itemize}
+ \setlength{\itemsep}{-2mm}
+ \item \textit{pubic void sendMessage(VSMessage message)}: Hiermit verchickt das Protokoll eine Nachricht.
+ \item \textit{pubic final boolean hasOnServerStart()}: Hiermit l\"{a}t sich bestimmen, ob der Server- oder der Client bei dem aktuellen Protokoll die Anfragen startet.
+ \item \textit{pubic final boolean isServer()}: Hiermit l\"{a}t sich bestimmen, ob der aktuelle Prozess das aktuelle Protokoll serverseitig aktiviert hat.
+ \item \textit{pubic final boolean isClient()}: Hiermit l\"{a}t sich bestimmen, ob der aktuelle Prozess das aktuelle Protokoll clientseitig aktiviert hat.
+ \item \textit{pubic final void scheduleAt(long time)}: Diese Methode stellt einen Wecker, der zur angegebenen lokalen Prozesszeit eintritt. Nach Ablauf des Weckers wird, abh\"{a}ngig ob der aktuelle Kontext Client- oder Serverseitig ist, \textit{onClientSchedue} beziehungsweise \textit{onServerSchedule} ausgef\"{u}hrt.
+ \item \textit{pubic final void removeSchedules()}: Entfernt alle gesetzten Wecker des aktuellen Kontextes (Server oder Client).
+ \item \textit{pubic final int getNumProcesses()}: Gibt die Anzahl an der Simulation beteiligten Prozesse zur\"{u}ck.
+\end{itemize}
+
+Bei der Implementierung von Protokollen k\"{o}nnen zus\"{a}tzlich auf die vererbten Attribute \textit{VSAbstractProcess process} und \textit{VSPrefs prefs} zugegriffen werden. Verf\"{u}gbare Methoden von \textit{VSPrefs} wurden bereits behandelt. \"{U}ber \textit{prefs} lassen sich alle globalen Simulationseinstellungen abrufen (zum Beispiel die Simulationsvariable die Angibt, ob Prozesse eigene nachrichten empfangen: \textit{bool foo = prefs.getBoolean(``sim.message.own.recv'')}). Folgende Prozessmethoden d\"{u}rfen auf \textit{process} aus dem Protokoll-API verwendet werden:
+
+\begin{itemize}
+ \setlength{\itemsep}{-2mm}
+ \item \textit{public float getClockVariance()}: Gibt die Uhrabweichung zur\"{u}ck.
+ \item \textit{public void setClockVariance(float clockVariance)}: Setzt die Uhrabweichung des Prozesses.
+ \item \textit{public long getGlobalTime()}: Gibt die aktuelle globale Simulationszeit zur\"{u}ck.
+ \item \textit{public long getTime()}: Gibt die aktuelle lokale Prozesszeit zur\"{u}ck.
+ \item \textit{public void setTime(long time)}: Setzt die aktuelle lokale Prozesszeit.
+ \item \textit{public long getLamportTime()}: Gibt die aktuelle Lamportzeit des Prozesses zur\"{u}ck.
+ \item \textit{public void setLamportTime(long lamportTime)}: Setzt die aktuelle Lamportzeit des Prozesses.
+ \item \textit{public void increaseLamportTime()}: Inkrementiert die Lamportzeit um eins.
+ \item \textit{public void updateLamportTime(long lamportTime)}: Erneuert die Lamportzeit. Siehe Kapitel 2.6.1 wie die Lamportzeiten erneuert werden.
+ \item \textit{public VSVectorTime getVectorTime()}: Gibt die aktuelle Vektor-Zeit des Prozesses zur\"{u}ck.
+ \item \textit{public VSTime[] getLamportTimeArray()}: Gibt die gesamte Lamportzeitstempelhistorie des Prozesses zur\"{u}ck. Kann jeweils nach VSLamportTime gecastet werden.
+ \item \textit{public VSTime getVectorTimeArray()}: Gibt die gesamte Vektor-Zeitstempelhistorie des Prozesses zur\"{u}ck. Kann jeweils nach VSVectorTime gecastet werden.
+ \item \textit{public void updateVectorTime(VSVectorTime vectorTimeUpdate)}: Erneuert die Vektorzeit. Siehe Kapitel 2.6.1 wie die Vektorzeiten erneuert werden.
+ \item \textit{public void increaseVectorTime()}: Inkrementiert die Vektorzeit an lokalem Index um eins.
+ \item \textit{public int getProcessID()}: Gibt die PID zur\"{u}ck.
+ \item \textit{public void setProcessID(int processID)}: Setz die PID.
+ \item \textit{public int getProcessNum()}: Gibt die Prozessnummer zur\"{u}ck. Dieser Wert unterscheidet sich von der PID. Die Prozessnummer gibt an, um den wievielten Prozess, beginnend bei 0, es sich handelt.
+ \item \textit{public int getRandomPercentage()}: Gibt einen Zufallswert zwischen \textit{0} und \textit{100} zur\"{u}ck.
+ \item \textit{public boolean hasCrashed()}: Gibt \textit{true} zur\"{u}ck, wenn der Prozess w\"{a}hrend der aktuellen Simulation schonmal abgest\"{u}rzt ist.
+ \item \textit{public boolean isCrashed()}: Gibt \textit{true} zur\"{u}ck, wenn der Prozess aktuell abgest\"{u}rzt ist.
+ \item \textit{public void isCrashed(boolean isCrashed)}: Hiermit kann man den Prozess abst\"{u}rzen (\textit{isCrashed = true}) und wiederbeleben (\textit{isCrashed = false}) lassen.
+\end{itemize}
+
+In der Regel werden in Protokollen auch Nachrichten (\textit{VSMessage}) verschickt. Folgende Methoden d\"{u}rfen davon im Protokoll-API verwendet werden:
+
+\begin{itemize}
+ \setlength{\itemsep}{-2mm}
+ \item \textit{public VSMessage()}: Der Standardkonstruktor f\"{u}r die Erstellung einer neuen Nachricht.
+ \item \textit{public String getProtocolClassname()}: Gibt den Klassennamen des zur Nachricht dazugeh\"{o}rigen Protokolls zur\"{u}ck. Diese Methode funktioniert nur bei empfangenen Nachrichten.
+ \item \textit{public int getmessageID()}: Gibt die Nachrichten-ID zur\"{u}ck.
+ \item \textit{public boolean equals(VSMessage message)}: Hiermit l\"{a}t sich \"{u}berpr\"{u}fen, ob eine gegebene Nachricht die selbe Nachrichten-ID besitzt (es sich um die selbe Nachricht handelt).
+\end{itemize}
+
+Folgende weitere Methoden von \textit{VSMessage} k\"{o}nnen bei Erhalt einer Nachricht verwendet werden:
+
+\begin{itemize}
+ \setlength{\itemsep}{-2mm}
+ \item \textit{public String getName()}: Gibt den Namen des zur Nachricht dazugeh\"{o}rigen Protokolls zur\"{u}ck. Diese Methode funktioniert nur bei empfangenen Nachrichten richtig.
+ \item \textit{public String getProtocolClassname()}: Gibt den Klassennamen des zur Nachricht dazugeh\"{o}rigen Protokolls zur\"{u}ck. Diese Methode funktioniert nur bei empfangenen Nachrichten richtig.
+ \item \textit{public VSInternalProcess getSendingProcess()}: Gibt eine Referenz auf den Senderprozess zur\"{u}ck. Diese Methode funktioniert nur bei empfangenen Nachrichten richtig.
+ \item \textit{public long getLamportTime()}: Gibt die Lamportzeit des Senderprozesses zur\"{u}ck. Diese Methode funktioniert nur bei empfangenen Nachrichten richtig.
+ \item \textit{public boolean isServerMessage()}: Hiermit l\"{a}t sich entscheiden, ob es sich um eine Server- oder eine Clientnachricht handelt. Diese Methode funktioniert nur bei empfangenen Nachrichten richtig.
+\end{itemize}
+
+Wenn \"{u}ber eine Nachricht Daten verschickt werden sollen, so werden die von \textit{VSPrefs} vererben Methoden verwendet.
\subsection{Beispielimplementierung eines Protokolls}
Im Folgenden wird die Implementierung des zuverl\"{a}ssigen Multicast-Protokolls \textit{VSReliableMulticastProtocol.java} als Beispiel aufgef\"{u}hrt. Die Funktionsweise des Protokolls wurde bereits in Kapitel 2.5.10 beschrieben. Client- und Serverseite werden in der selben Klasse implementiert.
-Im Konstruktor mu stets angegeben werden, ob beim gegebenen Protokoll der Client oder der Server die Anfragen startet. Mit \textit{HAS\_ON\_CLIENT\_START} wird dem API mitgeteilt, dass der Client die Anfragen startet. F\"{u}r \textit{HAS\_ON\_SERVER\_START} und Serveranfragen gilt Selbiges analog:
+Im Konstruktor mu stets angegeben werden, ob beim gegebenen Protokoll der Client oder der Server die Anfragen startet. Mit \textit{HAS\_ON\_CLIENT\_START} wird dem API mitgeteilt, dass der Client die Anfragen startet. F\"{u}r \textit{HAS\_ON\_SERVER\_START} und Serveranfragen gilt Selbiges analog. Da ein Protokoll auch ein \textit{VSAbstractEvent} ist, muss auch hier im Konstruktor mit \textit{setClassname} der Klassenname des aktuellen Protokolls angegeben werden:
\begin{code}
package protocols.implementations;
@@ -315,22 +391,23 @@ public class VSReliableMulticastProtocol
extends VSAbstractProtocol {
public VSReliableMulticastProtocol() {
super(VSAbstractProtocol.HAS_ON_CLIENT_START);
- setClassname(getClass().toString());
+ super.setClassname(super.getClass().toString());
}
\end{code}
\subsubsection{Clientseite des Protokolls}
-Das private Klassenattribut \textit{pids} wird f\"{u}r die Zwischenspeicherung beteiligter PIDs ben\"{o}tigt. Hier sind alle PIDs abgelegt, von denen noch Best\"{a}tigungsnachrichten erwartet werden. Hier werden als Standard-PIDs \textit{1} und \textit{3} verwendet. Die Methoden \textit{initVector} und \textit{initLong} wurden von \textit{VSPrefs} vererbt und initialisieren die Protokollvariablen \textit{pids} und \textit{timeout}, welche vom Benutzer im Prozesseditor editiert werden k\"{o}nnen:
+Das private Klassenattribut \textit{pids} wird f\"{u}r die Zwischenspeicherung beteiligter PIDs ben\"{o}tigt. Hier sind alle PIDs abgelegt, von denen noch Best\"{a}tigungsnachrichten erwartet werden. Hier werden als Standard-PIDs \textit{1} und \textit{3} verwendet. Die Methoden \textit{initVector} und \textit{initLong} wurden von \textit{VSPrefs} vererbt und initialisieren die Protokollvariablen \textit{pids} und \textit{timeout}, welche vom Benutzer im Prozesseditor editiert werden k\"{o}nnen (siehe Abbildung \ref{fig:Protokollvariablen} unter ``Reliable Multicast Client'' ganz unten):
\begin{code}
private ArrayList<Integer> pids;
public void onClientInit() {
Vector<Integer> vec = new Vector<Integer>();
vec.add(1); vec.add(3);
- initVector("pids", vec, "PIDs beteilitger Prozesse");
- initLong("timeout", 2500,
- "Zeit bis erneute Anfrage", "ms");
+ super.initVector("pids", vec,
+ "PIDs beteilitger Prozesse");
+ super.initLong("timeout", 2500,
+ "Zeit bis erneute Anfrage", "ms");
}
\end{code}
@@ -338,7 +415,7 @@ Wenn die Simulation zur\"{u}ckgesetzt wird, dann wird auch \textit{pids} reiniti
\begin{code}
public void onClientReset() {
pids.clear();
- pids.addAll(getVector("pids"));
+ pids.addAll(super.getVector("pids"));
}
\end{code}
@@ -346,12 +423,13 @@ In \textit{onClientStart} wird gepr\"{u}ft, ob eine Clientanfrage gestartet werd
\begin{code}
public void onClientStart() {
if (pids.size() != 0) {
- long timeout = getLong("timeout") + process.getTime();
- scheduleAt(timeout);
+ long timeout = super.getLong("timeout")
+ + process.getTime();
+ super.scheduleAt(timeout);
VSMessage message = new VSMessage();
message.setBoolean("isMulticast", true);
- sendMessage(message);
+ super.sendMessage(message);
}
}
\end{code}
@@ -368,13 +446,13 @@ Wenn eine Serverantwort eintrifft, dann wird \textit{onClientRecv} aufgerufen. H
else
return;
- logg("ACK von Prozess " + pid + " erhalten!");
+ super.logg("ACK von Prozess " + pid + " erhalten!");
if (pids.size() == 0) {
- logg("ACKs von allen beteiligten Prozessen " +
- "erhalten!");
+ super.logg("ACKs von allen beteiligten " +
+ " Prozessen erhalten!");
- removeSchedules();
+ super.removeSchedules();
}
}
}
@@ -407,12 +485,12 @@ Wenn der Server eine Clientanfrage erhalten hat, so \"{u}berpr\"{u}ft der Server
VSMessage message = new VSMessage();
message.setBoolean("isAck", true);
message.setInteger("pid", process.getProcessID());
- sendMessage(message);
+ super.sendMessage(message);
if (ackSent) {
- logg("ACK erneut versendet");
+ super.logg("ACK erneut versendet");
} else {
- logg("ACK versendet");
+ super.logg("ACK versendet");
ackSent = true;
}
}
@@ -444,6 +522,7 @@ registerEvent("protocols.implementations.VSMyProtocol",
\item Mit dem Befehl \textit{ant dist} das Archiv \textit{dist/lib/VS-Sim-Latest.jar} erstellen und verwenden.
\end{enumerate}
+\newpage
\section{GUI sowie Simulationsvisualisierung}
Das Paket \textit{simulator} (vereinfacht auf Abbildung \ref{fig:PackageProtocols} dargestellt) implementiert die eigentliche graphische Benutzeroberf\"{a}che des Simulators. Ausnahmen sind die Editorklassen in \textit{prefs.editors} sowie \textit{utils.VSFrame}.
@@ -455,9 +534,9 @@ Das Paket \textit{simulator} (vereinfacht auf Abbildung \ref{fig:PackageProtocol
\label{fig:PackageProtocols}
\end{figure}
-Beim Starten des Simulators wird auf die Main-Methode, welche sich in \textit{VSMain} befindet, aufgerufen. Sie instanziiert ein \textit{VSDefaultPrefs}-Objekt, wo alle Standardeinstellungen des Simulators abgelegt sind. Anschlieend wird ein \textit{VSSimulatorFrame} erzeugt, welches ein Simulatorfenster (wie bereits schon auf Abbildung \ref{fig:NeuesFenster} zu sehen war) implementiert. Das Simulatorfenster erstellt f\"{u}r jede neue Simulation jeweils ein Objekt von \textit{VSSimulator}. Jede Simulation hat im Simulationsfenster einen eigenen Tab. Auf Abbildung \ref{fig:NeuErstellteSimulation} wurde bereits eine neue Simulation erstellt, wo auch unten links der dazugeh\"{o}rige Tab mit der Beschriftung ``Simulator 1'' zu sehen ist. Jede Simulation besitzt eine eigene Simulationsnummer, die bei jeder neuen Simulation um eins inkrementiert wird. Jedes \textit{VSSimulator}-Objekt greift auf \textit{VSSimulatorVisualization} zur\"{u}ck, was die Simulationsvisualisierung (Abbildung \ref{fig:Visualisierung}) implementiert.
+Beim Starten des Simulators wird auf die Main-Methode, welche sich in \textit{VSMain} befindet, aufgerufen. Sie instanziiert ein \textit{VSDefaultPrefs}-Objekt, wo alle Standardeinstellungen des Simulators abgelegt sind. Anschlieend wird ein \textit{VSSimulatorFrame} erzeugt, welches ein Simulatorfenster (wie bereits schon auf Abbildung \ref{fig:NeuesFenster} zu sehen war) implementiert. Das Simulatorfenster erstellt f\"{u}r jede neue Simulation jeweils ein Objekt von \textit{VSSimulator}. Jede Simulation hat im Simulationsfenster einen eigenen Tab. Auf Abbildung \ref{fig:NeuErstellteSimulation} wurde bereits eine neue Simulation erstellt, wo auch unten links der dazugeh\"{o}rige Tab mit der Beschriftung ``Simulator 1'' zu sehen ist. Jede Simulation besitzt dabei eine eigene Simulationsnummer, die bei jeder neuen Simulation um eins inkrementiert wird. Jedes \textit{VSSimulator}-Objekt greift auf \textit{VSSimulatorVisualization} zur\"{u}ck, was die Simulationsvisualisierung (Abbildung \ref{fig:Visualisierung}) implementiert.
-\textit{VSSimulatorVisualization} ist bei Weitem die kryptischste Klasse des Simulators. Die greift auf die Java2D-Grafikbibliothek zur\"{u}ck und ist aus Performancegr\"{u}nden mit dem Simulationsverlauf stark verzahnt. Variablen, die stets den selbe Wert haben, wurden stets als finale Variablen angelegt. Variablen, die von Konfigurationen oder Einstellungen abh\"{a}ngig sind, die sich nur nach Konfigurations\"{a}nderung oder Vergr\"{o}ern beziehungsweise Verkleinern des Simulationsfensters \"{a}ndern, werden nur wenn es n\"{o}tig ist neuberechnet.
+\textit{VSSimulatorVisualization} ist bei Weitem die kryptischste Klasse des Simulators. Die greift auf die Java2D-Grafikbibliothek zur\"{u}ck und ist aus Performancegr\"{u}nden mit dem Simulationsverlauf stark verzahnt. Variablen, die stets den selbe Wert haben, wurden stets als finale Variablen angelegt. Variablen, die von Konfigurationen oder Einstellungen abh\"{a}ngig sind, die sich nur nach Konfigurations\"{a}nderung oder Vergr\"{o}ern beziehungsweise Verkleinern des Simulationsfensters \"{a}ndern, werden nur wenn es n\"{o}tig ist neu berechnet.
Die Klasse \textit{VSMenuItemStates} wird f\"{u}r die Synchronisierung des Simulationsstatusses, der Toolbar und des Simulations-Men\"{u}s (beide Letztere auf Abbildung \ref{fig:Toolbar} zu sehen) verwendet. Damit ist gemeint, ob die Simulation bereits gestartet wurde oder nicht oder gegebenenfalls schon abgelaufen ist. Oder ob die Simulation sich in einem pausierten Status befindet. Abh\"{a}ngig davon kann der Benutzer bestimmte Aktionen durchf\"{u}hren oder nicht (beispielsweise kann eine Simulation nur pausiert werden, wenn sie aktuell abgespielt wird). Alle hier m\"{o}glichen Aktionen wurden bereits in Kapitel 2.1 im Abschnitt ``Die Toolbar'' behandelt.
@@ -465,12 +544,14 @@ Die klasse \textit{VSCreateTask} wird vom Ereigniseditor verwendet. Der Ereignis
\textit{VSLogging} kapselt ein \textit{javax.swing.JTextArea}-Objekt, wo alle Nachrichten geloggt werden. Hier werden alle Loggfunktionen (inklusive Loggfilter sowie tempor\"{a}re Deaktivierung des Loggen) implementiert. Die \textit{JTextArea} wird dem \textit{VSSimulator}-Objekt \"{u}bergeben und dort dargestellt.
+\newpage
\section{Serialisierung von Simulationen}
Der Anwender kann eine erstellte Simulation im Datei-Men\"{u} speichern und/oder eine bereits abgespeicherte Simulation laden.
\subsubsection{R\"{u}ckw\"{a}rtskompatibel}
+\newpage
\section{Helferklassen und Klassen f\"{u}r Ausnahmebehandlungen}
Es wurden noch nicht die Klassen der Pakete \textit{utils} (Abbildung \ref{fig:PackageUtils}) sowie \textit{exceptions} (Abbildung \ref{fig:PackageExceptions}) vorgestellt. \textit{utils} fasst lediglich einige Helferklassen zusammen, die vom restlichen Quelltext verwendet werden.
@@ -502,6 +583,7 @@ Es wurden noch nicht die Klassen der Pakete \textit{utils} (Abbildung \ref{fig:P
Im Paket \textit{exceptions} befinden sich lediglich einige eigene Objekte f\"{u}r Ausnahmebehandlungen. \textit{VSNotCopyableException} wird von einem nicht-kopierbaren Ereignis geworfen, wenn versucht wird es zu kopieren. \textit{VSNegatieNumberException} wird geworfen, wenn intern negative Zahlen dort auftreten, wo sie es nicht sollten. Wenn ein Editorobjekt die Benutzereingabe einer Integer-Vektor-Variable nicht parsen kann, so greifen es auf \textit{VSParseIntegerVectorException} zur\"{u}ck.
+\newpage
\section{Entwicklungsumgebung}
In diesem Teilkapitel soll ein kleiner Einblick in die Umgebung, in der der Simulator entwickelt wurde, gew\"{a}hrt werden. F\"{u}r diese Diplomarbeit wurde ausschlielich Open Source Software verwendet. Die einzige Ausnahme stellt Microsoft Windows XP dar, worauf der Simulator zus\"{a}tzlich getestet wurde. Der Simulator wurde jedoch haupts\"{a}chlich unter dem Betriebssystem FreeBSD 7.0, was ein open source Unix-Derivat ist, programmiert.
diff --git a/LaTeX/chapters/simulator.tex b/LaTeX/chapters/simulator.tex
index 5596b53..c1c6c8d 100644
--- a/LaTeX/chapters/simulator.tex
+++ b/LaTeX/chapters/simulator.tex
@@ -257,7 +257,6 @@ In diesem Abschnitt wird genauer auf die m\"{o}glichen Konfigurationsm\"{o}glich
\begin{figure}[h]
\centering
\fbox{\includegraphics{images/ss-simulationseinstellungen}}
- %\fbox{\includegraphics[width=11cm]{images/ss-simulationseinstellungen}}
\caption{Das Fenster zu den Simulationseinstellungen}
\label{fig:Simulationseinstellungen}
\end{figure}
diff --git a/LaTeX/diplomarbeit.pdf b/LaTeX/diplomarbeit.pdf
index b51e803..89967aa 100644
--- a/LaTeX/diplomarbeit.pdf
+++ b/LaTeX/diplomarbeit.pdf
@@ -297,7 +297,7 @@ endobj
stream
xڍUMs6W(͔ͮWvҦZD#.d%
ι>wyW 7Ve{'} n4~' ,
-ŨF&qeXd˩ʝgZN p.ͩ2):os>0]e{JK|hF"{gj,wy*fxIϫ608J|-_`_K_!sPӱ bk{>>3(~Zuh엗qDh\P@4w1ωuȷgH%Աf`.O{F,s>`ϮbtEEiOԡӀpFu<|9ҊPypΎ|L^K Sbqt8c&4(\܊endstream
+ŨF&qeXd˩ʝgZN p.ͩ2):os>0]e{JK|hF"{gj,wy*fxIϫ608J|-_`_K_!sPӱ bk{>>3(~Zuh엗qDh\P@4w1ωuȷgH%Աf`.O{F,s>`ϮbtEEiOԡӀpFu<|9ҊPypΎ|L^K Sqt8c&4(܋endstream
endobj
198 0 obj <<
/Type /Page
@@ -487,8 +487,8 @@ xڍUn8+t
)/KHB;!idzIgW.k*
vsqy#oj >qԳDR&ڦ
&l,P>n,|YS'dY(ֻѪ%)>r [Ib/џmy˴巄
-C1D\q{oJ7. pV1H9<E YJ=ZN~ P#Qm`Wŀ;>:
-~@endstream
+C1D\q{oJ7. pV1H9<E YJ=ZN~ P#Qm`Wŀ;>:
+n@endstream
endobj
212 0 obj <<
/Type /Page
@@ -748,19 +748,15 @@ endobj
/ProcSet [ /PDF /Text ]
>> endobj
255 0 obj <<
-/Length 1933
+/Length 1937
/Filter /FlateDecode
>>
stream
-xYs6)(T(1&izMq_z<(6c$'~.HrDiM.?.
-
-_0HTa ƊZ\?Y]*V?x
-KֲxUp NF/X<o֛͒EwGuySW_?<x|Q5_PRB
-.4.V*$NQNS9b :fdZ/x})e}]}}:Vf4QR"FT9e1)}ucr2b84h!V9@C6
-t6e'Mzb■[H~ qSUY's0
-i SGKni=>=T)5hO-M9<y':pD-#qUfO2<wU{:) - q2^sFulC,Xn#:ܦB<W8)B"2)̓zYഩƤv/.oe
-&T<kgkN i
-+w)U~!}1?d FT}LDݩ2b\:eatBCSi,ΠCxԥX;?!UUy陝$30pJ+ʄ67􂌻#Vsj K3&w0xT:uݯendstream
+xKs6<J3J3uR5ƽqmf-Q=i?}$Ap43ihʹ "2ӖY{/.x_>!V)]ɘbz7.j{7grVlSS^Un/;?(f6Tw*
+76󇿎SZ5d*f:rdPJ;+i3X]ڗPjE< }{U"$I!sVaLR{CDǜ-${ 8%A Bl5IuIlj|u5l;3d*YChzq 8>z֞𿇿=_T)4h-_jb :0E %vb+X/Cuߔ6F8:Fԩ1F 7#|2N6ml&Ly3()" uPv:]'ֵԚ~_`BţvFlUz0Ð6
+ցEUlGPDJJ *!|^ItP~J,hbk5zf΃D ]_bt'uvagw\NFt2b Y*5Shn0/),X≋ęizJ#4#VPcE uYy ]UIK ,'ҫa3ng/Gf
+E bU立ޯWý3îZޭnYݴ/4%G C^Qu>g/<`ylfO3y=9a[MC_T['׏ַŕwl^a5wq"<(KgK-6&D7U9}sٓ ͐\}'I- BYlݕW-Ѯ&DYXܫ9 1zi' şw0p¬xJ;T~[w:ڡ.B#QD(]:3Nn(k<Pa
+Mӫ&|} gQoU^;fǾC5'Tƿ҈ c3v2 cvqj> K9C&Mf%B̫k'KS`t.endstream
endobj
254 0 obj <<
/Type /Page
@@ -1156,23 +1152,22 @@ endobj
/ProcSet [ /PDF /Text ]
>> endobj
343 0 obj <<
-/Length 1100
+/Length 1201
/Filter /FlateDecode
>>
stream
-xnF~>}9&$B.dŐ ӧVS-6Y9" Y*Z0*z gx(^Wd8q=ZRa]=lXm^ϧ ߂Kk_w_~\u`#nMII,~&g/Kq:!poLG$5HKk-!RrRnpsβ,h"$1izAA@b~OC"ymw֚k5.,ԋ Y6Hθڀծib)f1\nЛ]y~'}|MP!`; 1N*3yZ%"[j t842 &FIyS)?O_ 
-x7|`PS:ipeNJI-jй҆BzC-5,iCEj! U3e!",:juLBJ99lo^zet{%&J#e!j& V36o)oO\
-o(
- MXծ̖Z4|[^fF
-<ւ=^gMz4ǷN>ó4D]}_oXZ8٘Y#[(xˉ<fr<ԇa;HOp %
+xKoF<㘢z)re%!EO!Kܡ8<pH~Xa$ԩ8-_O.2auϚ8eXp%B_\/]ۇEudQoק׻V}8)ZrBJ /pp~*E8-:br#nr:ި)C\tQ}:B-ӹ=Ua9Xb*`Ih"%9)jIABZ~{&"9ep{ SoJŢ^e8nCV28&{ky>ׇ}kp}Ӵ*DKK2I 1N8u2+9a^BD@'0a{d2 '059
+q_>yޗ.֟J
+ k!rX}<Sg-Fjg573Pa+&6*ꭅƢi
+_{#Oq.SN68MMd/W-cXz_O5E7o{#ަ5-Fvj"1UoFFOx<XYx+N4_#??yR$Ҙ"+<هqoaFTXTN|$߇c!.RjIhn(0ԙ^pfR"X R601#Aendstream
endobj
342 0 obj <<
/Type /Page
/Contents 343 0 R
/Resources 341 0 R
/MediaBox [0 0 595.2757 841.8898]
-/Parent 356 0 R
-/Annots [ 345 0 R 346 0 R 347 0 R 348 0 R 349 0 R 350 0 R 351 0 R 352 0 R 353 0 R 354 0 R 355 0 R ]
+/Parent 357 0 R
+/Annots [ 345 0 R 346 0 R 347 0 R 348 0 R 349 0 R 350 0 R 351 0 R 352 0 R 353 0 R 354 0 R 355 0 R 356 0 R ]
>> endobj
345 0 obj <<
/Type /Annot
@@ -1233,24 +1228,31 @@ endobj
353 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [86.8628 605.2166 190.0803 613.7814]
+/Rect [86.8628 605.2166 249.4056 613.7814]
/Subtype /Link
/A << /S /GoTo /D (figure.3.7) >>
>> endobj
354 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [86.8628 587.2894 168.9961 595.8542]
+/Rect [86.8628 587.2894 190.0803 595.8542]
/Subtype /Link
/A << /S /GoTo /D (figure.3.8) >>
>> endobj
355 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [86.8628 567.6586 195.644 577.927]
+/Rect [86.8628 569.3622 168.9961 577.927]
/Subtype /Link
/A << /S /GoTo /D (figure.3.9) >>
>> endobj
+356 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [86.8628 549.7314 195.644 559.9997]
+/Subtype /Link
+/A << /S /GoTo /D (figure.3.10) >>
+>> endobj
344 0 obj <<
/D [342 0 R /XYZ 74.4095 793.4011 null]
>> endobj
@@ -1258,7 +1260,7 @@ endobj
/Font << /F61 259 0 R /F28 209 0 R >>
/ProcSet [ /PDF /Text ]
>> endobj
-370 0 obj <<
+372 0 obj <<
/Length 1852
/Filter /FlateDecode
>>
@@ -1277,158 +1279,158 @@ U2ɢL`?Et(*mv`۱Q-Nv4< Z
f
ugܟGΨ<g=; L,S(V;ZU4oX-o݇7AjGkgTm{wY_2wZoW{ :Tea'\;  {/Z[ozF.9L:vF51<S[u(~=|صloO|!,d"s Z͋:=ݬu<KXPbM[JtgwjXjco u_0Ik :dA_d_
endobj
-369 0 obj <<
+371 0 obj <<
/Type /Page
-/Contents 370 0 R
-/Resources 368 0 R
+/Contents 372 0 R
+/Resources 370 0 R
/MediaBox [0 0 595.2757 841.8898]
-/Parent 356 0 R
-/Annots [ 373 0 R 374 0 R 375 0 R 376 0 R 377 0 R 378 0 R 379 0 R 380 0 R 381 0 R 382 0 R 383 0 R 384 0 R 385 0 R 386 0 R 387 0 R 388 0 R 389 0 R 390 0 R 391 0 R ]
+/Parent 357 0 R
+/Annots [ 375 0 R 376 0 R 377 0 R 378 0 R 379 0 R 380 0 R 381 0 R 382 0 R 383 0 R 384 0 R 385 0 R 386 0 R 387 0 R 388 0 R 389 0 R 390 0 R 391 0 R 392 0 R 393 0 R ]
>> endobj
-373 0 obj <<
+375 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
/Rect [86.8628 612.425 338.2165 623.0073]
/Subtype /Link
/A << /S /GoTo /D (table.2.1) >>
>> endobj
-374 0 obj <<
+376 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
/Rect [86.8628 594.4978 298.9616 605.0801]
/Subtype /Link
/A << /S /GoTo /D (table.2.2) >>
>> endobj
-375 0 obj <<
+377 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
/Rect [86.8628 576.5706 180.2935 586.9466]
/Subtype /Link
/A << /S /GoTo /D (table.2.3) >>
>> endobj
-376 0 obj <<
+378 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
/Rect [86.8628 558.6433 257.1971 569.0193]
/Subtype /Link
/A << /S /GoTo /D (table.2.4) >>
>> endobj
-377 0 obj <<
+379 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
/Rect [86.8628 540.7161 289.7984 551.2984]
/Subtype /Link
/A << /S /GoTo /D (table.2.5) >>
>> endobj
-378 0 obj <<
+380 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
/Rect [86.8628 522.7889 256.1481 533.1649]
/Subtype /Link
/A << /S /GoTo /D (table.2.6) >>
>> endobj
-379 0 obj <<
+381 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
/Rect [86.8628 504.8616 335.2394 515.4439]
/Subtype /Link
/A << /S /GoTo /D (table.2.7) >>
>> endobj
-380 0 obj <<
+382 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
/Rect [86.8628 486.9344 406.6109 497.5167]
/Subtype /Link
/A << /S /GoTo /D (table.2.8) >>
>> endobj
-381 0 obj <<
+383 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
/Rect [86.8628 469.0072 319.7369 479.3832]
/Subtype /Link
/A << /S /GoTo /D (table.2.9) >>
>> endobj
-382 0 obj <<
+384 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
/Rect [86.8628 451.0799 295.5011 461.6622]
/Subtype /Link
/A << /S /GoTo /D (table.2.10) >>
>> endobj
-383 0 obj <<
+385 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
/Rect [86.8628 433.1527 301.3831 443.735]
/Subtype /Link
/A << /S /GoTo /D (table.2.11) >>
>> endobj
-384 0 obj <<
+386 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
/Rect [86.8628 415.2255 371.7415 425.8077]
/Subtype /Link
/A << /S /GoTo /D (table.2.12) >>
>> endobj
-385 0 obj <<
+387 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
/Rect [86.8628 397.2982 385.1908 407.8805]
/Subtype /Link
/A << /S /GoTo /D (table.2.13) >>
>> endobj
-386 0 obj <<
+388 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
/Rect [86.8628 379.371 276.0623 389.747]
/Subtype /Link
/A << /S /GoTo /D (table.2.14) >>
>> endobj
-387 0 obj <<
+389 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
/Rect [86.8628 361.4438 286.3466 371.8198]
/Subtype /Link
/A << /S /GoTo /D (table.2.15) >>
>> endobj
-388 0 obj <<
+390 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
/Rect [86.8628 343.5165 356.705 353.8925]
/Subtype /Link
/A << /S /GoTo /D (table.2.16) >>
>> endobj
-389 0 obj <<
+391 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
/Rect [86.8628 325.5893 370.1543 336.1716]
/Subtype /Link
/A << /S /GoTo /D (table.2.17) >>
>> endobj
-390 0 obj <<
+392 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
/Rect [86.8628 299.5107 177.8368 308.0754]
/Subtype /Link
/A << /S /GoTo /D (table.3.1) >>
>> endobj
-391 0 obj <<
+393 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
/Rect [86.8628 281.5834 345.4789 290.3545]
/Subtype /Link
/A << /S /GoTo /D (table.3.2) >>
>> endobj
-371 0 obj <<
-/D [369 0 R /XYZ 74.4095 793.4011 null]
+373 0 obj <<
+/D [371 0 R /XYZ 74.4095 793.4011 null]
>> endobj
-372 0 obj <<
-/D [369 0 R /XYZ 74.4095 643.0739 null]
+374 0 obj <<
+/D [371 0 R /XYZ 74.4095 643.0739 null]
>> endobj
-368 0 obj <<
+370 0 obj <<
/Font << /F26 206 0 R /F28 209 0 R /F61 259 0 R >>
/ProcSet [ /PDF /Text ]
>> endobj
-413 0 obj <<
+415 0 obj <<
/Length 1758
/Filter /FlateDecode
>>
@@ -1443,35 +1445,35 @@ D|R]7yЎŋ" J,Z4,v2Y Z)+EJyC".Ce
/2|ʾGbڠ%"6c]+B?'5y{
K4<9s2GNBr{,KqY3R 3_kܸiʵ\yO`6zKiW QبנS2<'G3s96lΕcM|mekYsi, NC {jTI>H;Wqn5chk/}o이
endobj
-412 0 obj <<
+414 0 obj <<
/Type /Page
-/Contents 413 0 R
-/Resources 411 0 R
+/Contents 415 0 R
+/Resources 413 0 R
/MediaBox [0 0 595.2757 841.8898]
-/Parent 356 0 R
-/Annots [ 415 0 R ]
+/Parent 357 0 R
+/Annots [ 417 0 R ]
>> endobj
-415 0 obj <<
+417 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[0 1 0]
/Rect [75.9058 417.1708 102.2418 425.7356]
/Subtype /Link
/A << /S /GoTo /D (cite.Tanenbaum) >>
>> endobj
-414 0 obj <<
-/D [412 0 R /XYZ 74.4095 793.4011 null]
+416 0 obj <<
+/D [414 0 R /XYZ 74.4095 793.4011 null]
>> endobj
6 0 obj <<
-/D [412 0 R /XYZ 74.4095 771.7323 null]
+/D [414 0 R /XYZ 74.4095 771.7323 null]
>> endobj
10 0 obj <<
-/D [412 0 R /XYZ 74.4095 570.9064 null]
+/D [414 0 R /XYZ 74.4095 570.9064 null]
>> endobj
-411 0 obj <<
+413 0 obj <<
/Font << /F26 206 0 R /F28 209 0 R /F61 259 0 R >>
/ProcSet [ /PDF /Text ]
>> endobj
-421 0 obj <<
+423 0 obj <<
/Length 1854
/Filter /FlateDecode
>>
@@ -1484,30 +1486,30 @@ cu>Nfk yK0<]6|z<s0c 17݇#rX$v;
{*06UMvG}0=ϧz琹ӿuJh3)C@j RӔg:pKr+ʌW={&_ٽ#}1mGD9$=
0:T9 s_S/lkYVim*+(3ZZp7M@4Io)4k蒾2B[Ǯ1b9k %zdC1D6bOS&6βRQ Ky ?lnf2Uu <
endobj
-420 0 obj <<
+422 0 obj <<
/Type /Page
-/Contents 421 0 R
-/Resources 419 0 R
+/Contents 423 0 R
+/Resources 421 0 R
/MediaBox [0 0 595.2757 841.8898]
-/Parent 356 0 R
-/Annots [ 424 0 R ]
+/Parent 357 0 R
+/Annots [ 426 0 R ]
>> endobj
-417 0 obj <<
+419 0 obj <<
/Type /XObject
/Subtype /Form
/FormTyp