ࡱ> q` QbjbjqPqP .::fI% xxxx  YYY8ZlZ A@H[H["j[j[j[I\I\I\$hn ^E\I\ ^ ^xxj[j[ ^xj[ j[ ^r@T h @j[<[ 0xYv 0AWvW@W @I\L\6\,\)I\I\I\I\I\I\A ^ ^ ^ ^ dJ`T `T xxxxxx CPAN423 Enterprise Java Programming Lecture #2: More on Servlets Tracking users using Sessions and Cookies: HTTP is stateless protocol, meaning that the server doesnt maintain contextual information about a client. The client opens a separate connection to the web server each time it needs to request a document from that server. Cookies are textual information sent by the server to the client. The next time the client visit the same page, the cookies information are sent back to the server. The server can use this information to identify a user. The server can then perform different tasks, like customizing the website, store the user choices, or remember the user password. Cookies have some limitations: In general browsers can accept 20 cookies per site and total of 300 cookies. The size of each cookie is limited to 4 kilobytes. Users can turn cookies off due to privacy issues; therefore the web application should not use cookies extensively, especially for sensitive information. Servlets provide HttpSessin API interface that enable programmer to keep tracking of users using sessions. The session object is stored on the serve side and can help you to keep track of your web site visitors. Data can be put in the session and retrieved from it, much like a Hashtable. A different set of data is kept for each visitor to the site. Persistent Servlet State: The ServletConetxt interface provide methods for storing persistence data that can be shared by all the Servlets and JSP files in the same web application. The methods setAttribute and getAttribute of this interface allows us to store and restore data that are associated with a specific key. Data stored in a ServletContext object are not tied to a particular user and are available through the method getServletContext of ServletConfig interface In JSP the data stored in the ServletContext are available in the implicit object application. Sending and Receiving Email with Servlet The Java Mail API provides a group of classes and interfaces to send and receive email. To install the Mail API with Resin, you need to download the Mail API and the JAF from suns Java website. Unzip the two packages and store the jar files in the Resin-ee.x.x.x\lib folder. You need to restart the server for the changes to take effect. Also you can use SmtpClient class from the package sun.net.smtp included in the JDK to send email using a valid SMTP server. See the Java documentation for details about the mail APIs. Examples Ex1:Session tracking example using Servlet The user in this example must invoke an HTML form called idForm.html that has the following content: Session track form
Type your name:
This form will be submitted to a servlet called SaveSession. The following configuration should be added to web.xml for this servlet: SaveServletEx SaveSessionServlet /SaveSession SaveServletEx Following is the source code for SaveSessionServlet : import javax.servlet.*; import javax.servlet.http.*; import java.util.*; import java.io.*; public class SaveSessionServlet extends HttpServlet { public void doPost (HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException { res.setContentType("text/html"); String name = req.getParameter( "username" ); /* store the user name in the seesion object. The user name is stored as a value for an attribute called theName */ HttpSession session= req.getSession(true); session.setAttribute("theName",name); PrintWriter out=res.getWriter(); out.println("click this "+session.getAttribute("theName")+""); } } The SaveSessionServlet saves the user's name in the session, and puts a link to another servlet called NextServlet. The following configuration should be added to web.xml for this NextServlet: NextServletEx NextServlet /NextServlet NextServletEx Following is the source code for NextServlet: import javax.servlet.*; import javax.servlet.http.*; import java.util.*; import java.io.*; public class NextServlet extends HttpServlet { public void doGet (HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException { res.setContentType("text/html"); String name = req.getParameter( "username" ); /* store the user name in the seesion object. The user name is stored as a value for an attribute called theName */ HttpSession session= req.getSession(true); PrintWriter out=res.getWriter(); out.println("Hello "+session.getAttribute("theName")); } } Ex2:cookies example using Servlet In this example we will use an HTML form called cookie.html to send user information to a servlet called cookieServlet. cookie.html has the following content: Cookies Example

User name

User password

Store Cookie

 

The Servlet cookieServlet gets the user information and send them back as a cookie to the client. The next time the client request the cookieServlet, all the available cookies will be displayed as an HTML table. import java.io.*; import java.util.*; import javax.servlet.http.*; import javax.servlet.*; public class cookieServlet extends HttpServlet { Cookie[] myCookie; public void doPost ( HttpServletRequest req, HttpServletResponse res ) throws ServletException, IOException { res.setContentType("text/html"); PrintWriter pw = res.getWriter(); /* get the user information and store them in a variables. Remember variable will store the value of the remeber check box. */ String name=req.getParameter("uname"); String password=req.getParameter("upassword"); String remember=req.getParameter("remember"); if (remember==null) remember=""; boolean found=false; // get all the avaliabile cookies from the request object myCookie=req.getCookies(); /* check if the user information is already stored in the cookie */ if (myCookie!=null) { for(int i=0;i"); pw.println("

Welcome "+name+"

"); /* display any existing cookie in a tablular format */ if (myCookie!=null) { pw.println(""); for(int i=0;i"+""); } pw.println("
cookie namecookie value
"+myCookie[i].getName()+""+myCookie[i].getName()+ "
"); } pw.println("Re login again"); pw.println(""); pw.close(); } } The servlet files should be saved in the folder: resin-x.x.x\webapps\cpan423\WEB-INF\lasses. The HTML file should be saved in the folder: resin-x.x.x\webapps\pan423 Notice that you need to add the following servlet configuration to the web.xml file: cookieServlet cookieServlet /cookieServlet cookieServlet Ex3: using the ServletContext We will write two Servlets that store and share the number of hits in the entire application. The first servlet is called Servlet1.java and has the following content: import javax.servlet.*; import javax.servlet.http.*; import java.io.*; public class Servlet1 extends HttpServlet { int count; public void doGet (HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException { res.setContentType("text/html"); PrintWriter out = res.getWriter(); if (getServletContext().getAttribute("visitorCount")==null) count=0; else { Integer val= (Integer)getServletContext().getAttribute("visitorCount"); count=val.intValue(); } getServletContext().setAttribute("visitorCount",new Integer(++count)); out.println("Servlet 1"); out.println(" Number of hits in this application so far is : "+getServletContext().getAttribute("visitorCount").toString()+""); out.println(""); } } The second servlet is called Servlet2.java and has the following content: import javax.servlet.*; import javax.servlet.http.*; import java.io.*; public class Servlet2 extends HttpServlet { int count; public void doGet (HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException { res.setContentType("text/html"); PrintWriter out = res.getWriter(); if (getServletContext().getAttribute("visitorCount")==null) count=0; else { Integer val= (Integer)getServletContext().getAttribute("visitorCount"); count=val.intValue(); } getServletContext().setAttribute("visitorCount",new Integer(++count)); out.println("Servlet 2"); out.println(" Number of hits in this application so far is : "+getServletContext().getAttribute("visitorCount").toString()+""); out.println(""); } } The number of hits in this example is stored in a key called visitorCount. The first time a client access this application (does not matter which page), count is set to zero. For each page visit in this application, count is incremented by one and stored back into the ServletContext. The servlet files (Servlet1.java and Servlet2.java) should be saved in the folder: resin-x.x.x\webapps\Cpan423\WEB-INF\lasses. You need to add the following servlet configuration to web.xml: Servlet1 Servlet1 /Servlet1 Servlet1 Servlet2 Servlet2 /Servlet2 Servlet2 Ex4: Sending email using SmtpClient We will create a servlete that send an email using SmtpClient. The servlet is called sendmail.java and has the following content: import javax.servlet.*; import javax.servlet.http.*; import java.io.*; import java.util.*; import sun.net.smtp.SmtpClient; public class sendemail extends HttpServlet { String msgFrom,msgTo,msgSubject, message; PrintWriter out ; public void doPost (HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException { res.setContentType("text/html"); out = res.getWriter(); msgFrom= req.getParameter("semail"); msgTo= req.getParameter("remail"); msgSubject=req.getParameter("subject"); message=req.getParameter("message"); if (!sendMail()) { res.sendError(res.SC_INTERNAL_SERVER_ERROR, "An error occurs while attempting to access the mail server"); return; } out.println("The floowing is a confirmation that the following email has been sent"); out.println("sender: "+msgFrom); out.println("
receiver: "+msgTo); out.println("
message: "+message); out.close(); } public boolean sendMail() { PrintStream ps; SmtpClient send; try { send = new SmtpClient("smtp.humberc.on.ca"); send.from(msgFrom); send.to(msgTo); ps = send.startMessage(); ps.println("From: " + msgFrom); ps.println("To: " + msgTo); ps.println("Subject: " + msgSubject); ps.println("----------------"); ps.println("\n"); ps.println(message); ps.println("\r\n"); ps.println("----------------"); ps.flush(); ps.close(); send.closeServer(); } catch(IOException e) { out.println(e.toString()); return false; } return true; } } Below is an HTML form called sendmail.html that will be used to invoke sendmail Servlet and pass the required information. sending email example
Sender email address:
Receiver email address:
Subject
Message


The servlet file (sendemail.java) should be saved in the folder: resin-x.x.x\webapps\Cpan423\WEB-INF\lasses. The html file sendemail.html should be saved under the folder resin-x.x.x\webapps\Cpan423 You need to configure the servlet in your web.xml by adding servlet/servlet-mapping entry as shown below: sendemailServlet sendemail /sendemail sendemailServlet Ex5: Sending email using Java Mail API The servlet in this example uses Java Mail API to send an email: import javax.mail.*; import javax.mail.internet.*; import javax.servlet.*; import javax.servlet.http.*; public class SendMailAPI extends HttpServlet { private String smtpHost= "smtp.humber.ca"; // Initialize the servlet with the hostname of the SMTP server // we'll be using the send the messages public void doPost( HttpServletRequest request, HttpServletResponse response ) throws ServletException, java.io.IOException { String from = request.getParameter("from"); String to = request.getParameter("to"); String cc = request.getParameter("cc"); String bcc = request.getParameter("bcc"); String subject = request.getParameter("subject"); String text = request.getParameter("text"); String status; try { // Create the JavaMail session java.util.Properties properties = System.getProperties(); properties.put("mail.smtp.host", smtpHost); Session session = Session.getInstance(properties, null); // Construct the message MimeMessage message = new MimeMessage(session); // Set the from address Address fromAddress = new InternetAddress(from); message.setFrom(fromAddress); // Parse and set the recipient addresses Address[] toAddresses = InternetAddress.parse(to); message.setRecipients(Message.RecipientType.TO,toAddresses); Address[] ccAddresses = InternetAddress.parse(cc); message.setRecipients(Message.RecipientType.CC,ccAddresses); Address[] bccAddresses = InternetAddress.parse(bcc); message.setRecipients(Message.RecipientType.BCC,bccAddresses); // Set the subject and text message.setSubject(subject); message.setText(text); Transport transport=session.getTransport("smtp"); // You need to place you own user ID and Passowrd transport.connect(smtpHost,"user","password"); transport.send(message); status = "Your message was sent."; } catch (AddressException e) { status = "There was an error parsing the addresses."; } catch (SendFailedException e) { status = "There was an error sending the message."+e.toString(); } catch (MessagingException e) { status = "There was an unexpected error."+e.toString(); } // Output a status message response.setContentType("text/html"); java.io.PrintWriter writer = response.getWriter(); writer.println("Status"); writer.println("

" + status + "

"); writer.close(); } } Below is an HTML form called SendMailAPI.html that will be used to invoke SendMailAPI servlet: sendmail

sendmail

From:
To:
CC:
BCC:
Subject:

The servlet file (SendeMailAPI.java) should be saved in the folder: resin-x.x.x\webapps\Cpan423\WEB-INF\lasses. The html file SendMailAPI.html should be saved under the folder resin-x.x.x\webapps\Cpan423 You need to configure the servlet in your web.xml by adding servlet/servlet-mapping entry as shown below: SendMailAPI SendMailAPI /SendMailApi SendMailAPI     PAGE  PAGE 1 $&/01BCDrR P R l p ~ !&2&0N\˻zizizah)mH sH  h)5OJQJ\^JmH sH h)OJQJ^JmH sH h)5OJQJ\^Jh)OJQJ^Jh)OJQJ^JaJmH sH h)CJOJQJ^Jh)5>*OJQJ\^JaJh)5>*OJQJ\^Jh)5>*CJ\ h)>*hus/h)5>*CJOJQJ\^Jh)%$%&CDEFqrR S P Q R l 0 [$\$$a$$a$ $[$\$a$$a$fQQQ )@L9Df#.y˿pdTEh)h)OJQJ^JaJhL _h)5OJQJ^JaJh}.OJQJ^JaJhcs@5OJQJ\^JaJ"hcs@hcs@5OJQJ\^JaJhu`h)5OJQJ^JaJh)5OJQJ\^JaJh)5OJQJ\^JaJh)OJQJ^JaJh)5>*OJQJ\^JaJh)h)5OJQJ\^Jh)OJQJ^JhAdOJQJ^J ef 5=Dn~ygdcs@$a$$a$yz+WYlm57 gdUzgdcs@gdgryzklmbdefghimxչ|pdUdE8hh5OJQJ^JaJh _h)5OJQJ^JaJh)5OJQJ\^JaJh)OJQJ^JaJh}.OJQJ^JaJh)OJQJ^JaJhUz5OJQJ^JaJ'hus/hUz5OJQJ^JaJmH sH hUzhUz5OJQJ^JaJhs5OJQJ^JaJhgrhgrOJQJ^JaJh)5OJQJ^JaJhgrhgr5OJQJ^JaJhgr5OJQJ^JaJ ?Z[`acdegh+,6bgdl&gd#gdcs@gdUz)+,9FGH轭o`QAQ`QhEhEOJQJ\^JaJhE5OJQJ\^JaJh)5OJQJ\^JaJ"hl&h)5OJQJ\^JaJhl&h)5OJQJ^JaJhl&hl&5OJQJ^JaJhl&OJQJ^JaJh#h#5OJQJ^JaJh)h#OJQJ^JaJhwSOJQJ^JaJhhhh5OJQJ^JaJhhOJQJ^JaJh)OJQJ^JaJGHIa~LQuv!'(TUgd_ gdl&HI~GTUVa}#  m"xnxaSBSa h)5OJQJ\^JmH sH h)OJQJ^JmH sH h)5OJQJ\^Jhu`OJQJ^Jh@e6h)5OJQJ^Jh)OJQJ^Jh)5OJQJ\^JaJh)OJQJ^JaJh8[5OJQJ\^JaJh6K5OJQJ\^JaJh_ 5OJQJ\^JaJ*hus/h_ 5OJQJ\^JaJmH sH "h_ h_ 5OJQJ\^JaJUvw}*IQX(pgd_  !1!b!u!!! "2"5"""" #8#Y#n####$$$$[$\$m"u"S'['''''''''(((#($(B(C(](^(_(`((ȺȺȪyiyZJh\ h\ OJQJ\^JaJh)5OJQJ\^JaJh[bh8[5OJQJ\^Jh8[OJQJ\^JhJ&OJQJ\^Jh[ph8[OJQJ\^Jh8[5OJQJ\^Jh|h8[5OJQJ\^Jh8[CJOJQJ^JaJ h|h8[CJOJQJ^JaJhh7_5OJQJ\^Jh)5OJQJ\^Jh&g5OJQJ\^J$B$F$p$~$$$$$% %:%=%>%d%w%%%%%% &&$&&&|&&&&'' '"'&'''''''_(`(((((()')9)e)))))))))gdRgd8[((((())))B*O*p*-----1R1_111111142D2E2G2ɷ姘|k]kh,CJOJQJ^JaJ h|h,CJOJQJ^JaJh)OJQJ^JaJmH sH h)OJQJ^JaJh)5OJQJ\^JaJh\ hIOJQJ\^JaJ"hRhR5OJQJ\^JaJhR5OJQJ\^JaJhd&h|h`5CJOJQJ\^JaJ#h`h`5CJOJQJ^JaJ h|h`CJOJQJ^JaJh/Kx5OJQJ\^Jh)5OJQJ\^J h)5OJQJ\^JmH sH h)OJQJ^JmH sH h)OJQJ^Jh)5OJQJ\^JaJh/KxOJQJ^JaJh)OJQJ^JaJh{hGe5OJQJ^JaJh{h{5OJQJ^JaJ444444X5Y5Z5r5555566/6C66666 737Z7777[$\$gd{778X8g8m888 919>9B9^9b9v9999999:E:l::::: ;1;1;C;U;o;t;;;;;;;;;;;;^<_< =1=9=@======>!>T>T>\>>>>>>>???F???7@8@9@C@r@s@@@@@AA&A'A(AgdUgd`2?3?F?p????????? @ @8@%A&A'A(A-AAöötetVG=h)OJQJ^Jh)5OJQJ\^JaJhCPZ5OJQJ\^JaJh`5OJQJ\^JaJ"hUhU5OJQJ\^JaJ#hJh`5CJOJQJ^JaJhWqCJOJQJ^JaJh|hA5OJQJ\^JhA5OJQJ\^JhAhAOJQJ\^Jh|h`5OJQJ\^J h|h`CJOJQJ^JaJh`CJOJQJ^JaJ(A)APAAAAAAAAA+B,BZB[BBBBBBC&C+C]CCCCDSDgd@SDDDDDEEGEbEEEEEEFJFqFrFFF&G'G(GdGGGG1H2HWHgd@WH}HHHI9IWIXIIIIIJgJJJJJJ+K,KeKfKKKKLL Lgd@AHHIII5IL L L L L)L9LVLaLkLlLMMM?O@OAOSO񴠒{{{l_{lN h|hZ>CJOJQJ^JaJhCPZ5OJQJ\^Jh)5OJQJ\^JaJh)OJQJ^Jh)5OJQJ\^Jh)OJQJ^JmH sH &hWhW5OJQJ\^JmH sH h@h)5OJQJ^JhE<(5OJQJ^Jh@h\[5OJQJ^Jh\[5OJQJ^JhW5OJQJ^Jh@hW5OJQJ^J L L L LkLlLM:MEM]MMMNANsNNN O!O-O7O?O@OAOOPP{PgdZ>[$\$gdWSOTOXOYO\O_OdOtOuOOOOOOOOOOPPPMP̸{k^Q^{^ChCJOJQJ^JaJhv5OJQJ\^JhZ>5OJQJ\^Jhvhv5OJQJ\^JhAhZ>OJQJ\^Jh|hZ>5OJQJ\^JhZ>CJOJQJ^JaJ h|hZ>CJOJQJ^JaJ&h|hZ>5CJOJQJ\^JaJhZ>5CJOJQJ^JaJ#h`hZ>5CJOJQJ^JaJ#hZ>hZ>5CJOJQJ^JaJMPdP{P|PdQeQfQgQiQjQlQmQoQpQrQsQyQzQ{Q}Q~QQQQQQQQQQоЯhus/0JmHnHuh) h)0Jjh)0JUh v/jh v/Uh05OJQJ\^JaJ"hh5OJQJ\^JaJhZ>5OJQJ\^JaJhZ>CJOJQJ^JaJ#hJhZ>5CJOJQJ^JaJ{P|P}PPPPPPP&QPQQQdQeQfQhQiQkQlQnQoQqQrQ{Q|Q}QQQh]h&`#$gdQQQQQQQQQQQQQQ ,1h/ =!"#$% @@@ NormalCJ_HaJmH sH tH :@: Heading 1$@&5\J@J Heading 2$@&5>*OJQJ\^JBB Heading 3$@&5CJ\aJFF Heading 7$@&5>*CJ\aJDA@D Default Paragraph FontViV  Table Normal :V 44 la (k(No List J^@J Normal (Web)dd[$\$mH sH B>@B Title$a$5CJOJQJ\^J4 @4 Footer  !.)@!. Page Number@B2@ Body Text$a$ OJQJ^J6UA6 Hyperlink >*B*phLPRL Body Text 25CJOJQJ\^JaJFVaF FollowedHyperlink >*B* pher HTML Preformatted7 2( Px 4 #\'*.25@9CJOJPJQJ^JaJBbB HTML CodeCJOJPJQJ^JaJ^C^ Body Text Indent$^a$CJOJQJ^JaJNgN HTML TypewriterCJOJPJQJ^JaJ:Q@: Body Text 3CJaJ I  I$%&CDEFqrRSPQRl0 e f  5 = D n ~ y z  + W Y l m 57 ?Z[`acdegh+,6bGHIa~LQuv!'(TUvw}*IQX(p1bu 25 8YnBFp~ :=>dw $&| "&_ ` !'!9!e!!!!!!!!!%"&"o"p"""""""6#d#i#####$$J$a$c$$$$w%%%%%%%&&/&Y&[&g&&&&'.'j's'x'z''''&('(Y(( ))))3*4****+(+)+R+^+p++++++++,,.,:,L,s,,,,,,,,X-Y-Z-r-----../.C..... /3/Z/////0X0g0m000 111>1B1^1b1v11111112E2l22222 313C3U3o3t333333333333^4_4 51595@5555556!6T6\6666666777F777788898C8r8s8888899&9'9(9)9P999999999+:,:Z:[::::::;&;+;];;;;<S<<<<<==G=b======>J>q>r>>>&?'?(?d????1@2@W@}@@@A9AWAXAAAAABgBBBBBB+C,CeCfCCCCDD D D D DkDlDE:EEE]EEEFAFsFFF G!G-G7G?G@GAGGHH{H|H}HHHHHHH&IPIQIdIeIfIhIiIkIlInIoIqIrI{I|I}IIIIIIIIIIIIIII000000&0&0&0&0&0&0&0&0&0&0&0&0&00R0R0R000000 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000@0I00@0I00@0I00@0I00@0@0@0@0@0@0I00<000000000|X  y z  + W Y l m Z[`acdegh+,6IwIK00DI00I000I00I00@0@0K00hI00I00I00I00I00K00@0K00I00I00I00I00I00I00K00I00I00I00@0p@0pK00I00I000!I00I00@0K0$%I0$I0$ -I00I00I00K00@ $$$'yHm"(G222?ASOMPQ),/1369=>CGIJ y U$')-1471;T>(ASDWH L{PQQ*-.024578:;<?@ABDEFHKLQ+  '!!8@0(  B S  ?I6W36W<936Wg56Wܾ86W8]]eIdjjI=*urn:schemas-microsoft-com:office:smarttags PlaceType=*urn:schemas-microsoft-com:office:smarttags PlaceName8*urn:schemas-microsoft-com:office:smarttagsCity9*urn:schemas-microsoft-com:office:smarttagsplace 9.0:B ]dp~!&2$N\ ( @ L ` k   # . _ f p w {      ! - 4 : G I P [ b  )4FLN`adfyz}/6} "1EGNm )-48?ERT[dkr} :EI~.>@KTf )4>LU`erw8?GTvz   ->KT_ks!.*Y`} #&'(->LTUVX_#2S`epx&0GIKM[]_apruw '16: ! !!!%!(!/!;!>!I!V!X![!g!n!t!!!!!!!!!!0"7"w"""""""""""######0#1#4#F#V#X#c#o############ $ $$)$,$8$:$F$Q$]$f$w$z$$$$$$$$$$/%@%C%O%Q%]%`%h%}%%%%%%&&$&+&M&X&\&_&v&{&}&&&&&&&&&&&&&& '''*'2'C'F'R'T'`'''''''''''''''((*(5(D(K(b(m(((((((((()R)^)#*1*8*?*******+ ++!+++2+C+J+U+\+_+f+r+u+++++++++++++++,,,&,1,8,;,B,N,Q,f,i,u,|,,,,,,,,, --- -+-8-a-n-y------------ .$.1.<.Q.W.Y.k.l.o.q...........////'/)///7//N/P/V/^/h/i/y////////0m0x0~000000000011 111111:1K1R1S1[1f1q1r1t1z1111111111112222"2,2;2B2K2U2d2i2r2|222222222233373?3I3Q3[3k3}333333)41434:44455556666O6Q6]6e666667 77"77777 88:8A8E8L8R8b8d8k8u8|88888888888888888899 999T9[999999999 :::(:>:F:p:w::::: ;;5;E;G;Z;q;;;;;;;<2<F<g<{<<<<<< ==)=+=9=<=D=X=_=k=~=====!>,>3>B>S>b>c>n>>>>>>>>#?;?F?I?^?m?????????@@.@`@r@@@@@@@@A AAA5A>ALAAABBOBcByBBBBCC2CECOCaClCzCCCCCVDaDbDiDDD"E*EOEWEEE FFFnFpFFFFFFFFFEGLGSGdG+H2H;HBHMH\H~HHHHHHHHHHHHHHHHHHHI IIII(I/I5I@IBIIISIZIfIfIhIhIiIiIkIlInIoIqIrIzI}IIIIII&B4K f o    > B   { :@ -4Iag~'-Tg>MeswVa}+1RVv{17biw}!/58+8:Y` #HJrx LSeq&1| '2 (!7!p"v"""""""""""?#E#o##########$)$K$Q$f$x$$$$$}%%%%&&&#&/&5&\&_&j&p&&&&&'+'.'0'j'p's'w'''''''*(6(b(n(()**_+n+++;,J,,,Z-`-r-x---------.$.=.B.E.K.......//7/5:8A888999999999:/:6:::.;4;q;;;;;;;<2<G<g<|<<<<<<<=*=k====3>C>S>c>>>>>1?9?m?????@`@s@@@@@@@ AA>AMAaAgAAA&B,BYBdBBBBBCC2CEClC{CCCCCbDjDlDuDE"E?ECEwEyEEEEEFFAFEFsF{F GG~HHHHfIfIhIhIiIiIkIlInIoIqIrIzI}IIIIII33333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333&B Y m :^i,7I~ !!!$")_)**S+^+,,9&9'9)9<<pBBCD D DQIdIeIfIfIhIhIiIiIkIlInIoIqIrIIII/0 I~fIfIhIhIiIiIkIlInIoIqIrIIII%|(B,l?fAPac-gp^`o(-^`.pLp^p`L.@ @ ^@ `.^`.L^`L.^`.^`.PLP^P`L.^`o(-^`.pLp^p`L.@ @ ^@ `.^`.L^`L.^`.^`.PLP^P`L.^`o(-^`.pLp^p`L.@ @ ^@ `.^`.L^`L.^`.^`.PLP^P`L.^`o(-^`.pLp^p`L.@ @ ^@ `.^`.L^`L.^`.^`.PLP^P`L.fAc-g(B,%8BU        8BU        8BU        8BU        ZYJ&-@T _ \ v(9Z>)I`#.%l&O'E<(.o(!),}.us/ v/Y3PZ4@e6<p<8?@cs@BIEC5GcT8W YCPZ\[*w^ _L _h7_u`I7b[bAd&gg8gMh[pWqgrsXu/KxU` $A{Gehm1)RcS )UzSJwSv% r>%!4dAIAI 2QHX? 2Pattern Design:Humber Collegezouri    Oh+'0   @ L X dpxPattern Design:Humber CollegeNormalzouri95Microsoft Office Word@p@~7ɓ@~7ɓ@Űx r>՜.+,0 hp  Humber College%AI Pattern Design: Title  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMOPQRSTUWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~Root Entry F0xData N1TableVsWordDocument.SummaryInformation(DocumentSummaryInformation8CompObjq  FMicrosoft Office Word Document MSWordDocWord.Document.89q