[LON-CAPA-cvs] cvs: loncom /html/adm/lonIcons branch.gif navmap.correct.gif navmap.icons.gimp.xcf navmap.open.gif navmap.wrong.gif /interface lonnavmaps.pm doc/loncapafiles loncapafiles.lpml
bowersj2
lon-capa-cvs@mail.lon-capa.org
Tue, 01 Oct 2002 19:15:22 -0000
This is a MIME encoded message
--bowersj21033499722
Content-Type: text/plain
bowersj2 Tue Oct 1 15:15:22 2002 EDT
Added files:
/loncom/html/adm/lonIcons branch.gif navmap.correct.gif
navmap.icons.gimp.xcf navmap.open.gif
navmap.wrong.gif
Modified files:
/doc/loncapafiles loncapafiles.lpml
/loncom/interface lonnavmaps.pm
Log:
Adds icons for nav map. Installs icons for nav map. Commits original gimp file.
Installs new icons with loncapafiles.
Correctly unties the course hashes! Update to this if you care about the lonnavmaps.
--bowersj21033499722
Content-Type: text/plain
Content-Disposition: attachment; filename="bowersj2-20021001151522.txt"
Index: doc/loncapafiles/loncapafiles.lpml
diff -u doc/loncapafiles/loncapafiles.lpml:1.176 doc/loncapafiles/loncapafiles.lpml:1.177
--- doc/loncapafiles/loncapafiles.lpml:1.176 Mon Sep 23 15:52:37 2002
+++ doc/loncapafiles/loncapafiles.lpml Tue Oct 1 15:15:22 2002
@@ -3,7 +3,7 @@
<!-- loncapafiles.lpml -->
<!-- Scott Harrison -->
-<!-- $Id: loncapafiles.lpml,v 1.176 2002/09/23 19:52:37 harris41 Exp $ -->
+<!-- $Id: loncapafiles.lpml,v 1.177 2002/10/01 19:15:22 bowersj2 Exp $ -->
<!--
@@ -3276,6 +3276,7 @@
aboutlon.gif;
accessbutton.gif;
arrow_up.gif;
+branch.gif;
cab.gif;
cab_big.gif;
capapanel.gif;
@@ -3327,6 +3328,9 @@
mov_big.gif;
move_up.gif;
move_down.gif;
+navmap.correct.gif;
+navmap.open.gif;
+navmap.wrong.gif;
page.gif;
page_big.gif;
pdf.gif;
Index: loncom/interface/lonnavmaps.pm
diff -u loncom/interface/lonnavmaps.pm:1.58 loncom/interface/lonnavmaps.pm:1.59
--- loncom/interface/lonnavmaps.pm:1.58 Tue Oct 1 03:20:31 2002
+++ loncom/interface/lonnavmaps.pm Tue Oct 1 15:15:22 2002
@@ -1,7 +1,7 @@
# The LearningOnline Network with CAPA
# Navigate Maps Handler
#
-# $Id: lonnavmaps.pm,v 1.58 2002/10/01 07:20:31 albertel Exp $
+# $Id: lonnavmaps.pm,v 1.59 2002/10/01 19:15:22 bowersj2 Exp $
#
# Copyright Michigan State University Board of Trustees
#
@@ -848,16 +848,38 @@
# Defines a status->color mapping, null string means don't color
my %colormap =
( $res->NETWORK_FAILURE => '',
- $res->CORRECT => '#BBFFBB',
+ $res->CORRECT => '',
$res->EXCUSED => '#BBBBFF',
- $res->PAST_DUE_ANSWER_LATER => '#FFAA00',
- $res->PAST_DUE_NO_ANSWER => '#FFAA00',
- $res->ANSWER_OPEN => '#FF00AA',
+ $res->PAST_DUE_ANSWER_LATER => '',
+ $res->PAST_DUE_NO_ANSWER => '',
+ $res->ANSWER_OPEN => '#CCFFCC',
$res->OPEN_LATER => '',
- $res->TRIES_LEFT => '#FFFF00',
- $res->INCORRECT => '#FFAA00',
- $res->OPEN => '#FFFF88',
+ $res->TRIES_LEFT => '',
+ $res->INCORRECT => '',
+ $res->OPEN => '',
$res->NOTHING_SET => '' );
+ # And a special case in the nav map; what to do when the assignment
+ # is not yet done and due in less then 24 hours
+ my $hurryUpColor = "#FFCCCC";
+
+ my %statusIconMap =
+ ( $res->NETWORK_FAILURE => '',
+ $res->NOTHING_SET => '',
+ $res->CORRECT => 'navmap.correct.gif',
+ $res->EXCUSED => 'navmap.correct.gif',
+ $res->PAST_DUE_NO_ANSWER => 'navmap.wrong.gif',
+ $res->PAST_DUE_ANSWER_LATER => 'navmap.wrong.gif',
+ $res->ANSWER_OPEN => 'navmap.wrong.gif',
+ $res->OPEN_LATER => '',
+ $res->TRIES_LEFT => 'navmap.open.gif',
+ $res->INCORRECT => 'navmap.wrong.gif',
+ $res->OPEN => 'navmap.open.gif' );
+
+ my %condenseStatuses =
+ ( $res->NETWORK_FAILURE => 1,
+ $res->NOTHING_SET => 1,
+ $res->CORRECT => 1,
+ $res->OPEN => 1 );
my %filterHash;
# Figure out what we're not displaying
@@ -868,16 +890,18 @@
}
# Begin the HTML table
- # two columns: the title/icon on the left, the info on the right
+ # four cols: resource + indent, chat+feedback, icon, text string
$r->print('<table cellspacing="3" cellpadding="0" bgcolor="#FFFFFF">' ."\n");
my $mapIterator = $navmap->getIterator(undef, undef, \%filterHash);
my $curRes = $mapIterator->next();
undef $res; # so we don't accidentally use it later
my $indentLevel = -1;
- my $indentString = " ";
+ my $indentString = "<img src=\"/adm/lonIcons/whitespace1.gif\" width=\"25\" height=\"1\"/>";
my $isNewBranch = 0;
+ my $now = time();
+ my $in24Hours = $now + 24 * 60 * 60;
while ($curRes != $mapIterator->END_NAV_MAP) {
if ($curRes == $mapIterator->BEGIN_MAP() ||
@@ -894,17 +918,60 @@
if (ref($curRes) && $curRes->src()) {
+ # Step one: Decide which parts to show
my @parts;
if ($curRes->is_problem()) {
+ # Is it multipart?
@parts = @{$curRes->parts()};
- if (scalar(@parts) > 1) { shift(@parts); }
+
+ my $multipart = scalar(@parts) > 1;
+
+ if ($multipart) {
+ # If it's multipart, see if part 0 is "open"
+ # if it is, display all parts, if it isn't,
+ # just display first
+ if (!$curRes->opendate("0")) {
+ @parts = ("0"); # just display the zero-th part
+ } else {
+ # Otherwise, only display part 0 if we want to
+ # attach feedback or email information to it
+ if (!$curRes->hasDiscussion() && !$curRes->getFeedback()) {
+ shift @parts;
+ } else {
+ # If there's discussion or feedback, that counts
+ # as a difference, so display the parts.
+
+ # Now, we decide whether to condense the
+ # parts due to similarity
+ my $status = $curRes->status($parts[0]);
+ my $allSame = 1;
+ for (my $i = 1; $i < scalar(@parts); $i++) {
+ if ($curRes->status($parts[$i]) != $status){
+ $allSame = 0;
+ }
+ }
+
+ # $allSame is true if all the statuses were
+ # the same. Now, if they are all the same and
+ # match one of the statuses to condense, then
+ # only display part 0.
+ if ($allSame && defined($condenseStatuses{$status})){
+ @parts = ("0");
+ }
+ }
+ }
+ }
+
} else {
@parts[0] = "0"; # this is to get past foreach loop below
# you can consider a non-problem resource as a resource
# with only one part without loss
}
+ # Step two: Show the parts
foreach my $part (@parts) {
+
+ my $deltalevel = 0; # for inserting the branch icon
# For each thing we're displaying...
@@ -923,8 +990,9 @@
# If this is a new branch, label it so
# (temporary, this should be an icon w/ alt text)
if ($isNewBranch) {
- $newBranchText = "NB -> ";
+ $newBranchText = "<img src=\"/adm/lonIcons/branch.gif\" border=\"0\">";
$isNewBranch = 0;
+ $deltalevel = 1;
}
# links to open and close the folders
@@ -960,10 +1028,11 @@
}
}
+ # FIRST ROW: The resource indentation, branch icon, and name
$r->print(" <tr><td align=\"left\" valign=\"top\">\n");
# print indentation
- for (my $i = 0; $i < $indentLevel; $i++) {
+ for (my $i = 0; $i < $indentLevel - $deltalevel; $i++) {
$r->print($indentString);
}
@@ -972,13 +1041,52 @@
if ($curRes->is_problem() && $part != "0") { $partLabel = " (Part $part)"; }
- $r->print(" <a href=\"$link\">$title$partLabel</a></td>".
- "<td $colorizer align=\"right\">\n");
+ $r->print(" <a href=\"$link\">$title$partLabel</a></td>");
+
+ my $discussionHTML = ""; my $feedbackHTML = "";
+
+ # SECOND ROW: Is there text or feedback?
+ if ($curRes->hasDiscussion()) {
+ $discussionHTML = $linkopen .
+ '<img border="0" src="/adm/lonMisc/chat.gif" />' .
+ $linkclose;
+ }
+
+ if ($curRes->getFeedback()) {
+ my $feedback = $curRes->getFeedback();
+ foreach (split(/\,/, $feedback)) {
+ if ($_) {
+ $feedbackHTML .= ' <a href="/adm/email?display='
+ . &Apache::lonnet::escape($_) . '">'
+ . '<img src="/adm/lonMisc/feedback.gif" '
+ . 'border="0" /></a>';
+ }
+ }
+ }
+
+ $r->print("<td align=\"left\">$discussionHTML$feedbackHTML</td>");
+
+ # THIRD ROW: Problem status icon
+ if ($curRes->is_problem()) {
+ my $icon = $statusIconMap{$curRes->status()};
+ if ($icon) {
+ $r->print("<td width=\"50\" align=\"right\">$linkopen<img src=\"/adm/lonIcons/$icon\" border=\"0\" />$linkclose</td>\n");
+ } else {
+ $r->print("<td></td>\n");
+ }
+ } else { # not problem, no icon
+ $r->print("<td></td>\n");
+ }
+
+ # FOURTH ROW: Text description
+ $r->print("<td $colorizer align=\"right\">\n");
if ($curRes->kind() eq "res" and
$curRes->is_problem() ) {
$r->print (getDescription($curRes, $part));
}
+
+ $r->print("</td></tr>\n");
}
}
$curRes = $mapIterator->next();
@@ -986,6 +1094,8 @@
$r->print("</table></body></html>");
+ $navmap->untieHashes();
+
return OK;
}
@@ -1054,10 +1164,14 @@
return "Opens: " . timeToHumanString($res->opendate($part));
}
if ($status == $res->OPEN) {
- return "Due: $status " . timeToHumanString($res->duedate($part));
+ if ($res->duedate()) {
+ return "Due: $status " . timeToHumanString($res->duedate($part));
+ } else {
+ return "Open, no due date";
+ }
}
if ($status == $res->PAST_DUE_ANSWER_LATER) {
- return "Answer: " . timeToHumanString($res->answerdate($part));
+ return "Answer opens: " . timeToHumanString($res->answerdate($part));
}
if ($status == $res->PAST_DUE_NO_ANSWER) {
return "Was Due: " . timeToHumanString($res->duedate($part));
@@ -1065,6 +1179,20 @@
if ($status == $res->ANSWER_OPEN) {
return "Answer available";
}
+ if ($status == $res->EXCUSED) {
+ return "Excused by instructor";
+ }
+ if ($status == $res->TRIES_LEFT) {
+ my $tries = $res->tries();
+ my $maxtries = $res->maxtries();
+ my $triesString = "($tries of $maxtries tries used)";
+ if ($res->duedate()) {
+ return "Due: $status " . timeToHumanString($res->duedate($part)) .
+ " $triesString";
+ } else {
+ return "No due date $triesString";
+ }
+ }
}
# I want to change this into something more human-friendly. For
@@ -1288,6 +1416,29 @@
$self->untieHashes();
}
+# Private function: Does the given resource (as a symb string) have
+# current discussion? Returns 0 if chat/mail data not extracted.
+sub hasDiscussion {
+ my $self = shift;
+ my $symb = shift;
+ if (!defined($self->{DISCUSSION_TIME})) { return 0; }
+
+ return $self->{DISCUSSION_TIME}->{$symb} >
+ $self->{LAST_CHECK};
+}
+
+# Private function: Does the given resource (as a symb string) have
+# current feedback? Returns the string in the feedback hash, which
+# will be false if it does not exist.
+sub getFeedback {
+ my $self = shift;
+ my $symb = shift;
+
+ if (!defined($self->{FEEDBACK})) { return ""; }
+
+ return $self->{FEEDBACK}->{$symb};
+}
+
=pod
=item * B<getById>(id): Based on the ID of the resource (1.1, 3.2, etc.), get a resource object for that resource. This method, or other methods that use it (as in the resource object) is the only proper way to obtain a resource object.
@@ -2020,6 +2171,30 @@
=over 4
+=item * B<hasDiscussion>: Returns a false value if there has been discussion since the user last logged in, true if there has. Always returns false if the discussion data was not extracted when the nav map was constructed.
+
+=item * B<getFeedback>: Gets the feedback for the resource and returns the raw feedback string for the resource, or the null string if there is no feedback or the email data was not extracted when the nav map was constructed. Usually used like this:
+
+ for (split(/\,/, $res->getFeedback())) {
+ my $link = &Apache::lonnet::escape($_);
+ ...
+
+and use the link as appropriate.
+
+=cut
+
+sub hasDiscussion {
+ my $self = shift;
+ return $self->{NAV_MAP}->hasDiscussion($self->symb());
+}
+
+sub getFeedback {
+ my $self = shift;
+ return $self->{NAV_MAP}->getFeedback($self->symb());
+}
+
+=pod
+
=item * B<parts>(): Returns a list reference containing sorted strings corresponding to each part of the problem. To count the number of parts, use the list in a scalar context, and subtract one if greater then two. (One part problems have a part 0. Multi-parts have a part 0, plus a part for each part. You may or may not wish to filter out part 0.)
=item * B<countParts>(): Returns the number of parts of the problem a student can answer. Thus, for single part problems, returns 1. For multipart, it returns the number of parts in the problem, not including psuedo-part 0.
@@ -2087,7 +2262,7 @@
=over 4
-=item * B<getDateStatus>($part): ($part defaults to 0). A convenience function that returns a symbolic constant telling you about the date status of the part, with the following possible results:
+=item * B<getDateStatus>($part): ($part defaults to 0). A convenience function that returns a symbolic constant telling you about the date status of the part. You should still check to see if there is a due date at all, if you care about that. The possible return values are:
=back
@@ -2099,6 +2274,7 @@
=item * B<OPEN>: Open and not yet due.
+
=item * B<PAST_DUE_ANSWER_LATER>: The due date has passed, but the answer date has not yet arrived.
=item * B<PAST_DUE_NO_ANSWER>: The due date has passed and there is no answer opening date set.
@@ -2146,10 +2322,10 @@
# should this be the same as "open later"? think multipart.
return $self->NOTHING_SET;
}
- if (!$open || $now < $open) {return $self->OPEN_LATER};
- if (!$due || $now < $due) {return $self->OPEN};
- if ($answer && $now < $answer) {return $self->PAST_DUE_ANSWER_LATER};
- if ($answer) { return $self->ANSWER_OPEN; };
+ if (!$open || $now < $open) {return $self->OPEN_LATER}
+ if (!$due || $now < $due) {return $self->OPEN}
+ if ($answer && $now < $answer) {return $self->PAST_DUE_ANSWER_LATER}
+ if ($answer) { return $self->ANSWER_OPEN; }
return PAST_DUE_NO_ANSWER;
}
@@ -2222,7 +2398,7 @@
=item * NETWORK_FAILURE: The network has failed and the information is not available.
-=item * NOTHING_SET: No dates have been set for this problem (part) at all. (Because only certain parts of a multi-part problem may be assigned, this can not be collapsed into "open later", as we don't know a given part will EVER be opened.)
+=item * NOTHING_SET: No dates have been set for this problem (part) at all. (Because only certain parts of a multi-part problem may be assigned, this can not be collapsed into "open later", as we don't know a given part will EVER be opened. For single part, this is the same as "OPEN_LATER".)
=item * CORRECT: For any reason at all, the part is considered correct.
@@ -2280,7 +2456,7 @@
# by 4 matrix (date status).
if ($dateStatus == PAST_DUE_ANSWER_LATER ||
- $dateStatus == PAST_DUE_NO_ANSWER) {
+ $dateStatus == PAST_DUE_NO_ANSWER ) {
return $dateStatus;
}
Index: loncom/html/adm/lonIcons/navmap.icons.gimp.xcf
+++ loncom/html/adm/lonIcons/navmap.icons.gimp.xcf
gimp xcf file d d B B \ / gimp-comment Created with The GIMP # 9 N c x d d Open
D [ d d s d d R
^ ! ! " # $ % & ' ( ) * + , - . / 0 1 2 3 4
5 6 7 < < < < < < < < < < < < < < < < < < < < <8 7 6 ^ ! ! " # $ % & ' ( ) * + , - . / 0 1 2 3 4
5 6 7 < < < < < < < < < < < < < < < < < < < < <8 7 6 ^ !B B B B! B" B# B$ B% B& B' B( B) B* B+ B, B- B. B/ B0 B1 B2 B3 B4
B5 B6 B7 B <B <B <B <B <B <B <B <B <B <B <B <B <B <B <B <B <B <B <B <B <B8 B7 B6 B^ U ! U ! U ! U ! U ! # $ % & ' ( ) * + , - . / 0 1
2 3 4 5 6 7 5Uq < < < < < < < < < < < < < < < < < < < 68 7 6 ! !
! "
! !
! "
B ! B! B B B B B B B B
B B B B B B B B B B B B B B B
B B B B B B B B !B "B B B B B B B B B B B B B B
B U ! U U U U U U U U U U
U U U U U U U U U U U U U
U U U U U U U U 8
5 4
3 2 1 0 / . - , + * ) ( ' & % $ # " ! 5 4
3 2 1 0 / . - , + * ) ( ' & % $ # " ! 5 B4
B3 B2 B1 B0 B/ B. B- B, B+ B* B) B( B' B& B% B$ B# B" B! B B B B B 5 4 3 2
1 0 / . - , + * ) ( ' & % $ # " UU
!
! B B B B B B B B B B B B
B B B B B B B B B B! B
2 2 b V Drop-Shadow#3
\ 5 b V M b V i ' '
").01121/,% ,?NY^`aaba^XL;( "<Ys~gJ/ #@c
tP 5X~ Խw $@e 'Ei (Fj )Fj )Fj )Fj ! )Fj " )Fj$ )Fj% )Fj& )Fj & )Fj( )Fj) )Fj* )Fj+ )Fj + )Fj- )Fj. )Fj/ )Fk %+Im &
3Pu '!'3Gd (4<@AAB'BCEKWk -G]krttu(uvy~ !Bi) *S*/\,1a-2b32b32b32b32b32b32b32b32b32b32b31a.0^, ,V+ %Hr*
5Sm~)ꋏ 2AKPQQR(RTYcs $''((*/8Ic '0Km &%@b / "<_ . !;^. !;^- !;^, !;^+ !;^ ) !;^ C 1 Q2 xR2 xR2 xR2 xR2 xR2 xR2 xR2 xR2 xR2 xR2 xR2 xR2 xR2 xR2 xR2 xR2
xR2 xR2 xR2 xR2 xR2 xR2 xR2 xR2
xR2 xR2 xR2 xR2xR2xR2xR1wP/rI`ěkܾeɦ|Q˫[8̬^; ̬^<!̬^<!̬^<!̬^<! ̬^<!
̬^<!
̬^<! ̬^<! ̬^<! ̬^<! ̬^<! ̬^<! ̬^<! ̬^<! ̬^<!
̬^<! ̬^<! ) !;^( !;^' !;^& !;^ $ !;^$ !;^# !;^" !;^ !;^ !;^ !;^ ;] 7Y˫ /Pv Ȫ <`
˼] #>]z
vX9 2I[hpsuuvutrk]I3 ,6=@AABA?:2%
B ̬^<! ̬^<! ̬^<! ̬^<! ̬^<! ̬^<! ̬^<! ̬^<! ̬^<! ̬^<! ̬^<! ^<! ^<! ^<! ;! ! 1 + c d Wrong#2
c d # c d ! " U
5 5 5 5 5 5 5 , 6 6 6 6 6 8 ! U ! ! U ! 8
8q q
q
8
U
8
8q 8 U 8
UU U 8U U 8 U q U8 U Uq U q U q q q U 8 U U U U U U U U U UU UU UU UU UU UU UU UU UU UU UU U UU U UU 8 UU UU q UU UU 8 UU U UU UU UU UU UU UU UU UU UU UU UU UU UU UU UU UU UU UU UU UU UU qU UU UU UU UU UU U 8U q 8
8 " 88 # UU % 6 6 6 6 6 6 U,U 5 5 5 5 5 5 5 5U UU UU UU UU UU UU UU UU UU UU UU UU UU UU UU UU UU U U U U U U U U 1 2 V V Drop-Shadow#2
Y $ V V $ 9 V V $ 1 6; 8G
4 4 4 (.011232 &;NZ_aab3b <^|3 (O|3.Z30`21b/2b.2b-2bȯ-2bѮm\UR-R2bƛmJ4+(()(2b]5
2bὊU+
2b༉R( #%
2b༉R( $6CD7# 2b༉R(
)C\mjU6
2b༉R( +HisJ&
2b༉R( )Hm^3
&**' 2b༉R( $CjǣqA )8EPVWPD4#2b༉R( 9aضS* (;Pexu^D,2b༉R( +Rƚg9 3KfmK2b༉R(
<jկ}L' $<Yxϸq2b༉R( $K~c7
)Ccֻ2b༉R( *VӬ|L',IjҰ2b༉R( -[f;
-Koؼ2b༉R( -ZհS-,Lr˳2b༉R( )TǞoD&,Jp̻2b༉R( #J}ڹa>.2ImϹxe2b༉R( <kЬaOUoĩqZG92b༉R( -Vȧy|]C0"2b༉R( AnȲֺrQ6"2b༉R( -TػnJ.2b༉R( ;eۿoI+ 2b༉R( 'HtğtL,
2b༉R( 0Tʦ|R0
2b༉R( 8^ѮY5 2b༉R( !?fٸb; 2b༉R( &EnǞpE% 2b༉R( ,P|۸Z3 2b༉R( =iسU/ 2b༉R( :fܻb<! 2b༉R( %Gt̨Y9" 2b༉R( ;bť^?( 2b༉R( 5YǪhJ2
2b༉R( 3T}ͳvY?+
2b༉R( 2RyտkP:)2b༉R( 4Sy ̵gQ?0&2b༉R(
"8V{Űn\M2b༉S(
+A^ýŴ2b༉S)
)9Pkγ2b༉S+&2@Pfұobk2b༉T-0EZngH:AXx2b༉T. *DdܾlE*"3Np2b༉T.!-KsğtK*-Gh2b༉T-'Dmɦ|R0
'@^ͬ2b༉S+3X ˪X5!7Rqˮ2b༉S)!=c˫\9 .FcϿa2b༉S(%Chɪ]; %9Rly[=2b༉S( 'Dg\;! ,?Ses{zq`K4 2b༉R( 'A`yX9 *7AGF?4&
21.*! b ba`\RB- hG( ȿ^5 Şl= Чr@
ժuB
իuB
֬vB
튍֬vB
RRSYf֬vB
((*0A`֬vB
+M}֬vB
!Ew֬vB
Bu֬vB
Bu֬vB
Bu֬vB
H
Bu֬vB
Bu֬vB
Bu֬vB
Bu֬vB
-
Bu֬vB
J)Bu֬vB
i@ Bu֬vB
V/
Bu֬vB
f:Bu֬vB
g>Bu֬vB
xW5Bu֬vB
Q;%
Bu֬vB
,
Bu֬vB
Bu֬vB
Bu֬vB
Bu֬vB
Bu֬vB
Bu֬vB
Bu֬vB
Bu֬vB
Bu֬vB
Bu֬vB
Bu֬vB
Bu֬vB
Bu֬vB
Bu֬vB
Bu֬vB
r
Bu֬vB
Bu֬vB
Bu֬vB
Bu֬vB
@3& Cv֬vB
o\F/"Cv֬vB
dB'#Dv֬vB
tJ*#Dv֬vB
ğqE%"Cv֬vB
_7!Cv֬vB
sH&Bu֬vB
U0Bu֬vB
_9Bu֬vB
>"
Bu֬vB
#
Bu֬vB
Bu֬vB
Bu֬vB
2b༉R(#8RkiM3
! 2b༉R(,>P^ff^O=*
2b༉R( '0660'
2b༉R( 2b༉T*
2bᾍY0
2bĖgA+!-2bͧ_MEB-B2bڿ}wu-u2bƹ-2b.2b/1a0/\4 *S3 !Bi3 -H^lsuuv3v (4<@AAB3B 4 4
4?
Bu֬vB
Bu֬vB
Bu֬vB
Bu֬vB
Cv֬vB
&I{֬vB
'8X֬vB
BBCIXs֬vB
uuvz֬vB
֬vB
֬vB
իuB
ҨsA
ɡn> ɴc7 tO, v vutncO6 B BA@>7,
+ + d d Check Mark Excused
: d d : N d d : B I~ L 4N
4N
4N
4N
4N
4N
4N
4N
N6 N* N N* N N) N
N( N
N' N
N' N
N& N
N% N
N% N
N$ N
N# N
N" N
N" N
N! N
N
N
N
N
N N
N N
N N
N N
N N
N N N
N N N
N N N
N N N
N N N
N N N
N N N
N N N N N N N N N N !N N N N N N N
N N N N N N N N N N N N N N N N 4
4
4
4
4
4
4
4
6 * * )
(
'
'
&
%
%
$
#
"
"
!
!
4
4
4
4
4
4
4
4
6 * * )
(
'
'
&
%
%
$
#
"
"
!
!
4
4
4
4
4
4
4
+
6 6 6 6 6 6 6 6 6 * ) ( ' &
&
%
$
# U
" U
! 8
8 U q
8U q U U UU
U U
U 8 UU 8
qq
8 8 8
8 q q U
8
8 8 8 U N N N N N N N N N N N N N N N N
N N N N N N N N N N N N N N N NN N N
N N
N N N N N N N N N N N N N N N N N N N N N
N N
N N N N N N N N N N N N N N N N N N N N N N N
8 q q 8 U U 8
U U U U
U UU UU UU UUU UUU U UU U8 UU UU UU 8U UU UU UU UU UU U UU UU UU UU UU U
UU UU UU UU UU UU UU UU UU UU UU UU UU UU UU UU UU UU UU UU UU UU UU UU UU UU N N N N N N N N N N N N N N N NN )N (N 'N &N %N $N $N 7N 7N 7N 6N 6N 5N 5N 5N
4N
N% N& N& N( N( N* N+ N, N. N0 Na ) ( ' & % $ $ 7 7 7 6 6 5 5 5
4
% & & ( ( * + , . 0 a ) ( ' & % $ $ 7 7 7 6 6 5 5 5
4
% & & ( ( * + , . 0 a
q U U 8 8 q 8 ! # 6 6 6 6 U+U
4
4
4
4
4
4
4
4U N N N N N N N N N N N N N N N N N N N N N N N N UU UU UU UU UU UU UU UU UU UU UU UU UU UU UU UU U U U U U U U U 2 2 d d Check Mark Good
OJ d d Ob cs d d O~ W ^G ai 45
45
45
45
45
45
45
45
57 57 5+ 5 5+ 5 5* 5
5) 5
5( 5
5( 5
5' 5
5& 5
5& 5
5% 5
5$ 5
5# 5
5# 5
5" 5
5!
5
5!
5
5 5
5 5
5 5
5 5
5 5 5
5 5 5
5
5 5
5 5 5
5 5 5
5 5 5
5 5 5
5 5 5
5 5 5 5 5 5 5 5 5 5 5 55 5 5 5 5 5 5
5 5 5 5 5 5 5 5 5 5 5 5 5 5 4
4
4
4
4
4
4
4
7 7 + + *
)
(
(
'
&
&
%
$
#
#
"
!
!
4]
4]
4]
4]
4]
4]
4]
4]
]7 ]7 ]+ ] ]+ ] ]* ]
]) ]
]( ]
]( ]
]' ]
]& ]
]& ]
]% ]
]$ ]
]# ]
]# ]
]" ]
]!
]
]!
]
] ]
] ]
] ]
] ]
] ] ]
] ] ]
]
] ]
] ] ]
] ] ]
] ] ]
] ] ]
] ] ]
] ] ] ] ] ] ] ] ] ] ] ]] ] ] ] ] ] ]
] ] ] ] ] ] ] ] ] ] ] ] ] ] 4
4
4
4
4
4
4
+
6 6 6 6 6 6 6 6 6 * ) ( ' &
&
%
$
# U
" U
! 8
8 U q
8U q U U UU
U U
U 8 UU 8
qq
8 8 8
8 q q U
8
8 8 8 U 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5
5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 55 5 5
5 5
5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5
5 5
5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5
] ] ] ] ] ] ] ] ] ] ] ] ] ] ] ] ]
] ] ] ] ] ] ] ] ] ] ] ] ] ] ] ]] ] ]
] ]
] ] ] ] ] ] ] ] ] ] ] ] ] ] ] ] ] ] ] ] ]
] ]
] ] ] ] ] ] ] ] ] ] ] ] ] ] ] ] ] ] ] ] ] ] 8 q q 8 U U 8
U U U U
U UU UU UU UUU UUU U UU U8 UU UU UU 8U UU UU UU UU UU U UU UU UU UU UU U
UU UU UU UU UU UU UU UU UU UU UU UU UU UU UU UU UU UU UU UU UU UU UU UU UU UU 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 55 )5 (5 '5 &5 %5 $5 85 75 75 75 65 65 55 55 55
5$ 5% 5& 5& 5( 5( 5* 5+ 5, 5. 50 5! ) ( ' & % $ 8 7 7 7 6 6 5 5 5
$ % & & ( ( * + , . 0 ! ] ] ] ] ] ] ] ] ] ] ] ] ] ] ] ] ] ]] )] (] '] &] %] $] 8] 7] 7] 7] 6] 6] 5] 5] 5]
]$ ]% ]& ]& ]( ]( ]* ]+ ], ]. ]0 ]!
q U U 8 8 q 8 ! # 6 6 6 6 U+U
4
4
4
4
4
4
4
4U 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 ] ] ] ] ] ] ] ] ] ] ] ] ] ] ] ] ] ] ] ] ] ] ] ] UU UU UU UU UU UU UU UU UU UU UU UU UU UU UU UU U U U U U U U U 2 2 Z Z Drop-Shadow
X d' Z Z d? x Z Z d[ n ss v' 4 4 4 (.011232 &;NZ_aab3b <^|3 (O|3.Z30`21b/2b-2b+2bȯ*늍2bѮm\UR)RTW_m2bƛmJ4+((()-4BY2b]5'*Aa2bὊU+& 6V|2b༉R( % 2Rx2b༉R( $ 1Qx2b༉R( #
/Pw2b༉R( " -Mu2b༉R( ! *Jq2b༉R( )Gm2b༉R( (Fk2b༉R( 'Ej2b༉R( %Ch2b༉R( #?eǡv2b༉R( <`ͪU2b༉R( 8\Ӳ]82b༉R( 4Wٺf?!2b༉R(
0R{oF&2b༉R( ,Mv˦zO,2b༉R( (HpӱY3
2b༉R(
$Bjۻe<2b༉S()3;>:0"
<bŞqF% 2b༉S( -?QaloiYB+ 5ZΪ~Q- 2b༉S)&<TmlL.
/R}]7 2b༉T,,FdȵrL, (Isj@! 2b༉U0#.IlֽnF% "Ai˥xL) 2b༊W5/Bfعc:8_ֳY3
2b༊X96NvҮS- 0Uh> 2b༊X85LsǞnA (Ju̦xK( 2b༊W5-=^ٷX0!@iصZ3 2b༉U/!)@ḅrD$6\Úk@ 2b༉T+%>aܹ\8)2Q{Ъ|O* 2b༉S)#>bͤvQBNpۺ_6
2b༉S($BiܼpcpȠqD# 2b༉R((JtаֱU. 2b༉R( 0U˷g< 2b༉R(;eѫ{M) 2b༉R( &Jx`6
2b༉R( 4]ͥuG$
2b༉R( "Es۸Z2 2b༉R( 1ZʠoB! 2b༉R( !DsشU. 2b༉R( 1\ǜk> 2b༉R( #GwײS, 2b༉R( 5aŚi= 2b༉R( &M~Ь~P* 2b༉R( ;iҴa8 +
#,/( #4FRTG1 #2F]q}xcC%2235<H[rpJ(bbcfmzgA"rO/ ˷uQ2 Ȧ|T3 b9 ڴP) دzG! wC ꢴ֬vB
֬vB
y֬vB
ꆭ֬vB
֬vB
֬vB
֬vB
|hm֬vB
ĠyYKY֬vB
Ȧ}V<7Mz֬vB
ͬY8&*Gw֬vB
겉_:!#Dv֬vB
f?" Cv֬vB
mE&
Bu֬vB
L+ Bu֬vB
1
Bu֬vB
Bu֬vB
Bu֬vB
Bu֬vB
Bu֬vB
Bu֬vB
Bu֬vB
Bu֬vB
Bu֬vB
Bu֬vB
Bu֬vB
Bu֬vB
Bu֬vB
Bu֬vB
Bu֬vB
Bu֬vB
Bu֬vB
Bu֬vB
Bu֬vB
Bu֬vB
Bu֬vB
Bu֬vB
Bu֬vB
Bu֬vB
Bu֬vB
Bu֬vB
Bu֬vB
Bu֬vB
Bu֬vB
Bu֬vB
Bu֬vB
Bu֬vB
Bu֬vB
2b༉R( ,VγiC$ 2b༉R( DuǫfE( 2b༉R( 4aԽ^@' 2b༉R( (OɲsS7" 2b༉R(
>jgH/ 2b༉R( .QuvZ>' 2b༉R( 8Q^[J4 2b༉R( !083' 2b༉T*2bᾍY0
2bĖgA+!
2bͧ_MEBBCBB2bڿ}wu-u2bƹ-2b.2b/1a0/\4 *S3 !Bi3 -H^lsuuv3v (4<@AAB3B 4 4
4?
Bu֬vB
Bu֬vB
Bu֬vB
Bu֬vB
Bu֬vB
Bu֬vB
Bu֬vB
Bu֬vB
Cv֬vB
&I{֬vB
'8X֬vB
BCIXs֬vB
uvz֬vB
ﯵ֬vB
֬vB
իuB
ҨsA
ɡn>
ɴc7
tO,
vutncO6
BA@>7,
# - - d d Background
x d d x y+ d d x y y y 2 2
--bowersj21033499722--