summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorManuel Traut <manut@vogone.traut>2009-12-27 16:11:21 +0100
committerManuel Traut <manut@vogone.traut>2009-12-27 16:11:21 +0100
commitcfbb5a8b9b4105793dc54974965aecc620adeed8 (patch)
treea2099bfc722c2aeee5861faeeb87c3c1f473e23e
parentb794b9e4f98fc8ed1809953d9303b219d5aebc1d (diff)
parentc62ff958823168d7622b397609220db8b67fa731 (diff)
Merge branch 'damba' of ssh://mecka.net/home/git/yalp into damba
Conflicts: build.xml server.policy Signed-off-by: Manuel Traut <manut@mecka.net>
-rw-r--r--build.xml234
-rw-r--r--client.policy40
-rw-r--r--doc/EFL/edjebook.pdf1423
-rwxr-xr-xremoved-code/Client.java96
-rw-r--r--server.policy29
-rw-r--r--src/YalpAuth/YalpPGSqlAuth/DatabaseDefines.java130
-rw-r--r--src/YalpClients/SwtClient/GUI/GUI.java4208
-rw-r--r--src/YalpClients/SwtClient/GUI/InitGUI.java116
-rw-r--r--src/YalpClients/SwtClient/GUI/LoadDialog.java220
-rw-r--r--src/YalpClients/SwtClient/GUI/SWTResourceManager.java290
-rw-r--r--src/YalpClients/SwtClient/GUI/SortListener.java126
-rw-r--r--src/YalpClients/SwtClient/GUI/StartDialog.java472
-rwxr-xr-xsrc/YalpClients/SwtClient/Model.java1518
-rwxr-xr-xsrc/YalpClients/SwtClient/SwtClient.java122
-rw-r--r--src/YalpClients/WebClient/App.xaml8
-rw-r--r--src/YalpClients/WebClient/App.xaml.cs66
-rw-r--r--src/YalpClients/WebClient/Default.aspx.cs22
-rw-r--r--src/YalpClients/WebClient/Default.aspx.designer.cs70
-rw-r--r--src/YalpClients/WebClient/MainPage.xaml284
-rw-r--r--src/YalpClients/WebClient/MainPage.xaml.cs198
-rw-r--r--src/YalpClients/WebClient/Properties/AppManifest.xml16
-rw-r--r--src/YalpClients/WebClient/Properties/AssemblyInfo.cs35
-rw-r--r--src/YalpClients/WebClient/VideoPlayer.csproj103
-rw-r--r--src/YalpClients/WebClient/VideoPlayer.csproj.user28
-rw-r--r--src/YalpClients/WebClient/VideoPlayer.sln20
-rw-r--r--src/YalpInputs/YalpPGSqlInput/DatabaseDefines.java130
-rwxr-xr-xsrc/YalpServer/ServerControlImpl.java904
-rwxr-xr-xsrc/YalpServer/ServerSettings.java136
-rwxr-xr-xsrc/YalpServer/YalpServer.java80
29 files changed, 6821 insertions, 4303 deletions
diff --git a/build.xml b/build.xml
index a4876fb..1777a52 100644
--- a/build.xml
+++ b/build.xml
@@ -1,3 +1,4 @@
+<<<<<<< HEAD
<?xml version="1.0" encoding="UTF-8"?>
<project name="yalp" default="all" basedir=".">
@@ -229,3 +230,236 @@
</target>
</project>
+=======
+<?xml version="1.0" encoding="UTF-8"?>
+
+<project name="yalp" default="all" basedir=".">
+ <property name="srcInterfaces" value="src/YalpInterfaces"/>
+
+ <property name="srcInputs" value="src/YalpInputs"/>
+ <property name="srcOutputs" value="src/YalpOutputs"/>
+ <property name="srcAuth" value="src/YalpAuth"/>
+ <property name="srcServer" value="src/YalpServer"/>
+ <property name="srcClients" value="src/YalpClients"/>
+ <property name="srcPgSqlInputIndexer" value="${srcInputs}/YalpPGSqlInput/YalpPGSQLIndexer"/>
+ <property name="srcVlcTelnetOutput" value="${srcOutputs}/YalpVlcTelnetOutput"/>
+ <property name="srcPGSqlInput" value="${srcInputs}/YalpPGSqlInput"/>
+ <property name="srcPGSqlAuth" value="${srcAuth}/YalpPGSqlAuth"/>
+
+ <property name="srcSwtClient" value="${srcClients}/SwtClient"/>
+ <property name="srcSwtClientGUI" value="${srcSwtClient}/GUI"/>
+
+ <property name="src" value="src/"/>
+ <property name="doc" value="doc/"/>
+ <property name="sqldoc" value="${doc}/sql"/>
+ <property name="javadoc" value="${doc}/java"/>
+ <property name="doxydoc" value="${doc}/doxygen"/>
+ <property name="build" value="build/"/>
+ <property name="lib" value="lib/"/>
+
+ <property name="log4jLibs" value="lib/log4j-1.2.15.jar"/>
+ <property name="vlctelnetLibs" value="lib/commons-net-1.4.1.jar"/>
+ <property name="swtLibs" value="/usr/share/swt-3/lib/swt.jar /usr/lib/java/swt.jar /usr/share/java/swt.jar"/>
+ <property name="indexerLibs" value="lib/yajil-0.3.3.jar"/>
+ <property name="dbLibs" value="lib/postgresql-8.1-404.jdbc3.jar"/>
+
+ <property name="idlj" value="../idlj.sh"/>
+ <property name="psqldoc" value="./postgresql_autodoc/postgresql_autodoc"/>
+
+ <path id="project.class.path">
+ <pathelement location="{lib}"/>
+ <pathelement path="${java.class.path}"/>
+ <pathelement path="${additional.path}"/>
+ </path>
+
+ <target name="all" depends="vlctelnetoutput, pgsqlinput, pgsqlindexer, pgsqlauth, server, swtclient" description="builds server and client">
+ <echo>Doing all</echo>
+ </target>
+
+ <target name="interfaces" description="Create stubs/skeletons from idl">
+ <mkdir dir="${build}"/>
+ <exec dir="${src}" executable="${idlj}">
+ <arg value="yalp.idl"/>
+ </exec>
+ <javac srcdir="${srcInterfaces}" destdir="${build}"/>
+ </target>
+
+ <target name ="server" depends="interfaces" description="builds the Server">
+ <javac debug="true" srcdir="${srcServer}" destdir="${build}"/>
+ <jar destfile="yalpServer.jar" basedir="${build}">
+ <path id="project.class.path">
+ <pathelement location="${lib}"/>
+ <pathelement path="${java.class.path}"/>
+ <pathelement path="${additional.path}"/>
+ </path>
+ <manifest>
+ <attribute name="Built-By" value="${user.name}"/>
+ <attribute name="Main-Class" value="YalpServer.YalpServer"/>
+ <attribute name="Class-Path" value="${log4jLibs}"/>
+ </manifest>
+ </jar>
+ </target>
+
+ <target name ="outputs" description="builds output base files">
+ <javac debug="true" srcdir="${srcOutputs}" destdir="${build}"/>
+ </target>
+
+ <target name ="vlctelnetoutput" depends="interfaces, outputs" description="builds the vlctelnetoutput">
+ <javac debug="true" srcdir="${srcVlcTelnetOutput}" destdir="${build}"/>
+ <jar destfile="yalpVlcTelnetOutput.jar" basedir="${build}">
+ <path id="project.class.path">
+ <pathelement location="${lib}"/>
+ <pathelement path="${java.class.path}"/>
+ <pathelement path="${additional.path}"/>
+ </path>
+ <manifest>
+ <attribute name="Built-By" value="${user.name}"/>
+ <attribute name="Main-Class" value="YalpOutputs.YalpVlcTelnetOutput.YalpVlcTelnetOutput"/>
+ <attribute name="Class-Path" value="${vlctelnetLibs} ${log4jLibs}"/>
+ </manifest>
+ </jar>
+ </target>
+
+ <target name ="inputs" description="builds input base files">
+ <javac debug="true" srcdir="${srcInputs}" destdir="${build}"/>
+ </target>
+
+ <target name ="pgsqlinput" depends="interfaces, inputs" description="builds the pgsql input plugin">
+ <javac debug="true" srcdir="${srcPGSqlInput}" destdir="${build}"/>
+ <jar destfile="yalpPGSqlInput.jar" basedir="${build}">
+ <path id="project.class.path">
+ <pathelement location="${lib}"/>
+ <pathelement path="${java.class.path}"/>
+ <pathelement path="${additional.path}"/>
+ </path>
+ <manifest>
+ <attribute name="Built-By" value="${user.name}"/>
+ <attribute name="Main-Class" value="YalpInputs.YalpPGSqlInput.YalpPGSqlInput"/>
+ <attribute name="Class-Path" value="${dbLibs} ${log4jLibs}"/>
+ </manifest>
+ </jar>
+ </target>
+
+ <target name="pgsqlindexer" description="indexer for pgsqlinputplugin">
+ <mkdir dir="${build}/indexer"/>
+ <javac debug="true" srcdir="${srcPgSqlInputIndexer}" destdir="${build}/indexer"/>
+ <jar destfile="yalpPGSqlIndexer.jar" basedir="${build}">
+ <path id="project.class.path">
+ <pathelement location="${lib}"/>
+ <pathelement path="${java.class.path}"/>
+ <pathelement path="${additional.path}"/>
+ </path>
+ <manifest>
+ <attribute name="Built-By" value="${user.name}"/>
+ <attribute name="Main-Class" value="YalpInputs.YalpPGSqlInput.YalpPGSQLIndexer.YalpPGSQLIndexer"/>
+ <attribute name="Class-Path" value="${indexerLibs}"/>
+ </manifest>
+ </jar>
+ </target>
+
+ <target name ="auth" description="builds auth base files">
+ <javac debug="true" srcdir="${srcAuth}" destdir="${build}"/>
+ </target>
+
+ <target name ="pgsqlauth" depends="interfaces, auth" description="builds the pgsql auth plugin">
+ <javac debug="true" srcdir="${srcPGSqlAuth}" destdir="${build}"/>
+ <jar destfile="yalpPGSqlAuth.jar" basedir="${build}">
+ <path id="project.class.path">
+ <pathelement location="${lib}"/>
+ <pathelement path="${java.class.path}"/>
+ <pathelement path="${additional.path}"/>
+ </path>
+ <manifest>
+ <attribute name="Built-By" value="${user.name}"/>
+ <attribute name="Main-Class" value="YalpAuth.YalpPGSqlAuth.YalpPGSqlAuth"/>
+ <attribute name="Class-Path" value="${dbLibs}"/>
+ </manifest>
+ </jar>
+ </target>
+
+ <target name ="clients" depends="interfaces" description="builds the client bsae files">
+ <javac debug="true" srcdir="${srcClients}" destdir="${build}"/>
+ </target>
+
+ <target name ="swtclient" depends="clients" description="builds SWT GUI">
+ <javac debug="true" srcdir="${srcSwtClient}" destdir="${build}"/>
+ <jar destfile="yalpSWTClient.jar" basedir="${build}">
+ <path id="project.class.path">
+ <pathelement location="${lib}"/>
+ <pathelement path="${java.class.path}"/>
+ <pathelement path="${additional.path}"/>
+ </path>
+ <manifest>
+ <attribute name="Built-By" value="${user.name}"/>
+ <attribute name="Main-Class" value="YalpClients.SwtClient.SwtClient"/>
+ <attribute name="Class-Path" value="${swtLibs}"/>
+ </manifest>
+ </jar>
+ </target>
+
+ <target name="swtgui" depends="swtclient">
+ <javac debug="true" srcdir="${srcSwtGUI}" destdir="${build}">
+ <classpath refid="project.class.path"/>
+ </javac>
+ </target>
+
+ <target name="clean" depends="cleandoc" description="Removes previous build">
+ <delete verbose="true">
+ <fileset dir="${build}"/>
+ <fileset dir="${srcInterfaces}"/>
+ </delete>
+ </target>
+
+ <target name="runserver" depends="server" description="starts Server">
+ <java jar="server.jar" fork="true"/>
+ </target>
+
+ <target name="runclient" depends="swtclient" description="starts Client">
+ <java jar="client.jar" fork="true"/>
+ </target>
+
+ <target name="cleandoc" depends="cleandoxydoc, cleansqldoc, cleanjavadoc"/>
+
+ <target name="cleansqldoc" description="Removes previous sqldoc">
+ <delete verbose="true">
+ <fileset dir="${sqldoc}"/>
+ </delete>
+ </target>
+
+ <target name="cleandoxydoc" description="Removes previous doxygen">
+ <delete verbose="true">
+ <fileset dir="${doxydoc}"/>
+ </delete>
+ </target>
+
+ <target name="cleanjavadoc" description="Removes previous javadoc">
+ <delete verbose="true">
+ <fileset dir="${javadoc}"/>
+ </delete>
+ </target>
+
+ <target name="doc" depends="cleandoc" description="generates javadoc">
+ <javadoc packagenames="org.umlgraph.doclet.*, YalpAuth.*, YalpServer, YalpClients.*, YalpInterfaces, YalpOutputs.*, YalpInputs.*" sourcepath="src" author="true" version="true" private="true" use="true" destdir="${javadoc}">
+ <doclet name="org.umlgraph.doclet.UmlGraphDoc" path="./build-tools/UmlGraph-5.2.jar">
+ <param name="-inferrel"/>
+ <param name="-inferdep"/>
+ <param name="-hide" value="java.*"/>
+ <param name="-collpackages" value="java.util.*"/>
+ <param name="-qualify"/>
+ <param name="-postfixpackage"/>
+ <param name="-nodefontsize" value="9"/>
+ <param name="-nodefontpackagesize" value="7"/>
+ <param name="-link" value="http://java.sun.com/javase/6/docs/guide/javadoc/doclet/spec"/>
+ <param name="-link" value="http://java.sun.com/javase/6/docs/api"/>
+ </doclet>
+ </javadoc>
+ <exec dir="." executable="${psqldoc}">
+ <arg line="-d yalp -f ${sqldoc}/yalp -h localhost -u yalp -p 5432 --password=yalp -l ./postgresql_autodoc"/>
+ </exec>
+ <exec dir="." executable="/usr/bin/doxygen">
+ <arg line="yalp.doxy"/>
+ </exec>
+ </target>
+
+</project>
+>>>>>>> c62ff958823168d7622b397609220db8b67fa731
diff --git a/client.policy b/client.policy
index 0a0cdcc..d6dfbb2 100644
--- a/client.policy
+++ b/client.policy
@@ -1,20 +1,20 @@
-grant {
- permission java.net.SocketPermission "*:80","connect,resolve";
- permission java.util.PropertyPermission "swt.version", "read";
- permission java.util.PropertyPermission "user.dir", "read";
- permission java.util.PropertyPermission "os.name", "read";
-
- permission java.util.PropertyPermission "org.eclipse.swt.internal.carbon.smallFonts", "read";
- permission java.util.PropertyPermission "org.eclipse.swt.internal.carbon.noFocusRing", "read";
- permission java.lang.RuntimePermission "loadLibrary.swt-gtk-3448", "read";
- permission java.lang.RuntimePermission "loadLibrary.swt-pi-gtk-3448", "read";
- permission java.lang.RuntimePermission "loadLibrary.swt-pi-gtk", "read";
- permission java.lang.RuntimePermission "loadLibrary.swt-pi-carbon","read";
- permission java.lang.RuntimePermission "loadLibrary.swt-pi-carbon-3139" ,"read";
- permission java.lang.RuntimePermission "loadLibrary.swt-win32-3139" ,"read";
- permission java.lang.RuntimePermission "loadLibrary.swt-carbon-3139" ,"read";
- permission java.io.FilePermission "<<ALL FILES>>","read,write,execute";
- permission java.io.FilePermission "C:\\Programme\\VideoLAN\\VLC\\vlc","execute";
- permission java.io.FilePermission "/Applications/VLC.app/Contents/MacOS/VLC","execute";
- permission java.net.SocketPermission "*:1024-","connect,resolve";
-};
+grant {
+ permission java.net.SocketPermission "*:80","connect,resolve";
+ permission java.util.PropertyPermission "swt.version", "read";
+ permission java.util.PropertyPermission "user.dir", "read";
+ permission java.util.PropertyPermission "os.name", "read";
+
+ permission java.util.PropertyPermission "org.eclipse.swt.internal.carbon.smallFonts", "read";
+ permission java.util.PropertyPermission "org.eclipse.swt.internal.carbon.noFocusRing", "read";
+ permission java.lang.RuntimePermission "loadLibrary.swt-gtk-3448", "read";
+ permission java.lang.RuntimePermission "loadLibrary.swt-pi-gtk-3448", "read";
+ permission java.lang.RuntimePermission "loadLibrary.swt-pi-gtk", "read";
+ permission java.lang.RuntimePermission "loadLibrary.swt-pi-carbon","read";
+ permission java.lang.RuntimePermission "loadLibrary.swt-pi-carbon-3139" ,"read";
+ permission java.lang.RuntimePermission "loadLibrary.swt-win32-3139" ,"read";
+ permission java.lang.RuntimePermission "loadLibrary.swt-carbon-3139" ,"read";
+ permission java.io.FilePermission "<<ALL FILES>>","read,write,execute";
+ permission java.io.FilePermission "C:\\Programme\\VideoLAN\\VLC\\vlc","execute";
+ permission java.io.FilePermission "/Applications/VLC.app/Contents/MacOS/VLC","execute";
+ permission java.net.SocketPermission "*:1024-","connect,resolve";
+};
diff --git a/doc/EFL/edjebook.pdf b/doc/EFL/edjebook.pdf
new file mode 100644
index 0000000..ae2533d
--- /dev/null
+++ b/doc/EFL/edjebook.pdf
@@ -0,0 +1,1423 @@
+%PDF-1.3
+%ª«¬­
+4 0 obj
+<< /Type /Info
+/Producer (FOP 0.20.5) >>
+endobj
+5 0 obj
+<< /Length 245 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+Gaqco\IO3V'LhopMH=9Go*rTR/J3u.AiaF1?r1+DYfQ:6;%2N/V`<kZN\+95_?c,5i,V:Xi)3$`@N=Sp%U<2E6@^hEejsb(fEZCtgp3Y:c!VT-rT7W*"Il^iFad#41Za&4Su3jU/q+!0E80g^67p^M^qXV1C<8b1KLSAeW]U)DUIj]91F>cpoXF,ElXn;k?'1,)>[qHe_,+j1<e;NREX9\!*&NgK&F?Fhg/h;J'.&[P!2Q2Y_u~>
+endstream
+endobj
+6 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 5 0 R
+>>
+endobj
+7 0 obj
+<< /Length 642 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+GarnU9:)+j(u>'>=D#im(cCI+>r"uuVQ2ms2`"_nqIsUS/<](i^OFO;!L"K^groH%hZ[/\_;hF"M@uGPZj8ut"q_48(SN5eEJWc9!lo;6dL*[Hed'?<b0(#HNotJr>g+BKHKGQF5r*+9qF&lZ,I[CipujHs%^%!<@KT,.U'BkKrd:BL%fD=703\;g7BKCghH)mF:@WA].gOpsR'ms/mipMYKZHlE6/"H+Br`j8`c2iM\oB'sRXkO4/MD-L8dQU&d*Rppk:B=jlR[O!Y!RJR/44YGaAS8MIoi%Q#F3V#;*_"Wp@^Vuj5[I*aFT:WWuhE]Fj4SX^?t#u@_F%E$Jo0]SKnMJZkk*"LV0,40Z5RaWsp;6+HI43%TD#fn].:3;,45@_,re'DK!YKd<>-RqVX4!r%p\+i*Pg$fB3Y[d;FccoNMN5TDfeVOEMn?3_?2nerH+ZkgJ;f#mElXRBp64I9.h*fMXr)"#lI,C63qlI9XQ?BW0KMMt7r0NKQOV7_(%V47MYpDpOqAG38_n#?S^+rVu_`gOY7K_'0@WRTjJm?/Tnoao8$E=j<OYo#@32DpGMOjQ(Bua0cVX,ZUZ_)Jj$>VSV05F*Ms7oh\SOFR)c,,bQ@V(9Gtni%2^.HZAMtW)^>~>
+endstream
+endobj
+8 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 7 0 R
+>>
+endobj
+9 0 obj
+<< /Length 71 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+Garg^iGoCd.c`?]8EV`b1=.gR0K1`91K?+0ZOMGdU/Zh'Y!=Te%#&:?HH*JE!<E/X&V'~>
+endstream
+endobj
+10 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 9 0 R
+>>
+endobj
+11 0 obj
+<< /Length 963 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+Gb"/jcVN:L'S,ZN.su0/iPi&B-bDZqM.tDL&S[$*6^g'T,>GsJ62U,;?d'"UCmkK8nC5Wo2fe4Vhg9fJmQi[THV>"`fF(N?:0b/p&EHkFJqSnbjSL)1)+W'mI@E^r,*NMjo7Xn&-O`_-Zo=KiGq&?*j.PihqG8cg&TOjOWg.L(-!ianZN(Y)g1:Sn(ZG&boP"%fRaJ$KWNVT"WFhN*oh><tq]6:[d-E!pRXdZ7=S"Vg1t+W'-GH#2V(S(gUf9ch7hY6NrS<$TJ=^i[n9bm6qIbu/\;\[G<b.V7,0Ru"SkY7UB4jss6!Z5=5(S7`#MS9L>;$P*I.XX?D;X:%<[APo=;G+X7W"jIEo6%PebXW;iRg?p&C>3g:4-t>&\H8Cs&H,*<;F\Xqm.YqWq<1$CGmK#Jq8GApUNlV4J]u0MN+_/=I5M$Am?)<;Q"MDAa6'n?P[qBoG@6=Kdn,Lk\4Q;L1LiW,;ZZ:m[p^J``8H[hjB71Q"=",*9TsF%MTj^Qd]f?V_3)iJUiKW%#:r!`)t,5/*FKGl$.&Xf`V2gEE_0o_.@%7;ec1?,>^B&]ccmW7MHfMbBJqO^1CAfDE!i,$#kBC@Q?C)5$5c&_7H+&?\!8a@i3#e>;Vk(`e[R$b2]%J]31Y8M`A7\$90.(1-e*#DQuErf;Ng:942C&.dPBACT/o+hf%%CAh'.,f*iQR5X>A1k.NrORpeIblScWEV+_l@Z-kU&754FqJ:N.k4YdT7T$h=Q7je!,Y"kON8)FL^&C;X)#1";"%'F_].QWo3qZ`hLPZfZIh0is3Tp5``oLrqrf1h[Y6L-g7J=XGh5L6b(r^>9iigopV5fVY6&CAUr>EaiG1pb!/$+4]>gg44O#%(mj[ERB8^#3C=#m^h#ksGaD6HE"\\SD/?h8Bk%V/MAr_eqnHU3,sOEY.&TctA^U5'Is0W9[kY&>tnP2C,8;o9m>n+-YTc~>
+endstream
+endobj
+12 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 11 0 R
+/Annots 13 0 R
+>>
+endobj
+13 0 obj
+[
+14 0 R
+16 0 R
+18 0 R
+20 0 R
+22 0 R
+24 0 R
+26 0 R
+28 0 R
+30 0 R
+32 0 R
+34 0 R
+36 0 R
+38 0 R
+40 0 R
+42 0 R
+44 0 R
+]
+endobj
+14 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 120.0 655.001 190.26 645.001 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 15 0 R
+/H /I
+>>
+endobj
+16 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 144.0 644.001 193.44 634.001 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 17 0 R
+/H /I
+>>
+endobj
+18 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 144.0 633.001 260.93 623.001 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 19 0 R
+/H /I
+>>
+endobj
+20 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 120.0 622.001 234.71 612.001 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 21 0 R
+/H /I
+>>
+endobj
+22 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 144.0 611.001 239.83 601.001 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 23 0 R
+/H /I
+>>
+endobj
+24 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 120.0 600.001 241.64 590.001 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 25 0 R
+/H /I
+>>
+endobj
+26 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 120.0 589.001 266.96 579.001 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 27 0 R
+/H /I
+>>
+endobj
+28 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 120.0 578.001 280.81 568.001 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 29 0 R
+/H /I
+>>
+endobj
+30 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 120.0 567.001 310.81 557.001 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 31 0 R
+/H /I
+>>
+endobj
+32 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 144.0 556.001 232.33 546.001 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 33 0 R
+/H /I
+>>
+endobj
+34 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 120.0 545.001 250.54 535.001 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 35 0 R
+/H /I
+>>
+endobj
+36 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 144.0 534.001 206.22 524.001 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 37 0 R
+/H /I
+>>
+endobj
+38 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 144.0 523.001 202.6 513.001 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 39 0 R
+/H /I
+>>
+endobj
+40 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 144.0 512.001 222.61 502.001 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 41 0 R
+/H /I
+>>
+endobj
+42 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 120.0 501.001 238.59 491.001 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 43 0 R
+/H /I
+>>
+endobj
+44 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 120.0 490.001 195.25 480.001 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 45 0 R
+/H /I
+>>
+endobj
+46 0 obj
+<< /Length 463 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+Gb"/gZ#7E4&4#u;`Jn<ANU:d\`hJ3].T221<?2..-l"!Z$#S4rYDnAO&-E<7+=kXAI6-PGGHiqt]Xna\.L@%ZZL@q:4:6Xg-qHf/#\?CJ'TfESeUP`B\d*X1-&DannB8f-E0P")[AnQB#0EW8/:[pcLX+Z8Us)Mc@R-lf2CT829GV&;r9(B.lb"e>,&8RHj]jD1&@m'4hh9_f7ueQp,>gj]dB6OjoEUW:rkQ,D@@>F7H:-EG>0Z?>aHk!8K_3\=3ca<F4:Qmth$1\kD%PfQ40W?6bL90kQ\@W5oMP0P=74/WXV8$a;gM\e-G"M58+2;7o&"Q#rPkII2:K%%IoEs(8%2'Lea0fr'O.X"hQ9$A8QR!>Vn3jCiqnLN9[s!r"<bTTQg)T=[8Nd`@&I\.Gb=]5hptZ(YK[,fbCQOuJq`sY%?n]F:nP=[`\l'5JEqKs#tf"2=1dK7klR2e~>
+endstream
+endobj
+47 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 46 0 R
+/Annots 48 0 R
+>>
+endobj
+48 0 obj
+[
+49 0 R
+51 0 R
+53 0 R
+55 0 R
+57 0 R
+]
+endobj
+49 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 120.0 665.001 211.68 655.001 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 50 0 R
+/H /I
+>>
+endobj
+51 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 120.0 654.001 213.59 644.001 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 52 0 R
+/H /I
+>>
+endobj
+53 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 120.0 643.001 235.27 633.001 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 54 0 R
+/H /I
+>>
+endobj
+55 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 120.0 632.001 237.21 622.001 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 56 0 R
+/H /I
+>>
+endobj
+57 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 120.0 621.001 247.76 611.001 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 58 0 R
+/H /I
+>>
+endobj
+59 0 obj
+<< /Length 336 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+Gb"/d5>T0N&B/jCMAt$<LX1J0A>IQ^^]O(](eX*nY!OA]W/,AQh)$mhfGK]HjQ6.(XEX7)c83YH()"]].)8lB_hJcmE!VCf%_4$n<#Y*B4D,1Rhb@K.N58DUJukrsUg:^cDEi[gY]mob"7]b2C^3TGZ&n8Qa\_FD&>P)BSSZ$s\tj/keDGQW\*K2^/6BRZSW<lNdM/r%SbhbF,E;=7&kYS,FNX2DL6Y=J^-9m4m7e5fmdm2ff;\9#.bD8f.`P_.p"-AeBr(bs6Yb^3[<'OJqd9:=>GDH]W$Cn!Xb2KoZC/D=Qn+CchAb$rj8t0'92qeG!XG?0IK;$VI,k~>
+endstream
+endobj
+60 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 59 0 R
+/Annots 61 0 R
+>>
+endobj
+61 0 obj
+[
+62 0 R
+64 0 R
+]
+endobj
+62 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 120.0 665.001 242.22 655.001 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 63 0 R
+/H /I
+>>
+endobj
+64 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 120.0 654.001 242.46 644.001 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 65 0 R
+/H /I
+>>
+endobj
+66 0 obj
+<< /Length 263 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+Gb"/c]+2\3$q9o<KuYrVi]QLLUeh96K#iZ`OJ&P.MPh#X:I7>N`!7tq=jD/kj6^GRoL9aT;'k--+^lT$UjiNK:dWATVT+4g?li%bo;)Op`JgcB"4=jXM"tmj*Hpai#8Z7;hJ@b=Q[&$n8h(6YRijH9<eZ2mA&D*lDfA_]>Ee[/p,rii5%pZ%JtO0oe5As>:1R$`ok]N@M.>@)O*Y2$BYcf5H9/1%&6"_%n&<qPrjhd')_EAA!is^fh)<ljCl[?Q,<P!a~>
+endstream
+endobj
+67 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 66 0 R
+/Annots 68 0 R
+>>
+endobj
+68 0 obj
+[
+69 0 R
+]
+endobj
+69 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 120.0 665.001 218.89 655.001 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 70 0 R
+/H /I
+>>
+endobj
+71 0 obj
+<< /Length 130 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+Garg^iGoCd.c`?]8EV`b1=.gR0K1`91K?+0ZOMGdU/Zh'Y!=Te%#&:?HH'(;l+<?5(kRE.dNH[IJ1;6A'oX[qoo+kF9TA^=bS<Hb'r!S.1,C^D'k.nE]Kh2R!5=[;li~>
+endstream
+endobj
+72 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 71 0 R
+>>
+endobj
+73 0 obj
+<< /Length 3690 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+Gatm>c&^U?%_p=s&bPXk^sp\%S?KW6I8ces"l=\:Fq<=j.(1m.a-Q:4VeQ/-Pss,s*4o-W(V/a"9-cr''Ii.]e(q4"QEs#GCq%U@e);pM4l=LsWW14URmiLcf%XK9c8N#,CA.,nO%4>-Fo?LWDR%k?]5>,`cgKsfN$!t]3i;iS:"S9]^:^$8BD1t1OI.AajgpWm93\N]1u!VhcaKr]ER%eKCd3#!S#<uq(cYlEK_7)p[]:^56ku"lcY[iD)K%'Ck,pa*X),s)GMmXk'J(;BBqCBf[[!0W5In*P'^/&o^R0GOC86L0bL,B@Tu4TYCR)B'LU#^;#F,[ZKl5,@i2^[F7MngH^>k%lc8M%_Q);6<A!af<27l*&Y%!&?"/&DedcC?HJ=*r8F>7X-b<s."p\'mBkJl.eL9qrAY*"=9;f*FY0F?;128-N0YI!];NKA&2#_#@7LX$"R>FmGKS/EM\-b;J?oDLlj`H+Ek/S`VSY95GIoe>cQJq(Pl6I2mO4V0*p>.%O]H[L40<$S$@ct^$u$an.0TVs77rMdr&!U9tVQb)d5d5NW&=BFb(7-Yct#u=(IM!od:^IU4sna0I`Dbll^OO/ob[hXiUj<4<dUDROa84d]oji2,E?*gX?F#_[RlPD`#DJ/\k<J*^?Jjl>l('+tL"@tL@!.K^d[FrG3n[fO/<(8!SDBC2d*o08bi#4bX/@d3.a@cP>h74;!_!rd7C9nNojnAtL"3Y6./TfY,LqJ5JMnfR!1I.-)LeNQ\*OkcphM$S[\%93Zg/6O9YU9u#j#`)-HeGsa<tM9#:Ms?a@=SiASZLb1?92MfFiFVP6*%DL"TWL'"$k<8TZ$mfLdK2)EVnPTK[FG[X)bTZG]K^'W<?jPo*QZgC4t=J#HO21Qm'uY0Yb?!ePW`:?=LQ]a,RK1ZE`7C0?1#?WS`@8Xj^gpg[2X@r`qCKIkZkj;%o.-&kl/T*cE0SL^n:&X&BrN_8;-A#3.NNMd^1SU=@M3QQ*kMp:@qN4V6n,U!i-FK'.+>WHQUqW[9h[>HmWIEj[ab*e&J5d(tD/>hc1^3?s)I5`">">BIB*^7H:[po4Koep1:R'2\^H6!m7d=7\kd=Y-:H/nC08FM4*us/&s7;a.due049piX]D-Xo%5IX3"k[onV]3PM@NVO4%%F?:61E!X/M$V/m>"Zo&C1g4(anX$&!:6JUCQqT,!W%J$S4d7+CAg^MS*W8$V+66;_OoF85W,2AoKKV[&/kY[\i]Tmi-2-4^Rmm6Qa0%nLjL&aau+OD._qqA`:rBT8U]b%Tl>)RrcBmdE#7i,&A>kC5e%[D@k+dUM(mk"UX^-[pfhb<8Upt\I\\&`m?(6QnI=A_PCc-eF#,=m'a;ollg@%Ii.-H;Fc#J\FX!D""OH/[G,k[-ie3jE/@*NOY&I\lsX8g=+A0A_OW9\@D;G.i=nd+`.pCBTkgA^RRk2^b/cK>Ed$'D"W!(P>AY$JCVpf8,qf*=dD/HL?A.'.@6C@O.=a53gIgF/u(]Fef/Be<l6$N,A4KhGGof"))m(1,9)PP;YLYZhg?\0'3a7252\tq&,HdEOSRSL?Ki23S=:&7Nes&4g@no9'&\7nkntD1D;a%me!V2IuKD#%,#[C[R)(]<o#CA?r7F?[h/Vs7ekANHS>5L_GiHrR3Gkj21SY'@$03%WIu6A3CbQLYDpVQdJCe;[TbseB\cW)-r?1cX+>)l?jiN1h0(4^S1eq7`u*mb+c=3%h@[Sj%VIHlaqU7m+fU`SUJ_nB:p<cOp(oG!M]P9.@"N3!9X<S7`B>Am4DDt#F1)RC7*F)X%V_@aqQ`XgqX_:r%.6=S6[-_8`2)9dE%b-r*sPDJfH*am`$AT@_79JP'4TLO*oReO#d!ctXVGFt&\j\g*;H83n%Pdl4;#0Q<&g@&2<=[s<JmU"-\C5L+`^6j4OUX@IitRuCF>kq/2t21/8dV+6S7kG+N!cDX[F+(2Z-BACrC0*OPoWJ[M=3Xkf,NH?\l;9huj>k$<1t+-pC:lS4EX6.f*IoToM)"\?dj?,/`d\EDU&Wln&%*RiQQ>OK1ZOEO.kj&E>>S'>Q*EVJUr*UM,2Ec7ja41G4l3fgqiFip+p"[9n+-Bfjkq$Ji;"@D]EQ,2:*0l43G\D_XYWiO7'>h>-jPpCBNHYC$BX.t.KV63P43Wo*n8Xj>4[KF+8]?gfRqc?Qf(,WpS81T%OSqH)K1[i!0E*[sVPD1)@:1Qh[r`N@Hu.$jA5S&Ond?s$2OB\XHR6W=K+]/kq<Fb1UW2;jI`PmOZ)e%Df`rM_lqGVBK5j8U5MpJL?I&%I#W*cQ!$S-jJFI<@VRNMT1SK:3*:de=q(j6?`He<L'9F<>oMg!,D'i/AkOl[uJ#iO;0//HjE8QP975Sjf>8bWK)\P72%u0i3rS;@>f!l'e8ue6)U=;8dQdDak5T_<",<EJ"*i,ep&ZD#+ec5I)fr#RD((2*Y"$`tcNJ'j5NtFQX:n<kLN07?Yu3:X0H+OG5OI432k=%t$5!$/QWeR%eK.%`\u"Mu!t_K2YR.O%qk.I11*u#-?=)\&rb40(gK6=YDSA.nr(>)R8U;[ucjmSQXbP*M$?[me8.q?OO:r>JP;t_Y/BhD"&h`!8SG'gh]Jf)>%>C+QarbP+-R#UMt2c+\A`G1pEoDpi7n9h+/QmeQ-53(s\cuh/(&qrjKRqf8S[aK!tC#4Dtl[L^cklAUd]<K!VUH=b*Gt9_I;`Q(UMYfgLZD;*Wg-kV!VX*^+,*9fah0(Hui8Z3*%e+@/,LBe"kJ5GRs&Iu1/sbgI0g>+R1ZiKKWukm^R9T*Z]*n?<DJk,'$]Bnqng9>#i":IA.TGLbM\4q&dr"u=SO`lu(.`;hqj#0!mo7IXRp.'Q,^Qp@\b!3\qD_I!COEg'6)_$T]n!2r&bToDLuNWShj)F3$5#jE3@:nO&4$)(%%bW_FC#dAc;?8MfO6Q20"fG.>:.m:g-b^Iq70guSPY]QKM%GUTs9_uVrR1'FDU!S>?;?*8c8s^3mPoe4eiamSD'Xbp<eO3HUlnTdR@S$CrFs+C&@!nqHq[5^6l>Z"o6P52m$56q'cUHRf60AUB\(LCmj4L6pln,l(^jfa2Kn)^T/V*>b!&*rQo#V#[pf6HF7Y)?CV>sc$MahC<\G]mq!bk%]X/_e[!oDrllS7_$+q=:4J\QO_OtP0m0Ere_-Qj8rOfl1pq3"bt8Bl]N!<Ec1cNLc!pN2Y\A7);<SKa%==U'5h73q[c*Gq\k#PSg&20(J4Rps)F"[JGn!>W9BpB(IR,bk:0+Stg767<r=iia:!#E]Mu$1g[fHh!eM7<jDTR"Ts5+RSC]%Q$G!2q>HJ_P-VBgYU;,Zu1$`_6)gH/+S$jfp0%C%l-6Cf@WGaoET8Z0'L]l-e#tO:LK`(0,J,B3-5Z]YHWm(Djm(Y02G*%O3KuN"X7_pDhV4N]ahI$5;CX9KQT6E`a#)YRsC/_<`_XV!ePY96:t;q2%1XU5T<u=8"N3F6\L&7n?_H!kf@1``%V'[3;U<.W<O.Ld.YR)HlTK0H6/o]:_Kl!p@bQ5aWHm:719./&t0P88-/[/mS]17;<us%#o+H=`IEC@gcALDFB%6=fIGkqlhsZdM%,N_bg_)GM0.S"]Y)ZQq"St*#Q.peFPLE_%;Zg6I`SVAZbtVVmQN`B40CAH+,ok;_4cOSXaIsG@co<4^OjCsf`~>
+endstream
+endobj
+74 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 73 0 R
+>>
+endobj
+75 0 obj
+<< /Length 2983 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+Gat%&D3*Gm%K=)V_T8))!(X)69B`;7RN>A^>FPd+5u@cj1q%Oh-(Ql!B3Y#CQS[]YPV)@4#dB\O&ih4m_g+_sqhMf\^I5+Vp9H5Q4m_V7ec%1'q=$%>D*lQUV-35_nRhH5>lE^-pP5KpCA;]>2V`,]4S//dod9=nptZqhEN73cF-5lc(H/k\*.Oo9<u7#aJ,e?iT<!a^K#>\[nA-u$f=;fQ7ZaLP(Mn-aos]QgeY@7F$5,!q]m8m<$n=-cqj)6<_u3F(LUo#Tn[.a(OQa8kDqJijWYju\a1HX7[@A'hGcY,gU@Y&i0Be%7@:D%E31nE,jrta9`7_*#[E3'MGo7H9.g@\5b6VT%:j25.=1I*83HSm<[H@"(kY@,Ag2u.PO5Y#`8Ldi/VX*Pkca%Vo%uf<?:G.Y?SiZt1n`qSi)s2I`6e*!jgZ;,J+_Rh%<[mW'W4J_Qojb+>26mXl4u)'4&T<rT^kIchXZXR^6HU^Emc<,%TS/qNdibYpYdGuR[2(Or>.@^Ya(*^RgHLT@`ZIDDo]pO$U-PNnRbjhu.m.VTn4PRg?.Z.]4Oc\nNaXYa?(RKoBV&=P:ee\d2([C&!s;4'V%6!I.l;h#$B&.p+e&67`\GaI0dqsG_5N$Eq?A6S4C6/Hr13D4lPdS\K\B?nGn?oO8(D>ifY#RUhdLm8Z'!shX*EED@r7Y92BA%@[O*],"tOu8:^8:/#[=MI_?8PNBh[c6I`eB0fblj4@6##Zp?KYPo5i2V=VhOu5Se\)X9ML?G.Yhi7MWhJKri3DWlOUAohDV-::n@e>p#=s*KOW7:NK%7Vj_e;L!p75BMaD%EQX70j+1qedASM;cFB7?*,agdaYVV;>f07o&T0oTmcm7rdSIP:]J's428p>gY%#5sD(eV/W[\lP-5@L$?0ec^QaRTl5uM#R$4NUnfi>?p#"EQhY@l1W923<;%u9mEXdHs\c$Us1fnOS?iPU;I^DP,:B]-.QM!Pel]nBnZL6[#S`+)mJLr<H_Z':QBO;q>-4.F2A+&SEM'nqK&\JJi94<=[&rM;';@6SZBG^ab.[['Jr5#D,$oR5=JWcZb-ac8M`e)2h@)O_f3gA(rddC1re<Y/,8&FK(G.h.FgR@@N!:*ZN#g)sS_1G'eI+,dfNDjd4>!t2gT=l\*q0kW#dFM0nPL2a"V=@*#\[U.6YRY[MmNS0A(*?kP3e1rfQ#;qMmR0%MUa(+,$#b]e8or_?G[5D,q1=4;T%#eRk4@ZKT&\79WXOC3S$>OotV^@"edrK&dS%/`h&T+lOQI+-)Ol+FY0F>q*+s(8<m5-^KCc_]KkhWEaKq>=WR].iX,ofD&N5/I2<C/V6=-)=ir)'q;](7n>8bfbghih0hp[LMe2@jV`%Qr<0d>g:7,mW?E,@`iNE.%!n.63365M<ZjUfdsk3rsn8U@i=4#.P$\U-p/<4(6Jf,pK!I[1(3D3l=f*-TI7o3NJ+N=O((qW&u'1>=e_k^ZqCm8`]c_i=PZ`24(\-Lo?E'gZ*uY1+*^fCbo]KBb0P<\EiZO]tMk-;JVQkk!DW-lZ"ODJgpoX91+>XXOVTjLEq%Ij3i^PV\3Pu%-D3NF'%napVP0[`S<n\//$hqN_ta\GV5R)?rP'bV7*;8:m&3+in.c<5Wj2hn\ua7$_%'$_(+Dl41/qTcnrlW9"Ni=!V%L'mPq$Z>9:E%8l*b"HM1%VkH9l!c+TMWI25Am6&krJ+XZE8-$=Rpe[^kg3*$Bf#A#nG_2mtmb2OtekhNQCq=X;KM&-?;>fDrOI9#Lj\[omM0+R,j'f:_EGIS%>cB.OhB>J]V=L>-nS@,<RiE-S4Y8Oggd;4c20gni/6$aEdQ_rM]hKX:*N1';+;UON]s*e]#3-r1&@kim1W4?tN,[b?*2WEl'F[oaf:3)D,%gVXAjG:]2<8&#GiREn61^m$9icOV(b;@d(LCDi(9[2BkE+1E4"<K7=rD:,02-/B&L)5e8V7R4Bf\k^udF8muaK\:^B2`hD3DKb>VN-T<Lq]i#U0]s//.!2XeVR"/QW\RfmH08aRD-8(&fUu*R>iAbEBa+4Hhc>P5n]'OXd!Fc<e_IHY4ORF_C1dU(%h%&jJK9=\.4:md*&C_dS$U-L5@L3HZ^H=Ri[PrBM80@$feeRW@Qec6[A]*YT_f(i]NWE:VCJe5+I0E#[ai<\S'Qq#SkV:0qutTT!aSj/B.Nbo:cB-ir3B;&hisf]5O-DC>g0l201soOPA.*Zi>Bp0TJ<CRHr9!3Lr2j%aSEb_(I`*//f4a?IdKE.+/[\[2-Q*ajrn]OlE)$e5u'-K*(s=2H_t_@puq\Eu1]\Cn'O%:)o++NbD#*:?[<W!a+*3UtFR5HuB[p1.h0u(iueRECR]Y%(17cK$;Oc)aE/7$h,E]5<B.us7.+dq$`B3&^L'Ed_^.\\W2=,71(spkm"o@eET%mUX&r4:scn^G_s/R,#I1n#5O]4HSYo)O3n?!dn4lUlj=Ob!;.1G!rC".m=JW\otk52Nea5ZK;4p5#k`m7)u1F+8nm;^HaDg^2!oZ5bf8cL6>1Cr:Bm[L#Gh"\9,5)!9l!C3WFE:LR'SiW[RL"75BNg3o(mP0MQQjPbGS..)<T&5Q9BiZgLOjo5Kg5Ui.m6%S3BM-kBUT$LN>%h_&=EmB/C7m#r)RraMhoJkaFA8R>1D".L=N31G<o;*:$Y(7A1^Y:_/(FKMK5U-I`,^N#?K\CtV.:B3t!mF^OHQKt<,#"qXTq()jXs_SAnIgHN\2EYDtbAT3nY;?o5o\JY!<5?%UWe%6\cgsA]706W8'lqX>P@_RZ_;'a8uTc3%L`e@MDUojDpkZ4LY9hbm&c:&(qJtA5nV09hWdA#(Jc]nTG-nr+51,PpV\34nD4&#\c,G,\X>sHKRiQnjZU6XMh;j30Uh/lV"RWpH%f'CQSP04=1iSj28r8li(8B<8#Ej6Y&gT*WBG'AGJHiJ'\+rH7Shcj^f&\O;qT)6h:+j^-pAgaVU~>
+endstream
+endobj
+76 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 75 0 R
+>>
+endobj
+77 0 obj
+<< /Length 963 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+GatU39lJ`N&A@Zc/5D&O:3UmT;`uue4nR<_6`$f_>VLs<Cgp)&Wp5*&Jt;QI]Yjqmfj/40Dq=MlSo;W$GFr]'$s59V%9PA-@)C\0'<[!Me;T%"A@tOK?^9<-?RKb,gK@n^]hX#%j3QSROLo"63>h#Jdq\E7]kO#KfYQ]uG7_[.g,_bZRr,G\#k8\Jp%&/@C8D5ul2^jq/JJ6;[DcU?cEe<#P6@VjLqG-;kq^%2r0:%Fk%1gBVm+J0_[%_X+CtZjWgs;*.,/Tib3UZ=JVdpg=>0d.!*uL6'i1o[VR-DLK.9YuqmV:A.BdSg(&;i5[AOU%%GL*nqS;^gk]Rs9dK3sC_5c.*ZCff;Q<0Q[8g9j)J8$d.At)B&=BCD)5EXn'g8,?gRfkZM>(uW/S7]*L]<$bS&Nd/<-4WUT9tIAo*o^`s<QgakQb]6a:*7f*7g[ZZCq<lq_rih;#Fk,e_FdYL4\U`E;$IUl#-;if'`:<BfZ702/]!UJ4hei]U"g%+d5JhX2UV%]RNPK/a%2[*"%4gN"Vd_AD*\M^mGIgE=.ncojsOE9COJM?'23tr;f.8j#'R9aOjS^QCoWWK5STpGA@\)_A^`hB,Gd]i=&Y*S#)07X)@6jV?:$O/XqO_mePHJ^N"%f"LM=[8&GB`T[g#6J+ST@a2[3f/+MZ,WXpsTYj-[I+ATWF!EG:!_KhUOD!m1n<`lS:CN9cp&S6HOPa#-?p;P1=(ek<52"!+N:''s;)=4q'u)<Y\7='a.mq0;N`1<uGEQWfMkIU!VqVd`t0S^CqD19[E))<XQ7/#b^#6:A#X?;2\Ukf)+U7&o&p[XtP>d%:o@[a3Hr(L0`N2B!+oCUMK4!OQemDLCj&mWOdL94if0K:C]KJb3:S5,sg`b4QH#$t*#F*ul+MpL*EuY0XT3Wn<X)Y*cW_dI_Vulos9LK6'%L-T6H5bj"D'Vp?;9e->a[<,BAu~>
+endstream
+endobj
+78 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 77 0 R
+>>
+endobj
+79 0 obj
+<< /Length 1401 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+Gat=,hbW8l&:WfGLj3A@%/q-b[ng:i?#eR%:?:eaWj8b]Ak?Jj8L_@%rU8o-DXFf&-nD)C1S+"+GeTU"iDY,EoiVJ9!=Ii.#n!OW3'cU:#:*j".1cN2K6SI8F]PH"HjD>l[#R?IpI"Fo&HB"nVjJ<F-j`:h(S=[kMn3jM%&dT^CaY&F86M/?aeVn$7raCak7.PZ!RmL1dN82UqkC*4I_$&j2]IJcLo=b^[7>0Cba,#%YLT-(?kbSEnU;quKdo`.Io?ST=Un%I[+1Q-]YRIDZ-#`4e-.-4,$TgXrMQ=ll[W@MdafP_dV8,X&FbG%;+8D'j,PVKcpVipJFN7<*(K7ML]Nb]&Te[0(i['EfOf8Km[gU<>q0JN,XphFqu!IbQSXG6p<SGa(<O5U<nV(X3?["jF@0jN#R=hfc]bn#m*Xc?91OcS=ubY0`E(W*Sn(%$>VA]l1"OPG!d>5!%bts.e;IecP!K>;8IhFo0,[chp06T4*lL"Ta.(^kgMB9;:]9-1R!d'tE=fRA<DlL0PQ+*UJqLEF9dZ,TejrIcFKC8h_Z?h"A"g__N4k3Y+]/.jJJeoJa^0N7H(W$6KFlR\M&4L/!]0Es`30K+6BLs_!ftkW=_-&;!`LNJnQuor7KTg\'"G%8o5Le[I+g//'`ofN':NqB+b#d)PR.o6?0M!bZT'EWP$RpUGG0gaPP32Rqo_9F"B]c&Hi)oBn9'!ImFIWu@;m#I3rApEoOu?C"Or_nc+EBES]sK3"H;duhI##@7M8/*]8hq5_L+i4>s]2W!TA3qqn(26R0:ak.la48LjVSZra-:),V[pqq;=<J]tYLM`qKuaBIn^mY)2OG!Qj0RZ2G6SOka77N]b7><deU?#rf5)GPsU`p.M(qcb6u,58M>T+!/7FXg>*_p?FHkh7<9G0Nr>j17kV92DZ&;:"#c;S6=*1YBd!gcag4,ObZV'+-n`S]WcFA=355>lpVX>B3i-i/:CFSbXTUK)X2Ws9HH.-?[L\TOr'1U>'aDB-U2_#=Q-Pk..!gXh='HDCQRcfDUOn";cPk?WH5/#OjQg=7\g1M*V^d\;HDK9_E#&OW@bN[<GdcF@a/!Ca<ogsT&r4t(GsOYge7K8Xd6O8H`NT,`!qVa$NN@WHXW#g($87E%>=4FCM%=&2mubPA5AdS1Xe(Lq2Wr42X3;tXK1M(hcC%i[\jmpH]:gS"H!a7Sn=S?>KI9.$``og[U\qFd:T%6>J2BT1uIr:kIo]L9'=ORWp)<,:aKhiQWVZmZZJD^4aFXB[duW-Ec8S5[%-f-/BtXKF;(;EXT&C,d6fU(HAQL1f3MCT?uki$af!d^&*@F_2!;2QmRf3QCB%P+,KX^>F*K^GhO\SWnIN%Z:2L<*QV6&%%n5Vl4'97kgLQZrqB(N<f!>~>
+endstream
+endobj
+80 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 79 0 R
+>>
+endobj
+81 0 obj
+<< /Length 4988 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+Gau0GD3*_c&cR6o_UpNP!ut>3]@0QBb9jnLQV2Bhe"BbFZph+MP=7tpleVL88t6dE:mQ9g(<$=_4qHP*,B>a`dU2EKr9<P/,`/:@ZHHRmPIhXQ,]<XF8M]VQFZbSFoji98r:B"nDc6OKo(fr[ilOhlE8!4Hbc#ZPWIp4u]2aW]-ui./U8<diF%/ZB0Cff)F&RmR<*+k'lqMIIWnIi5g2ad)D(.oWVo.PnO.oTcbL77jTgcYabiJWl=-J,.G(8mnD7**Ned?QJ2f5\MH5!D-00eg[s7lG[gL&gnmf)eVX$9+EZZCO>kQD)1+`Ys'dADjs`G*:_d)rmW[U@NqS-B]O\4uuTq`NRZ:I?!fFtMhA`\)onL=NMb]c'_RX*HOo]Y)^I/lf#PVJ^<r&Ym+Agk\YT"qmSgM@!:?gc+]Zr@hgXj6N<?;MAfZ]D!C2r#>l/_d9b7,8c$)_?`XgYhFC4Pfc_Gq(178geog6JLG?:):_5W9B<fFU=AJ.pe54jZmlnM`Q=u(1SENch@q>Wa8k"W7E$@_s+UP+;a>[]q`NN[\Q)\\<?BT+EoZgX+!?CUZ9uF-i\]oS!Rr.j?A_^f&bR3m)I]4/*uQB^EZ,/fi1rc?]ac;]orrt>G"?PcI7i(HnP5+ES#O:4>HGNTGj2DtdFs'T6qsKqjL2)Zp+nBi*sN/UO>;gL6KFt3r43F[UBLYUQ4Ces+J]A+ICp29`2Ls_?6qFuAK8s.30:#r!92r;7N2`NNrU;`!:*[Uc>9*,M\`l#7ntS^J%,70Bd(?"f,(PXM-*dm/LGI"AX)K('X5+k;bPenD,`]nVV0Cuaj_SI[sdOgSO^S?ie=Rgo5hA*5"M@hC.=IPi5U?OQmG9F=qs>P'f!<^atd$-*,JJ&;huX+&Dc*(djNqe!Ss$L3QmH(_%>9qFe`L0BipSBmG)L=SEh*C^Q.=@G.["L3J)`bKG^i#?nU_a)D^]]%>b1(`I]SIlH<"2Ce0(_qLW$r<eeic=)UDlK/Nn^H=\oP4fA-3T:SqZ2'(9=L-<`h5'Yj8oMu1Fc?Oop9e@l<;)<8oAR.$4D@WOX%fiENkM.&AS".]Ka[?e<p6T"\8^n9H%6ML2h!8T&,XRP.$hS0DWG0U0Aa:jh3o7#1`up3]Zi[SV9PUT=FdJRm#>pkB91L\CHisUo=;3La@+:QA+m^3+Bs3Y*%9a[o*#.`RbhU^ZWc*2-^FjiMX3IVF&!mtDV9X2[4V-0+b$g:5ih".Oa+$f8,7nLScG6"D_.8U#ltq/]`5df/,]".mBgeaXK]k-"[,LBlk#kHsQ:l7TN5O%HRJ4dX2scuq5>JRia5c[GZ!;,BHUkC.%L'4`!!5fITKC7q%+0@@K!L@L/.F-7C;:h^^n<HtM+V.\0F_Lo&1i(#3.3[q3eoj%LgW3B]PC9E3=p5_p30.jUq!u)M;b,X3e[mP=UlEgBn#BVYFITm/f-01.c9R?>h+cMI^#=h2_aKc7M8*h$kt)DJX]SZ)NtZVSrfPi*p,9+#l9k6N-^"dL,:btB,K>)O!]]rMhgt?1GU[pp(tL6gYt9^^'Qh'9[Hgl&4OLLdb^8S<(0KCalLU'N,0jmA.D>:9#2AS.L(^lFI/k!)V^K\#]`oiAPg:Xf!#Dlj_D!jiGEhEA[`7pP7>PJ+Bc/0Rk!iH&-BA7BYeD+]E+55!0P+uiQN3RUe&bD8K4&5^nH0CPf`n,!tQ)jkpS$m'1)oN0BaJ*UjEgSX#D7QgT];2mVk3=\".m6D(K/b"$/h[!2N"X?uLgYOK/Zc.+l`EII0cYjJHeUTjaVOM[nI'6=^XA6VQpB"8(i\"g^LcCfk97Gs<JU7PYXOPBD:94.hZ)gNTj9\J=n[gG_3&k_5Sbh>Un3bkQCagD7/t`4cq%&E!d<ck!/JB:6P`*rou5p)b;k@&*+%VQB&k`N7]"p?#ltH,g<@n<K)";1-a,mb=TIDt`JcWUgUW'RV:$.E:Se-iJ:pV6"dEXk3&8HVSCd\XO0C34ZLVf2ADkPrGFcH%Z@`Ebs(S_hYA5P5STeVHXi[Yp*K+RXt2R*?q$T;MTlgf-8rYN$4.AnOILk[iFJFoV"E.I&a'=D:s)rQ.``4I!d5ZbfMCUN9Ce\)Z[uNKguS6&>4783'="X"hUo19Lg/Z1#'6A0`#uleM9p%Rc0d##?baob-[$sV[V>1U1=q_+H$_GcrmOl)/c*dj8cjS#,p7$B(ib`NT2#P!u;2)W3;apDeC!`rdGs[%#(gN&Zu2!B^5duL)?[#K'>_d3MR3a'1)L9oD'/0+YZs1H@1g>h:<E;&;/&M\1+WSeJ$D7PTd0Lm+i#b_3-(k-B@+oX'q$+-p0eeO=.\loSg;kn6C0@T8(i!9XA,s($u<=HeirhMOC5g:82oG<*-d!Z<,BMNcFF_IG)aOgX,b^rT$`,YW1gf4S!5U?trI64qU0O)q&kU/<u4%`[tZl[La`>cj'i;nVCihK]`6Q,RP72gHeePSQ7LE2!&>O&En-k&GJPjV$q;u#F(6Re]g%#9#stqf3lp:@,AtkRRs!&2i8<.EtJ)oLmaeb>r8HBRP;BXPb-U8XaA(tDa#s>59kaA)/h<0rP6cuaT+n<<*1ttBZ^nrXncMSR1]3nMcJre1^.^s85uJZR:H>c#6<K/,"CI"HiVM^PXBX%!!Wo]kMUu;^^)<?.NCnEDR":@JeAV;^bj80/DVpg0pkl%#pZoN&*[`7&GjL]cUQO?66X0REC&#J,[t8r'?Leh0:mkRZ+B4!Ff1+Y-,7>22TmRU:S00!9R47_qE[*q)uJCV).C?-\.X6mcV$G`ptP7To08XHVi3&GiXl9]%EunJUlM[b*GHp;i8Xg3L^2(dNDp7:.R5H14[*P@6\48JUeaI9:%8P2EM5)D8[%k39eQ4Fi?O0#VWX%/+\R`E))V+0dt,dX]uA#0(nhnP=kfNA\^'K%3S:Wfl[_:I0(.2?Thq:"kNr40cCkb(kJPX&f!Xn^BleBVc/#X:aMUL!2rc_%L<_dTC']#=:X!okpah4(%%<]+J,>(]S!_\U(h`oKD-G7je1F[?LO-eV8iaKVT4l=VCM1X7RKU'\fd8%ik]IX"MlDa\K.D]`>Wng7HC0Eq/mKamkUn=![k_NpB:9.E\PJ$'<O5tr[U87Omb5!]D-BH.VmB[D*8(3rLZ^CY.HU`_TmLK?7VjC\h@'MO$r_RmPVBj.58f2*pT1W@Hs6ss0n*>c<2E555i*Q?UVnMO7&M7=JJge)-4&!hB+R;AHD7#4e]kOlI[Fd)*Da<@gel!IL_SP`Q^0-;(qb7KEmW]VS/HR`l&`-;>J;g4BHt0q":c4`U;G&b]%I`OZ'0%06,TCX6)0!T(0?NC,^)0%Lg'lKg1H0I8Ku%G#"`_C+TkocoMK/'PZX3H":1G7W#'3+$KGlq[N@N##e=r#+J_d:#kt1Y.Q-CF_6,k-B"$4,n`neR-%`=nVaVRW=bD71f(0TDjA.kaqZ!E,3.1#ugcHI@JCeH/mK6"f[uKUVn"i)Y,HLn=U;`'$Nr[p1%!.m6PG65thDHY1__InRrDE"rF#A0&AsBXuLrB0*+H/iiB7Tp7"FsqIL2'eq[cg^T/rW/Q%%(>If9KJ!8r>D'TIbDNh%+G;ZR)5\g7oWm*R;5bqB!L3!$G_PBo79=iqNjg$mbu-Mh5nhDD7Xf*8P1H9/7#E3LD8,n2iKcN/t0F$`:L^FI<J]*_6&BO`DS%DG#sPVOB+3SFV]WJ6O,$Y8F#i!:3-?Q)5Z?5Tba]8A"f.(W6R<`]Z8m&]H?"];6pe.1@b$LfC&f:!MT?HLdb,LJh%kR];NK.8eKKOf;bHc1qo;9,PRW4PtqZ-1!/^FMqh5bDfbJ#iS?&Jp&'&(q$MG`mGfPUn[c#]GT(KK^h@^9sQ5.UHRr2:agXcM`M(M#\mi7(pJ"Q$W@Q05nP8)2F\LF"&\t>9uX@C9\^SH%iAAf[,p%d#CP0YYS+`)22=m(=X@8a3IZZC8.l$qpJV'E.,\Jtr61S?EgJhGrB1QS\C6l>"ur9AAAdgcD084T'#ARY%U\_B/Jl__Go@,K5oRR<P94mg0(+IlGHtZgnND+Wh*Sq*<>[K$L3@HHr)7TT)'GTe`:(*mT1;_[+fK8*CTQ_71;2PVYL]a@T1s:skl_0^0+,hWYs4]Cn\XSm6/[#fa96kYn6mYHL,!b>6*"[M-R7F04FoFi9[HPnM,_)PE_-%_/lT+Ys-LITmA*J^qMIUWpYSU-+*,PnVD%2!@'E"Q*14=2O0E$<PdI`Uk'Z(&cCr=pVaVYj%%`Q%?-np%V@e-/%#ZM&m1\Lk_GZfq`%+1`>GB4-DDb^uG5BEBRR2I8:\2UF<=(hRP*1j,K/n:o2>WcbA[E)ZI$4!H#g&c&K#/q!a*#-;*a$1NSch:4jtjNn@BOb1bX(uMJCbT5oZ8mrOK(O6EQNN:_@9bYQ(REaSt+$WTl*XNKo=5Q]UaO]Z,O3A5/QaED74LgjSGd\rFuS,qtImA)8=/SSIrcq;7=pOO=4cVp1$@SUOVaEVDU1](^5$^q,n&$QlYO)puIP_lp^f.[9:%G(r"4Y)>qDQkVA:+n5)[fV?aQj,d3RheOZI2;sGSH.HaE#`7tS^B`R17="-JY"Si]:c_VXbYi;";mWg#S]IS_\2L*kAW(!/(`"e&64;,pQNu7Jo"3aCJYlCD#bU4'=41t5VQ7oM)3(ZC7"m!H4?N>2M2&t<]^UNj]=>oYTW>)#)n6!(0#:"\u,YHK&b5o33!JIX%Y)Di9#RB7AjW6p&K'THd'=moaZLK&[h-9)/ZNS`)UgjPV?pKq8-^tuKQ#6]e!6#:o/VgNPM,:<I#="IR$k!40pq7.meJTH;"8qrBkV#DO\f@iR)2?nMrJK(7U"_gX+SH"R]#)=!72f^]5/)oAi--c^],/6!0;IJBd>K8R:)5J<Kp>7na^4o4`KrZiaOtSTXVT*gj<f8!"K-cWS(;sAXSE*:rpgWKo]oaMh:ojkJQ@\BrhM[JGi&"n:^[tLaUS1R8\+-c~>
+endstream
+endobj
+82 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 81 0 R
+>>
+endobj
+83 0 obj
+<< /Length 5037 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+Gau0GD3*_c&cR6o@c8uL=83J6IW%Gfg's,f%8r^YTW!d![coYrZKOjMqDQ+&'PGL4Uo!Mi7>h<bHleEfiUC\DUq^3Mq<#<Bh0>0Dmad.PUV!E_j1CHN)rHYHQ<]C>CqR8^TC2](Y6sl#SoiYu]6ca_:YaS!O8@sQX1]);=msSNkZXoQ0meHCV%R`J'kFqFk%IB'VEqK5aqSSpBWPJ+!,h4K[VV0WFgZL]$3.=]/u[^E3Xu(2\,L0HmISl<gNHY/17r*fX1Zj\Ss4eE7pDD=gPQB[!]FHO@#Mm.oj4$QMkltfA^V3G_HgnT4pg$!M_dko$1ku*)HClkXTe)kXmqlU>@T[Neu85D;<="NID2/Z`NH'd"E!+U.NuL-D/j:JlZb8_1`H`bRnpVoLFBYmJcJB^c5"Lf*^FRk#NUYF.bjW0YoT]XFEO6r`73pUeUmMki%!Q\D)>Tg)u8@7Q]#[#kNl3-^N';Ec+B[RWn\!O*Q%'IX\E<,Y9eWN--c9"319`Z!)*h2)-%n0)CuQi7gkJZduZEn+73(DeiZ5=OK1PolM6*N@*FkCB$4j>)NUYuLgUe7#@ft^"QDs_MFSj8<F"&^#d53?,)@QLV=c4DCPnGtH:0PFp1@'2XETr\+I7>A6)gKiKqnA/+O,RAhjSrA75WQ?(>f%SaXiq@'$LKHP1&WC0$K>W8`jh\N?m"U8Om9bKG$[3q@ftqM/Rb.>&LcNQL.#3V`*3]Og!6/gnM*@2eA])4BffXkbgYRUN"e5Tpgag/"0NBT")6HDV`kd8/:<_b0osBB<f0neDHN?<8@i>%?46ORLuZ4S8?I(/M\#BWfu:`o4A'=LOslR6%3P,PM5Er)=YaSC=(Xnb-J!bLcm5L$A6AD&E7;&UHrn/:o[19gb@W!)U8#OD9S#`+C:X>K*XZK$`P6iJ+6GiW-4rWXe<'Ugu*i^RKA`9fegXK#,IdU5.EO#;(&KgYU@W&F/(%]1!c_B8K2?OR_\^Xh8-4[X4:rVp%52mecV[oKKXO966CMbG.-BN<Oe#IqrV1NjaH97D*7HAl*l7]n4Ln(=#6@P]9FQ>b@[SsCalN-R'c[:lrTHFe(@Rf`jK5'E'W:cIj-h:fcSF.I5SEeN3!Eq[B@kJE+PW$NBf3aW0824@Ap.3ae@l';6Os[csp>-IR1Z3V&&&mMq1Pl;52V_DskZqB`uJM_[(8jQJd!!Lb8*eHG`+Up96mi38%r5_'up&F-")/rE&8SXs1=d16JW$1>lDbEE^'0h'fE["F*s$ijFrbja:(Y^)#^)q,Tp=$;-nlF5o$lCTJdt?%dIQ'r'_&,]rAgGNV%n*58R*E-joOn'e_6MGF`)j>hI&%(H@.<ml=nT*t3/M:gSoIWE^Q8G\esOE7%WI'D]Aah0,mWQmHMAZ\1G7Mqb5(srO$ZDlteV/@JO4#2(H5QrUs9pWo]J%j':"eg#t<9<&c0T,&g<7^Ilc;T,Gb1V\,Hk7KR-4?[1\LJ81NPa?QN'_IbUs\bPP+eQ7(W^a1e4hl/b#Z(Jk\@lqnman+/YlN6%j$4Lp`Lu"ld8l*_:Kp?T233ub_-T*q!H!=!aG)2eCgt#>oTK'qGnb<k\et8.5-e;1iEE*mWScP0*NdtNQ"uVg`$^:HIanX^C)BG9ip=p5PRruSB]jQU1Jk;g0.\)$+a9?/%;*_6Fd+pBn>W8piL3rc%BRTN%?t_*;CN/W<ji:P(*>PT:m;6?^)hj?/bbUjaHck4M+V$WBpPS[6(8QZP9%CeGegKQtOUiBU$]#,7HG7Y\sN$=s6I9_<cM7L-mTrN>eb*da,p>lIY<3?-;o"1MO&*l"RqC?\hmVc:+pu1\V^8$7jVCHW7T3J#,G/SZrb+S_!!nSukg,+N,K*np3-07jD#4";D\A*V*@lCA77tZBoU(F[(92;sW-fGZ=Pm+`$V7)q3h6a*sSR?/DCUmHImRmAmo7jPd5H$'h7V0+^XmIVWK&I.S6;g!jlC,jVbN*)4g2b,7R6qKQXK-ef;A[sNIgi\^ibpMud?h1V-qf%4]o:6ke/Fg:eKIQM]:ldq0QPjrBr#Y:5995SocjF0feC-_dFr5*4o;+d"*Wh-T50QfN4#>)O5&'DN;q6gmJF2[$8AA\9(<8_Fo8c\*$fKr':HOFL]?ON[34:4d>*)*9iT8/](@o5b0q^Ct!4?!!"2Qpa%5EueYg?O:LYlr=2^rgc3lG]Ujq(s&<g!rf(J#<:2\ElJL*p,=]#jrrd;0R$/YPMMWVb3NFAF3Ndr@+.Y>A<eeKIb84pJpAil"sGS5S`\PTO-hn/4T^U@8?)tg@^qq`(du@om#oN,\/h<0c6Jg#;'L6gaphbY+6IFE$N6q!dnKGnk2Q0k`Q19DW?-L^N1ZXc=tRf=%*RUHltla>#%Dl+Ss2SX%G7J7dH3bX>3q86gWA=$N<g!i+5giT9\Z]rP(4#nu"eKCdA,:8*SUXXCtutitg/c8D:T=0<3sOV5Mt"AooolhG5cD-WR1EE,3PMGIGs#2i,VI#47X#WNdn1/B./Hg2S%E);c$30'mI@EK<L-"1ghhKjVcfYUT_k##-@05G@.N%X2A2e'$j*"T>(g\^.3\.6$Sf:^X%*.Ia?OY-ZP(MofE4-]??=`A6dlH[TdmmF38P<>WXnK`\/!EhRb;j\YQS0)<kX&dH$'SWP)&N""\)a:QLY]Ag-JT2f](=LB6H`M]duT7U'q_P;*t+4Ei^"j0i4"-8LYmTm]<P4X8`KV=l+<AT^I1/&#+p&lSAWrSs"&BN\s6I**PP\i[WH\&[3O<2u5GjdTap.pI,-8Y2VV2%OHCrRDellk=s%gf'C#Ij)C\R7A<jGqPdO,K<b9\`R$?(QdIBN:iqQqnRLdl&h3_XV*fX.d8Si<2R!>s)e%N^;B\di8Qk#\UAOK,=%D,mCD;(3#\q9(ir4-GkA96%-,lJ`*`1$Y=D3YEb`'[O1g[IgMLGHt:#lF:1VNL+*_A2H-&g+p.U>36d2J[A5g%kgR/=.\@hjK@Tk"32keTUGc9*=AQZ5,S]Aa/(15Yg(e5o;:F3]R#WItdr.pWZ1uCVSG%ZU$pmj5M9f"e01p]dFUg2&&;#B&Y-eoegk$Xk*)eh$"501HASC+6VSObA9Fm$V/S!H$9>g:--m.H&@)<!@8mM%6@%'?2PX)b7+r'_tL2sUgR"H4h$D#UW[hm2A"477A+@\(P`%!0#FFRQQ<.cfbD_qIj,=lUoZQ#T\H<0jb2R\P=V>5/N#<r5bL#'3#oq>3&"3Uff+XqhnZ<($ar4iL`&-GaS.8u;V4G9"[8V2-I$`F\S[-UPrTGY&9doAflLn3Z9EN6p]Cm@;:O3gm"H3_9KGS/4dU(-<p0ZHugLVZeNQr;A7)um[UpC@?,d%R/3JdNTKr(#I9F)eTr[SF/SfRR*Q;.4Wp&55YD`g-mb"XHs(##-Gg)F'SI:;e@_-544RPY]o6B5(-P3cHX3+U-ljY>TjkJ)bfa4qh:k<Th!E;7Pq(IfYq8Lescq,6?ULjnO+o0\]n_??,_W0$Q`mC?&,XAGGsEMY8hXl]N@&9m^Gs2$'GMD3kQE9MaHTheMH5Pb"`34[ZF!jtXSQGHmZrJILo]k0!8qoB7e-b?.8^3",oD4s%kXe3eUM"!iX>JI%8Af#o:7)"3U:_`gZ$$(kp_MU<m3DM0;,#t3SER#nM;RFm(_Q$UTiB78dAIjqE1)2"=F91anf+;Dh%p]`u?-i@EOY^ZNC_rDYMC;Q`K&f*&:5-"ma>=f@XlPb;>\)%VW\N&@9kVtt>-R#]_08I0p7UF+@.IIAc]h;A9SY$+Md$O;)D?nLhZ:?n3S/55aN:VLF_R;VHC>Et<%`q3,oZk%lqUh"Z["5WV(e7lKoetk65DU+E>GOF9Hn;/rB4[Mk$TM*:^bm;I-cuLN/rQ=M`#hWDa&P)B&nXhQ4L#]A4\d->K*fET[nukHkR+Qe6,g?[/EDO,>,Y&bIOQ4q7f?'%(EA9q7Hpq?1iKo-]Ll#_#T7nI$Lt-RSSaEh9j$^NiMHV992[Z'_XVFj#D>5S/;bB]@I0I#m_FL,`_/<+aK*S=,[82C*W]3N[d[Kg@O1k:QsY(L32qWBlj6PMD?p_*W!R>"MsH5YN=+l?)l1phOi>_k)$94+!m%su/8o2:pWA_c(32e[p^uI08<Zmd(+E"6=0N`FqR;B^aMhQPBWpAd2A_,G*!7Q"(2JY8'h\(,a66ns>_l^k^rkp<,5?PbcBb5f`5G;ULAEK&W^!$^^.0KDE'$IQ5"1IoE_q!o/bCqhE?Vp^!W,!<@Usa8%HDgY5Y88cp)Mr%HK(aTS]oT]+\7$D1qfu8l'.;qoGFJ\'+dCem%A<ohpVW=<'*VnH@5>XGW_J5"XYl0oK6m>c;5>p6u`(AVrQ@IQu#6+2rZZAMJoe4E]sn0id>;Gc]aaUYnTSl2&K6^"M[f+BQV\lJ\sW7X_BPfX>?-JJZQTU`>>Agejq4-F+n=\!eLiF1f1=q4qMdN*s"VA((9Zu^m)RDpt.f5qiSqMM"[T5dNQoYgE/rM7_LB4'Pr9O2&(FlZ93aFPT2KU083FA7p\>UCQ/\V<9I9[h/F1o&Ur]ELsOX3mJAAETCJ^!C2,!$nCnZg_NRh`nJ[(R":GO*>1+8&?ja5\d#gS<m4:s/a[[]5pRk&nY=B6$9XGp35.T[jNI8PC9\Bc%nqam>o%oe`d0gb*,:b_c6$GX,[=oFGiFDY:$pe'7.4pI8L[>'tmJZ)WZBpZhQ9,Z%9,C[HCY^QWGqB3u&iP>K7Lo.cf9<'Sq^S(Y%\?gi>ot_I"H6:l-S(:kX@+%uWCV\=b,Yl]A=,TJ1<q$;HL2"J-eh2=]^=q1f?El+#]kMq3?ED!PHZP7_D7_](?9XbcY5ANGRS(=jKO_0JsZT=-3s,8.b_fEppDNf&RNna1/Hm$5`?f!HslS7N+p%-,f[4U.;92;HO)?CGa(hb._bJ&>eg)oI]uL1<1^OZ,H!`]]%E:^41tCdRr?p+`jp.@kL5jB.DFhpCbO'km-Zu\;2![FhnfQH^4]',jLgPqBD%[O-B<:B9j*mp#l5('8`2c~>
+endstream
+endobj
+84 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 83 0 R
+>>
+endobj
+85 0 obj
+<< /Length 3420 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+Gat%&D0+aG&cV3*U$>9')'))X9Bdh]SU5LKfU&*`SPHBKJOn-S9S!NW>,QjW&A,_1.E]Ab^>O;+[TG'rMl#9IY($<'Hn^SUGd,;mika[*GS&WeGVG^Gj>*;pj5j[T+8k:r/k%)8mg!d/Ma]HE]IBF`8]^6DJZ>ZlK].P3%ADah2Q"j=LoA']c.a=CGpf1$&t50;?5P:-%/^nc2Q)1"7%U$,Z@*d*`TAZ8S.B$UqsRqaO,bD"lZ#`h%;M9Sf='[udZorH&Of1N9'm/",[AL1#lU.6C..-&Vii'Q-kIK[`.m/"6O;2%+=ZlU,krW\a.d*3$-bciWaQ9M'ZB.C,-+')CLn4cXdGh[icl?[lh,R8'j6o0S#MA&/[o[g(0\-Q5<Ybs[jjk?Yn<,@9[pW;RBK>9#%!btosp5j,u6;`R4E#n5E![7jUl_'$s#sQSPGPR";$u8:0uh,/Cn5oB_Q.tPr&>qb%SYJgt#oEX>R%t;^48d`FC@j6jtSE*$3Npl,SRm*)ZqI(tug2I&OGO*G_#Vc1*KnC<`sLJ.XNFVLP`><EO%Eo4M[g<4PB_bIRZiJIqL4aLVQWZp8!!=\&*mIT3Rr;Yub+S'eDH:9AH=<MgJlBuEH&]UPq2cr;W/AP2%o+_ss=QJc]YFYm;,*JL>lUW2^p.Yj9LjA-6%<)uSi%Q(e-O3/J\7-K:(aKLF_JB%qZAJa(KZ/q11fKA"J@Q!PZ_]h=&',,0)`bosU2m)p61gQ1Xe]H+ih:-03':;-UbeC4gTeJLdUsMRZbo3h+c/m%i*\7;9;V=m+lm%+$ST7%[C6>ijS=t8e9SKm?c]UkrZ@559k+i94I8B#'*6d/YqoY)0I*@N9<jL<%[:%Zoep,O"W$epX8"H##Dh^Ib^O.-r$Q.3AJ/^>>AMj-F;Sbdl'L0in'NH*=1:(W?`ZC\rgJ`=oc@k&P"cmgjF4=e\4&p]]KL^_KM.BAM"4c@P7mPcCikAYQqY>FU<11ne+P.:i4&8fk<;_<)E((s9bl@_mg^\XFe#Eq5"W0&tAa9_gk(8Dh<tM5d*(4j^plL=A=@WKed<JpQ=Qo`5X@!tIWB8;j;sB/@AWh!n+%M6nVhj8coi4)q&8WkKYbd03b'ZQh'+ffsPEc<@&Ru"FB=<[[ZVtBm]UQ^HcXYZO-;^<aQ4tfu^AW;#rU[qO0=Ml:pWXN%P.\A]?9Jcu&n3[_IN_O1OGV,EAG)T@2E'EkLk_P)ml$dEhqnkrbCL"TH25>Y.#aQ*292M2nI(51:Y+6h%^Ul$J.;gbJ)PMWA5]372$-2E"7SM!pFdWS^!qcRGHHV>X=*BT@#Se#YUq"2QJOD3^#X,\1c%Cq^cjp*-kc2K6Pn"0<FZ;JYI]PJXerDU*sS!IrV6FKARjcb^G$<aoN(sbkKER%-IoH`[3mjgQT!1!,'bBPqN*P#jbV0&=Xd8V=\5(7)$34#L]eGs2@ic!"6lH_a)&Z:gd,9.Q1'6/V`G[G0`0E]R5/8i#FG96N,^0Y&b.OM?*i0I"\k:Fh,%k!d-Q&4(SrB&[RG$=g-o&D(5/fG5VMF8CRV7QWHhj^kq0D:s'Y'edk-.+#-)6&Gf0E`QT#ICV2%`jkIm:2k#eikHdMZ-q>$D0e]&=h&n/2,<cK*T_NUHDBi/ei=[d0CAL53O7grT&Okq^j2D$t2b$:Ij'KcR*j!1a%ic/T>?;R1mR]c:N.U?l873ZBdfLm#]4R`'FM%,Qtcpu^b/HuZ8KD,f59%qo^XkG$g^4_OKni"F&AVNZK*7G<8W[ecb%'^YH^X*JomIXkf@P.CV^G+YRI-nDnfp]d#[BH.-LrV]5;-I+\%d356;;m*R$9UFZOf%'7Lk8;7_r(TQn-6dc5qPKA)M@`"k-rV\X7NLH&C_;%D7e7bB_.+G/<"DKX\[\%MWiI7VMc;qlNdV.Ba:kW?dtP;_lLV=NS7$[0LH!LDqnK?n7('8GgC$ZM*1++#hFiW>I+?87KgnZ(Q^bJd'PkU,TMBGHo969POkic8UgP%!QpK5fh,9s.OnXe3[,8.Ersf=r[VNl!IndaSTPCp"N3`l5kO)j5[T)p>7:'4i;hferJgbO(]&/&F2S503EqHq"/h8n02it(Nkm^D6bGMS#7Z:iU?H&pA-bE?/AjJ_F28YH$6Kbri7j+p$>.=kVi&Q(>$qQ@/&Ws5ff^f6-LX^WVoCa1%motGHjaVkPYk&^Z%(pLe%BfbI6&rJ)s0S/Lt^?a@:XR'@Ccjo/MBm&a\14(3`juPL7@E,[8)2D&\F<bW4NDHoN%SYl"q&nc=AeeLQMM\&3S#H/=e3G)UgBBiNipEQ1>VkcRVFu,(f8SHm&?u]hiN;.Q0@ZkfC=_JdGS:'-C>D9@LOe[hJIW_%bF776+Et_sp+PcOW>a[Q/;u4p.B,D$:G\IR\9a#[m_?Kou.MXCk/JOJ)qD21YK$Nlcju)a7#h;T?n<3E,s?P8O*Hb7d2:o&Q"7m],PJHqr:O:?$>0*ssaoXoOl&!s6+bP^PG0@HZ+aLh_O24Wacs.tHOu!?*TCR3Xq&J?[&]Dh%[E>u=E>^(F*%j(LpXBE7[lo!KhHYj2l5q"F6+rTOPL]RIW+]t\ph]Xe&!,[.J#_oH,>0YQkrgJWnV2Du<K5m;q6BVFd@#!`t&"**kSc?)'^IG#L#/OA5-mAf8[A'48cfk1R$S==*mTeh^S@MM_LCr"QZp:OeHF,EZk%8lV***sN^HOf(XEGQ:X4NS)>lO]>scg6V&q=)*mLi)\Kd_VI&S_:geo3p'3jMUl?;"2=E]WG1X)%_uEQ4i$i`11Ndl1T[4o;.."\Yol?17Ks"Z*?Iebh+4Zr>0p5c&M]9_0=N"s7u2oqqpj+h#?k!,6%>Z5M9O=0dDd>QBHn,Y7ZHHD=>irc%\KdSg5CX<D8_;ft_Nu=]r!Y/stO\_H*n(8>^8aq`a\X#kHCP8*uatF^+i&5&3C4(_P9>./ca[4(j=?<V,C8!j2g'rKl(O`j1mO[2CYM5$dr&g038^")!>Us7SXI:_YuBAL_gKT-@c#kLlaHpNH^6AO/c!9VfP]"E<!e>Q)Wt3r5X95bAhs"NKM,iemf`Q?@LSo#TS%T2P_]8Fn#$if=t"PU1_+6HZ:::G":)Q>i4\1cV"0L@"L<V$Y[)-pn+F6@a[a.P'_=+F*Vo==?md@All];M3XG"5^5bA)f9R"Ij9n&KHD>H8I<YYKi.I3jG)7hQep+$3pD7;a,a0Y$bIUFq/b8mXUs>Y)LJ*]36/='?%PA+&M4"$[(qR)aPhE.Mq2*$!*V(&RS%%,&r4iZlchUEhB@4'Kg8%jYGtCU&"o,YcHdr@n(%%R7?i-IHCFbc0":epa70]K5WZV-9H;1fTo,iaKC!*HFF4?9^E5%R*BJ@g:M,=qp/Fl:Fm&B:]:eIoaA-o7FN(7RDr1K>G5XWb`W2,+$I-]+o~>
+endstream
+endobj
+86 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 85 0 R
+>>
+endobj
+87 0 obj
+<< /Length 305 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+GarW5_+qok&;KX9`>j(8*MH<&hV8R/20!aJ#8?-KXAjOK]!BlLQaSeSA%9b_cS4r"X=Uolk"l?5RY.^KKf?l!VSbY683uMJV,1P1n@Vl<]4:$a'$^l]YgTnAYi%Lm%k`%'bIP(gl!!KJIW"W/_m'Y'FJgFtJA"Z2,qte--Bngh'tkce5c1QD@i3V&.f33&`b3hT*7sRjbj*Bj`cmCaksk-hXR0/VS%G^?o1N<ZA@$=822gl#f&.(JZ/fDB])bq=L*_X!VC@BDC9f'7qmS72`W*'0QKOJ[^Z7A&J^+qD!V&?`>Q~>
+endstream
+endobj
+88 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 87 0 R
+>>
+endobj
+89 0 obj
+<< /Length 2552 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+Gatm=9on>E&\[qBn8S[%B_5lh547k2!#'11%G!cSfc8X"AT:3U*JnZPn#m8@.]SA@\iToo?hg56@^0#d(<\o`*^5'*<dC,"G/`an4J]%,6afVS03`;b,[FE^I8Z?be`"1;kD,[5EA;M/\GEQcpW5VV<7U8$R=tA*pq$s&T>c`&RWV/M<F%P<Pj"/M=8uGErj#@ob*$L<JI90U;&Q3WeXs)7kHC@TQJ-dgI6T@--_`)j,hq]oi1Z^K.al$/i,qG0iA*QAejnC*<$SfC`$gZL>:H.DpHjQ$WBJ<t)"juSbF1u2d$WmhC)U)Z4$uuB#H!aLffZs\&\*jA@$6I\diEqQNb2^'1f:t1',`rMA\Q?Oc0E3Ml?mT06@=>)6mSDd^d!^m&3@s'p!,lp\0YT'%3gXKWa^>)B5(Q%#X;<JZHcjhLg7]OI,;?q19E5Mfid#)^GU"`AL/5<](KUqZ:K.QRc\eT3lJ]i+X-lqFK/@Ggk?2Z-4@@'kf4MP6F8d`^m><_"#/:WZrI&A.AgBmOM+N/JlB@B+-!41'(Uh>i)/(SDN=6]8.4,SX'K>XQCB)Om.^CJpCTmI0);6";iD<T6&o")OApXa^";jqYQp+Ib-<#;A^^Pu[H:1r**A>!5f"lU^H@CbI8?99e^n[nm?<JIFgKCs.'V`,/KBgg;VIMh:g8m[:!Hl97b@kRC\AX,WroRaf%V*jN)(%-SYM*1BCS:g%[[L,QK'@teZg0T]k?cSSK2g_J:tF"H]@p\As\XjDU*V#.bS#TU*hW`Q1"k3''E&,d!RG_AOb@Xrm'fCc)0N%8++qXk8FUr+3MJE9V/]8$k\n;66r-Y7,Y\$9X@I(-TMQQ.itK@^]Oo?%dfpud2)kTC^d"@&&$He4W3+#r%RQ5^nHYf^ds#i?=[=5s0S.@D2^[!mBtWRE2MRK($1\WcpA=s#=7*7>R0E7!/E:17dc2K5':lk64@].'lt9Y2eC])'7H3#2a+CZ_=[eekYIR>!RV>)dQOmOB!O;%Zfsj$5in$HH]6K/6^_OX6.[?6(HL!RRlJNOG:$jFnuPVVJ+Aog&g:d!@9mp=$CdH:hnHZqN=kl?):@&V]pQQa;sekr(,NGjPq&uh&N=(%-1fO+fi42'5oV_:^m`Wp"pdd3>oQ&(L=$Pp3^8PK&<(DtT`1H^gC`TZ'esqs,NEX$T_ZX?'A70UW*49L;?(<@0:tJJm?P#%"!#$k(O7D/$/#ruNuF0@r6eNu^Gl4%iX"HH2\[I`h8B[73F66uRMR0Ln$RfM)gW+c]Du?kY2&$i1;k;ORVft>qT^52h6BYnSdVK0DDR1X15j,+c9+)m;7c)c%?bjCT3akNPb0mPVVtG8N8JN9K]/5<rdZe^SVEP2$eZDh$;N,dHCPVcq;"BM4o^.;LkAeH1N$C1\i)M%A3T8ar'^ks(6B*tX(LD%OPjY0-;?CB^i.'<aX_@$n?(4]K6&O6gIKg"dnk]nnrBfX3Zbgc\5"7h<?Lt^EmL<]W!J']e/]@Q22#k/8cfRsTZ<2!T.Yhm9_k+VY4)!/2bWCC]g)NohtmA%p9T5AhWF=+YGP%VP/u4C,?>F+2nNUi@P-]B3aDt;e%/mQka+!:!V3Ej'lgQB*Zk=Z:cbl10=Nb*ZO/)&M^$gjX8;b`q:do6IF/RTJ,&R'7^4:9D.is`^,\8S=]4gkNtKX<3,uD2L,>D4UKmFF2n^%`VnMD?'^3JS>#5e+)6q7]h@_c>+JOH>-Q8Q?%9_^oF<-#k/hMBOZ@1tS:A8<8S3i!t9*&'iF%SV0Jq**cm:2Ibhl,4cB/[Y=Yl9$77jaeK^rmBgXj7e<N^W[*%RN$BF_kW5Bs&K.9F$C-cYC,L])o<EiGGIk"Kffl`JcU#X0XHDC]3'.D^M1U7+gtE9]/Op+`#uJWg:i%mg>QQ%@S@`'9bOP&&CG?O7n_&M_W';Mqp7AQCh<P6dC@G<&%TpF)T6.T%nbC\N4GmAJ@0;i"BZJ$-\faA=*a`YU3n4p%T];(1c@S7kdG;`2^SI$$a7lN6IU+9jeJ\Rc&sb%6j88bp]arD^K(QT4BOV:a%,_#5JPpP`HB2DmNj"KfK)DT8E@uT"RmpLr6^kICV7P5g:kl'KjcUI]s;;fVgVZmI=p(&Ussqp'*lWe%ANCj\N$MC"X;^TH$Zp,O!2N2,Ka`J]^&SYC37$(!_*P?/M&-/?h51Mfkf1NLD]*I:`#u%13sDZ^BF']f2G(g'SYr_K%_YcF`R_":Q!KTfooC,1N<:8Wtn0CI2,_pRa>E8-o1`=sILL<YC`b^o+&99SZV-J6;Y5i6D@T]?fjqhg(.-WMipAW8]J[.O\3rP(/9+/;44CG[qe2pcB/5DRq/)Ml-QP;@-Eir1#T;#Tbh1T;2dJg@qZebohu+b.rk6YaB(_V8Fk=HJ<T9b5=e51s;hq5D]YKA">8LfCF>m)d_5^hk"0u+@l!E^6N=tMP]<a[3*0]oR;s?O&VD3mcE(]c`sUY"o5R!k&bHrrmXN2DS,p]h'C`1Z^/Q%gU7<sC*:Q'FKEW\M"Zbgi^I&'55)8Hs75!pm/I(f/P'j~>
+endstream
+endobj
+90 0 obj
+<</Type /XObject
+/Subtype /Image
+/Name /Im1
+/Length 8197
+/Width 432
+/Height 219
+/BitsPerComponent 8
+/ColorSpace /DeviceRGB
+/Filter [ /ASCII85Decode /FlateDecode ]
+>>
+stream
+Gb"0W%ocMNhT'W!&-CscL(T55^glj>+rFHE,KD'Vgdf3Sm-<0$1o$0Zh3,pEf!]?$>M@Zj(@B!0AF3D:He@oA5GH@oCYN*TUAWE_1eB54@M9E,n+6G44,i2Ro=Ht<GCK/Ho/cVjY4iD^5B1phn'%>LM#[MUzz!!'gHPa@^i=gFj<^OPIIMMd:sZ80`:#lqb09he=dK-<HDhe4jT['XL!='+MEjRi-<3P*O>ZY&U]]j&NC!s%OmhRn,nNK%adhnFO1kKhabcBOW\f%&:Wm^&U\@Hl4:qMZ3j5VJ<K:U\JCSN9bl\bapLSfY^rp@e2lB4nhpMuWjLOI;MNRCDUUUZHT8.[_03Rr?#DE#ScWmoNUn\7a,/2T,6KMi*BKQP6e<!PhL1n!gNj4JU<Vgt^,>/6]F%mW+66daHk'>/>X<f@QKc-=)B9!8n;;mk::oF_]sVN=?=+2E*$4.)>`'!"^9qbKGg%Mqct>JqASl]BqNB<B0sh!!:NPA&j>t&-*gQTn`UJ.eF8P5_U6\!3"73!!!a[#QUMa%flZ0kTKqV$9\Ll:n`XE!%RUP!'l5Z!W]1G6NG[,j2^&4_"Po$YHT(nR57A,5X<%>B?nS9P"a1bpKS70JE!W5^67:tRFE91>e%!>!nF;NX4VJ92`Fh35X6[i"@*LJ*kqF/Mm<Qhdbsdc@$W?HJf^YAJ0"ccLC3YbcpJrJ:k9YhH3f0F.aUOJ%tW(p"aUI<TqCT;mS6MP[_&QQ^"m?YVPU,o5M<^B.eJhL6U21\:-q96=BLsH<@3p/ZEfY<<**.fPa#:R64XAc"SC%_77BYu?(RLRg<n<aB"GRbfN+a>.eJhL6U21\OeWse7RgSD@q0#N=.tE1\;,[f))TrsDa=p4cZ"1I',+lh$9]ZT4VYQSTXbhc$[V#Bm_51Ul`%)6Q2>OM_j$CMcH]0_p6XIHZh5g?O<"!kn2c3a>4=--Tm)?OUS&`eNi!b6UmGGcmVXE?_kr3kXf^jsgQJP9Wa[bA2)S$n0"&D&H:X'C.!V:KF"R/&o[(4/)om;=R6j8Tc5c]0T@j1m0^g,3-RUl53(KYpM26saBA!6l_-g[*1H=72Y2T$"k&gmQ[<<NM6D&^QcLe;iBht@KU-8JHTA%c7+)=XoIAB$nfV(HFhl]+jpn@ER_$A]CqsS;rgU:fk-gKu/"9gs*Id#X8cf)6RX7l2R]@t^qmq>K+%GK:cDei-bY>]LglRhMgbr<&.2r;oQ?@Q7-HL3T]p>OA4`!EsNC3oML)Vitd0D(>GpJC??KB??!Q7]HC?]5:)-Ca8ZMm[JeSNZnq`F2(D8bdbWd+9.io.#EA>IMn2%m$50odfFoTng"Q?iO;VqTWrcV_r7sVhZAFT%:'pT%:$mT$#6aVhth@l*nEM1j)%P^ri=Cg>#qZj:Ud9D4bK:ldooJ)`DA*O$0@'rU+m`e)QL):JX*H4oPBSg=)6]C/5d-MC(jJLMTRRTTTr%af<6]XO0CUgdA]W1CWGH#k0j!rQr1/]RIr!/$>QBn)pnP$k2@oYim7hG\fVU]oCa`&L1ucFM:&tdc-[M71T\f"SC'q/6G0`4@<J*mGWgh%gbB%oFM`#+ea[A*eFGV,kMYp6VsG2KH:2@#R^3cFRA&7U\sn:4c^-S[m1ITcpNMI4ac/gIb6nX$9pf-j):7"n=bV&kb5lh*e*\i,pq&t'b50/ge;qK8Wf.JMP6aAA0'F5@<9g(TnbnsTu-UH[^YkT/RGMuZgYW'l=ubGc$Z=8H92("e&dg!N>D/:*Wi$j$Jg&BZ#_9-(Xo<[r2[]PC!e,R<Z1B.kTLL`W:4%&<Sr6u:HqRARHDc5.9!1Nd^_/?K"I\25j4oYdlk(jZ%Hr-PqKY(hoY*0A2;QIs6\lQJSWV"+S8LhHk28YF/aqp'.<RSQ6o<]D_C26;,%Lj3p"e<_KeHYJ^?c<j;t<*#5Hl:(G;MG,PcaW8(7%j[!/\mmMU`[4Tn(^'s@8W]g"p*O7P/l?@KG1F4"Bg^\if"s5':W!CNN85j4oY]6^F@n)n<`Sj/i"]T>@rfWfPE4g]^Rq]?(XkTLL`W:7eJ>-t^-1\2t?nHZY`!h)!)C29fX=3!f>8E_3.HDp>u*ia\aJMqGD+9.^[KD?`uEXAjS9j`:Aqr7khoFM9k<&ic&p3lO+%kUlc=UF-Kq;\b=cC)R3a_D-b5nAOn6\R2d:rW-ps8I5Vn'(Kuf`9$Qk?#T3He.++oFM9k<4LZ",ti=seF4G;5kj-Yhecf>\F;iarl^dLo(QVO4J@Nqkb5kKH`6f?Hi!&8a_3LQU6D+kO4ZIA>k4h@$@2u2*\)QOLDKd\nY<UhU\UiXNoW]SDr$<"M[]o;#_X6Kr25=M;lBC<rpoX(Ru<IWn]q</3$EWN?4B%#64XgVpTUdE)gc8'CDT3*`9>TrO;D1j\(njH+9D2/LHt's_UT^aI_-)BEhDc;IVJ7";p:_hR@3]s;uE.q?j/[r64Xf[hF!3^5N\l8#S6*.*]8hIRJ,**AWOr;TSGerTd!<ZW9Wa1="?g;2fC<DS&VXCnD/;oLF!ga#_X6K!iq(lgU?Y<>D7h&ImR*KQ'P<XU[0^,K,t)fLPc*!U$A+cppEps;TtVgf3H5-*H_.blsY/XH3f0F.\,tddA&n_6e/sP^&9kfj<kWS_Z*&7`penb[^=*sQKOor5j4oYeK,JBlS'_YfJ?t'>+..]I!W&c1[/h-UGHOn%nh-1+V8su5S%`1n,mO\6?D=Y:G4VD*8Q*/IK$eD@He%\"@<V6kb1A!&(?.Ad\W<$J*)P!FT(n)at(un-[St`LE6MjLC3ZM!t/LB*F3k0:Eo]1-77/.&(-_NarZj1TnbnsTu-UHZ6f]@%kU!BN)m*W\2a*E`<m";p"(4U?Hf>(N^42,cpIt_G^dr.+niUlcSqJUG2bn>0;nO;F)J=65<lIDO+3BN`:J^)!hkAV=*o24*BFVO(Gn)"?$B.^XSMKt5Pl>3o8`Y=@e\Yf5+o0f<:G3D@U`eqIXZ0Pm\W^J/5'R`g7b$b+sS>MqF_5$6W-gFg]&_d+V8su5S%/KdmMGF9@Kf.".5Is56.XRZ<Nl3cD6I1]3hSHme#bmR@0Jo98;<C>#n[i]Di?(+`QWgTni'AHT.4S:h1hWIJ)81Wmg're)%c*^HueniPUF`c^q6kdG-o2oFQ+s*YNe_?>T**at%=Ua<oK[c'rQfX4Apf55rp&6g>;#++coE+h?%=,=g*J>AQB?BFNF*`!EBAYeGR;g:HtCf.U@:b^,+'oFO+h4XB[H]p:<qfL'emnOEM@UVbHjZEgd$.p%nIrFNFuRR+#Y$Pk:LNfI_$\p)Zf+V8suE4(HJP7E69=W99g$W><A935E<:R`"4ALE>`VR>mJ\]^I!1c2H"5[e)pm"(\7fA8$\TI]YrcpPM>p@8abm+Oo$p&)D":HUqD=)Z@,)]8c&#mgpDs5sFnH:[7n%/8S%+8_YeIf&O,H\^_+Qa?3mAnK1,Lfmtf*.$gokTQXT18m@kZY'f<Df9PQ)NAHFC$a/hS'SWYX`YFuHi5WK.gnN44S4_?l/CU=kb3(!HY>1&.P!%&9QbK#8P+c`/]DM]"[)uT%i+<%k?7O52)Vd/q#F&h<u9U$[(3#XXh16]5j4oYeK->KWl(M-S95>e,9ne`@q0"cDCJoX0'FGiHDj(>4jQt9@q&n`DCJoX0'FGiHDj(>4jU]p.4H^:SXlSC&[T/\Rp1d%\dNfiKH;Vi6dN)a5GbB[MTsZ#e1;X<B"#.VW\\hM\fH)&KH;V5n)5'iTSLgtmNHA._-g[*Ib%$=6psGA1NqB]*I8!E*\(F^Tl(*dpbD(UH3<dN#X).[LRs8BMP5f'TSJ1Ab((OjTncO=LP-_kJ0'TALJje#j@Tpn*C::-K-#oDLJje#KHA9d*f?YH;P8g+H4PMq$QTH5kKlRNoM>neOO-?4cpKP[:^TGN@<m,YqcEFapCCP0;,L1k<i1-Qkb715LLTJ@'OK>-VPY\m_2t:]D_rA:>$<bLX/g8]Er,Y/*8TeZ=gN;?hCX1]o[*3V6S\40$9`\`fO.W<g2*6;DdHp`,FdAqDr:Kgo/2jjV5:#2F`i;P1c.%&Id#>X*e+)KHKZ@@:^fLO6F2G`_^m5ca_%4s)f."9Rr+?::U\JCSN9bl\bapL_2DCKe_AiJSXjW2AGuAt3Tn!?ZHLlZ@H,4^;]X&ikC59C=:\a[4*HKXQBk4<a[6"ZPTc9ojU.\Q6N8>G)]Qu7k7]19895nR-q3??Tk&N&8D&/VNulR.-OO-+1dNN]bP4@H+X+\<_;ik,.$PirWKqe&98(:k`G)kbBWTPtTi`m$k6_Y-AP[rWW$q>Bd>AetAlo:KkiKS*GCsbr4kSS,@mBj6]B<ifSXW5@]l*;`2r?0rc0Ei[D>q<&5@=@9Y^,d=4(J47abu'e4oE(aE6Ama;bm7L'gLH@nNu4W2"Ankph-*/-c0b0/F5i_4jDXRS./\-2F\ZU7laS+RquAKp-@na^j;^Lf7E]uM>0#lppV(R()FoQkieA+p_Tn(Q`p1.2e2S`^P-'bJ]SMHeM9k_8teA@X0bQ%YW/te!?:<G.uP/p'%cJt2qWlA_pHXdVQd:$h19%?/Li6u>jgh71`senX8C):V<@f2!>#(N@b>%R@Q:P5%^"F[DQlPt7&Vnn>LMGI34g'_%<$-%AkUW/%pa(h2FhOuCB]?oYHKm!?/GcJoK;bB$pBil\K7@2#2:i@&"TBhEb.O&JWB1PUPI,]&&lm_.5ZC]@)7HYk\0[fqH)i<fS9*=31Fd&<*im;>[/iCpqq^hd6m)iLLTJ@'Q-.lAsi$?%qi5nA'dTh6P%/_6Rd+<rm9$sRqe=[D'%_P&+@/0LI(_roM>rZPesIbT-=Yhk]uBc(j[S6H:[7n%-XB%H7/rC8Ec`Ukb/i>-j=ofY4V4icd5&BTSI"?TbQ]6\_b58bB+ScT0j..cpK8/6UD;p#f%L)GBYD^-ehqWhVN-,)Um-_fUluOcpLCO6UD;p#f%Le^4h8pfj//ER49^;fh?O2Fbt-!*qW89oT7Ee)$7$t9N4uUh;tW8W?!!"Co486MesaQH70)G8Ec`Ukb5E*a@OL%ChtYrLQ\<cj@Tpn*'b%*K-"4&mU8d_%&&H>TSMTS&!ns$@8MC_4g^N<P1&%:8]q#fgNP"::_ND^cpJ\t6`.9!<Lkk49N>(mCo4),7QkZPH7/rC8Ec`U!SG;[S=JNq@.hb>lB6sZ#g8t^$jO.OLuW@564XAcPT^$RG[A`a.F:G&V2+sBUPI,lH^KqXTm;V@cX?][iu'q%XR(M*KnkGYLRs8B&pbtDRPek;014tqXG#q#&/H$.HQZsd9pe11q@P;aaF8E]+9"Np2q+p8FQ.u?s#PXa*g5hPr8fSS(_h4Z\*Yi<^$l)WL@XMpolSSMPb(Y%?VeY[o^Kc*BbMra9nVcY6UD="CO=-=h+H)B[Rmit`f6b^^R%)U5CjjgH3jB>0JP::5<h@k2g5qiKH"/OA'g5V44o^TN"##*=hK"L[F\`SQ^;@\&oR/E8kO-V__l5b39C3r*YNc)qXdU$h<ECd/_;M^WLqumlBe<Q4^r2DD3U;s-\cHpq<P6?39C3r*g/$:Ci)TOrI]P^4FHqnm+J_q-(<SDWpSQM>H[IBf!jO76%Nk`%0fF"VC.t.mVXtD4CFk<KH>__qoc'fnaZ.)%NSH6$toI!Fn3-0Xugq"Un)l!mA4$*4WD9H/td@Qpa.2SO,g)an"h7!gc595KH?<B4hU)5*<lZgV;M"*qXs0@%A*)WZ\Qjks89`f$ifgjs#@[?JH:)d6$!S"bi)4IQJpkbe&7)jab:PZc[S]^I,`.q76j-L#sADSHcVG:Q*"<%P3hQhZR+33@UfZM#r*?Xl4$.*>uekmf?eJ[aU^U4D(SJSIWdsP+9*J(f0BSQcpL,1_4-LpETFh-lnAD&,PpY#.6*\Z1K.1bj$jYtD8Nj16UD="(OIQRkRcQu2ap4,k@[HsZ)uKM7qIb'#G?k58e5-0cpRikD`q'BFjYpQ1gpH8QA1(>9fLJFS[-;se^-ZM&&DV"W9W]DQX6E!4S)4(q>'[JX*A@+0(b61migF?!?^LN4gb"R6b;4\o1P!UC%V&HFR#+W0mOT-OO-?#O<1D3*opsE)E!C:FiTH7<NGnM?U0/`&pafaeO*>L-U%;SN??K=^`u@t/[t55M$6$6OO-?#^`KM%Hhf,0Ec]JY/^BkX>IO#g^&o*r8?VTh\J[R&%ftBOMf%4IW/*p%i6URXPN\EIW2E/ZQm=p-an6^X=J<X*^nUtELT1F]W3hd5,5AKjlra8'^gkDqO3+0D6UD:a4g]Cl"BADt63;XSLPF7:`T/nCrR)X28E_4iLI:b.ddtd`G..373X#]Z`Z'C,dNX!.kTQUS!aE.^gpuR6(=Ub.W?b62Q9?S.TSJ1A!d^fE[?X?V-p4"aiT&q]Tnhk,ES4iB5P1&-ki%'poZfOG@UCm%$NIcq]C5=TK+ISo-Kk^u*0uTp>.^*[j*;BW_H9"s[9`\9H:Ug'OPS@QQ$ogK<mP3+NmP]8E97QlqlKU>/f.d.YC-2t>Q40@,'ldToWYBS+4<B\LDr2;3D@d3HK^<B#(DSMQ:1H-T0/NVC4-!&Vs#9ap\Nk8fsWVGcO*pj_IoQtc>.0h474e0`b!pbIf33;^#U8]8C$n4ZI61:\[f9\&9N[K\r&A,Q&tZ8]a?5>,jV805nD)J*k&JEG7uOVg9nL$&9N[K\d-tsrpucX^9bDk`:g(10Cn,qcpMjMGT4g42V"e3;4l6e-_Q7_1bc`&@CcA`o/8s:(4ZAGbSf*OdY8g+dlf6859%M)'Rb]?*eGHu@ddWP9MS\,ru$ZSk?!T0k`@qS&bM0TmU9&CfcK!kO$5o5%m^_KFSn*_IQK0Bs.k='oAdDd>@il;54jqAq0Ye<R^n1qI]1/o^iRjih46aS5O4Z-c@9.iN8U</gq$MZQu&IOj@TsO]?bk`!Ns`.j3U.()&V;pKd\?'^U,tC.R.]:Dm/M9RA#Ds8e8CLkPqI!`B"D74:47DZord2RD_EZq+jgR!^FTTacj$NKH>0ZpQ05-??-@cp6lJD!foYYjZ%FB*dE4-H^7Yd,(cGHp:p]c_a+gTPo_\2<quN(P^q+J\U&Ss'ac9^1;C1u<5btI+9Qp\0(uNMbMC&:$.)'8"pXkQXCfa?qgkpe?L[GWMs)=pfL,-9kb/gG[>SDl<'=g8q!n9nW1BKNH"?Q/cpL&/]hhoPX]e/'`pbI<*_jhEe%pZ_5:1\IkTQUS?L-)iHKlsNJ\Jt:FMeR!*p\_*&paiITpP*6VcR6%r-\*/Mg9U?dS&*AkOuq^%gbB%o[$\+gdsH\6m3_dMA%>`@un1p%8HJVcpL&/IERsad`Rgh'>pjf)sbL:'qg>8*WgZOMgB^E'fqq6dZ&I-*g5P)G'A-X-R[[IP4nTmUX>HpQH&o7oD4L[oS"=fTn`tF4\SC;#R_$Hq^!SQWNrgmbu@bGQ^!`u5"*a8HK[:mfo/3-8[uMT'bt<S92\\e4-VO*G'.r4Dm-n8"9"pKI`%Gq)"`o[l="46Uh)_J2HI#DJZ#/rrl"'G)"`npmU8d_N*[_2:I,NiM:7qKkTMt:_j$CM:?=9slk^-.V5*MS5_&!k5B2!*#!JdRl!`o9FWX:(;cQg4S#NBd=h8^S#6kLG64a$Oe!i)U+Z\t!:/4Q'E,^h(>nR_]U!Bka++qDF^83gG`]p,Orl"'G)"`o/4>rjfI`.Mr)"`p:6U2/JJK>GM#j<E[cpL,1!BgPhH:[6CTSK1*%gbB%oFM`#+ea[A*eFGVUqn*IR53lR+Ag=Q3KlT2&ebpi%g6EP:B:#`m3)Hp:r)f:!;jq>!%RUP!'o)^d;d]:=05]9:A-pQzzz!5NrHQ^9@.ZD>7MhpDl_.OrT`auh[0!!(Ug%#1RR,b'K^9hfGLIX]#YBP_BsZ!!?UPLJ.8-be><ZY&U]^"^eA"TZnP<`YO2P'QZ]2)[@uR=4u+c(@5XH<"ZnBjG#8jukOX1uQ5Z!8qpQenjp<ad2b%;l<g&@Xme0l-[/!hVR,UltlEU&HKT[L=Rn31Xe*tdmNG#1,BUV&J=;ei0F?ChJ['<$O[@:m+K9gfNrVr;3CN$C``_/^KRjL6$.3*qc!IZU.'uRnGO'0]k9/?S"#nLDdQ[O>$G3HF!j>%=C5ER17<5'2#r/S_gHsETV);R0*?a^.k`P//hY06LB%;Sz!!!#W'E0*D'WDr~>
+endstream
+endobj
+91 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 89 0 R
+>>
+endobj
+92 0 obj
+<< /Length 2261 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+Gatm=?Z4s_%"I`D#l:hB89L6u`n8brd)0`<L@$VGb;p&H+t)5-<b=EfZXMa>Z71X;A#JX138hRo6W#*t;O%&rH1g<J3o_:QB$9P`Rr,>'bgZUebic6C`i79"d;6@_rGo4\<HC76MnN0fk-*OmYI!>7-m+5Hr5*)\$M(%GaZ1u`IMAj/Rn=^Dp%?qsMj&\]!#@Mk4^J!UrgW#fU,ZP0!fPX8?<-g8a]1?<BYaRi=VS*%_m6ic:!_7qbf$2gY*#R\)fBTdKE7!)J6&[H(")&3dD#et])@.29KXe-n-_G!/N`(q9+r[+Rf&#RV>n0o&1I'8`_Bi?QIW:7.L8%PF-MF'2t?Zi>TsJWKO4I-GnoRRNi0SMe13`E<>:.'nHE6Q+\O2qJi&F<LjA6<6rutmO'%KKOpKNm`NL\uE"T?cWn7YaD80(keP$Z]Qp`KRD6\f"[e'12(.L%Ms+b%k_jCT@`TFj%:6o&Ha"2[.R>(LAOtSDnd#2$fQ&qN5oL(6^1h#7[648s0"g9>]+AQ&6V1f[Q$&b_Z\tb;A9mRR%/@el!6'/=i`F95MK(2.3]m1^1S'FWI^Ld1$;YELC[+QFDSGBL\Ah+J7B<g2-KHVDe'7iY?l^Z6nJt&N%d$Ai<8,T<S/YY;pn'[N+-oZj]))@Q5Sj\pOeuEcHqoL4c[45Ia2%d!G7c+ZlB`\uYb3.l`?)&XTE"N/U=*8E7J`3Q/-X%2BJR?2t;KZ,KeIBn9*RUOghlRL=iSrXcHGX'sJI&2;JjO(oGX/"E"_=I0;HE1Z0OiGrk+Ol!LKigr$>F/a::/i.M@P*df$IbISjk/R!['-8=_2&2=ERqJ=:uRU)g./(ZTK7.[3j%2V"^-<[Ba5^=jh_@mP\g8\B6bbM2:CHoIOIc^@A^iR,9o=31UA1[\qcK\)E/JBkU18<@3Oac5s"\Ot\leE6F@9K0gL1fsm%7?EWiMV^?#5W0XtXY3OdiU-Xco/I5V6i5GR_b#4D7a?&HPJZ*H9frVX'aK"[(%-f9oUc/::hBG'4^g.;-l(BKhe5")r['@nAgAJEC-X)i)]>1gTc+?gL?)QQA&/TlZ*.@2K#3`_G.tX=I%!cbaV!ie^q[(YN&A=o,g'g*b^tqM=KKa9":;j0q7[CI-*?naOr.7(2gXF0Z_RU&4k\Q<)gZe.X^Ipu?dlI!Q%AZa6,'Hih"?-,WM;fpY2<%M#D&?Ockr#/M[?JiNDA^R>GBo<<R@Z(__ISkj<n]6d(jN!9l.#HT2j$FQ:iWbo^uB6RJ]\1#+PA8:?l<013jSkP:gOd6/Qm\Y^dbHc8a<C_F+D;/ch$(P=(VGO4F;&l-SPA,)60C:Naq(]K8SqXIZi5q?r22th<E>ce-l-aYOfIao77K@mfl7HC*6o>gWN'CnhcpR4C4,8XHU%BOuQjSX',M:M?+K'/'u3C]0Q$),<0R@6+->'&b*M78#aC%Csd^p/#n"*\#-PIBtW-EXmFk[^bRhf!17*5_A"<gRDc]`]^=E280%'&_Ij.@AkFoL8JDD4PGK#iO^=ctfr9+0CIM:rmH8G(&0:SQ/F$pO+>d"44GoRWVP`#;Z^+AI;Fh#Xee^,JLH[mHf#[(C!CPW;cY%lp#*,,:(inJN7,D2f@g^Ef"b<O0LRl0XC1KUIanAq=jaX;9&I%alJb5JR<&*?YJ2;;@ZPWOu),J_'iI#cM-b%B6;6W7]PIeEn:g7]TX%Rkm?2>4@5*3%1/@qjB\MqIu53"'+K'*oTG3\>93dWF!J/8MIb^`/Bj9[SUhjIf\(WHs)a&/BiB%fa_C1e-O4.crkQ%[dHZ^;Lqg`,qeg2?DS_HItkLU)Ib'TVDG[>"Cg#Fp'JMh`JA6TLjQf'c@%HH)A6LQDbJq6c9&5@&C*IZ=!6colc9fXtr7A0q;,o.j\i6@e,[eR8a.Ln=TNB/V?nFJX?E^r@atiG=J7mVL*"C19^1QiQd*Ie>GAZ1H5p%E;lAi?[mcKhk/6NiV*u#sb8X+m5WUak\2k#&qdDk`G`md6W!6(i2BtR*F^32-Jj"b*=s5oqEDq$lH?=@-Y22a\1%.?-LJ#9cB!YMNbYtYJJ"f6OX6A_9Ansd_.Y^eM_>o]th\h]UFe[r;kH-fs"B(7*h"B4.$T$,^U6URd)mE4Zi2eNr%r$iQVnc#2]p0pWKU%i"&joE0?<hBGPcuVl<;6ZE'V#hC\98@$%V6f7Nd/col]d*PN?d\^6FO][m6IZ,#EMJ04%/NYrOd/@]@hqphhI]7KkAlI'$Tq?IV1HWg~>
+endstream
+endobj
+93 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 92 0 R
+>>
+endobj
+94 0 obj
+<< /Length 2147 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+Gatm=gQ(#H&:NH>0`89]2N7&?j=Ne985ULD]0IHqU7cAGAg<3d-*OX'qX:7?Uh6Dpc>K(%&F^+MiUCeu30`;agq:?s=(/mreO+HmXS+U3.PQA2.ZA[^*^hR'<tE@%Dn!K[moHXO0P'G5p2o^`g$DS_*CMC`][4K"G:i&XHXVYEP[):'XpM$qeWF:G4-5"&[RF2Q/K(N;1(KeCRVtD6PYENI`OB;r$#G=sfoQ%^C,4rp4/:g0e\_n2p9HFnf\7gf':P>';&Z[;2#gUc+7pDnC5ee7Gq>nZqD=N-DPCTlH(uA47!RZdGEZI!!O/Ja@_rm$$&gI:g.U9rCsqIMGdFS$Wk-)t2UbE<BZ4N'k%TeA5nRoDX(Cnc;Zt#6]^OZ*.PhjBDVsj\'Sq)3#im4,)_,(1X`tPKf-hJ[G7*+(.%R(BgF)$Yi[C75IUXggkF-V5$?6$2U#\R.\f\JK]T]@hH_Lmce[aP]1R+.,6O3U(,:,![/.']H3k&RR8<P%3*Wkl"+&=a+>[V+RY:X03E,EeF_A[2/jaZnd[O*e(%RQtF+]-UpW:l'/U[?So3GC40Ze+Ktm+.KOJ<d@s*CA#!'EU/td#c)DQ2L_L8p/"1K#hs>ct'=H;0A\PG`L8V&!>%3p:d5a+jSm0iJa;b6JB^`4G<<pUF+(fCA;[ZSKg]]Q8l4!gR@NF:/nN]c;1!Ih5NJfqQk-7^KJm`FK@K5=:5`2AiK"4&D8"4=9^pe*SJKZFbbRWK.*PLkI?=(jC3It-:M#Do>l%MP692&,=,M?Yb&`re]pk\*':Z-c+0Z<3DfmFN)N;i<([fseCYDj6M^\p2;YrPgr74$6)^g*kW,N7'^s6(W*MU-<<,_Pgduo\EH"8lGd@P;kM*,LQ]7^3e%uh3,_JZ!2W.84a:&0*&kKih3At[+O:Ja<gYS<t8Mr(,A:n`KklA:kh3rkXnHorfNdM]0rPG;fjC%cD/?Ee<[^)/C900Af,Q@nG_AQsUG-m&#Cm^OY^f1QaP*tlrj:$QX,g[SS$-;n=<V<m9ob5K`3nHP$W`qDK[jV6fB1<A&n;[q.[(ku2h_!'TUi&9"#CDPg0A!YB5Z`N%2'F+Q;O1*Ln?RcW&9'$-<N<4P`>.GV)GG6t7(&6+CChb1%D)7aFBAS]ia34Z)K7MJ]crp4L#Q0rqa3kjeanIT==frQf00_hl_Biskt]`;)]f&UIQT(86,DeRhV$!R10Kd&(Ko@Gn4`r9dfCqY-8UcZG]4')PpUp=&3Ion-rS\]Wh$5_()F1P?LXNp.p$)AB/ZOXQ(^[G8/i1+[,&n,^em6-%H\p?!r_H0_/np?#s_5iC:2[kaADGVBgM3H-uo7Q&;dRjmN4!/S<8[I9KFk*ES3>R'.ds""(;u"CV2ka6uZ8TFu9#d!s*jN#;OUf!SQs`'H[p,n4<k@8p)m]YF+U\!FVNPW-O21Z]bcG(1W3u.!K<6c'*Xp#/5ueQh0]M$gbK\!-/Hc3LS?'n0`6DHWP8,nO(,8_01<$NCngJ^",7JOt=\ZH#@.=Be;$L.fChkA"W.SSCdMG+U1,r9Sa$bQ5'QWFYEK%9oM_I9M#%olB]g9`$h`?#ZQNF_5!M@jm^[;gC].-&L:N%ZJ=-l*^*Y6<W#!?i@%@q$#.P>cqS1IrHX/Sf!&o!IPX2G8QhImWSQ$[:At"EpC@Y<N6_[(S$`ps<m-[7N<M[Z96h/<[qb9lg!Z?nlAG0jMTgQK".UQ&<9u'fW`j,2./6[r9%/'nZ$AuTSdkG^=PAk]9lZ<#]Yk+7_qg;1E.'[<--o]XBi.m\MN6m+"57'84Ngmcq=nTOLj@:bA8fj3pD2pCq>Yf"EgA<F/Z,GO['q`%q9n-8+6+JVA[jS8#$"Wi/6H4#OqfNn8_caK_6WBH(G3R2PS>ZuESQu7@Du<d>niPTp_IicL&I;6c/UE-9:!49m_Y]/knW(aTB2Q9Gn/r^MRt/<=ih"H#CP\/;VH74m\_]uX;d>ph`kHZY@/ET,^q'fi?BZ3.STHs`9WQfF/e9[f5P1g($X7.n%Vt!A,+ltc!Tt@#Q3;<oH3]=gGV,rBsF[UI_'edrfq"jCN<YuR7UL)q):FkffsLUI<Kf_\2Op,;VuHiD;ukC53@e[Rtt]o)jgmt>HsSY"P/5LCAJ_a=;[t~>
+endstream
+endobj
+95 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 94 0 R
+>>
+endobj
+96 0 obj
+<< /Length 2976 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+Gat=.hiHg+&UrWP_Ut4A!?4MCAKt!]iXXTb.%8XN+*r@ng9f+r/@gqV4t"GO*f;c7N3ngngDgdoqa:pL1IH1BhN.!7+$QkDE?q9tH?U/Wp36$N1B6?&&f69RUI:@:@XVMZlf!m8MgmD2Il/Hk5Jm)RPCY->7&8K4WW'-s4t0*d/KXb@mKfe1np%/K&Js"^a;9U-91.Y5h"OP!$"A@$R]j<Z'-V^;ha@G=5!2]?(sr5*9YnG'&ZF3>$/IFTX]iSK*a2R_?Tp/@9[Kd'FK_0;D:*G=F60Yc(MLN475:0&0`]>rE68/)AH4[$)&^$R<P+G67Tm]AY?qtl&$2kA,7udL^?ZK&4H?@gdbe$SELg_VC%_JPcV/OU@+UqG6eI,rjDFYqQ2L2]LljMc7(dbhl8o'nN<tFd@AaW&Dc"C'8;T2817AMj"sh3kgU.Qe%jqGB`0iWf'14Ob'9SGORu=;H8%-ie5E\s#Xd?-%ot5q+ZkTPhMNYqG)ND#r$fbXB%"ltrGU!k*Nb:cNNeqQ`Lb\YMa]r`(NEP<8_jCJ*:F=`%&0!RZJrV+n3HHZrbj#!$Yl3UY[t!![Bt$I$fO6BJ(e+ZHK.CF?mPdVN!CDH$7#8[-3"jtAVt,2$-oun@Fag0JO(0p,f6BlkSeEY&$E<Guos\QuGBc=`eb*P+DPk<p1Cf:7EffRu@>?/PQ,pbEE1ns:l[I'n;+Og>h79)865'q32qOEQC1"S-V<^)$FRhD":)2Ue9VWC]Oe[,=a;s(aN1T6G*2J'_>;9aieen!Sm5De$0N#V+q5WrPW#P6>iE,/+ZeCVskhXcLh"*-"4`LVB&`M`AHH:"<fk)C;"s_B&V9M-iR)=mEEAC`u]b:<:BoIJ$&+Xg?orDuVZ;VFmS,/-+ZSV0lHL.kt$^S>I!M,t,dd.Vp"PWeTEZ.1jg%L$U)FMXKg;kEdXJ=5ablD:`3N+1gF@M/gg,1I5;+_+YB%fmmDOS/')@s=(HFggj]pZD=)l_&oOkcX9`$..+?2?E5!Y\=)pnZ@p/Fi?PL+O")H[9LH<JDs),4;27l4(#g42`,_m3'Eudr$qiA=eFDbQAedWsLAu&9mRPI<#!:_05R-r)BKQ-Q=L;?ARCI#f.(aKPYa>gKMViE`NL'B[ruHotFnbV)_U]-FU([KQc&j&r7%'g4^7Y:#^g!OZ5$)Job4sY2^V'I4m+aYOBA@b3<4+<F%7PCX]a:[tuJCT`B''+i5g`Ltf_)72m@+G?i;q\9uL,@fnFr"5n2R5a6a!L4hT1KC<e-8Uk:lbg"dHc.dA#D*h:FkkSgQYH69L*6sF_a,qQras-+YpE9Ua"pT'IOn.H5n<rqjJk*(a(N#@(7"ZEa@=/4?D"'VUk[O&[RYFM%dVDPt:]4:H]1)?Cq.PiUAFN3U_./ebc+,,cFTj$a0Qr,rpAjXYk+3-Bl.:!d`ri!n\PELg1&b)q#d3uN(p<pE]E4gP`AR%MRW)[]9NN7KEO$=m,^A"Ypn]g>TtZ%ok:d9K>491.71jdp&>RiogY\ig`'(/\1e),p_-2Y:2u;MTc[P#,E41:C41>8E.V+lW)*#3jARp!,?8rs&rg&Uip&P/2B`RRU#"5pV@*E"TL1^#H/j[Fj0T5]4W?$nQ5f<\qbM,`&pJ]?6\g#Gcq.8)6@2"rkF:[OrUpI<h^CPX3+F%^/^m4t+k%Oi,AY_de((P%jL=>J;_WNGW+[(B7V'^^'9ria_VQ$T]]\]*:fJbG)I\i.]0Fd*e4tJ*FG,6iO7f8_cE-IHa1Qrqn4mMHBi..eI2Eir/ZUtrfYU4&,^!pl`dJ;_]ZfkV)XGFpC+\8.%H<B&,T<?edRE_*t>0O$[kmGS9eFjQ!`)6%70\)Fh<14Oir)?Ua't4`Q)iIt0c0A%S?d6QubA@6i&97m-k/H-;XF#=^XN`Ui#0J>9KtAoc>r`Fj#;AWn,;GPhQ`T+8TA3_4"M>,89fiP55+"rCJ4/>)/*h%Y%oAHWr)CuN<b(eZPHi_aC&gB&2V.oA%DkQ&/>_u\G]++9cE3WB1P+"qk*(2P'>P6AAqVd\`K.H>K-4T#lp:7Rl&\c8<ouCd#hjJ8[P)HcTpWc`L])f#CtT'aY>`S4MjO9Gp_S`;TbR2K^Uhj6J^;GeN$eet_ED5GGa,NGh+bI@q\#YLCa`b+*DEI#s&"Y'kt'=hgLPUYb:pe7iXu&.cc3=*Z(n(Zn`Qq(1Vk##bQY\[i+@m`5/l6WN&,#>D:c+CekY1/3aGW9rK$Ql-jXi#psFW"?+;&tS'SN%XYQmgQIM^o$*e:g7pcS0d[/#^HlfSE<2qOg\4k*.l%m-a)BrI.\a2[04/N)Vm?&q2Z<G?Wo@aVXSg]c\H6YcX2U`ZaC8d,qGj<>&$jS.G8E'^L7\s.Y2U/H/(Fd/-C4DQ:(8(=%TnhbsTT\]6$%rs6g>,VHSTW91*DUn.U1C_oQ$a`5T5&,QF!&auFtBFBXM)HZ/]'=4f/6'PDfSAD8-j$rVQ-*.W&KH]n@rS%Af[RPZVtqI/<_A2m'GPYh&`A&,%HQ/F]c)"Y#pGp$k@fFX"9?PqUMVgdh>@_aj`)cl1&X@+tM[IM'%m))[7iLZ-%&O/W[=_JKoP+oj`5[R>Ya46i62+&,l1M?e.$.9Wjk\36L;GRoZ/cYWS[oC+Z";-:]\TmUn1oZ>`OIC+%8GGu'\#hc'UjPiX*5-JC:VdkX4$(+(6X1gO\r-b1Xr4n'%F\"pl%/'c*`?&hk<a3bN;Y6UjkKnu7-+D#s0Y9Buj]IH>/m.!TUMg<NXCh:^m.uT<P'K9*Z^LLi[3Glt6X=ToH>#pI0gsR;bj0TLt51ddQ3D1?]UFNt1Ab^n1s(0e692XR&FNMb(.nd-pa.E18^ABS]AWAp=at+==8_f'/Z2LCsMr!2BG9>GQ^WT3-:%H42>)KhCWBP2!_iC^gjg@,CO$n@RG8<99fhZ+9LVNH<?UDo'FeqC[]JH>8Q2sF/g;F:hq@gRsUXo~>
+endstream
+endobj
+97 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 96 0 R
+>>
+endobj
+98 0 obj
+<< /Length 1380 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+Gat%#;3.5*&:WMDJb!n1>o\gn_Q%O:E`/s<C=RaUotaeT63ESnmqjs_s*K`BR%])S<@b36)gd=-DoQ:3J)%_a4@D"QEHEaUEHL'b.(2>Y-2Z1AZT'*GNK.lJnZItk8_:YT<HfOuh8c;<h;@tS+49VVfo4=sWqV:%jP6467Mtq$(2jO_MG%I9JBIliYjNl7aPl(US5c7?ne6YCE5&1+n@N<Yah1t4)u;lbqbb&iN21RP022>';i1m23>q92AV::d<*9^ZXCnlY"_2'b\G0]b#A)rr=XDtM.S^<+cAIe['j:&o8s37d`AZ0(GtQ^Y>.t5eQ4hJ$G0p2tK;Tumb8p$mq:sTNDOS(kBf[(%a0CnnS;e,LWZD/^0;@hQ$&U6rKgt!rV5:=V,>VAEi7#X^eKN85.ff3VW5fRZ['+!JBIXHp=,X`llHVq+MN]<Y45p]\XTu1gmHoB?%33@6nA_#C`aY*$FpO=T-O3Jt#(`!'N3MUd<2EVI+<TtR<"GXaV882a_M]m&I*<I\lH((2VgDtQN.!_[epOlJ;)IjO%p^P8[?GMQD@GjI=YZ(6FUs#A+SYOFfaNB9FYOWH&;HCH0H<@JqSg7J"-/)rl(3FjLlDXRMhM4a2@YOT/\R,Ug7U$_BM`MHEC7j>Zl4[AMK0';'q1?_[dF1+XJZ67$WfHh:rS'!3b-Y]AL"frf^PeM3"[f.en6qP&)"WS^dU4]Gm!ttr49$:o$eCi$tf%Ri1eM::A3)kmg<Sa[=VY?B8$2E$34'jXB*1<.dNtJCWMM%9W\o@eqJ$K%t4&PfI[T9=+p_h!-[X'MjND09TDr(Z9D=o;=TQJ-]fE^!aB)lC\!.jMlKZV!;91O!%G;"js^m/Z>HQ:X2I15=>\(@\h=3'@e!,nL4C2=4p/+be]BX,:l#-8eUTb]lI$AWSJRU0e`\L'1I@ul$F6lb'S--Aol@*j]"F`E$5p^?\mj>OTbUT:B20f?3!fR</?P/EC=1%AA)j9s=7RBr>%]A-B!tI"kg'1GF2D</3+/q^g71P5RU0[Tb0Y?='dh89er0F_Bg0_p<Tu3bS0m$s!Q?<R^(eX&08u,kY8p@]D4J)?j3KAA*;aesXtaEnb9ggt*V+Km#'m49^,R#ATPL?Jp@54e<(bbLa(q[Uh9>3c3mjl9R>!XW46usX1+jWH/fMbo^>L3]e([T9]M:r?B/8i>hFo;X@H;c\*c9A:;!9lkfZEabE3^Hk"Whg=It&?9`Ct"I?2CVK"e'DIY%'\^2*cl,G11^3E8:ER5:[`h=\9"0k@TtG7oQ3p<:54i]g'@A4j++,m)GRBn1!t&p_0M#Zae]co)TPdFss),_c?$=YP@L2/KjqA_-W(U`T(MlIf>%7-j*9F!e5]fVu~>
+endstream
+endobj
+99 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 98 0 R
+>>
+endobj
+100 0 obj
+<< /Length 1026 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+GasJR9omaW&;KZP("&V1'YM_(;f4/?Q/Dch2oNNX:)fYS,u1p#^E+c246)D;l=JhW1GaJB[eim=m[oXb:.\;.6.p'fE7dPZe\<Nb`InG@YpXh.$d([.[f(/UkE-9nK""TF;j,QQ&%3AGp#eU^#1fi!^AD>P`PHc3aGZ)O4X`NHEomtUZeXVXL!J>TMX,3@h2^h0]%>i"daqdZE#\-B.17?"j660G\5>@Kng#S[;4,/%c7)M[OY#/9]P.NSI?[eEVHBb/Wf1`OX;Xqm;k^Jl1Dcf1i$aXkn`;aoM?tP=O/=gflp3ec5C!P*UA2#b>uW=C\DV1K`#8'+e!Gmq<s78<]s[ZS*C[1B4H1?CKj36<-_r:@X0/S'B8Taa9X"U@#^G3M..V&V\C;"HeWtlX/A[o;T^pJhW]fS*(!?=%GgLbKUhb@P'_jYr):e+IC#ngW#HmXGe]YL'GH&.Am,^Yf>ZKBV-PcL''7]NmkCG/&Q1&7XrbqR<54`)J-,(=[+K+N^SAEh()JehU!q;HB$I^g-oMZlC-.$Yl\%XSCWdCW6b.-T]rpaTfG(+!\CCNG-%65q"H0'\C(ZRdZ@N6/B<MoFi!+bsD!6i-N_fTcDA%tatAW+LU0#J-04DJEEB^Sa`OTQYikHc3=f8'%X!msS?qgfZiDu6X'a2a>c`Mt.T30OC!?doA(SCTPO70I"'QgGu[k_Sr81[<c[)`@hI4`\5l!?CK_C]u^a0f1U]&q.uWoV5RGla'dr[O#WU`=u2Sj$-Q!3m_Vg%jHdHE*V,?gN@U"$Ks=,J\+F+cAr<gR2nijCeP)nfU@4FP(<pDC,C6aW+0Z1PE8js@\BD,(LiCg.e@/VRMieEdjaA&LoQh\7F2Yp7X!O%WeeL(pM1VP4^\u*kO'2PO7%I%`_hW*&6oX'cBi9*(W>Vn\q;0p1u)IVqnRo7.Rop5?*=qac5SOcY(urWM-\hF\bTh9\BSgDV3-6)e(LVP)L0VF^2+k5jhs:3XgU.6YtA[dYtBiLrthMnnh3X\GP(~>
+endstream
+endobj
+101 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 100 0 R
+>>
+endobj
+102 0 obj
+<< /Length 2258 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+Gat=,H]Qpk&c[>FKolJk9s@:VAP#W=^aA^p[b)qY`]Y"q+*=kX>J*M$/(/U2qskbaPW85+HYp%'K"n!k3:A$hDLF>@et73gM.;%DhVC/trJ`m[i6Rr_*cYe#]Hgnsc.;"Ca4p>K4Xa@GT%sXfP'E\0Lh=+>)<,eaL4iS#b8'-tqo?05b4eE&GdSV+0B*7MrA7aYoh)./-/g&t3q3P6g<m8f_M]VDN1FN>]2`<rc_CDTABhkpbZkD6JA%LYf4tYc*tgMm[:!j,\+%MFe_#JEW%B^S)8r@W93rYHZq%1@!_2:j,-@tR+!i-I4Xq^2(WQU!fHT:>:^h4.C/H2FfG&=)Ot"%8e\n?fX0H@VPC-`r!uhUPOYS!N(=o7_^AbtmMqMslUoJ^?po1[P:`jn)%FMX-V3M3lWs(=S"o+M/gsVuHREBY9)%oI;WQ:/J`r<5Aca6#CD32t&6Yh^r3V/t1\eV''=P)P+065iFDI=JbZIW7kZ9>JodRYm%JB\@ZF*_:2AYMMI,9_FW*dtElbBm^G3nHYVinC&0bURmk0MX(>:(2PEmBWBl0,>RCZ*.kE[V_jBSB:'jC>;[HD]P+JP#j^:hP/]jo="l.ERnSV'K`qX%b>E%AaI449Ll]BU:t)]Ug4K\TVZHXG24tY191<tp9%VY+2fGk)i6kloF0YX=ram"eV9gAU"e[ddt3(GM@2i0*NQQ@gf]g",s%f5"k?o=MF/R'p'(@jdDAf"p(s$pQatgV2eIO">4[),?5O4a#soonC,IDR`=GJc=]`&*R^T4^(U_'qB<H95oMk)%C:-O*d)g"HN,oEd-jN)N9$uj@]$<BD;3mq+0&nPi*U<c?p,[n4')15"+Of3%FdLZ2Y^Y&G&:dMTcI:Q8W3R)_V?G=!0=\Td?%FmiUgZLT>1D/[7%`L^KfFR,pbZj)AA5ir^pZ[onQi2,Cm]J#jh)b5QaC/S&"3J-MLT2nYh-3W".`_D/b-i;(.W5,`n`c-83p*TFJ-%Y7qQSXFlP>?M#s<5(0!p"&qe<iDR3`.NB>1AX`IBD'O.#Tf)9jHN12CVfqkD9P?p2mM\bO2c9RB#)USh*jN\sESHaM+f;LMnB)IU:5.&B6_L0NVKb[BJ,<#(D@cO)seRF"mmP?N%525,^d$UOQZ%OL%:r=r>pl%ZCRM=7(d?RMNr'H/A4G*Ea@V5ld5Bbj#D2p]nD'u/cB:fa$MAf9n$4X#4'&WD,iT8!`3*:n\%ZR7GDh'um>5!B5>4=<MXm]1cmJ,O9n*e_262)!j$GMciA&_!Us+f(uPTVRG`NsDSGV^F9KHQ;2j,DXb@$gFV'_Hb\oTdpV/c$rp)$6mOD\5t6n9-u[T?ecGAm&'dBhi&BbSs'h^N?'u6HU=n(]j9`B##)#%?)1^R#?RXqI?!#am)8?ao=IU+cM3ns+Z1uk!_Z>mfhk9+uI:)7jR@D^t\]EClmY5mN)]3_U[fB,WPAZRuAhCBCULR>n.;1?#d;A^3T[4CPBX8;93UGM^'\@h:'Dg%o8g($AK>S5XXtP@6G-K@'O<[f!3=r2QheLN8Xrq8^[H%4MhV5',';l":gTVI-g!43$JT:1a*,'L](L_*4Kc>@(t]\I,,G+B;4*fq`YGZd9r<*=.?8cfD?5ES*%(IWl&`Nj%l/r^Q.XH/rAKMgbtRr\KGg.VkWT@0J^9A6^oAn%UHDKFTNAPc0afpa+(1ReIS\klf?OTG97ltP1@;gf6<EMMfq;^oBBuSF>$s`fXX$`!]I$ahf?Q#>BX#m:r3):7DfIr@].Kcckk;..X'[U.No7l4-ZMcou>X1d[ga<j6-+aXpUK1*GYcR,!iE`O6`^oX%@;M=n]"N"6-b`c<(NW4ZO^-=udFMIe[0:bis[is-'5Y*qU[cK*V4_OYI_5h]ZDM3*k8lL2O2;Ra_Fs.uKJ%A1&LB%ohWs,U>Ke2_>noI"%=Q]F]$jS:fcXe"`i*WH6%SRPtl?Ho`O59:Xjq:!(/?X7"C^SqFa!2n9Nr?Nn%!)Qfo:E8bQu#?V/I\`8+$!>QQ5VCGNJn4mKbUp2Pb=+c'Rbt4`kZ"L!4<u'^Q^Ku42au9irUu[etq,$_PSon73aX<.#LK,%KBWb]1cOQ?+k*+d,QRn[>nYQA<H'6]F5CoJ,mhN`T[?G%jqO)Mo5-:XH&V$U']MPFVhpNb.Ydg/GQ,"'kODNUaR9,\s[D)IGrnY4-F:gKE0al]Xo:o[;B"OPIhn30#Ii&C.+8p*DpM%Ak3dC.Vm\b;R@?:F![-6B'~>
+endstream
+endobj
+103 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 102 0 R
+>>
+endobj
+104 0 obj
+<< /Length 3040 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+Gat%&D3*F0')oV[_?b+j,hQ]#/h=mU8CC5;75!8/S/r1'K>EgdRuJu!U1@o?k^Ph2MBc9(pTS#s%*@JPE8F.SgXXiTpY!FXOLJ>/YIqjBb$TDQcX6Ih;@lb[5cMM#*>\[(hN50]WY^S_`09ebHf)M=r+E;2aXmfE4imc4N:i>uVIq.t$;s$><itD<l[$J5Y/9:TI&$**q2s(A%DOH5Mm"-BXDK%p!ld\[acTQiqSho5H'FI`'Va5N>W79#G5_?l&%?Jlr:o!N\.o'*PiK%p"k\n)]=+Qdc;=plWn-M$g%r[USb0'nLltI#8oiLEblQ:.;_hBlId<g'ZR^Y>/]6g?nRi?N%oJW&&*;@=\3KfJm!'rf@V4Lhk$dDGV6KK]Eeh^pI&K]t#Uf,d#lqHRY5g]sD'oF"79bXBqHm,#<j^\8S](AaS0r/o%HS`8l,[hcm$>.0i+=R1@rfM8d[Y:qoEO=I5YHtRYq0"S-oV"I2m+2B@"LJ-`u][UH0_]"dOmCT:3(L7;Fom,8h"/gUuCr(Rk656L(e,c2e1TBGtT%5=-,#9#R;;9NjlKuBo=6cD\4R8&g1QHjM!^Yp!F%H!15o+fJTb2*N\`2%%cB9ja4dq%CQ="EVHTC"$=uSIC$(ri:_qMaIt9BS;i9OkglsCFsPY;k;&4cB%gXtk?Os$e;D`l)'R1f)rc$7),2hO"Xki[!No(cCK83@l2o_+eO)Yp[NeX;ZDt8R3uZj[i7klC,CLipg?To]ZXsCLJIcga,rQ!j-$RXqh+VPV.8,G!Ds9GkL*DCbT'$9*a?.6NQ^nH`5Z@OXfchRS4`lH&nO*bU`uI[_4Ws(th<itsF#P$^JAg,Sn'R:<O7_!X!XR/P)^9-9C^_Uudl%]%^rCDo>iqk2m=j.WVpp0O\Skes]3Y6r#[:;J%FCe_R@*'<OXSkXfa:eNNqPqHfeO0\"lsL5%*6qFfUeY8eqQ>[;5N:n/fd(5a(a#tBl=o<-HeYTl@r8lMB[Z^D[ie&Ar+]+1I5U1HWHI!A9>0,[JUrZrGfpsPf=cue2C<"S'eZpOg_[ZF!FEC#l5+Yof1m51Z@UFY*/.*1=lH1'[bnP3V\`E1ac[5B?_KK+lIRL4=^F&L>\@3Nj-Pok8sb,%'6fJXW_JqZ9FAp=Om;=.df;T&SF(SmnsDk39e<\&kO<CQn$8<hGepcN-5/9F-seuL)h6hfi\DWdOe:P"n`mF\.BUU@01eo<1[H]`$bseqtaIgm(3%hU<iIp['/qYn4j,F"4"[PMu@9&q'_&n1%R)YUbV.h*GIeZ_&Tfd3BJ4lMWWQ522;#og(PW[n7XS77XYbd,idHSZc,)(4PM#lL!Dq%rc8To_r+`8m]#4T4f>a8En=]!:SO\#,S%3C%V#13Y=oF1@El`aYaSZ+;?1;i0_MoBRd\(SM5faAN03I+!k'KW:X0G<`Ng`A%UUH\)M+IjSSl%a5B@%7SZB7][&V/A,*^b-8:MRS.3.FMbd7hD7_NC<kLNk"URBtbCAF@r]<cp:,iV?70WH)AT%J!`IdJhi^`G(p-nYbR-M!JJ7/D$'`)dgXo<LnAZ_/EeC#N`D%85p0nJVsoXdQc0gNa_]TW+]0p.uZ*9_ZM7Q9#33faEW_HZ_;N.)Y=%doP#?H3\Yi<`L,t,56q`?$?i;:?c@<n%md`fcY\-DekfO[W,o`1kr`8:9bB$cfhu7SA)uFj1^t%#A*i!-\m/@35C5!3P`3JO'u15HoMq.!Lui`SmVr0LJuDbXm\ldp]7JHD^5gbFF'==^(3De.F;:@'[qe0@qW<Acm'u/pBqS9Huo`6\-9B&d'=Wh.Q4m1@+e]m8LCCph._[\bXWV#r:8gaLp(s8d7q]J:O&XLaHhg(MKF22W"Z>R=36Sl\cJ6XZH+rLaKC'N"A;b<[]FJ!P9Xf60cGXa8hf'^O%.Qmi>;SGc(3abhE@15)EV?Q:*Woo!)Mak<Q=A+Pe%W.[pV:ukDYi4bPF20X>k=AdK-jO;$:6&U>@<>;-%YgMQ+DTFXAk]a;m/B6A'p\%PuX[ehnS\:\-hd:sDrE"@Qj0<W@e"J:)ulaI\%df$b%#iV[5t8;0q!%&J0:kY'khQmUCO_tBq\GmC=?8429)=^ZE_=JiU$'9s8M^6b&"]C*$&%r_HT\c;L!Qb-%#5!OZEF[M1RFaWf-[4SH;QlK!7DX`@ihdl.\2opYT4<l[LB[V'TBYU==R5B<QmWUg@3#<BlAi"`r*u6^q;j[m8a[N([YMOX!bh54\+.bT[2u27p]6ku!lqu:ZIMALp6bO=#rQeS?3)es.(S:*ac!`WTH`Gr*%=4q0<W?BT'.l*?eOqjaB2Z&?k]kP/bTcW0"u%U\i7@t"60oG6k]XSSGhk57irmHto$t+Y6&9o8r[&K,MSH^JrkN/_k(bAO_aFCt5`8MmO_p@gGOrL1$;K%d$'TFgI+GKTp*Z4jcp-ufL;4mE,enoQ]G5SPE)C%N1f0#6'K2\N'`&cq>s7Ald>\Qjom"`o2F!@J7[a+sH\T.jcKkjpU`ipqPG>udeVcQO)n+M'J^dTS$*!%Dn'X"EF34Hb>?bmq%Q\&\nBukk'fjP'5_6)tR.U!<_*[!C;)[nWWN9bQ4R6FGZsCA]bl"8Z'*Jt0ghhTH$mn`t[<#Z/]7Md\=U,rWWsc`I3TCAO=gab]dVb)HH(b'Ak5ci-1Zj<XC-NrXaB&#f_57eOV3\;&[Q1__h<('3MBWbgR)*UVC/R(P:SbEp25t1U'K1AI>uf)erFpEb,8<T0;61DSF;TY;UoLf14_+/\jb%4r4lL!2Ue;,$>-bg]^k(_LC]OJ9,V;#a4K`]oIm6860Wn<k)Y=gWF"mUc?,RX'SC=ClmMFufT[(XL^E,3V:WP*E\_.(gBE4N6<;iI4UhO4bS$S_'Tk36M2ppGl1%N!)N8)n5Du*fSe<Df\72I#EDbka<A?iiEa48qpjF^q"a!f5BZ"f,Co2N:>]RH;^*0&h1hn=3s^Agpb&F>B@[_^]_)VPB21p\R\I%=;(jMl.:""SNXq+1L(Kd%bIT/]UG"-n1"(]~>
+endstream
+endobj
+105 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 104 0 R
+>>
+endobj
+106 0 obj
+<< /Length 252 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+Gas2C0b;,D&;>=W`Jlp7*%b4I1sn^hR]mZb7]BF*X-?*NmmV!p'-ju6mgaU2VNUT7!g$7`1*mA&"G,5m5lPRhN)P[#k-49p6WS?'a2N,HnMtT6dE7irl0=@YBm!5Bb?<6dFC>8l8S4,j>P$E&6n0=,0sdYjUguokne7%YTOK25c(PqL3Le^ikc%.d(crJa`am'F24Ci%hI;193_d'>HW)u>Q2:,7p)p0Ihp_Zo3thW(hiTX65<T!^j&e;~>
+endstream
+endobj
+107 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 106 0 R
+>>
+endobj
+108 0 obj
+<< /Length 2157 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+GauHLhfIO1%"?N0TspkB.AIuN/G3^Pj)!OoCY$#OG.h4CO_C5D/?4pK2uW%IOd$-NZCB]n94%CE,RAi!!QZ(XPOkijnRj,-")##*ELk@2kIC$M3HLh&:)#'$Ra%DRc?XX1HqVYOaX>A40909M7rdmccH-VNZ]AoN\X$\Ll#+OPou).EXF;*/&U>W/,CRK`%F8/%$e?mm^Bu"-Kk4Xt\'=MK5nl`*"8uulC>0fp.tsm4,>1lWJQU[3Z-OP!fl8V1R,1lOUhPf6BOrZ:A^5%V5>9D@knUtXd5a(m04PaS'[u1R(@hOj?IKUFel(iEXJTQso9;EZO_i\@6d&NT7=0C^%'&&mN**U2p[k/bpl;W-U3b#1*(Oae]Z;YXD],!Z.UHpBCjgh/r+jIj<sI(k*QNB*)K,HZiPkHt$S'/>"5@M/4uK]:WeHria.$4Pf!9"<?Q4o9/d].JRW2V9OONjI,3;BP:-jllnLq7\q[@C5A#-)6<[7*b"mab-%T#6ON)lZtL3*\_meis0K4p@(C/S=V#j<BEC7T*cV\khrcODFRV:[:EIN4OhW7Mh?W/FuA9_A#Y1'Fk6(MfhC7cOP!/-W\K!uc<$(siGAJN:J4/#aO]#0uD2Gp0k_k5<E<=DZB6J2Ga2'Q)*ai%.QLoH%#p$!if9crap.4mm@5R2+O9[0>)]1jOg&):hq5Ugi#9%:L/+0:uHFM#%]f9[;nddR'-oVJ\Qk`]6+OAh#Q(Sr::-F'9h,jOkP(18V^j'3(]c+5rVje2laYTF,.@IYBJhf?p`)ijN=eIUGD[Or!G1Sm/RsD#d:9&aE\P7>M-C%C4muF+tIh=P+",B+`uhM[]2_5g2POY\>sUI<7R$/UG1gMu9/XUp%5R%Cfpi7(D*Rne)/2,;brV?UX'&RCgl%3P?kE3g<l8;ZCnT&)@fN"CJ3X<Tm<s7jN([f=-g?(Mr@7BLrQ7ZY%llqrCR/+s0MnUV1aT1Ua/T?4VbPW>mYBKF=*m@\cFSa^Q8i=MdQiFI-Dj7*id@'t+pH#hBjrF3f:O-8G%R,_<s0^]PF113bXd-rhdQj]t"B!hIV,X%Z@`=M&H!/(f;!kaS6-ZEMJ0/jMm/Q]pB%f5Wq4Ago<d!jF\S-8Q,_R9]g<@hS!aBTXH2K/MOC&kr_(e2?G>Maj,]*8%eX$[8I#)D,_dm[D'(FFGsAl2,/p8cNV2<\g<cRr4!]%JQMNK>NGIZX`Z/*8h(m8C*@bP_--aV9faNOMA@B0gmnL+FOCqL+h3c-+%u'RU/iE1[V+BV%i[nAV$`UH>2k#3h`Nu>OO@W7B<T[<="X[EUD7<fWbeP_6)oX1%5?W?X^)i5(gN#G$XGj6>IUL"r26XQoFO-EcLpPOtb?h)sIM/p"i#H\/?g;Rkae6gJ8_<;#]^<fV/\.LY]b_/Ohn(#2c/G9ngjRk]Hc*VO.Zqb7(u?ZbETd@HCHoR<]AN9GP;,T9ud-F5de]p%2>SlKm5bd@'rqaam>*ZnK3/aJ[qk2gP9CMFm$"ML50R'$Q5<AQE#PfDQYUg'[X*$@ej'5tmG,.pU^3prqI1Y&jHTVYqA,$#pD3MZtqi6lRf/Q_FMa7=)EZD$K5Mn*KP0(%UOpag1X#45H'!I8-*NpX:L:$1SI[0<&\$c2'@FFG1.VOdu<j\Jn5CE>&s%4te'bnT&aK"hMUPc/u-i\*C(5&T'9U/1_<1jj+Sq2cSW&9gNj%-;@XBS"5S&#;eO3bEVEC+c5rlW0lEPO2=PoD2<c/Q]$>W>eaUZIIZUIc1H2SOpk"mh8#4M1&IeXpKTQ*#O#[`"&\GQ&)-t!eTq75fB-0DeOe?BOE$hKNBel!dG\bBl484DH#[LFkfnB1rlF]Ep@eb5XH!_H\f@,DNJbDZa6>F]93eqqf7NGKp3tIt=[&pCO1OS:jkm,\X^:!!pQ1:?0]8=F]GSBNrX8H7K:DlPf6Hd2)Z9W<nNr:ia':F6CZ`GlfqF0'f0&>`!4n*/H)29$%mAK0Bd4oS%f=?FmW3&!I%tZP/(p/fI&QPS<<_+c]i3@V6AAJ%7T2FZ54K.]^Nah+SD9G*A9O(2p@)SIa$'gETDHs+N\gXA@l3l$RcWhqPQ"EdR59UX$D!S'[m0.Lk,_AX4LnRR(Ig4Ejep[(IE2YrVg]`O;mR:pj8T;A,hgZ~>
+endstream
+endobj
+109 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 108 0 R
+>>
+endobj
+110 0 obj
+<< /Length 1425 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+Gau0D>uTK;'Re<2nFd0#)QdOQQH`X,Yd9$][`u/iD'u)(9$lR"Xt5@ihliQ;pc=NdgFZrjnPst5F3jea:</"E0@GAYKS/f(J:ls6"PA,n5f.h%:.(8M@(Zi\*.:f0>\#5&_(`n%G=Nb$cS$X^mlu1@I<]fQHjdr4pU-1rV.l^,.l3ASH_J]t0_<DnZ<$.;I81BJ>Q$LdSADNj?s;7Kp:6FYmbjUY601AVL`(G]qTqD^\D^-Eo?r\^;&#.j(ci\.?2@PGMAYZQBBk"1aUP'p:B)\#ocZ1QjbpB2-qZL1VhBr<p$XMj,#^:+Q-N2'qr.mDL@sL=IpQ]P7#7^'/j$cCoD3J_]"7I5nd$u(kH]PTYrG')J!RQ9-`b4=b*RVhi"Tma2W/^.XRr,&74<#ilO,[Jb#Wb0i"Ro8ahl3r/$Lk\C\c]M*O(orSM85q:t]&Ub-$Sl6biF++:QYP['BN6`(D23m0(k``Y$)sZ"M!P:F&@86bJ8O)i"a0eLI'ar=X+);L_^DXR`p95M3o@Ro=1d'#_W<,6_RSIaVi.b*u'e^phn_s4:aF//G"BG\qG`.d\JtWud1n(fBG'BXCWRjm=,$g2-D]Q/4/[aNsKnjlus;nj:H7mQWpp;,$r8ZY?gn!]c)LpZLY:epLoa2!#!!0CVm&bC85'iJ@,*IgmpKbJ9,uMKhqLYN3W>P1?JO3/WP/p/ts#V]QVa<8A1.d$d3oR]E`m@ib2e!Gom>dT(kk5+/)pb77Oj&T>=d(0LeHK<<UfZrYP3hDVp2M*js3E7g@r1e\JS8+'PnPK'UM#UKd$rqJW!o]GLGBD2a&7OH_B"+5ibg82+%$PkbES\Gb$eV*<Ks+XUF+PM(pLj[kpL`$",:K+IE@?Mc,fY?lDQKe:,hi3;lY=eTOJ*ILe:CsGMkmm\6&L[5u/4I'WiEGCWq2_7!$6Kpb=L"3I^W<!#7F<pYn_8Xo`.)G.8^cGIruBaAfOd^,GP?Uq.;WQ@S600*?>Fm!NQidiUQGLJ<"/68pE<'`Q`qU93o.!@MF&8d0\[pg"uLE3V+l'LU't[!&1)JpmLYM[r1J1KHq5Ho]/\;b1*u*h]KKSt(a\gigl_9hRCXqcV3T3R$?jln5lp*cq;#$a$PD&r@68j%_+Ko<k23;7%eer=UCa!I<Z&MNEr^0/9^,A6mah-DV7uBo)i3+:6$9Mp%iZ\(qoat]CS`O@0%U?F,(%%ik/#ntmK>:t,;gaO.fAE#6!$4P`<:mMOZ[A#08FK=63HL/Xm^ug;g4f&e@B'4Amjk0<uJ)?i2\rAZerE7'!f,ZrFDXoNsFRO^Lh:?jH83E9o8PLbLs\P?nqFlE*E;<_03SBm$_"olDi1*[^D^Qs/qK>D!Q)9QU\K)acu2P+-d543pB7$#1jHd(W,4;e2b?N8Ears,&+[<^U++\9`~>
+endstream
+endobj
+111 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 110 0 R
+>>
+endobj
+112 0 obj
+<< /Length 2746 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+Gat%%h36X&%=c.-@`M:4bXEn]<ib&hSaCKr:")/nB)L$?GdnB1`C=2HV)r&aqN:t05d\g.mU#Yj8Upe,Ht_E-DXQ@'2b>".S($IGhHXu^9l0fm9sV1F4PiPQZ8je3J%pG:M=rFbmeZlh2ZMI#rZ3WH+1KW@K;IK(ahMtQLM_,q!lO'S2SP)J,Pes"CaWTIpH=)9HQqsTlC*g#,Cr^@@AjtE6a%QCqK&WX?]4*nG2Xs[YG8@qiKf4p\gk]n[:>lY2VD<*nh`s:ctSU?+LQ#UeQutQLUTJ\B[dhY&2Yc))G.H)O0XesNOM]YD=3CMs&%O-U6,>PRJG@?(!N0imXP'-YV%Y'UKuk*Aq@n+PU2MBREWk((8L.u-M>eAXiF%gk@%"J5!8c4q>J'WrcJ234/PMP##!h.^\qU>gq,Dc14S_&H1&GTC/eI<@Z\GJem&+@I5X<^-/\'&D?/Me<%31ToT2LgUI.mMGE%DI?$B(\*Y]sJ3$7Y"UN%S$3Lc>S;d7C1O2_Ud>Y+981k)IC8B>.iW7CZ:A:A@b-r_eDog31,10h)'Afe7eKRIp%B7=B0("$14fQs:Cc>!4C1QBdM\?t^?<Ocff@aUHg8R!f*&(7s)Rr9W:&s?Ud*cDpFP`2r[d'uunZ)og,_EBu3O-f0%ackC+]'?0H*cS`PUBKt7@uM!fE"7EY>%p0!Z$da#'1'#ZXB_34?6L0K@X1._\]A5/\Da0._2ec.?`FbOjdq41hFk,F$So'(>AK`5&9^U>rUG+pbT_l4cYf!DeWQe@iH6E?$93/k]RhI&4H4nWs("-,#u)HijH9XIa+R/sXkI11UDQrh"h_b9adHB8+]Z<sEPH:th&U._$BU`FB&AfRCI3EG[FQXK)7kQaQg]HQK`dh1?<B-V\J8h+;rs1m)@,5A)?RmdRoCqCa?D*_c]#hR_ThJ"]jaKX;S&$[c-*@ocb3J-#UB@-K=n'doL)*n*q5TBZ"K\;76tE_*'r0iE"rDi;@UY1]A]/Ki%?^4m\YPs]rSKdP#>Mq1&BtqSgV!pCGh%];3IW1*t9%UoK81pH+_H^YQ#aSn*tUCjN`#7EPM+B_C1Se]-r[!G\_13Ji"(ZkMGuS>sC!ag*d9<JnWG=HtsJd.`Eh(!YR<AT4):`_41Gu\NpuXN7Yinlmb!j'T1H$0GWmcF([+?2Q[FVG,Hc\I)NfT`d't1!s8iZ!#XHoFcc:f3\.B<c9/K;MQ6!LWC.pSIB)3WGVS6i817#WeU_B$f\3d4ViiR^o(*/+RMYXKV=k3uWp#o.*6c"B/kKk^oC-]Cn>+']&8I0F?J6tsVi`':)HZ3-\K`:V(@R^3LF=G-[?)@0VY]Zsk?7h1-NanJhQi+m';-7`Q0[Qdd9nkfG&Q,(Y^@N=Qr!j#'1K8Rq67mtbo)^Y-K#@W0/,)To\G$<&gJm.Vsme"ed2lX4=Q)iC_;=q,+.[*q3X.;Ac3J:++u3c_mQZ4Ae[D!)mruWn'WF`[["/"9nd@'e3$`4A6]G.k0W=oDi*IH=9kKb6I=]%&4/!\N8_Ic\<^T;)';E*M#7Vb"O?%=YR/kP6O0.e&>m0O4Ok8\n=:*TJ53=\SF(mHX'(-:afVJ_#-)o9:m\1P#Z3-!%`[2FF`(4p<AGnQ-!DktB>NUV=i*!A`uiBfl1#<*dZik'AZC,jCA:)_$Bsb]QP3u"n"P5V!+tuNkh@@Th45C4&[#S.;INaDUY.=[7R0Gp!T4BG/L"#_h!7E0jd'9.dC>FD7.tucdJCD-6CnOPJk=K)&`-6&>n/2b!7TKTl\b/,qin21$D6^/=VS1\RGg`4c9rR].iKfZLcC:NCj]8:WG"RAfKpdT"?)p@L[r)'i4ESf.iIbp.>SQCd0(A>d0S@h!nG1I\=i-mg50qcB3R-r2Vr%M:K=pFY`3h'*&7Cr,MEnTa@sKtF2h`.M!6a+;f=6X\YN,A8Mk8XLgY#ri?F.u+Vr>00pL=Z#HiHF4k$NWeA40-dXA"bUA39WQ"Wa;o0S_)mLh9_+\_1-AiHnURr8L]s!.Ze)J-]@!>HWO!P(><B&0p*2U/,QNf>?p3c8C_VFp\g-@B!c%suL]Fjma-!loHBplGNL&%l;K1aYRa,GkKT\]i'&OE26<<B"!bZ0ie;TAWGg?)72^a4a<9Vai7F-&>N-.Nnc%Hi(C<`0XK0':a<R3o?BE?EHSufciG^=#]kVq`Ho)!rt?M&]tSJ`68qEX9Sm<HUbhI8i&X9;S5'"_6PNJX?mmHAQe<h"8K&o1BgBW7VK`Do%VU2USnna$B0ia[Fc@G1R2ISeHYY'o:%X^2F$ha=\<$B&82KlJGa%%KTJo0G2\nq0^#3i\e\go6S7I+f`FEIX#YbKUAUepDAj0"EgqrDTC)Npi>NS*pM7m>/2t?C@^jCJH0J-nj7Rp$PGh(-+.W(uJj?'V\*8YF)Y$fnl&G1K_CXHp]thU5f$r^"CES2k,Og+)+Mh)-/q!;`k#(ol=CC=b2%/Gh'==]ReiE*=3j/CXDT9ZPXsO:J"ThcWl\Gi<(D=YM"C]]fs/KaSi?_\L_-,m=1=P)kH476P--;\K[k*B7>,Dk]9Lob3%$)0,abpiXS##2jJ:8F5:,;rN'$-4R!L*2Fl19juYckqJ0`2F3nh5!XA093Dn`C5WLXXLdnG=X3/o%\;ApP4S[OH'TS'0&P2fDH%85iCIWEFJ%')Wd<U&6R-BqE:d&C%N,q<MSNXSjKIfB)FE`o"KV2N8CE"Z"f*ctuIHrX\?F2F.~>
+endstream
+endobj
+113 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 112 0 R
+>>
+endobj
+114 0 obj
+<< /Length 3603 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+Gb!"sCN%udo"0CjSj,5c6VGq@pF-XMReDj(iq4$T>o9l5];p*Vg=%:Tn(6Gf6]+75*dbsC4TkdFZbq'/L,5(O0$g\<S-=+>(cmT:qTN,ZcKp5gs6N1iRC2P%M"tqm=RI!?>eJh2LIr8a(9_upYUHk&IrQ&U'4,R1M7?mjf#)kf`7IsNoo]'IM"e(g^Fkg:J6LgH[Qjji8h"<B#3#G3Z\&N@C5'b=_=7^WA<H&E>=>O;\.IP,[_p?Q#Gp0ja0ca4$])"N8sC5-B6l/hnjPoGY1IeFkR[Ja6gMCXr*'].g#eIEMm<BmQ+>>Y8j([oNUco=qfa@8+@a?^hR]ED?dI,Sa%7Hb<F[A:6KZ+mVd'=DZ)RIAX3+(%JDj"+SJGe5_6b2UbMk[9o(<:Ap%=LG650I0Ni>j4,]DKqTL0YS-1k$1Go#k/XWtIgiq9P%>crL@V!Ag*"8>1&4+.Z:fmqGHaQir%bk2m8M?KO!C7AgF/Dn3P)Z$\hlRX+mV-K#lH3Mo3I5pRkZ-o#+]V_^qFrGZP9]49`i%M[Jd9B!.Yk&i=4)^JFJao19j@R.0N+*B\p*7pf<bb_uCOd72#Q^+N+UX7[V1teN#jgRf%4&PBq4/q#dBshBH;[TK2m*\&-6aY9fW_u\@Wh,88X\j'DC9>7*r8(l6^,Dm3=GuoUrJ]UYDYdc643k7'I^q%;7'IP&VhRTWqH>0r@:36`KfWoM*sOEdq#Mq`tuEqM03(lWY(@b^>Gu$-rG7q0b)rM_cc=p&]nMC,3u3EZo)nTY^Rgqe^c^J*>2!(RVopYTE&-n'r9H`MhZ_m?,$>\\(#@jV1G\4$`/I>"tCP=:0nc0%)$V,Xp@B-mj]s:7c.^<AQc\+U_.1'+*obL">q[rOaqf0or^fKR;dAT0b`F[3W`gN&k'%MF*,1:Ted,]-5+>+39,Hq\mm's>ja9f)B*+H]\EaN1=:lg3.T:;0;[4((PdSHbu?'1Rr5Yrlp<fMik@b;WEs"NkT?Vd1dYaCj%bt$W&1?-J[@JZbgOS)qn*Qp)KgjYR]ZFfHa7aM+kpO[AF:@s*V;@8kaGhGMk+cBfB23:gAH*!RmS[Y6q;&U.tXo^4;N?&*&f:h3n]DOl7pPd)Y/Z3S7X=?:me^,c!W5QCNuLu8+N@e@KXDrVmgrb>A4p-FBiIh]Z^th[W+a0.IV<fVr.5C\MN+*D@"im@.'.g;@6^kD/O%c1_A8=^5o<OJXZA.dEn)Qs!BY_SVufV9(kU^'H2Q1/;eS?OI\+g$o_"O;;XJKOo+QcoO?a?O[Aa/]P/qknZrFq^(O>AT'O[&!c9m41q]VKOt..W0MAM<V_KVUZeI?]X_.kQesHu9?K]:":lTM4;@nl:SVfXOVaSL(c`SFPEQ?/<K2<l0O.n$Zc0UO_BcT[p2asH94i)7gL#@&]OpKm@&L?m`LV#e-4%,BH--VKAg(s9ApMgse6nr]sfOQ,@h/1'K4hj"N4.'l(N^josUBEjN9LCjj&B9sN2/jk+PoL3mku;RD_)sN,B`Jbnh:I"Zd1@o,lJm<Kl!bS*MdCl1[(QB5KAYj%A"71o8HemQ*GPN7mFR=7F;fEM4oRKjVR(t2LST9r@13&qW.Q%P:A_0W3_7Pa$[8QuWYc[#7#7E%5S;Ik8Zq0Z.A9Gn]oN_:0!69&'ciA]M@*&J<ASEO(4IWeR-2)Y*HTi8AMML=brt]U"\$Tc7R0_79'L^V9HD5nD1W5-g*ch_E?oXRbb:".6!uK9&?@"(1,4'8!\67d,+?O,`5rF`7(PZ0B[n4\'9+q3h;-j^4_*!:6&2uLkF:5?Y$$h7+dNeSAs;uIV]K<6-c>cAHDDjIS+i6>]88Ggp)FhOgt[(&Z&5UW@?hW&YHF>U<V%bbeL4a!*&5JD(_>CcYNk5r1^k$i3$-l>gc%/ueR`_(B#_H`EXTeJe^WQ4C$UR@>Dr[)@Oh#Fo%alJakY+eg*r_e'--BX%Z*h^e7CGW_f8[p3j+q36tTonZ9=T8h&db++>gUSFaoFrTL,,p<:4jkc*Z]]qLqNcFBbecBpS,N<R81bHd1!?H8:[&0!N$GPNU2$hr?g6<Tk.-h7%MZW4'U\a>J0-,)E$5aZ#"!"aSKjK9>%J>_Ufrrd>M"K@^.,T@AK'K!Oeg5T1b5i,FS>Fcl-\#&j1p%jHH=6jJ+Bcu;ZiikmQY6BX8c_GXV:'J@o[F]%[9NHg/@nH+HHr:)`8i58t>^H@aT\o/*oo87!]0NW8;JtBer':'cpAq7\V=X5li9<^0m#R5&u6%$4LhL535im:C5d[HNR;QP1:iZ1@N)Y8LHT&p'/gWWf*=SQ!R!0.Dr-<<cuZrfZH\*o&18coo=[F0rNcj$r1_k8p]\2GSo>%ENS'^!bY=L,W+"\rP]!X/&5"L/cm0F8$$b"H"b:,%i-UYGf14`=-EPF:(8;AN5k)Ong<M"b[\pXphaRV,&cWRT;Nk=Z9^rVC-*+m#71q"!B^hilqsIuR:1NO+VkY\[hq+J((mPuXMoBjmMLUqj60LU\I'o4<SgG2CT;PH?k@m8f)`nl//7$+jX(5[mo&+[_oBae]3fhptem5EA[:2^P,g?u_rhG!i5,&jq,]^\I?qkPJ>>NA5>,cSU#J(X9#[,pf`$I?O'_p1+u+lIF>O*or*H&s*T15,+-W0-Y9UN6-8`%2iMNPl0sm%*7%nqR2+)q;^V-aJdWt+(0G*'>b\`!Cs?D[#@5ZHJKQh7b]+NoE!]dRMfF\;I@Rj<lkC=2)6>TDhSHKj\)!=mAp.A.Fj6<FI-%-:egHPo'B`Y3?NrqQT7e@QX9j2\@!a'@X[s2ZaWRoC,`h<#hMQXZo$PE@@.uXp"Y;J8Yi;8,b:1gn;%8)_Qb:sEF`j3bd#4!.T1/l4&*GASLGg:1uf)$J6j@.n=q+Iro^.Fp3l-aL+rMWL2L78R[>&\bp_Gu=^*X=jrLh%@W`q/IDI.`"[V=0iNT_m:m<3-(hgDu=#:O6k,Q2c:u03Sq43%=o*q#Xc9(GJU^uBYs6H$W!]X<[,S*Gg5nA&U>!@i_j.QWS8_CI#K-i+/o-RCb-^edFR-Zn??Hnig.AolEdL]*,d3MUeM+7tTr8nHcgeR*Ljob"*2!q3BQBX1+6W<2%\EE'j4-J5:^Nlk/\'qINMDald0u50tUt+7YR-h?4\BD[ba*;k#jiaQo7a+qmkKTo@NDg<-e3h\5%@W>0'Lgf#D43R&k7\oBK2W/.Un%,iZli)rCHa>K8D\cdoT*HCmiT^E>Po`#^i?:)OfbfnJ''3tEou"nk(Z,7kbN*C_C<6ASEKi;q0n6/g+M"@.oCg+,C_(+%QSjirVcO4r$S&ca#'K>YXAG:VlW:PCfBkj.I[.?=/olF0.Eel'sn?t['3tJk_dQC4lUS&E7X7X46lIHH%'FRk$b`g%5[ak,A8J.OB8!_Tfl[9r$0c+Z%ADZS<bUent]B5T!!`*HmDaMiI%^T]Dl0</8HM3Y,fNmnc(PQJr.T2/[$G]8[/?Z>ubbH\\VAsL@_[Em(OWD4hm&tapthhU%nUYZ%@OeUm3grIZ*OGglBR,i&/aYpi?o]<%$@oG1hA&kO@[>Y2+JpR2j0,?PPA0OA=+W2J`;nKIIj#\MX9faA<%&~>
+endstream
+endobj
+115 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 114 0 R
+>>
+endobj
+116 0 obj
+<< /Length 303 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+Gas1Y4`A1k&Dd:8DPTYUZP+!aUi^"=P..GY#\W0)@b!G;r;2pY#6C*VHgc@Nh7KXuDsn#9EWg4rJn5!;4TRkja9j40($H*SNbW(&NG_6>n1)t^46j9Wi(^B7.Q+q*c]Wa"e\>cj7';CdEE[hS$$AIp[[GnZ7.8a\YALiZ[a''A\AZAZ51A!i[p@FV\(5]qEIbak6Up`g]*iXbUgTXWpj(n'Z_,_::.Hf<=&9t('GLV"@39<cEuZKNKe!%k>Qa4*4YrT5g,]!M'&J@To@SLso&=$N!_)CRJsU+c.C7GEF,"rQ~>
+endstream
+endobj
+117 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 116 0 R
+>>
+endobj
+118 0 obj
+<< /Length 1403 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+Gat%$>Ar7S'Roe[&H%am%E"*K>G'=jl*d`f()nZVFXRrnG-oqc.k>Ih@K1b2(1g)nASVS`R*7SJq9GPQS*B/-Q:3W"9!N'@(u]-g+q]QJ&kRt",a:bBQI0dprGd"gfpHTIIQrlGW0Bh'X@75SL"b^ZlaQ8>#I?+<a_'ZtqD4T>$mp*b0S"elg)-OW6?$>LF_0t2Z9f2Vrp&i.0@gW+UD1a>CT!E"PGQrYXado36<P&C&Rg#J?Ml1K*\p)CU=/<()]$70nXBG.?`hPR9_7Tf*G4PTc&nqf=;L`(k*,sQEMPo2]X->1TC7sf=W]V&@0hDiE>Y1@.$*kn6s'mN&EO@\,75X'$F)ii#ADu'P_15%!Yn8U;4j?FX@P9.VYueuZ$"6@YTa+kP;4T30[j,Hc$L(0"XI+];:\e^]-t_H#HYCN.M4:qfS?lUQPH@W\VOaPUi%]R8k7*u-UUmThpi6mV(t_qo*L2.6Bq,!E,-W:$F.>'<aEP+6A#0.Y$b-N.Jp].%dFB*5P;gpE#Mt+>e>UC='.6/M!1V-@n\,e#1nH*U)M"V`?6^%@$p]NV$]978G;1W2s%!h89MVU]TpmInIB.lKqX'SgE=u+EFlbCmYV!F#=8@M(.WLlDdL0>`S=gB\&cg9oVL8CPo83UJkILfHbtS/Ko$S?haVO]>uBfVY"qSdfSPb]'I(_.rE1Sd&L77Q[4&jQbr4uB4Pc:#$*;^61>$m+`Fi(cN38's_*cmPfMa0Mll-j($p[u)p2P",LtV9B0Qo2mqdF>3TAXPn]C%MP.CP!_g:m*0"P1A3eDW=PF`Vo:EF$")<NMa8&B5qP</^H\Rg65>UR8n,KhMj,I]N[94budsm%\+bTnWlJ8:\LVSm2dM;!!!?!U+$jg'#DW#%QQPPNgo@7<bNE.md)]'%e(Kc)Z%IT0M+)J%WCB*Ng%$l"$&9)1?ma.HC5?bIdh0rW3Gu.;t0A[(AdIAs7#EnFG[>")J!V`;Ei./V!86DsomF#9eqi*cdAZ?=fC?[k"f@qO:X%h@sp=k-)X(8pIFmX,ftI7tI;=DK["mj;tO:^".#Zrc0rcr#Wk/LJ#=F0-LkD31MjGCm[pACQC,3)>WinXO?YcN#>QT\M@O:b3OI:_\WI9:Zq`"HuEQ'eS-%+7N)a+pfs,1L,R_*Hk<LXW;,[4&r`\N;UBf>*^;!X^O%_m)r32$ndYG2e)US\EmSfDI_oPoDE5M=rV-RtVcEm^PjH2=Z,u=`K6m_*a5m<UeZ^$&RpcLsKU2!6<`7hN*+6CIPCm[m!Y<YDmIAKlc^)GXBA2a8:CXo_m]QWCB^KZC6d"26:1gi`&4j*7jXB8bdqkV):$9ktN?ZSSV_=4$BjLs>]>YBrn7TPK%Rp[2b5&CWqfa&Jofk8]o-XJ>*[naM~>
+endstream
+endobj
+119 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 118 0 R
+>>
+endobj
+120 0 obj
+<< /Length 2087 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+Gatm>?#uMo'Rf_Z@.IjS3!><G."1[,\om>mDS.!fdr[\hCY*Z1fDt5ur;):H?""&h8`#CXSKhF2F1GBIGe(:cmX<o4XS&1N3OWE$0"$OiS"C`#;o,QchB.*bMLi33V[%Mh[KBtB%^oZs%!%2ag^22JV!Bl/ACM-&!WN6DZs:!p/C&%AQ:q$?0V:u)!*dX+p%SFpMlS,L%]k/]jfa7<H.6prSk!CYe'iYP=CXVmhq779?9F220f"an6?CQ<kn+5<h^9':F]:aJ<jABH]*)hPjNZ*FYS[Pg5QQ2Rb.(!NWjm5mm.3bEgi%!q3Scs^^;bq>!8=$0&SQ@k#,(>i(kPBXDhIoFN"!jo"7/s&qedA2`F<QI,0OKT[uqnV1:$;_8]A3h\#F$9!O\'I;Ql"+\(/"-J@dlC")d0&[IPI7-HQ`T:,/F0Nlcr85W0+/`9eOHmlaPnloRG2]eVk!Gm33!B,+XW6D-P3l&M%g\_OJM=hQ08\mlahq&t\mZIs*5grI&u^?&K4V<YTR+nTijlpo%KrGj#-8(duH'e?:0Y&X<q1_[NJJdNCm"*0fW@q&WU&jIakn&6c6)>oa<NsE28gEnR)/Tpn;JR`2+T`8o&OoG.Zf:CO.!I(So'5ka"7$,@#M-b<#2kY']Da`FI+)i1_It4-@5J[58rU]anLsQ+L5G@$ipW)QkKY`3:,P4b5J&%Q$5=0e?^h6F,^E#:>Yge00M!ru)Dn`0KFR#K2maQ0jN#^GmW'm3H6:EF)H1"H,-JSaYKLjnel@%R?.sRs*Ih+XhIL(;l]"-/9,SoS#`j^GL>99JG3hYh3#*c^AJXOrbK&/!0MA7\C"fK4*iIG(sYb/<_4jg5<o1VGEZ>DPI6u<t`lC80g))/O71L]]l/YoOU[p$0WE49R<iq<K/6UW,*rcPp$k\Pd>eJZ07IH8F$%^b(383,d%nSnL)dE`2[jBQU'r3SFd*f=+D`FnsjF*i$!?B)d<h.'\ph1E!><-ih4\Zj'5.8s_bl3pdqBU;cXV,??L/V3;@"J"RgA6tlo*Pbd:?VCcQd$Y"+L;E>j[rBJ1h+.Wl?lt:n8FI$%lII"Ge<J[O9&+6jif1:i+=?`_6VQ\ULHq4tr+DYj-;61fcC"f%/t+BV>S:n_B`dmBV9oc="(K5U!+&XA7%?DZ9*2X#<ri2t:='i)dbt:l*5sYe<mc>qR>K^=keLr-JpimNVp5;8"\t,!I;s@X#s<_1kORV;44+WLcct"nnnrJ)U8"Kpq;pi4l;f\n$tRl0_1Cf@3d*\."Ah>3-ZGqD):^T35H)OB(8N"4KhQB\ACmV4IBHVG+X)eAp1,i7BP#eU0K`E^7W0j/AN(-`^>fJG0E8V7#0@<7TZYe42Zr2#[i$ptIU-VRl:oPSW]TpmZDuDc3.j)q$-m&j-tl6R\-QB(2;l`U2@+Jrk:)<S8_5e%DgEtBZoq"cTV`+_B0AI7SuITEhGRF\;60d/nGlm.0T_Qg@fY5"c9n`O<.MVFl2e42VT;D,'9pU"Mc)P=MMF(41op;_!Lsn;[YApKO`0=:_g:Au!l9+X^H+L:_PP0.eY*k96<A>`J[dM-X?,'d#/90P1hcq!Lg+5T&G)n]OI6KbAPk>F97o+/^,/qZDbISGSLo2u3EJPKmrKd>Csf=Y\MDTYZHs<:Sr:O,o8l>/A0Vhh95[0B;"6O%^iRiMr#*01TQ,8OP/1/MCRTYtet787n<.M:#qiX"m,tG"Tk4ZCm9<_7g#Ig]UR*TmWor.k,P2IIU&1S5+6Pm<CZQGhjAp]j`1m$(9g_>?T228*$$h`$?k`A7^J+a26H?omrg]c54O0<?:JA[WBhX5:I!*f4bkX_a+F'I<<7mcrBi75om#"IlgK9D2>co""'u&dubM\AT*18e4W[-=R)-mF1+<YeuJ;RHdQdBe3$Vc=B-*0f*CuhstZEj$i't@l5!8DJtmjXj3%;q3gBtH%0#.,*!<8rndA:%D>]%>CnGP=+AT"D]q$:Dnj>Z0kT-[Webn$iGfK^Zl&^[(?t73=TT;=&&sEF=T=J=B=G!=is*kSj*B'7p*rFHnlc]#i^38V6)Vg#C7;ma+*JOT#?sDE%t~>
+endstream
+endobj
+121 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 120 0 R
+>>
+endobj
+122 0 obj
+<< /Length 2182 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+Gatm>gQ(#H&:NH>&H%amNE.<ID4Ye$T]mb>'-epZ'S4i4D#ps'b-H5^YOC[E%V8OIR_C=(M`PK1S9$N_pZ:u.DL(j"NTY+r#k_HKM+HV1No,<Zi)@Ucc->]90<YTbDW4G&UssU`^kk22,tU1S">1o4R,(<m[EkhN[r3J#!J?]-mKj,C*TE06\=jFo->qm+bJ!N!P7N%@B4^V_q:f'O-oi,=Cr;r'QjIDuVfCL"@/?Mjje8d,@sXbMB7mJ"C^fqeLtjZm'`R"<.c']b=3'V<P\C;&9/jZ_/8>D^d+A3*Wj770YPg53KJXFk!%)ffEr(@@H&WW`!jl/^/'r_O/3pf^YQRu$YEO;0-4lHC-9+\H2^D[\NsEDA2Aq:]Gt*Euple'KeZQQ4;-`tIO&0:4:ssc;.VecQ\WNNM*L@SC;cW@"U^f)Q!jIL^6_rq'5M!JL+6==5r)+;G4_@4fV@ps)qnd40c*P:g-`8Ti4E+@Dqa6\437J9$EjKcYkU[>0YHB($I&MsY;Np7hoS>=>L_&_R4],:Y@[5O"OH>JsLI`Ul<-=H@>;^-4kCr65$eHN`+G?3K>fr,*`7tlnp;lBn'7//>+^Q%g4^0UaMRR&T+u]iDl;a7=e`Tr(*fo1r/D;;$c6$jh?m302=eN^;B^$>Zp&6L=kPQ2b^&uR1bG^sc/p<nZPu.O"eH%]o*:f$%L@gcenh2#2lj<GgReSjC:5([YI$5:MD_XPF#gfY<!"aVa8nq^=1+R-X/:Mguqn>epG69FS57$2<9BM.^T"-M')eO=J5_"?a)q11RrV6`qg:)lGW-oZ&9^N@hF1%&Pc*a`YZDR8*NTfain<mOjs'5ee$Lm/"V#O-lPR,KO&ciAMdAQigPR@8LPEeC@]+@=]_Rdb#7+^R]Z<)ZQ#b;rO6==c]Vb.68)W%YE-.oGG;QsU820h#TkSFC:mQrPHgNTjir\+UFE6JXk&W!=_N2idPe?ZpIgD7)lW-mf-A)XNTm$t1R.;G`74DG&)k'Cb;?r$mg-9^J`#Z"dp:IfL_c+?/2#76CU!-pet12>;S+J=I.JXYo$C$O'S%Zp)Sa@FNiIR5:tQE)&7DMm^4:\QkqqOZ:LS0Mmf+,":jWdX)$#=O.cGh?T.*Jt:AXm%,@BnIIK5frhik@c2W-a>ns]FjLTX`^;`L.\G+()Z3Arh+E/"ib,/gjnXCWceuu.RhJ6V.W`aHu-u5"3qN.**"4"Y&#?JS[-V:cEkcM)u!;_<[>U*7s0J_^`U>+QBi"9Ooc7BXlT/t9*T>/iaDp/,a6g9%CEB`(<DJoKsf5sco\j.">gEj0308VB?(GQAb>\AqVKpXkS\1l.!.J:s#ThdN=U8T2NGU[Q=\?]H&nJn4$'n8D3k!<4/hKL+*JWWJ_XVg/n9`)2@\RqPXc7ATAeBo;;u)EG@g:Q!5%2N9NZMOK1Bp_9*J:$CjEjtp77lZ,k@0'go[N9VOiQ"#9Wmp+(dDSN..R^0PDZ>-1f!X$)(:P9aD/NLi=#_OQP6)0^6H/]b?,847p!5<nMosp&4'707K3;p[PEb_B9Z21+*m^nY)-KmMK?SHTl^-VQ$'YBNI3u_!_9Y>\CQ;=(P7,d%=Bc:bW9^'Z[J5Q/fW+1kghMj;._krD%s!Tg8S/R"K,=TV4sM9`Y\)=gi1RJhT,`\MplFT=T.10n!D:k'U+bf&bl>;uNSNW1]p9eAF'hi2^\+X)IIM\h<`LSsnN=MASfj<$&2-jl+kscZ*JK)@Vk"Oc:8G-1ZFp"dOpm=DbVF@_uhoVk=.b]ITCcf8-f9_=\L!Qm>E8,/B,ej]PnKMlTTD#9CeI<"@/On'-Lp#8>QL90^eCRRnoOpD2=B+$oA>((i5RCA2ctJph8)ja$.JQ>NQ<Ch]h7h:V:R[t!86^>+*G1?O.#cBp?0>H%-FY4V>,Wqo2^D,YN['2Y4#Ck"bt[k"NG92e9ir`NU"Mh"5r>CmU?m]T#X]W,DLPUi>+D5er.&MbV\5W8Y0EU=+m:A+rTY-C@YLe';$'qo9d;_CalIhWA?)Jnt4V]09F+HLriJ^-B-s24.b5D.)dR)6U6+&2U"-glJ)[34nfK8@9G4Tis1GS&!+MC5)W;.$/j=<<$@X)u@8#--2Q[t4G\a*7J!<mZn5&p6Lq]m_76hXbpB^#F?m&3>hC!p7>Rcj@M5H?:&rUjiDniFN&~>
+endstream
+endobj
+123 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 122 0 R
+>>
+endobj
+124 0 obj
+<< /Length 2173 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+Gatm>gN)%,&:O:SE:RPc\283c`HcK=V/_u/*B34Vh<E9!,]P;r/kO$*^:p72!Xf>XOipD;Pe_>U]6e^P<F4H#c#/R@3srXN&]0)@GS*Pqk0a.bJbZ;,hX]n)UDF.C_o,'epd0q=+#,DUBX>'KKU>Ps*OAt,K)L$WlIj?OHm'9]/DE*G_<W6T---UrGW#"9lJ69i^Q(PJH(>]GM>+K'o;gjn3,pe\@l@aj:QOPG_1;0mnY_/:>R]jGEV9S[;r6a&$&e^8A/bLFZqRsAk%/[KK!m7S&@rpKP%_U,JR7n^?=rpY^NO#qUW?6p*Y=+%RF<cFmV<Xj#LGA0:7tku*'i6a3.boCLJC!Za^jQ!%Ls0;LT#?7Q$qU=hG9Lr/!#UbqYNH.C\<qRi1'(qD^o+B^`Un7kR<8V,)Nbmj/I>,"bHC:g_*n]Ld^RW2BFFYh9+-P71o-$jFs9=:Y;,DYU<P>$SEd5al$V0$,WQW5SL/dhk+(_lU'GTN>"<Fr.$P^rRJOGIm.2O*lO*ni[9:Z.>6Q]r&D=&BpKgYW_Gor^m)PVqc-to'e`Q>1sWVWns0(4F1U&pb+)hS3gcSn&@Kbbot2ikQg:BiIPTs4:uZsRniGU*[r.8UEeSC,e0etE!*8]scK<@Z-=#N6*d<Zt+\j=i'-7/MqR#Cq)+^\/VNL;W%.'AEl.q'r"7%g'6R!]t+0n>K#1]D0e+U<6fkOgYe\d%W@#;C+Q1f(D'mP,I2Sd)ljro-S)n7\nb=!G<>0]<E<O5Ehee=^W.oW%-5_[^6d!b`k,PRm^U#HFkWCq-S,UUeg4lS6QD/,DrQ`__gHY5rATUZ3?8MbfZ7^^;eMnr@aCS*Vr-c:NH;*ep:Yd0b'8I3cEC7#0.c>@c*%?nY</QRHa9H/\nWUDd3G)(]K1GhuBe!q;G%USQF.!u<Z"0^n%R3YV'HSnXM4O).*8b8iGc88P>fLC^"7,+IA&qM';UYSP/2G1q+'Hu'dl=**77U8^'U=hr.AjT\WMZ^JkOh/oKNRWZr3WJ@SG]WOY"lmkHT9^fQ_5E_I`4ddG>#F%k?>&LiL*WPRXGGA?C]L0:T[oIp\P,G&c(JJn6//sSb/DOC[\11pTOe/YYcS.-`Wfj70LaYYpqY=2.&@Ps:h"2/G2(H<.q"?-c-V,7kdDYuLM0KalDOOA:p>LVBko>8'P$6We\J:0)&@VH:Bpg>bXX%<OG"G9!;[G_n6H&8jk?&7&4gW>iE,#j3/IRc=\[mD+tpp'DIMj&Z5CYXjFald`:r&G+">ar*l#hfCqJHUAH?iSSKi1X+e^5E*>'L"F/0l$8O8_AgSZBVcX1f$CV)i?EKo_UrR'j-WE\Rap^%E-f_PO-?pS#k>q@,X/;Z4dk/F2GD,oJE].NkSgk$7qVQjLS/lg,E\Xq&2(O5KHO4j#+'bW`e]Z)`j_Stj8Y:_B^6<Z7s/YGZ?=/qs1b;<SZ:;5)\AQaOW"nI3J'/Kjb/``$GT<-s!QJe5,pG'%@>\U[oShPS&/ik86,WGq-q'/^P;ibcQUX(3i@fm6:6HN_$F:4EtLCNO^5"MXWN833jEQf]Sh'S]mCH^J3+R/&]',#4"\k!eKUsSpRk?pS'E<cl?UE.nofXhGo2*OakC#"9Pf/TT+2N;448;'j"pJt"&*1HM*)MaXWE/e?G9CQlHpn:m9#6?CTPp=Lq\gSUh<K0e6S$XR`LD!hGqG>fdp;E/M(6"X!],SAY+d2K8^2Y<?$_;qj"CEnLFKhDQZASmWOF[H0=:gs`*QVG.]9#Z/"8ZpL15aWGAk^:oW_"?9PJ0]2d'=`GA/*#FWSNUM1()R%WS#aj/E`d#-E!0sR'hlTBH!!BQ2IdrSs2")9M]8Ff.3=6RI+(UUn9i0/%]*M,&BZ!YF*$to67r^:%L:KTTEpd=ha$0At?V/PBXcg9p67<?38>-p1LqG<^$U%fXI2'g\dnGR*mD$^M7t*\[W+Q$h[nsD]k:3@jf`D_=K]lAh^oe;76c]Lom8qVY,;F^jCNJ^1/MT\iSKQ2Miu*35pDha^$3RZtD$ZbAWKI]#^bl\uC59$\f`TRk],]]`G-8S^mo!b-*e;Woqi>M:C$h^+2hg!]XdHKLnnlLB"$!,0PIKO=H-d:Lg((OjGLk8S=AS/*q&cjMHR12`$-:-_gei5^kM(pM#DC6\Y.s48r^%~>
+endstream
+endobj
+125 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 124 0 R
+>>
+endobj
+126 0 obj
+<< /Length 2097 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+Gau0F?#uMo'Rf_Z@/Q85,Vg!qJE3\Dib@+AP9ukp5MYee[BQ(e_A;WBIso9[ckT*E[a*'BfkA]omQK`>8XhYO8+4``r]1C=lQ](i'F$9e&I[g]I44"',05go5'f",aA>Kq#80@#b^qgM#cEGDR%Xd=@.kgbGkdkeH?'qIIuo<.o)9SZj:-'Y;iE]$?VOBkK<nkQqm4UXdhYsZ4SU-\qd+>3,k[]<+`(^N"$K5=%Kk/Z+<L!PqJ&Vu,O];6d98@2qM<+HF(Xokbj'!l>#@6M.2^6;Zd]Gg1l;eG2<\8lD!GJJMlTH+O5itI*?a<6b#&8Cl^B0D"16C>(T9rW#AB_1:Jc[n*n6BP2Cd;e0Ma.W\.A'UPC\-R=?#_P=ge+b;X!kaNO[D4Gua0cp-u")9Lt=[,e4P5G.Rq19q/Nl3AO4'a*B=<&sB)UWf`3;`<f%3*,mM>_u&]J@Z+%C$ZT;!B**MXI3q3WJmpp75h6]pie>:O4qm.Vi\Q.AV'r.`R)*tg5$`R3k/U'U+r6k/PU!$<LQPs#I6-\K^:(Y"SA:So+oC$Zp2VZ%XbU*HCXIsD/]qi>Bn>O)<-@_T<OUR]J+*;<<aXnYkPCCD]WrbZ4sJg>\h,fr*!1-R<E""IkbT:o7V"b?(/j7%;:Su;Cdeh=Z)R"de<'^g1`MX#$</gO,;eRpe[F!<`4<ClC$g^9)A+"]d)ju[6-5'R8nC)Y,F(A\k>&gK9N"&D40)f7fS`Id(W)b8-N!=`Iei1-4Dq30rUaa[0Tl@qI;[)#_@aD]<oETT7:SjJl%l39s2$MJ]52g%D3EFm6SLF%/KXHLoA#]o[D>f/2Zo^$A\69pN;t[I&$NY,^`j9M!(%f8oE.SACT,2#M%['6S7j;,([VZJEG#2V_)T]0BnOFTBb]cP;nN9iE`YXK0aY5o].sJXDUpkSB\&::/puj.?Wci4W\$1^%Hh#qTri0iZXG2*9cP1R[F7Wd,jfeD=CuBCe#STpSXsk^0_Xi)4qm-A^!?gPR\DVn-;`fL,?e0@pS%'Q]FTG".1]?hnB4#qgVnrsdoiH4CQ]R"Itj)@4tfDeqYW=([6>,Shb+8\)\o5'if?QQ]FoDu5J[)+r>@l$$Q,mg&6hD_f21,&>m.!G"<[KO]rB-@CLMImCG7Zb-lN[,/'Me7C).;K&i/H;RtBq%G<=PLB\d+3@fsVNa05]))"p$I,h^tNp"Y9@L3&Uj?Xf[YS+Z[=/CM`L+!mo3c@\VC;d12Na/A)#`:@=!Mj':lWk'i"eMQ(lg(AV3!tR!1SUDhoZEIq@N=DFmRjg'Pb:Jd&,B`]mku*dH"+@1c6pm2`Su4^Gq]b@D+3FMORf%$a.^0u<I=:ctAeZt30HYLErh@V[in.*e8)Ued$"6'm<>)<7Q3#Wsc.tg#he@8m:Md/D(:gA4\T)Euk9k`u3)2s4q1ZW6+n"BPUH1nR4Ml#SCH:/#>eOprWPr6HP*G:>2:YH,F=?af%A&]::mX'0ie=0Hki3O)[n>FsBB$b24QF7"Ka5phrjKC_E4TYP>Ihb/]6=_Fp2J7V]]L+<qa@S1Em<Cr`W*\gLb(mqpfDDDTo$M:>B.o#)?9A;aO`.`o!egKr8hcWlW$@]_nW\Ll3Q>nk'gOM")_,Uh$Dd^)"ID*O?=5:lQQqa+mKt_fu%QtQ\R<h^.7hRmlg$T5Bn%79+O7u4RBo?He=6\Go1M(H[#["oe:oE.M%<.rD<>)*la&N_"e<Y`j*8%GnLWtY-2c8b/9V2gRJ6*iEn`2*0T9:/8O"'L\lYG*_mSFj<(C_7)^dj(,#WiF"@9:E0HM18dt-nWd!.Il/6]-j^8VmmeAE*B[@hCf"UM0!IE#.&GIP>PYgp#fIl@?F;F+>AnOYZ=US$k`d:;+3R>DM`&IpUFEfGDh]#J<Mn3mK/[nkm^F-s.1)8JeT27BAD>&3VNE,U*+&4E25ABiOHmG>IEV$f<piU'='D4C@8`fajL;`Jm&>`%elceYGl#l,Sl[[\Vl3$OEdK-@PkYR???M&864&D;/]G>:GT.Wj[7%2U(T.@ol`NhHL1(1D9i4,\6p\%h9n4E@K)Zuud=sSnjN4M*#6kqb>2:=]aOHDO~>
+endstream
+endobj
+127 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 126 0 R
+>>
+endobj
+128 0 obj
+<< /Length 2141 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+Gau0E95iTD&AJ$CkZ.pZ)"F;$F/g1W8XmSrZcJsq$<^#I=_OY6Us6mcqVOrJ*ZReJUr)=AYd2b;_jU>_V5qk[p#b9&$eK[6^r/[E'As.A%Qj^Xb.gR:U_gdO>YP`,`7XuR65U%l-ZBs?dJ4@I&B-Gmm7HZ9hpYG0^'Wj2o$A_#hf,Ar#<Oo^aCk(o#R/H*m%*#e5OtTc7K1O,_qFshA5Eo@<JM-(6(M=E$,ZrLMZ8ApSr.PM(=22ZCJ_TQNF"a?!p'6M-N?G<`d;%`ZC7ed?-A_IY(pRF3$2+mYBcCtiaB'-k@U>@'X9He(X5BDGL1T<Z*RJ][_>oKg::SpB^:57TUPeX;.%'-L<.mSlphK[\2A5+'F49SGsT+*kiKF)r4jiU*1'nnCdiK&+$2]G+@A1TMHmhmn%efU3dI_'p1TSQM<]dt:-]"D2;\J[2`hK]"Lpj+5ifVWJI[B:N/s5@G_Q(*^P@"];LioL4KltRnq=l<JHACOXE>%!<<o+O<1NDj%"&g^%X*eC_-H&F-YF<V,7fL\nRYZs^[kqK$^PV;7X3+<28VrG,FM9!nG@:24L\k-2<%gmXV">H77=ofqs-0[jbql;5J75]S!sp502jMl5*7dcY3@+4DDmuR?XK4biLnb"15&8*N<iK0E@15]ocKgdlj2:6(8X#2JXS:l3fj#rLU[JL)HU*]>53s=JD>l45_kNnRQnU"*5iYbR3>ik5b>p&hGqll2s_W2SF#008+Z+2=h8sq8o13;+Ism7d?9JC'AX%%TPTnpPL[W<4^E"+!esIn@^!DoCgGAJ'K`#Koe_#sRqi&:CnXq"4.<Bb#d9&@duNUG#W)QS@]g+p?s3KjH]SbrdUELI&(k`fk[20oR_N4/LV(`jne0_/L+)V,-D"DjkR!VB8'"de:o>11oLoT/T"p;)Au:LL;E_V[T%OGVMjdt`aZ_8GXWQrHq%W6hLen/,#^:tT'n_C-o!'aWWuc%E8+OZgjD&$9p!-`'QA'Oj@tek?"GflM'CXY<IZLt&oHDje;.L[;kFCU!;qA>2H]aeS_PDJp)`!0/Ymf/[1"!<"hLatg"/=X&lM43@A^:;5>JO1h%.8BjHsg^8$cm<\rdX!oX]Zi')0OsMOnE63fXm@=bu2>R(eL8C'`'N9HVM5jVH5kcgJGCLXd06.e05JjJZl%Qngpr_B5ZbH)?j;"XAOMj\]/3PVSV#VgHRq$n:&e>;&$Rc`#fI:5@*/aR\LYl$jnPk#=s>M*:G[#Ua86i]]+3"Xe2J8"R>BM-bgFB*G;U$`8q)=19BaZ[Upd)$qR"9=c6gB6Qj[JW!&K67prL'!`/,&:-/K'TGT@O$dcN/>%E"/%6?UgAq@[Lm##9WdR$rLe`nFFS^uEChjGE.)R9B"Bri_'R!i@`\`Kgg&]hUDc^Zhb0[B2]q%&$NR`NKD#+?<a3PSF`-q01CcqB=uYF:BmG4f@U\q_lodRV,@+hM3)=4&?,A;4ab!8mLHVAZn,F)Mh\k1^k+OK:#YEKdXs=[gi$\s!iM16A:,Q\6Gq1FQ<%dZ"9_FJ8669k_,P90B)S@UIT%!C0"+Q>p+I%7&16$5Bpc3_m:2K70D_G02X:\ClK[<.*0k?]_sV\qrQ:iKY98:i*`_24/"\!s@$tR^=5Q!qe"P41O-RCq#h/+)V_n0XdBl`)EaQh-k/)YrAc3U=i/q*F)ObM,_@4:T<D*Zt^!E)Qfqh`@TNG.ak]`[AAba&De2m<Pl?l%].JfEC0T^j?aG#'NcjE;#7eI=eP4*&s5@mE>tAL$g?1/(fZm2-LIF*J^;ODLL>&9Z;ggs8af9a%EW0BP#hJ#7=q#WT)fZsC'gs;LWMm1S?q>=c.'\*>.MfNs#).!IjPO8R'9:UJ_I.'[sBlSR0hYM.ouJ[Aae,J-JOJ%gPKgG(ug6F:lF)XONOQL_+a5,XD+LD?Ys#uAW=8S7`u]mZN8QhBf9(ZhL.(]QJUd=."4@X@&atf$TY&M^Q_Whn0cKb:qNXM"dl62c'.;lN7FrX\s0cZl5Je$=k.[29"A\6RM9=Nqs^jMAXM5D8?GMaa1aEe`W8<U[Lu6f3_f\a><Z+!I$9Nn$RLX3LiC_`^OH-VK"pCr06s-_\DMe<Cj&u<!iU39ZNs"$6RSQoqA0@E#I=~>
+endstream
+endobj
+129 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 128 0 R
+>>
+endobj
+130 0 obj
+<< /Length 2335 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+GatU6foFfF'RcUW0]m'NUl)ZqCS$\9C"!i'&gK'#,1+ul=F_/Wb9W:Es5#8AiMB8+"S-/cWH0]6Et@`9k2l=%p%I\"Q+slE,1QAb9gfUIf^R@&+$MPkP?n-8p%!-2luBa'OAbL8_'\``8!;=D&pTA:@#cIgIsOjYIJ,">+(3GR)kYa_mtPXL6G/DtUPTfWc*lF*F7W`)]"G2;D#W7,J!D"4-Ec<()HakEl"M+J(mt:]nbBY4p?2(<3NiWs[agc0=V,je(b#<3V+k-N:,M?L#g0N+MliIW3K$W7-0Ql,m[F'P>M!SY6dEAuT)aLS9f^ZfmC^_'b5l_?.jr\X$QMFP*H2-]pb*HVfpcAHY.DDW_S)%i$eucNm`FSr)@Rj/Er<J5T,UY'?2bu-?b./(5)<ooc?Ng,n/ToS6\)e[lI*<X%H9nZVpPT8'F.m6;9rT5+6ioUbps?8QL9F(#7\cV._bh*3SC>$:W2ji0@0<InGA/hHaCt:0Nh]rB`=aknco'J*[/h`-O,P8!R-$ehLr%GHlBM`]**;2Z:tW$@Gr'i&=e^@)[\+q.L^dg&C[!j/hta!nWI"2WQqeMFAE?hk.j1COpa@(FS'jOd/W\"]8n%?r-l*#/7;fD_arFHH/sb4n$^-\kBble!jL?!Aq(3:]g"NV'StE'fje@EbJ0m"'r'?@q%nU*G$IuArD5HKf-(fci_bb*fRe6mP;`/Gd-/>RmH'Z>d<,30N9!nPM.39^WCoTV9C'uu#&jo&F042E4=AW9b6<do:*3aQq[:]Bq/;/rr9)1W[g28VH)l]-'*M=t7G;-BP+VX&@&NTKl+hpr!Jfk4H=R;QH6t/9iD;cK6A/-M<\b.i:KnAf"\d3(1>B/1d[;)m:-CUl"#]\F'BU1?d4akAP@(h=6V?rHiP'3q'&.]`5c.kW/7I\F=TW3fSeb?Qd-Kl?O=Q8B@#_,YU(Ma98iWM;[7L(]9W!qI1*N>-LK9hQE0!&"iF[NueEN>^"334^`.`RQMA(9N4W5d1f)toj$7]VN3Yl,(3Y:Ws5ZOlh=[Q47#F^fDQ;"#-a9D>r60mi(`Nb2<>"B-GB=o5QL8Qh=-CIb"Q$Lni#O_4"bb;nAH!n4XC>i8kHlQQ9U$PbM8;@HSkTX;R[!5196Rr9?4.JJS.a].4Z0p"WV8m'HL[&i[iSsAN2,#!=a!t/'M,lm@GGfhU^L"Z,J'assA3kuk[2T625BON;5eJ^=F;c[n?IraJ`kF3uG059$Q\ImY94P'9=VB"C)mmj?4ua!nnNlT<DT;$q%b.6_\ko`,VcK1-V>XqV%a:[Q3\a.o,?&5LW58?H5b%LV1f\h]]Q?J#f$G#;VB_/<TfdH3dHV1j1sfg3=WB$Tg=f<VWMc;1TP!7qI[E1>NTZi7osE7%e5IHC\_$^,(58o>e.R:+)OUJ7>o*S"(HeK^0.u!/]d;Y$P\LS$c1.r'=+7R("Q@L0me[lJ./Q1*]\8>-Q<TQHKel+=a?EEYH.&oSh;#>?J,dBqC]e[LVgq'#LJF4<,"qgM0QSRf6$tM^3u7i_"]Ljfb2u$^phVNXVia`"$AX7$"676]-E7IJd(qu<LUj*`0I<_,pR%pTgiK>:E_E8r*BfIjAEjeX2,b+aG@i=^cB>0:>1iKWF@(;9dNgg$KW4]\%s;6Piaa\taAG*6bU)I=X_dU7029L>7CB57Nb#IUgpWr?Y3gGC``90h;sZDFht;_QJ;1@Xg`=i.*cK?CD6W;Sk:<H_%u>nZ3k3(u"h*(s,0)cl<tC"t%\!8&[!Lc?C5.$cE.StNie1M4,2r)2B)QSc1sj4T-t+`V[0-)8?7s_9lE<aT:5f&,BO;81UO,"`_o\=b.Q`SWVhZ'*]P2r+Gn\2H1!H^5\B7b`;UP:&]K>2>?9Gsg,5(-qg%D*).!e;l0-Y&U4/Bea']dqd'8V%OHJ_A)fg(#DI4km?'ko6KkgFCbZYN,umJR6GTkK@WEKT_"N_OrZUnoLnm-IYW33Y32G^cBk&(_uE['4UIC#Qo<7l:Sfmd"<HX1(e2YUq"Pm/+ioXtK;$q43R!4!4V'R8(2=4#h-(U,+(n'\t3;q55;.G5L5MRK8r#r\2MaA!1.4cg;7(/cU!%J$1a;O3%$)?$LP\l2LeNgb_#sSm^t%4=`!W_R";ZrsW;uAg-]S+"64=hu<P/Ys+[4Xbt#He#OHn&=t4nHdcG^)J^:_+FMkcSJQ+S<.,RX>S!:aS&k"l<A1M/Rbi;X3/4VjNb.8%Ln2U/n6K5N\*11JdnVL^0(*g.rGlBBs-cAC&be7)WY#Mg6mMTp=$K:CG9R\s/aj)VE3QWJJs/'0^n^[X:(rKV5K@@7kP~>
+endstream
+endobj
+131 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 130 0 R
+>>
+endobj
+132 0 obj
+<< /Length 1997 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+Gat=-gN)%,&:O:SB_7O"/;C\(eikOkP,`Y@2e(P+e=@":6P:aZWKL4$s*_^&YTs5Udl2?,4hFh_3EW@HKNF*$lCTSRZFrTW[d8j+!m@"YqJVl'Q*\TplIW'Ij+YElKC]I*VO$C=4I]M&W#$Vt,3TGIZP(s!>p&b<8!!\&0+'Xt`J",ZTEtsej\ft7=<=#dLWNnA<\,ke/:BVUHP6</I1RBcL4caP+e6h@pAG=#])RJt^1@'2coi\pfc]?R2ELTNnLW:7HN#"]4?B^0ji'34hR8s%d<2[XGkFB0HHV1*:QDHf[`@ag[M@/$@l?>K3pfQ$`eLC&K%c`\&ScXu-E,04(o$^*)!CSj7n4835K@Y,/Jg9)/rhJX2@8E?1W)tqr(W<EnsIPf16[4NVpoJ-@Y!\VJ[nC]Bs]OheKK7(+):kih.Q%2HbNNJH<<G8:SkG@det]o!e<`,=q0X=!V`^k94rHZ3V^\%/MC`o$=D5TBX`+6fWukgg%QSC&ScJ_!WbJJA/s_mhC%hPStUAW+4V^j(FDprlIAJ;Q0t@\`)oBYOAFt3%>m7K>#s\tV6GkMGcYJhA&Yru<04O=CT`WeZ5D^#l)f^%2"3!N2dgpCnuR3^hmJ8!EO^`:[gB!_i'TLYESnigM0g636o[@(:"la-ibd\hd1$c`K_e^\o_hRTR[c6TLdE%ONBk6(i=L;md#r2I8i)L\Z0Wo8Z;h^:j4aWu7gccV3&mfn.QB?uE)M8f/^A*j$IJ;JV^ZI8C5liKe<;W<`Hb<T<O/Ad-LSD93hn.]4fA3OV`,)=oZm5GXRquE4(uRqa@QmtRB,9Y*OE&X8U66a4:Y@#`2V/c]pjV8E]1'c^%1Z%Vp1bQi3U;L/2Rq[b.BTcN.gB"pJuJH]]5Z&)PQo(DHXBYF4kmj3sOOJ-!#PdT)8=X\9tfQVt!`O89@,V1k[Tu\LA'Fo7Utm(-fL_WDsba-+3#,eFrC3c3FuA1O,,FFYP@<&&u-a"=SJ1FQW\9rZ:G?%A<"scE-4E[$p.,EJ2jlS;3$+X$m;]5/0rNLJfVgWWW+/$6L<4VZ?s&b>0#f63PC.r9in1o.gGqI5"Q!MXb*3dO'uPp"=kM<X">A,bLgoZSY"!\\NDB-n`_VPb;;rU')`\/DmB00lc)AJVea?;_.(D0CpSDP&kYO&ji>u-6Wrcn2@'Y6MTa(6Cu6Rir2mOPD7l0_^0=jr*-U$;V3GbZ55dO3WVZB/k+k5T!StWMrR_Gn(kS:<Z-0N(^U\hqks"_IS^Um$e%=`$sm0"lOeLjKgoO/no_,_(3,Gkb=5tO1,<7P$Ba$DER3'M\Pi_MaZlE(dsBn!Y$+IJ%Wp?ng983a9eYT"FBCn.=*mjH,$t<c/C)[V&7GW`qm&k(YRu+#*-5Dm[O8kk9B'u8e`U;Q'0;ZWC4PJ3\cDqRQM9[[YV3PkR"#,q_.n8qgZi3m424]Y9<fj;IsuIF\6F@>V0m^%.^1GHs)ud-C*XR?DDr[-d5cnt(Rca'VXekW?==;U2ZddS*=%-1pc\*Dah),\:0\7@2qi$+Sa\ui^=.-fD5:dpKV<bP$1pm%$DAPsD0cDieUGu>Wlp(:EPmlY48%,V'i\,u=H4=)$5Ss3kX7V,p188t3n0rrNJa7b#g$W"V,]Eib<]C>ZYPr0I`FI-:b<V7!->[3VlobDT^Dltbg[S#^)XiRU45\d.<L!$-O7oo!G:YcM-SAGr,N[<n2+%kK8_]7bB7VW5ihTD]cI151hGRf=W;*ETG]()W9(?;9D(/$HGrpoLaqMHI$NkB=Kp=V1lU@08C#Yhk=o5sLcUuE6C]'@rKdqu,2B.:#=PM6cI$tUFE:QW"-Foa/0F050*o^7d@$6Mq,1WG/1UcC%nQ/rcED+P^pfHfoi+?`Dp(Gu=@Yir72_@/+UDnGK+uU#s5uJaP63G4B28>.(e'l8il'*]\O6=Q6G*Epg1K@<7QU=]2S<*c`>!Rl1CUIZZOR8eBf2WjBT#W%M=_lFRTL.~>
+endstream
+endobj
+133 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 132 0 R
+>>
+endobj
+136 0 obj
+<<
+ /Title (\376\377\0\102\0\165\0\151\0\154\0\144\0\151\0\156\0\147\0\40\0\111\0\156\0\164\0\145\0\162\0\146\0\141\0\143\0\145\0\163\0\40\0\167\0\151\0\164\0\150\0\40\0\105\0\144\0\152\0\145)
+ /Parent 134 0 R
+ /Next 138 0 R
+ /A 135 0 R
+>> endobj
+138 0 obj
+<<
+ /Title (\376\377\0\124\0\141\0\142\0\154\0\145\0\40\0\157\0\146\0\40\0\103\0\157\0\156\0\164\0\145\0\156\0\164\0\163)
+ /Parent 134 0 R
+ /Prev 136 0 R
+ /Next 139 0 R
+ /A 137 0 R
+>> endobj
+139 0 obj
+<<
+ /Title (\376\377\0\103\0\150\0\141\0\160\0\164\0\145\0\162\0\240\0\61\0\56\0\240\0\105\0\144\0\152\0\145\0\40\0\117\0\166\0\145\0\162\0\166\0\151\0\145\0\167)
+ /Parent 134 0 R
+ /First 140 0 R
+ /Last 141 0 R
+ /Prev 138 0 R
+ /Next 142 0 R
+ /Count -2
+ /A 15 0 R
+>> endobj
+140 0 obj
+<<
+ /Title (\376\377\0\111\0\156\0\164\0\162\0\157\0\144\0\165\0\143\0\164\0\151\0\157\0\156)
+ /Parent 139 0 R
+ /Next 141 0 R
+ /A 17 0 R
+>> endobj
+141 0 obj
+<<
+ /Title (\376\377\0\105\0\144\0\152\0\145\0\40\0\104\0\141\0\164\0\141\0\40\0\103\0\157\0\154\0\154\0\145\0\143\0\164\0\151\0\157\0\156\0\163\0\40\0\50\0\105\0\104\0\103\0\51)
+ /Parent 139 0 R
+ /Prev 140 0 R
+ /A 19 0 R
+>> endobj
+142 0 obj
+<<
+ /Title (\376\377\0\103\0\150\0\141\0\160\0\164\0\145\0\162\0\240\0\62\0\56\0\240\0\101\0\40\0\161\0\165\0\151\0\143\0\153\0\40\0\164\0\157\0\165\0\162\0\40\0\157\0\146\0\40\0\105\0\144\0\152\0\145\0\40\0\105\0\104\0\103)
+ /Parent 134 0 R
+ /First 143 0 R
+ /Last 143 0 R
+ /Prev 139 0 R
+ /Next 144 0 R
+ /Count -1
+ /A 21 0 R
+>> endobj
+143 0 obj
+<<
+ /Title (\376\377\0\127\0\162\0\151\0\164\0\164\0\151\0\156\0\147\0\40\0\171\0\157\0\165\0\162\0\40\0\146\0\151\0\162\0\163\0\164\0\40\0\105\0\104\0\103)
+ /Parent 142 0 R
+ /A 23 0 R
+>> endobj
+144 0 obj
+<<
+ /Title (\376\377\0\103\0\150\0\141\0\160\0\164\0\145\0\162\0\240\0\63\0\56\0\240\0\120\0\141\0\162\0\164\0\163\0\72\0\40\0\111\0\156\0\164\0\145\0\162\0\146\0\141\0\143\0\145\0\40\0\143\0\157\0\155\0\160\0\157\0\156\0\141\0\156\0\164\0\163)
+ /Parent 134 0 R
+ /Prev 142 0 R
+ /Next 145 0 R
+ /A 25 0 R
+>> endobj
+145 0 obj
+<<
+ /Title (\376\377\0\103\0\150\0\141\0\160\0\164\0\145\0\162\0\240\0\64\0\56\0\240\0\105\0\144\0\152\0\145\0\40\0\114\0\141\0\171\0\157\0\165\0\164\0\54\0\40\0\106\0\151\0\154\0\154\0\163\0\40\0\141\0\156\0\144\0\40\0\120\0\157\0\163\0\151\0\164\0\151\0\157\0\156\0\151\0\156\0\147)
+ /Parent 134 0 R
+ /Prev 144 0 R
+ /Next 146 0 R
+ /A 27 0 R
+>> endobj
+146 0 obj
+<<
+ /Title (\376\377\0\103\0\150\0\141\0\160\0\164\0\145\0\162\0\240\0\65\0\56\0\240\0\120\0\162\0\157\0\147\0\162\0\141\0\155\0\163\0\72\0\40\0\102\0\162\0\151\0\156\0\147\0\40\0\171\0\157\0\165\0\162\0\40\0\151\0\156\0\164\0\145\0\162\0\146\0\141\0\143\0\145\0\40\0\164\0\157\0\40\0\154\0\151\0\146\0\145)
+ /Parent 134 0 R
+ /Prev 145 0 R
+ /Next 147 0 R
+ /A 29 0 R
+>> endobj
+147 0 obj
+<<
+ /Title (\376\377\0\103\0\150\0\141\0\160\0\164\0\145\0\162\0\240\0\66\0\56\0\240\0\124\0\150\0\145\0\40\0\105\0\144\0\152\0\145\0\40\0\101\0\120\0\111\0\72\0\40\0\120\0\165\0\164\0\164\0\151\0\156\0\147\0\40\0\171\0\157\0\165\0\162\0\40\0\151\0\156\0\164\0\145\0\162\0\146\0\141\0\143\0\145\0\40\0\164\0\157\0\40\0\167\0\157\0\162\0\153)
+ /Parent 134 0 R
+ /First 148 0 R
+ /Last 148 0 R
+ /Prev 146 0 R
+ /Next 149 0 R
+ /Count -1
+ /A 31 0 R
+>> endobj
+148 0 obj
+<<
+ /Title (\376\377\0\123\0\151\0\147\0\156\0\141\0\154\0\163\0\40\0\141\0\156\0\144\0\40\0\103\0\141\0\154\0\154\0\142\0\141\0\143\0\153\0\163)
+ /Parent 147 0 R
+ /A 33 0 R
+>> endobj
+149 0 obj
+<<
+ /Title (\376\377\0\103\0\150\0\141\0\160\0\164\0\145\0\162\0\240\0\67\0\56\0\240\0\105\0\144\0\152\0\145\0\40\0\120\0\162\0\157\0\147\0\162\0\141\0\155\0\155\0\145\0\162\0\163\0\40\0\107\0\165\0\151\0\144\0\145\0\154\0\151\0\156\0\145\0\163)
+ /Parent 134 0 R
+ /First 150 0 R
+ /Last 152 0 R
+ /Prev 147 0 R
+ /Next 153 0 R
+ /Count -3
+ /A 35 0 R
+>> endobj
+150 0 obj
+<<
+ /Title (\376\377\0\105\0\144\0\152\0\145\0\40\0\123\0\160\0\145\0\143\0\40\0\106\0\151\0\154\0\145\0\163)
+ /Parent 149 0 R
+ /Next 151 0 R
+ /A 37 0 R
+>> endobj
+151 0 obj
+<<
+ /Title (\376\377\0\123\0\157\0\165\0\162\0\143\0\145\0\40\0\114\0\141\0\171\0\157\0\165\0\164)
+ /Parent 149 0 R
+ /Prev 150 0 R
+ /Next 152 0 R
+ /A 39 0 R
+>> endobj
+152 0 obj
+<<
+ /Title (\376\377\0\124\0\150\0\145\0\155\0\145\0\40\0\104\0\151\0\163\0\164\0\162\0\151\0\142\0\165\0\164\0\151\0\157\0\156)
+ /Parent 149 0 R
+ /Prev 151 0 R
+ /A 41 0 R
+>> endobj
+153 0 obj
+<<
+ /Title (\376\377\0\103\0\150\0\141\0\160\0\164\0\145\0\162\0\240\0\70\0\56\0\240\0\124\0\150\0\145\0\40\0\105\0\144\0\152\0\145\0\40\0\120\0\162\0\145\0\166\0\151\0\145\0\167\0\40\0\120\0\162\0\157\0\147\0\162\0\141\0\155)
+ /Parent 134 0 R
+ /Prev 149 0 R
+ /Next 154 0 R
+ /A 43 0 R
+>> endobj
+154 0 obj
+<<
+ /Title (\376\377\0\101\0\160\0\160\0\145\0\156\0\144\0\151\0\170\0\240\0\101\0\56\0\240\0\105\0\104\0\103\0\40\0\122\0\145\0\146\0\145\0\162\0\145\0\156\0\143\0\145)
+ /Parent 134 0 R
+ /Prev 153 0 R
+ /A 45 0 R
+>> endobj
+155 0 obj
+<< /Type /Font
+/Subtype /Type1
+/Name /F3
+/BaseFont /Helvetica-Bold
+/Encoding /WinAnsiEncoding >>
+endobj
+156 0 obj
+<< /Type /Font
+/Subtype /Type1
+/Name /F5
+/BaseFont /Times-Roman
+/Encoding /WinAnsiEncoding >>
+endobj
+157 0 obj
+<< /Type /Font
+/Subtype /Type1
+/Name /F6
+/BaseFont /Times-Italic
+/Encoding /WinAnsiEncoding >>
+endobj
+158 0 obj
+<< /Type /Font
+/Subtype /Type1
+/Name /F1
+/BaseFont /Helvetica
+/Encoding /WinAnsiEncoding >>
+endobj
+159 0 obj
+<< /Type /Font
+/Subtype /Type1
+/Name /F11
+/BaseFont /Courier-Bold
+/Encoding /WinAnsiEncoding >>
+endobj
+160 0 obj
+<< /Type /Font
+/Subtype /Type1
+/Name /F9
+/BaseFont /Courier
+/Encoding /WinAnsiEncoding >>
+endobj
+161 0 obj
+<< /Type /Font
+/Subtype /Type1
+/Name /F7
+/BaseFont /Times-Bold
+/Encoding /WinAnsiEncoding >>
+endobj
+1 0 obj
+<< /Type /Pages
+/Count 38
+/Kids [6 0 R 8 0 R 10 0 R 12 0 R 47 0 R 60 0 R 67 0 R 72 0 R 74 0 R 76 0 R 78 0 R 80 0 R 82 0 R 84 0 R 86 0 R 88 0 R 91 0 R 93 0 R 95 0 R 97 0 R 99 0 R 101 0 R 103 0 R 105 0 R 107 0 R 109 0 R 111 0 R 113 0 R 115 0 R 117 0 R 119 0 R 121 0 R 123 0 R 125 0 R 127 0 R 129 0 R 131 0 R 133 0 R ] >>
+endobj
+2 0 obj
+<< /Type /Catalog
+/Pages 1 0 R
+ /Outlines 134 0 R
+ /PageMode /UseOutlines
+ >>
+endobj
+3 0 obj
+<<
+/Font << /F3 155 0 R /F5 156 0 R /F1 158 0 R /F6 157 0 R /F9 160 0 R /F11 159 0 R /F7 161 0 R >>
+/ProcSet [ /PDF /ImageC /Text ] /XObject <</Im1 90 0 R
+ >>
+>>
+endobj
+15 0 obj
+<<
+/S /GoTo
+/D [74 0 R /XYZ 115.0 725.0 null]
+>>
+endobj
+17 0 obj
+<<
+/S /GoTo
+/D [74 0 R /XYZ 115.0 687.009 null]
+>>
+endobj
+19 0 obj
+<<
+/S /GoTo
+/D [74 0 R /XYZ 115.0 544.683 null]
+>>
+endobj
+21 0 obj
+<<
+/S /GoTo
+/D [76 0 R /XYZ 115.0 725.0 null]
+>>
+endobj
+23 0 obj
+<<
+/S /GoTo
+/D [76 0 R /XYZ 115.0 436.009 null]
+>>
+endobj
+25 0 obj
+<<
+/S /GoTo
+/D [88 0 R /XYZ 115.0 725.0 null]
+>>
+endobj
+27 0 obj
+<<
+/S /GoTo
+/D [91 0 R /XYZ 115.0 725.0 null]
+>>
+endobj
+29 0 obj
+<<
+/S /GoTo
+/D [101 0 R /XYZ 115.0 725.0 null]
+>>
+endobj
+31 0 obj
+<<
+/S /GoTo
+/D [103 0 R /XYZ 115.0 725.0 null]
+>>
+endobj
+33 0 obj
+<<
+/S /GoTo
+/D [105 0 R /XYZ 115.0 497.4 null]
+>>
+endobj
+35 0 obj
+<<
+/S /GoTo
+/D [109 0 R /XYZ 115.0 725.0 null]
+>>
+endobj
+37 0 obj
+<<
+/S /GoTo
+/D [109 0 R /XYZ 115.0 562.018 null]
+>>
+endobj
+39 0 obj
+<<
+/S /GoTo
+/D [113 0 R /XYZ 115.0 540.12 null]
+>>
+endobj
+41 0 obj
+<<
+/S /GoTo
+/D [113 0 R /XYZ 115.0 430.794 null]
+>>
+endobj
+43 0 obj
+<<
+/S /GoTo
+/D [115 0 R /XYZ 115.0 725.0 null]
+>>
+endobj
+45 0 obj
+<<
+/S /GoTo
+/D [119 0 R /XYZ 115.0 725.0 null]
+>>
+endobj
+50 0 obj
+<<
+/S /GoTo
+/D [91 0 R /XYZ 115.0 485.018 null]
+>>
+endobj
+52 0 obj
+<<
+/S /GoTo
+/D [91 0 R /XYZ 115.0 108.93 null]
+>>
+endobj
+54 0 obj
+<<
+/S /GoTo
+/D [95 0 R /XYZ 115.0 530.0 null]
+>>
+endobj
+56 0 obj
+<<
+/S /GoTo
+/D [97 0 R /XYZ 115.0 359.14 null]
+>>
+endobj
+58 0 obj
+<<
+/S /GoTo
+/D [109 0 R /XYZ 115.0 442.692 null]
+>>
+endobj
+63 0 obj
+<<
+/S /GoTo
+/D [115 0 R /XYZ 115.0 362.009 null]
+>>
+endobj
+65 0 obj
+<<
+/S /GoTo
+/D [119 0 R /XYZ 115.0 282.329 null]
+>>
+endobj
+70 0 obj
+<<
+/S /GoTo
+/D [76 0 R /XYZ 115.0 371.683 null]
+>>
+endobj
+134 0 obj
+<<
+ /First 136 0 R
+ /Last 154 0 R
+>> endobj
+135 0 obj
+<<
+/S /GoTo
+/D [10 0 R /XYZ 115.0 725.0 null]
+>>
+endobj
+137 0 obj
+<<
+/S /GoTo
+/D [12 0 R /XYZ 115.0 715.0 null]
+>>
+endobj
+xref
+0 162
+0000000000 65535 f
+0000095788 00000 n
+0000096122 00000 n
+0000096215 00000 n
+0000000015 00000 n
+0000000071 00000 n
+0000000407 00000 n
+0000000513 00000 n
+0000001246 00000 n
+0000001352 00000 n
+0000001513 00000 n
+0000001620 00000 n
+0000002675 00000 n
+0000002798 00000 n
+0000002930 00000 n
+0000096396 00000 n
+0000003066 00000 n
+0000096461 00000 n
+0000003202 00000 n
+0000096528 00000 n
+0000003338 00000 n
+0000096595 00000 n
+0000003474 00000 n
+0000096660 00000 n
+0000003610 00000 n
+0000096727 00000 n
+0000003746 00000 n
+0000096792 00000 n
+0000003882 00000 n
+0000096857 00000 n
+0000004018 00000 n
+0000096923 00000 n
+0000004154 00000 n
+0000096989 00000 n
+0000004290 00000 n
+0000097055 00000 n
+0000004426 00000 n
+0000097121 00000 n
+0000004562 00000 n
+0000097189 00000 n
+0000004697 00000 n
+0000097256 00000 n
+0000004833 00000 n
+0000097324 00000 n
+0000004969 00000 n
+0000097390 00000 n
+0000005105 00000 n
+0000005660 00000 n
+0000005783 00000 n
+0000005838 00000 n
+0000097456 00000 n
+0000005974 00000 n
+0000097523 00000 n
+0000006110 00000 n
+0000097589 00000 n
+0000006246 00000 n
+0000097654 00000 n
+0000006382 00000 n
+0000097720 00000 n
+0000006518 00000 n
+0000006946 00000 n
+0000007069 00000 n
+0000007103 00000 n
+0000097788 00000 n
+0000007239 00000 n
+0000097856 00000 n
+0000007375 00000 n
+0000007730 00000 n
+0000007853 00000 n
+0000007880 00000 n
+0000097924 00000 n
+0000008016 00000 n
+0000008238 00000 n
+0000008346 00000 n
+0000012129 00000 n
+0000012237 00000 n
+0000015313 00000 n
+0000015421 00000 n
+0000016476 00000 n
+0000016584 00000 n
+0000018078 00000 n
+0000018186 00000 n
+0000023267 00000 n
+0000023375 00000 n
+0000028505 00000 n
+0000028613 00000 n
+0000032126 00000 n
+0000032234 00000 n
+0000032631 00000 n
+0000032739 00000 n
+0000035384 00000 n
+0000043781 00000 n
+0000043889 00000 n
+0000046243 00000 n
+0000046351 00000 n
+0000048591 00000 n
+0000048699 00000 n
+0000051768 00000 n
+0000051876 00000 n
+0000053349 00000 n
+0000053457 00000 n
+0000054577 00000 n
+0000054687 00000 n
+0000057039 00000 n
+0000057149 00000 n
+0000060283 00000 n
+0000060393 00000 n
+0000060738 00000 n
+0000060848 00000 n
+0000063099 00000 n
+0000063209 00000 n
+0000064728 00000 n
+0000064838 00000 n
+0000067678 00000 n
+0000067788 00000 n
+0000071485 00000 n
+0000071595 00000 n
+0000071991 00000 n
+0000072101 00000 n
+0000073598 00000 n
+0000073708 00000 n
+0000075889 00000 n
+0000075999 00000 n
+0000078275 00000 n
+0000078385 00000 n
+0000080652 00000 n
+0000080762 00000 n
+0000082953 00000 n
+0000083063 00000 n
+0000085298 00000 n
+0000085408 00000 n
+0000087837 00000 n
+0000087947 00000 n
+0000090038 00000 n
+0000097991 00000 n
+0000098045 00000 n
+0000090148 00000 n
+0000098111 00000 n
+0000090405 00000 n
+0000090606 00000 n
+0000090889 00000 n
+0000091046 00000 n
+0000091288 00000 n
+0000091633 00000 n
+0000091838 00000 n
+0000092161 00000 n
+0000092524 00000 n
+0000092910 00000 n
+0000093372 00000 n
+0000093566 00000 n
+0000093932 00000 n
+0000094105 00000 n
+0000094282 00000 n
+0000094474 00000 n
+0000094779 00000 n
+0000095012 00000 n
+0000095126 00000 n
+0000095237 00000 n
+0000095349 00000 n
+0000095458 00000 n
+0000095571 00000 n
+0000095678 00000 n
+trailer
+<<
+/Size 162
+/Root 2 0 R
+/Info 4 0 R
+>>
+startxref
+98177
+%%EOF
diff --git a/removed-code/Client.java b/removed-code/Client.java
index a945f48..5957cf2 100755
--- a/removed-code/Client.java
+++ b/removed-code/Client.java
@@ -1,48 +1,48 @@
-/*
- * Copyright (c) 2006 Manuel Traut and Volker Dahnke
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Common Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/cpl-v10.html
- *
- * Contributors: Manuel Traut and Volker Dahnke
- */
-
-package YalpClients.SwtClient;
-import YalpClients.SwtClient.GUI.*;
-
-import org.eclipse.swt.*;
-import org.eclipse.swt.widgets.Display;
-import org.eclipse.swt.widgets.Shell;
-
-/*
- * Class Client
- *
- * <em>Instances Model, LoadDialog and StartDialog</em>
- *
- * @author Volker Dahnke
- *
- * @version 1 02-04-2006<br>
- */
- public class Client implements Runnable{
-
-/*
- * enables the Class to be loaded dynamicly.
- * Instances Model, LoadDialog and StartDialog.
- */
-
- public void run () {
-
- LoadDialog load = new LoadDialog(
- new Shell(Display.getDefault(),SWT.NONE), SWT.NONE);
-
- load.show();
- final Model model = new Model();
- load.close();
-
- StartDialog start =
- new StartDialog(new Shell(Display.getDefault(),SWT.MIN),model, SWT.NONE);
-
- start.show();
- }
-}
+/*
+ * Copyright (c) 2006 Manuel Traut and Volker Dahnke
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Common Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/cpl-v10.html
+ *
+ * Contributors: Manuel Traut and Volker Dahnke
+ */
+
+package YalpClients.SwtClient;
+import YalpClients.SwtClient.GUI.*;
+
+import org.eclipse.swt.*;
+import org.eclipse.swt.widgets.Display;
+import org.eclipse.swt.widgets.Shell;
+
+/*
+ * Class Client
+ *
+ * <em>Instances Model, LoadDialog and StartDialog</em>
+ *
+ * @author Volker Dahnke
+ *
+ * @version 1 02-04-2006<br>
+ */
+ public class Client implements Runnable{
+
+/*
+ * enables the Class to be loaded dynamicly.
+ * Instances Model, LoadDialog and StartDialog.
+ */
+
+ public void run () {
+
+ LoadDialog load = new LoadDialog(
+ new Shell(Display.getDefault(),SWT.NONE), SWT.NONE);
+
+ load.show();
+ final Model model = new Model();
+ load.close();
+
+ StartDialog start =
+ new StartDialog(new Shell(Display.getDefault(),SWT.MIN),model, SWT.NONE);
+
+ start.show();
+ }
+}
diff --git a/server.policy b/server.policy
index a7bb177..224e0c6 100644
--- a/server.policy
+++ b/server.policy
@@ -1,9 +1,20 @@
-grant {
- permission java.io.FilePermission "<<ALL FILES>>","execute, read, write";
- permission java.io.FilePermission "C:\\Programme\\VideoLAN\\VLC\\vlc","execute";
- permission java.io.FilePermission "/Applications/VLC.app/Contents/MacOS/VLC","execute";
- permission java.net.SocketPermission "*:1024-","connect,accept,resolve";
- permission java.net.SocketPermission "localhost:1050","connect,accept,resolve";
- permission java.util.PropertyPermission "id3.default_language", "read";
- permission java.util.PropertyPermission "id3.default_encoding", "read";
-};
+<<<<<<< HEAD
+grant {
+ permission java.io.FilePermission "<<ALL FILES>>","execute, read, write";
+ permission java.io.FilePermission "C:\\Programme\\VideoLAN\\VLC\\vlc","execute";
+ permission java.io.FilePermission "/Applications/VLC.app/Contents/MacOS/VLC","execute";
+ permission java.net.SocketPermission "*:1024-","connect,accept,resolve";
+ permission java.net.SocketPermission "localhost:1050","connect,accept,resolve";
+ permission java.util.PropertyPermission "id3.default_language", "read";
+ permission java.util.PropertyPermission "id3.default_encoding", "read";
+};
+=======
+grant {
+ permission java.io.FilePermission "<<ALL FILES>>","execute, read, write";
+ permission java.io.FilePermission "C:\\Programme\\VideoLAN\\VLC\\vlc","execute";
+ permission java.io.FilePermission "/Applications/VLC.app/Contents/MacOS/VLC","execute";
+ permission java.net.SocketPermission "*:1024-","connect,accept,resolve";
+ permission java.util.PropertyPermission "id3.default_language", "read";
+ permission java.util.PropertyPermission "id3.default_encoding", "read";
+};
+>>>>>>> c62ff958823168d7622b397609220db8b67fa731
diff --git a/src/YalpAuth/YalpPGSqlAuth/DatabaseDefines.java b/src/YalpAuth/YalpPGSqlAuth/DatabaseDefines.java
index 5ff92c7..70c00d7 100644
--- a/src/YalpAuth/YalpPGSqlAuth/DatabaseDefines.java
+++ b/src/YalpAuth/YalpPGSqlAuth/DatabaseDefines.java
@@ -1,65 +1,65 @@
-/*
- * Copyright (c) 2006 Manuel Traut and Volker Dahnke
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Common Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/cpl-v10.html
- *
- * Contributors: Manuel Traut and Volker Dahnke
- */
-package YalpAuth.YalpPGSqlAuth;
-
-/*
- * Class DatabaseDefines
- *
- * <em></em>
- *
- * @author Manuel Traut
- *
- * @version 0.1 28-08-2008<br>
- *
- */
-
-public class DatabaseDefines {
-
- public String dbConnection="jdbc:postgresql://10.0.3.20:5432/yalp_user";
- public String dbUser="yalp";
- public String dbPasswd="huhu";
-
-/*
- * set string for dbConnection
- * @param dbConnection
- * "jdbc:postgresql://<serverIP>:<portOfDB>/<dataBaseName>";
- */
- public void setDBConnection(String dbConnection){
- this.dbConnection = dbConnection;
- }
-
-/*
- * set userName for db Edit
- * @param dbUser
- */
- public void setDBUser(String dbUser){
- this.dbUser = dbUser;
- }
-
-/*
- * set string for db Password
- * @param DBPasswd
- */
- public void setDBPasswd(String DBPasswd){
- this.dbPasswd = DBPasswd;
- }
-
- public String getDBConnection(){
- return this.dbConnection;
- }
-
- public String getDBUser(){
- return this.dbUser;
- }
-
- public String getDBPasswd(){
- return this.dbPasswd;
- }
-}
+/*
+ * Copyright (c) 2006 Manuel Traut and Volker Dahnke
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Common Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/cpl-v10.html
+ *
+ * Contributors: Manuel Traut and Volker Dahnke
+ */
+package YalpAuth.YalpPGSqlAuth;
+
+/*
+ * Class DatabaseDefines
+ *
+ * <em></em>
+ *
+ * @author Manuel Traut
+ *
+ * @version 0.1 28-08-2008<br>
+ *
+ */
+
+public class DatabaseDefines {
+
+ public String dbConnection="jdbc:postgresql://10.0.3.20:5432/yalp_user";
+ public String dbUser="yalp";
+ public String dbPasswd="huhu";
+
+/*
+ * set string for dbConnection
+ * @param dbConnection
+ * "jdbc:postgresql://<serverIP>:<portOfDB>/<dataBaseName>";
+ */
+ public void setDBConnection(String dbConnection){
+ this.dbConnection = dbConnection;
+ }
+
+/*
+ * set userName for db Edit
+ * @param dbUser
+ */
+ public void setDBUser(String dbUser){
+ this.dbUser = dbUser;
+ }
+
+/*
+ * set string for db Password
+ * @param DBPasswd
+ */
+ public void setDBPasswd(String DBPasswd){
+ this.dbPasswd = DBPasswd;
+ }
+
+ public String getDBConnection(){
+ return this.dbConnection;
+ }
+
+ public String getDBUser(){
+ return this.dbUser;
+ }
+
+ public String getDBPasswd(){
+ return this.dbPasswd;
+ }
+}
diff --git a/src/YalpClients/SwtClient/GUI/GUI.java b/src/YalpClients/SwtClient/GUI/GUI.java
index 475f09b..ab9db71 100644
--- a/src/YalpClients/SwtClient/GUI/GUI.java
+++ b/src/YalpClients/SwtClient/GUI/GUI.java
@@ -1,2104 +1,2104 @@
-/*
- * Copyright (c) 2006 Manuel Traut and Volker Dahnke
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Common Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/cpl-v10.html
- *
- * Contributors: Manuel Traut and Volker Dahnke
- */
-
-package YalpClients.SwtClient.GUI;
-
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.custom.*;
-import org.eclipse.swt.graphics.*;
-import org.eclipse.swt.layout.*;
-import org.eclipse.swt.widgets.*;
-import org.eclipse.swt.events.*;
-import java.util.*;
-
-import YalpInterfaces.*;
-import YalpClients.SwtClient.*;
-
-/*
- *
- * Class GUI
- *
- * <em></em>
- *
- * @author Volker Dahnke / Manuel Traut
- *
- * @version 1 02-04-2006<br>
- *
- */
-public class GUI extends org.eclipse.swt.widgets.Composite {
-
- public Model model;
- public Composite resultComposite;
- public Composite playlistComposite;
- public Composite bottemComposite;
- public Table resultTable1;
- public Table resultTable2;
- public Composite composite1;
- public Composite changeComposite;
- public Table UserTable;
- public Composite composite3;
-
- private AccessRights userKind;
- private StyledText styledText1;
- private CTabFolder cTabFolder1;
- private CTabItem tab1;
- private Composite container1;
- private Composite topComposite;
- private Group find;
- private Group logo;
- private CTabItem tab2;
- private Composite container2;
- private Group group1;
- private Group group2;
- private CLabel authorLabel;
- private CLabel titleLabel;
- private CLabel streamLabel2;
- private CLabel actualStreamLabel2;
- private CLabel actualStreamLabel1;
- private CLabel streamLabel1;
- private CLabel data2;
- private CLabel data1;
- private Button shutdown;
- private TableColumn ip;
- private TableColumn userName;
- public Table iptable;
- private Composite composite4;
-
- private Button submitButton;
- private CLabel adminAddLabel;
- private CLabel passwdAddLable;
- private CLabel usernameAddLable;
- private CLabel realnameAddLabel;
- private CCombo adminAdd;
- private Text realnameAdd;
- private Text passwdAdd;
- private Text usernameAdd;
- private Group tab3group5;
- private Button next;
- private Button stop;
- private Button play;
- private CLabel cLabel2;
- private Button save;
- private Text userTableId;
- private Text passwd;
- private Text username;
- private Text userTableName;
- private CLabel adminLabel;
- private CCombo adminCombo;
- private CLabel nameLable;
- private CLabel passwdLable;
- private CLabel usernameLable;
- private CLabel idLable;
- private Group tab3group4;
- private Button delete;
- private Button add1;
- private Group tab3Group3;
- private Group tab3Group2;
- private Group tab3Group1;
- private Composite container3;
- private Button deleteButton;
- private Button addButton;
- private StyledText status;
- private Button saveButton;
- private Text id;
- private CLabel idLabel;
- private CLabel cLabel1;
- private CLabel nameLabel;
- private CLabel pathLabel;
- private CLabel lastEditLable;
- private CLabel ownerIdLabel;
- private CLabel resolutionLabel;
- private CLabel vBitrateLabel;
- private CLabel aBitrateLabel;
- private CLabel durationLabel;
- private CLabel yearLabel;
- private CLabel categoryLabel;
- private CLabel albumLabel;
- private CCombo type;
- private Text name;
- private Text path;
- private Text lastEdit;
- private Text ownerId;
- private Text resolution;
- private Text vBitrate;
- private Text aBitrate;
- private Text duration;
- private Text year;
- private Text category;
- private Text album;
- private Text author;
- private Text title;
- private Composite composite2;
- private Table playlistTable;
- private Button add2;
- private Button del;
- private Boolean isNotPlaying=true;
- private Boolean paused =true;
- private CTabItem tab3;
- private Composite parent;
- private Display display;
- final Image pauseImage=new Image(this.getDisplay(),"img/pause.gif");
- final Image playImage=new Image(this.getDisplay(),"img/play.gif");
- final Image forwardImage=new Image(this.getDisplay(),"img/forward.gif");
- {
- //Register as a resource user - SWTResourceManager will
- //handle the obtaining and disposing of resources
- SWTResourceManager.registerResourceUser(this);
- }
-
- public GUI( Composite parent, Display display, Model model,
- AccessRights userKind, int style ) {
-
- super(parent, style);
-
- this.parent = parent;
- this.display = display;
- this.model = model;
- this.userKind = userKind;
-
- initGUI();
- }
-
- private void initGUI() {
- try {
- this.setSize(800, 600);
- this.setBackground(SWTResourceManager.getColor(192, 192, 192));
- GridLayout thisLayout = new GridLayout(1, true);
- thisLayout.marginWidth = 5;
- thisLayout.marginHeight = 5;
- thisLayout.numColumns = 1;
- thisLayout.makeColumnsEqualWidth = true;
- thisLayout.horizontalSpacing = 5;
- thisLayout.verticalSpacing = 5;
- this.setLayout(thisLayout);
-
- {
- if (this.userKind.value() == AccessRights._USER){
- cTabFolder1 = new CTabFolder(this, SWT.NONE);
- GridData cTabFolder1LData = new GridData();
- cTabFolder1LData.widthHint = 787;
- cTabFolder1LData.heightHint = 568;
- cTabFolder1.setLayoutData(cTabFolder1LData);
- {
- tab1 = new CTabItem(cTabFolder1,SWT.NONE);
- tab1.setText("Find");
- {
- container1 = new Composite(cTabFolder1,SWT.NONE);
- tab1.setControl(container1);
- RowLayout container1Layout = new RowLayout(org.eclipse.swt.SWT.HORIZONTAL);
- container1.setLayout(container1Layout);
- {
- topComposite = new Composite(container1,SWT.NONE);
- GridLayout topCompositeLayout = new GridLayout();
- topCompositeLayout.makeColumnsEqualWidth = true;
- topCompositeLayout.numColumns = 2;
- topCompositeLayout.verticalSpacing = 2;
- topCompositeLayout.horizontalSpacing = 5;
- topComposite.setLayout(topCompositeLayout);
- RowData topCompositeLData = new RowData();
- topCompositeLData.width = 783;
- topCompositeLData.height = 566;
- topComposite.setLayoutData(topCompositeLData);
- {
- find = new Group(topComposite,SWT.NONE);
- this.find(find,resultComposite,playlistComposite,bottemComposite,1);
- }
- {
- logo = new Group(topComposite,SWT.NONE);
- this.logo(logo);
- }
- {
- resultComposite = new Composite(topComposite,SWT.NONE);
- resultTable1 = new Table(resultComposite,SWT.MULTI|SWT.FULL_SELECTION);
- resultTable1.setToolTipText("Medias");
- resultTable1.addSelectionListener(new SelectionAdapter() {
- public void widgetSelected(SelectionEvent evt) {
- add2.setEnabled(true);
- }
- });
- this.resultTable(resultComposite,resultTable1,1);
- }
- {
- playlistComposite = new Composite(topComposite,SWT.NONE);
- FormLayout playlistCompositeLayout = new FormLayout();
- playlistComposite.setLayout(playlistCompositeLayout);
- GridData playlistCompositeLData = new GridData();
- playlistCompositeLData.heightHint = 390;
- playlistCompositeLData.horizontalAlignment = GridData.FILL;
- playlistComposite.setLayoutData(playlistCompositeLData);
- playlistComposite.setVisible(false);
- playlistComposite.setSize(238, 390);
- {
- next = new Button(playlistComposite,SWT.PUSH | SWT.CENTER);
- FormData nextLData = new FormData();
- nextLData.width = 45;
- nextLData.height = 21;
- nextLData.left = new FormAttachment(0, 1000, 185);
- nextLData.top = new FormAttachment(0, 1000, 365);
- next.setLayoutData(nextLData);
- next.setEnabled(false);
- next.setFont(SWTResourceManager.getFont("Times", 8, 1, false, false));
- next.setToolTipText("play next Title");
- next.setImage(forwardImage);
- next.addSelectionListener(new SelectionAdapter() {
- public void widgetSelected(SelectionEvent evt) {
- model.next();
- }
- });
- }
- {
- stop = new Button(playlistComposite,SWT.PUSH | SWT.CENTER);
- FormData stopLData = new FormData();
- stopLData.width = 35;
- stopLData.height = 21;
- stopLData.left = new FormAttachment(0, 1000, 91);
- stopLData.top = new FormAttachment(0, 1000, 365);
- stop.setLayoutData(stopLData);
- stop.setImage(new Image(this.getDisplay(),"img/stop.gif"));
- stop.setEnabled(false);
- stop.setToolTipText("stop");
- stop.addSelectionListener(new SelectionAdapter() {
- public void widgetSelected(SelectionEvent evt) {
- if (model.stop()){
- play.setEnabled(true);
- next.setEnabled(false);
- stop.setEnabled(false);
- play.setImage(playImage);
- play.setToolTipText("play");
- isNotPlaying=true;
- }
-
- }
- });
- }
- {
- play = new Button(playlistComposite,SWT.PUSH | SWT.CENTER);
- FormData playLData = new FormData();
- playLData.width = 35;
- playLData.height = 21;
- playLData.left = new FormAttachment(0, 1000, 50);
- playLData.top = new FormAttachment(0, 1000, 365);
- play.setLayoutData(playLData);
- play.setImage(playImage);
- play.setEnabled(false);
- play.setToolTipText("play");
- play.addSelectionListener(new SelectionAdapter() {
- public void widgetSelected(SelectionEvent evt) {
- stop.setEnabled(true);
- if (playlistTable.getItemCount()>1)next.setEnabled(true);
- del.setEnabled(false);
- //add2.setEnabled(false);
- if (isNotPlaying){
- play.setCursor(SWTResourceManager.getCursor(SWT.CURSOR_WAIT));
- if(model.play()){
- play.setImage(pauseImage);
- play.setToolTipText("pause");
- play.setCursor(SWTResourceManager.getCursor(SWT.NONE));
- isNotPlaying= false;
- }else;
- }else{
- if(model.pause()){
- if (paused){
- play.setImage(playImage);
- play.setToolTipText("play");
- paused=false;
- }else{
- play.setImage(pauseImage);
- play.setToolTipText("pause");
- paused=true;
- }
- }else;
- }
-
- }
- });
- }
- {
- add2 = new Button(playlistComposite,SWT.PUSH | SWT.CENTER);
- FormData addLData = new FormData();
- addLData.width = 25;
- addLData.height = 21;
- addLData.left = new FormAttachment(0, 1000, 2);
- addLData.top = new FormAttachment(0, 1000, 160);
- add2.setLayoutData(addLData);
- add2.setText(">>");
- add2.setEnabled(false);
- add2.setToolTipText("add to Playlist");
- add2.setFont(SWTResourceManager.getFont("Times", 8, 1, false, false));
- add2.addSelectionListener(new SelectionAdapter() {
- public void widgetSelected(SelectionEvent evt) {
- if (System.getProperty("os.name")== "Mac OS X"){
- for (int i=resultTable1.getSelectionCount()-1;i>=0;i--){
- int id=new Integer(resultTable1.getSelection()[i].getText(0)).intValue();
- System.out.println(resultTable1.getSelection()[i].getText(1));
- model.add2PlayList(id);
- }
- }else{
- for (int i=0;i<resultTable1.getSelectionCount();i++){
- int id=new Integer(resultTable1.getSelection()[i].getText(0)).intValue();
- System.out.println(resultTable1.getSelection()[i].getText(1));
- model.add2PlayList(id);
- }
- }
- while(playlistTable.getItemCount()!=0){
- playlistTable.remove(0);
- }
- ArrayList<Media> playlist=model.getToPlaylist();
- for(int i=0;i<playlist.size();i++){
- Media result=playlist.get(i);
- TableItem item = new TableItem(playlistTable,SWT.NONE);
- item.setText(0,result.name);
- item.setText(1,result.duration);
- }
- play.setEnabled(true);
- if (playlistTable.getItemCount()>1&& !isNotPlaying)next.setEnabled(true);
- }
- });
- }
- {
- del = new Button(playlistComposite,SWT.PUSH | SWT.CENTER);
- FormData delLData = new FormData();
- delLData.width = 25;
- delLData.height = 21;
- delLData.left = new FormAttachment(0, 1000, 2);
- delLData.top = new FormAttachment(0, 1000, 200);
- del.setLayoutData(delLData);
- del.setEnabled(false);
- del.setToolTipText("del from Playlist");
- del.setText("<<");
- del.setFont(SWTResourceManager.getFont("Times", 8, 1, false, false));
- del.addSelectionListener(new SelectionAdapter() {
- public void widgetSelected(SelectionEvent evt) {
- for (int i=playlistTable.getSelectionCount()-1;i>=0;i--){
- int pos = playlistTable.getSelectionIndices()[i];
- model.removeFromPlayList(pos);
- }
-
- del.setEnabled(false);
- while(playlistTable.getItemCount()!=0){
- playlistTable.remove(0);
- }
- ArrayList<Media> playlist=model.getToPlaylist();
- for(int i=0;i<playlist.size();i++){
- Media result=playlist.get(i);
- TableItem item = new TableItem(playlistTable,SWT.NONE);
- item.setText(0,result.name);
- item.setText(1,result.duration);
- }
- if (playlistTable.getItemCount()==0)play.setEnabled(false);
- }
- });
- }
- {
- playlistTable = new Table(playlistComposite,SWT.MULTI|SWT.FULL_SELECTION);
- playlistTable.setHeaderVisible(true);
- FormData playlistTableLData = new FormData();
- playlistTableLData.width = 184;
- playlistTableLData.height = 330;
- playlistTableLData.top = new FormAttachment(24, 1000, 0);
- playlistTableLData.left = new FormAttachment(0, 1000, 38);
- playlistTable.setLayoutData(playlistTableLData);
- playlistTable.setToolTipText("Playlist");
- playlistTable.addSelectionListener(new SelectionAdapter() {
- public void widgetSelected(SelectionEvent evt) {
- if (isNotPlaying)del.setEnabled(true);
- }
- });
- TableColumn title = new TableColumn(playlistTable,SWT.LEFT);
- title.setText("Title");
- title.setWidth(120);
- title.setMoveable(true);
- TableColumn duration = new TableColumn(playlistTable,SWT.RIGHT);
- duration.setText("Duration");
- duration.setWidth(80);
- duration.setMoveable(true);
- }
- }
- }
- /*{
- bottemComposite = new Composite(container1,SWT.NONE);
- bottemComposite.setVisible(false);
- GridLayout bottemCompositeLayout = new GridLayout();
- bottemCompositeLayout.makeColumnsEqualWidth = true;
- bottemCompositeLayout.verticalSpacing = 2;
- bottemCompositeLayout.horizontalSpacing = 5;
- bottemComposite.setLayout(bottemCompositeLayout);
- RowData bottemCompositeLData = new RowData();
- bottemCompositeLData.width = 777;
- bottemCompositeLData.height = 68;
- bottemComposite.setLayoutData(bottemCompositeLData);
- {
- styledText1 = new StyledText(bottemComposite,SWT.NONE);
- GridData styledText1LData = new GridData();
- styledText1LData.widthHint = 765;
- styledText1LData.heightHint = 55;
- styledText1.setLayoutData(styledText1LData);
- styledText1.setText("styledText1");
- styledText1.setSize(765, 55);
- }
- }*/
- }
- }
- {
- tab2 = new CTabItem(cTabFolder1,SWT.NONE);
- tab2.setText("Change");
- {
- container2 = new Composite(cTabFolder1,SWT.NONE);
- GridLayout container2Layout = new GridLayout();
- container2Layout.makeColumnsEqualWidth = true;
- container2.setLayout(container2Layout);
- tab2.setControl(container2);
- container2.setVisible(false);
- {
- composite2 = new Composite(container2,SWT.NONE);
- GridLayout composite2Layout = new GridLayout();
- composite2Layout.makeColumnsEqualWidth = true;
- composite2Layout.numColumns=2;
- composite2.setLayout(composite2Layout);
- GridData composite2LData = new GridData();
- composite2LData.widthHint = 780;
- composite2LData.heightHint = 497;
- composite2.setLayoutData(composite2LData);
- {
- group1 = new Group(composite2,SWT.NONE);
- this.find(group1,group2,composite1,changeComposite,2);
- }
- {
- group2 = new Group(composite2,SWT.NONE);
- this.logo(group2);
- }
- {
- composite1 = new Composite(composite2,SWT.NONE);
- {
- resultTable2 = new Table(composite1,SWT.MULTI|SWT.FULL_SELECTION);
- resultTable2.setToolTipText("Medias");
- resultTable2.addSelectionListener(new SelectionAdapter() {
- public void widgetSelected(SelectionEvent evt) {
- if(resultTable2.getSelectionCount()<2){
- int identity =new Integer(resultTable2.getSelection()[0].getText()).intValue();
- Media result = model.getMediaWithId(identity,2);
- if (result!=null){
- id.setText(new Integer(result.id).toString());
- title.setText(result.name);
- /* t.b.d. parse from string props
- author.setText(result.author);
- album.setText(result.album);
- category.setText(result.category);
- year.setText(result.year);
- */
- duration.setText(result.duration);
- /*
- aBitrate.setText(new Integer(result.aBitrate).toString());
- vBitrate.setText(new Integer(result.vBitrate).toString());
- resolution.setText(result.resolution);
- */
- ownerId.setText(result.owner.name);
- lastEdit.setText(result.lastEdit);
- path.setText(result.path);
- name.setText(result.name);
- String _type = model.getTypeName(result.type);
- type.setText(_type);
- changeComposite.setVisible(true);
- deleteButton.setVisible(true);
- }
- }else changeComposite.setVisible(false);
- }
- });
- this.resultTable(composite1,resultTable2,2);
- }
- }
- {
- changeComposite = new Composite(composite2,SWT.NONE);
- FormLayout changeCompositeLayout = new FormLayout();
- changeComposite.setLayout(changeCompositeLayout);
- GridData changeCompositeLData = new GridData();
- changeCompositeLData.widthHint = 238;
- changeCompositeLData.heightHint = 357;
- changeCompositeLData.verticalAlignment = GridData.BEGINNING;
- changeComposite.setLayoutData(changeCompositeLData);
- changeComposite.setVisible(false);
- {
- saveButton = new Button(changeComposite,SWT.PUSH | SWT.CENTER);
- saveButton.setText("Save");
- FormData saveButtonLData = new FormData();
- saveButtonLData.width = 40;
- saveButtonLData.height = 21;
- saveButtonLData.left = new FormAttachment(0, 1000, 30);
- saveButtonLData.top = new FormAttachment(0, 1000, 315);
- saveButton.setLayoutData(saveButtonLData);
- saveButton.setToolTipText("save Changes");
- saveButton.addSelectionListener(new SelectionAdapter() {
- public void widgetSelected(SelectionEvent evt) {
- saveButtonWidgetSelected(evt);
- }
- });
- }
- {
- id = new Text(changeComposite,SWT.NONE);
- FormData idLData = new FormData();
- idLData.width = 124;
- idLData.height = 14;
- idLData.left = new FormAttachment(0, 1000, 100);
- idLData.top = new FormAttachment(0, 1000, 10);
- id.setLayoutData(idLData);
- id.setEditable(false);
- }
- {
- idLabel = new CLabel(changeComposite,SWT.NONE);
- idLabel.setText("Id:");
- FormData idLabelLData = new FormData();
- idLabelLData.width = 60;
- idLabelLData.height = 21;
- idLabelLData.left = new FormAttachment(0, 1000, 20);
- idLabelLData.top = new FormAttachment(0, 1000, 5);
- idLabel.setLayoutData(idLabelLData);
- }
- {
- cLabel1 = new CLabel(changeComposite,SWT.NONE);
- cLabel1.setText("Type:");
- FormData cLabel1LData = new FormData();
- cLabel1LData.width = 60;
- cLabel1LData.height = 21;
- cLabel1LData.left = new FormAttachment(0, 1000, 20);
- cLabel1LData.top = new FormAttachment(0, 1000, 285);
- cLabel1.setLayoutData(cLabel1LData);
- }
- {
- nameLabel = new CLabel(changeComposite,SWT.NONE);
- nameLabel.setText("Name:");
- FormData nameLabelLData = new FormData();
- nameLabelLData.width = 60;
- nameLabelLData.height = 21;
- nameLabelLData.left = new FormAttachment(0, 1000, 20);
- nameLabelLData.top = new FormAttachment(0, 1000, 265);
- nameLabel.setLayoutData(nameLabelLData);
- }
- {
- pathLabel = new CLabel(changeComposite,SWT.NONE);
- pathLabel.setText("Path:");
- FormData pathLabelLData = new FormData();
- pathLabelLData.width = 60;
- pathLabelLData.height = 21;
- pathLabelLData.left = new FormAttachment(0, 1000, 20);
- pathLabelLData.top = new FormAttachment(0, 1000, 245);
- pathLabel.setLayoutData(pathLabelLData);
- }
- {
- lastEditLable = new CLabel(changeComposite,SWT.NONE);
- lastEditLable.setText("Last Edit:");
- FormData lastEditLableLData = new FormData();
- lastEditLableLData.width = 60;
- lastEditLableLData.height = 21;
- lastEditLableLData.left = new FormAttachment(0, 1000, 20);
- lastEditLableLData.top = new FormAttachment(0, 1000, 225);
- lastEditLable.setLayoutData(lastEditLableLData);
- }
- {
- ownerIdLabel = new CLabel(changeComposite,SWT.NONE);
- ownerIdLabel.setText("Owner:");
- FormData ownerIdLabelLData = new FormData();
- ownerIdLabelLData.width = 60;
- ownerIdLabelLData.height = 21;
- ownerIdLabelLData.left = new FormAttachment(0, 1000, 20);
- ownerIdLabelLData.top = new FormAttachment(0, 1000, 205);
- ownerIdLabel.setLayoutData(ownerIdLabelLData);
- }
- {
- resolutionLabel = new CLabel(changeComposite,SWT.NONE);
- resolutionLabel.setText("Resolution:");
- FormData resolutionLabelLData = new FormData();
- resolutionLabelLData.width = 60;
- resolutionLabelLData.height = 21;
- resolutionLabelLData.left = new FormAttachment(0, 1000, 20);
- resolutionLabelLData.top = new FormAttachment(0, 1000, 185);
- resolutionLabel.setLayoutData(resolutionLabelLData);
- }
- {
- vBitrateLabel = new CLabel(changeComposite,SWT.NONE);
- vBitrateLabel.setText("V-Bitrate:");
- FormData vBitrateLabelLData = new FormData();
- vBitrateLabelLData.width = 60;
- vBitrateLabelLData.height = 21;
- vBitrateLabelLData.left = new FormAttachment(0, 1000, 20);
- vBitrateLabelLData.top = new FormAttachment(0, 1000, 165);
- vBitrateLabel.setLayoutData(vBitrateLabelLData);
- }
- {
- aBitrateLabel = new CLabel(changeComposite,SWT.NONE);
- aBitrateLabel.setText("A-Bitrate:");
- FormData aBitrateLabelLData = new FormData();
- aBitrateLabelLData.width = 60;
- aBitrateLabelLData.height = 21;
- aBitrateLabelLData.left = new FormAttachment(0, 1000, 20);
- aBitrateLabelLData.top = new FormAttachment(0, 1000, 145);
- aBitrateLabel.setLayoutData(aBitrateLabelLData);
- }
- {
- durationLabel = new CLabel(changeComposite,SWT.NONE);
- durationLabel.setText("Duration:");
- FormData durationLabelLData = new FormData();
- durationLabelLData.width = 60;
- durationLabelLData.height = 21;
- durationLabelLData.left = new FormAttachment(0, 1000, 20);
- durationLabelLData.top = new FormAttachment(0, 1000, 125);
- durationLabel.setLayoutData(durationLabelLData);
- }
- {
- yearLabel = new CLabel(changeComposite,SWT.NONE);
- yearLabel.setText("Year:");
- FormData yearLabelLData = new FormData();
- yearLabelLData.width = 60;
- yearLabelLData.height = 21;
- yearLabelLData.left = new FormAttachment(0, 1000, 20);
- yearLabelLData.top = new FormAttachment(0, 1000, 105);
- yearLabel.setLayoutData(yearLabelLData);
- }
- {
- categoryLabel = new CLabel(changeComposite,SWT.NONE);
- categoryLabel.setText("Category:");
- FormData categoryLabelLData = new FormData();
- categoryLabelLData.width = 60;
- categoryLabelLData.height = 21;
- categoryLabelLData.left = new FormAttachment(0, 1000, 20);
- categoryLabelLData.top = new FormAttachment(0, 1000, 85);
- categoryLabel.setLayoutData(categoryLabelLData);
- }
- {
- albumLabel = new CLabel(changeComposite,SWT.NONE);
- albumLabel.setText("Album");
- FormData albumLabelLData = new FormData();
- albumLabelLData.width = 60;
- albumLabelLData.height = 21;
- albumLabelLData.left = new FormAttachment(0, 1000, 20);
- albumLabelLData.top = new FormAttachment(0, 1000, 65);
- albumLabel.setLayoutData(albumLabelLData);
- }
- {
- authorLabel = new CLabel(changeComposite,SWT.NONE);
- authorLabel.setText("Author:");
- FormData authorLabelLData = new FormData();
- authorLabelLData.width = 60;
- authorLabelLData.height = 21;
- authorLabelLData.left = new FormAttachment(0, 1000, 20);
- authorLabelLData.top = new FormAttachment(0, 1000, 45);
- authorLabel.setLayoutData(authorLabelLData);
- }
- {
- titleLabel = new CLabel(changeComposite,SWT.NONE);
- titleLabel.setText("Title:");
- FormData cLabel1LData1 = new FormData();
- cLabel1LData1.width = 60;
- cLabel1LData1.height = 21;
- cLabel1LData1.left = new FormAttachment(0, 1000, 20);
- cLabel1LData1.top = new FormAttachment(0, 1000, 25);
- titleLabel.setLayoutData(cLabel1LData1);
- }
- {
- type = new CCombo(changeComposite,SWT.NONE);
- FormData typeLData = new FormData();
- typeLData.width = 111;
- typeLData.height = 16;
- typeLData.left = new FormAttachment(0, 1000, 100);
- typeLData.top = new FormAttachment(0, 1000, 290);
- type.setLayoutData(typeLData);
- type.setCursor(SWTResourceManager.getCursor(SWT.CURSOR_HAND));
- {
- type.add("audio");
- type.add("video");
- }
- }
- {
- name = new Text(changeComposite,SWT.NONE);
- FormData nameLData = new FormData();
- nameLData.width = 124;
- nameLData.height = 14;
- nameLData.left = new FormAttachment(0, 1000, 100);
- nameLData.top = new FormAttachment(0, 1000, 270);
- name.setLayoutData(nameLData);
- name.setEditable(false);
- }
- {
- path = new Text(changeComposite,SWT.NONE);
- FormData pathLData = new FormData();
- pathLData.width = 124;
- pathLData.height = 14;
- pathLData.left = new FormAttachment(0, 1000, 100);
- pathLData.top = new FormAttachment(0, 1000, 250);
- path.setLayoutData(pathLData);
- path.setEditable(false);
- }
- {
- lastEdit = new Text(changeComposite,SWT.NONE);
- FormData lastEditLData = new FormData();
- lastEditLData.width = 124;
- lastEditLData.height = 14;
- lastEditLData.left = new FormAttachment(0, 1000, 100);
- lastEditLData.top = new FormAttachment(0, 1000, 230);
- lastEdit.setLayoutData(lastEditLData);
- lastEdit.setEditable(false);
- }
- {
- ownerId = new Text(changeComposite,SWT.NONE);
- FormData ownerIdLData = new FormData();
- ownerIdLData.width = 124;
- ownerIdLData.height = 14;
- ownerIdLData.left = new FormAttachment(0, 1000, 100);
- ownerIdLData.top = new FormAttachment(0, 1000, 210);
- ownerId.setLayoutData(ownerIdLData);
- ownerId.setEditable(false);
- }
- {
- resolution = new Text(changeComposite,SWT.NONE);
- FormData resolutionLData = new FormData();
- resolutionLData.width = 124;
- resolutionLData.height = 14;
- resolutionLData.left = new FormAttachment(0, 1000, 100);
- resolutionLData.top = new FormAttachment(0, 1000, 190);
- resolution.setLayoutData(resolutionLData);
- }
- {
- vBitrate = new Text(changeComposite,SWT.NONE);
- FormData vBitrateLData = new FormData();
- vBitrateLData.width = 124;
- vBitrateLData.height = 14;
- vBitrateLData.left = new FormAttachment(0, 1000, 100);
- vBitrateLData.top = new FormAttachment(0, 1000, 170);
- vBitrate.setLayoutData(vBitrateLData);
- }
- {
- aBitrate = new Text(changeComposite,SWT.NONE);
- FormData aBitrateLData = new FormData();
- aBitrateLData.width = 124;
- aBitrateLData.height = 14;
- aBitrateLData.left = new FormAttachment(0, 1000, 100);
- aBitrateLData.top = new FormAttachment(0, 1000, 150);
- aBitrate.setLayoutData(aBitrateLData);
- }
- {
- duration = new Text(changeComposite,SWT.NONE);
- FormData durationLData = new FormData();
- durationLData.width = 124;
- durationLData.height = 14;
- durationLData.left = new FormAttachment(0, 1000, 100);
- durationLData.top = new FormAttachment(0, 1000, 130);
- duration.setLayoutData(durationLData);
- }
- {
- year = new Text(changeComposite,SWT.NONE);
- FormData yearLData = new FormData();
- yearLData.width = 124;
- yearLData.height = 14;
- yearLData.left = new FormAttachment(0, 1000, 100);
- yearLData.top = new FormAttachment(0, 1000, 110);
- year.setLayoutData(yearLData);
- }
- {
- category = new Text(changeComposite,SWT.NONE);
- FormData categoryLData = new FormData();
- categoryLData.width = 124;
- categoryLData.height = 14;
- categoryLData.left = new FormAttachment(0, 1000, 100);
- categoryLData.top = new FormAttachment(0, 1000, 90);
- category.setLayoutData(categoryLData);
- category.setCursor(SWTResourceManager.getCursor(SWT.CURSOR_WAIT));
- }
- {
- album = new Text(changeComposite,SWT.NONE);
- FormData albumLData = new FormData();
- albumLData.width = 124;
- albumLData.height = 14;
- albumLData.left = new FormAttachment(0, 1000, 100);
- albumLData.top = new FormAttachment(0, 1000, 70);
- album.setLayoutData(albumLData);
- }
- {
- author = new Text(changeComposite,SWT.NONE);
- FormData authorLData = new FormData();
- authorLData.width = 124;
- authorLData.height = 14;
- authorLData.left = new FormAttachment(0, 1000, 100);
- authorLData.top = new FormAttachment(0, 1000, 50);
- author.setLayoutData(authorLData);
- }
- {
- title = new Text(changeComposite,SWT.NONE);
- FormData titleLData = new FormData();
- titleLData.width = 124;
- titleLData.height = 13;
- titleLData.top = new FormAttachment(0, 1000, 30);
- titleLData.left = new FormAttachment(0, 1000, 100);
- title.setLayoutData(titleLData);
- }
- }
- }
- {
- composite3 = new Composite(container2,SWT.NONE);
- FormLayout composite3Layout = new FormLayout();
- composite3.setLayout(composite3Layout);
- GridData composite3LData = new GridData();
- composite3LData.widthHint = 777;
- composite3LData.heightHint = 58;
- composite3.setLayoutData(composite3LData);
- {
- deleteButton = new Button(composite3,SWT.PUSH | SWT.CENTER);
- deleteButton.setText("Delete");
- deleteButton.setVisible(false);
- FormData deleteButtonLData = new FormData();
- deleteButtonLData.width = 150;
- deleteButtonLData.height = 30;
- deleteButtonLData.left = new FormAttachment(0, 1000, 470);
- deleteButtonLData.top = new FormAttachment(0, 1000, 15);
- deleteButton.setLayoutData(deleteButtonLData);
- deleteButton.setToolTipText("delete File from Database");
- deleteButton.addSelectionListener(new SelectionAdapter() {
- public void widgetSelected(SelectionEvent evt) {
- deleteButtonWidgetSelected(evt);
- }
- });
- }
- {
- addButton = new Button(composite3,SWT.PUSH | SWT.CENTER);
- addButton.setText("Add");
- FormData addButtonLData = new FormData();
- addButtonLData.width = 150;
- addButtonLData.height = 30;
- addButtonLData.left = new FormAttachment(0, 1000, 160);
- addButtonLData.top = new FormAttachment(0, 1000, 15);
- addButton.setLayoutData(addButtonLData);
- addButton.setToolTipText("add new Files to Database");
- addButton.addSelectionListener(new SelectionAdapter() {
- public void widgetSelected(SelectionEvent evt) {
- addButtonWidgetSelected(evt);
- }
- });
- }
- }
- }
- }
- {
- tab3 = new CTabItem(cTabFolder1,SWT.NONE);
- tab3.setText("Server");
- {
- container3 = new Composite(cTabFolder1,SWT.NONE);
- GridLayout container3Layout = new GridLayout();
- container3Layout.makeColumnsEqualWidth = true;
- container3Layout.numColumns=2;
- container3Layout.verticalSpacing = 0;
- container3Layout.horizontalSpacing = 5;
- container3.setLayout(container3Layout);
- tab3.setControl(container3);
- {
- tab3Group1 = new Group(container3,SWT.NONE);
- FormLayout tab3Group1Layout = new FormLayout();
- tab3Group1.setLayout(tab3Group1Layout);
- GridData tab3Group1LData = new GridData();
- tab3Group1LData.widthHint = 500;
- tab3Group1LData.heightHint = 129;
- tab3Group1LData.horizontalAlignment = GridData.CENTER;
- tab3Group1.setLayoutData(tab3Group1LData);
- {
- composite4 = new Composite(tab3Group1, SWT.NONE);
- FormLayout composite4Layout = new FormLayout();
- composite4.setLayout(composite4Layout);
- FormData composite4LData = new FormData();
- composite4LData.width = 504;
- composite4LData.height = 140;
- composite4LData.left = new FormAttachment(0, 1000, -3);
- composite4LData.top = new FormAttachment(0, 1000, -6);
- composite4.setLayoutData(composite4LData);
- {
- actualStreamLabel2 = new CLabel(
- composite4,
- SWT.NONE);
- FormData actualStreamLabel2LData = new FormData();
- actualStreamLabel2LData.width = 98;
- actualStreamLabel2LData.height = 21;
- actualStreamLabel2LData.left = new FormAttachment(0, 1000, 180);
- actualStreamLabel2LData.top = new FormAttachment(0, 1000, 65);
- actualStreamLabel2.setLayoutData(actualStreamLabel2LData);
- actualStreamLabel2.setFont(SWTResourceManager.getFont("Times", 8, 1, false, false));
- }
- {
- actualStreamLabel1 = new CLabel(
- composite4,
- SWT.NONE);
- actualStreamLabel1.setText("Actual Number of Streams:");
- FormData actualStreamLabel1LData = new FormData();
- actualStreamLabel1LData.width = 160;
- actualStreamLabel1LData.height = 21;
- actualStreamLabel1LData.left = new FormAttachment(0, 1000, 14);
- actualStreamLabel1LData.top = new FormAttachment(0, 1000, 65);
- actualStreamLabel1.setLayoutData(actualStreamLabel1LData);
- actualStreamLabel1.setFont(SWTResourceManager.getFont("Times", 8, 1, false, false));
- }
- {
- streamLabel2 = new CLabel(
- composite4,
- SWT.None);
- FormData streamLabel2LData = new FormData();
- streamLabel2LData.width = 98;
- streamLabel2LData.height = 21;
- streamLabel2LData.left = new FormAttachment(0, 1000, 180);
- streamLabel2LData.top = new FormAttachment(0, 1000, 40);
- streamLabel2.setLayoutData(streamLabel2LData);
- streamLabel2.setFont(SWTResourceManager.getFont("Times", 8, 1, false, false));
- }
- {
- streamLabel1 = new CLabel(
- composite4,
- SWT.NONE);
- streamLabel1.setText("Total Number of Streams:");
- FormData streamLabel1LData = new FormData();
- streamLabel1LData.width = 150;
- streamLabel1LData.height = 21;
- streamLabel1LData.left = new FormAttachment(0, 1000, 14);
- streamLabel1LData.top = new FormAttachment(0, 1000, 40);
- streamLabel1.setLayoutData(streamLabel1LData);
- streamLabel1.setFont(SWTResourceManager.getFont("Times", 8, 1, false, false));
- }
- {
- data2 = new CLabel(composite4, SWT.NONE);
- FormData data2LData = new FormData();
- data2LData.width = 98;
- data2LData.height = 21;
- data2LData.left = new FormAttachment(0, 1000, 180);
- data2LData.top = new FormAttachment(0, 1000, 15);
- data2.setLayoutData(data2LData);
- data2.setFont(SWTResourceManager.getFont("Times", 8, 1, false, false));
- }
- {
- data1 = new CLabel(composite4, SWT.NONE);
- data1.setText("Total Data in Database:");
- FormData data1LData = new FormData();
- data1LData.width = 150;
- data1LData.height = 21;
- data1LData.left = new FormAttachment(0, 1000, 14);
- data1LData.top = new FormAttachment(0, 1000, 15);
- data1.setLayoutData(data1LData);
- data1.setFont(SWTResourceManager.getFont("Times", 8, 1, false, false));
- }
- {
- shutdown = new Button(composite4, SWT.PUSH
- | SWT.CENTER);
- shutdown.setText("Shutdown");
- FormData shutdownLData = new FormData();
- shutdownLData.width = 77;
- shutdownLData.height = 21;
- shutdownLData.left = new FormAttachment(0, 1000, 35);
- shutdownLData.top = new FormAttachment(0, 1000, 105);
- shutdown.setLayoutData(shutdownLData);
- shutdown.setToolTipText("Server shutdown");
- shutdown.addSelectionListener(new SelectionAdapter() {
- public void widgetSelected(SelectionEvent evt) {
- model.serverShutdown();
- }
- });
- }
- {
- iptable = new Table(composite4, SWT.SINGLE);
- FormData iptableLData = new FormData();
- iptableLData.width = 173;
- iptableLData.height = 110;
- iptableLData.left = new FormAttachment(0, 1000, 308);
- iptableLData.top = new FormAttachment(0, 1000, 7);
- iptable.setLayoutData(iptableLData);
- iptable.setHeaderVisible(true);
- iptable.setToolTipText("User online");
- {
- userName = new TableColumn(
- iptable,
- SWT.CENTER);
- userName.setText("Username");
- userName.setWidth(70);
- }
- {
- ip = new TableColumn(iptable, SWT.BEGINNING);
- ip.setText("Ip");
- ip.setWidth(119);
- }
- final int time = 1000;
- final Runnable timer = new Runnable() {
- public void run() {
- refillIpTable();
- data2.setText("not supported in yalp2");
- streamLabel2.setText( /*new Integer(model.getAllStreamNum()).toString() */ "not supported in yalp2");
- display.timerExec(time, this);
- actualStreamLabel2.setText( /*new Integer(model.getActualStreamNum()).toString()*/ "not supported in yalp2");
- }
- };
- display.timerExec(time, timer);
- }
- }
- }
- {
- tab3Group2 = new Group(container3,SWT.NONE);
- this.logo(tab3Group2);
- }
- {
- tab3Group3 = new Group(container3,SWT.NONE);
- FormLayout tab3Group3Layout = new FormLayout();
- tab3Group3.setLayout(tab3Group3Layout);
- GridData tab3Group3LData = new GridData();
- tab3Group3LData.widthHint = 500;
- tab3Group3LData.heightHint = 284;
- tab3Group3LData.horizontalAlignment = GridData.CENTER;
- tab3Group3.setLayoutData(tab3Group3LData);
- tab3Group3.setText("User Management");
- {
- delete = new Button(tab3Group3,SWT.PUSH | SWT.CENTER);
- delete.setText("Delete");
- FormData deleteLData = new FormData();
- deleteLData.width = 45;
- deleteLData.height = 21;
- deleteLData.left = new FormAttachment(0, 1000, 447);
- deleteLData.top = new FormAttachment(0, 1000, 254);
- delete.setLayoutData(deleteLData);
- delete.setToolTipText("delete User");
- delete.addSelectionListener(new SelectionAdapter() {
- public void widgetSelected(SelectionEvent evt) {
- YalpUser toChange = new YalpUser();
- toChange.id = new Integer(userTableId.getText()).intValue();
- toChange.name = username.getText();
- model.changeUser(toChange, passwd.getText(), Action.DELETE);
- while(UserTable.getItemCount()!=0){
- UserTable.remove(0);
- }
- ArrayList<YalpUser> resultList = model.getUser();
- for (int i = 0; i < resultList.size(); i++) {
- TableItem item;
- YalpUser result = resultList.get(i);
- item = new TableItem(UserTable,SWT.NONE);
- item.setText(0,new Integer(result.id).toString());
- item.setText(1,result.name);
- // item.setText(2,result.password);
- item.setText(3,result.realName);
- item.setText(4,model.accessRightsName(result.level));
- }
- tab3group4.setVisible(false);
- }
- });
- }
- {
- add1 = new Button(tab3Group3,SWT.PUSH | SWT.CENTER);
- add1.setText("Add");
- FormData addLData = new FormData();
- addLData.width = 45;
- addLData.height = 21;
- addLData.left = new FormAttachment(0, 1000, 7);
- addLData.top = new FormAttachment(0, 1000, 254);
- add1.setLayoutData(addLData);
- add1.setToolTipText("add new User ");
- add1.addSelectionListener(new SelectionAdapter() {
- public void widgetSelected(SelectionEvent evt) {
- tab3group5.setVisible(true);
- }
- });
- }
- {
- UserTable = new Table(tab3Group3,SWT.SINGLE|SWT.FULL_SELECTION);
- FormData UserTableLData = new FormData();
- UserTableLData.width = 467;
- UserTableLData.height = 224;
- UserTableLData.left = new FormAttachment(11, 1000, 0);
- UserTableLData.right = new FormAttachment(988, 1000, 0);
- UserTableLData.top = new FormAttachment(19, 1000, 0);
- UserTableLData.bottom = new FormAttachment(864, 1000, 0);
- UserTable.setLayoutData(UserTableLData);
- UserTable.setHeaderVisible(true);
- UserTable.setToolTipText("registrated User");
- UserTable.addSelectionListener(new SelectionAdapter() {
- public void widgetSelected(SelectionEvent evt) {
- userTableId.setText(UserTable.getSelection()[0].getText(0));
- username.setText(UserTable.getSelection()[0].getText(1));
- passwd.setText(UserTable.getSelection()[0].getText(2));
- userTableName.setText(UserTable.getSelection()[0].getText(3));
- adminCombo.setText(UserTable.getSelection()[0].getText(4));
- tab3group4.setVisible(true);
- }
- });
- {
- TableColumn id = new TableColumn(UserTable,SWT.BEGINNING);
- id.setText("ID");
- id.setWidth(45);
- id.setMoveable(true);
- id.addListener(SWT.Selection, new SortListener(this,UserTable,0,5));
- TableColumn userName = new TableColumn(UserTable,SWT.BEGINNING);
- userName.setMoveable(true);
- userName.setText("Username");
- userName.setWidth(120);
- userName.addListener(SWT.Selection, new SortListener(this,UserTable,1,5));
- TableColumn passwd = new TableColumn(UserTable,SWT.BEGINNING);
- passwd.setMoveable(true);
- passwd.setText("Password");
- passwd.setWidth(120);
- passwd.addListener(SWT.Selection, new SortListener(this,UserTable,2,5));
- TableColumn name = new TableColumn(UserTable,SWT.BEGINNING);
- name.setMoveable(true);
- name.setText("Name");
- name.setWidth(130);
- name.addListener(SWT.Selection, new SortListener(this,UserTable,3,5));
- TableColumn admin = new TableColumn(UserTable,SWT.BEGINNING);
- admin.setMoveable(true);
- admin.setText("Admin");
- admin.setWidth(74);
- admin.addListener(SWT.Selection, new SortListener(this,UserTable,4,5));
- //TableColumn huhu=new TableColumn(UserTable,SWT.BEGINNING);
- //huhu.dispose();
- ArrayList<YalpUser> resultList = model.getUser();
- for (int i = 0; i < resultList.size(); i++) {
- TableItem item;
- YalpUser result = resultList.get(i);
- item = new TableItem(UserTable,SWT.NONE);
- item.setText(0,new Integer(result.id).toString());
- item.setText(1,result.name);
- //item.setText(2,result.passwd);
- item.setText(3,result.realName);
- item.setText(4,model.accessRightsName(result.level));
- }
- }
- }
- }
- {
- tab3group4 = new Group(container3,SWT.NONE);
- FormLayout tab3group4Layout = new FormLayout();
- tab3group4.setLayout(tab3group4Layout);
- tab3group4.setText("Edit User");
- GridData tab3group4LData = new GridData();
- tab3group4LData.widthHint = 256;
- tab3group4LData.heightHint = 284;
- tab3group4.setLayoutData(tab3group4LData);
- tab3group4.setVisible(false);
- {
- save = new Button(tab3group4,SWT.PUSH | SWT.CENTER);
- save.setText("save");
- FormData saveLData = new FormData();
- saveLData.width = 45;
- saveLData.height = 21;
- saveLData.left = new FormAttachment(0, 1000, 42);
- saveLData.top = new FormAttachment(0, 1000, 157);
- save.setLayoutData(saveLData);
- save.setToolTipText("save Changes");
- save.addSelectionListener(new SelectionAdapter() {
- public void widgetSelected(SelectionEvent evt) {
- YalpUser toChange = new YalpUser();
- toChange.id = new Integer(userTableId.getText()).intValue();
- toChange.name = username.getText();
- model.changeUser(toChange, passwd.getText(), Action.EDIT);
- while(UserTable.getItemCount()!=0){
- UserTable.remove(0);
- }
- ArrayList<YalpUser> resultList = model.getUser();
- for (int i = 0; i < resultList.size(); i++) {
- TableItem item;
- YalpUser result = resultList.get(i);
- item = new TableItem(UserTable,SWT.NONE);
- item.setText(0,new Integer(result.id).toString());
- item.setText(1,result.name);
- //item.setText(2,result.passwd);
- item.setText(3,result.realName);
- item.setText(4,model.accessRightsName(result.level));
- }
- tab3group4.setVisible(false);
- }
- });
- }
- {
- userTableName = new Text(tab3group4,SWT.NONE);
- FormData text2LData = new FormData();
- text2LData.width = 94;
- text2LData.height = 14;
- text2LData.left = new FormAttachment(0, 1000, 117);
- text2LData.top = new FormAttachment(0, 1000, 112);
- userTableName .setLayoutData(text2LData);
- }
- {
- passwd = new Text(tab3group4,SWT.NONE);
- FormData passwdLData = new FormData();
- passwdLData.width = 94;
- passwdLData.height = 14;
- passwdLData.left = new FormAttachment(0, 1000, 117);
- passwdLData.top = new FormAttachment(0, 1000, 92);
- passwd.setLayoutData(passwdLData);
- }
- {
- username = new Text(tab3group4,SWT.NONE);
- FormData usernameLData = new FormData();
- usernameLData.width = 94;
- usernameLData.height = 14;
- usernameLData.left = new FormAttachment(0, 1000, 117);
- usernameLData.top = new FormAttachment(0, 1000, 72);
- username.setLayoutData(usernameLData);
- }
- {
- userTableId = new Text(tab3group4,SWT.NONE);
- FormData text1LData = new FormData();
- text1LData.width = 94;
- text1LData.height = 14;
- text1LData.left = new FormAttachment(0, 1000, 117);
- text1LData.top = new FormAttachment(0, 1000, 52);
- userTableId.setLayoutData(text1LData);
- userTableId.setEditable(false);
- }
- {
- adminLabel = new CLabel(tab3group4,SWT.NONE);
- adminLabel.setText("Admin:");
- FormData adminLabelLData = new FormData();
- adminLabelLData.width = 42;
- adminLabelLData.height = 21;
- adminLabelLData.left = new FormAttachment(0, 1000, 27);
- adminLabelLData.top = new FormAttachment(0, 1000, 127);
- adminLabel.setLayoutData(adminLabelLData);
- }
- {
- idLable = new CLabel(tab3group4,SWT.NONE);
- idLable.setText("Id:");
- FormData idLableLData = new FormData();
- idLableLData.width = 20;
- idLableLData.height = 21;
- idLableLData.left = new FormAttachment(107, 1000, 0);
- idLableLData.right = new FormAttachment(185, 1000, 0);
- idLableLData.top = new FormAttachment(167, 1000, 0);
- idLableLData.bottom = new FormAttachment(241, 1000, 0);
- idLable.setLayoutData(idLableLData);
- }
- {
- usernameLable = new CLabel(tab3group4,SWT.NONE);
- usernameLable.setText("Username:");
- FormData usernameLableLData = new FormData();
- usernameLableLData.width = 58;
- usernameLableLData.height = 21;
- usernameLableLData.left = new FormAttachment(107, 1000, 0);
- usernameLableLData.right = new FormAttachment(333, 1000, 0);
- usernameLableLData.top = new FormAttachment(237, 1000, 0);
- usernameLableLData.bottom = new FormAttachment(311, 1000, 0);
- usernameLable.setLayoutData(usernameLableLData);
- }
- {
- passwdLable = new CLabel(tab3group4,SWT.NONE);
- passwdLable.setText("Password:");
- FormData passwdLableLData = new FormData();
- passwdLableLData.width = 56;
- passwdLableLData.height = 21;
- passwdLableLData.left = new FormAttachment(107, 1000, 0);
- passwdLableLData.right = new FormAttachment(326, 1000, 0);
- passwdLableLData.top = new FormAttachment(308, 1000, 0);
- passwdLableLData.bottom = new FormAttachment(382, 1000, 0);
- passwdLable.setLayoutData(passwdLableLData);
- }
- {
- nameLable = new CLabel(tab3group4,SWT.NONE);
- nameLable.setText("Name:");
- FormData nameLableLData = new FormData();
- nameLableLData.width = 37;
- nameLableLData.height = 21;
- nameLableLData.left = new FormAttachment(107, 1000, 0);
- nameLableLData.right = new FormAttachment(251, 1000, 0);
- nameLableLData.top = new FormAttachment(378, 1000, 0);
- nameLableLData.bottom = new FormAttachment(452, 1000, 0);
- nameLable.setLayoutData(nameLableLData);
- }
- {
- adminCombo = new CCombo(tab3group4,SWT.NONE);
- FormData adminComboLData = new FormData();
- adminComboLData.width = 81;
- adminComboLData.height = 16;
- adminComboLData.left = new FormAttachment(458, 1000, 0);
- adminComboLData.right = new FormAttachment(849, 1000, 0);
- adminComboLData.top = new FormAttachment(466, 1000, 0);
- adminComboLData.bottom = new FormAttachment(522, 1000, 0);
- adminCombo.setLayoutData(adminComboLData);
- {
- adminCombo.add("true");
- adminCombo.add("false");
- }
- }
- }
- tab3group5 = new Group(container3,SWT.NONE);
- FormLayout tab3group5Layout = new FormLayout();
- tab3group5.setLayout(tab3group5Layout);
- GridData tab3group5LData = new GridData();
- tab3group5LData.widthHint = 500;
- tab3group5LData.heightHint = 99;
- tab3group5.setLayoutData(tab3group5LData);
- tab3group5.setText("Add User");
- tab3group5.setVisible(false);
- {
- submitButton = new Button(tab3group5,SWT.PUSH | SWT.CENTER);
- submitButton.setText("Submit");
- FormData submitButtonLData = new FormData();
- submitButtonLData.width = 50;
- submitButtonLData.height = 21;
- submitButtonLData.left = new FormAttachment(0, 1000, 382);
- submitButtonLData.top = new FormAttachment(0, 1000, 52);
- submitButton.setLayoutData(submitButtonLData);
- submitButton.setToolTipText("add User");
- submitButton.addSelectionListener(new SelectionAdapter() {
- public void widgetSelected(SelectionEvent evt) {
- System.out.println("submit");
- YalpUser toChange = new YalpUser();
- toChange.id = 100;
- toChange.name = usernameAdd.getText();
- toChange.realName = realnameAdd.getText();
- model.changeUser(toChange, passwdAdd.getText(), Action.CREATE);
- while(UserTable.getItemCount()!=0){
- UserTable.remove(0);
- }
- ArrayList<YalpUser> resultList = model.getUser();
- for (int i = 0; i < resultList.size(); i++) {
- TableItem item;
- YalpUser result = resultList.get(i);
- item = new TableItem(UserTable,SWT.NONE);
- item.setText(0,new Integer(result.id).toString());
- item.setText(1,result.name);
- //item.setText(2,result.passwd);
- item.setText(3,result.realName);
- item.setText(4,model.accessRightsName(result.level));
- }
- }
- });
- }
- {
- adminAddLabel = new CLabel(tab3group5,SWT.NONE);
- adminAddLabel.setText("Admin:");
- FormData adminAddLabelLData = new FormData();
- adminAddLabelLData.width = 40;
- adminAddLabelLData.height = 21;
- adminAddLabelLData.left = new FormAttachment(0, 1000, 291);
- adminAddLabelLData.top = new FormAttachment(0, 1000, 17);
- adminAddLabel.setLayoutData(adminAddLabelLData);
- }
- {
- passwdAddLable = new CLabel(tab3group5,SWT.NONE);
- passwdAddLable.setText("Password:");
- FormData passwdAddLableLData = new FormData();
- passwdAddLableLData.width = 60;
- passwdAddLableLData.height = 21;
- passwdAddLableLData.left = new FormAttachment(0, 1000, 17);
- passwdAddLableLData.top = new FormAttachment(0, 1000, 57);
- passwdAddLable.setLayoutData(passwdAddLableLData);
- }
- {
- usernameAddLable = new CLabel(tab3group5,SWT.NONE);
- usernameAddLable.setText("Username:");
- FormData usernameAddLableLData = new FormData();
- usernameAddLableLData.width = 60;
- usernameAddLableLData.height = 21;
- usernameAddLableLData.left = new FormAttachment(0, 1000, 17);
- usernameAddLableLData.top = new FormAttachment(0, 1000, 37);
- usernameAddLable.setLayoutData(usernameAddLableLData);
- }
- {
- realnameAddLabel = new CLabel(tab3group5,SWT.NONE);
- realnameAddLabel.setText("Name:");
- FormData realnameAddLabelLData = new FormData();
- realnameAddLabelLData.width = 60;
- realnameAddLabelLData.height = 21;
- realnameAddLabelLData.left = new FormAttachment(0, 1000, 17);
- realnameAddLabelLData.top = new FormAttachment(0, 1000, 17);
- realnameAddLabel.setLayoutData(realnameAddLabelLData);
- }
- {
- adminAdd = new CCombo(tab3group5,SWT.NONE);
- FormData adminAddLData = new FormData();
- adminAddLData.width = 65;
- adminAddLData.height = 12;
- adminAddLData.left = new FormAttachment(0, 1000, 347);
- adminAddLData.top = new FormAttachment(0, 1000, 22);
- adminAdd.setLayoutData(adminAddLData);
- adminAdd.setText("false");
- {
- adminAdd.add("false");
- adminAdd.add("true");
- }
- }
- {
- realnameAdd = new Text(tab3group5,SWT.NONE);
- FormData realnameAddLData = new FormData();
- realnameAddLData.width = 174;
- realnameAddLData.height = 14;
- realnameAddLData.left = new FormAttachment(0, 1000, 82);
- realnameAddLData.top = new FormAttachment(0, 1000, 22);
- realnameAdd.setLayoutData(realnameAddLData);
- }
- {
- usernameAdd = new Text(tab3group5,SWT.NONE);
- FormData usernameAddLData = new FormData();
- usernameAddLData.width = 174;
- usernameAddLData.height = 13;
- usernameAddLData.left = new FormAttachment(165, 1000, 0);
- usernameAddLData.right = new FormAttachment(525, 1000, 0);
- usernameAddLData.top = new FormAttachment(429, 1000, 0);
- usernameAddLData.bottom = new FormAttachment(560, 1000, 0);
- usernameAdd.setLayoutData(usernameAddLData);
- }
- {
- FormData PasswdAddLData = new FormData();
- PasswdAddLData.width = 174;
- PasswdAddLData.height = 13;
- PasswdAddLData.left = new FormAttachment(165, 1000, 0);
- PasswdAddLData.right = new FormAttachment(525, 1000, 0);
- PasswdAddLData.top = new FormAttachment(631, 1000, 0);
- PasswdAddLData.bottom = new FormAttachment(762, 1000, 0);
- passwdAdd = new Text(tab3group5,SWT.NONE);
- passwdAdd.setLayoutData(PasswdAddLData);
- }
- }
- }
- cTabFolder1.setSelection(0);
- }
- else{
- GridData testLData = new GridData();
- testLData.widthHint = 792;
- testLData.heightHint = 590;
- Composite simpelUser = new Composite(this, SWT.NONE);
- RowLayout testLayout = new RowLayout(org.eclipse.swt.SWT.HORIZONTAL);
- simpelUser.setLayout(testLayout);
- simpelUser.setLayoutData(testLData);
- {
- topComposite = new Composite(simpelUser,SWT.NONE);
- GridLayout topCompositeLayout = new GridLayout();
- topCompositeLayout.makeColumnsEqualWidth = true;
- topCompositeLayout.numColumns = 2;
- topCompositeLayout.verticalSpacing = 2;
- topCompositeLayout.horizontalSpacing = 5;
- topComposite.setLayout(topCompositeLayout);
- RowData topCompositeLData = new RowData();
- topCompositeLData.width = 783;
- topCompositeLData.height = 566;
- topComposite.setLayoutData(topCompositeLData);
- {
- find = new Group(topComposite,SWT.NONE);
- this.find(find,resultComposite,playlistComposite,bottemComposite,1);
- }
- {
- logo = new Group(topComposite,SWT.NONE);
- this.logo(logo);
- }
- {
- resultComposite = new Composite(topComposite,SWT.NONE);
- resultTable1 = new Table(resultComposite,SWT.MULTI|SWT.FULL_SELECTION);
- resultTable1.setToolTipText("Medias");
- resultTable1.addSelectionListener(new SelectionAdapter() {
- public void widgetSelected(SelectionEvent evt) {
- add2.setEnabled(true);
- }
- });
- this.resultTable(resultComposite,resultTable1,1);
- }
- {
- playlistComposite = new Composite(topComposite,SWT.NONE);
- FormLayout playlistCompositeLayout = new FormLayout();
- playlistComposite.setLayout(playlistCompositeLayout);
- GridData playlistCompositeLData = new GridData();
- playlistCompositeLData.heightHint = 390;
- playlistCompositeLData.horizontalAlignment = GridData.FILL;
- playlistComposite.setLayoutData(playlistCompositeLData);
- playlistComposite.setVisible(false);
- playlistComposite.setSize(238, 390);
- {
- next = new Button(playlistComposite,SWT.PUSH | SWT.CENTER);
- FormData nextLData = new FormData();
- nextLData.width = 45;
- nextLData.height = 21;
- nextLData.left = new FormAttachment(0, 1000, 185);
- nextLData.top = new FormAttachment(0, 1000, 365);
- next.setLayoutData(nextLData);
- next.setEnabled(false);
- next.setFont(SWTResourceManager.getFont("Times", 8, 1, false, false));
- next.setToolTipText("play next Title");
- next.setImage(forwardImage);
- next.addSelectionListener(new SelectionAdapter() {
- public void widgetSelected(SelectionEvent evt) {
- model.next();
- }
- });
- }
- {
- stop = new Button(playlistComposite,SWT.PUSH | SWT.CENTER);
- FormData stopLData = new FormData();
- stopLData.width = 35;
- stopLData.height = 21;
- stopLData.left = new FormAttachment(0, 1000, 91);
- stopLData.top = new FormAttachment(0, 1000, 365);
- stop.setLayoutData(stopLData);
- stop.setImage(new Image(this.getDisplay(),"img/stop.gif"));
- stop.setEnabled(false);
- stop.setToolTipText("stop");
- stop.addSelectionListener(new SelectionAdapter() {
- public void widgetSelected(SelectionEvent evt) {
- if (model.stop()){
- play.setEnabled(true);
- next.setEnabled(false);
- stop.setEnabled(false);
- play.setImage(playImage);
- play.setToolTipText("play");
- isNotPlaying=true;
- }
-
- }
- });
- }
- {
- play = new Button(playlistComposite,SWT.PUSH | SWT.CENTER);
- FormData playLData = new FormData();
- playLData.width = 35;
- playLData.height = 21;
- playLData.left = new FormAttachment(0, 1000, 50);
- playLData.top = new FormAttachment(0, 1000, 365);
- play.setLayoutData(playLData);
- play.setImage(playImage);
- play.setEnabled(false);
- play.setToolTipText("play");
- play.addSelectionListener(new SelectionAdapter() {
- public void widgetSelected(SelectionEvent evt) {
- stop.setEnabled(true);
- if (playlistTable.getItemCount()>1)next.setEnabled(true);
- del.setEnabled(false);
- //add2.setEnabled(false);
- if (isNotPlaying){
- play.setCursor(SWTResourceManager.getCursor(SWT.CURSOR_WAIT));
- if(model.play()){
- play.setImage(pauseImage);
- play.setToolTipText("pause");
- play.setCursor(SWTResourceManager.getCursor(SWT.NONE));
- isNotPlaying= false;
- }else;
- }else{
- if(model.pause()){
- if (paused){
- play.setImage(playImage);
- play.setToolTipText("play");
- paused=false;
- }else{
- play.setImage(pauseImage);
- play.setToolTipText("pause");
- paused=true;
- }
- }else;
- }
-
- }
- });
- }
- {
- add2 = new Button(playlistComposite,SWT.PUSH | SWT.CENTER);
- FormData addLData = new FormData();
- addLData.width = 25;
- addLData.height = 21;
- addLData.left = new FormAttachment(0, 1000, 2);
- addLData.top = new FormAttachment(0, 1000, 160);
- add2.setLayoutData(addLData);
- add2.setText(">>");
- add2.setEnabled(false);
- add2.setToolTipText("add to Playlist");
- add2.setFont(SWTResourceManager.getFont("Times", 8, 1, false, false));
- add2.addSelectionListener(new SelectionAdapter() {
- public void widgetSelected(SelectionEvent evt) {
- if (System.getProperty("os.name")== "Mac OS X"){
- for (int i=resultTable1.getSelectionCount()-1;i>=0;i--){
- int id=new Integer(resultTable1.getSelection()[i].getText(0)).intValue();
- System.out.println(resultTable1.getSelection()[i].getText(1));
- model.add2PlayList(id);
- }
- }else{
- for (int i=0;i<resultTable1.getSelectionCount();i++){
- int id=new Integer(resultTable1.getSelection()[i].getText(0)).intValue();
- System.out.println(resultTable1.getSelection()[i].getText(1));
- model.add2PlayList(id);
- }
- }
- while(playlistTable.getItemCount()!=0){
- playlistTable.remove(0);
- }
- ArrayList<Media> playlist=model.getToPlaylist();
- for(int i=0;i<playlist.size();i++){
- Media result=playlist.get(i);
- TableItem item = new TableItem(playlistTable,SWT.NONE);
- item.setText(0,result.name);
- item.setText(1,result.duration);
- }
- play.setEnabled(true);
- if (playlistTable.getItemCount()>1&& !isNotPlaying)next.setEnabled(true);
- }
- });
- }
- {
- del = new Button(playlistComposite,SWT.PUSH | SWT.CENTER);
- FormData delLData = new FormData();
- delLData.width = 25;
- delLData.height = 21;
- delLData.left = new FormAttachment(0, 1000, 2);
- delLData.top = new FormAttachment(0, 1000, 200);
- del.setLayoutData(delLData);
- del.setEnabled(false);
- del.setToolTipText("del from Playlist");
- del.setText("<<");
- del.setFont(SWTResourceManager.getFont("Times", 8, 1, false, false));
- del.addSelectionListener(new SelectionAdapter() {
- public void widgetSelected(SelectionEvent evt) {
- for (int i=playlistTable.getSelectionCount()-1;i>=0;i--){
- int pos = playlistTable.getSelectionIndices()[i];
- model.removeFromPlayList(pos);
- }
-
- del.setEnabled(false);
- while(playlistTable.getItemCount()!=0){
- playlistTable.remove(0);
- }
- ArrayList<Media> playlist=model.getToPlaylist();
- for(int i=0;i<playlist.size();i++){
- Media result=playlist.get(i);
- TableItem item = new TableItem(playlistTable,SWT.NONE);
- item.setText(0,result.name);
- item.setText(1,result.duration);
- }
- if (playlistTable.getItemCount()==0)play.setEnabled(false);
- }
- });
- }
- {
- playlistTable = new Table(playlistComposite,SWT.MULTI|SWT.FULL_SELECTION);
- playlistTable.setHeaderVisible(true);
- FormData playlistTableLData = new FormData();
- playlistTableLData.width = 184;
- playlistTableLData.height = 330;
- playlistTableLData.top = new FormAttachment(24, 1000, 0);
- playlistTableLData.left = new FormAttachment(0, 1000, 38);
- playlistTable.setLayoutData(playlistTableLData);
- playlistTable.setToolTipText("Playlist");
- playlistTable.addSelectionListener(new SelectionAdapter() {
- public void widgetSelected(SelectionEvent evt) {
- if (isNotPlaying)del.setEnabled(true);
- }
- });
- TableColumn title = new TableColumn(playlistTable,SWT.LEFT);
- title.setText("Title");
- title.setWidth(120);
- title.setMoveable(true);
- TableColumn duration = new TableColumn(playlistTable,SWT.RIGHT);
- duration.setText("Duration");
- duration.setWidth(80);
- duration.setMoveable(true);
- }
- }
- }
- }
- }
- this.layout();
- } catch (Exception e) {
- e.printStackTrace();
- }
- }
-
- //TODO:start find
- private void find(Group find,Composite resultComposite, Composite playlistComposite,Composite bottemComposite,int _tab){
- final Text searchField = new Text(find,SWT.NONE);
- final Button findButton = new Button(find,SWT.PUSH | SWT.CENTER);
- final Button allCheckBox = new Button(find,SWT.RADIO | SWT.LEFT);
- final Button videoCheckBox = new Button(find,SWT.RADIO | SWT.LEFT);
- final Button audioCheckBox = new Button(find,SWT.RADIO | SWT.LEFT);
- final CLabel returnNum= new CLabel(find, SWT.NONE);
- final int tab=_tab;
- {
- cLabel2 = new CLabel(find, SWT.NONE);
- if (tab==1)cLabel2.setText("find and stream mutimedia files");
- else cLabel2.setText("find and manage mutimedia files");
- FormData cLabel2LData = new FormData();
- cLabel2LData.width = 250;
- cLabel2LData.height = 21;
- cLabel2LData.left = new FormAttachment(0,1000,46);
- cLabel2LData.top = new FormAttachment(0,1000,13);
- cLabel2.setLayoutData(cLabel2LData);
- }
- {
-
- FormData allCheckBoxLData = new FormData();
- allCheckBoxLData.left = new FormAttachment(0, 1000, 95);
- allCheckBoxLData.top = new FormAttachment(0, 1000, 98);
- allCheckBoxLData.width = 56;
- allCheckBoxLData.height = 14;
- allCheckBox.setLayoutData(allCheckBoxLData);
- allCheckBox.setText("All");
- allCheckBox.setSelection(true);
- allCheckBox.setToolTipText("Find Audio and Video Files");
- allCheckBox.addKeyListener(new KeyAdapter() {
- public void keyPressed(KeyEvent evt) {
- if (evt.character == SWT.CR) {
- searchPressed(
- searchField,
- videoCheckBox,
- audioCheckBox,
- returnNum,
- tab);
- }
- }
- });
- }
- {
-
- FormData audioCheckBoxLData = new FormData();
- audioCheckBoxLData.left = new FormAttachment(0, 1000, 195);
- audioCheckBoxLData.top = new FormAttachment(0, 1000, 98);
- audioCheckBoxLData.width = 56;
- audioCheckBoxLData.height = 14;
- audioCheckBox.setLayoutData(audioCheckBoxLData);
- audioCheckBox.setText("Audio");
- audioCheckBox.setToolTipText("Find Audio Files");
- audioCheckBox
- .addKeyListener(new KeyAdapter() {
- public void keyPressed(KeyEvent evt) {
- if (evt.character == SWT.CR) {
- searchPressed(
- searchField,
- videoCheckBox,
- audioCheckBox,
- returnNum,
- tab);
- }
- }
- });
- }
- {
-
- FormData videoCheckBoxLData = new FormData();
- videoCheckBoxLData.left = new FormAttachment(0, 1000, 296);
- videoCheckBoxLData.top = new FormAttachment(0, 1000, 98);
- videoCheckBoxLData.width = 56;
- videoCheckBoxLData.height = 14;
- videoCheckBox.setLayoutData(videoCheckBoxLData);
- videoCheckBox.setText("Video");
- videoCheckBox.setToolTipText("Find Video Files");
- videoCheckBox
- .addKeyListener(new KeyAdapter() {
- public void keyPressed(KeyEvent evt) {
- if (evt.character == SWT.CR) {
- searchPressed(
- searchField,
- videoCheckBox,
- audioCheckBox,
- returnNum,
- tab);
- }
- }
- });
- }
-
-
- FormLayout findLayout = new FormLayout();
- find.setLayout(findLayout);
- GridData findLData = new GridData();
- findLData.widthHint = 497;
- findLData.heightHint = 130;
- find.setLayoutData(findLData);
- find.setSize(497, 104);
- find.addKeyListener(new KeyAdapter() {
- public void keyPressed(KeyEvent evt) {
- if (evt.character==SWT.CR){
- searchPressed(searchField,videoCheckBox,audioCheckBox,returnNum,tab);
- }
- }
- });
- {
- //searchField
- FormData searchFieldLData = new FormData();
- searchFieldLData.width = 344;
- searchFieldLData.height = 20;
- searchFieldLData.left = new FormAttachment(0,1000,37);
- searchFieldLData.top = new FormAttachment(0,1000,55);
- searchField.setLayoutData(searchFieldLData);
- searchField.setFont(SWTResourceManager.getFont("Times",12,0,false,false));
- searchField.setToolTipText("Keyword");
- searchField.addKeyListener(new KeyAdapter() {
- public void keyPressed(KeyEvent evt) {
- if (evt.character==SWT.CR){
- searchPressed(searchField,videoCheckBox,audioCheckBox,returnNum,tab);
- }
- }
- });
- }
- {
- //findButton
- findButton.setText("Find");
- FormData findButtonLData = new FormData(70,26);
- findButtonLData.width = 70;
- findButtonLData.height = 26;
- findButtonLData.left = new FormAttachment(0,1000,403);
- findButtonLData.top = new FormAttachment(0,1000,52);
- findButton.setLayoutData(findButtonLData);
- findButton.setSize(70, 26);
- findButton.setToolTipText("Find");
- findButton.addSelectionListener(new SelectionAdapter() {
- public void widgetSelected(SelectionEvent evt) {
- add2.setEnabled(false);
- searchPressed(searchField,videoCheckBox,audioCheckBox,returnNum,tab);
- }
- });
- }
- {
- returnNum.setText("");
- FormData returnNumLData = new FormData();
- returnNumLData.width = 63;
- returnNumLData.height = 21;
- returnNumLData.left = new FormAttachment(0, 1000, 410);
- returnNumLData.top = new FormAttachment(0, 1000, 93);
- returnNum.setLayoutData(returnNumLData);
- }
- }
-
- //TODO logo
- private void logo(Group logo){
- FormLayout logoLayout = new FormLayout();
- logo.setLayout(logoLayout);
- GridData logoLData = new GridData();
- logoLData.widthHint = 260;
- logoLData.heightHint = 130;
- logo.setLayoutData(logoLData);
- logoLayout.marginWidth=30;
- logoLayout.marginHeight=0;
- {
- cLabel2 = new CLabel(logo,SWT.NONE);
- cLabel2.setImage(new Image(this.getDisplay(),"img/yalpV2.gif"));
- }
-
-
-
- }
-
-
-
- //TODO resultComposite
- private void resultTable(Composite resultComposite,Table resultTable,int tab){
-
- resultComposite.setVisible(false);
- FormLayout resultCompositeLayout = new FormLayout();
- resultComposite.setLayout(resultCompositeLayout);
- GridData resultCompositeLData = new GridData();
- resultCompositeLData.widthHint = 502;
- if (tab==1)resultCompositeLData.heightHint = 390;
- else resultCompositeLData.heightHint = 380;
- resultComposite.setLayoutData(resultCompositeLData);
- {
- FormData resultTableLData = new FormData();
- resultTableLData.width = 482;
- if (tab==1)resultTableLData.height = 365;
- else resultTableLData.height = 313;
- resultTableLData.left = new FormAttachment(0, 1000, 0);
- resultTableLData.top = new FormAttachment(0, 1000, 7);
- resultTable.setLayoutData(resultTableLData);
- resultTable.setHeaderVisible(true);
- TableColumn id = new TableColumn(resultTable,SWT.RIGHT);
- id.setText("ID");
- id.setWidth(0);
- id.setMoveable(true);
- id.addListener(SWT.Selection, new SortListener(this,resultTable,0,8));
- TableColumn title = new TableColumn(resultTable,SWT.LEFT);
- title.setText("Title");
- title.setWidth(110);
- title.setMoveable(true);
- title.addListener(SWT.Selection, new SortListener(this,resultTable,1,8));
- TableColumn author = new TableColumn(resultTable,SWT.LEFT);
- author.setText("Author");
- author.setWidth(100);
- author.setMoveable(true);
- author.addListener(SWT.Selection, new SortListener(this,resultTable,2,8));
- TableColumn album = new TableColumn(resultTable,SWT.LEFT);
- album.setText("Album");
- album.setWidth(100);
- album.setMoveable(true);
- album.addListener(SWT.Selection, new SortListener(this,resultTable,3,8));
- TableColumn year = new TableColumn(resultTable,SWT.LEFT);
- year.setText("Year");
- year.setWidth(60);
- year.setMoveable(true);
- year.addListener(SWT.Selection, new SortListener(this,resultTable,4,8));
- TableColumn category = new TableColumn(resultTable,SWT.LEFT);
- category.setText("Category");
- category.setWidth(60);
- category.setMoveable(true);
- category.addListener(SWT.Selection, new SortListener(this,resultTable,5,8));
- TableColumn type = new TableColumn(resultTable,SWT.LEFT);
- type.setText("Type");
- type.setWidth(60);
- type.setMoveable(true);
- type.addListener(SWT.Selection, new SortListener(this,resultTable,6,8));
- }
-
- }
- private void saveButtonWidgetSelected(SelectionEvent evt) {
- try{
- int OwnerId = model.getOwnerid(ownerId.getText());
- Media media = new Media();
- media.id = new Integer(id.getText()).intValue();
- media.name = title.getText();
- media.duration = duration.getText();
- media.lastEdit = new Date(System.currentTimeMillis()).toString();
- media.path = path.getText();
- media.fileName = name.getText();
- /* t.b.d.
- author.getText();
- album.getText();
- category.getText();
- year.getText();
- new Integer(aBitrate.getText()).intValue();
- new Integer(vBitrate.getText()).intValue();
- resolution.getText();
- OwnerId;
- */
- if (model.changeMedia(media, Action.EDIT)) {
- int select=resultTable2.getSelectionIndex();
- TableItem item= new TableItem(resultTable2,SWT.NONE,select);
- item.setText(0,new Integer(media.id).toString());
- item.setText(1,media.name);
- /* t.b.d. read from string props
- item.setText(2,media.author.name);
- item.setText(3,media.album);
- item.setText(4,media.year);
- item.setText(5,media.category);
- */
- item.setText(6,model.getTypeName(media.type));
- resultTable2.remove(select+1);
- resultTable2.setSelection(select);
- changeComposite.setVisible(false);
- deleteButton.setVisible(false);
- }
- }catch (Exception e){
- System.out.println("Exception in SaveButton"+e);
- }
- }
-
- private void searchPressed(Text searchField,Button videoCheckBox,Button audioCheckBox,CLabel returnNum,int tab){
- String search = searchField.getText();
- int returnVal;
- ArrayList<MediaType> types = new ArrayList<MediaType>();
-
- if( videoCheckBox.getSelection() )
- types.add(MediaType.VIDEO);
-
- if( audioCheckBox.getSelection() )
- types.add(MediaType.SOUND);
- /* t.b.d. add IMAGE support */
-
- if (tab==1){
- while(resultTable1.getItemCount()!=0){
- resultTable1.remove(0);
- }
- }else{
- while(resultTable2.getItemCount()!=0){
- resultTable2.remove(0);
- }
- }
- returnVal= model.search(search, types, tab);
- ArrayList<Media>resultList = model.getMedia(tab);
- for( int i = 0;
- (resultList != null) && (i < resultList.size());
- i++ )
- {
- TableItem item;
- Media result=resultList.get(i);
- if (tab==1) item=new TableItem(resultTable1,SWT.NONE);
- else item= new TableItem(resultTable2,SWT.NONE);
- item.setText(0,new Integer(result.id).toString());
- item.setText(1,result.name);
- /* t.b.d. add string_props support
- if(result.author != null)
- item.setText(2,result.author);
-
- if(result.album != null)
- item.setText(3,result.album);
-
- if(result.year != null)
- item.setText(4,result.year);
-
- if(result.category != null)
- item.setText(5,result.category);
- */
- if(result.type != null)
- item.setText(6,model.getTypeName(result.type));
-
- }
- if (tab==1){
- if (returnVal==1)returnNum.setText(returnVal+" Media");
- else returnNum.setText(returnVal+" Medias");
- resultComposite.setVisible(true);
- playlistComposite.setVisible(true);
- //bottemComposite.setVisible(true);
- }
- if (tab==2){
- if (returnVal==1)returnNum.setText(returnVal+" Media");
- else returnNum.setText(returnVal+" Medias");
- composite1.setVisible(true);
- }
- }
-
-
- private void deleteButtonWidgetSelected(SelectionEvent evt) {
- try{
- for (int i=resultTable2.getSelectionCount()-1;i>=0;i--){
-
- Media result = model.getMediaWithId(
- new Integer(resultTable2.getSelection()[i].getText(0)).intValue(),2 );
-
- changeComposite.setVisible(false);
- deleteButton.setVisible(false);
- model.changeMedia(result, Action.DELETE);
- resultTable2.remove(resultTable2.getSelectionIndices()[i]);
- }
- }catch (Exception e){
- System.out.println("Exception in DeleteButton "+e);
- }
- }
- private void addButtonWidgetSelected(SelectionEvent evt) {
- System.out.println("browser not implemented in yalp v2");
- }
-
-
- public void refillIpTable(){
- /* t.b.d. replace by session viewer
- try{
- ArrayList<ClientInfo> list=model.srvCon.getClientInfo();
- while(iptable.getItemCount()!=0){
- iptable.remove(0);
- }
- for(ClientInfo info : list){
- TableItem item = new TableItem(iptable,SWT.NONE);
- item.setText(0,info.getUserName());
- item.setText(1,info.getIp());
- }
- }catch(Exception e){System.out.println("geht nicht "+e);}
- */
- }
-
- public void show(){
- ((Shell)this.parent).setImage(new Image(display,"img/yalpV2_klein.gif"));
- ((Shell)this.parent).setText("yalp");
- this.parent.addListener(SWT.Dispose,new org.eclipse.swt.widgets.Listener(){
- public void handleEvent(org.eclipse.swt.widgets.Event e) {
- ShellClose();
- }
- });
- Point size = this.getSize();
- java.awt.Dimension screen = java.awt.Toolkit.getDefaultToolkit().getScreenSize();
- Rectangle shellBounds = this.parent.computeTrim((screen.width-size.x)/2,(screen.height-size.y)/2,size.x,size.y);
- this.parent.setLayout(new FillLayout());
- this.parent.layout();
- this.parent.setBounds(shellBounds);
- ((Shell)this.parent).open();
- while (!this.parent.isDisposed()) {
- if (!display.readAndDispatch())
- display.sleep();
- }
- }
- public void ShellClose(){
- this.model.logoff();
- System.exit(0);
- }
-
-}
-
+/*
+ * Copyright (c) 2006 Manuel Traut and Volker Dahnke
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Common Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/cpl-v10.html
+ *
+ * Contributors: Manuel Traut and Volker Dahnke
+ */
+
+package YalpClients.SwtClient.GUI;
+
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.custom.*;
+import org.eclipse.swt.graphics.*;
+import org.eclipse.swt.layout.*;
+import org.eclipse.swt.widgets.*;
+import org.eclipse.swt.events.*;
+import java.util.*;
+
+import YalpInterfaces.*;
+import YalpClients.SwtClient.*;
+
+/*
+ *
+ * Class GUI
+ *
+ * <em></em>
+ *
+ * @author Volker Dahnke / Manuel Traut
+ *
+ * @version 1 02-04-2006<br>
+ *
+ */
+public class GUI extends org.eclipse.swt.widgets.Composite {
+
+ public Model model;
+ public Composite resultComposite;
+ public Composite playlistComposite;
+ public Composite bottemComposite;
+ public Table resultTable1;
+ public Table resultTable2;
+ public Composite composite1;
+ public Composite changeComposite;
+ public Table UserTable;
+ public Composite composite3;
+
+ private AccessRights userKind;
+ private StyledText styledText1;
+ private CTabFolder cTabFolder1;
+ private CTabItem tab1;
+ private Composite container1;
+ private Composite topComposite;
+ private Group find;
+ private Group logo;
+ private CTabItem tab2;
+ private Composite container2;
+ private Group group1;
+ private Group group2;
+ private CLabel authorLabel;
+ private CLabel titleLabel;
+ private CLabel streamLabel2;
+ private CLabel actualStreamLabel2;
+ private CLabel actualStreamLabel1;
+ private CLabel streamLabel1;
+ private CLabel data2;
+ private CLabel data1;
+ private Button shutdown;
+ private TableColumn ip;
+ private TableColumn userName;
+ public Table iptable;
+ private Composite composite4;
+
+ private Button submitButton;
+ private CLabel adminAddLabel;
+ private CLabel passwdAddLable;
+ private CLabel usernameAddLable;
+ private CLabel realnameAddLabel;
+ private CCombo adminAdd;
+ private Text realnameAdd;
+ private Text passwdAdd;
+ private Text usernameAdd;
+ private Group tab3group5;
+ private Button next;
+ private Button stop;
+ private Button play;
+ private CLabel cLabel2;
+ private Button save;
+ private Text userTableId;
+ private Text passwd;
+ private Text username;
+ private Text userTableName;
+ private CLabel adminLabel;
+ private CCombo adminCombo;
+ private CLabel nameLable;
+ private CLabel passwdLable;
+ private CLabel usernameLable;
+ private CLabel idLable;
+ private Group tab3group4;
+ private Button delete;
+ private Button add1;
+ private Group tab3Group3;
+ private Group tab3Group2;
+ private Group tab3Group1;
+ private Composite container3;
+ private Button deleteButton;
+ private Button addButton;
+ private StyledText status;
+ private Button saveButton;
+ private Text id;
+ private CLabel idLabel;
+ private CLabel cLabel1;
+ private CLabel nameLabel;
+ private CLabel pathLabel;
+ private CLabel lastEditLable;
+ private CLabel ownerIdLabel;
+ private CLabel resolutionLabel;
+ private CLabel vBitrateLabel;
+ private CLabel aBitrateLabel;
+ private CLabel durationLabel;
+ private CLabel yearLabel;
+ private CLabel categoryLabel;
+ private CLabel albumLabel;
+ private CCombo type;
+ private Text name;
+ private Text path;
+ private Text lastEdit;
+ private Text ownerId;
+ private Text resolution;
+ private Text vBitrate;
+ private Text aBitrate;
+ private Text duration;
+ private Text year;
+ private Text category;
+ private Text album;
+ private Text author;
+ private Text title;
+ private Composite composite2;
+ private Table playlistTable;
+ private Button add2;
+ private Button del;
+ private Boolean isNotPlaying=true;
+ private Boolean paused =true;
+ private CTabItem tab3;
+ private Composite parent;
+ private Display display;
+ final Image pauseImage=new Image(this.getDisplay(),"img/pause.gif");
+ final Image playImage=new Image(this.getDisplay(),"img/play.gif");
+ final Image forwardImage=new Image(this.getDisplay(),"img/forward.gif");
+ {
+ //Register as a resource user - SWTResourceManager will
+ //handle the obtaining and disposing of resources
+ SWTResourceManager.registerResourceUser(this);
+ }
+
+ public GUI( Composite parent, Display display, Model model,
+ AccessRights userKind, int style ) {
+
+ super(parent, style);
+
+ this.parent = parent;
+ this.display = display;
+ this.model = model;
+ this.userKind = userKind;
+
+ initGUI();
+ }
+
+ private void initGUI() {
+ try {
+ this.setSize(800, 600);
+ this.setBackground(SWTResourceManager.getColor(192, 192, 192));
+ GridLayout thisLayout = new GridLayout(1, true);
+ thisLayout.marginWidth = 5;
+ thisLayout.marginHeight = 5;
+ thisLayout.numColumns = 1;
+ thisLayout.makeColumnsEqualWidth = true;
+ thisLayout.horizontalSpacing = 5;
+ thisLayout.verticalSpacing = 5;
+ this.setLayout(thisLayout);
+
+ {
+ if (this.userKind.value() == AccessRights._USER){
+ cTabFolder1 = new CTabFolder(this, SWT.NONE);
+ GridData cTabFolder1LData = new GridData();
+ cTabFolder1LData.widthHint = 787;
+ cTabFolder1LData.heightHint = 568;
+ cTabFolder1.setLayoutData(cTabFolder1LData);
+ {
+ tab1 = new CTabItem(cTabFolder1,SWT.NONE);
+ tab1.setText("Find");
+ {
+ container1 = new Composite(cTabFolder1,SWT.NONE);
+ tab1.setControl(container1);
+ RowLayout container1Layout = new RowLayout(org.eclipse.swt.SWT.HORIZONTAL);
+ container1.setLayout(container1Layout);
+ {
+ topComposite = new Composite(container1,SWT.NONE);
+ GridLayout topCompositeLayout = new GridLayout();
+ topCompositeLayout.makeColumnsEqualWidth = true;
+ topCompositeLayout.numColumns = 2;
+ topCompositeLayout.verticalSpacing = 2;
+ topCompositeLayout.horizontalSpacing = 5;
+ topComposite.setLayout(topCompositeLayout);
+ RowData topCompositeLData = new RowData();
+ topCompositeLData.width = 783;
+ topCompositeLData.height = 566;
+ topComposite.setLayoutData(topCompositeLData);
+ {
+ find = new Group(topComposite,SWT.NONE);
+ this.find(find,resultComposite,playlistComposite,bottemComposite,1);
+ }
+ {
+ logo = new Group(topComposite,SWT.NONE);
+ this.logo(logo);
+ }
+ {
+ resultComposite = new Composite(topComposite,SWT.NONE);
+ resultTable1 = new Table(resultComposite,SWT.MULTI|SWT.FULL_SELECTION);
+ resultTable1.setToolTipText("Medias");
+ resultTable1.addSelectionListener(new SelectionAdapter() {
+ public void widgetSelected(SelectionEvent evt) {
+ add2.setEnabled(true);
+ }
+ });
+ this.resultTable(resultComposite,resultTable1,1);
+ }
+ {
+ playlistComposite = new Composite(topComposite,SWT.NONE);
+ FormLayout playlistCompositeLayout = new FormLayout();
+ playlistComposite.setLayout(playlistCompositeLayout);
+ GridData playlistCompositeLData = new GridData();
+ playlistCompositeLData.heightHint = 390;
+ playlistCompositeLData.horizontalAlignment = GridData.FILL;
+ playlistComposite.setLayoutData(playlistCompositeLData);
+ playlistComposite.setVisible(false);
+ playlistComposite.setSize(238, 390);
+ {
+ next = new Button(playlistComposite,SWT.PUSH | SWT.CENTER);
+ FormData nextLData = new FormData();
+ nextLData.width = 45;
+ nextLData.height = 21;
+ nextLData.left = new FormAttachment(0, 1000, 185);
+ nextLData.top = new FormAttachment(0, 1000, 365);
+ next.setLayoutData(nextLData);
+ next.setEnabled(false);
+ next.setFont(SWTResourceManager.getFont("Times", 8, 1, false, false));
+ next.setToolTipText("play next Title");
+ next.setImage(forwardImage);
+ next.addSelectionListener(new SelectionAdapter() {
+ public void widgetSelected(SelectionEvent evt) {
+ model.next();
+ }
+ });
+ }
+ {
+ stop = new Button(playlistComposite,SWT.PUSH | SWT.CENTER);
+ FormData stopLData = new FormData();
+ stopLData.width = 35;
+ stopLData.height = 21;
+ stopLData.left = new FormAttachment(0, 1000, 91);
+ stopLData.top = new FormAttachment(0, 1000, 365);
+ stop.setLayoutData(stopLData);
+ stop.setImage(new Image(this.getDisplay(),"img/stop.gif"));
+ stop.setEnabled(false);
+ stop.setToolTipText("stop");
+ stop.addSelectionListener(new SelectionAdapter() {
+ public void widgetSelected(SelectionEvent evt) {
+ if (model.stop()){
+ play.setEnabled(true);
+ next.setEnabled(false);
+ stop.setEnabled(false);
+ play.setImage(playImage);
+ play.setToolTipText("play");
+ isNotPlaying=true;
+ }
+
+ }
+ });
+ }
+ {
+ play = new Button(playlistComposite,SWT.PUSH | SWT.CENTER);
+ FormData playLData = new FormData();
+ playLData.width = 35;
+ playLData.height = 21;
+ playLData.left = new FormAttachment(0, 1000, 50);
+ playLData.top = new FormAttachment(0, 1000, 365);
+ play.setLayoutData(playLData);
+ play.setImage(playImage);
+ play.setEnabled(false);
+ play.setToolTipText("play");
+ play.addSelectionListener(new SelectionAdapter() {
+ public void widgetSelected(SelectionEvent evt) {
+ stop.setEnabled(true);
+ if (playlistTable.getItemCount()>1)next.setEnabled(true);
+ del.setEnabled(false);
+ //add2.setEnabled(false);
+ if (isNotPlaying){
+ play.setCursor(SWTResourceManager.getCursor(SWT.CURSOR_WAIT));
+ if(model.play()){
+ play.setImage(pauseImage);
+ play.setToolTipText("pause");
+ play.setCursor(SWTResourceManager.getCursor(SWT.NONE));
+ isNotPlaying= false;
+ }else;
+ }else{
+ if(model.pause()){
+ if (paused){
+ play.setImage(playImage);
+ play.setToolTipText("play");
+ paused=false;
+ }else{
+ play.setImage(pauseImage);
+ play.setToolTipText("pause");
+ paused=true;
+ }
+ }else;
+ }
+
+ }
+ });
+ }
+ {
+ add2 = new Button(playlistComposite,SWT.PUSH | SWT.CENTER);
+ FormData addLData = new FormData();
+ addLData.width = 25;
+ addLData.height = 21;
+ addLData.left = new FormAttachment(0, 1000, 2);
+ addLData.top = new FormAttachment(0, 1000, 160);
+ add2.setLayoutData(addLData);
+ add2.setText(">>");
+ add2.setEnabled(false);
+ add2.setToolTipText("add to Playlist");
+ add2.setFont(SWTResourceManager.getFont("Times", 8, 1, false, false));
+ add2.addSelectionListener(new SelectionAdapter() {
+ public void widgetSelected(SelectionEvent evt) {
+ if (System.getProperty("os.name")== "Mac OS X"){
+ for (int i=resultTable1.getSelectionCount()-1;i>=0;i--){
+ int id=new Integer(resultTable1.getSelection()[i].getText(0)).intValue();
+ System.out.println(resultTable1.getSelection()[i].getText(1));
+ model.add2PlayList(id);
+ }
+ }else{
+ for (int i=0;i<resultTable1.getSelectionCount();i++){
+ int id=new Integer(resultTable1.getSelection()[i].getText(0)).intValue();
+ System.out.println(resultTable1.getSelection()[i].getText(1));
+ model.add2PlayList(id);
+ }
+ }
+ while(playlistTable.getItemCount()!=0){
+ playlistTable.remove(0);
+ }
+ ArrayList<Media> playlist=model.getToPlaylist();
+ for(int i=0;i<playlist.size();i++){
+ Media result=playlist.get(i);
+ TableItem item = new TableItem(playlistTable,SWT.NONE);
+ item.setText(0,result.name);
+ item.setText(1,result.duration);
+ }
+ play.setEnabled(true);
+ if (playlistTable.getItemCount()>1&& !isNotPlaying)next.setEnabled(true);
+ }
+ });
+ }
+ {
+ del = new Button(playlistComposite,SWT.PUSH | SWT.CENTER);
+ FormData delLData = new FormData();
+ delLData.width = 25;
+ delLData.height = 21;
+ delLData.left = new FormAttachment(0, 1000, 2);
+ delLData.top = new FormAttachment(0, 1000, 200);
+ del.setLayoutData(delLData);
+ del.setEnabled(false);
+ del.setToolTipText("del from Playlist");
+ del.setText("<<");
+ del.setFont(SWTResourceManager.getFont("Times", 8, 1, false, false));
+ del.addSelectionListener(new SelectionAdapter() {
+ public void widgetSelected(SelectionEvent evt) {
+ for (int i=playlistTable.getSelectionCount()-1;i>=0;i--){
+ int pos = playlistTable.getSelectionIndices()[i];
+ model.removeFromPlayList(pos);
+ }
+
+ del.setEnabled(false);
+ while(playlistTable.getItemCount()!=0){
+ playlistTable.remove(0);
+ }
+ ArrayList<Media> playlist=model.getToPlaylist();
+ for(int i=0;i<playlist.size();i++){
+ Media result=playlist.get(i);
+ TableItem item = new TableItem(playlistTable,SWT.NONE);
+ item.setText(0,result.name);
+ item.setText(1,result.duration);
+ }
+ if (playlistTable.getItemCount()==0)play.setEnabled(false);
+ }
+ });
+ }
+ {
+ playlistTable = new Table(playlistComposite,SWT.MULTI|SWT.FULL_SELECTION);
+ playlistTable.setHeaderVisible(true);
+ FormData playlistTableLData = new FormData();
+ playlistTableLData.width = 184;
+ playlistTableLData.height = 330;
+ playlistTableLData.top = new FormAttachment(24, 1000, 0);
+ playlistTableLData.left = new FormAttachment(0, 1000, 38);
+ playlistTable.setLayoutData(playlistTableLData);
+ playlistTable.setToolTipText("Playlist");
+ playlistTable.addSelectionListener(new SelectionAdapter() {
+ public void widgetSelected(SelectionEvent evt) {
+ if (isNotPlaying)del.setEnabled(true);
+ }
+ });
+ TableColumn title = new TableColumn(playlistTable,SWT.LEFT);
+ title.setText("Title");
+ title.setWidth(120);
+ title.setMoveable(true);
+ TableColumn duration = new TableColumn(playlistTable,SWT.RIGHT);
+ duration.setText("Duration");
+ duration.setWidth(80);
+ duration.setMoveable(true);
+ }
+ }
+ }
+ /*{
+ bottemComposite = new Composite(container1,SWT.NONE);
+ bottemComposite.setVisible(false);
+ GridLayout bottemCompositeLayout = new GridLayout();
+ bottemCompositeLayout.makeColumnsEqualWidth = true;
+ bottemCompositeLayout.verticalSpacing = 2;
+ bottemCompositeLayout.horizontalSpacing = 5;
+ bottemComposite.setLayout(bottemCompositeLayout);
+ RowData bottemCompositeLData = new RowData();
+ bottemCompositeLData.width = 777;
+ bottemCompositeLData.height = 68;
+ bottemComposite.setLayoutData(bottemCompositeLData);
+ {
+ styledText1 = new StyledText(bottemComposite,SWT.NONE);
+ GridData styledText1LData = new GridData();
+ styledText1LData.widthHint = 765;
+ styledText1LData.heightHint = 55;
+ styledText1.setLayoutData(styledText1LData);
+ styledText1.setText("styledText1");
+ styledText1.setSize(765, 55);
+ }
+ }*/
+ }
+ }
+ {
+ tab2 = new CTabItem(cTabFolder1,SWT.NONE);
+ tab2.setText("Change");
+ {
+ container2 = new Composite(cTabFolder1,SWT.NONE);
+ GridLayout container2Layout = new GridLayout();
+ container2Layout.makeColumnsEqualWidth = true;
+ container2.setLayout(container2Layout);
+ tab2.setControl(container2);
+ container2.setVisible(false);
+ {
+ composite2 = new Composite(container2,SWT.NONE);
+ GridLayout composite2Layout = new GridLayout();
+ composite2Layout.makeColumnsEqualWidth = true;
+ composite2Layout.numColumns=2;
+ composite2.setLayout(composite2Layout);
+ GridData composite2LData = new GridData();
+ composite2LData.widthHint = 780;
+ composite2LData.heightHint = 497;
+ composite2.setLayoutData(composite2LData);
+ {
+ group1 = new Group(composite2,SWT.NONE);
+ this.find(group1,group2,composite1,changeComposite,2);
+ }
+ {
+ group2 = new Group(composite2,SWT.NONE);
+ this.logo(group2);
+ }
+ {
+ composite1 = new Composite(composite2,SWT.NONE);
+ {
+ resultTable2 = new Table(composite1,SWT.MULTI|SWT.FULL_SELECTION);
+ resultTable2.setToolTipText("Medias");
+ resultTable2.addSelectionListener(new SelectionAdapter() {
+ public void widgetSelected(SelectionEvent evt) {
+ if(resultTable2.getSelectionCount()<2){
+ int identity =new Integer(resultTable2.getSelection()[0].getText()).intValue();
+ Media result = model.getMediaWithId(identity,2);
+ if (result!=null){
+ id.setText(new Integer(result.id).toString());
+ title.setText(result.name);
+ /* t.b.d. parse from string props
+ author.setText(result.author);
+ album.setText(result.album);
+ category.setText(result.category);
+ year.setText(result.year);
+ */
+ duration.setText(result.duration);
+ /*
+ aBitrate.setText(new Integer(result.aBitrate).toString());
+ vBitrate.setText(new Integer(result.vBitrate).toString());
+ resolution.setText(result.resolution);
+ */
+ ownerId.setText(result.owner.name);
+ lastEdit.setText(result.lastEdit);
+ path.setText(result.path);
+ name.setText(result.name);
+ String _type = model.getTypeName(result.type);
+ type.setText(_type);
+ changeComposite.setVisible(true);
+ deleteButton.setVisible(true);
+ }
+ }else changeComposite.setVisible(false);
+ }
+ });
+ this.resultTable(composite1,resultTable2,2);
+ }
+ }
+ {
+ changeComposite = new Composite(composite2,SWT.NONE);
+ FormLayout changeCompositeLayout = new FormLayout();
+ changeComposite.setLayout(changeCompositeLayout);
+ GridData changeCompositeLData = new GridData();
+ changeCompositeLData.widthHint = 238;
+ changeCompositeLData.heightHint = 357;
+ changeCompositeLData.verticalAlignment = GridData.BEGINNING;
+ changeComposite.setLayoutData(changeCompositeLData);
+ changeComposite.setVisible(false);
+ {
+ saveButton = new Button(changeComposite,SWT.PUSH | SWT.CENTER);
+ saveButton.setText("Save");
+ FormData saveButtonLData = new FormData();
+ saveButtonLData.width = 40;
+ saveButtonLData.height = 21;
+ saveButtonLData.left = new FormAttachment(0, 1000, 30);
+ saveButtonLData.top = new FormAttachment(0, 1000, 315);
+ saveButton.setLayoutData(saveButtonLData);
+ saveButton.setToolTipText("save Changes");
+ saveButton.addSelectionListener(new SelectionAdapter() {
+ public void widgetSelected(SelectionEvent evt) {
+ saveButtonWidgetSelected(evt);
+ }
+ });
+ }
+ {
+ id = new Text(changeComposite,SWT.NONE);
+ FormData idLData = new FormData();
+ idLData.width = 124;
+ idLData.height = 14;
+ idLData.left = new FormAttachment(0, 1000, 100);
+ idLData.top = new FormAttachment(0, 1000, 10);
+ id.setLayoutData(idLData);
+ id.setEditable(false);
+ }
+ {
+ idLabel = new CLabel(changeComposite,SWT.NONE);
+ idLabel.setText("Id:");
+ FormData idLabelLData = new FormData();
+ idLabelLData.width = 60;
+ idLabelLData.height = 21;
+ idLabelLData.left = new FormAttachment(0, 1000, 20);
+ idLabelLData.top = new FormAttachment(0, 1000, 5);
+ idLabel.setLayoutData(idLabelLData);
+ }
+ {
+ cLabel1 = new CLabel(changeComposite,SWT.NONE);
+ cLabel1.setText("Type:");
+ FormData cLabel1LData = new FormData();
+ cLabel1LData.width = 60;
+ cLabel1LData.height = 21;
+ cLabel1LData.left = new FormAttachment(0, 1000, 20);
+ cLabel1LData.top = new FormAttachment(0, 1000, 285);
+ cLabel1.setLayoutData(cLabel1LData);
+ }
+ {
+ nameLabel = new CLabel(changeComposite,SWT.NONE);
+ nameLabel.setText("Name:");
+ FormData nameLabelLData = new FormData();
+ nameLabelLData.width = 60;
+ nameLabelLData.height = 21;
+ nameLabelLData.left = new FormAttachment(0, 1000, 20);
+ nameLabelLData.top = new FormAttachment(0, 1000, 265);
+ nameLabel.setLayoutData(nameLabelLData);
+ }
+ {
+ pathLabel = new CLabel(changeComposite,SWT.NONE);
+ pathLabel.setText("Path:");
+ FormData pathLabelLData = new FormData();
+ pathLabelLData.width = 60;
+ pathLabelLData.height = 21;
+ pathLabelLData.left = new FormAttachment(0, 1000, 20);
+ pathLabelLData.top = new FormAttachment(0, 1000, 245);
+ pathLabel.setLayoutData(pathLabelLData);
+ }
+ {
+ lastEditLable = new CLabel(changeComposite,SWT.NONE);
+ lastEditLable.setText("Last Edit:");
+ FormData lastEditLableLData = new FormData();
+ lastEditLableLData.width = 60;
+ lastEditLableLData.height = 21;
+ lastEditLableLData.left = new FormAttachment(0, 1000, 20);
+ lastEditLableLData.top = new FormAttachment(0, 1000, 225);
+ lastEditLable.setLayoutData(lastEditLableLData);
+ }
+ {
+ ownerIdLabel = new CLabel(changeComposite,SWT.NONE);
+ ownerIdLabel.setText("Owner:");
+ FormData ownerIdLabelLData = new FormData();
+ ownerIdLabelLData.width = 60;
+ ownerIdLabelLData.height = 21;
+ ownerIdLabelLData.left = new FormAttachment(0, 1000, 20);
+ ownerIdLabelLData.top = new FormAttachment(0, 1000, 205);
+ ownerIdLabel.setLayoutData(ownerIdLabelLData);
+ }
+ {
+ resolutionLabel = new CLabel(changeComposite,SWT.NONE);
+ resolutionLabel.setText("Resolution:");
+ FormData resolutionLabelLData = new FormData();
+ resolutionLabelLData.width = 60;
+ resolutionLabelLData.height = 21;
+ resolutionLabelLData.left = new FormAttachment(0, 1000, 20);
+ resolutionLabelLData.top = new FormAttachment(0, 1000, 185);
+ resolutionLabel.setLayoutData(resolutionLabelLData);
+ }
+ {
+ vBitrateLabel = new CLabel(changeComposite,SWT.NONE);
+ vBitrateLabel.setText("V-Bitrate:");
+ FormData vBitrateLabelLData = new FormData();
+ vBitrateLabelLData.width = 60;
+ vBitrateLabelLData.height = 21;
+ vBitrateLabelLData.left = new FormAttachment(0, 1000, 20);
+ vBitrateLabelLData.top = new FormAttachment(0, 1000, 165);
+ vBitrateLabel.setLayoutData(vBitrateLabelLData);
+ }
+ {
+ aBitrateLabel = new CLabel(changeComposite,SWT.NONE);
+ aBitrateLabel.setText("A-Bitrate:");
+ FormData aBitrateLabelLData = new FormData();
+ aBitrateLabelLData.width = 60;
+ aBitrateLabelLData.height = 21;
+ aBitrateLabelLData.left = new FormAttachment(0, 1000, 20);
+ aBitrateLabelLData.top = new FormAttachment(0, 1000, 145);
+ aBitrateLabel.setLayoutData(aBitrateLabelLData);
+ }
+ {
+ durationLabel = new CLabel(changeComposite,SWT.NONE);
+ durationLabel.setText("Duration:");
+ FormData durationLabelLData = new FormData();
+ durationLabelLData.width = 60;
+ durationLabelLData.height = 21;
+ durationLabelLData.left = new FormAttachment(0, 1000, 20);
+ durationLabelLData.top = new FormAttachment(0, 1000, 125);
+ durationLabel.setLayoutData(durationLabelLData);
+ }
+ {
+ yearLabel = new CLabel(changeComposite,SWT.NONE);
+ yearLabel.setText("Year:");
+ FormData yearLabelLData = new FormData();
+ yearLabelLData.width = 60;
+ yearLabelLData.height = 21;
+ yearLabelLData.left = new FormAttachment(0, 1000, 20);
+ yearLabelLData.top = new FormAttachment(0, 1000, 105);
+ yearLabel.setLayoutData(yearLabelLData);
+ }
+ {
+ categoryLabel = new CLabel(changeComposite,SWT.NONE);
+ categoryLabel.setText("Category:");
+ FormData categoryLabelLData = new FormData();
+ categoryLabelLData.width = 60;
+ categoryLabelLData.height = 21;
+ categoryLabelLData.left = new FormAttachment(0, 1000, 20);
+ categoryLabelLData.top = new FormAttachment(0, 1000, 85);
+ categoryLabel.setLayoutData(categoryLabelLData);
+ }
+ {
+ albumLabel = new CLabel(changeComposite,SWT.NONE);
+ albumLabel.setText("Album");
+ FormData albumLabelLData = new FormData();
+ albumLabelLData.width = 60;
+ albumLabelLData.height = 21;
+ albumLabelLData.left = new FormAttachment(0, 1000, 20);
+ albumLabelLData.top = new FormAttachment(0, 1000, 65);
+ albumLabel.setLayoutData(albumLabelLData);
+ }
+ {
+ authorLabel = new CLabel(changeComposite,SWT.NONE);
+ authorLabel.setText("Author:");
+ FormData authorLabelLData = new FormData();
+ authorLabelLData.width = 60;
+ authorLabelLData.height = 21;
+ authorLabelLData.left = new FormAttachment(0, 1000, 20);
+ authorLabelLData.top = new FormAttachment(0, 1000, 45);
+ authorLabel.setLayoutData(authorLabelLData);
+ }
+ {
+ titleLabel = new CLabel(changeComposite,SWT.NONE);
+ titleLabel.setText("Title:");
+ FormData cLabel1LData1 = new FormData();
+ cLabel1LData1.width = 60;
+ cLabel1LData1.height = 21;
+ cLabel1LData1.left = new FormAttachment(0, 1000, 20);
+ cLabel1LData1.top = new FormAttachment(0, 1000, 25);
+ titleLabel.setLayoutData(cLabel1LData1);
+ }
+ {
+ type = new CCombo(changeComposite,SWT.NONE);
+ FormData typeLData = new FormData();
+ typeLData.width = 111;
+ typeLData.height = 16;
+ typeLData.left = new FormAttachment(0, 1000, 100);
+ typeLData.top = new FormAttachment(0, 1000, 290);
+ type.setLayoutData(typeLData);
+ type.setCursor(SWTResourceManager.getCursor(SWT.CURSOR_HAND));
+ {
+ type.add("audio");
+ type.add("video");
+ }
+ }
+ {
+ name = new Text(changeComposite,SWT.NONE);
+ FormData nameLData = new FormData();
+ nameLData.width = 124;
+ nameLData.height = 14;
+ nameLData.left = new FormAttachment(0, 1000, 100);
+ nameLData.top = new FormAttachment(0, 1000, 270);
+ name.setLayoutData(nameLData);
+ name.setEditable(false);
+ }
+ {
+ path = new Text(changeComposite,SWT.NONE);
+ FormData pathLData = new FormData();
+ pathLData.width = 124;
+ pathLData.height = 14;
+ pathLData.left = new FormAttachment(0, 1000, 100);
+ pathLData.top = new FormAttachment(0, 1000, 250);
+ path.setLayoutData(pathLData);
+ path.setEditable(false);
+ }
+ {
+ lastEdit = new Text(changeComposite,SWT.NONE);
+ FormData lastEditLData = new FormData();
+ lastEditLData.width = 124;
+ lastEditLData.height = 14;
+ lastEditLData.left = new FormAttachment(0, 1000, 100);
+ lastEditLData.top = new FormAttachment(0, 1000, 230);
+ lastEdit.setLayoutData(lastEditLData);
+ lastEdit.setEditable(false);
+ }
+ {
+ ownerId = new Text(changeComposite,SWT.NONE);
+ FormData ownerIdLData = new FormData();
+ ownerIdLData.width = 124;
+ ownerIdLData.height = 14;
+ ownerIdLData.left = new FormAttachment(0, 1000, 100);
+ ownerIdLData.top = new FormAttachment(0, 1000, 210);
+ ownerId.setLayoutData(ownerIdLData);
+ ownerId.setEditable(false);
+ }
+ {
+ resolution = new Text(changeComposite,SWT.NONE);
+ FormData resolutionLData = new FormData();
+ resolutionLData.width = 124;
+ resolutionLData.height = 14;
+ resolutionLData.left = new FormAttachment(0, 1000, 100);
+ resolutionLData.top = new FormAttachment(0, 1000, 190);
+ resolution.setLayoutData(resolutionLData);
+ }
+ {
+ vBitrate = new Text(changeComposite,SWT.NONE);
+ FormData vBitrateLData = new FormData();
+ vBitrateLData.width = 124;
+ vBitrateLData.height = 14;
+ vBitrateLData.left = new FormAttachment(0, 1000, 100);
+ vBitrateLData.top = new FormAttachment(0, 1000, 170);
+ vBitrate.setLayoutData(vBitrateLData);
+ }
+ {
+ aBitrate = new Text(changeComposite,SWT.NONE);
+ FormData aBitrateLData = new FormData();
+ aBitrateLData.width = 124;
+ aBitrateLData.height = 14;
+ aBitrateLData.left = new FormAttachment(0, 1000, 100);
+ aBitrateLData.top = new FormAttachment(0, 1000, 150);
+ aBitrate.setLayoutData(aBitrateLData);
+ }
+ {
+ duration = new Text(changeComposite,SWT.NONE);
+ FormData durationLData = new FormData();
+ durationLData.width = 124;
+ durationLData.height = 14;
+ durationLData.left = new FormAttachment(0, 1000, 100);
+ durationLData.top = new FormAttachment(0, 1000, 130);
+ duration.setLayoutData(durationLData);
+ }
+ {
+ year = new Text(changeComposite,SWT.NONE);
+ FormData yearLData = new FormData();
+ yearLData.width = 124;
+ yearLData.height = 14;
+ yearLData.left = new FormAttachment(0, 1000, 100);
+ yearLData.top = new FormAttachment(0, 1000, 110);
+ year.setLayoutData(yearLData);
+ }
+ {
+ category = new Text(changeComposite,SWT.NONE);
+ FormData categoryLData = new FormData();
+ categoryLData.width = 124;
+ categoryLData.height = 14;
+ categoryLData.left = new FormAttachment(0, 1000, 100);
+ categoryLData.top = new FormAttachment(0, 1000, 90);
+ category.setLayoutData(categoryLData);
+ category.setCursor(SWTResourceManager.getCursor(SWT.CURSOR_WAIT));
+ }
+ {
+ album = new Text(changeComposite,SWT.NONE);
+ FormData albumLData = new FormData();
+ albumLData.width = 124;
+ albumLData.height = 14;
+ albumLData.left = new FormAttachment(0, 1000, 100);
+ albumLData.top = new FormAttachment(0, 1000, 70);
+ album.setLayoutData(albumLData);
+ }
+ {
+ author = new Text(changeComposite,SWT.NONE);
+ FormData authorLData = new FormData();
+ authorLData.width = 124;
+ authorLData.height = 14;
+ authorLData.left = new FormAttachment(0, 1000, 100);
+ authorLData.top = new FormAttachment(0, 1000, 50);
+ author.setLayoutData(authorLData);
+ }
+ {
+ title = new Text(changeComposite,SWT.NONE);
+ FormData titleLData = new FormData();
+ titleLData.width = 124;
+ titleLData.height = 13;
+ titleLData.top = new FormAttachment(0, 1000, 30);
+ titleLData.left = new FormAttachment(0, 1000, 100);
+ title.setLayoutData(titleLData);
+ }
+ }
+ }
+ {
+ composite3 = new Composite(container2,SWT.NONE);
+ FormLayout composite3Layout = new FormLayout();
+ composite3.setLayout(composite3Layout);
+ GridData composite3LData = new GridData();
+ composite3LData.widthHint = 777;
+ composite3LData.heightHint = 58;
+ composite3.setLayoutData(composite3LData);
+ {
+ deleteButton = new Button(composite3,SWT.PUSH | SWT.CENTER);
+ deleteButton.setText("Delete");
+ deleteButton.setVisible(false);
+ FormData deleteButtonLData = new FormData();
+ deleteButtonLData.width = 150;
+ deleteButtonLData.height = 30;
+ deleteButtonLData.left = new FormAttachment(0, 1000, 470);
+ deleteButtonLData.top = new FormAttachment(0, 1000, 15);
+ deleteButton.setLayoutData(deleteButtonLData);
+ deleteButton.setToolTipText("delete File from Database");
+ deleteButton.addSelectionListener(new SelectionAdapter() {
+ public void widgetSelected(SelectionEvent evt) {
+ deleteButtonWidgetSelected(evt);
+ }
+ });
+ }
+ {
+ addButton = new Button(composite3,SWT.PUSH | SWT.CENTER);
+ addButton.setText("Add");
+ FormData addButtonLData = new FormData();
+ addButtonLData.width = 150;
+ addButtonLData.height = 30;
+ addButtonLData.left = new FormAttachment(0, 1000, 160);
+ addButtonLData.top = new FormAttachment(0, 1000, 15);
+ addButton.setLayoutData(addButtonLData);
+ addButton.setToolTipText("add new Files to Database");
+ addButton.addSelectionListener(new SelectionAdapter() {
+ public void widgetSelected(SelectionEvent evt) {
+ addButtonWidgetSelected(evt);
+ }
+ });
+ }
+ }
+ }
+ }
+ {
+ tab3 = new CTabItem(cTabFolder1,SWT.NONE);
+ tab3.setText("Server");
+ {
+ container3 = new Composite(cTabFolder1,SWT.NONE);
+ GridLayout container3Layout = new GridLayout();
+ container3Layout.makeColumnsEqualWidth = true;
+ container3Layout.numColumns=2;
+ container3Layout.verticalSpacing = 0;
+ container3Layout.horizontalSpacing = 5;
+ container3.setLayout(container3Layout);
+ tab3.setControl(container3);
+ {
+ tab3Group1 = new Group(container3,SWT.NONE);
+ FormLayout tab3Group1Layout = new FormLayout();
+ tab3Group1.setLayout(tab3Group1Layout);
+ GridData tab3Group1LData = new GridData();
+ tab3Group1LData.widthHint = 500;
+ tab3Group1LData.heightHint = 129;
+ tab3Group1LData.horizontalAlignment = GridData.CENTER;
+ tab3Group1.setLayoutData(tab3Group1LData);
+ {
+ composite4 = new Composite(tab3Group1, SWT.NONE);
+ FormLayout composite4Layout = new FormLayout();
+ composite4.setLayout(composite4Layout);
+ FormData composite4LData = new FormData();
+ composite4LData.width = 504;
+ composite4LData.height = 140;
+ composite4LData.left = new FormAttachment(0, 1000, -3);
+ composite4LData.top = new FormAttachment(0, 1000, -6);
+ composite4.setLayoutData(composite4LData);
+ {
+ actualStreamLabel2 = new CLabel(
+ composite4,
+ SWT.NONE);
+ FormData actualStreamLabel2LData = new FormData();
+ actualStreamLabel2LData.width = 98;
+ actualStreamLabel2LData.height = 21;
+ actualStreamLabel2LData.left = new FormAttachment(0, 1000, 180);
+ actualStreamLabel2LData.top = new FormAttachment(0, 1000, 65);
+ actualStreamLabel2.setLayoutData(actualStreamLabel2LData);
+ actualStreamLabel2.setFont(SWTResourceManager.getFont("Times", 8, 1, false, false));
+ }
+ {
+ actualStreamLabel1 = new CLabel(
+ composite4,
+ SWT.NONE);
+ actualStreamLabel1.setText("Actual Number of Streams:");
+ FormData actualStreamLabel1LData = new FormData();
+ actualStreamLabel1LData.width = 160;
+ actualStreamLabel1LData.height = 21;
+ actualStreamLabel1LData.left = new FormAttachment(0, 1000, 14);
+ actualStreamLabel1LData.top = new FormAttachment(0, 1000, 65);
+ actualStreamLabel1.setLayoutData(actualStreamLabel1LData);
+ actualStreamLabel1.setFont(SWTResourceManager.getFont("Times", 8, 1, false, false));
+ }
+ {
+ streamLabel2 = new CLabel(
+ composite4,
+ SWT.None);
+ FormData streamLabel2LData = new FormData();
+ streamLabel2LData.width = 98;
+ streamLabel2LData.height = 21;
+ streamLabel2LData.left = new FormAttachment(0, 1000, 180);
+ streamLabel2LData.top = new FormAttachment(0, 1000, 40);
+ streamLabel2.setLayoutData(streamLabel2LData);
+ streamLabel2.setFont(SWTResourceManager.getFont("Times", 8, 1, false, false));
+ }
+ {
+ streamLabel1 = new CLabel(
+ composite4,
+ SWT.NONE);
+ streamLabel1.setText("Total Number of Streams:");
+ FormData streamLabel1LData = new FormData();
+ streamLabel1LData.width = 150;
+ streamLabel1LData.height = 21;
+ streamLabel1LData.left = new FormAttachment(0, 1000, 14);
+ streamLabel1LData.top = new FormAttachment(0, 1000, 40);
+ streamLabel1.setLayoutData(streamLabel1LData);
+ streamLabel1.setFont(SWTResourceManager.getFont("Times", 8, 1, false, false));
+ }
+ {
+ data2 = new CLabel(composite4, SWT.NONE);
+ FormData data2LData = new FormData();
+ data2LData.width = 98;
+ data2LData.height = 21;
+ data2LData.left = new FormAttachment(0, 1000, 180);
+ data2LData.top = new FormAttachment(0, 1000, 15);
+ data2.setLayoutData(data2LData);
+ data2.setFont(SWTResourceManager.getFont("Times", 8, 1, false, false));
+ }
+ {
+ data1 = new CLabel(composite4, SWT.NONE);
+ data1.setText("Total Data in Database:");
+ FormData data1LData = new FormData();
+ data1LData.width = 150;
+ data1LData.height = 21;
+ data1LData.left = new FormAttachment(0, 1000, 14);
+ data1LData.top = new FormAttachment(0, 1000, 15);
+ data1.setLayoutData(data1LData);
+ data1.setFont(SWTResourceManager.getFont("Times", 8, 1, false, false));
+ }
+ {
+ shutdown = new Button(composite4, SWT.PUSH
+ | SWT.CENTER);
+ shutdown.setText("Shutdown");
+ FormData shutdownLData = new FormData();
+ shutdownLData.width = 77;
+ shutdownLData.height = 21;
+ shutdownLData.left = new FormAttachment(0, 1000, 35);
+ shutdownLData.top = new FormAttachment(0, 1000, 105);
+ shutdown.setLayoutData(shutdownLData);
+ shutdown.setToolTipText("Server shutdown");
+ shutdown.addSelectionListener(new SelectionAdapter() {
+ public void widgetSelected(SelectionEvent evt) {
+ model.serverShutdown();
+ }
+ });
+ }
+ {
+ iptable = new Table(composite4, SWT.SINGLE);
+ FormData iptableLData = new FormData();
+ iptableLData.width = 173;
+ iptableLData.height = 110;
+ iptableLData.left = new FormAttachment(0, 1000, 308);
+ iptableLData.top = new FormAttachment(0, 1000, 7);
+ iptable.setLayoutData(iptableLData);
+ iptable.setHeaderVisible(true);
+ iptable.setToolTipText("User online");
+ {
+ userName = new TableColumn(
+ iptable,
+ SWT.CENTER);
+ userName.setText("Username");
+ userName.setWidth(70);
+ }
+ {
+ ip = new TableColumn(iptable, SWT.BEGINNING);
+ ip.setText("Ip");
+ ip.setWidth(119);
+ }
+ final int time = 1000;
+ final Runnable timer = new Runnable() {
+ public void run() {
+ refillIpTable();
+ data2.setText("not supported in yalp2");
+ streamLabel2.setText( /*new Integer(model.getAllStreamNum()).toString() */ "not supported in yalp2");
+ display.timerExec(time, this);
+ actualStreamLabel2.setText( /*new Integer(model.getActualStreamNum()).toString()*/ "not supported in yalp2");
+ }
+ };
+ display.timerExec(time, timer);
+ }
+ }
+ }
+ {
+ tab3Group2 = new Group(container3,SWT.NONE);
+ this.logo(tab3Group2);
+ }
+ {
+ tab3Group3 = new Group(container3,SWT.NONE);
+ FormLayout tab3Group3Layout = new FormLayout();
+ tab3Group3.setLayout(tab3Group3Layout);
+ GridData tab3Group3LData = new GridData();
+ tab3Group3LData.widthHint = 500;
+ tab3Group3LData.heightHint = 284;
+ tab3Group3LData.horizontalAlignment = GridData.CENTER;
+ tab3Group3.setLayoutData(tab3Group3LData);
+ tab3Group3.setText("User Management");
+ {
+ delete = new Button(tab3Group3,SWT.PUSH | SWT.CENTER);
+ delete.setText("Delete");
+ FormData deleteLData = new FormData();
+ deleteLData.width = 45;
+ deleteLData.height = 21;
+ deleteLData.left = new FormAttachment(0, 1000, 447);
+ deleteLData.top = new FormAttachment(0, 1000, 254);
+ delete.setLayoutData(deleteLData);
+ delete.setToolTipText("delete User");
+ delete.addSelectionListener(new SelectionAdapter() {
+ public void widgetSelected(SelectionEvent evt) {
+ YalpUser toChange = new YalpUser();
+ toChange.id = new Integer(userTableId.getText()).intValue();
+ toChange.name = username.getText();
+ model.changeUser(toChange, passwd.getText(), Action.DELETE);
+ while(UserTable.getItemCount()!=0){
+ UserTable.remove(0);
+ }
+ ArrayList<YalpUser> resultList = model.getUser();
+ for (int i = 0; i < resultList.size(); i++) {
+ TableItem item;
+ YalpUser result = resultList.get(i);
+ item = new TableItem(UserTable,SWT.NONE);
+ item.setText(0,new Integer(result.id).toString());
+ item.setText(1,result.name);
+ // item.setText(2,result.password);
+ item.setText(3,result.realName);
+ item.setText(4,model.accessRightsName(result.level));
+ }
+ tab3group4.setVisible(false);
+ }
+ });
+ }
+ {
+ add1 = new Button(tab3Group3,SWT.PUSH | SWT.CENTER);
+ add1.setText("Add");
+ FormData addLData = new FormData();
+ addLData.width = 45;
+ addLData.height = 21;
+ addLData.left = new FormAttachment(0, 1000, 7);
+ addLData.top = new FormAttachment(0, 1000, 254);
+ add1.setLayoutData(addLData);
+ add1.setToolTipText("add new User ");
+ add1.addSelectionListener(new SelectionAdapter() {
+ public void widgetSelected(SelectionEvent evt) {
+ tab3group5.setVisible(true);
+ }
+ });
+ }
+ {
+ UserTable = new Table(tab3Group3,SWT.SINGLE|SWT.FULL_SELECTION);
+ FormData UserTableLData = new FormData();
+ UserTableLData.width = 467;
+ UserTableLData.height = 224;
+ UserTableLData.left = new FormAttachment(11, 1000, 0);
+ UserTableLData.right = new FormAttachment(988, 1000, 0);
+ UserTableLData.top = new FormAttachment(19, 1000, 0);
+ UserTableLData.bottom = new FormAttachment(864, 1000, 0);
+ UserTable.setLayoutData(UserTableLData);
+ UserTable.setHeaderVisible(true);
+ UserTable.setToolTipText("registrated User");
+ UserTable.addSelectionListener(new SelectionAdapter() {
+ public void widgetSelected(SelectionEvent evt) {
+ userTableId.setText(UserTable.getSelection()[0].getText(0));
+ username.setText(UserTable.getSelection()[0].getText(1));
+ passwd.setText(UserTable.getSelection()[0].getText(2));
+ userTableName.setText(UserTable.getSelection()[0].getText(3));
+ adminCombo.setText(UserTable.getSelection()[0].getText(4));
+ tab3group4.setVisible(true);
+ }
+ });
+ {
+ TableColumn id = new TableColumn(UserTable,SWT.BEGINNING);
+ id.setText("ID");
+ id.setWidth(45);
+ id.setMoveable(true);
+ id.addListener(SWT.Selection, new SortListener(this,UserTable,0,5));
+ TableColumn userName = new TableColumn(UserTable,SWT.BEGINNING);
+ userName.setMoveable(true);
+ userName.setText("Username");
+ userName.setWidth(120);
+ userName.addListener(SWT.Selection, new SortListener(this,UserTable,1,5));
+ TableColumn passwd = new TableColumn(UserTable,SWT.BEGINNING);
+ passwd.setMoveable(true);
+ passwd.setText("Password");
+ passwd.setWidth(120);
+ passwd.addListener(SWT.Selection, new SortListener(this,UserTable,2,5));
+ TableColumn name = new TableColumn(UserTable,SWT.BEGINNING);
+ name.setMoveable(true);
+ name.setText("Name");
+ name.setWidth(130);
+ name.addListener(SWT.Selection, new SortListener(this,UserTable,3,5));
+ TableColumn admin = new TableColumn(UserTable,SWT.BEGINNING);
+ admin.setMoveable(true);
+ admin.setText("Admin");
+ admin.setWidth(74);
+ admin.addListener(SWT.Selection, new SortListener(this,UserTable,4,5));
+ //TableColumn huhu=new TableColumn(UserTable,SWT.BEGINNING);
+ //huhu.dispose();
+ ArrayList<YalpUser> resultList = model.getUser();
+ for (int i = 0; i < resultList.size(); i++) {
+ TableItem item;
+ YalpUser result = resultList.get(i);
+ item = new TableItem(UserTable,SWT.NONE);
+ item.setText(0,new Integer(result.id).toString());
+ item.setText(1,result.name);
+ //item.setText(2,result.passwd);
+ item.setText(3,result.realName);
+ item.setText(4,model.accessRightsName(result.level));
+ }
+ }
+ }
+ }
+ {
+ tab3group4 = new Group(container3,SWT.NONE);
+ FormLayout tab3group4Layout = new FormLayout();
+ tab3group4.setLayout(tab3group4Layout);
+ tab3group4.setText("Edit User");
+ GridData tab3group4LData = new GridData();
+ tab3group4LData.widthHint = 256;
+ tab3group4LData.heightHint = 284;
+ tab3group4.setLayoutData(tab3group4LData);
+ tab3group4.setVisible(false);
+ {
+ save = new Button(tab3group4,SWT.PUSH | SWT.CENTER);
+ save.setText("save");
+ FormData saveLData = new FormData();
+ saveLData.width = 45;
+ saveLData.height = 21;
+ saveLData.left = new FormAttachment(0, 1000, 42);
+ saveLData.top = new FormAttachment(0, 1000, 157);
+ save.setLayoutData(saveLData);
+ save.setToolTipText("save Changes");
+ save.addSelectionListener(new SelectionAdapter() {
+ public void widgetSelected(SelectionEvent evt) {
+ YalpUser toChange = new YalpUser();
+ toChange.id = new Integer(userTableId.getText()).intValue();
+ toChange.name = username.getText();
+ model.changeUser(toChange, passwd.getText(), Action.EDIT);
+ while(UserTable.getItemCount()!=0){
+ UserTable.remove(0);
+ }
+ ArrayList<YalpUser> resultList = model.getUser();
+ for (int i = 0; i < resultList.size(); i++) {
+ TableItem item;
+ YalpUser result = resultList.get(i);
+ item = new TableItem(UserTable,SWT.NONE);
+ item.setText(0,new Integer(result.id).toString());
+ item.setText(1,result.name);
+ //item.setText(2,result.passwd);
+ item.setText(3,result.realName);
+ item.setText(4,model.accessRightsName(result.level));
+ }
+ tab3group4.setVisible(false);
+ }
+ });
+ }
+ {
+ userTableName = new Text(tab3group4,SWT.NONE);
+ FormData text2LData = new FormData();
+ text2LData.width = 94;
+ text2LData.height = 14;
+ text2LData.left = new FormAttachment(0, 1000, 117);
+ text2LData.top = new FormAttachment(0, 1000, 112);
+ userTableName .setLayoutData(text2LData);
+ }
+ {
+ passwd = new Text(tab3group4,SWT.NONE);
+ FormData passwdLData = new FormData();
+ passwdLData.width = 94;
+ passwdLData.height = 14;
+ passwdLData.left = new FormAttachment(0, 1000, 117);
+ passwdLData.top = new FormAttachment(0, 1000, 92);
+ passwd.setLayoutData(passwdLData);
+ }
+ {
+ username = new Text(tab3group4,SWT.NONE);
+ FormData usernameLData = new FormData();
+ usernameLData.width = 94;
+ usernameLData.height = 14;
+ usernameLData.left = new FormAttachment(0, 1000, 117);
+ usernameLData.top = new FormAttachment(0, 1000, 72);
+ username.setLayoutData(usernameLData);
+ }
+ {
+ userTableId = new Text(tab3group4,SWT.NONE);
+ FormData text1LData = new FormData();
+ text1LData.width = 94;
+ text1LData.height = 14;
+ text1LData.left = new FormAttachment(0, 1000, 117);
+ text1LData.top = new FormAttachment(0, 1000, 52);
+ userTableId.setLayoutData(text1LData);
+ userTableId.setEditable(false);
+ }
+ {
+ adminLabel = new CLabel(tab3group4,SWT.NONE);
+ adminLabel.setText("Admin:");
+ FormData adminLabelLData = new FormData();
+ adminLabelLData.width = 42;
+ adminLabelLData.height = 21;
+ adminLabelLData.left = new FormAttachment(0, 1000, 27);
+ adminLabelLData.top = new FormAttachment(0, 1000, 127);
+ adminLabel.setLayoutData(adminLabelLData);
+ }
+ {
+ idLable = new CLabel(tab3group4,SWT.NONE);
+ idLable.setText("Id:");
+ FormData idLableLData = new FormData();
+ idLableLData.width = 20;
+ idLableLData.height = 21;
+ idLableLData.left = new FormAttachment(107, 1000, 0);
+ idLableLData.right = new FormAttachment(185, 1000, 0);
+ idLableLData.top = new FormAttachment(167, 1000, 0);
+ idLableLData.bottom = new FormAttachment(241, 1000, 0);
+ idLable.setLayoutData(idLableLData);
+ }
+ {
+ usernameLable = new CLabel(tab3group4,SWT.NONE);
+ usernameLable.setText("Username:");
+ FormData usernameLableLData = new FormData();
+ usernameLableLData.width = 58;
+ usernameLableLData.height = 21;
+ usernameLableLData.left = new FormAttachment(107, 1000, 0);
+ usernameLableLData.right = new FormAttachment(333, 1000, 0);
+ usernameLableLData.top = new FormAttachment(237, 1000, 0);
+ usernameLableLData.bottom = new FormAttachment(311, 1000, 0);
+ usernameLable.setLayoutData(usernameLableLData);
+ }
+ {
+ passwdLable = new CLabel(tab3group4,SWT.NONE);
+ passwdLable.setText("Password:");
+ FormData passwdLableLData = new FormData();
+ passwdLableLData.width = 56;
+ passwdLableLData.height = 21;
+ passwdLableLData.left = new FormAttachment(107, 1000, 0);
+ passwdLableLData.right = new FormAttachment(326, 1000, 0);
+ passwdLableLData.top = new FormAttachment(308, 1000, 0);
+ passwdLableLData.bottom = new FormAttachment(382, 1000, 0);
+ passwdLable.setLayoutData(passwdLableLData);
+ }
+ {
+ nameLable = new CLabel(tab3group4,SWT.NONE);
+ nameLable.setText("Name:");
+ FormData nameLableLData = new FormData();
+ nameLableLData.width = 37;
+ nameLableLData.height = 21;
+ nameLableLData.left = new FormAttachment(107, 1000, 0);
+ nameLableLData.right = new FormAttachment(251, 1000, 0);
+ nameLableLData.top = new FormAttachment(378, 1000, 0);
+ nameLableLData.bottom = new FormAttachment(452, 1000, 0);
+ nameLable.setLayoutData(nameLableLData);
+ }
+ {
+ adminCombo = new CCombo(tab3group4,SWT.NONE);
+ FormData adminComboLData = new FormData();
+ adminComboLData.width = 81;
+ adminComboLData.height = 16;
+ adminComboLData.left = new FormAttachment(458, 1000, 0);
+ adminComboLData.right = new FormAttachment(849, 1000, 0);
+ adminComboLData.top = new FormAttachment(466, 1000, 0);
+ adminComboLData.bottom = new FormAttachment(522, 1000, 0);
+ adminCombo.setLayoutData(adminComboLData);
+ {
+ adminCombo.add("true");
+ adminCombo.add("false");
+ }
+ }
+ }
+ tab3group5 = new Group(container3,SWT.NONE);
+ FormLayout tab3group5Layout = new FormLayout();
+ tab3group5.setLayout(tab3group5Layout);
+ GridData tab3group5LData = new GridData();
+ tab3group5LData.widthHint = 500;
+ tab3group5LData.heightHint = 99;
+ tab3group5.setLayoutData(tab3group5LData);
+ tab3group5.setText("Add User");
+ tab3group5.setVisible(false);
+ {
+ submitButton = new Button(tab3group5,SWT.PUSH | SWT.CENTER);
+ submitButton.setText("Submit");
+ FormData submitButtonLData = new FormData();
+ submitButtonLData.width = 50;
+ submitButtonLData.height = 21;
+ submitButtonLData.left = new FormAttachment(0, 1000, 382);
+ submitButtonLData.top = new FormAttachment(0, 1000, 52);
+ submitButton.setLayoutData(submitButtonLData);
+ submitButton.setToolTipText("add User");
+ submitButton.addSelectionListener(new SelectionAdapter() {
+ public void widgetSelected(SelectionEvent evt) {
+ System.out.println("submit");
+ YalpUser toChange = new YalpUser();
+ toChange.id = 100;
+ toChange.name = usernameAdd.getText();
+ toChange.realName = realnameAdd.getText();
+ model.changeUser(toChange, passwdAdd.getText(), Action.CREATE);
+ while(UserTable.getItemCount()!=0){
+ UserTable.remove(0);
+ }
+ ArrayList<YalpUser> resultList = model.getUser();
+ for (int i = 0; i < resultList.size(); i++) {
+ TableItem item;
+ YalpUser result = resultList.get(i);
+ item = new TableItem(UserTable,SWT.NONE);
+ item.setText(0,new Integer(result.id).toString());
+ item.setText(1,result.name);
+ //item.setText(2,result.passwd);
+ item.setText(3,result.realName);
+ item.setText(4,model.accessRightsName(result.level));
+ }
+ }
+ });
+ }
+ {
+ adminAddLabel = new CLabel(tab3group5,SWT.NONE);
+ adminAddLabel.setText("Admin:");
+ FormData adminAddLabelLData = new FormData();
+ adminAddLabelLData.width = 40;
+ adminAddLabelLData.height = 21;
+ adminAddLabelLData.left = new FormAttachment(0, 1000, 291);
+ adminAddLabelLData.top = new FormAttachment(0, 1000, 17);
+ adminAddLabel.setLayoutData(adminAddLabelLData);
+ }
+ {
+ passwdAddLable = new CLabel(tab3group5,SWT.NONE);
+ passwdAddLable.setText("Password:");
+ FormData passwdAddLableLData = new FormData();
+ passwdAddLableLData.width = 60;
+ passwdAddLableLData.height = 21;
+ passwdAddLableLData.left = new FormAttachment(0, 1000, 17);
+ passwdAddLableLData.top = new FormAttachment(0, 1000, 57);
+ passwdAddLable.setLayoutData(passwdAddLableLData);
+ }
+ {
+ usernameAddLable = new CLabel(tab3group5,SWT.NONE);
+ usernameAddLable.setText("Username:");
+ FormData usernameAddLableLData = new FormData();
+ usernameAddLableLData.width = 60;
+ usernameAddLableLData.height = 21;
+ usernameAddLableLData.left = new FormAttachment(0, 1000, 17);
+ usernameAddLableLData.top = new FormAttachment(0, 1000, 37);
+ usernameAddLable.setLayoutData(usernameAddLableLData);
+ }
+ {
+ realnameAddLabel = new CLabel(tab3group5,SWT.NONE);
+ realnameAddLabel.setText("Name:");
+ FormData realnameAddLabelLData = new FormData();
+ realnameAddLabelLData.width = 60;
+ realnameAddLabelLData.height = 21;
+ realnameAddLabelLData.left = new FormAttachment(0, 1000, 17);
+ realnameAddLabelLData.top = new FormAttachment(0, 1000, 17);
+ realnameAddLabel.setLayoutData(realnameAddLabelLData);
+ }
+ {
+ adminAdd = new CCombo(tab3group5,SWT.NONE);
+ FormData adminAddLData = new FormData();
+ adminAddLData.width = 65;
+ adminAddLData.height = 12;
+ adminAddLData.left = new FormAttachment(0, 1000, 347);
+ adminAddLData.top = new FormAttachment(0, 1000, 22);
+ adminAdd.setLayoutData(adminAddLData);
+ adminAdd.setText("false");
+ {
+ adminAdd.add("false");
+ adminAdd.add("true");
+ }
+ }
+ {
+ realnameAdd = new Text(tab3group5,SWT.NONE);
+ FormData realnameAddLData = new FormData();
+ realnameAddLData.width = 174;
+ realnameAddLData.height = 14;
+ realnameAddLData.left = new FormAttachment(0, 1000, 82);
+ realnameAddLData.top = new FormAttachment(0, 1000, 22);
+ realnameAdd.setLayoutData(realnameAddLData);
+ }
+ {
+ usernameAdd = new Text(tab3group5,SWT.NONE);
+ FormData usernameAddLData = new FormData();
+ usernameAddLData.width = 174;
+ usernameAddLData.height = 13;
+ usernameAddLData.left = new FormAttachment(165, 1000, 0);
+ usernameAddLData.right = new FormAttachment(525, 1000, 0);
+ usernameAddLData.top = new FormAttachment(429, 1000, 0);
+ usernameAddLData.bottom = new FormAttachment(560, 1000, 0);
+ usernameAdd.setLayoutData(usernameAddLData);
+ }
+ {
+ FormData PasswdAddLData = new FormData();
+ PasswdAddLData.width = 174;
+ PasswdAddLData.height = 13;
+ PasswdAddLData.left = new FormAttachment(165, 1000, 0);
+ PasswdAddLData.right = new FormAttachment(525, 1000, 0);
+ PasswdAddLData.top = new FormAttachment(631, 1000, 0);
+ PasswdAddLData.bottom = new FormAttachment(762, 1000, 0);
+ passwdAdd = new Text(tab3group5,SWT.NONE);
+ passwdAdd.setLayoutData(PasswdAddLData);
+ }
+ }
+ }
+ cTabFolder1.setSelection(0);
+ }
+ else{
+ GridData testLData = new GridData();
+ testLData.widthHint = 792;
+ testLData.heightHint = 590;
+ Composite simpelUser = new Composite(this, SWT.NONE);
+ RowLayout testLayout = new RowLayout(org.eclipse.swt.SWT.HORIZONTAL);
+ simpelUser.setLayout(testLayout);
+ simpelUser.setLayoutData(testLData);
+ {
+ topComposite = new Composite(simpelUser,SWT.NONE);
+ GridLayout topCompositeLayout = new GridLayout();
+ topCompositeLayout.makeColumnsEqualWidth = true;
+ topCompositeLayout.numColumns = 2;
+ topCompositeLayout.verticalSpacing = 2;
+ topCompositeLayout.horizontalSpacing = 5;
+ topComposite.setLayout(topCompositeLayout);
+ RowData topCompositeLData = new RowData();
+ topCompositeLData.width = 783;
+ topCompositeLData.height = 566;
+ topComposite.setLayoutData(topCompositeLData);
+ {
+ find = new Group(topComposite,SWT.NONE);
+ this.find(find,resultComposite,playlistComposite,bottemComposite,1);
+ }
+ {
+ logo = new Group(topComposite,SWT.NONE);
+ this.logo(logo);
+ }
+ {
+ resultComposite = new Composite(topComposite,SWT.NONE);
+ resultTable1 = new Table(resultComposite,SWT.MULTI|SWT.FULL_SELECTION);
+ resultTable1.setToolTipText("Medias");
+ resultTable1.addSelectionListener(new SelectionAdapter() {
+ public void widgetSelected(SelectionEvent evt) {
+ add2.setEnabled(true);
+ }
+ });
+ this.resultTable(resultComposite,resultTable1,1);
+ }
+ {
+ playlistComposite = new Composite(topComposite,SWT.NONE);
+ FormLayout playlistCompositeLayout = new FormLayout();
+ playlistComposite.setLayout(playlistCompositeLayout);
+ GridData playlistCompositeLData = new GridData();
+ playlistCompositeLData.heightHint = 390;
+ playlistCompositeLData.horizontalAlignment = GridData.FILL;
+ playlistComposite.setLayoutData(playlistCompositeLData);
+ playlistComposite.setVisible(false);
+ playlistComposite.setSize(238, 390);
+ {
+ next = new Button(playlistComposite,SWT.PUSH | SWT.CENTER);
+ FormData nextLData = new FormData();
+ nextLData.width = 45;
+ nextLData.height = 21;
+ nextLData.left = new FormAttachment(0, 1000, 185);
+ nextLData.top = new FormAttachment(0, 1000, 365);
+ next.setLayoutData(nextLData);
+ next.setEnabled(false);
+ next.setFont(SWTResourceManager.getFont("Times", 8, 1, false, false));
+ next.setToolTipText("play next Title");
+ next.setImage(forwardImage);
+ next.addSelectionListener(new SelectionAdapter() {
+ public void widgetSelected(SelectionEvent evt) {
+ model.next();
+ }
+ });
+ }
+ {
+ stop = new Button(playlistComposite,SWT.PUSH | SWT.CENTER);
+ FormData stopLData = new FormData();
+ stopLData.width = 35;
+ stopLData.height = 21;
+ stopLData.left = new FormAttachment(0, 1000, 91);
+ stopLData.top = new FormAttachment(0, 1000, 365);
+ stop.setLayoutData(stopLData);
+ stop.setImage(new Image(this.getDisplay(),"img/stop.gif"));
+ stop.setEnabled(false);
+ stop.setToolTipText("stop");
+ stop.addSelectionListener(new SelectionAdapter() {
+ public void widgetSelected(SelectionEvent evt) {
+ if (model.stop()){
+ play.setEnabled(true);
+ next.setEnabled(false);
+ stop.setEnabled(false);
+ play.setImage(playImage);
+ play.setToolTipText("play");
+ isNotPlaying=true;
+ }
+
+ }
+ });
+ }
+ {
+ play = new Button(playlistComposite,SWT.PUSH | SWT.CENTER);
+ FormData playLData = new FormData();
+ playLData.width = 35;
+ playLData.height = 21;
+ playLData.left = new FormAttachment(0, 1000, 50);
+ playLData.top = new FormAttachment(0, 1000, 365);
+ play.setLayoutData(playLData);
+ play.setImage(playImage);
+ play.setEnabled(false);
+ play.setToolTipText("play");
+ play.addSelectionListener(new SelectionAdapter() {
+ public void widgetSelected(SelectionEvent evt) {
+ stop.setEnabled(true);
+ if (playlistTable.getItemCount()>1)next.setEnabled(true);
+ del.setEnabled(false);
+ //add2.setEnabled(false);
+ if (isNotPlaying){
+ play.setCursor(SWTResourceManager.getCursor(SWT.CURSOR_WAIT));
+ if(model.play()){
+ play.setImage(pauseImage);
+ play.setToolTipText("pause");
+ play.setCursor(SWTResourceManager.getCursor(SWT.NONE));
+ isNotPlaying= false;
+ }else;
+ }else{
+ if(model.pause()){
+ if (paused){
+ play.setImage(playImage);
+ play.setToolTipText("play");
+ paused=false;
+ }else{
+ play.setImage(pauseImage);
+ play.setToolTipText("pause");
+ paused=true;
+ }
+ }else;
+ }
+
+ }
+ });
+ }
+ {
+ add2 = new Button(playlistComposite,SWT.PUSH | SWT.CENTER);
+ FormData addLData = new FormData();
+ addLData.width = 25;
+ addLData.height = 21;
+ addLData.left = new FormAttachment(0, 1000, 2);
+ addLData.top = new FormAttachment(0, 1000, 160);
+ add2.setLayoutData(addLData);
+ add2.setText(">>");
+ add2.setEnabled(false);
+ add2.setToolTipText("add to Playlist");
+ add2.setFont(SWTResourceManager.getFont("Times", 8, 1, false, false));
+ add2.addSelectionListener(new SelectionAdapter() {
+ public void widgetSelected(SelectionEvent evt) {
+ if (System.getProperty("os.name")== "Mac OS X"){
+ for (int i=resultTable1.getSelectionCount()-1;i>=0;i--){
+ int id=new Integer(resultTable1.getSelection()[i].getText(0)).intValue();
+ System.out.println(resultTable1.getSelection()[i].getText(1));
+ model.add2PlayList(id);
+ }
+ }else{
+ for (int i=0;i<resultTable1.getSelectionCount();i++){
+ int id=new Integer(resultTable1.getSelection()[i].getText(0)).intValue();
+ System.out.println(resultTable1.getSelection()[i].getText(1));
+ model.add2PlayList(id);
+ }
+ }
+ while(playlistTable.getItemCount()!=0){
+ playlistTable.remove(0);
+ }
+ ArrayList<Media> playlist=model.getToPlaylist();
+ for(int i=0;i<playlist.size();i++){
+ Media result=playlist.get(i);
+ TableItem item = new TableItem(playlistTable,SWT.NONE);
+ item.setText(0,result.name);
+ item.setText(1,result.duration);
+ }
+ play.setEnabled(true);
+ if (playlistTable.getItemCount()>1&& !isNotPlaying)next.setEnabled(true);
+ }
+ });
+ }
+ {
+ del = new Button(playlistComposite,SWT.PUSH | SWT.CENTER);
+ FormData delLData = new FormData();
+ delLData.width = 25;
+ delLData.height = 21;
+ delLData.left = new FormAttachment(0, 1000, 2);
+ delLData.top = new FormAttachment(0, 1000, 200);
+ del.setLayoutData(delLData);
+ del.setEnabled(false);
+ del.setToolTipText("del from Playlist");
+ del.setText("<<");
+ del.setFont(SWTResourceManager.getFont("Times", 8, 1, false, false));
+ del.addSelectionListener(new SelectionAdapter() {
+ public void widgetSelected(SelectionEvent evt) {
+ for (int i=playlistTable.getSelectionCount()-1;i>=0;i--){
+ int pos = playlistTable.getSelectionIndices()[i];
+ model.removeFromPlayList(pos);
+ }
+
+ del.setEnabled(false);
+ while(playlistTable.getItemCount()!=0){
+ playlistTable.remove(0);
+ }
+ ArrayList<Media> playlist=model.getToPlaylist();
+ for(int i=0;i<playlist.size();i++){
+ Media result=playlist.get(i);
+ TableItem item = new TableItem(playlistTable,SWT.NONE);
+ item.setText(0,result.name);
+ item.setText(1,result.duration);
+ }
+ if (playlistTable.getItemCount()==0)play.setEnabled(false);
+ }
+ });
+ }
+ {
+ playlistTable = new Table(playlistComposite,SWT.MULTI|SWT.FULL_SELECTION);
+ playlistTable.setHeaderVisible(true);
+ FormData playlistTableLData = new FormData();
+ playlistTableLData.width = 184;
+ playlistTableLData.height = 330;
+ playlistTableLData.top = new FormAttachment(24, 1000, 0);
+ playlistTableLData.left = new FormAttachment(0, 1000, 38);
+ playlistTable.setLayoutData(playlistTableLData);
+ playlistTable.setToolTipText("Playlist");
+ playlistTable.addSelectionListener(new SelectionAdapter() {
+ public void widgetSelected(SelectionEvent evt) {
+ if (isNotPlaying)del.setEnabled(true);
+ }
+ });
+ TableColumn title = new TableColumn(playlistTable,SWT.LEFT);
+ title.setText("Title");
+ title.setWidth(120);
+ title.setMoveable(true);
+ TableColumn duration = new TableColumn(playlistTable,SWT.RIGHT);
+ duration.setText("Duration");
+ duration.setWidth(80);
+ duration.setMoveable(true);
+ }
+ }
+ }
+ }
+ }
+ this.layout();
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+ }
+
+ //TODO:start find
+ private void find(Group find,Composite resultComposite, Composite playlistComposite,Composite bottemComposite,int _tab){
+ final Text searchField = new Text(find,SWT.NONE);
+ final Button findButton = new Button(find,SWT.PUSH | SWT.CENTER);
+ final Button allCheckBox = new Button(find,SWT.RADIO | SWT.LEFT);
+ final Button videoCheckBox = new Button(find,SWT.RADIO | SWT.LEFT);
+ final Button audioCheckBox = new Button(find,SWT.RADIO | SWT.LEFT);
+ final CLabel returnNum= new CLabel(find, SWT.NONE);
+ final int tab=_tab;
+ {
+ cLabel2 = new CLabel(find, SWT.NONE);
+ if (tab==1)cLabel2.setText("find and stream mutimedia files");
+ else cLabel2.setText("find and manage mutimedia files");
+ FormData cLabel2LData = new FormData();
+ cLabel2LData.width = 250;
+ cLabel2LData.height = 21;
+ cLabel2LData.left = new FormAttachment(0,1000,46);
+ cLabel2LData.top = new FormAttachment(0,1000,13);
+ cLabel2.setLayoutData(cLabel2LData);
+ }
+ {
+
+ FormData allCheckBoxLData = new FormData();
+ allCheckBoxLData.left = new FormAttachment(0, 1000, 95);
+ allCheckBoxLData.top = new FormAttachment(0, 1000, 98);
+ allCheckBoxLData.width = 56;
+ allCheckBoxLData.height = 14;
+ allCheckBox.setLayoutData(allCheckBoxLData);
+ allCheckBox.setText("All");
+ allCheckBox.setSelection(true);
+ allCheckBox.setToolTipText("Find Audio and Video Files");
+ allCheckBox.addKeyListener(new KeyAdapter() {
+ public void keyPressed(KeyEvent evt) {
+ if (evt.character == SWT.CR) {
+ searchPressed(
+ searchField,
+ videoCheckBox,
+ audioCheckBox,
+ returnNum,
+ tab);
+ }
+ }
+ });
+ }
+ {
+
+ FormData audioCheckBoxLData = new FormData();
+ audioCheckBoxLData.left = new FormAttachment(0, 1000, 195);
+ audioCheckBoxLData.top = new FormAttachment(0, 1000, 98);
+ audioCheckBoxLData.width = 56;
+ audioCheckBoxLData.height = 14;
+ audioCheckBox.setLayoutData(audioCheckBoxLData);
+ audioCheckBox.setText("Audio");
+ audioCheckBox.setToolTipText("Find Audio Files");
+ audioCheckBox
+ .addKeyListener(new KeyAdapter() {
+ public void keyPressed(KeyEvent evt) {
+ if (evt.character == SWT.CR) {
+ searchPressed(
+ searchField,
+ videoCheckBox,
+ audioCheckBox,
+ returnNum,
+ tab);
+ }
+ }
+ });
+ }
+ {
+
+ FormData videoCheckBoxLData = new FormData();
+ videoCheckBoxLData.left = new FormAttachment(0, 1000, 296);
+ videoCheckBoxLData.top = new FormAttachment(0, 1000, 98);
+ videoCheckBoxLData.width = 56;
+ videoCheckBoxLData.height = 14;
+ videoCheckBox.setLayoutData(videoCheckBoxLData);
+ videoCheckBox.setText("Video");
+ videoCheckBox.setToolTipText("Find Video Files");
+ videoCheckBox
+ .addKeyListener(new KeyAdapter() {
+ public void keyPressed(KeyEvent evt) {
+ if (evt.character == SWT.CR) {
+ searchPressed(
+ searchField,
+ videoCheckBox,
+ audioCheckBox,
+ returnNum,
+ tab);
+ }
+ }
+ });
+ }
+
+
+ FormLayout findLayout = new FormLayout();
+ find.setLayout(findLayout);
+ GridData findLData = new GridData();
+ findLData.widthHint = 497;
+ findLData.heightHint = 130;
+ find.setLayoutData(findLData);
+ find.setSize(497, 104);
+ find.addKeyListener(new KeyAdapter() {
+ public void keyPressed(KeyEvent evt) {
+ if (evt.character==SWT.CR){
+ searchPressed(searchField,videoCheckBox,audioCheckBox,returnNum,tab);
+ }
+ }
+ });
+ {
+ //searchField
+ FormData searchFieldLData = new FormData();
+ searchFieldLData.width = 344;
+ searchFieldLData.height = 20;
+ searchFieldLData.left = new FormAttachment(0,1000,37);
+ searchFieldLData.top = new FormAttachment(0,1000,55);
+ searchField.setLayoutData(searchFieldLData);
+ searchField.setFont(SWTResourceManager.getFont("Times",12,0,false,false));
+ searchField.setToolTipText("Keyword");
+ searchField.addKeyListener(new KeyAdapter() {
+ public void keyPressed(KeyEvent evt) {
+ if (evt.character==SWT.CR){
+ searchPressed(searchField,videoCheckBox,audioCheckBox,returnNum,tab);
+ }
+ }
+ });
+ }
+ {
+ //findButton
+ findButton.setText("Find");
+ FormData findButtonLData = new FormData(70,26);
+ findButtonLData.width = 70;
+ findButtonLData.height = 26;
+ findButtonLData.left = new FormAttachment(0,1000,403);
+ findButtonLData.top = new FormAttachment(0,1000,52);
+ findButton.setLayoutData(findButtonLData);
+ findButton.setSize(70, 26);
+ findButton.setToolTipText("Find");
+ findButton.addSelectionListener(new SelectionAdapter() {
+ public void widgetSelected(SelectionEvent evt) {
+ add2.setEnabled(false);
+ searchPressed(searchField,videoCheckBox,audioCheckBox,returnNum,tab);
+ }
+ });
+ }
+ {
+ returnNum.setText("");
+ FormData returnNumLData = new FormData();
+ returnNumLData.width = 63;
+ returnNumLData.height = 21;
+ returnNumLData.left = new FormAttachment(0, 1000, 410);
+ returnNumLData.top = new FormAttachment(0, 1000, 93);
+ returnNum.setLayoutData(returnNumLData);
+ }
+ }
+
+ //TODO logo
+ private void logo(Group logo){
+ FormLayout logoLayout = new FormLayout();
+ logo.setLayout(logoLayout);
+ GridData logoLData = new GridData();
+ logoLData.widthHint = 260;
+ logoLData.heightHint = 130;
+ logo.setLayoutData(logoLData);
+ logoLayout.marginWidth=30;
+ logoLayout.marginHeight=0;
+ {
+ cLabel2 = new CLabel(logo,SWT.NONE);
+ cLabel2.setImage(new Image(this.getDisplay(),"img/yalpV2.gif"));
+ }
+
+
+
+ }
+
+
+
+ //TODO resultComposite
+ private void resultTable(Composite resultComposite,Table resultTable,int tab){
+
+ resultComposite.setVisible(false);
+ FormLayout resultCompositeLayout = new FormLayout();
+ resultComposite.setLayout(resultCompositeLayout);
+ GridData resultCompositeLData = new GridData();
+ resultCompositeLData.widthHint = 502;
+ if (tab==1)resultCompositeLData.heightHint = 390;
+ else resultCompositeLData.heightHint = 380;
+ resultComposite.setLayoutData(resultCompositeLData);
+ {
+ FormData resultTableLData = new FormData();
+ resultTableLData.width = 482;
+ if (tab==1)resultTableLData.height = 365;
+ else resultTableLData.height = 313;
+ resultTableLData.left = new FormAttachment(0, 1000, 0);
+ resultTableLData.top = new FormAttachment(0, 1000, 7);
+ resultTable.setLayoutData(resultTableLData);
+ resultTable.setHeaderVisible(true);
+ TableColumn id = new TableColumn(resultTable,SWT.RIGHT);
+ id.setText("ID");
+ id.setWidth(0);
+ id.setMoveable(true);
+ id.addListener(SWT.Selection, new SortListener(this,resultTable,0,8));
+ TableColumn title = new TableColumn(resultTable,SWT.LEFT);
+ title.setText("Title");
+ title.setWidth(110);
+ title.setMoveable(true);
+ title.addListener(SWT.Selection, new SortListener(this,resultTable,1,8));
+ TableColumn author = new TableColumn(resultTable,SWT.LEFT);
+ author.setText("Author");
+ author.setWidth(100);
+ author.setMoveable(true);
+ author.addListener(SWT.Selection, new SortListener(this,resultTable,2,8));
+ TableColumn album = new TableColumn(resultTable,SWT.LEFT);
+ album.setText("Album");
+ album.setWidth(100);
+ album.setMoveable(true);
+ album.addListener(SWT.Selection, new SortListener(this,resultTable,3,8));
+ TableColumn year = new TableColumn(resultTable,SWT.LEFT);
+ year.setText("Year");
+ year.setWidth(60);
+ year.setMoveable(true);
+ year.addListener(SWT.Selection, new SortListener(this,resultTable,4,8));
+ TableColumn category = new TableColumn(resultTable,SWT.LEFT);
+ category.setText("Category");
+ category.setWidth(60);
+ category.setMoveable(true);
+ category.addListener(SWT.Selection, new SortListener(this,resultTable,5,8));
+ TableColumn type = new TableColumn(resultTable,SWT.LEFT);
+ type.setText("Type");
+ type.setWidth(60);
+ type.setMoveable(true);
+ type.addListener(SWT.Selection, new SortListener(this,resultTable,6,8));
+ }
+
+ }
+ private void saveButtonWidgetSelected(SelectionEvent evt) {
+ try{
+ int OwnerId = model.getOwnerid(ownerId.getText());
+ Media media = new Media();
+ media.id = new Integer(id.getText()).intValue();
+ media.name = title.getText();
+ media.duration = duration.getText();
+ media.lastEdit = new Date(System.currentTimeMillis()).toString();
+ media.path = path.getText();
+ media.fileName = name.getText();
+ /* t.b.d.
+ author.getText();
+ album.getText();
+ category.getText();
+ year.getText();
+ new Integer(aBitrate.getText()).intValue();
+ new Integer(vBitrate.getText()).intValue();
+ resolution.getText();
+ OwnerId;
+ */
+ if (model.changeMedia(media, Action.EDIT)) {
+ int select=resultTable2.getSelectionIndex();
+ TableItem item= new TableItem(resultTable2,SWT.NONE,select);
+ item.setText(0,new Integer(media.id).toString());
+ item.setText(1,media.name);
+ /* t.b.d. read from string props
+ item.setText(2,media.author.name);
+ item.setText(3,media.album);
+ item.setText(4,media.year);
+ item.setText(5,media.category);
+ */
+ item.setText(6,model.getTypeName(media.type));
+ resultTable2.remove(select+1);
+ resultTable2.setSelection(select);
+ changeComposite.setVisible(false);
+ deleteButton.setVisible(false);
+ }
+ }catch (Exception e){
+ System.out.println("Exception in SaveButton"+e);
+ }
+ }
+
+ private void searchPressed(Text searchField,Button videoCheckBox,Button audioCheckBox,CLabel returnNum,int tab){
+ String search = searchField.getText();
+ int returnVal;
+ ArrayList<MediaType> types = new ArrayList<MediaType>();
+
+ if( videoCheckBox.getSelection() )
+ types.add(MediaType.VIDEO);
+
+ if( audioCheckBox.getSelection() )
+ types.add(MediaType.SOUND);
+ /* t.b.d. add IMAGE support */
+
+ if (tab==1){
+ while(resultTable1.getItemCount()!=0){
+ resultTable1.remove(0);
+ }
+ }else{
+ while(resultTable2.getItemCount()!=0){
+ resultTable2.remove(0);
+ }
+ }
+ returnVal= model.search(search, types, tab);
+ ArrayList<Media>resultList = model.getMedia(tab);
+ for( int i = 0;
+ (resultList != null) && (i < resultList.size());
+ i++ )
+ {
+ TableItem item;
+ Media result=resultList.get(i);
+ if (tab==1) item=new TableItem(resultTable1,SWT.NONE);
+ else item= new TableItem(resultTable2,SWT.NONE);
+ item.setText(0,new Integer(result.id).toString());
+ item.setText(1,result.name);
+ /* t.b.d. add string_props support
+ if(result.author != null)
+ item.setText(2,result.author);
+
+ if(result.album != null)
+ item.setText(3,result.album);
+
+ if(result.year != null)
+ item.setText(4,result.year);
+
+ if(result.category != null)
+ item.setText(5,result.category);
+ */
+ if(result.type != null)
+ item.setText(6,model.getTypeName(result.type));
+
+ }
+ if (tab==1){
+ if (returnVal==1)returnNum.setText(returnVal+" Media");
+ else returnNum.setText(returnVal+" Medias");
+ resultComposite.setVisible(true);
+ playlistComposite.setVisible(true);
+ //bottemComposite.setVisible(true);
+ }
+ if (tab==2){
+ if (returnVal==1)returnNum.setText(returnVal+" Media");
+ else returnNum.setText(returnVal+" Medias");
+ composite1.setVisible(true);
+ }
+ }
+
+
+ private void deleteButtonWidgetSelected(SelectionEvent evt) {
+ try{
+ for (int i=resultTable2.getSelectionCount()-1;i>=0;i--){
+
+ Media result = model.getMediaWithId(
+ new Integer(resultTable2.getSelection()[i].getText(0)).intValue(),2 );
+
+ changeComposite.setVisible(false);
+ deleteButton.setVisible(false);
+ model.changeMedia(result, Action.DELETE);
+ resultTable2.remove(resultTable2.getSelectionIndices()[i]);
+ }
+ }catch (Exception e){
+ System.out.println("Exception in DeleteButton "+e);
+ }
+ }
+ private void addButtonWidgetSelected(SelectionEvent evt) {
+ System.out.println("browser not implemented in yalp v2");
+ }
+
+
+ public void refillIpTable(){
+ /* t.b.d. replace by session viewer
+ try{
+ ArrayList<ClientInfo> list=model.srvCon.getClientInfo();
+ while(iptable.getItemCount()!=0){
+ iptable.remove(0);
+ }
+ for(ClientInfo info : list){
+ TableItem item = new TableItem(iptable,SWT.NONE);
+ item.setText(0,info.getUserName());
+ item.setText(1,info.getIp());
+ }
+ }catch(Exception e){System.out.println("geht nicht "+e);}
+ */
+ }
+
+ public void show(){
+ ((Shell)this.parent).setImage(new Image(display,"img/yalpV2_klein.gif"));
+ ((Shell)this.parent).setText("yalp");
+ this.parent.addListener(SWT.Dispose,new org.eclipse.swt.widgets.Listener(){
+ public void handleEvent(org.eclipse.swt.widgets.Event e) {
+ ShellClose();
+ }
+ });
+ Point size = this.getSize();
+ java.awt.Dimension screen = java.awt.Toolkit.getDefaultToolkit().getScreenSize();
+ Rectangle shellBounds = this.parent.computeTrim((screen.width-size.x)/2,(screen.height-size.y)/2,size.x,size.y);
+ this.parent.setLayout(new FillLayout());
+ this.parent.layout();
+ this.parent.setBounds(shellBounds);
+ ((Shell)this.parent).open();
+ while (!this.parent.isDisposed()) {
+ if (!display.readAndDispatch())
+ display.sleep();
+ }
+ }
+ public void ShellClose(){
+ this.model.logoff();
+ System.exit(0);
+ }
+
+}
+
diff --git a/src/YalpClients/SwtClient/GUI/InitGUI.java b/src/YalpClients/SwtClient/GUI/InitGUI.java
index 6b1fa51..e432c50 100644
--- a/src/YalpClients/SwtClient/GUI/InitGUI.java
+++ b/src/YalpClients/SwtClient/GUI/InitGUI.java
@@ -1,58 +1,58 @@
-/*
- * Copyright (c) 2006 Manuel Traut and Volker Dahnke
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Common Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/cpl-v10.html
- *
- * Contributors: Manuel Traut and Volker Dahnke
- */
-
-package YalpClients.SwtClient.GUI;
-
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.widgets.Display;
-import org.eclipse.swt.widgets.Shell;
-
-import YalpClients.SwtClient.*;
-import YalpInterfaces.AccessRights;
-
-/*
- * Class InitGUI
- *
- * <em></em>
- *
- * @author Volker Dahnke / Manuel Traut
- *
- * @version 1 02-04-2006<br>
- *
- */
-
-public class InitGUI {
- private Model model;
- private Display display;
- private int time = 1000;
-
- public InitGUI(Model model,AccessRights kind){
- this.model=model;
- this.display = Display.getDefault();
- final Runnable timer = new Runnable() {
- public void run() {
- serverStillAlive(this);
- }
- };
- display.timerExec(time, timer);
-
- GUI gui= new GUI(
- new Shell(display ,SWT.MIN), display, model, kind, SWT.NULL );
- gui.show();
- }
-
- public void serverStillAlive(Runnable timer){
- model.serverStillAlive();
- if (!this.model.getLogoff()){
- this.display.timerExec(time, timer);
- }
- }
-
-}
+/*
+ * Copyright (c) 2006 Manuel Traut and Volker Dahnke
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Common Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/cpl-v10.html
+ *
+ * Contributors: Manuel Traut and Volker Dahnke
+ */
+
+package YalpClients.SwtClient.GUI;
+
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.widgets.Display;
+import org.eclipse.swt.widgets.Shell;
+
+import YalpClients.SwtClient.*;
+import YalpInterfaces.AccessRights;
+
+/*
+ * Class InitGUI
+ *
+ * <em></em>
+ *
+ * @author Volker Dahnke / Manuel Traut
+ *
+ * @version 1 02-04-2006<br>
+ *
+ */
+
+public class InitGUI {
+ private Model model;
+ private Display display;
+ private int time = 1000;
+
+ public InitGUI(Model model,AccessRights kind){
+ this.model=model;
+ this.display = Display.getDefault();
+ final Runnable timer = new Runnable() {
+ public void run() {
+ serverStillAlive(this);
+ }
+ };
+ display.timerExec(time, timer);
+
+ GUI gui= new GUI(
+ new Shell(display ,SWT.MIN), display, model, kind, SWT.NULL );
+ gui.show();
+ }
+
+ public void serverStillAlive(Runnable timer){
+ model.serverStillAlive();
+ if (!this.model.getLogoff()){
+ this.display.timerExec(time, timer);
+ }
+ }
+
+}
diff --git a/src/YalpClients/SwtClient/GUI/LoadDialog.java b/src/YalpClients/SwtClient/GUI/LoadDialog.java
index dcdc4a8..fbe068b 100644
--- a/src/YalpClients/SwtClient/GUI/LoadDialog.java
+++ b/src/YalpClients/SwtClient/GUI/LoadDialog.java
@@ -1,110 +1,110 @@
-/*
- * Copyright (c) 2006 Manuel Traut and Volker Dahnke
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Common Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/cpl-v10.html
- *
- * Contributors: Manuel Traut and Volker Dahnke
- */
-
-package YalpClients.SwtClient.GUI;
-
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.custom.*;
-import org.eclipse.swt.graphics.*;
-import org.eclipse.swt.layout.*;
-import org.eclipse.swt.widgets.*;
-
-/*
- * Class LoadDialog
- *
- * <em></em>
- *
- * @author Volker Dahnke / Manuel Traut
- *
- * @version 1 02-04-2006<br>
- */
-public class LoadDialog extends Composite{
-
- {
- //Register as a resource user - SWTResourceManager will
- //handle the obtaining and disposing of resources
- SWTResourceManager.registerResourceUser(this);
- }
-
- private CLabel cLabel1;
- private CLabel cLabel2;
- private CLabel cLabel3;
- private Shell parent;
-
- public LoadDialog(Composite parent, int style) {
- super(parent, style);
- this.parent=(Shell)parent;
- initDialog();
- }
-
- private void initDialog(){
- GridLayout thisLayout = new GridLayout();
- thisLayout.makeColumnsEqualWidth = true;
- this.setLayout(thisLayout);
- this.setSize(300,170);
- {
- Composite composite = new Composite(this, SWT.NONE);
- FormLayout compositeLayout = new FormLayout();
- composite.setLayout(compositeLayout);
- GridData compositeLData = new GridData();
- compositeLData.widthHint = 287;
- compositeLData.heightHint = 165;
- composite.setLayoutData(compositeLData);
- composite.setVisible(true);
- {
- cLabel3 = new CLabel(composite, SWT.LEFT);
- cLabel3.setText("Copyright (c) 2006 Manuel Traut and Volker Dahnke");
- FormData cLabel3LData = new FormData();
- cLabel3LData.width = 300;
- cLabel3LData.height = 20;
- cLabel3LData.left = new FormAttachment(0, 1000, 0);
- cLabel3LData.top = new FormAttachment(0, 1000, 145);
- cLabel3.setLayoutData(cLabel3LData);
- cLabel3.setFont(SWTResourceManager.getFont("Times", 7, 0, false, false));
- }
- {
- cLabel2 = new CLabel(composite, SWT.CENTER);
- cLabel2.setText("Loading...");
- FormData cLabel2LData = new FormData();
- cLabel2LData.width = 105;
- cLabel2LData.height = 25;
- cLabel2LData.left = new FormAttachment(0, 1000, 91);
- cLabel2LData.top = new FormAttachment(0, 1000, 123);
- cLabel2.setLayoutData(cLabel2LData);
- cLabel2.setFont(SWTResourceManager.getFont("Times", 12, 1, false, false));
- }
- {
- cLabel1 = new CLabel(composite, SWT.CENTER);
- FormData cLabel1LData = new FormData();
- cLabel1LData.width = 200;
- cLabel1LData.height = 120;
- cLabel1LData.left = new FormAttachment(0, 1000, 40);
- cLabel1LData.top = new FormAttachment(0, 1000, 0);
- cLabel1.setLayoutData(cLabel1LData);
- cLabel1.setImage(new Image(this.getDisplay(),"img/yalpV2.gif"));
- }
-
- }
- }
-
- public void show(){
- Point size = this.getSize();
- java.awt.Dimension screen = java.awt.Toolkit.getDefaultToolkit().getScreenSize();
- Rectangle shellBounds = this.parent.computeTrim((screen.width-size.x)/2,(screen.height-size.y)/2,size.x,size.y);
- this.parent.setLayout(new FillLayout());
- this.parent.layout();
- this.parent.setBounds(shellBounds);
- this.parent.open();
- }
-
- public void close(){
- this.parent.close();
- }
-}
+/*
+ * Copyright (c) 2006 Manuel Traut and Volker Dahnke
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Common Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/cpl-v10.html
+ *
+ * Contributors: Manuel Traut and Volker Dahnke
+ */
+
+package YalpClients.SwtClient.GUI;
+
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.custom.*;
+import org.eclipse.swt.graphics.*;
+import org.eclipse.swt.layout.*;
+import org.eclipse.swt.widgets.*;
+
+/*
+ * Class LoadDialog
+ *
+ * <em></em>
+ *
+ * @author Volker Dahnke / Manuel Traut
+ *
+ * @version 1 02-04-2006<br>
+ */
+public class LoadDialog extends Composite{
+
+ {
+ //Register as a resource user - SWTResourceManager will
+ //handle the obtaining and disposing of resources
+ SWTResourceManager.registerResourceUser(this);
+ }
+
+ private CLabel cLabel1;
+ private CLabel cLabel2;
+ private CLabel cLabel3;
+ private Shell parent;
+
+ public LoadDialog(Composite parent, int style) {
+ super(parent, style);
+ this.parent=(Shell)parent;
+ initDialog();
+ }
+
+ private void initDialog(){
+ GridLayout thisLayout = new GridLayout();
+ thisLayout.makeColumnsEqualWidth = true;
+ this.setLayout(thisLayout);
+ this.setSize(300,170);
+ {
+ Composite composite = new Composite(this, SWT.NONE);
+ FormLayout compositeLayout = new FormLayout();
+ composite.setLayout(compositeLayout);
+ GridData compositeLData = new GridData();
+ compositeLData.widthHint = 287;
+ compositeLData.heightHint = 165;
+ composite.setLayoutData(compositeLData);
+ composite.setVisible(true);
+ {
+ cLabel3 = new CLabel(composite, SWT.LEFT);
+ cLabel3.setText("Copyright (c) 2006 Manuel Traut and Volker Dahnke");
+ FormData cLabel3LData = new FormData();
+ cLabel3LData.width = 300;
+ cLabel3LData.height = 20;
+ cLabel3LData.left = new FormAttachment(0, 1000, 0);
+ cLabel3LData.top = new FormAttachment(0, 1000, 145);
+ cLabel3.setLayoutData(cLabel3LData);
+ cLabel3.setFont(SWTResourceManager.getFont("Times", 7, 0, false, false));
+ }
+ {
+ cLabel2 = new CLabel(composite, SWT.CENTER);
+ cLabel2.setText("Loading...");
+ FormData cLabel2LData = new FormData();
+ cLabel2LData.width = 105;
+ cLabel2LData.height = 25;
+ cLabel2LData.left = new FormAttachment(0, 1000, 91);
+ cLabel2LData.top = new FormAttachment(0, 1000, 123);
+ cLabel2.setLayoutData(cLabel2LData);
+ cLabel2.setFont(SWTResourceManager.getFont("Times", 12, 1, false, false));
+ }
+ {
+ cLabel1 = new CLabel(composite, SWT.CENTER);
+ FormData cLabel1LData = new FormData();
+ cLabel1LData.width = 200;
+ cLabel1LData.height = 120;
+ cLabel1LData.left = new FormAttachment(0, 1000, 40);
+ cLabel1LData.top = new FormAttachment(0, 1000, 0);
+ cLabel1.setLayoutData(cLabel1LData);
+ cLabel1.setImage(new Image(this.getDisplay(),"img/yalpV2.gif"));
+ }
+
+ }
+ }
+
+ public void show(){
+ Point size = this.getSize();
+ java.awt.Dimension screen = java.awt.Toolkit.getDefaultToolkit().getScreenSize();
+ Rectangle shellBounds = this.parent.computeTrim((screen.width-size.x)/2,(screen.height-size.y)/2,size.x,size.y);
+ this.parent.setLayout(new FillLayout());
+ this.parent.layout();
+ this.parent.setBounds(shellBounds);
+ this.parent.open();
+ }
+
+ public void close(){
+ this.parent.close();
+ }
+}
diff --git a/src/YalpClients/SwtClient/GUI/SWTResourceManager.java b/src/YalpClients/SwtClient/GUI/SWTResourceManager.java
index 87dffc3..258c883 100644
--- a/src/YalpClients/SwtClient/GUI/SWTResourceManager.java
+++ b/src/YalpClients/SwtClient/GUI/SWTResourceManager.java
@@ -1,145 +1,145 @@
-package YalpClients.SwtClient.GUI;
-
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.Vector;
-
-import org.eclipse.swt.events.DisposeEvent;
-import org.eclipse.swt.events.DisposeListener;
-import org.eclipse.swt.graphics.Color;
-import org.eclipse.swt.graphics.Cursor;
-import org.eclipse.swt.graphics.Font;
-import org.eclipse.swt.graphics.FontData;
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.swt.widgets.Control;
-import org.eclipse.swt.widgets.Display;
-import org.eclipse.swt.widgets.Widget;
-
-/*
- * Class to manage SWT resources (Font, Color, Image and Cursor)
- * There are no restrictions on the use of this code.
- *
- * You may change this code and your changes will not be overwritten,
- * but if you change the version number below then this class will be
- * completely overwritten by Jigloo.
- * #SWTResourceManager:version4.0.0#
- */
-public class SWTResourceManager {
-
- private static HashMap resources = new HashMap();
- private static Vector users = new Vector();
- private static SWTResourceManager instance = new SWTResourceManager();
-
- private static DisposeListener disposeListener = new DisposeListener() {
- public void widgetDisposed(DisposeEvent e) {
- users.remove(e.getSource());
- if (users.size() == 0)
- dispose();
- }
- };
-
- /*
- * This method should be called by *all* Widgets which use resources
- * provided by this SWTResourceManager. When widgets are disposed,
- * they are removed from the "users" Vector, and when no more
- * registered Widgets are left, all resources are disposed.
- * <P>
- * If this method is not called for all Widgets then it should not be called
- * at all, and the "dispose" method should be explicitly called after all
- * resources are no longer being used.
- */
- public static void registerResourceUser(Widget widget) {
- if (users.contains(widget))
- return;
- users.add(widget);
- widget.addDisposeListener(disposeListener);
- }
-
- public static void dispose() {
- Iterator it = resources.keySet().iterator();
- while (it.hasNext()) {
- Object resource = resources.get(it.next());
- if (resource instanceof Font)
- ((Font) resource).dispose();
- else if (resource instanceof Color)
- ((Color) resource).dispose();
- else if (resource instanceof Image)
- ((Image) resource).dispose();
- else if (resource instanceof Cursor)
- ((Cursor) resource).dispose();
- }
- resources.clear();
- }
-
- public static Font getFont(String name, int size, int style) {
- return getFont(name, size, style, false, false);
- }
-
- public static Font getFont(String name, int size, int style, boolean strikeout, boolean underline) {
- String fontName = name + "|" + size + "|" + style + "|" + strikeout + "|" + underline;
- if (resources.containsKey(fontName))
- return (Font) resources.get(fontName);
- FontData fd = new FontData(name, size, style);
- if (strikeout || underline) {
- try {
- Class lfCls = Class.forName("org.eclipse.swt.internal.win32.LOGFONT");
- Object lf = FontData.class.getField("data").get(fd);
- if (lf != null && lfCls != null) {
- if (strikeout)
- lfCls.getField("lfStrikeOut").set(lf, new Byte((byte) 1));
- if (underline)
- lfCls.getField("lfUnderline").set(lf, new Byte((byte) 1));
- }
- } catch (Throwable e) {
- System.err.println(
- "Unable to set underline or strikeout" + " (probably on a non-Windows platform). " + e);
- }
- }
- Font font = new Font(Display.getDefault(), fd);
- resources.put(fontName, font);
- return font;
- }
-
- public static Image getImage(String url, Control widget) {
- Image img = getImage(url);
- if(img != null && widget != null)
- img.setBackground(widget.getBackground());
- return img;
- }
-
- public static Image getImage(String url) {
- try {
- url = url.replace('\\', '/');
- if (url.startsWith("/"))
- url = url.substring(1);
- if (resources.containsKey(url))
- return (Image) resources.get(url);
- Image img = new Image(Display.getDefault(), instance.getClass().getClassLoader().getResourceAsStream(url));
- if (img != null)
- resources.put(url, img);
- return img;
- } catch (Exception e) {
- System.err.println("SWTResourceManager.getImage: Error getting image "+url+", "+e);
- return null;
- }
- }
-
- public static Color getColor(int red, int green, int blue) {
- String name = "COLOR:" + red + "," + green + "," + blue;
- if (resources.containsKey(name))
- return (Color) resources.get(name);
- Color color = new Color(Display.getDefault(), red, green, blue);
- resources.put(name, color);
- return color;
- }
-
- public static Cursor getCursor(int type) {
- String name = "CURSOR:" + type;
- if (resources.containsKey(name))
- return (Cursor) resources.get(name);
- Cursor cursor = new Cursor(Display.getDefault(), type);
- resources.put(name, cursor);
- return cursor;
- }
-
-}
+package YalpClients.SwtClient.GUI;
+
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.Vector;
+
+import org.eclipse.swt.events.DisposeEvent;
+import org.eclipse.swt.events.DisposeListener;
+import org.eclipse.swt.graphics.Color;
+import org.eclipse.swt.graphics.Cursor;
+import org.eclipse.swt.graphics.Font;
+import org.eclipse.swt.graphics.FontData;
+import org.eclipse.swt.graphics.Image;
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.swt.widgets.Display;
+import org.eclipse.swt.widgets.Widget;
+
+/*
+ * Class to manage SWT resources (Font, Color, Image and Cursor)
+ * There are no restrictions on the use of this code.
+ *
+ * You may change this code and your changes will not be overwritten,
+ * but if you change the version number below then this class will be
+ * completely overwritten by Jigloo.
+ * #SWTResourceManager:version4.0.0#
+ */
+public class SWTResourceManager {
+
+ private static HashMap resources = new HashMap();
+ private static Vector users = new Vector();
+ private static SWTResourceManager instance = new SWTResourceManager();
+
+ private static DisposeListener disposeListener = new DisposeListener() {
+ public void widgetDisposed(DisposeEvent e) {
+ users.remove(e.getSource());
+ if (users.size() == 0)
+ dispose();
+ }
+ };
+
+ /*
+ * This method should be called by *all* Widgets which use resources
+ * provided by this SWTResourceManager. When widgets are disposed,
+ * they are removed from the "users" Vector, and when no more
+ * registered Widgets are left, all resources are disposed.
+ * <P>
+ * If this method is not called for all Widgets then it should not be called
+ * at all, and the "dispose" method should be explicitly called after all
+ * resources are no longer being used.
+ */
+ public static void registerResourceUser(Widget widget) {
+ if (users.contains(widget))
+ return;
+ users.add(widget);
+ widget.addDisposeListener(disposeListener);
+ }
+
+ public static void dispose() {
+ Iterator it = resources.keySet().iterator();
+ while (it.hasNext()) {
+ Object resource = resources.get(it.next());
+ if (resource instanceof Font)
+ ((Font) resource).dispose();
+ else if (resource instanceof Color)
+ ((Color) resource).dispose();
+ else if (resource instanceof Image)
+ ((Image) resource).dispose();
+ else if (resource instanceof Cursor)
+ ((Cursor) resource).dispose();
+ }
+ resources.clear();
+ }
+
+ public static Font getFont(String name, int size, int style) {
+ return getFont(name, size, style, false, false);
+ }
+
+ public static Font getFont(String name, int size, int style, boolean strikeout, boolean underline) {
+ String fontName = name + "|" + size + "|" + style + "|" + strikeout + "|" + underline;
+ if (resources.containsKey(fontName))
+ return (Font) resources.get(fontName);
+ FontData fd = new FontData(name, size, style);
+ if (strikeout || underline) {
+ try {
+ Class lfCls = Class.forName("org.eclipse.swt.internal.win32.LOGFONT");
+ Object lf = FontData.class.getField("data").get(fd);
+ if (lf != null && lfCls != null) {
+ if (strikeout)
+ lfCls.getField("lfStrikeOut").set(lf, new Byte((byte) 1));
+ if (underline)
+ lfCls.getField("lfUnderline").set(lf, new Byte((byte) 1));
+ }
+ } catch (Throwable e) {
+ System.err.println(
+ "Unable to set underline or strikeout" + " (probably on a non-Windows platform). " + e);
+ }
+ }
+ Font font = new Font(Display.getDefault(), fd);
+ resources.put(fontName, font);
+ return font;
+ }
+
+ public static Image getImage(String url, Control widget) {
+ Image img = getImage(url);
+ if(img != null && widget != null)
+ img.setBackground(widget.getBackground());
+ return img;
+ }
+
+ public static Image getImage(String url) {
+ try {
+ url = url.replace('\\', '/');
+ if (url.startsWith("/"))
+ url = url.substring(1);
+ if (resources.containsKey(url))
+ return (Image) resources.get(url);
+ Image img = new Image(Display.getDefault(), instance.getClass().getClassLoader().getResourceAsStream(url));
+ if (img != null)
+ resources.put(url, img);
+ return img;
+ } catch (Exception e) {
+ System.err.println("SWTResourceManager.getImage: Error getting image "+url+", "+e);
+ return null;
+ }
+ }
+
+ public static Color getColor(int red, int green, int blue) {
+ String name = "COLOR:" + red + "," + green + "," + blue;
+ if (resources.containsKey(name))
+ return (Color) resources.get(name);
+ Color color = new Color(Display.getDefault(), red, green, blue);
+ resources.put(name, color);
+ return color;
+ }
+
+ public static Cursor getCursor(int type) {
+ String name = "CURSOR:" + type;
+ if (resources.containsKey(name))
+ return (Cursor) resources.get(name);
+ Cursor cursor = new Cursor(Display.getDefault(), type);
+ resources.put(name, cursor);
+ return cursor;
+ }
+
+}
diff --git a/src/YalpClients/SwtClient/GUI/SortListener.java b/src/YalpClients/SwtClient/GUI/SortListener.java
index a2ff35a..78598d6 100644
--- a/src/YalpClients/SwtClient/GUI/SortListener.java
+++ b/src/YalpClients/SwtClient/GUI/SortListener.java
@@ -1,63 +1,63 @@
-/*
- * Copyright (c) 2006 Manuel Traut and Volker Dahnke
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Common Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/cpl-v10.html
- *
- * Contributors: Manuel Traut and Volker Dahnke
- */
-
-package YalpClients.SwtClient.GUI;
-
-import java.text.Collator;
-import java.util.Locale;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.widgets.*;
-
-/*
- * Class SortListener
- *
- * <em></em>
- *
- * @author Volker Dahnke / Manuel Traut
- *
- * @version 1 02-04-2006<br>
- */
-public class SortListener implements Listener{
- private Table table;
- private int colum,numColum;
- private GUI gui;
-
- public SortListener(GUI gui,Table table,int colum,int numColum){
- this.colum=colum;
- this.numColum=numColum;
- this.table=table;
- this.gui=gui;
- }
-
- public void handleEvent(Event e) {
- TableItem[] items = table.getItems();
- Collator collator = Collator.getInstance(Locale.getDefault());
- for (int i = 1; i < items.length; i++) {
- String value1 = items[i].getText(colum);
- for (int j = 0; j < i; j++) {
- String value2 = items[j].getText(colum);
- if (collator.compare(value1, value2) < 0) {
- String[] values= new String[numColum];
- for(int g=0;g<numColum;g++){
- values[g]= items[i].getText(g);
- }
- items[i].dispose();
- TableItem item = new TableItem(table, SWT.NONE, j);
- item.setText(values);
- items = table.getItems();
- break;
- }
- }
- }
- gui.changeComposite.setVisible(false);
- table.setSelection(0);
- }
-}
-
+/*
+ * Copyright (c) 2006 Manuel Traut and Volker Dahnke
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Common Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/cpl-v10.html
+ *
+ * Contributors: Manuel Traut and Volker Dahnke
+ */
+
+package YalpClients.SwtClient.GUI;
+
+import java.text.Collator;
+import java.util.Locale;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.widgets.*;
+
+/*
+ * Class SortListener
+ *
+ * <em></em>
+ *
+ * @author Volker Dahnke / Manuel Traut
+ *
+ * @version 1 02-04-2006<br>
+ */
+public class SortListener implements Listener{
+ private Table table;
+ private int colum,numColum;
+ private GUI gui;
+
+ public SortListener(GUI gui,Table table,int colum,int numColum){
+ this.colum=colum;
+ this.numColum=numColum;
+ this.table=table;
+ this.gui=gui;
+ }
+
+ public void handleEvent(Event e) {
+ TableItem[] items = table.getItems();
+ Collator collator = Collator.getInstance(Locale.getDefault());
+ for (int i = 1; i < items.length; i++) {
+ String value1 = items[i].getText(colum);
+ for (int j = 0; j < i; j++) {
+ String value2 = items[j].getText(colum);
+ if (collator.compare(value1, value2) < 0) {
+ String[] values= new String[numColum];
+ for(int g=0;g<numColum;g++){
+ values[g]= items[i].getText(g);
+ }
+ items[i].dispose();
+ TableItem item = new TableItem(table, SWT.NONE, j);
+ item.setText(values);
+ items = table.getItems();
+ break;
+ }
+ }
+ }
+ gui.changeComposite.setVisible(false);
+ table.setSelection(0);
+ }
+}
+
diff --git a/src/YalpClients/SwtClient/GUI/StartDialog.java b/src/YalpClients/SwtClient/GUI/StartDialog.java
index 11ecc7f..8f828f0 100644
--- a/src/YalpClients/SwtClient/GUI/StartDialog.java
+++ b/src/YalpClients/SwtClient/GUI/StartDialog.java
@@ -1,236 +1,236 @@
-/*
- * Copyright (c) 2006 Manuel Traut and Volker Dahnke
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Common Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/cpl-v10.html
- *
- * Contributors: Manuel Traut and Volker Dahnke
- */
-
-package YalpClients.SwtClient.GUI;
-
-import YalpClients.SwtClient.Model;
-import YalpInterfaces.AccessRights;
-
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.custom.*;
-import org.eclipse.swt.events.*;
-import org.eclipse.swt.graphics.*;
-import org.eclipse.swt.layout.*;
-import org.eclipse.swt.widgets.*;
-
-/*
- * Class StartDialog
- *
- * <em></em>
- *
- * @author Volker Dahnke / Manuel Traut
- *
- * @version 1 02-04-2006<br>
- */
-public class StartDialog extends Composite {
-
- {
- //Register as a resource user - SWTResourceManager will
- //handle the obtaining and disposing of resources
- SWTResourceManager.registerResourceUser(this);
- }
- private Display display;
- private CLabel cLabel1;
- private CLabel LogoLabel;
- private Model model;
- private Composite parent;
- private Composite composite;
- private CLabel logonLable;
- private Button ok;
- private Text passwd;
- private Text username;
- private CLabel passwdLable;
- private CLabel usernameLable;
-
-
- public StartDialog(Composite parent,Model model, int style) {
- super(parent, style);
-
- this.parent=parent;
- this.model=model;
- this.display=Display.getDefault();
- initStartDialog();
- }
-
- private void initStartDialog(){
- GridLayout thisLayout = new GridLayout();
- thisLayout.makeColumnsEqualWidth = true;
- this.setLayout(thisLayout);
- this.setSize(300,150);
- Listener listener =new Listener() {
- public void handleEvent(org.eclipse.swt.widgets.Event evt) {
- if (evt.character==SWT.CR){
- OkPressed();
- }
- }
- };
- addListener(SWT.KeyDown,listener);
- {
- composite = new Composite(this, SWT.NONE);
- FormLayout compositeLayout = new FormLayout();
- composite.setLayout(compositeLayout);
- GridData compositeLData = new GridData();
- compositeLData.widthHint = 287;
- compositeLData.heightHint = 140;
- composite.setLayoutData(compositeLData);
- composite.setVisible(true);
- composite.addKeyListener(new KeyAdapter() {
- public void keyPressed(KeyEvent evt) {
- if (evt.character==SWT.CR){
- OkPressed();
- }
- }
- });
- {
- cLabel1 = new CLabel(composite, SWT.NONE);
- FormData cLabel1LData = new FormData();
- cLabel1LData.width = 120;
- cLabel1LData.height = 20;
- cLabel1LData.left = new FormAttachment(0, 1000, 93);
- cLabel1LData.top = new FormAttachment(0, 1000, 40);
- cLabel1.setLayoutData(cLabel1LData);
- Color col =display.getSystemColor(SWT.COLOR_RED);
- cLabel1.setForeground(col);
- cLabel1.setFont(SWTResourceManager.getFont("Times", 10, 1, false, false));
- }
- {
- LogoLabel = new CLabel(composite, SWT.NONE);
- FormData LogoLabelLData = new FormData();
- LogoLabelLData.width = 70;
- LogoLabelLData.height = 42;
- LogoLabelLData.left = new FormAttachment(0, 1000, 77);
- LogoLabelLData.top = new FormAttachment(0, 1000, 0);
- LogoLabelLData.right = new FormAttachment(1000, 1000, -140);
- LogoLabelLData.bottom = new FormAttachment(1000, 1000, -98);
- LogoLabel.setLayoutData(LogoLabelLData);
- LogoLabel.setImage(new Image(this.getDisplay(),"img/yalpV2_mittel.gif"));
- }
- {
- logonLable = new CLabel(composite, SWT.BEGINNING);
- logonLable.setText("Login");
- FormData logonLableLData = new FormData();
- logonLableLData.width = 70;
- logonLableLData.height = 28;
- logonLableLData.left = new FormAttachment(0, 1000, 147);
- logonLableLData.top = new FormAttachment(0, 1000, 5);
- logonLable.setLayoutData(logonLableLData);
- logonLable.setFont(SWTResourceManager.getFont("Times", 14, 1, false, false));
- }
- {
- username = new Text(composite, SWT.NONE);
- FormData usernameLData = new FormData();
- usernameLData.width = 117;
- usernameLData.height = 15;
- usernameLData.left = new FormAttachment(0, 1000, 120);
- usernameLData.top = new FormAttachment(0, 1000, 65);
- username.setLayoutData(usernameLData);
- username.setFocus();
- username.addKeyListener(new KeyAdapter() {
- public void keyPressed(KeyEvent evt) {
- if (evt.character==SWT.CR){
- OkPressed();
- }
- }
- });
- }
- {
- passwd = new Text(composite, SWT.PASSWORD);
- FormData passwdLData = new FormData();
- passwdLData.width = 117;
- passwdLData.height = 15;
- passwdLData.left = new FormAttachment(0, 1000, 120);
- passwdLData.top = new FormAttachment(0, 1000, 88);
- passwd.setLayoutData(passwdLData);
- passwd.addKeyListener(new KeyAdapter() {
- public void keyPressed(KeyEvent evt) {
- if (evt.character==SWT.CR){
- OkPressed();
- }
- }
- });
- }
- {
- ok = new Button(composite, SWT.PUSH | SWT.CENTER);
- ok.setText("OK");
- FormData okLData = new FormData();
- okLData.width = 65;
- okLData.height = 21;
- okLData.left = new FormAttachment(0, 1000, 110);
- okLData.top = new FormAttachment(0, 1000, 115);
- ok.setLayoutData(okLData);
- ok.setFont(SWTResourceManager.getFont("Times", 10, 1, false, false));
- ok.addSelectionListener(new SelectionAdapter() {
- public void widgetSelected(SelectionEvent evt) {
- OkPressed();
- }
- });
- }
- {
- passwdLable = new CLabel(composite, SWT.NONE);
- passwdLable.setText("Password:");
- FormData passwdLableLData = new FormData();
- passwdLableLData.width = 70;
- passwdLableLData.height = 20;
- passwdLableLData.left = new FormAttachment(0, 1000, 35);
- passwdLableLData.top = new FormAttachment(0, 1000, 83);
- passwdLable.setLayoutData(passwdLableLData);
- passwdLable.setFont(SWTResourceManager.getFont("Times", 10, 0, false, false));
- }
- {
- usernameLable = new CLabel(composite, SWT.NONE);
- usernameLable.setText("Username:");
- FormData usernameLableLData = new FormData();
- usernameLableLData.width = 70;
- usernameLableLData.height = 20;
- usernameLableLData.left = new FormAttachment(0, 1000, 35);
- usernameLableLData.top = new FormAttachment(0, 1000, 60);
- usernameLable.setLayoutData(usernameLableLData);
- usernameLable.setFont(SWTResourceManager.getFont("Times", 10, 0, false, false));
- }
- }
- this.layout();
-
- }
- private void OkPressed(){
- AccessRights kind;
- kind = model.userVerify(username.getText(), passwd.getText());
-
- if (kind.value() == AccessRights._NO_YALP_SERVER ) {
- cLabel1.setText("Server offline");
- } else if (kind.value() == AccessRights._DENY ){
- cLabel1.setText("Access Denied");
- username.setText("");
- passwd.setText("");
- username.setFocus();
- } else {
- display.close();
- InitGUI gui = new InitGUI(model, kind);
- }
-
- }
-
- public void show(){
- ((Shell)this.parent).setImage(new Image(display,"img/yalpV2_klein.gif"));
- ((Shell)this.parent).setText("yalp");
- Point size = this.getSize();
- java.awt.Dimension screen = java.awt.Toolkit.getDefaultToolkit().getScreenSize();
- Rectangle shellBounds = this.parent.computeTrim((screen.width-size.x)/2,(screen.height-size.y)/2,size.x,size.y);
- this.parent.setLayout(new FillLayout());
- this.parent.layout();
- this.parent.setBounds(shellBounds);
- ((Shell)this.parent).open();
- while (!this.parent.isDisposed()) {
- if (!display.readAndDispatch())
- display.sleep();
- }
- }
-
-
-}
+/*
+ * Copyright (c) 2006 Manuel Traut and Volker Dahnke
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Common Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/cpl-v10.html
+ *
+ * Contributors: Manuel Traut and Volker Dahnke
+ */
+
+package YalpClients.SwtClient.GUI;
+
+import YalpClients.SwtClient.Model;
+import YalpInterfaces.AccessRights;
+
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.custom.*;
+import org.eclipse.swt.events.*;
+import org.eclipse.swt.graphics.*;
+import org.eclipse.swt.layout.*;
+import org.eclipse.swt.widgets.*;
+
+/*
+ * Class StartDialog
+ *
+ * <em></em>
+ *
+ * @author Volker Dahnke / Manuel Traut
+ *
+ * @version 1 02-04-2006<br>
+ */
+public class StartDialog extends Composite {
+
+ {
+ //Register as a resource user - SWTResourceManager will
+ //handle the obtaining and disposing of resources
+ SWTResourceManager.registerResourceUser(this);
+ }
+ private Display display;
+ private CLabel cLabel1;
+ private CLabel LogoLabel;
+ private Model model;
+ private Composite parent;
+ private Composite composite;
+ private CLabel logonLable;
+ private Button ok;
+ private Text passwd;
+ private Text username;
+ private CLabel passwdLable;
+ private CLabel usernameLable;
+
+
+ public StartDialog(Composite parent,Model model, int style) {
+ super(parent, style);
+
+ this.parent=parent;
+ this.model=model;
+ this.display=Display.getDefault();
+ initStartDialog();
+ }
+
+ private void initStartDialog(){
+ GridLayout thisLayout = new GridLayout();
+ thisLayout.makeColumnsEqualWidth = true;
+ this.setLayout(thisLayout);
+ this.setSize(300,150);
+ Listener listener =new Listener() {
+ public void handleEvent(org.eclipse.swt.widgets.Event evt) {
+ if (evt.character==SWT.CR){
+ OkPressed();
+ }
+ }
+ };
+ addListener(SWT.KeyDown,listener);
+ {
+ composite = new Composite(this, SWT.NONE);
+ FormLayout compositeLayout = new FormLayout();
+ composite.setLayout(compositeLayout);
+ GridData compositeLData = new GridData();
+ compositeLData.widthHint = 287;
+ compositeLData.heightHint = 140;
+ composite.setLayoutData(compositeLData);
+ composite.setVisible(true);
+ composite.addKeyListener(new KeyAdapter() {
+ public void keyPressed(KeyEvent evt) {
+ if (evt.character==SWT.CR){
+ OkPressed();
+ }
+ }
+ });
+ {
+ cLabel1 = new CLabel(composite, SWT.NONE);
+ FormData cLabel1LData = new FormData();
+ cLabel1LData.width = 120;
+ cLabel1LData.height = 20;
+ cLabel1LData.left = new FormAttachment(0, 1000, 93);
+ cLabel1LData.top = new FormAttachment(0, 1000, 40);
+ cLabel1.setLayoutData(cLabel1LData);
+ Color col =display.getSystemColor(SWT.COLOR_RED);
+ cLabel1.setForeground(col);
+ cLabel1.setFont(SWTResourceManager.getFont("Times", 10, 1, false, false));
+ }
+ {
+ LogoLabel = new CLabel(composite, SWT.NONE);
+ FormData LogoLabelLData = new FormData();
+ LogoLabelLData.width = 70;
+ LogoLabelLData.height = 42;
+ LogoLabelLData.left = new FormAttachment(0, 1000, 77);
+ LogoLabelLData.top = new FormAttachment(0, 1000, 0);
+ LogoLabelLData.right = new FormAttachment(1000, 1000, -140);
+ LogoLabelLData.bottom = new FormAttachment(1000, 1000, -98);
+ LogoLabel.setLayoutData(LogoLabelLData);
+ LogoLabel.setImage(new Image(this.getDisplay(),"img/yalpV2_mittel.gif"));
+ }
+ {
+ logonLable = new CLabel(composite, SWT.BEGINNING);
+ logonLable.setText("Login");
+ FormData logonLableLData = new FormData();
+ logonLableLData.width = 70;
+ logonLableLData.height = 28;
+ logonLableLData.left = new FormAttachment(0, 1000, 147);
+ logonLableLData.top = new FormAttachment(0, 1000, 5);
+ logonLable.setLayoutData(logonLableLData);
+ logonLable.setFont(SWTResourceManager.getFont("Times", 14, 1, false, false));
+ }
+ {
+ username = new Text(composite, SWT.NONE);
+ FormData usernameLData = new FormData();
+ usernameLData.width = 117;
+ usernameLData.height = 15;
+ usernameLData.left = new FormAttachment(0, 1000, 120);
+ usernameLData.top = new FormAttachment(0, 1000, 65);
+ username.setLayoutData(usernameLData);
+ username.setFocus();
+ username.addKeyListener(new KeyAdapter() {
+ public void keyPressed(KeyEvent evt) {
+ if (evt.character==SWT.CR){
+ OkPressed();
+ }
+ }
+ });
+ }
+ {
+ passwd = new Text(composite, SWT.PASSWORD);
+ FormData passwdLData = new FormData();
+ passwdLData.width = 117;
+ passwdLData.height = 15;
+ passwdLData.left = new FormAttachment(0, 1000, 120);
+ passwdLData.top = new FormAttachment(0, 1000, 88);
+ passwd.setLayoutData(passwdLData);
+ passwd.addKeyListener(new KeyAdapter() {
+ public void keyPressed(KeyEvent evt) {
+ if (evt.character==SWT.CR){
+ OkPressed();
+ }
+ }
+ });
+ }
+ {
+ ok = new Button(composite, SWT.PUSH | SWT.CENTER);
+ ok.setText("OK");
+ FormData okLData = new FormData();
+ okLData.width = 65;
+ okLData.height = 21;
+ okLData.left = new FormAttachment(0, 1000, 110);
+ okLData.top = new FormAttachment(0, 1000, 115);
+ ok.setLayoutData(okLData);
+ ok.setFont(SWTResourceManager.getFont("Times", 10, 1, false, false));
+ ok.addSelectionListener(new SelectionAdapter() {
+ public void widgetSelected(SelectionEvent evt) {
+ OkPressed();
+ }
+ });
+ }
+ {
+ passwdLable = new CLabel(composite, SWT.NONE);
+ passwdLable.setText("Password:");
+ FormData passwdLableLData = new FormData();
+ passwdLableLData.width = 70;
+ passwdLableLData.height = 20;
+ passwdLableLData.left = new FormAttachment(0, 1000, 35);
+ passwdLableLData.top = new FormAttachment(0, 1000, 83);
+ passwdLable.setLayoutData(passwdLableLData);
+ passwdLable.setFont(SWTResourceManager.getFont("Times", 10, 0, false, false));
+ }
+ {
+ usernameLable = new CLabel(composite, SWT.NONE);
+ usernameLable.setText("Username:");
+ FormData usernameLableLData = new FormData();
+ usernameLableLData.width = 70;
+ usernameLableLData.height = 20;
+ usernameLableLData.left = new FormAttachment(0, 1000, 35);
+ usernameLableLData.top = new FormAttachment(0, 1000, 60);
+ usernameLable.setLayoutData(usernameLableLData);
+ usernameLable.setFont(SWTResourceManager.getFont("Times", 10, 0, false, false));
+ }
+ }
+ this.layout();
+
+ }
+ private void OkPressed(){
+ AccessRights kind;
+ kind = model.userVerify(username.getText(), passwd.getText());
+
+ if (kind.value() == AccessRights._NO_YALP_SERVER ) {
+ cLabel1.setText("Server offline");
+ } else if (kind.value() == AccessRights._DENY ){
+ cLabel1.setText("Access Denied");
+ username.setText("");
+ passwd.setText("");
+ username.setFocus();
+ } else {
+ display.close();
+ InitGUI gui = new InitGUI(model, kind);
+ }
+
+ }
+
+ public void show(){
+ ((Shell)this.parent).setImage(new Image(display,"img/yalpV2_klein.gif"));
+ ((Shell)this.parent).setText("yalp");
+ Point size = this.getSize();
+ java.awt.Dimension screen = java.awt.Toolkit.getDefaultToolkit().getScreenSize();
+ Rectangle shellBounds = this.parent.computeTrim((screen.width-size.x)/2,(screen.height-size.y)/2,size.x,size.y);
+ this.parent.setLayout(new FillLayout());
+ this.parent.layout();
+ this.parent.setBounds(shellBounds);
+ ((Shell)this.parent).open();
+ while (!this.parent.isDisposed()) {
+ if (!display.readAndDispatch())
+ display.sleep();
+ }
+ }
+
+
+}
diff --git a/src/YalpClients/SwtClient/Model.java b/src/YalpClients/SwtClient/Model.java
index 5423dc4..0ebc09c 100755
--- a/src/YalpClients/SwtClient/Model.java
+++ b/src/YalpClients/SwtClient/Model.java
@@ -1,759 +1,759 @@
-/*
- * Copyright (c) 2006 Manuel Traut and Volker Dahnke
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Common Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/cpl-v10.html
- *
- * Contributors: Manuel Traut and Volker Dahnke
- */
-
-package YalpClients.SwtClient;
-
-import YalpInterfaces.*;
-import YalpClients.*;
-
-import java.beans.XMLDecoder;
-import java.beans.XMLEncoder;
-import java.io.*;
-import java.net.Inet4Address;
-import java.net.MalformedURLException;
-import java.net.UnknownHostException;
-import java.sql.SQLException;
-import java.util.ArrayList;
-
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.widgets.Display;
-import org.eclipse.swt.widgets.MessageBox;
-import org.eclipse.swt.widgets.Shell;
-
-import org.omg.CosNaming.*;
-import org.omg.CosNaming.NamingContextPackage.*;
-import org.omg.CORBA.*;
-
-/*
- * Class Model
- *
- * <em>Implementiert die Schnittstellenfunktionen zur Steuerung des Servers
- * (Datenbankinhalte schreiben, lesen; Streaming steuern</em>
- *
- * @author Volker Dahnke / Manuel Traut
- *
- * @version 0.6 14-12-2005<br>
- *
- * @see client.GUI
- */
-
-public class Model {
-
- public ServerControlInterface srvCon;
- private Process vlcPlayer;
- private Output actualStream = new Output();
- private Output streamInfo = new Output();
- private ArrayList<Media> findMedia = new ArrayList<Media>();
- private ArrayList<Media> editMedia = new ArrayList<Media>();
- private ArrayList<Media> toPlaylist = new ArrayList<Media>();
- private ArrayList<Media> playList = new ArrayList<Media>();
- private ArrayList<YalpUser> userList = new ArrayList<YalpUser>();
- private ClientConfiguration settings;
- private String clientIP;
- private String curPasswd;
- private AccessRights userGroup=AccessRights.DENY;
- private String userName;
- private Boolean playback = false;
- private Boolean logoff= false;
- private Session session = new Session();
-/*
- * Instances srvConnection to Registry, DbConnection, ServerControl
- * and VlcStreamer. Also instances Class variables
- */
- public Model(String[] argv) {
-
- this.settings=new ClientConfiguration();
- loadConfig("ClientConfiguration.xml");
- writeConfig("ClientConfiguration.xml");
-
- try {
- ORB orb = ORB.init(argv, null);
-
- org.omg.CORBA.Object objRef =
- orb.resolve_initial_references("NameService");
-
- NamingContextExt ncRef = NamingContextExtHelper.narrow(objRef);
-
- String name = "YALP_Server";
- srvCon = ServerControlInterfaceHelper.narrow(ncRef.resolve_str(name));
- } catch (Exception e) {// DEBUG
- String errorStr="couldn't connect to YALP Server";
-
- MessageBox messageBox = new MessageBox(
- new Shell(Display.getDefault(),SWT.MIN), SWT.OK );
-
- System.out.println(e);
- messageBox.setMessage(errorStr);
- messageBox.open();
- System.exit(0);
- }
-
- // determine client IP Adress
- try {
- this.clientIP = Inet4Address.getLocalHost().getHostAddress();
- System.out.println(this.clientIP);
- } catch (UnknownHostException e) {
- String errorStr = "Model.model: determine IP failed";
-
- MessageBox messageBox = new MessageBox(
- new Shell(Display.getDefault(),SWT.MIN), SWT.OK );
-
- System.out.println(errorStr);
- messageBox.setMessage(errorStr);
- messageBox.open();
- System.exit(0);
- }
- this.userList = new ArrayList<YalpUser>();
- this.playList = new ArrayList<Media>();
- this.toPlaylist = new ArrayList<Media>();
- }
-
-/*
- * write Configuration to XML File
- *
- * @param fileName
- * @return boolean: true if succesful
- */
- public boolean writeConfig(String fileName) {
- try {
- FileOutputStream srvConfigFile = new FileOutputStream(fileName);
- XMLEncoder srvConfigWriter = new XMLEncoder(srvConfigFile);
- srvConfigWriter.writeObject(settings.serverIP);
- srvConfigWriter.writeObject(settings.classServerPort);
- srvConfigWriter.writeObject(settings.registryPort);
- srvConfigWriter.writeObject(settings.vlcCommand);
- srvConfigWriter.close();
- } catch (FileNotFoundException fnfe) {
- return false;
- }
- return true;
- }
-
-/*
- * load Configuration from XML File if possible
- *
- * @param fileName
- * @return boolean: true if succesful
- */
- public boolean loadConfig(String fileName){
- try{
- FileInputStream srvConfigFile = new FileInputStream(fileName);
- XMLDecoder srvConfigLoader = new XMLDecoder(srvConfigFile);
- System.out.println(srvConfigFile);
- settings.serverIP = (String)srvConfigLoader.readObject();
- settings.classServerPort= (Integer)srvConfigLoader.readObject();
- settings.registryPort = (Integer)srvConfigLoader.readObject();
- settings.vlcCommand = (String)srvConfigLoader.readObject();
- srvConfigLoader.close();
- } catch(FileNotFoundException fnfe) {
- System.out.println("Configuration not found, loading defaults...");
- return false;
- } catch(ClassCastException cce) {
- System.out.println("Errors in Configuration, loading defaults...");
- return false;
- }
- return true;
- }
-
-/*
- * get acutal srvConfig object
- *
- * @return ClientConfiguration: aktuelle Konfiguration
- */
- public ClientConfiguration getConfig(){
- return this.settings;
- }
-
-/*
- * setzen und speichern eines ClientConfiguration Files
- *
- * @param set
- * ClientConfiguration.xml
- * @return boolean: true if succesful written Configuration
- */
- public boolean setConfig(ClientConfiguration set){
- this.settings = set;
- return this.writeConfig("ClientConfiguration.xml");
- }
-
-/*
- * Sends YalpUsername and passwd to Server and returns YalpUsergroup
- *
- * @param username
- * @param passwd
- * @return AccessRights
- */
- public AccessRights userVerify(String username,String passwd){
- this.userName=username;
- this.curPasswd = passwd;
- YalpErrorHolder err = new YalpErrorHolder();
- SessionHolder sess = new SessionHolder();
- try{
- // log on server
- this.srvCon.clientLogon(this.userName,passwd,this.clientIP,sess,err);
- this.session = sess.value;
- this.userGroup = sess.value.me.level;
- /*
- } catch (RemoteException e) {
- System.out.println("client.Model: Logon on Server failed 1"+ e);
- e.printStackTrace();
- System.out.println("client.Model: Logon on Server failed 1");
- } catch (MalformedURLException e) {
- System.out.println("client.Model: Logon on Server failed 2");
- } catch (SQLException e) {
- System.out.println("client.Model: Logon on Server failed 3");
- } catch (NotBoundException e) {
- System.out.println("client.Model: Logon on Server failed 4");
- */
- }catch(NullPointerException e){
- System.out.println("YALP Server couldn't be reached");
- this.userGroup = AccessRights.NO_YALP_SERVER;
- }
- return this.userGroup;
- }
-
-/*
- * Gets a list with all YalpUsers from the server
- *
- * @return ArrayList<YalpUser> all registered YalpUsers
- */
- public ArrayList<YalpUser> getUser(){
- YalpErrorHolder err = new YalpErrorHolder();
- try{
- UsersHolder usr = new UsersHolder();
- this.srvCon.getUser(usr, err);
- this.userList = new ArrayList<YalpUser>(usr.value.length);
- for(int i = 0; i < usr.value.length; i++)
- this.userList.add(usr.value[i]);
- }catch(Exception e){
- System.out.println("Exceoption in Model userList "+ e);
- }
- return userList;
- }
-
-/*
- * Sends User change request to server
- *
- * @param user
- * Configuration with changes on specific YalpUser
- */
- public void changeUser(YalpUser user, String passwd, Action action) {
- YalpErrorHolder err = new YalpErrorHolder();
- try{
- this.srvCon.changeUser( user,
- passwd,
- action,
- err );
- System.out.println(err.value.descr);
- }catch(Exception e){
- System.out.println("Exceoption in Model changeUser "+ e);
- }
- }
-
-/*
- * Sends Media change request to server and refreshes Model data
- *
- * @param media
- * to change
- * @return boolean: succesful changed media
- */
- public Boolean changeMedia(Media media, Action action){
- YalpErrorHolder err = new YalpErrorHolder();
- try{
- this.srvCon.changeMedia(media, action, err);
- if(err.value.code == YalpErrorCode.OK){
- Media result;
- for (int i=0;i<this.editMedia.size();i++){
- result=this.editMedia.get(i);
- /* t.b.d. alter to new db desgin
- if (result.id==media.id){
- result.type=media.type;
- result.title=media.title;
- result.author=media.author;
- result.album=media.album;
- result.category=media.category;
- result.year=media.year;
- result.duration=media.duration;
- result.aBitrate=media.aBitrate;
- result.vBitrate=media.vBitrate;
- result.resolution=media.resolution;
- result.ownerId=media.ownerId;
- result.lastEdit=media.lastEdit;
- result.path=media.path;
- result.name=media.name;
- return true;
- }
- */
- }
- }
- } catch(Exception e) {
- System.out.println("Exceoption in Model changeUser "+ e);
- }
- return false;
- }
-
-/*
- * adds Media with given id to Playlist
- *
- * @param id
- */
- public void add2PlayList(int id){
- Boolean notfound=true;
- for (int i=0;(i<this.findMedia.size())&& (notfound);i++){
- Media result=this.findMedia.get(i);
- if (result.id==id){
- String name = result.name;
- String path = result.path;
- if(playback){
- this.add2Stream(name, path);
- }
- this.playList.add(result);
- this.toPlaylist.add(result);
- notfound=false;
- }
- }
- }
-
-/*
- * Removes Media with given id from Playlist
- *
- * @param id
- */
- public void removeFromPlayList(int id){
- /* t.b.d.
- this.playList.remItem(id);
- this.toPlaylist.remove(id);
- */
- }
-
-/*
- * Returns List with items to play
- *
- * @return ArrayList<Media>: ArrayList to create Playlist from
- */
- public ArrayList<Media> getToPlaylist(){
- return this.toPlaylist;
- }
-
-/*
- * Creates new Stream with actual playlist
- *
- * @return Streaminfo: about new created Stream, Client should use this,
- * information to get the Information howto receive the stream
- */
- public Output createOutput(){
- /* t.b.d. former createStream */
- streamInfo.outputAction = Action.CREATE;
- Media[] a = {};
- streamInfo.playlist = this.playList.toArray(a);
- return this.streamInfo;
- }
-
-/*
- * Sends search request to server and refreshes Model data
- *
- * @param request
- * Search Request
- * @param kind
- * 1 - search in first Window; other ints: search in other window
- * (admins edit view)
- * @return int: number of results
- */
- public int search(String request, ArrayList<MediaType> types, int kind){
- YalpErrorHolder err = new YalpErrorHolder();
- MediasHolder result = new MediasHolder();
- try{
- MediaType[] a = {};
- if (kind == 1){
- srvCon.search(request, types.toArray(a), result, err);
- for(int i = 0; i < result.value.length; i++)
- findMedia.add(result.value[i]);
- return findMedia.size();
- } else {
- srvCon.search(request, types.toArray(a), result, err);
- for(int i = 0; i < result.value.length; i++)
- editMedia.add(result.value[i]);
- return editMedia.size();
- }
- } catch(Exception e){
- e.printStackTrace();
- System.out.println("Exceoption in Model search "+ e);
- return 0;
- }
- }
-
-/*
- * Returns the search result
- *
- * @param kind
- * 1 - for searchMedia of mainwindow; 2 - for searchMedia of editView
- * @return ArrayList<Media>: last found medias
- */
-
- public ArrayList<Media> getMedia(int kind){
- if (kind==1) return this.findMedia;
- else return this.editMedia;
- }
-
-/*
- * Retuns search result with given id
- *
- * @param id
- * of the result
- * @param kind
- * 1 - for mainWindow, 2 for admins editView
- * @return Media: searchMedia, with specified ID
- */
- public Media getMediaWithId(int id,int kind){
- ArrayList<Media> resultList;
- if (kind==1)resultList= this.findMedia;
- else resultList=this.editMedia;
- for (int i=0;(i<resultList.size());i++){
- Media result=resultList.get(i);
- if (result.id==id){
- return result;
- }
- }
- return null;
- }
-
-/*
- * Retuns id of YalpUser with given username
- *
- * @param username
- * @return int: useriD
- */
- public int getOwnerid(String username){
- ArrayList<YalpUser> ownerList =this.userList;
- for (YalpUser owner:ownerList){
- if (owner.name.equals(username)){
- return owner.id;
- }
- }
- return 0;
- }
-
-/*
- * Returns MediaType as string
- *
- * @param mediatype
- * @return string
- */
- public String getTypeName(MediaType type)
- {
- switch(type.value())
- {
- case MediaType._IMAGE:
- return "image";
- case MediaType._SOUND:
- return "sound";
- case MediaType._VIDEO:
- return "video";
- default:
- return "unknown";
- }
- }
-
-/*
- * Returns AccessRights as string
- *
- * @param mediatype
- * @return string
- */
- public String accessRightsName(AccessRights type)
- {
- switch(type.value())
- {
- case AccessRights._USER:
- return "user";
- case AccessRights._ADMIN:
- return "admin";
- case AccessRights._DENY:
- return "no login";
- default:
- return "unknown";
- }
- }
-
-
-/*
- * Sets class variable actualStream to given value
- *
- * @param aStream
- * stream to srvControl via play, pause, etc
- */
- public void setActualStream(Output aStream){
- actualStream = aStream;
- }
-
-/*
- * Starts Video Lan Player
- *
- * @return boolean: true if vlc can be started and a stream is actualStream
- */
- private boolean startVLC(){
-
- String vlcCmd = "/usr/bin/vlc" +
- " --ignore-config --no-qt-privacy-ask --video-on-top --qt-display-mode=2";
- //settings.vlcCommand
-/*
- switch (this.actualStream.getAccess()){
- case UDP:
- */
- vlcCmd += " udp://@:";
- /*
- break;
- case HTTP:
- vlcCmd += "http://";
- break;
- default:
- System.out.println(
- "client.Model.startVLC: playback this type is not supported" );
- }
-*/
- vlcCmd += "9993"; // actualStream.info.params;
- System.out.println(vlcCmd);
-
- try {
- this.vlcPlayer = Runtime.getRuntime().exec(vlcCmd);
- } catch (IOException e) {
- System.out.println("client.Model.startVLC: starting vlcPlayer failed");
- return false;
- }
- return true;
- }
-
-/*
- * Stops Video Lan Player
- *
- */
- private void stopVLC(){
- playback = false;
- if(vlcPlayer != null)
- vlcPlayer.destroy();
- }
-
-/*
- * Starts playback of actual playlist
- *
- * @return void
- */
- public boolean play(){
-
- playback = true;
-
- actualStream.outputAction = Action.CREATE;
- actualStream.info = new AccessInfo( "bam",
- "bam",
- "vlc",
- "params",
- AccessType.STREAM );
-
- Media[] a = new Media[playList.size()];
- actualStream.playlist = playList.toArray(a);
- actualStream.destIp = clientIP;
-
- YalpErrorHolder err = new YalpErrorHolder();
-
- OutputHolder tmp = new OutputHolder();
- tmp.value = actualStream;
-
- srvCon.control(tmp, err);
- actualStream = tmp.value;
-
- actualStream.outputAction = Action.START;
- OutputHolder tmp2 = new OutputHolder(actualStream);
- srvCon.control(tmp2, err);
- actualStream = tmp2.value;
- startVLC();
- return true;
- }
-
-/*
- * Adds a new Media to Playlist. Only during playback
- *
- * @param name
- * @param path
- * @return boolean: true if succesful added
- */
- public boolean add2Stream(String name, String path){
-
- YalpErrorHolder err = new YalpErrorHolder();
- Media[] empty = {};
- this.actualStream.playlist = empty;
-
- Media media = new Media();
- media.path = path;
- media.fileName = name;
-
- this.actualStream.playlist[this.actualStream.playlist.length] = media;
- this.actualStream.outputAction = Action.CREATE;
-
- OutputHolder tmp = new OutputHolder(this.actualStream);
- this.srvCon.control(tmp, err);
- this.actualStream = tmp.value;
- return true;
- }
-
-/*
- * Stops playback
- *
- * @return boolean: false - if srvConnection to streamer failed
- */
- public boolean stop(){
- YalpErrorHolder err = new YalpErrorHolder();
- this.actualStream.outputAction = Action.STOP;
- OutputHolder tmp = new OutputHolder(this.actualStream);
- this.srvCon.control(tmp,err);
- this.actualStream = tmp.value;
- this.stopVLC();
- return true;
- }
-
-/*
- * jumps to next media in playlist
- *
- * @return boolean: false - if srvConnection to streamer failed
- */
- public boolean next(){
- YalpErrorHolder err = new YalpErrorHolder();
- this.actualStream.outputAction = Action.FORWARD;
- OutputHolder tmp = new OutputHolder(this.actualStream);
- this.srvCon.control(tmp,err);
- this.actualStream = tmp.value;
- return true;
- }
-
-/*
- * Pauses playback
- *
- * @return boolean: false - if srvConnection to streamer failed
- */
- public boolean pause(){
- YalpErrorHolder err = new YalpErrorHolder();
- this.actualStream.outputAction = Action.PAUSE;
- OutputHolder tmp = new OutputHolder(this.actualStream);
- this.srvCon.control(tmp,err);
- this.actualStream = tmp.value;
- return true;
- }
-
-/*
- * Causes the server to clean up and shutdown
- *
- */
- public void serverShutdown(){
- if (this.playback)
- this.stop();
- this.srvCon.serverShutdown();
- }
-
-/*
- * Checks if the server is still alive if not Client shutdown
- *
- */
- public void serverStillAlive(){
- // try{
- // srvCon.ping();
- /* }catch (RemoteException e){
- if (this.playback)
- this.stopVLC();
- String errorStr="Server shutdown - Client is going down too";
-
- MessageBox messageBox = new MessageBox(
- new Shell(Display.getDefault(),SWT.MIN), SWT.OK);
-
- System.out.println(errorStr);
- messageBox.setMessage(errorStr);
- messageBox.open();
- System.exit(0);
- } */
- }
-
-/*
- * Returns client IP address
- *
- * @return String: ipAddress
- */
- public String getClientIp(){
- return this.clientIP;
- }
-
-/*
- * Returns username of logged in user
- *
- * @return String: username
- */
- public String getYalpUserName(){
- return this.userName;
- }
-
-/*
- * Returns indication if playback is runing
- *
- * @return boolean: true - if is play'in
- */
- public Boolean getPlayback(){
- return this.playback;
- }
-
-/*
- * Get Total amount of streams played
- *
- * @return int: number of Streams totally played
- *
- public int getAllStreamNum(){
- try{
- return this.srvCon.getStreamCounter().getAllStreams();
- }catch (Exception e){
- System.out.println("Exception in Model.getAllStreamNum"+e);
- }
- return -1;
- }
- */
-
-/*
- * Gets amount of Streams actual playing
- *
- * @return int: number of Streams play'in at the moment
- *
- public int getActualStreamNum(){
- try{
- return this.srvCon.getStreamCounter().getActualStreams();
- }catch (Exception e){
- System.out.println("Exception in Model.getActualStreamNum"+e);
- }
- return -1;
- }
- */
-
-/*
- * Sets class variable logoff to true and logs off from server
- */
- public void logoff(){
- YalpErrorHolder err = new YalpErrorHolder();
- try{
- this.logoff=true;
- this.srvCon.clientLogoff(this.session, err);
- }catch(Exception e) {// DEBUG
- System.out.println("Model Exeptions in logoff");
- e.printStackTrace();
- }
- }
-
-/*
- * Returns indication if client is logging of
- *
- * @return Boolean: true - if is logging of
- */
- public Boolean getLogoff(){
- return this.logoff;
- }
-}
+/*
+ * Copyright (c) 2006 Manuel Traut and Volker Dahnke
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Common Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/cpl-v10.html
+ *
+ * Contributors: Manuel Traut and Volker Dahnke
+ */
+
+package YalpClients.SwtClient;
+
+import YalpInterfaces.*;
+import YalpClients.*;
+
+import java.beans.XMLDecoder;
+import java.beans.XMLEncoder;
+import java.io.*;
+import java.net.Inet4Address;
+import java.net.MalformedURLException;
+import java.net.UnknownHostException;
+import java.sql.SQLException;
+import java.util.ArrayList;
+
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.widgets.Display;
+import org.eclipse.swt.widgets.MessageBox;
+import org.eclipse.swt.widgets.Shell;
+
+import org.omg.CosNaming.*;
+import org.omg.CosNaming.NamingContextPackage.*;
+import org.omg.CORBA.*;
+
+/*
+ * Class Model
+ *
+ * <em>Implementiert die Schnittstellenfunktionen zur Steuerung des Servers
+ * (Datenbankinhalte schreiben, lesen; Streaming steuern</em>
+ *
+ * @author Volker Dahnke / Manuel Traut
+ *
+ * @version 0.6 14-12-2005<br>
+ *
+ * @see client.GUI
+ */
+
+public class Model {
+
+ public ServerControlInterface srvCon;
+ private Process vlcPlayer;
+ private Output actualStream = new Output();
+ private Output streamInfo = new Output();
+ private ArrayList<Media> findMedia = new ArrayList<Media>();
+ private ArrayList<Media> editMedia = new ArrayList<Media>();
+ private ArrayList<Media> toPlaylist = new ArrayList<Media>();
+ private ArrayList<Media> playList = new ArrayList<Media>();
+ private ArrayList<YalpUser> userList = new ArrayList<YalpUser>();
+ private ClientConfiguration settings;
+ private String clientIP;
+ private String curPasswd;
+ private AccessRights userGroup=AccessRights.DENY;
+ private String userName;
+ private Boolean playback = false;
+ private Boolean logoff= false;
+ private Session session = new Session();
+/*
+ * Instances srvConnection to Registry, DbConnection, ServerControl
+ * and VlcStreamer. Also instances Class variables
+ */
+ public Model(String[] argv) {
+
+ this.settings=new ClientConfiguration();
+ loadConfig("ClientConfiguration.xml");
+ writeConfig("ClientConfiguration.xml");
+
+ try {
+ ORB orb = ORB.init(argv, null);
+
+ org.omg.CORBA.Object objRef =
+ orb.resolve_initial_references("NameService");
+
+ NamingContextExt ncRef = NamingContextExtHelper.narrow(objRef);
+
+ String name = "YALP_Server";
+ srvCon = ServerControlInterfaceHelper.narrow(ncRef.resolve_str(name));
+ } catch (Exception e) {// DEBUG
+ String errorStr="couldn't connect to YALP Server";
+
+ MessageBox messageBox = new MessageBox(
+ new Shell(Display.getDefault(),SWT.MIN), SWT.OK );
+
+ System.out.println(e);
+ messageBox.setMessage(errorStr);
+ messageBox.open();
+ System.exit(0);
+ }
+
+ // determine client IP Adress
+ try {
+ this.clientIP = Inet4Address.getLocalHost().getHostAddress();
+ System.out.println(this.clientIP);
+ } catch (UnknownHostException e) {
+ String errorStr = "Model.model: determine IP failed";
+
+ MessageBox messageBox = new MessageBox(
+ new Shell(Display.getDefault(),SWT.MIN), SWT.OK );
+
+ System.out.println(errorStr);
+ messageBox.setMessage(errorStr);
+ messageBox.open();
+ System.exit(0);
+ }
+ this.userList = new ArrayList<YalpUser>();
+ this.playList = new ArrayList<Media>();
+ this.toPlaylist = new ArrayList<Media>();
+ }
+
+/*
+ * write Configuration to XML File
+ *
+ * @param fileName
+ * @return boolean: true if succesful
+ */
+ public boolean writeConfig(String fileName) {
+ try {
+ FileOutputStream srvConfigFile = new FileOutputStream(fileName);
+ XMLEncoder srvConfigWriter = new XMLEncoder(srvConfigFile);
+ srvConfigWriter.writeObject(settings.serverIP);
+ srvConfigWriter.writeObject(settings.classServerPort);
+ srvConfigWriter.writeObject(settings.registryPort);
+ srvConfigWriter.writeObject(settings.vlcCommand);
+ srvConfigWriter.close();
+ } catch (FileNotFoundException fnfe) {
+ return false;
+ }
+ return true;
+ }
+
+/*
+ * load Configuration from XML File if possible
+ *
+ * @param fileName
+ * @return boolean: true if succesful
+ */
+ public boolean loadConfig(String fileName){
+ try{
+ FileInputStream srvConfigFile = new FileInputStream(fileName);
+ XMLDecoder srvConfigLoader = new XMLDecoder(srvConfigFile);
+ System.out.println(srvConfigFile);
+ settings.serverIP = (String)srvConfigLoader.readObject();
+ settings.classServerPort= (Integer)srvConfigLoader.readObject();
+ settings.registryPort = (Integer)srvConfigLoader.readObject();
+ settings.vlcCommand = (String)srvConfigLoader.readObject();
+ srvConfigLoader.close();
+ } catch(FileNotFoundException fnfe) {
+ System.out.println("Configuration not found, loading defaults...");
+ return false;
+ } catch(ClassCastException cce) {
+ System.out.println("Errors in Configuration, loading defaults...");
+ return false;
+ }
+ return true;
+ }
+
+/*
+ * get acutal srvConfig object
+ *
+ * @return ClientConfiguration: aktuelle Konfiguration
+ */
+ public ClientConfiguration getConfig(){
+ return this.settings;
+ }
+
+/*
+ * setzen und speichern eines ClientConfiguration Files
+ *
+ * @param set
+ * ClientConfiguration.xml
+ * @return boolean: true if succesful written Configuration
+ */
+ public boolean setConfig(ClientConfiguration set){
+ this.settings = set;
+ return this.writeConfig("ClientConfiguration.xml");
+ }
+
+/*
+ * Sends YalpUsername and passwd to Server and returns YalpUsergroup
+ *
+ * @param username
+ * @param passwd
+ * @return AccessRights
+ */
+ public AccessRights userVerify(String username,String passwd){
+ this.userName=username;
+ this.curPasswd = passwd;
+ YalpErrorHolder err = new YalpErrorHolder();
+ SessionHolder sess = new SessionHolder();
+ try{
+ // log on server
+ this.srvCon.clientLogon(this.userName,passwd,this.clientIP,sess,err);
+ this.session = sess.value;
+ this.userGroup = sess.value.me.level;
+ /*
+ } catch (RemoteException e) {
+ System.out.println("client.Model: Logon on Server failed 1"+ e);
+ e.printStackTrace();
+ System.out.println("client.Model: Logon on Server failed 1");
+ } catch (MalformedURLException e) {
+ System.out.println("client.Model: Logon on Server failed 2");
+ } catch (SQLException e) {
+ System.out.println("client.Model: Logon on Server failed 3");
+ } catch (NotBoundException e) {
+ System.out.println("client.Model: Logon on Server failed 4");
+ */
+ }catch(NullPointerException e){
+ System.out.println("YALP Server couldn't be reached");
+ this.userGroup = AccessRights.NO_YALP_SERVER;
+ }
+ return this.userGroup;
+ }
+
+/*
+ * Gets a list with all YalpUsers from the server
+ *
+ * @return ArrayList<YalpUser> all registered YalpUsers
+ */
+ public ArrayList<YalpUser> getUser(){
+ YalpErrorHolder err = new YalpErrorHolder();
+ try{
+ UsersHolder usr = new UsersHolder();
+ this.srvCon.getUser(usr, err);
+ this.userList = new ArrayList<YalpUser>(usr.value.length);
+ for(int i = 0; i < usr.value.length; i++)
+ this.userList.add(usr.value[i]);
+ }catch(Exception e){
+ System.out.println("Exceoption in Model userList "+ e);
+ }
+ return userList;
+ }
+
+/*
+ * Sends User change request to server
+ *
+ * @param user
+ * Configuration with changes on specific YalpUser
+ */
+ public void changeUser(YalpUser user, String passwd, Action action) {
+ YalpErrorHolder err = new YalpErrorHolder();
+ try{
+ this.srvCon.changeUser( user,
+ passwd,
+ action,
+ err );
+ System.out.println(err.value.descr);
+ }catch(Exception e){
+ System.out.println("Exceoption in Model changeUser "+ e);
+ }
+ }
+
+/*
+ * Sends Media change request to server and refreshes Model data
+ *
+ * @param media
+ * to change
+ * @return boolean: succesful changed media
+ */
+ public Boolean changeMedia(Media media, Action action){
+ YalpErrorHolder err = new YalpErrorHolder();
+ try{
+ this.srvCon.changeMedia(media, action, err);
+ if(err.value.code == YalpErrorCode.OK){
+ Media result;
+ for (int i=0;i<this.editMedia.size();i++){
+ result=this.editMedia.get(i);
+ /* t.b.d. alter to new db desgin
+ if (result.id==media.id){
+ result.type=media.type;
+ result.title=media.title;
+ result.author=media.author;
+ result.album=media.album;
+ result.category=media.category;
+ result.year=media.year;
+ result.duration=media.duration;
+ result.aBitrate=media.aBitrate;
+ result.vBitrate=media.vBitrate;
+ result.resolution=media.resolution;
+ result.ownerId=media.ownerId;
+ result.lastEdit=media.lastEdit;
+ result.path=media.path;
+ result.name=media.name;
+ return true;
+ }
+ */
+ }
+ }
+ } catch(Exception e) {
+ System.out.println("Exceoption in Model changeUser "+ e);
+ }
+ return false;
+ }
+
+/*
+ * adds Media with given id to Playlist
+ *
+ * @param id
+ */
+ public void add2PlayList(int id){
+ Boolean notfound=true;
+ for (int i=0;(i<this.findMedia.size())&& (notfound);i++){
+ Media result=this.findMedia.get(i);
+ if (result.id==id){
+ String name = result.name;
+ String path = result.path;
+ if(playback){
+ this.add2Stream(name, path);
+ }
+ this.playList.add(result);
+ this.toPlaylist.add(result);
+ notfound=false;
+ }
+ }
+ }
+
+/*
+ * Removes Media with given id from Playlist
+ *
+ * @param id
+ */
+ public void removeFromPlayList(int id){
+ /* t.b.d.
+ this.playList.remItem(id);
+ this.toPlaylist.remove(id);
+ */
+ }
+
+/*
+ * Returns List with items to play
+ *
+ * @return ArrayList<Media>: ArrayList to create Playlist from
+ */
+ public ArrayList<Media> getToPlaylist(){
+ return this.toPlaylist;
+ }
+
+/*
+ * Creates new Stream with actual playlist
+ *
+ * @return Streaminfo: about new created Stream, Client should use this,
+ * information to get the Information howto receive the stream
+ */
+ public Output createOutput(){
+ /* t.b.d. former createStream */
+ streamInfo.outputAction = Action.CREATE;
+ Media[] a = {};
+ streamInfo.playlist = this.playList.toArray(a);
+ return this.streamInfo;
+ }
+
+/*
+ * Sends search request to server and refreshes Model data
+ *
+ * @param request
+ * Search Request
+ * @param kind
+ * 1 - search in first Window; other ints: search in other window
+ * (admins edit view)
+ * @return int: number of results
+ */
+ public int search(String request, ArrayList<MediaType> types, int kind){
+ YalpErrorHolder err = new YalpErrorHolder();
+ MediasHolder result = new MediasHolder();
+ try{
+ MediaType[] a = {};
+ if (kind == 1){
+ srvCon.search(request, types.toArray(a), result, err);
+ for(int i = 0; i < result.value.length; i++)
+ findMedia.add(result.value[i]);
+ return findMedia.size();
+ } else {
+ srvCon.search(request, types.toArray(a), result, err);
+ for(int i = 0; i < result.value.length; i++)
+ editMedia.add(result.value[i]);
+ return editMedia.size();
+ }
+ } catch(Exception e){
+ e.printStackTrace();
+ System.out.println("Exceoption in Model search "+ e);
+ return 0;
+ }
+ }
+
+/*
+ * Returns the search result
+ *
+ * @param kind
+ * 1 - for searchMedia of mainwindow; 2 - for searchMedia of editView
+ * @return ArrayList<Media>: last found medias
+ */
+
+ public ArrayList<Media> getMedia(int kind){
+ if (kind==1) return this.findMedia;
+ else return this.editMedia;
+ }
+
+/*
+ * Retuns search result with given id
+ *
+ * @param id
+ * of the result
+ * @param kind
+ * 1 - for mainWindow, 2 for admins editView
+ * @return Media: searchMedia, with specified ID
+ */
+ public Media getMediaWithId(int id,int kind){
+ ArrayList<Media> resultList;
+ if (kind==1)resultList= this.findMedia;
+ else resultList=this.editMedia;
+ for (int i=0;(i<resultList.size());i++){
+ Media result=resultList.get(i);
+ if (result.id==id){
+ return result;
+ }
+ }
+ return null;
+ }
+
+/*
+ * Retuns id of YalpUser with given username
+ *
+ * @param username
+ * @return int: useriD
+ */
+ public int getOwnerid(String username){
+ ArrayList<YalpUser> ownerList =this.userList;
+ for (YalpUser owner:ownerList){
+ if (owner.name.equals(username)){
+ return owner.id;
+ }
+ }
+ return 0;
+ }
+
+/*
+ * Returns MediaType as string
+ *
+ * @param mediatype
+ * @return string
+ */
+ public String getTypeName(MediaType type)
+ {
+ switch(type.value())
+ {
+ case MediaType._IMAGE:
+ return "image";
+ case MediaType._SOUND:
+ return "sound";
+ case MediaType._VIDEO:
+ return "video";
+ default:
+ return "unknown";
+ }
+ }
+
+/*
+ * Returns AccessRights as string
+ *
+ * @param mediatype
+ * @return string
+ */
+ public String accessRightsName(AccessRights type)
+ {
+ switch(type.value())
+ {
+ case AccessRights._USER:
+ return "user";
+ case AccessRights._ADMIN:
+ return "admin";
+ case AccessRights._DENY:
+ return "no login";
+ default:
+ return "unknown";
+ }
+ }
+
+
+/*
+ * Sets class variable actualStream to given value
+ *
+ * @param aStream
+ * stream to srvControl via play, pause, etc
+ */
+ public void setActualStream(Output aStream){
+ actualStream = aStream;
+ }
+
+/*
+ * Starts Video Lan Player
+ *
+ * @return boolean: true if vlc can be started and a stream is actualStream
+ */
+ private boolean startVLC(){
+
+ String vlcCmd = "/usr/bin/vlc" +
+ " --ignore-config --no-qt-privacy-ask --video-on-top --qt-display-mode=2";
+ //settings.vlcCommand
+/*
+ switch (this.actualStream.getAccess()){
+ case UDP:
+ */
+ vlcCmd += " udp://@:";
+ /*
+ break;
+ case HTTP:
+ vlcCmd += "http://";
+ break;
+ default:
+ System.out.println(
+ "client.Model.startVLC: playback this type is not supported" );
+ }
+*/
+ vlcCmd += "9993"; // actualStream.info.params;
+ System.out.println(vlcCmd);
+
+ try {
+ this.vlcPlayer = Runtime.getRuntime().exec(vlcCmd);
+ } catch (IOException e) {
+ System.out.println("client.Model.startVLC: starting vlcPlayer failed");
+ return false;
+ }
+ return true;
+ }
+
+/*
+ * Stops Video Lan Player
+ *
+ */
+ private void stopVLC(){
+ playback = false;
+ if(vlcPlayer != null)
+ vlcPlayer.destroy();
+ }
+
+/*
+ * Starts playback of actual playlist
+ *
+ * @return void
+ */
+ public boolean play(){
+
+ playback = true;
+
+ actualStream.outputAction = Action.CREATE;
+ actualStream.info = new AccessInfo( "bam",
+ "bam",
+ "vlc",
+ "params",
+ AccessType.STREAM );
+
+ Media[] a = new Media[playList.size()];
+ actualStream.playlist = playList.toArray(a);
+ actualStream.destIp = clientIP;
+
+ YalpErrorHolder err = new YalpErrorHolder();
+
+ OutputHolder tmp = new OutputHolder();
+ tmp.value = actualStream;
+
+ srvCon.control(tmp, err);
+ actualStream = tmp.value;
+
+ actualStream.outputAction = Action.START;
+ OutputHolder tmp2 = new OutputHolder(actualStream);
+ srvCon.control(tmp2, err);
+ actualStream = tmp2.value;
+ startVLC();
+ return true;
+ }
+
+/*
+ * Adds a new Media to Playlist. Only during playback
+ *
+ * @param name
+ * @param path
+ * @return boolean: true if succesful added
+ */
+ public boolean add2Stream(String name, String path){
+
+ YalpErrorHolder err = new YalpErrorHolder();
+ Media[] empty = {};
+ this.actualStream.playlist = empty;
+
+ Media media = new Media();
+ media.path = path;
+ media.fileName = name;
+
+ this.actualStream.playlist[this.actualStream.playlist.length] = media;
+ this.actualStream.outputAction = Action.CREATE;
+
+ OutputHolder tmp = new OutputHolder(this.actualStream);
+ this.srvCon.control(tmp, err);
+ this.actualStream = tmp.value;
+ return true;
+ }
+
+/*
+ * Stops playback
+ *
+ * @return boolean: false - if srvConnection to streamer failed
+ */
+ public boolean stop(){
+ YalpErrorHolder err = new YalpErrorHolder();
+ this.actualStream.outputAction = Action.STOP;
+ OutputHolder tmp = new OutputHolder(this.actualStream);
+ this.srvCon.control(tmp,err);
+ this.actualStream = tmp.value;
+ this.stopVLC();
+ return true;
+ }
+
+/*
+ * jumps to next media in playlist
+ *
+ * @return boolean: false - if srvConnection to streamer failed
+ */
+ public boolean next(){
+ YalpErrorHolder err = new YalpErrorHolder();
+ this.actualStream.outputAction = Action.FORWARD;
+ OutputHolder tmp = new OutputHolder(this.actualStream);
+ this.srvCon.control(tmp,err);
+ this.actualStream = tmp.value;
+ return true;
+ }
+
+/*
+ * Pauses playback
+ *
+ * @return boolean: false - if srvConnection to streamer failed
+ */
+ public boolean pause(){
+ YalpErrorHolder err = new YalpErrorHolder();
+ this.actualStream.outputAction = Action.PAUSE;
+ OutputHolder tmp = new OutputHolder(this.actualStream);
+ this.srvCon.control(tmp,err);
+ this.actualStream = tmp.value;
+ return true;
+ }
+
+/*
+ * Causes the server to clean up and shutdown
+ *
+ */
+ public void serverShutdown(){
+ if (this.playback)
+ this.stop();
+ this.srvCon.serverShutdown();
+ }
+
+/*
+ * Checks if the server is still alive if not Client shutdown
+ *
+ */
+ public void serverStillAlive(){
+ // try{
+ // srvCon.ping();
+ /* }catch (RemoteException e){
+ if (this.playback)
+ this.stopVLC();
+ String errorStr="Server shutdown - Client is going down too";
+
+ MessageBox messageBox = new MessageBox(
+ new Shell(Display.getDefault(),SWT.MIN), SWT.OK);
+
+ System.out.println(errorStr);
+ messageBox.setMessage(errorStr);
+ messageBox.open();
+ System.exit(0);
+ } */
+ }
+
+/*
+ * Returns client IP address
+ *
+ * @return String: ipAddress
+ */
+ public String getClientIp(){
+ return this.clientIP;
+ }
+
+/*
+ * Returns username of logged in user
+ *
+ * @return String: username
+ */
+ public String getYalpUserName(){
+ return this.userName;
+ }
+
+/*
+ * Returns indication if playback is runing
+ *
+ * @return boolean: true - if is play'in
+ */
+ public Boolean getPlayback(){
+ return this.playback;
+ }
+
+/*
+ * Get Total amount of streams played
+ *
+ * @return int: number of Streams totally played
+ *
+ public int getAllStreamNum(){
+ try{
+ return this.srvCon.getStreamCounter().getAllStreams();
+ }catch (Exception e){
+ System.out.println("Exception in Model.getAllStreamNum"+e);
+ }
+ return -1;
+ }
+ */
+
+/*
+ * Gets amount of Streams actual playing
+ *
+ * @return int: number of Streams play'in at the moment
+ *
+ public int getActualStreamNum(){
+ try{
+ return this.srvCon.getStreamCounter().getActualStreams();
+ }catch (Exception e){
+ System.out.println("Exception in Model.getActualStreamNum"+e);
+ }
+ return -1;
+ }
+ */
+
+/*
+ * Sets class variable logoff to true and logs off from server
+ */
+ public void logoff(){
+ YalpErrorHolder err = new YalpErrorHolder();
+ try{
+ this.logoff=true;
+ this.srvCon.clientLogoff(this.session, err);
+ }catch(Exception e) {// DEBUG
+ System.out.println("Model Exeptions in logoff");
+ e.printStackTrace();
+ }
+ }
+
+/*
+ * Returns indication if client is logging of
+ *
+ * @return Boolean: true - if is logging of
+ */
+ public Boolean getLogoff(){
+ return this.logoff;
+ }
+}
diff --git a/src/YalpClients/SwtClient/SwtClient.java b/src/YalpClients/SwtClient/SwtClient.java
index 513d4ff..1950eaa 100755
--- a/src/YalpClients/SwtClient/SwtClient.java
+++ b/src/YalpClients/SwtClient/SwtClient.java
@@ -1,61 +1,61 @@
-/*
- *
- * Copyright (c) 2006 Manuel Traut and Volker Dahnke
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Common Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/cpl-v10.html
- *
- * Contributors: Manuel Traut and Volker Dahnke
- *
- */
-package YalpClients.SwtClient;
-
-import YalpClients.SwtClient.GUI.*;
-
-import org.eclipse.swt.*;
-import org.eclipse.swt.widgets.Display;
-import org.eclipse.swt.widgets.Shell;
-
-
-/*
- * Class SwtClient
- *
- * <em>static main method</em>
- *
- * @author Volker Dahnke / Manuel Traut
- *
- * @version 0.1 20-11-2005<br>
- */
-public class SwtClient{
-
-/*
- * Client initialization
- *
- * @param argv
- * arguments which are not used
- */
- public static void main (String[] argv) {
- try{
- System.setProperty("java.security.policy","client.policy");
- }
- catch (Exception e) {//DEBUG
- System.out.println ("Server SecurityManagerExeptions not caught jet " + e);
- System.exit(0);
- }
-
- LoadDialog load = new LoadDialog(
- new Shell(Display.getDefault(),SWT.NONE), SWT.NONE);
-
- load.show();
- final Model model = new Model(argv);
- load.close();
-
- StartDialog start =
- new StartDialog(new Shell(Display.getDefault(),SWT.MIN),model, SWT.NONE);
-
- start.show();
-
- return;
- }
-}
+/*
+ *
+ * Copyright (c) 2006 Manuel Traut and Volker Dahnke
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Common Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/cpl-v10.html
+ *
+ * Contributors: Manuel Traut and Volker Dahnke
+ *
+ */
+package YalpClients.SwtClient;
+
+import YalpClients.SwtClient.GUI.*;
+
+import org.eclipse.swt.*;
+import org.eclipse.swt.widgets.Display;
+import org.eclipse.swt.widgets.Shell;
+
+
+/*
+ * Class SwtClient
+ *
+ * <em>static main method</em>
+ *
+ * @author Volker Dahnke / Manuel Traut
+ *
+ * @version 0.1 20-11-2005<br>
+ */
+public class SwtClient{
+
+/*
+ * Client initialization
+ *
+ * @param argv
+ * arguments which are not used
+ */
+ public static void main (String[] argv) {
+ try{
+ System.setProperty("java.security.policy","client.policy");
+ }
+ catch (Exception e) {//DEBUG
+ System.out.println ("Server SecurityManagerExeptions not caught jet " + e);
+ System.exit(0);
+ }
+
+ LoadDialog load = new LoadDialog(
+ new Shell(Display.getDefault(),SWT.NONE), SWT.NONE);
+
+ load.show();
+ final Model model = new Model(argv);
+ load.close();
+
+ StartDialog start =
+ new StartDialog(new Shell(Display.getDefault(),SWT.MIN),model, SWT.NONE);
+
+ start.show();
+
+ return;
+ }
+}
diff --git a/src/YalpClients/WebClient/App.xaml b/src/YalpClients/WebClient/App.xaml
new file mode 100644
index 0000000..48a0475
--- /dev/null
+++ b/src/YalpClients/WebClient/App.xaml
@@ -0,0 +1,8 @@
+<Application xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
+ xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
+ x:Class="VideoPlayer.App"
+ >
+ <Application.Resources>
+
+ </Application.Resources>
+</Application>
diff --git a/src/YalpClients/WebClient/App.xaml.cs b/src/YalpClients/WebClient/App.xaml.cs
new file mode 100644
index 0000000..2a30f24
--- /dev/null
+++ b/src/YalpClients/WebClient/App.xaml.cs
@@ -0,0 +1,66 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Net;
+using System.Windows;
+using System.Windows.Controls;
+using System.Windows.Documents;
+using System.Windows.Input;
+using System.Windows.Media;
+using System.Windows.Media.Animation;
+using System.Windows.Shapes;
+
+namespace VideoPlayer
+{
+ public partial class App : Application
+ {
+
+ public App()
+ {
+ this.Startup += this.Application_Startup;
+ this.Exit += this.Application_Exit;
+ this.UnhandledException += this.Application_UnhandledException;
+
+ InitializeComponent();
+ }
+
+ private void Application_Startup(object sender, StartupEventArgs e)
+ {
+ this.RootVisual = new MainPage();
+ }
+
+ private void Application_Exit(object sender, EventArgs e)
+ {
+
+ }
+ private void Application_UnhandledException(object sender, ApplicationUnhandledExceptionEventArgs e)
+ {
+ // If the app is running outside of the debugger then report the exception using
+ // the browser's exception mechanism. On IE this will display it a yellow alert
+ // icon in the status bar and Firefox will display a script error.
+ if (!System.Diagnostics.Debugger.IsAttached)
+ {
+
+ // NOTE: This will allow the application to continue running after an exception has been thrown
+ // but not handled.
+ // For production applications this error handling should be replaced with something that will
+ // report the error to the website and stop the application.
+ e.Handled = true;
+ Deployment.Current.Dispatcher.BeginInvoke(delegate { ReportErrorToDOM(e); });
+ }
+ }
+ private void ReportErrorToDOM(ApplicationUnhandledExceptionEventArgs e)
+ {
+ try
+ {
+ string errorMsg = e.ExceptionObject.Message + e.ExceptionObject.StackTrace;
+ errorMsg = errorMsg.Replace('"', '\'').Replace("\r\n", @"\n");
+
+ System.Windows.Browser.HtmlPage.Window.Eval("throw new Error(\"Unhandled Error in Silverlight Application " + errorMsg + "\");");
+ }
+ catch (Exception)
+ {
+ }
+ }
+ }
+}
diff --git a/src/YalpClients/WebClient/Default.aspx.cs b/src/YalpClients/WebClient/Default.aspx.cs
new file mode 100644
index 0000000..0bd1d7d
--- /dev/null
+++ b/src/YalpClients/WebClient/Default.aspx.cs
@@ -0,0 +1,22 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Web;
+using System.Web.UI;
+using System.Web.UI.WebControls;
+
+namespace TwitterSearchApplication.Web
+{
+ public partial class _Default : System.Web.UI.Page
+ {
+ protected void Page_Load(object sender, EventArgs e)
+ {
+
+ }
+
+ protected void Button1_Click(object sender, EventArgs e)
+ {
+
+ }
+ }
+}
diff --git a/src/YalpClients/WebClient/Default.aspx.designer.cs b/src/YalpClients/WebClient/Default.aspx.designer.cs
new file mode 100644
index 0000000..6b1c246
--- /dev/null
+++ b/src/YalpClients/WebClient/Default.aspx.designer.cs
@@ -0,0 +1,70 @@
+//------------------------------------------------------------------------------
+// <auto-generated>
+// Dieser Code wurde von einem Tool generiert.
+// Laufzeitversion:2.0.50727.4200
+//
+// Änderungen an dieser Datei können falsches Verhalten verursachen und gehen verloren, wenn
+// der Code erneut generiert wird.
+// </auto-generated>
+//------------------------------------------------------------------------------
+
+namespace TwitterSearchApplication.Web {
+
+
+ public partial class _Default {
+
+ /// <summary>
+ /// form1-Steuerelement
+ /// </summary>
+ /// <remarks>
+ /// Automatisch generiertes Feld
+ /// Um dies zu ändern, verschieben Sie die Felddeklaration aus der Designerdatei in eine Code-Behind-Datei.
+ /// </remarks>
+ protected global::System.Web.UI.HtmlControls.HtmlForm form1;
+
+ /// <summary>
+ /// Checkbox1-Steuerelement
+ /// </summary>
+ /// <remarks>
+ /// Automatisch generiertes Feld
+ /// Um dies zu ändern, verschieben Sie die Felddeklaration aus der Designerdatei in eine Code-Behind-Datei.
+ /// </remarks>
+ protected global::System.Web.UI.WebControls.CheckBox Checkbox1;
+
+ /// <summary>
+ /// Button1-Steuerelement
+ /// </summary>
+ /// <remarks>
+ /// Automatisch generiertes Feld
+ /// Um dies zu ändern, verschieben Sie die Felddeklaration aus der Designerdatei in eine Code-Behind-Datei.
+ /// </remarks>
+ protected global::System.Web.UI.WebControls.Button Button1;
+
+ /// <summary>
+ /// TextBox1-Steuerelement
+ /// </summary>
+ /// <remarks>
+ /// Automatisch generiertes Feld
+ /// Um dies zu ändern, verschieben Sie die Felddeklaration aus der Designerdatei in eine Code-Behind-Datei.
+ /// </remarks>
+ protected global::System.Web.UI.WebControls.TextBox TextBox1;
+
+ /// <summary>
+ /// TextBox2-Steuerelement
+ /// </summary>
+ /// <remarks>
+ /// Automatisch generiertes Feld
+ /// Um dies zu ändern, verschieben Sie die Felddeklaration aus der Designerdatei in eine Code-Behind-Datei.
+ /// </remarks>
+ protected global::System.Web.UI.WebControls.TextBox TextBox2;
+
+ /// <summary>
+ /// RadioButton1-Steuerelement
+ /// </summary>
+ /// <remarks>
+ /// Automatisch generiertes Feld
+ /// Um dies zu ändern, verschieben Sie die Felddeklaration aus der Designerdatei in eine Code-Behind-Datei.
+ /// </remarks>
+ protected global::System.Web.UI.WebControls.RadioButton RadioButton1;
+ }
+}
diff --git a/src/YalpClients/WebClient/MainPage.xaml b/src/YalpClients/WebClient/MainPage.xaml
new file mode 100644
index 0000000..462b529
--- /dev/null
+++ b/src/YalpClients/WebClient/MainPage.xaml
@@ -0,0 +1,284 @@
+<UserControl xmlns:chartingToolkit="clr-namespace:System.Windows.Controls.DataVisualization.Charting;assembly=System.Windows.Controls.DataVisualization.Toolkit" x:Class="VideoPlayer.MainPage"
+ xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
+ xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
+ xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
+ xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
+ xmlns:vsm="clr-namespace:System.Windows;assembly=System.Windows"
+ mc:Ignorable="d"
+ Width="Auto" Height="Auto">
+
+ <UserControl.Resources>
+ <Style x:Key="roundThumbStyle" TargetType="Thumb">
+ <Setter Property="Template">
+ <Setter.Value>
+ <ControlTemplate TargetType="Thumb">
+ <Ellipse Stroke="#FFFFFFFF" StrokeThickness="2" Fill="#FF484848"/>
+ </ControlTemplate>
+ </Setter.Value>
+ </Setter>
+ </Style>
+ <Grid x:Name="grid" Background="Transparent">
+
+ </Grid>
+ <Style x:Key="SliderStyle" TargetType="Slider">
+ <Setter Property="Template">
+ <Setter.Value>
+ <ControlTemplate TargetType="Slider">
+ <Grid x:Name="Root" Background="Transparent">
+ <Grid.Resources>
+ <ControlTemplate x:Key="RightRepeatButtonTemplate">
+ <Rectangle Height="6" Margin="-5,0,0,0" Grid.Column="0" Grid.ColumnSpan="3"
+ StrokeThickness="0.5" RadiusY="3.5" RadiusX="3.5" Fill="#FF484848"/>
+ </ControlTemplate>
+ <ControlTemplate x:Key="LeftRepeatButtonTemplate">
+ <Rectangle Height="6" Margin="0,0,-5,0" Grid.Column="0" Grid.ColumnSpan="3"
+ StrokeThickness="0.5" RadiusY="3.5" RadiusX="3.5" Fill="#FF7F7F7F"/>
+ </ControlTemplate>
+ </Grid.Resources>
+ <Grid x:Name="HorizontalTemplate">
+ <Grid.ColumnDefinitions>
+ <ColumnDefinition Width="Auto"/>
+ <ColumnDefinition Width="Auto"/>
+ <ColumnDefinition Width="*"/>
+ </Grid.ColumnDefinitions>
+
+ <RepeatButton x:Name="HorizontalTrackLargeChangeDecreaseRepeatButton" Grid.Column="0"
+ IsTabStop="False" Template="{StaticResource LeftRepeatButtonTemplate}"/>
+ <Rectangle x:Name="LeftTrack" Grid.Row="1" Fill="#00FFFFFF" Cursor="Hand" MouseLeftButtonDown="LeftTrack_MouseLeftButtonDown"/>
+ <Thumb Background="#00FFFFFF" Height="10" x:Name="HorizontalThumb" Width="10"
+ Grid.Column="1" Style="{StaticResource roundThumbStyle}" HorizontalAlignment="Left"
+ DragStarted="HorizontalThumb_DragStarted" DragCompleted="HorizontalThumb_DragCompleted"
+ Canvas.ZIndex="1"/>
+ <RepeatButton x:Name="HorizontalTrackLargeChangeIncreaseRepeatButton" Grid.Column="2"
+ IsTabStop="False" Template="{StaticResource RightRepeatButtonTemplate}"/>
+ <Rectangle x:Name="RightTrack" Grid.Column="2" Grid.Row="1" Fill="#00FFFFFF" Cursor="Hand" MouseLeftButtonDown="LeftTrack_MouseLeftButtonDown"/>
+ </Grid>
+ </Grid>
+ </ControlTemplate>
+ </Setter.Value>
+ </Setter>
+ </Style>
+
+ <ControlTemplate x:Key="PlayButtonTemplate" TargetType="ToggleButton">
+ <Grid x:Name="grid" Background="Transparent">
+ <vsm:VisualStateManager.VisualStateGroups>
+ <vsm:VisualStateGroup x:Name="FocusStates">
+ <vsm:VisualState x:Name="Focused">
+ <Storyboard>
+ </Storyboard>
+ </vsm:VisualState>
+ <vsm:VisualState x:Name="Unfocused">
+ <Storyboard/>
+ </vsm:VisualState>
+ </vsm:VisualStateGroup>
+ <vsm:VisualStateGroup x:Name="CommonStates">
+ <vsm:VisualState x:Name="Normal">
+ <Storyboard/>
+ </vsm:VisualState>
+ <vsm:VisualState x:Name="MouseOver">
+ <Storyboard>
+ </Storyboard>
+ </vsm:VisualState>
+ <vsm:VisualState x:Name="Pressed">
+ <Storyboard/>
+ </vsm:VisualState>
+ </vsm:VisualStateGroup>
+ <vsm:VisualStateGroup x:Name="CheckStates">
+ <vsm:VisualState x:Name="Checked">
+ <Storyboard>
+ <DoubleAnimationUsingKeyFrames BeginTime="00:00:00" Duration="00:00:00.0010000"
+ Storyboard.TargetName="playSymbol"
+ Storyboard.TargetProperty="(UIElement.Opacity)">
+ <SplineDoubleKeyFrame KeyTime="00:00:00" Value="0"/>
+ </DoubleAnimationUsingKeyFrames>
+ <DoubleAnimationUsingKeyFrames BeginTime="00:00:00" Duration="00:00:00.0010000"
+ Storyboard.TargetName="pauseSymbol"
+ Storyboard.TargetProperty="(UIElement.Opacity)">
+ <SplineDoubleKeyFrame KeyTime="00:00:00" Value="1"/>
+ </DoubleAnimationUsingKeyFrames>
+ </Storyboard>
+ </vsm:VisualState>
+ <vsm:VisualState x:Name="Unchecked">
+ <Storyboard>
+ <DoubleAnimationUsingKeyFrames BeginTime="00:00:00" Duration="00:00:00.0010000" Storyboard.TargetName="pauseSymbol" Storyboard.TargetProperty="(UIElement.Opacity)">
+ <SplineDoubleKeyFrame KeyTime="00:00:00" Value="0"/>
+ </DoubleAnimationUsingKeyFrames>
+ </Storyboard>
+ </vsm:VisualState>
+ </vsm:VisualStateGroup>
+ </vsm:VisualStateManager.VisualStateGroups>
+ <Grid Margin="11,3,0,0" HorizontalAlignment="Left" VerticalAlignment="Center"
+ Opacity="1" x:Name="playSymbol" Width="21" Height="22">
+ <Path Width="14" Height="15" Stretch="Fill" Fill="#FF7F7F7F"
+ Data="F1 M 15.1997,22.542L 29.7776,14.89L 15.2707,6.99886L 15.1997,22.542 Z "/>
+ </Grid>
+ <Grid Margin="11,2,0,0" Opacity="0" x:Name="pauseSymbol" Width="31" Height="15">
+ <Rectangle Stretch="Fill" Fill="#FF7F7F7F" HorizontalAlignment="Left"
+ Margin="0,0,0,0" Width="6"/>
+ <Rectangle Stretch="Fill" Fill="#FF7F7F7F" HorizontalAlignment="Stretch"
+ Margin="6,0,13,0" Width="6"/>
+ </Grid>
+ </Grid>
+ </ControlTemplate>
+
+ <ControlTemplate x:Key="MuteButtonTemplate" TargetType="ToggleButton">
+ <Grid Background="Transparent" Cursor="Hand">
+ <vsm:VisualStateManager.VisualStateGroups>
+ <vsm:VisualStateGroup x:Name="FocusStates">
+ <vsm:VisualState x:Name="Focused">
+ <Storyboard>
+ </Storyboard>
+ </vsm:VisualState>
+ <vsm:VisualState x:Name="Unfocused">
+ <Storyboard/>
+ </vsm:VisualState>
+ </vsm:VisualStateGroup>
+ <vsm:VisualStateGroup x:Name="CommonStates">
+ <vsm:VisualState x:Name="Normal">
+ <Storyboard/>
+ </vsm:VisualState>
+ <vsm:VisualState x:Name="MouseOver">
+ <Storyboard>
+ </Storyboard>
+ </vsm:VisualState>
+ <vsm:VisualState x:Name="Pressed">
+ <Storyboard/>
+ </vsm:VisualState>
+ </vsm:VisualStateGroup>
+ <vsm:VisualStateGroup x:Name="CheckStates">
+ <vsm:VisualState x:Name="Checked">
+ <Storyboard>
+ <DoubleAnimationUsingKeyFrames BeginTime="00:00:00" Duration="00:00:00.0010000"
+ Storyboard.TargetName="volumeSymbol"
+ Storyboard.TargetProperty="(UIElement.Opacity)">
+ <SplineDoubleKeyFrame KeyTime="00:00:00" Value="0"/>
+ </DoubleAnimationUsingKeyFrames>
+ </Storyboard>
+ </vsm:VisualState>
+ <vsm:VisualState x:Name="Unchecked">
+ <Storyboard>
+ <DoubleAnimationUsingKeyFrames BeginTime="00:00:00" Duration="00:00:00.0010000"
+ Storyboard.TargetName="volumeSymbol"
+ Storyboard.TargetProperty="(UIElement.Opacity)">
+ <SplineDoubleKeyFrame KeyTime="00:00:00" Value="1"/>
+ </DoubleAnimationUsingKeyFrames>
+ </Storyboard>
+ </vsm:VisualState>
+ </vsm:VisualStateGroup>
+ </vsm:VisualStateManager.VisualStateGroups>
+ <Grid HorizontalAlignment="Left" VerticalAlignment="Top"
+ Width="17">
+ <Path HorizontalAlignment="Left" Stretch="Fill"
+ Fill="#FF7F7F7F" Data="F1 M 23.1457,26.5056L 23.1457,33.8944L 25.7913,33.8944L 28.8235,37.4722L 30.5346,37.4722L 30.5665,23.0833L 28.8995,23.0833L 25.8679,26.5056L 23.1457,26.5056 Z "
+ Width="7.421" Height="14.389" UseLayoutRounding="False"
+ Margin="0,6.5,0,6.5"/>
+
+ <Grid HorizontalAlignment="Right" Width="7.003" x:Name="volumeSymbol"
+ Height="27">
+ <Path HorizontalAlignment="Right" VerticalAlignment="Stretch"
+ Width="2.398"
+ Data="M0.5,0.5 C0.5,0.5 2.5939558,2.7128265 2.5946648,7.0504856 C2.5953746,11.391507 0.50033337,13.889001 0.50033337,13.889001"
+ Stretch="Fill" Stroke="#FF7F7F7F" Margin="0,0,-0.398,0" UseLayoutRounding="False"/>
+ <Path HorizontalAlignment="Stretch" Margin="2.4,2.384,2.317,1.584" VerticalAlignment="Stretch"
+ Data="M0.5,0.50000006 C0.5,0.50000006 1.4786903,2.1275051 1.4781417,4.9569001 C1.4776551,7.4670725 0.35717732,9.892808 0.35717732,9.892808" Stretch="Fill" Stroke="#FF7F7F7F" UseLayoutRounding="False"/>
+ <Path HorizontalAlignment="Left" Margin="0,4.36,0,3.46" VerticalAlignment="Stretch" Width="1.542"
+ Data="M0.5,0.5 C0.5,0.5 1.0412779,1.4903735 1.042276,3.1459465 C1.0429831,4.3189368 0.66544437,6.0685911 0.66544437,6.0685911" Stretch="Fill" Stroke="#FF7F7F7F" d:LayoutOverrides="Width"/>
+ </Grid>
+ </Grid>
+ </Grid>
+ </ControlTemplate>
+
+ <ControlTemplate x:Key="ButtonTemplate" TargetType="Button">
+ <Grid Background="Transparent">
+ <ContentPresenter Width="Auto"/>
+ </Grid>
+ </ControlTemplate>
+ </UserControl.Resources>
+
+ <Border x:Name="layoutRoot" Background="#FF000000">
+ <Grid HorizontalAlignment="Center" VerticalAlignment="Center">
+ <Grid.RowDefinitions>
+ <RowDefinition Height="auto" x:Name="VideoRow"/>
+ <RowDefinition Height="auto"/>
+ </Grid.RowDefinitions>
+ <Grid.ColumnDefinitions>
+ <ColumnDefinition Width="auto" x:Name="VideoColumn"/>
+ </Grid.ColumnDefinitions>
+
+ <MediaElement x:Name="mediaElement" AutoPlay="False" Stretch="Uniform"
+ MediaOpened="MediaElement_MediaOpened"
+ CacheMode="BitmapCache"
+ Grid.Row="0" Height="auto" Width="auto"/>
+
+ <Button x:Name="bigPlayButton" Template="{StaticResource ButtonTemplate}"
+ Click="BigPlayButton_Click" Grid.Row="0" >
+ <Canvas Width="100" Height="100">
+ <Path Width="100" Height="100" Canvas.Left="0" Canvas.Top="0" Stretch="Fill"
+ Fill="#77000000" Data="F1 M 15,0L 85,0C 93.2843,0 100,6.71573 100,15L 100,85C 100,93.2843 93.2843,100 85,100L 15,100C 6.71573,100 0,93.2843 0,85L 0,15C 0,6.71573 6.71573,0 15,0 Z "/>
+ <Path Width="40.8182" Height="47.1328" Canvas.Left="34.6439"
+ Canvas.Top="27.6003" Stretch="Fill" Fill="#FFFFFFFF"
+ Data="F1 M 75.4621,51.1667L 34.6439,27.6003L 34.6439,74.7331L 75.4621,51.1667 Z "/>
+ </Canvas>
+ </Button>
+
+ <Grid x:Name="transportControls" VerticalAlignment="Bottom" Height="40" Background="#FF000000"
+ Grid.Row="1" >
+ <Grid.ColumnDefinitions>
+ <ColumnDefinition Width="Auto" />
+ <ColumnDefinition Width="*" />
+ <ColumnDefinition Width="0" />
+ <ColumnDefinition Width="Auto" />
+ <ColumnDefinition Width="Auto" MinWidth="10" />
+ <ColumnDefinition Width="Auto" MinWidth="10" />
+ </Grid.ColumnDefinitions>
+
+ <!-- play symbol showing is checked = false, Pause symbol showing is checked = true-->
+ <ToggleButton x:Name="playPauseButton" Template="{StaticResource PlayButtonTemplate}"
+ Click="PlayPauseButton_Click" IsChecked="false"/>
+
+ <Grid x:Name="time" Grid.Column="1" HorizontalAlignment="Stretch" VerticalAlignment="Center">
+ <Grid.ColumnDefinitions>
+ <ColumnDefinition Width="*" />
+ <ColumnDefinition Width="40" />
+ <ColumnDefinition Width="10" />
+ <ColumnDefinition Width="40" />
+ </Grid.ColumnDefinitions>
+
+ <Slider x:Name="timelineSlider" Margin="0,1.5,0,0" HorizontalAlignment="Stretch"
+ Maximum="1" Style="{StaticResource SliderStyle}" Grid.Column="0"
+ ValueChanged="TimelineSlider_ValueChanged"
+ Value="0"/>
+ <TextBlock x:Name="currentTimeTextBlock" Margin="0,1.5,0,0" Height="12"
+ FontFamily="Verdana" FontSize="10" Text="00:00" TextWrapping="Wrap"
+ Foreground="#FFFFFFFF" FontStyle="Normal" HorizontalAlignment="Right"
+ TextAlignment="Right" Grid.Column="1"/>
+ <TextBlock Margin="0,1.5,0,0" Height="12" FontFamily="Verdana" FontSize="10"
+ Text="/" TextWrapping="Wrap" Foreground="#FFFFFFFF"
+ FontStyle="Normal" HorizontalAlignment="Center" TextAlignment="Right"
+ Grid.Column="2"/>
+ <TextBlock x:Name="totalTimeTextBlock" Margin="0,1.5,0,0" Height="12"
+ FontFamily="Verdana" FontSize="10" Text="00:00" TextWrapping="Wrap"
+ Foreground="#FFFFFFFF" FontStyle="Normal" HorizontalAlignment="Left"
+ TextAlignment="Right" Grid.Column="3"/>
+ </Grid>
+
+ <ToggleButton IsChecked="false" Grid.Column="3" x:Name="muteButton"
+ Template="{StaticResource MuteButtonTemplate}" Click="MuteButton_Click"
+ VerticalAlignment="Center" Margin="0,0,6,0"/>
+
+ <Slider Grid.Column="4" HorizontalAlignment="Stretch" Margin="3,0,0,0"
+ VerticalAlignment="Center" Maximum="1" x:Name="volumeSlider"
+ Background="#FF777777" Style="{StaticResource SliderStyle}" Width="50"
+ Value="{Binding ElementName=mediaElement, Mode=TwoWay, Path=Volume, UpdateSourceTrigger=Default}"/>
+
+ <Button x:Name="fullScreenButton" Grid.Column="5" Margin="8,10,4,10" Click="FullScreenButton_Click"
+ Template="{StaticResource ButtonTemplate}" VerticalAlignment="Center">
+ <Path Height="14.375" HorizontalAlignment="Stretch"
+ VerticalAlignment="Bottom" RenderTransformOrigin="0.212389379739761,0.208695650100708"
+ Data="M10.181361,8.375 L12.844413,11.008244 L14.125,9.7418737 L14.125,14.375 L9.675765,14.374833 L10.906104,13.158273 L8.125,10.408315 L10.181361,8.375 z M3.9666855,8.375 L6,10.431361 L3.3667567,13.094413 L4.6331258,14.375 L0,14.375 L0.00016707927,9.925765 L1.2167276,11.156104 L3.9666855,8.375 z M9.4918737,0 L14.125,0 L14.124833,4.449235 L12.908273,3.2188957 L10.158315,6 L8.125,3.943639 L10.758244,1.2805867 L9.4918737,0 z M0,0 L4.449235,0.00016686507 L3.2188957,1.2167276 L6,3.9666855 L3.943639,6 L1.280587,3.3667567 L0,4.6331258 L0,0 z"
+ Fill="#FF7F7F7F" Stretch="Fill" Stroke="#FF000000" StrokeThickness="0" />
+ </Button>
+ </Grid>
+ </Grid>
+ </Border>
+</UserControl> \ No newline at end of file
diff --git a/src/YalpClients/WebClient/MainPage.xaml.cs b/src/YalpClients/WebClient/MainPage.xaml.cs
new file mode 100644
index 0000000..aa392f2
--- /dev/null
+++ b/src/YalpClients/WebClient/MainPage.xaml.cs
@@ -0,0 +1,198 @@
+using System;
+using System.Windows;
+using System.Windows.Controls;
+using System.Windows.Documents;
+using System.Windows.Input;
+using System.Windows.Media;
+using System.Windows.Media.Animation;
+using System.Windows.Shapes;
+
+namespace VideoPlayer
+{
+ // For best full-screen video performance, set EnableGPUAcceleration="true" on the plug-in.
+ // If hosting Silverlight from .aspx, add EnableGPUAcceleration="true" to the
+ // <asp:Silverlight> element. If hosting Silverlight from .html, add
+ // <param name="enableGPUAcceleration" value="true" /> under the <object> tag.
+
+ public partial class MainPage : UserControl
+ {
+ // mediaElement.Position updates TimelineSlider.Value, and
+ // updating TimelineSlider.Value updates mediaElement.Position,
+ // this variable helps us break the infinite loop
+ private bool duringTickEvent = false;
+
+ private bool playVideoWhenSliderDragIsOver = false;
+
+ public MainPage()
+ {
+ InitializeComponent();
+
+ mediaElement.Source = new Uri("file:///D:/Test/countdown.wmv");
+ //mit Datei:
+ //mediaElement.Source = new Uri("file:///D:/Test/countdown.wmv");
+ //http://www.shoutcast.com/shoutcast_player?stationid=7806&Genre=Electronic&ContentFlag=1
+ //
+ CompositionTarget.Rendering += new EventHandler(CompositionTarget_Rendering);
+ Application.Current.Host.Content.FullScreenChanged += new EventHandler(Content_FullScreenChanged);
+ }
+
+ private void MediaElement_MediaOpened(object sender, RoutedEventArgs e)
+ {
+ TimeSpan duration = mediaElement.NaturalDuration.TimeSpan;
+ totalTimeTextBlock.Text = TimeSpanToString(duration);
+ UpdateVideoSize();
+ }
+
+ #region play button
+
+ private void BigPlayButton_Click(object sender, RoutedEventArgs e)
+ {
+ playPauseButton.IsChecked = true;
+ PlayPauseButton_Click(sender, e);
+ }
+
+ private void PlayPauseButton_Click(object sender, RoutedEventArgs e)
+ {
+ bigPlayButton.Visibility = Visibility.Collapsed;
+
+ // this will be the toggle button state after the click has been processed
+ if (playPauseButton.IsChecked == true)
+ mediaElement.Play();
+ else
+ mediaElement.Pause();
+ }
+
+ #endregion
+
+ #region timelineSlider
+
+ private void Seek(double percentComplete)
+ {
+ if (duringTickEvent)
+ throw new Exception("Can't call Seek() now, you'll get an infinite loop");
+
+ TimeSpan duration = mediaElement.NaturalDuration.TimeSpan;
+ int newPosition = (int)(duration.TotalSeconds * percentComplete);
+ mediaElement.Position = new TimeSpan(0, 0, newPosition);
+
+ // let the next CompositionTarget.Rendering take care of updating the text blocks
+ }
+
+ private Slider GetSliderParent(object sender)
+ {
+ FrameworkElement element = (FrameworkElement)sender;
+ do
+ {
+ element = (FrameworkElement)VisualTreeHelper.GetParent(element);
+ } while (!(element is Slider));
+ return (Slider)element;
+ }
+
+ private void LeftTrack_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
+ {
+ e.Handled = true;
+ FrameworkElement lefttrack = (sender as FrameworkElement).FindName("LeftTrack") as FrameworkElement;
+ FrameworkElement righttrack = (sender as FrameworkElement).FindName("RightTrack") as FrameworkElement;
+ double position = e.GetPosition(lefttrack).X;
+ double width = righttrack.TransformToVisual(lefttrack).Transform(new Point(righttrack.ActualWidth, righttrack.ActualHeight)).X;
+ double percent = position / width;
+ Slider slider = GetSliderParent(sender);
+ slider.Value = percent;
+ }
+
+ private void HorizontalThumb_DragStarted(object sender, System.Windows.Controls.Primitives.DragStartedEventArgs e)
+ {
+ if (GetSliderParent(sender) != timelineSlider) return;
+
+ bool notPlaying = (mediaElement.CurrentState == MediaElementState.Paused
+ || mediaElement.CurrentState == MediaElementState.Stopped);
+
+ if (notPlaying)
+ {
+ playVideoWhenSliderDragIsOver = false;
+ }
+ else
+ {
+ playVideoWhenSliderDragIsOver = true;
+ mediaElement.Pause();
+ }
+ }
+
+ private void HorizontalThumb_DragCompleted(object sender, System.Windows.Controls.Primitives.DragCompletedEventArgs e)
+ {
+ if (playVideoWhenSliderDragIsOver)
+ mediaElement.Play();
+ }
+
+ private void TimelineSlider_ValueChanged(object sender, RoutedPropertyChangedEventArgs<double> e)
+ {
+ if (duringTickEvent)
+ return;
+
+ Seek(timelineSlider.Value);
+ }
+
+ #endregion
+
+ #region updating current time
+
+ private void CompositionTarget_Rendering(object sender, EventArgs e)
+ {
+ duringTickEvent = true;
+
+ TimeSpan duration = mediaElement.NaturalDuration.TimeSpan;
+ if (duration.TotalSeconds != 0)
+ {
+ double percentComplete = (mediaElement.Position.TotalSeconds / duration.TotalSeconds);
+ timelineSlider.Value = percentComplete;
+ string text = TimeSpanToString(mediaElement.Position);
+ if (this.currentTimeTextBlock.Text != text)
+ this.currentTimeTextBlock.Text = text;
+ }
+
+ duringTickEvent = false;
+ }
+
+ private static string TimeSpanToString(TimeSpan time)
+ {
+ return string.Format("{0:00}:{1:00}", (time.Hours * 60) + time.Minutes, time.Seconds);
+ }
+ #endregion
+
+ private void MuteButton_Click(object sender, RoutedEventArgs e)
+ {
+ mediaElement.IsMuted = (bool)muteButton.IsChecked;
+ }
+
+ #region fullscreen mode
+
+ private void FullScreenButton_Click(object sender, RoutedEventArgs e)
+ {
+ var content = Application.Current.Host.Content;
+ content.IsFullScreen = !content.IsFullScreen;
+ }
+
+ private void Content_FullScreenChanged(object sender, EventArgs e)
+ {
+ UpdateVideoSize();
+ }
+
+ private void UpdateVideoSize()
+ {
+ if (App.Current.Host.Content.IsFullScreen)
+ {
+ // mediaElement takes all available space
+ VideoRow.Height = new GridLength(1, GridUnitType.Star);
+ VideoColumn.Width = new GridLength(1, GridUnitType.Star);
+ }
+ else
+ {
+ // mediaElement is only as big as the source video
+ VideoRow.Height = new GridLength(1, GridUnitType.Auto);
+ VideoColumn.Width = new GridLength(1, GridUnitType.Auto);
+ }
+ }
+
+ #endregion
+ }
+} \ No newline at end of file
diff --git a/src/YalpClients/WebClient/Properties/AppManifest.xml b/src/YalpClients/WebClient/Properties/AppManifest.xml
new file mode 100644
index 0000000..2e175fc
--- /dev/null
+++ b/src/YalpClients/WebClient/Properties/AppManifest.xml
@@ -0,0 +1,16 @@
+<Deployment xmlns="http://schemas.microsoft.com/client/2007/deployment"
+ xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
+>
+ <Deployment.Parts>
+ </Deployment.Parts>
+
+ <!-- Uncomment the markup and update the fields below to make your application offline enabled
+ <Deployment.ApplicationIdentity>
+ <ApplicationIdentity
+ ShortName="Out of Browser Silverlight Application"
+ Title="Window Title of Your Silverlight Application">
+ <ApplicationIdentity.Blurb>Description of your Silverlight application</ApplicationIdentity.Blurb>
+ </ApplicationIdentity>
+ </Deployment.ApplicationIdentity>
+ -->
+</Deployment>
diff --git a/src/YalpClients/WebClient/Properties/AssemblyInfo.cs b/src/YalpClients/WebClient/Properties/AssemblyInfo.cs
new file mode 100644
index 0000000..a7710f2
--- /dev/null
+++ b/src/YalpClients/WebClient/Properties/AssemblyInfo.cs
@@ -0,0 +1,35 @@
+using System.Reflection;
+using System.Runtime.CompilerServices;
+using System.Runtime.InteropServices;
+
+// General Information about an assembly is controlled through the following
+// set of attributes. Change these attribute values to modify the information
+// associated with an assembly.
+[assembly: AssemblyTitle("VideoPlayer")]
+[assembly: AssemblyDescription("")]
+[assembly: AssemblyConfiguration("")]
+[assembly: AssemblyCompany("MSIT")]
+[assembly: AssemblyProduct("VideoPlayer")]
+[assembly: AssemblyCopyright("Copyright © MSIT 2009")]
+[assembly: AssemblyTrademark("")]
+[assembly: AssemblyCulture("")]
+
+// Setting ComVisible to false makes the types in this assembly not visible
+// to COM components. If you need to access a type in this assembly from
+// COM, set the ComVisible attribute to true on that type.
+[assembly: ComVisible(false)]
+
+// The following GUID is for the ID of the typelib if this project is exposed to COM
+[assembly: Guid("35c726b0-7859-4c8e-a45c-81dc889f321e")]
+
+// Version information for an assembly consists of the following four values:
+//
+// Major Version
+// Minor Version
+// Build Number
+// Revision
+//
+// You can specify all the values or you can default the Revision and Build Numbers
+// by using the '*' as shown below:
+[assembly: AssemblyVersion("1.0.0.0")]
+[assembly: AssemblyFileVersion("1.0.0.0")]
diff --git a/src/YalpClients/WebClient/VideoPlayer.csproj b/src/YalpClients/WebClient/VideoPlayer.csproj
new file mode 100644
index 0000000..5e6c3f4
--- /dev/null
+++ b/src/YalpClients/WebClient/VideoPlayer.csproj
@@ -0,0 +1,103 @@
+<Project ToolsVersion="3.5" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+ <PropertyGroup>
+ <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+ <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+ <ProductVersion>9.0.30729</ProductVersion>
+ <SchemaVersion>2.0</SchemaVersion>
+ <ProjectGuid>{9254F122-1734-4DEC-9859-49C16D114EBA}</ProjectGuid>
+ <ProjectTypeGuids>{A1591282-1198-4647-A2B1-27E5FF5F6F3B};{fae04ec0-301f-11d3-bf4b-00c04f79efbc}</ProjectTypeGuids>
+ <OutputType>Library</OutputType>
+ <AppDesignerFolder>Properties</AppDesignerFolder>
+ <RootNamespace>VideoPlayer</RootNamespace>
+ <AssemblyName>VideoPlayer</AssemblyName>
+ <TargetFrameworkVersion>v3.5</TargetFrameworkVersion>
+ <SilverlightApplication>true</SilverlightApplication>
+ <SupportedCultures>
+ </SupportedCultures>
+ <XapOutputs>true</XapOutputs>
+ <GenerateSilverlightManifest>true</GenerateSilverlightManifest>
+ <XapFilename>VideoPlayer.xap</XapFilename>
+ <SilverlightManifestTemplate>Properties\AppManifest.xml</SilverlightManifestTemplate>
+ <SilverlightAppEntry>VideoPlayer.App</SilverlightAppEntry>
+ <TestPageFileName>TestPage.html</TestPageFileName>
+ <CreateTestPage>true</CreateTestPage>
+ <ValidateXaml>true</ValidateXaml>
+ <UsePlatformExtensions>false</UsePlatformExtensions>
+ <ThrowErrorsInValidation>true</ThrowErrorsInValidation>
+ <LinkedServerProject>
+ </LinkedServerProject>
+ </PropertyGroup>
+ <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+ <DebugSymbols>true</DebugSymbols>
+ <DebugType>full</DebugType>
+ <Optimize>false</Optimize>
+ <OutputPath>Bin\Debug</OutputPath>
+ <DefineConstants>DEBUG;TRACE;SILVERLIGHT</DefineConstants>
+ <NoStdLib>true</NoStdLib>
+ <NoConfig>true</NoConfig>
+ <ErrorReport>prompt</ErrorReport>
+ <WarningLevel>4</WarningLevel>
+ </PropertyGroup>
+ <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+ <DebugType>pdbonly</DebugType>
+ <Optimize>true</Optimize>
+ <OutputPath>Bin\Release</OutputPath>
+ <DefineConstants>TRACE;SILVERLIGHT</DefineConstants>
+ <NoStdLib>true</NoStdLib>
+ <NoConfig>true</NoConfig>
+ <ErrorReport>prompt</ErrorReport>
+ <WarningLevel>4</WarningLevel>
+ </PropertyGroup>
+ <ItemGroup>
+ <Reference Include="System.Windows" />
+ <Reference Include="mscorlib" />
+ <Reference Include="system" />
+ <Reference Include="System.Core" />
+ <Reference Include="System.Net" />
+ <Reference Include="System.Windows.Controls.DataVisualization.Toolkit, Version=2.0.5.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" />
+ <Reference Include="System.Windows.Controls.Theming.ShinyRed, Version=2.0.5.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" />
+ <Reference Include="System.Windows.Controls.Theming.Toolkit, Version=2.0.5.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" />
+ <Reference Include="System.Xml" />
+ <Reference Include="System.Windows.Browser" />
+ </ItemGroup>
+ <ItemGroup>
+ <Compile Include="App.xaml.cs">
+ <DependentUpon>App.xaml</DependentUpon>
+ </Compile>
+ <Compile Include="MainPage.xaml.cs">
+ <DependentUpon>MainPage.xaml</DependentUpon>
+ </Compile>
+ <Compile Include="Properties\AssemblyInfo.cs" />
+ </ItemGroup>
+ <ItemGroup>
+ <ApplicationDefinition Include="App.xaml">
+ <SubType>Designer</SubType>
+ <Generator>MSBuild:MarkupCompilePass1</Generator>
+ </ApplicationDefinition>
+ <Page Include="MainPage.xaml">
+ <SubType>Designer</SubType>
+ <Generator>MSBuild:MarkupCompilePass1</Generator>
+ </Page>
+ </ItemGroup>
+ <ItemGroup>
+ <None Include="Properties\AppManifest.xml" />
+ </ItemGroup>
+ <ItemGroup>
+ <WCFMetadata Include="Service References\" />
+ </ItemGroup>
+ <Import Project="$(MSBuildExtensionsPath)\Microsoft\Silverlight\v3.0\Microsoft.Silverlight.CSharp.targets" />
+ <!-- To modify your build process, add your task inside one of the targets below and uncomment it.
+ Other similar extension points exist, see Microsoft.Common.targets.
+ <Target Name="BeforeBuild">
+ </Target>
+ <Target Name="AfterBuild">
+ </Target>
+ -->
+ <ProjectExtensions>
+ <VisualStudio>
+ <FlavorProperties GUID="{A1591282-1198-4647-A2B1-27E5FF5F6F3B}">
+ <SilverlightProjectProperties />
+ </FlavorProperties>
+ </VisualStudio>
+ </ProjectExtensions>
+</Project> \ No newline at end of file
diff --git a/src/YalpClients/WebClient/VideoPlayer.csproj.user b/src/YalpClients/WebClient/VideoPlayer.csproj.user
new file mode 100644
index 0000000..47ceb7f
--- /dev/null
+++ b/src/YalpClients/WebClient/VideoPlayer.csproj.user
@@ -0,0 +1,28 @@
+<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+ <ProjectExtensions>
+ <VisualStudio>
+ <FlavorProperties GUID="{A1591282-1198-4647-A2B1-27E5FF5F6F3B}">
+ <SilverlightProjectProperties>
+ <StartPageUrl>
+ </StartPageUrl>
+ <StartAction>DynamicPage</StartAction>
+ <AspNetDebugging>True</AspNetDebugging>
+ <NativeDebugging>False</NativeDebugging>
+ <SQLDebugging>False</SQLDebugging>
+ <ExternalProgram>
+ </ExternalProgram>
+ <StartExternalURL>
+ </StartExternalURL>
+ <StartCmdLineArguments>
+ </StartCmdLineArguments>
+ <StartWorkingDirectory>
+ </StartWorkingDirectory>
+ <ShowWebRefOnDebugPrompt>True</ShowWebRefOnDebugPrompt>
+ <OutOfBrowserProjectToDebug>
+ </OutOfBrowserProjectToDebug>
+ <ShowRiaSvcsOnDebugPrompt>True</ShowRiaSvcsOnDebugPrompt>
+ </SilverlightProjectProperties>
+ </FlavorProperties>
+ </VisualStudio>
+ </ProjectExtensions>
+</Project> \ No newline at end of file
diff --git a/src/YalpClients/WebClient/VideoPlayer.sln b/src/YalpClients/WebClient/VideoPlayer.sln
new file mode 100644
index 0000000..9ef3f22
--- /dev/null
+++ b/src/YalpClients/WebClient/VideoPlayer.sln
@@ -0,0 +1,20 @@
+
+Microsoft Visual Studio Solution File, Format Version 10.00
+# Visual Web Developer Express 2008
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "VideoPlayer", "VideoPlayer.csproj", "{9254F122-1734-4DEC-9859-49C16D114EBA}"
+EndProject
+Global
+ GlobalSection(SolutionConfigurationPlatforms) = preSolution
+ Debug|Any CPU = Debug|Any CPU
+ Release|Any CPU = Release|Any CPU
+ EndGlobalSection
+ GlobalSection(ProjectConfigurationPlatforms) = postSolution
+ {9254F122-1734-4DEC-9859-49C16D114EBA}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {9254F122-1734-4DEC-9859-49C16D114EBA}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {9254F122-1734-4DEC-9859-49C16D114EBA}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {9254F122-1734-4DEC-9859-49C16D114EBA}.Release|Any CPU.Build.0 = Release|Any CPU
+ EndGlobalSection
+ GlobalSection(SolutionProperties) = preSolution
+ HideSolutionNode = FALSE
+ EndGlobalSection
+EndGlobal
diff --git a/src/YalpInputs/YalpPGSqlInput/DatabaseDefines.java b/src/YalpInputs/YalpPGSqlInput/DatabaseDefines.java
index b6ee2ce..0300ad3 100644
--- a/src/YalpInputs/YalpPGSqlInput/DatabaseDefines.java
+++ b/src/YalpInputs/YalpPGSqlInput/DatabaseDefines.java
@@ -1,65 +1,65 @@
-/*
- * Copyright (c) 2006 Manuel Traut and Volker Dahnke
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Common Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/cpl-v10.html
- *
- * Contributors: Manuel Traut and Volker Dahnke
- */
-package YalpInputs.YalpPGSqlInput;
-
-/*
- * Class DatabaseDefines
- *
- * <em></em>
- *
- * @author Manuel Traut
- *
- * @version 0.1 28-08-2008<br>
- *
- */
-
-public class DatabaseDefines {
-
- public String dbConnection="jdbc:postgresql://10.0.3.20:5432/yalp_media";
- public String dbUser="yalp";
- public String dbPasswd="huhu";
-
-/*
- * set string for dbConnection
- * @param dbConnection
- * "jdbc:postgresql://<serverIP>:<portOfDB>/<dataBaseName>";
- */
- public void setDBConnection(String dbConnection){
- this.dbConnection = dbConnection;
- }
-
-/*
- * set userName for db Edit
- * @param dbUser
- */
- public void setDBUser(String dbUser){
- this.dbUser = dbUser;
- }
-
-/*
- * set string for db Password
- * @param DBPasswd
- */
- public void setDBPasswd(String DBPasswd){
- this.dbPasswd = DBPasswd;
- }
-
- public String getDBConnection(){
- return this.dbConnection;
- }
-
- public String getDBUser(){
- return this.dbUser;
- }
-
- public String getDBPasswd(){
- return this.dbPasswd;
- }
-}
+/*
+ * Copyright (c) 2006 Manuel Traut and Volker Dahnke
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Common Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/cpl-v10.html
+ *
+ * Contributors: Manuel Traut and Volker Dahnke
+ */
+package YalpInputs.YalpPGSqlInput;
+
+/*
+ * Class DatabaseDefines
+ *
+ * <em></em>
+ *
+ * @author Manuel Traut
+ *
+ * @version 0.1 28-08-2008<br>
+ *
+ */
+
+public class DatabaseDefines {
+
+ public String dbConnection="jdbc:postgresql://10.0.3.20:5432/yalp_media";
+ public String dbUser="yalp";
+ public String dbPasswd="huhu";
+
+/*
+ * set string for dbConnection
+ * @param dbConnection
+ * "jdbc:postgresql://<serverIP>:<portOfDB>/<dataBaseName>";
+ */
+ public void setDBConnection(String dbConnection){
+ this.dbConnection = dbConnection;
+ }
+
+/*
+ * set userName for db Edit
+ * @param dbUser
+ */
+ public void setDBUser(String dbUser){
+ this.dbUser = dbUser;
+ }
+
+/*
+ * set string for db Password
+ * @param DBPasswd
+ */
+ public void setDBPasswd(String DBPasswd){
+ this.dbPasswd = DBPasswd;
+ }
+
+ public String getDBConnection(){
+ return this.dbConnection;
+ }
+
+ public String getDBUser(){
+ return this.dbUser;
+ }
+
+ public String getDBPasswd(){
+ return this.dbPasswd;
+ }
+}
diff --git a/src/YalpServer/ServerControlImpl.java b/src/YalpServer/ServerControlImpl.java
index f8e4579..1064dd0 100755
--- a/src/YalpServer/ServerControlImpl.java
+++ b/src/YalpServer/ServerControlImpl.java
@@ -1,452 +1,452 @@
-/*
- * Copyright (c) 2006 Manuel Traut and Volker Dahnke
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Common Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/cpl-v10.html
- *
- * Contributors: Manuel Traut and Volker Dahnke
- */
-
-package YalpServer;
-
-import YalpInterfaces.*;
-
-import java.net.*;
-import java.sql.SQLException;
-import java.util.ArrayList;
-import java.util.Properties;
-
-import org.omg.CosNaming.*;
-import org.omg.CosNaming.NamingContextPackage.*;
-import org.omg.CORBA.*;
-import org.omg.PortableServer.*;
-import org.omg.PortableServer.POA;
-
-import org.apache.log4j.Logger;
-import org.apache.log4j.PropertyConfigurator;
-
-/*
- * Class ServerControlImpl
- *
- * <em>Implements functionality of the ServerControl Interface</em>
- *
- * @author Volker Dahnke / Manuel Traut
- * @version 0.6 14-12-2005<br>
- * @see client
- */
-public class ServerControlImpl extends ServerControlInterfacePOA
-{
- private ORB orb;
-
- private InitServer srv;
- private InputPluginHandler inputHandler;
- private OutputPluginHandler outputHandler;
- private AuthPluginHandler authHandler;
-
- private ArrayList<Session> sessions;
- private ArrayList<PluginInfo> plugin_infos;
-
- private String log4jFile = "log4j_server.conf";
-
- private static Logger logger =
- Logger.getLogger("Yalp.Server.ServerControlImpl");
-
-public ServerControlImpl()
-{
- this.sessions = new ArrayList<Session> ();
- this.plugin_infos = new ArrayList<PluginInfo> ();
-
- PropertyConfigurator.configureAndWatch(log4jFile);
- logger.debug("ServerControlImpl()");
-}
-
- public void setORB(ORB _orb)
- {
- logger.debug("setOrb()");
- orb = _orb;
- }
-
- public void init(InitServer _srv)
- {
- logger.debug("init()");
- srv = _srv;
- inputHandler = srv.inputHandler;
- outputHandler = srv.outputHandler;
- authHandler = srv.authHandler;
- }
-
-/*
- * client logon
- *
- * @param userName
- * @param password
- * @param ipAdress
- * @param session (out)
- * @param error (out)
- */
- public void clientLogon( String name,
- String password,
- String ipAddress,
- SessionHolder session,
- YalpErrorHolder err )
- {
- logger.debug("clientLogon()");
-
- YalpError error = new YalpError();
- error.code = YalpErrorCode.OK;
- error.descr = "authentication successfull";
- error.msg = "nice isn't it";
- error.level = YalpErrorLevel.ERROR_LEVEL_INFO;
- err.value = error;
-
- session.value = authHandler.logon(name, password, ipAddress, session, err);
-
- ArrayList<PluginInfo> all_plugins = new ArrayList<PluginInfo>();
-
- PluginInfo[] t = {};
- session.value.availablePlugins = plugin_infos.toArray(t);
- sessions.add(session.value);
- }
-
-/*
- * client logoff
- *
- * @param session
- * @param error (out)
- */
- public void clientLogoff( Session bye, YalpErrorHolder err)
- {
- logger.debug("clientLogoff");
-
- YalpError error = new YalpError();
- error.code = YalpErrorCode.OK;
- error.descr = "logged out";
- error.msg = "sad isn't it";
- error.level = YalpErrorLevel.ERROR_LEVEL_INFO;
- err.value = error;
-
- sessions.remove(bye);
- }
-
-/*
- * get user list
- *
- * @param user list (out)
- * @param error (out)
- */
- public void getUser(UsersHolder list, YalpErrorHolder err) {
- logger.debug("getUser()");
- YalpError error = new YalpError();
- error.code = YalpErrorCode.OK;
- err = new YalpErrorHolder(error);
- }
-
-/*
- * change user details
- *
- * @param user
- * @param password
- * @param action (create, delete, alter)
- * @param error (out)
- */
- public void changeUser(YalpUser usr, String passwd, Action todo,
- YalpErrorHolder err) {
- logger.debug("changeUser()");
- YalpError error = new YalpError();
- error.code = YalpErrorCode.OK;
- err = new YalpErrorHolder(error);
- }
-
-/*
- * alter media informations
- *
- * @param media to change
- * @param action (update, delete, create)
- * @param error (out)
- */
- public void changeMedia( Media toChange, Action todo, YalpErrorHolder err ) {
- logger.debug("changeMedia()");
- YalpError error = new YalpError();
- error.code = YalpErrorCode.OK;
- err = new YalpErrorHolder(error);
- }
-
-/*
- * count yalp medias
- *
- * @param num (out)
- * @param error (out)
- */
- public void getNumOfMedias( IntHolder num, YalpErrorHolder err ) {
- logger.debug("getNumOfMedias()");
- YalpError error = new YalpError();
- error.code = YalpErrorCode.OK;
- err = new YalpErrorHolder(error);
- }
-
-/*
- * control yalp medias
- *
- * @param control description (inout)
- * @param error (out)
- */
- public void control( OutputHolder ctlOutput, YalpErrorHolder err ) {
- logger.debug("control()");
- YalpError error = new YalpError();
- error.code = YalpErrorCode.OK;
- error.descr = "streaming ;-)";
- error.msg = "nice isn't it";
- error.level = YalpErrorLevel.ERROR_LEVEL_INFO;
- err.value = error;
-
- outputHandler.control(ctlOutput, err);
- }
-
-/*
- * search yalp media
- *
- * @param search string
- * @param list of mediatypes
- * @param result as list of medias (out)
- */
- public void search( String str, MediaType[] types, MediasHolder result,
- YalpErrorHolder err ) {
- logger.debug("search()");
- YalpError error = new YalpError();
- inputHandler.search(str, types, result, err);
- }
-
-/*
- * register new output plugin
- *
- * @param plugin which should be registered
- * @param error
- */
- public void registerOutputPlugin( OutputPluginInterface itf,
- PluginInfoHolder info, YalpErrorHolder err )
- {
- logger.info("registering output plugin: " + info.value.name );
-
- OutputPluginInterface outputItf;
-
- try {
- outputItf = OutputPluginInterfaceHelper.narrow(itf);
- } catch( Exception e ) {
- e.printStackTrace();
- return;
- }
-
- OutputPlugin newPlugin = new OutputPlugin(outputItf, info.value);
-
- PluginInfo inf = new PluginInfo();
-
- if( newPlugin != null )
- inf = outputHandler.addPlugin( newPlugin );
-
- info.value = inf;
- plugin_infos.add( inf );
-
- YalpError error = new YalpError();
- error.msg = "plugin registered";
- error.descr = "";
- error.code = YalpErrorCode.OK;
- error.level = YalpErrorLevel.ERROR_LEVEL_INFO;
- err.value = error;
- }
-
-/*
- * remove output plugin
- *
- * @param plugin which should be registered
- * @param error
- */
- public void removeOutputPlugin( PluginInfo itf, YalpErrorHolder err )
- {
- logger.debug("removeOutputPlugin()");
- /* t.b.d. itf handling */
- YalpError error = new YalpError();
- error.code = YalpErrorCode.OK;
- err = new YalpErrorHolder(error);
- }
-
-/*
- * get all registered output plugins
- *
- * @param plugin list
- * @param error
- */
- public void getOutputPlugins( PluginInfosHolder itfs, String name,
- YalpErrorHolder err )
- {
- logger.debug("getOutputPlugins()");
- /* t.b.d. itf handling */
- YalpError error = new YalpError();
- error.code = YalpErrorCode.OK;
- err = new YalpErrorHolder(error);
- }
-
-/*
- * register new input plugin
- *
- * @param plugin which should be registered
- * @param error
- */
- public void registerInputPlugin( org.omg.CORBA.Object itf,
- PluginInfoHolder info, YalpErrorHolder err )
- {
- logger.info("registering input plugin: " + info.value.name );
-
- InputPluginInterface inputItf;
-
- try {
- inputItf = InputPluginInterfaceHelper.narrow(itf);
- } catch( Exception e ) {
- e.printStackTrace();
- return;
- }
-
- InputPlugin newPlugin = new InputPlugin(inputItf, info.value);
-
- PluginInfo inf = new PluginInfo();
-
- if( newPlugin != null )
- inf = inputHandler.addPlugin( newPlugin );
-
- info.value = inf;
- plugin_infos.add( inf );
-
- YalpError error = new YalpError();
- error.msg = "plugin registered";
- error.descr = "";
- error.code = YalpErrorCode.OK;
- error.level = YalpErrorLevel.ERROR_LEVEL_INFO;
- err.value = error;
- }
-
-/*
- * remove input plugin
- *
- * @param plugin which should be registered
- * @param error
- */
- public void removeInputPlugin( PluginInfo itf, YalpErrorHolder err )
- {
- logger.debug("removeInputPlugin()");
- /* t.b.d. itf handling */
- YalpError error = new YalpError();
- error.code = YalpErrorCode.OK;
- err = new YalpErrorHolder(error);
- }
-
-/*
- * get all registered input plugins
- *
- * @param plugin list
- * @param error
- */
- public void getInputPlugins( PluginInfosHolder itfs,
- String name, YalpErrorHolder err )
- {
- logger.debug("getInputPlugins()");
- /* t.b.d. itf handling */
- YalpError error = new YalpError();
- error.code = YalpErrorCode.OK;
- err = new YalpErrorHolder(error);
- }
-
-/*
- * register new auth plugin
- *
- * @param plugin which should be registered
- * @param error
- */
- public void registerAuthPlugin( org.omg.CORBA.Object itf,
- PluginInfoHolder info, YalpErrorHolder err )
- {
- logger.info("registering auth plugin: " + info.value.name );
-
- AuthPluginInterface authItf;
-
- try {
- authItf = AuthPluginInterfaceHelper.narrow(itf);
- } catch( Exception e ) {
- e.printStackTrace();
- return;
- }
-
- AuthPlugin newPlugin = new AuthPlugin(authItf, info.value);
-
- PluginInfo inf = new PluginInfo();
-
- if( newPlugin != null )
- inf = authHandler.addPlugin( newPlugin );
-
- info.value = inf;
- plugin_infos.add (inf);
-
- YalpError error = new YalpError();
- error.msg = "plugin registered";
- error.descr = "";
- error.code = YalpErrorCode.OK;
- error.level = YalpErrorLevel.ERROR_LEVEL_INFO;
- err.value = error;
- }
-
-/*
- * remove auth plugin
- *
- * @param plugin which should be registered
- * @param error
- */
- public void removeAuthPlugin( PluginInfo itf,
- YalpErrorHolder err )
- {
- logger.debug("removeAuthPlugin()");
- /* t.b.d. itf handling */
- YalpError error = new YalpError();
- error.code = YalpErrorCode.OK;
- err = new YalpErrorHolder(error);
- }
-
-/*
- * get all registered auth plugins
- *
- * @param plugin list
- * @param error
- */
- public void getAuthPlugins( PluginInfosHolder itfs,
- String name, YalpErrorHolder err )
- {
- logger.debug("getAuthPlugins()");
- /* t.b.d. itf handling */
- YalpError error = new YalpError();
- error.code = YalpErrorCode.OK;
- err = new YalpErrorHolder(error);
- }
-
-/*
- * to check if server is still ok
- *
- * @return Boolean true - if ok
- */
- public void ping(YalpErrorHolder pong) {
- logger.debug("ping()");
- YalpError err = new YalpError();
- err.descr = "PONG";
- err.msg = "huhu";
- err.level = YalpErrorLevel.ERROR_LEVEL_INFO;
- err.code = YalpErrorCode.OK;
- pong.value = err;
- System.out.println("pong");
- }
-
-/*
- * server shutdown
- */
- public void serverShutdown()
- {
- logger.debug("server shutdown()");
- /* t.b.d. clear server shutdown */
- }
-}
+/*
+ * Copyright (c) 2006 Manuel Traut and Volker Dahnke
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Common Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/cpl-v10.html
+ *
+ * Contributors: Manuel Traut and Volker Dahnke
+ */
+
+package YalpServer;
+
+import YalpInterfaces.*;
+
+import java.net.*;
+import java.sql.SQLException;
+import java.util.ArrayList;
+import java.util.Properties;
+
+import org.omg.CosNaming.*;
+import org.omg.CosNaming.NamingContextPackage.*;
+import org.omg.CORBA.*;
+import org.omg.PortableServer.*;
+import org.omg.PortableServer.POA;
+
+import org.apache.log4j.Logger;
+import org.apache.log4j.PropertyConfigurator;
+
+/*
+ * Class ServerControlImpl
+ *
+ * <em>Implements functionality of the ServerControl Interface</em>
+ *
+ * @author Volker Dahnke / Manuel Traut
+ * @version 0.6 14-12-2005<br>
+ * @see client
+ */
+public class ServerControlImpl extends ServerControlInterfacePOA
+{
+ private ORB orb;
+
+ private InitServer srv;
+ private InputPluginHandler inputHandler;
+ private OutputPluginHandler outputHandler;
+ private AuthPluginHandler authHandler;
+
+ private ArrayList<Session> sessions;
+ private ArrayList<PluginInfo> plugin_infos;
+
+ private String log4jFile = "log4j_server.conf";
+
+ private static Logger logger =
+ Logger.getLogger("Yalp.Server.ServerControlImpl");
+
+public ServerControlImpl()
+{
+ this.sessions = new ArrayList<Session> ();
+ this.plugin_infos = new ArrayList<PluginInfo> ();
+
+ PropertyConfigurator.configureAndWatch(log4jFile);
+ logger.debug("ServerControlImpl()");
+}
+
+ public void setORB(ORB _orb)
+ {
+ logger.debug("setOrb()");
+ orb = _orb;
+ }
+
+ public void init(InitServer _srv)
+ {
+ logger.debug("init()");
+ srv = _srv;
+ inputHandler = srv.inputHandler;
+ outputHandler = srv.outputHandler;
+ authHandler = srv.authHandler;
+ }
+
+/*
+ * client logon
+ *
+ * @param userName
+ * @param password
+ * @param ipAdress
+ * @param session (out)
+ * @param error (out)
+ */
+ public void clientLogon( String name,
+ String password,
+ String ipAddress,
+ SessionHolder session,
+ YalpErrorHolder err )
+ {
+ logger.debug("clientLogon()");
+
+ YalpError error = new YalpError();
+ error.code = YalpErrorCode.OK;
+ error.descr = "authentication successfull";
+ error.msg = "nice isn't it";
+ error.level = YalpErrorLevel.ERROR_LEVEL_INFO;
+ err.value = error;
+
+ session.value = authHandler.logon(name, password, ipAddress, session, err);
+
+ ArrayList<PluginInfo> all_plugins = new ArrayList<PluginInfo>();
+
+ PluginInfo[] t = {};
+ session.value.availablePlugins = plugin_infos.toArray(t);
+ sessions.add(session.value);
+ }
+
+/*
+ * client logoff
+ *
+ * @param session
+ * @param error (out)
+ */
+ public void clientLogoff( Session bye, YalpErrorHolder err)
+ {
+ logger.debug("clientLogoff");
+
+ YalpError error = new YalpError();
+ error.code = YalpErrorCode.OK;
+ error.descr = "logged out";
+ error.msg = "sad isn't it";
+ error.level = YalpErrorLevel.ERROR_LEVEL_INFO;
+ err.value = error;
+
+ sessions.remove(bye);
+ }
+
+/*
+ * get user list
+ *
+ * @param user list (out)
+ * @param error (out)
+ */
+ public void getUser(UsersHolder list, YalpErrorHolder err) {
+ logger.debug("getUser()");
+ YalpError error = new YalpError();
+ error.code = YalpErrorCode.OK;
+ err = new YalpErrorHolder(error);
+ }
+
+/*
+ * change user details
+ *
+ * @param user
+ * @param password
+ * @param action (create, delete, alter)
+ * @param error (out)
+ */
+ public void changeUser(YalpUser usr, String passwd, Action todo,
+ YalpErrorHolder err) {
+ logger.debug("changeUser()");
+ YalpError error = new YalpError();
+ error.code = YalpErrorCode.OK;
+ err = new YalpErrorHolder(error);
+ }
+
+/*
+ * alter media informations
+ *
+ * @param media to change
+ * @param action (update, delete, create)
+ * @param error (out)
+ */
+ public void changeMedia( Media toChange, Action todo, YalpErrorHolder err ) {
+ logger.debug("changeMedia()");
+ YalpError error = new YalpError();
+ error.code = YalpErrorCode.OK;
+ err = new YalpErrorHolder(error);
+ }
+
+/*
+ * count yalp medias
+ *
+ * @param num (out)
+ * @param error (out)
+ */
+ public void getNumOfMedias( IntHolder num, YalpErrorHolder err ) {
+ logger.debug("getNumOfMedias()");
+ YalpError error = new YalpError();
+ error.code = YalpErrorCode.OK;
+ err = new YalpErrorHolder(error);
+ }
+
+/*
+ * control yalp medias
+ *
+ * @param control description (inout)
+ * @param error (out)
+ */
+ public void control( OutputHolder ctlOutput, YalpErrorHolder err ) {
+ logger.debug("control()");
+ YalpError error = new YalpError();
+ error.code = YalpErrorCode.OK;
+ error.descr = "streaming ;-)";
+ error.msg = "nice isn't it";
+ error.level = YalpErrorLevel.ERROR_LEVEL_INFO;
+ err.value = error;
+
+ outputHandler.control(ctlOutput, err);
+ }
+
+/*
+ * search yalp media
+ *
+ * @param search string
+ * @param list of mediatypes
+ * @param result as list of medias (out)
+ */
+ public void search( String str, MediaType[] types, MediasHolder result,
+ YalpErrorHolder err ) {
+ logger.debug("search()");
+ YalpError error = new YalpError();
+ inputHandler.search(str, types, result, err);
+ }
+
+/*
+ * register new output plugin
+ *
+ * @param plugin which should be registered
+ * @param error
+ */
+ public void registerOutputPlugin( OutputPluginInterface itf,
+ PluginInfoHolder info, YalpErrorHolder err )
+ {
+ logger.info("registering output plugin: " + info.value.name );
+
+ OutputPluginInterface outputItf;
+
+ try {
+ outputItf = OutputPluginInterfaceHelper.narrow(itf);
+ } catch( Exception e ) {
+ e.printStackTrace();
+ return;
+ }
+
+ OutputPlugin newPlugin = new OutputPlugin(outputItf, info.value);
+
+ PluginInfo inf = new PluginInfo();
+
+ if( newPlugin != null )
+ inf = outputHandler.addPlugin( newPlugin );
+
+ info.value = inf;
+ plugin_infos.add( inf );
+
+ YalpError error = new YalpError();
+ error.msg = "plugin registered";
+ error.descr = "";
+ error.code = YalpErrorCode.OK;
+ error.level = YalpErrorLevel.ERROR_LEVEL_INFO;
+ err.value = error;
+ }
+
+/*
+ * remove output plugin
+ *
+ * @param plugin which should be registered
+ * @param error
+ */
+ public void removeOutputPlugin( PluginInfo itf, YalpErrorHolder err )
+ {
+ logger.debug("removeOutputPlugin()");
+ /* t.b.d. itf handling */
+ YalpError error = new YalpError();
+ error.code = YalpErrorCode.OK;
+ err = new YalpErrorHolder(error);
+ }
+
+/*
+ * get all registered output plugins
+ *
+ * @param plugin list
+ * @param error
+ */
+ public void getOutputPlugins( PluginInfosHolder itfs, String name,
+ YalpErrorHolder err )
+ {
+ logger.debug("getOutputPlugins()");
+ /* t.b.d. itf handling */
+ YalpError error = new YalpError();
+ error.code = YalpErrorCode.OK;
+ err = new YalpErrorHolder(error);
+ }
+
+/*
+ * register new input plugin
+ *
+ * @param plugin which should be registered
+ * @param error
+ */
+ public void registerInputPlugin( org.omg.CORBA.Object itf,
+ PluginInfoHolder info, YalpErrorHolder err )
+ {
+ logger.info("registering input plugin: " + info.value.name );
+
+ InputPluginInterface inputItf;
+
+ try {
+ inputItf = InputPluginInterfaceHelper.narrow(itf);
+ } catch( Exception e ) {
+ e.printStackTrace();
+ return;
+ }
+
+ InputPlugin newPlugin = new InputPlugin(inputItf, info.value);
+
+ PluginInfo inf = new PluginInfo();
+
+ if( newPlugin != null )
+ inf = inputHandler.addPlugin( newPlugin );
+
+ info.value = inf;
+ plugin_infos.add( inf );
+
+ YalpError error = new YalpError();
+ error.msg = "plugin registered";
+ error.descr = "";
+ error.code = YalpErrorCode.OK;
+ error.level = YalpErrorLevel.ERROR_LEVEL_INFO;
+ err.value = error;
+ }
+
+/*
+ * remove input plugin
+ *
+ * @param plugin which should be registered
+ * @param error
+ */
+ public void removeInputPlugin( PluginInfo itf, YalpErrorHolder err )
+ {
+ logger.debug("removeInputPlugin()");
+ /* t.b.d. itf handling */
+ YalpError error = new YalpError();
+ error.code = YalpErrorCode.OK;
+ err = new YalpErrorHolder(error);
+ }
+
+/*
+ * get all registered input plugins
+ *
+ * @param plugin list
+ * @param error
+ */
+ public void getInputPlugins( PluginInfosHolder itfs,
+ String name, YalpErrorHolder err )
+ {
+ logger.debug("getInputPlugins()");
+ /* t.b.d. itf handling */
+ YalpError error = new YalpError();
+ error.code = YalpErrorCode.OK;
+ err = new YalpErrorHolder(error);
+ }
+
+/*
+ * register new auth plugin
+ *
+ * @param plugin which should be registered
+ * @param error
+ */
+ public void registerAuthPlugin( org.omg.CORBA.Object itf,
+ PluginInfoHolder info, YalpErrorHolder err )
+ {
+ logger.info("registering auth plugin: " + info.value.name );
+
+ AuthPluginInterface authItf;
+
+ try {
+ authItf = AuthPluginInterfaceHelper.narrow(itf);
+ } catch( Exception e ) {
+ e.printStackTrace();
+ return;
+ }
+
+ AuthPlugin newPlugin = new AuthPlugin(authItf, info.value);
+
+ PluginInfo inf = new PluginInfo();
+
+ if( newPlugin != null )
+ inf = authHandler.addPlugin( newPlugin );
+
+ info.value = inf;
+ plugin_infos.add (inf);
+
+ YalpError error = new YalpError();
+ error.msg = "plugin registered";
+ error.descr = "";
+ error.code = YalpErrorCode.OK;
+ error.level = YalpErrorLevel.ERROR_LEVEL_INFO;
+ err.value = error;
+ }
+
+/*
+ * remove auth plugin
+ *
+ * @param plugin which should be registered
+ * @param error
+ */
+ public void removeAuthPlugin( PluginInfo itf,
+ YalpErrorHolder err )
+ {
+ logger.debug("removeAuthPlugin()");
+ /* t.b.d. itf handling */
+ YalpError error = new YalpError();
+ error.code = YalpErrorCode.OK;
+ err = new YalpErrorHolder(error);
+ }
+
+/*
+ * get all registered auth plugins
+ *
+ * @param plugin list
+ * @param error
+ */
+ public void getAuthPlugins( PluginInfosHolder itfs,
+ String name, YalpErrorHolder err )
+ {
+ logger.debug("getAuthPlugins()");
+ /* t.b.d. itf handling */
+ YalpError error = new YalpError();
+ error.code = YalpErrorCode.OK;
+ err = new YalpErrorHolder(error);
+ }
+
+/*
+ * to check if server is still ok
+ *
+ * @return Boolean true - if ok
+ */
+ public void ping(YalpErrorHolder pong) {
+ logger.debug("ping()");
+ YalpError err = new YalpError();
+ err.descr = "PONG";
+ err.msg = "huhu";
+ err.level = YalpErrorLevel.ERROR_LEVEL_INFO;
+ err.code = YalpErrorCode.OK;
+ pong.value = err;
+ System.out.println("pong");
+ }
+
+/*
+ * server shutdown
+ */
+ public void serverShutdown()
+ {
+ logger.debug("server shutdown()");
+ /* t.b.d. clear server shutdown */
+ }
+}
diff --git a/src/YalpServer/ServerSettings.java b/src/YalpServer/ServerSettings.java
index 313e875..3faaa37 100755
--- a/src/YalpServer/ServerSettings.java
+++ b/src/YalpServer/ServerSettings.java
@@ -1,68 +1,68 @@
-/*
- * Copyright (c) 2006 Manuel Traut and Volker Dahnke
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Common Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/cpl-v10.html
- *
- * Contributors: Manuel Traut and Volker Dahnke
- */
-
-package YalpServer;
-
-/*
- * Class ServerSettings
- *
- * <em></em>
- *
- * @author Manuel Traut
- *
- * @version 0.1 27-03-2006<br>
- *
- * @see server.InitServer
- */
-
-public class ServerSettings{
-
- static final long serialVersionUID = 0;
-
- public String imageDir = "/media/image";
- public String videoDir = "/media/video";
- public String soundDir = "/media/sound";
-
- /**
- * set Directories which contains media Files
- * @param startDir
- */
- public void setImageDir(String startDir){
- this.imageDir = startDir;
- }
-
- /**
- * set Directories which contains media Files
- * @param startDir
- */
- public void setVideoDir(String startDir){
- this.videoDir = startDir;
- }
-
- /**
- * set Directories which contains media Files
- * @param startDir
- */
- public void setSoundDir(String startDir){
- this.soundDir = startDir;
- }
-
- public String getVideoDir(){
- return this.videoDir;
- }
-
- public String getImageDir(){
- return this.imageDir;
- }
-
- public String getSoundDir(){
- return this.soundDir;
- }
-}
+/*
+ * Copyright (c) 2006 Manuel Traut and Volker Dahnke
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Common Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/cpl-v10.html
+ *
+ * Contributors: Manuel Traut and Volker Dahnke
+ */
+
+package YalpServer;
+
+/*
+ * Class ServerSettings
+ *
+ * <em></em>
+ *
+ * @author Manuel Traut
+ *
+ * @version 0.1 27-03-2006<br>
+ *
+ * @see server.InitServer
+ */
+
+public class ServerSettings{
+
+ static final long serialVersionUID = 0;
+
+ public String imageDir = "/media/image";
+ public String videoDir = "/media/video";
+ public String soundDir = "/media/sound";
+
+ /**
+ * set Directories which contains media Files
+ * @param startDir
+ */
+ public void setImageDir(String startDir){
+ this.imageDir = startDir;
+ }
+
+ /**
+ * set Directories which contains media Files
+ * @param startDir
+ */
+ public void setVideoDir(String startDir){
+ this.videoDir = startDir;
+ }
+
+ /**
+ * set Directories which contains media Files
+ * @param startDir
+ */
+ public void setSoundDir(String startDir){
+ this.soundDir = startDir;
+ }
+
+ public String getVideoDir(){
+ return this.videoDir;
+ }
+
+ public String getImageDir(){
+ return this.imageDir;
+ }
+
+ public String getSoundDir(){
+ return this.soundDir;
+ }
+}
diff --git a/src/YalpServer/YalpServer.java b/src/YalpServer/YalpServer.java
index 0ddbe00..8cf57d3 100755
--- a/src/YalpServer/YalpServer.java
+++ b/src/YalpServer/YalpServer.java
@@ -1,40 +1,40 @@
-/*
- * Copyright (c) 2006 Manuel Traut and Volker Dahnke
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Common Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/cpl-v10.html
- *
- * Contributors: Manuel Traut and Volker Dahnke
- */
-package YalpServer;
-
-/*
- * Class Server
- *
- * <em>static main method</em>
- *
- * @author Volker Dahnke / Manuel Traut
- *
- * @version 0.1 20-11-2005<br>
- */
-public class YalpServer{
-
-/*
- * starts Server initialization
- *
- * @param argv
- * arguments which are not used
- */
- public static void main (String[] argv) {
- try{
- System.setProperty("java.security.policy","server.policy");
- } catch (Exception e) {//DEBUG
- System.out.println ("Server SecurityManagerExeptions not caught jet " + e);
- System.exit(0);
- }
- InitServer yalpServer = new InitServer(argv);
- return;
- }
-
-}
+/*
+ * Copyright (c) 2006 Manuel Traut and Volker Dahnke
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Common Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/cpl-v10.html
+ *
+ * Contributors: Manuel Traut and Volker Dahnke
+ */
+package YalpServer;
+
+/*
+ * Class Server
+ *
+ * <em>static main method</em>
+ *
+ * @author Volker Dahnke / Manuel Traut
+ *
+ * @version 0.1 20-11-2005<br>
+ */
+public class YalpServer{
+
+/*
+ * starts Server initialization
+ *
+ * @param argv
+ * arguments which are not used
+ */
+ public static void main (String[] argv) {
+ try{
+ System.setProperty("java.security.policy","server.policy");
+ } catch (Exception e) {//DEBUG
+ System.out.println ("Server SecurityManagerExeptions not caught jet " + e);
+ System.exit(0);
+ }
+ InitServer yalpServer = new InitServer(argv);
+ return;
+ }
+
+}