Updated 2015-06-25 12:16:11 by RLE

Intro edit

Keith Vetter 2005-01-11 : Here's an implementation of the card game Crazy Eights that lets you play against three computer opponents. It can play several different variants of the basic game.

I initially added a very basic algorithm for determining the computer move, only to discover that I'm constantly losing to it. (Actually, I think it means that the game is pretty much random, and losing 3 times out of 4 seems overwhelming.)

I welcome people trying to develop better heuristics--check out the routine GetBestMove at the end of the program. I can set it up a little competition with different computer players playing different algorithms.

Program edit

 ##+##########################################################################
 #
 # Crazy Eights
 # by Keith Vetter, January 2007
 #
 
 package require Tk
 package require tile
 namespace import -force ::ttk::button
 
 # IDEAS
 #  better computer AI
 #  change rules dialog instead of menu
 #  resizeable
 #  hint
 #  game score tally
 #  saving state--rules and game tally
 
 array set RULES {
    win 500
    StartingHandSize 5
    2Draw2 1
    JSkip 1
    KReverse 1
    Draw1 0
 }
 
 array set S {title "Crazy Eights" w 700 h 550 margin 10 cs 2 cheat 0
    anim,step 1 anim,delay 1 pause 200 animate 0 tableau {-100 -75 100 105}}
 array set CLRS {table \#045a5c tableau \#c4c2c4 cantmove \#c4c2c4}
 array set GAME {next,c,w n next,c,n e next,c,e s next,c,s w
    next,cc,w s next,cc,n w next,cc,e n next,cc,s e
    s Spades h Hearts d Diamonds c Clubs
    a Ace t 10 j Jack q Queen k King ? ""
 }
 
 proc DoDisplay {} {
    global S CLRS
 
    wm title . $S(title)
    wm resizable . 0 0
    DoMenus
    pack [frame .screen -bd 2 -relief raised] -side top -fill both -expand 1
 
    set h2 [expr {$S(h)/2}]; set w2 [expr {$S(w)/2}]
    canvas .c -bd 0 -height $S(h) -width $S(w) -highlightthickness 0 \
        -scrollregion [list -$w2 -$h2 $w2 $h2] -bg $CLRS(table)
    label .msg -textvariable S(msg) -bd 2 -bg white -relief ridge
    pack .msg -in .screen -side bottom -fill both
    pack .c   -in .screen -side top    -fill both -expand 1
 
    bind all <Key-F1> Help
    bind all <Key-F3> {console show}
    update
    PickNames
    PositionCards
 }
 ##+##########################################################################
 #
 # DoMenus -- sets up our menus
 #
 proc DoMenus {} {
    . configure -menu [menu .m -tearoff 0]
    .m add cascade -menu [menu .m.game  -tearoff 0] -label "Game" -underline 0
    .m add cascade -menu [menu .m.rules  -tearoff 0] -label "Rules" -underline 0
    .m add cascade -menu [menu .m.help  -tearoff 0] -label "Help" -underline 0
 
    .m.game add command -label "New Game" -under 0 -command NewGameCmd
    .m.game add command -label "History" -under 0 -command ShowHistory
    .m.game add separator
    .m.game add checkbutton -label "Cheat" -under 0 \
        -variable ::S(cheat) -command Cheat
    .m.game add separator
    .m.game add command -label "Exit" -under 1 -command exit
 
    .m.rules add checkbutton -label "Jack => Skip" \
        -variable ::RULES(JSkip)
    .m.rules add checkbutton -label "King => Reverse" \
        -variable ::RULES(KReverse)
    .m.rules add checkbutton -label "2 => Draw Two" \
        -variable ::RULES(2Draw2)
    .m.rules add checkbutton -label "One Draw Limit" \
        -variable ::RULES(Draw1)
 
    .m.help add command -label Help -under 0 -command Help \
        -accelerator "F1"
    .m.help add command -label About -under 0 -command About
 
 }
 proc PickNames {} {
    global GAME tcl_platform
 
    set names [Shuffle {Abigail Andrew Anthony Ashley Ava Barbara Brenda Brian
        Charles Christopher Cynthia Daniel David Deborah Debra Donna Elizabeth
        Emily Emma Erin Ethan Hannah Isabella Jacob James Jeffrey John Joseph
        Joshua Karen Keith Kenneth Kevin Kimberly Kristina Linda Lisa Lori
        Madison Marissa Mark Mary Matthew Michael Nancy Olivia Pamela Patricia
        Paul Richard Robert Samantha Sandra Scott Sharon Steven Susan Tessa
        Thomas Timothy Valerie William}]
    if {[info exists tcl_platform(user)]} {
        set n [lsearch $names $tcl_platform(user)]
        set names [concat $tcl_platform(user) [lreplace $names $n $n]]
    }
    foreach {GAME(name,s) GAME(name,w) GAME(name,n) GAME(name,e)} $names break
 }
 proc PositionCards {} {
    global S GAME CLRS
 
    set S(cards) [list 8s 8d 8c 8h]
    foreach suit {s h c d} {
        foreach v {k q j t 9 7 6 5 4 3 2 a} {
            lappend S(cards) "$v$suit"
        }
    }
    set img [Card2Image b 0]
    set S(cw) [image width $img]
    set S(ch) [image height $img]
 
    .c delete all
    set n [.c create rect $S(tableau) -fill $CLRS(tableau) -fill black -width 0]
    .c move $n 10 10
    .c create rect $S(tableau) -fill $CLRS(tableau) -outline black -width 0
    set y [expr {($S(ch)/2 + [lindex $S(tableau) end]) / 2}]
    .c create image 0 $y -image ::img::h -anchor c -tag suit
 
    # Player names
    set x [expr {$S(w) / 4}]
    set y [expr {$S(h) / 4}]
    .c create text 0 $y -text "$GAME(name,s) - 0" -fill white \
        -font {Times 12 bold} -tag txt,s
    .c create text 0 -$y -text "$GAME(name,n) - 0" -fill white \
        -font {Times 12 bold} -tag txt,n
    .c create text -$x 0 -text "$GAME(name,w)\n0" -fill white \
        -font {Times 12 bold} -tag txt,w -justify c
    .c create text $x 0 -text "$GAME(name,e)\n0" -fill white \
        -font {Times 12 bold} -tag txt,e -justify c
 
    # Position discard and stock
    set x [expr {($S(cw) + $S(cs)) / -2.0}]
    .c create image $x 0 -anchor c -tag discard
    set x [expr {round($x + $S(cw) + $S(cs))}]
    foreach i {3 2 1} {
        set xx [expr {$x + $i * 2}]
        .c create image $xx 0 -anchor c -tag stock$i
    }
    .c create image $x 0 -anchor c -tag [list stock stock0]
    .c bind stock <Button-1> [list UserMove stock]
    .c bind stock <Button-3> [list UserMove xstock]
 }
 ##+##########################################################################
 #
 # Card2Image -- returns the image name for a card--the back of the card
 # if the card should not be revealed.
 #
 proc Card2Image {card reveal} {
    if {$card == ""} {return {}}                ;# No card -- show nothing
    if {! $reveal} { set card "back" }          ;# Hidden card -- show back
    set iname "::img::$card"
    return $iname
 }
 proc Card2Name {card} {
    if {$card eq "cant"} { return "-"}
    foreach {value suit} [split $card ""] break
    if {[info exists ::GAME($value)]} {set value $::GAME($value)}
    return "$value of $::GAME($suit)"
 }
 proc NewGame {} {
    global ROUND GAME S
 
    destroy .top
 
    array set GAME {
        total,s 0 total,w 0 total,n 0 total,e 0
        score,s 0 score,w 0 score,n 0 score,e 0
        held,s 0 held,w 0 held,n 0 held,e 0
        leader s
    }
    .c itemconfig txt,s -text "$GAME(name,s) - $GAME(total,s)"
    .c itemconfig txt,n -text "$GAME(name,n) - $GAME(total,n)"
    .c itemconfig txt,e -text "$GAME(name,e)\n$GAME(total,e)"
    .c itemconfig txt,w -text "$GAME(name,w)\n$GAME(total,w)"
 
    ClearMessage n e w s
    StartRound s
    MoveNext
    return 1
 }
 proc NewGameCmd {} {
    # We have an "update is evil" problem. To avoid it, we only allow
    # new game to be done during the user's turn.
 
    if {$::ROUND(turn) eq "over"} {
        NewGame
        return
    }
 
    if {$::ROUND(turn) ne "s"} return
    #set n [tk_messageBox -message "Start new game?" -type yesno -icon question]
    set n [YesNo "Start new game?"]
 
    if {$n eq "no"} {                           ;# Continue existing game
        if {$::ROUND(turn) ne "s"} MoveNext
        return
    }
    NewGame
 }
 proc MenuUpdate {} {
    set state [expr {$::ROUND(turn) eq "s" ? "normal" : "disabled"}]
    if {$::ROUND(turn) eq "over"} { set state normal }
    .m.game entryconfig 0 -state $state
    .m.rules entryconfig 0 -state $state
    .m.rules entryconfig 1 -state $state
    .m.rules entryconfig 2 -state $state
    .m.rules entryconfig 3 -state $state
 }
 proc StartRound {lastDealer} {
    global ROUND CARDS S
 
    unset -nocomplain ROUND
    set ROUND(turn) $lastDealer
    set ROUND(dir) c
    set ROUND(dealer) $lastDealer
    ClearHistory
 
    Deal
    ShowCards
    MenuUpdate
    foreach {ROUND(value) ROUND(suit)} [split $CARDS(discard) ""] break
    .c itemconfig suit -image ::img::$ROUND(suit)
 }
 proc Shuffle {what} {
    global S CARDS
 
    set len [llength $what]
    set len2 $len
    for {set i 0} {$i < $len-1} {incr i} {
        set n [expr {int($i + $len2 * rand())}]
        incr len2 -1
 
        # Swap elements at i & n
        set temp [lindex $what $i]
        lset what $i [lindex $what $n]
        lset what $n $temp
    }
    return $what
 }
 ##+##########################################################################
 #
 # DealACard -- pops the next card off the deck
 #
 proc DealACard {} {
    global CARDS
    set card [lindex $CARDS(deck) 0]
    set CARDS(deck) [lrange $CARDS(deck) 1 end]
 
    return $card
 }
 proc Deal {} {
    global CARDS RULES
 
    unset -nocomplain CARDS
    set CARDS(deck) [Shuffle $::S(cards)]
 
    for {set i 0} {$i < $RULES(StartingHandSize)} {incr i} {
        foreach who {n e s w} {
            lappend CARDS($who) [DealACard]
        }
    }
    foreach who {w n e s} {
        SortHand $who
    }
    set CARDS(discard) [DealACard]
 }
 proc SortHand {who} {
    set ::CARDS($who) [lsort -command SortHandCmd $::CARDS($who)]
 }
 proc SortHandCmd {c1 c2} {
    set p1 [lsearch $::S(cards) $c1]
    set p2 [lsearch $::S(cards) $c2]
    return [expr {$p1 - $p2}]
 }
 proc ShowCards {{reveal 0}} {
    ShowOneHand s 1                             ;# Always reveal south's hand
    ShowOneHand n $reveal
    ShowOneHand w $reveal
    ShowOneHand e $reveal
    ShowStock
    if {$reveal > 1} {                          ;# Cheat
        .c itemconfig stock -image [Card2Image [lindex $::CARDS(deck) 0] 1]
    }
 }
 proc Cheat {} {
    ShowCards
    set ::S(msg) $::CARDS(deck)
    if {$::ROUND(turn) eq "s"} {
        ShowLegalMoves s
    }
 }
 proc ShowOneHand {who reveal} {
    if {$::S(cheat)} { set reveal 1 }
    if {$who eq "s" || $who eq "n"} {
        ShowHandHorizontal $who $reveal
    } else {
        ShowHandVertical $who $reveal
    }
 }
 proc ShowHandHorizontal {who reveal} {
    global S CARDS
 
    .c delete hand,$who
    set w2 [expr {[winfo width .c] / 2}]
    set left [expr {-$w2 + 2*$S(margin) + $S(cw) + $S(cw)/2}]
    set right [expr {-$left}]
    set y [expr {([winfo height .c]/2 - $S(margin) - $S(ch)/2) * ($who eq "s" ? 1 : -1)}]
    set maxDelta [expr {$S(cw) + $S(cs)}]
 
    set num1 [expr {[llength $CARDS($who)]-1}]
    set total [expr {$right - $left}]
    set need [expr {$S(cw) + $num1 * $maxDelta}]
    set excess [expr {$need - $total}]
    set delta $maxDelta
    if {$excess > 0} {                          ;# Need to overlap
        set delta [expr {($total - $S(cw)) / double($num1)}]
    }
 
    set left [expr {$left + $S(cw)/2}]          ;# For center anchor
    foreach card $CARDS($who) {
        set img [Card2Image $card $reveal]
        .c create image $left $y -anchor c -image $img \
            -tag [list hand,$who hand,$card]
        if {$who eq "s"} {
            .c bind hand,$card <Button-1> [list UserMove $card]
        }
        set left [expr {$left + $delta}]
    }
 }
 proc ShowHandVertical {who reveal} {
    global S CARDS
 
    .c delete hand,$who
 
    set h2 [expr {[winfo height .c] / 2}]
    set top [expr {-$h2 + $S(margin)}]
    set bottom [expr {$h2 - 2*$S(margin) - $S(ch) + $S(ch)/2}]
    set x [expr {([winfo width .c]/2 - $S(margin) - $S(cw)/2) * ($who eq "e" ? 1 : -1)}]
    set maxDelta [expr {$S(ch) + $S(cs)}]
 
    set num1 [expr {[llength $CARDS($who)]-1}]
    set total [expr {$bottom - $top}]
    set need [expr {$S(ch) + $num1 * $maxDelta}]
    set excess [expr {$need - $total}]
    set delta $maxDelta
    if {$excess > 0} {                          ;# Need to overlap
        set delta [expr {($total - $S(ch)) / double($num1)}]
    }
 
    set top [expr {$top + $S(ch)/2}]            ;# For center anchor
    foreach card $CARDS($who) {
        set img [Card2Image $card $reveal]
        .c create image $x $top -anchor c -image $img \
            -tag [list hand,$who hand,$card]
        set top [expr {$top + $delta}]
    }
 }
 proc ShowStock {} {
    array set TAGS {0 stock 1 stock1 2 stock2 3 stock3}
 
    .c itemconfig discard -image [Card2Image [lindex $::CARDS(discard) end] 1]
    set img [Card2Image back 0]
    set len [llength $::CARDS(deck)]
    foreach i {0 1 2 3} {
        set img [expr {$len > $i ? $img : ""}]
        .c itemconfig $TAGS($i) -image $img
    }
 }
 proc Draw {who} {
    set newCard [DealACard]
    if {$newCard eq {}} {return $newCard}
 
    foreach card $::CARDS($who) {               ;# Find card position
        if {[SortHandCmd $newCard $card] <= 0} break
    }
    AnimateCard stock hand,$card back
 
    lappend ::CARDS($who) $newCard
    SortHand $who
    ShowOneHand $who [expr {$who eq "s"}]
    if {$who eq "s"} {
        ShowLegalMoves s
    }
 
    return $newCard
 }
 proc Discard {who card {newSuit "?"}} {
    global CARDS ROUND
 
    lappend CARDS(discard) $card
    foreach {ROUND(value) ROUND(suit)} [split $card ""] break
    if {$newSuit ne "?"} {set ROUND(suit) $newSuit}
    .c itemconfig suit -image ::img::$ROUND(suit)
 
    set which [lsearch $CARDS($who) $card]
    set CARDS($who) [lreplace $CARDS($who) $which $which]
 
    ShowOneHand $who [string match s $who]
    ShowStock
 }
 proc ShowLegalMoves {who} {
    array set dxy {s {0 -10} n {0 10} w {10 0} e {-10 0}}
    foreach {all suits values eights} [GetLegalMoves $who] break
 
    foreach {dx dy} $dxy($who) break
    foreach card $all {
        .c move hand,$card $dx $dy
    }
    return [llength $all]
 }
 proc IsEndRound {} {
    global CARDS ROUND
 
    if {$CARDS($ROUND(turn)) eq {}} { return 1 }
    if {$CARDS(deck) ne {}} { return 0}
    foreach i {0 1 2 3} {
        if {[lindex $ROUND(moves) end-$i 1] ne "cant"} { return 0 }
    }
    return 1
 }
 
 proc MoveNext {} {
    global ROUND CARDS GAME S RULES
 
    set value [string index [lindex $ROUND(moves) end 1] 0] ;# Last card played
    if {$RULES(2Draw2) && $value eq "2"} {      ;# 2 => draw 2
        set next $GAME(next,$ROUND(dir),$ROUND(turn))
        PlayerMessage $next draw2
        Draw $next
        Draw $next
    }
 
    if {[IsEndRound]} {
        set winner [ScoreHands]
        set S(msg) "$GAME(name,$winner) won this round"
        set ROUND(turn) over
        ClearMessage n e w s
        ShowCards 1
        ShowScore
 
        # Check for victory
        if {$GAME(total,$GAME(leader)) >= $RULES(win)} {
            Winner $GAME(leader)
            set n [YesNo "Play again?"]
            if {$n eq "yes"} {
                NewGame
            } else {
                MenuUpdate
            }
            return
        }
        StartRound $GAME(next,$ROUND(dir),$ROUND(dealer))
    }
 
 
    # Special card check
    if {$RULES(KReverse) && $value eq "k"} {    ;# K => reverse
        PlayerMessage $ROUND(turn) reverse
        set ROUND(dir) [expr {$ROUND(dir) eq "c" ? "cc" : "c"}]
    }
 
    set ROUND(turn) $GAME(next,$ROUND(dir),$ROUND(turn))
 
    if {$RULES(JSkip) && $value eq "j"} {       ;# J => skip
        PlayerMessage $ROUND(turn) skip
        set ROUND(turn) $GAME(next,$ROUND(dir),$ROUND(turn))
    }
 
    MenuUpdate
    set S(msg) "$GAME(name,$ROUND(turn))'s turn"
    if {$ROUND(turn) ne "s"} {
        after $S(pause) ComputerMove
    } else {
        set ROUND(drawn) 0
        ClearMessage $ROUND(turn)
 
        # See if the user can move or draw
        if {[ShowLegalMoves $ROUND(turn)]} return
        if {$CARDS(deck) ne ""} return
        AddHistory s cant 0 ?
        MustPass
        MoveNext
    }
 }
 ##+##########################################################################
 #
 # UserMove -- handles the user's turn
 #
 proc UserMove {which} {
    global ROUND S CARDS RULES
 
    if {$ROUND(turn) != "s"} return             ;# Not our turn
    if {$S(animate)} return                     ;# In the middle of animation
 
    if {$which eq "xstock"} {                   ;# Draw only if user has no move
        foreach {all . . . .} [GetLegalMoves s] break
        if {$all ne {}} return
        set which "stock"
    }
 
    if {$which eq "stock"} {
        if {$RULES(Draw1) && $ROUND(drawn) > 0} return
 
        set newCard [Draw s]
        if {$newCard eq {}} return              ;# Empty deck -- can't happen
        incr ROUND(drawn)
 
        foreach {all suits values eights} [GetLegalMoves s] break
        if {$all ne {}} return                  ;# Has a legal move
        if {$RULES(Draw1) || [llength $CARDS(deck)] == 0} {
            PlayerMessage s cantmove
            AddHistory s cant $ROUND(drawn) ?
            MoveNext
        }
        return
    }
 
    foreach {all suits values eights} [GetLegalMoves s] break
    if {[lsearch $all $which] == -1} return     ;# Not legal move
    set newSuit "?"
    if {[string match 8* $which] && [llength $CARDS(s)] > 1} { ;# 8 needs suit
        set newSuit [PickSuit]
        if {$newSuit eq "x"} return
    }
    AddHistory s $which $ROUND(drawn) $newSuit
    AnimateCard hand,$which discard $which
    Discard $ROUND(turn) $which $newSuit
    MoveNext
 }
 proc ComputerMove {} {
    global ROUND
 
    if {$ROUND(turn) eq "s"} {
        puts "BAD TURN"
        StackTrace
        return
    }
 
    ClearMessage $ROUND(turn)
    foreach {move draws newSuit} [GetBestMove $ROUND(turn)] break
    AddHistory $ROUND(turn) $move $draws $newSuit
    if {$move ne "cant"} {                      ;# Did a move
        AnimateCard hand,$move discard $move
        Discard $ROUND(turn) $move $newSuit
    } else {
        PlayerMessage $ROUND(turn) cantmove
    }
    MoveNext
 }
 
 
 proc AnimateCard {from to card} {
    global S CARDS
 
    set S(animate) 1                            ;# We're animating
    foreach {x0 y0} [.c coords $from] break
    foreach {x1 y1} [.c coords $to] break
 
    set dx [expr {$x1 - $x0}]
    set dy [expr {$y1 - $y0}]
    set dist [expr {hypot($dx,$dy)}]
    set dx [expr {$S(anim,step) * $dx / $dist}]
    set dy [expr {$S(anim,step) * $dy / $dist}]
 
    .c create image $x0 $y0 -tag animate -image [Card2Image $card 1]
    if {$from ne "stock"} { .c delete $from }
    if {$from eq "stock"} { .c itemconfig stock[llength $CARDS(deck)] -image {}}
 
    set steps [expr {int($dist / $S(anim,step))}]
    _AnimateCard $dx $dy $steps
    tkwait variable S(animate)
    return
 }
 
 proc _AnimateCard {dx dy steps} {
    if {$steps == 0 || ! $::S(animate)} {
        .c delete animate
        set ::S(animate) 0
        return
    }
    .c move animate $dx $dy
    after $::S(anim,delay) _AnimateCard $dx $dy [incr steps -1]
 }
 proc GetLegalMoves {who} {
    global ROUND CARDS
 
    set suits {}
    set values {}
    set eights {}
    foreach card $CARDS($who) {
        foreach {value suit} [split $card ""] break
        if {$value == 8} { lappend eights $card; continue }
        if {$value == $ROUND(value)} { lappend values $card }
        if {$suit eq $ROUND(suit)} { lappend suits $card }
    }
    set all [concat $suits $values $eights]
    return [list $all $suits $values $eights]
 }
 ##+##########################################################################
 #
 # SuitTally - return sorted list of the points for each suit (sans 8)
 #
 proc SuitTally {who} {
    global CARDS
 
    foreach suit {s h d c} {
        set which($suit) {}
    }
    foreach card $CARDS($who) {
        foreach {value suit} [split $card ""] break
        if {$value == 8} continue
        lappend which($suit) $card
    }
    set all {}
    foreach suit {s h d c} {
        set len [format %02d [llength $which($suit)]] ;# To break ties
        lappend all [list $suit "[ScoreOneHand $which($suit)].$len"]
    }
    set all [lsort -decreasing -index 1 -real $all]
 
    return $all
 }
 ##+##########################################################################
 #
 # SortHandByScore -- returns hand sorted with highest scoring cards first
 #
 proc SortHandByScore {hand} {
    set l {}
    set l2 {}
    foreach card $hand {
        lappend l [list $card [ScoreOneHand $card]]
    }
    set l [lsort -decreasing -index 1 -integer $l]
    foreach a $l {
        lappend l2 [lindex $a 0]
    }
    return $l2
 }
 proc PlayerMessage {who type {debug 0}} {
    array set dxy {n {0 35} s {0 0} e {15 65} w {-10 65}}
    array set msgs {cantmove "%w\ncan't move" skip "Skipping\n%w"
        reverse "%w\nreverses" draw2 "%w\ndraws 2"}
    regsub -all {%w} $msgs($type) $::GAME(name,$who) txt
    if {$who eq "s" || $who eq "n"} {set txt [string map {\n " "} $txt]}
 
    ClearMessage $who
    foreach {x y} [.c coords txt,$who] break
    foreach {dx dy} $dxy($who) break
    set x [expr {$x + $dx}]
    set y [expr {$y + $dy}]
 
    label .c.$who -text $txt -font {Times 18 bold} -bd 2 -relief raised -padx 5
    .c create window $x $y -window .c.$who -tag .c.$who
 
    if {! $debug} {
        after 3000 ClearMessage $who
    }
 }
 proc ClearMessage {args} {
    foreach who $args { destroy .c.$who ; .c delete .c.$who }
 }
 
 proc ShowScore {} {
    .c itemconfig txt,s -text "$::GAME(name,s) - $::GAME(total,s)"
    .c itemconfig txt,n -text "$::GAME(name,n) - $::GAME(total,n)"
    .c itemconfig txt,e -text "$::GAME(name,e)\n$::GAME(total,e)"
    .c itemconfig txt,w -text "$::GAME(name,w)\n$::GAME(total,w)"
 
    set W .top
    destroy $W
 
    set font {Times 12 bold}
    set leaders [FindLeader]
 
    toplevel $W -padx 15
    wm withdraw $W
    wm title $W "$::S(title) Score"
    wm attributes $W -toolwindow 1
    wm transient $W .
    wm resizable $W 0 0
 
    label $W.title -text "$::S(title) Score" -font {Times 24 bold} -fg red ;#-bg $bg
 
    label $W.c1 -text "Held in hand" -font $font
    label $W.c2 -text "Score" -font $font
    label $W.c3 -text "Total" -font $font
    grid $W.title - - - -pady 5 -padx 15
    catch {grid [::ttk::separator $W.sep] - - - -pady 5 -sticky ew}
    grid x $W.c1 $W.c2 $W.c3
    foreach who {s w n e} {
        set fg [expr {$::GAME(score,$who) > 0 ? "blue" : "black"}]
        if {[lsearch $leaders $who] > -1} {set fg "red"}
        set winner [expr {$::GAME(total,$who) > $::RULES(win)}]
        foreach what {name held score total} {
            set txt $::GAME($what,$who)
            if {$what ne "total" && $txt == 0} { set txt "" }
            label $W.$what,$who -text $txt -font $font -fg $fg -bd 0
            if {$winner} {
                $W.$what,$who config -fg blue -bg magenta
            }
        }
        $W.name,$who config -anchor w
        grid $W.name,$who $W.held,$who $W.score,$who $W.total,$who -sticky ew
    }
    button $W.ok -text OK -command [list destroy $W]
    bind $W <space> [list $W.ok invoke]
 
    grid $W.ok - - - -pady 15
    CenterWindow $W
    wm deiconify $W
    grab $W
    tkwait window $W
 }
 proc FindLeader {} {
    global GAME
 
    set leader {}
    set best 0
    foreach who {n e w s} {
        if {$GAME(total,$who) < $best} continue
        if {$GAME(total,$who) > $best} { set leader {} }
        lappend leader $who
        set best $GAME(total,$who)
    }
    return $leader
 }
 proc PickSuit {} {
    set W .top
    destroy $W
 
    #set bg $::CLRS(tableau)
    set ::ROUND(newSuit) "x"
 
    toplevel $W -padx 15 ;#-bg $bg
    wm withdraw $W
    wm title $W "Choose Suit"
    wm attributes $W -toolwindow 1
    wm transient $W .
    wm resizable $W 0 0
 
    label $W.title -text "Choose Suit" -font {Times 24 bold} -fg red ;#-bg $bg
    foreach suit {h d c s} {
        label $W.a$suit -image ::img::a$suit ;#-bg $bg
        bind $W.a$suit <1> "set ::ROUND(newSuit) $suit ; destroy $W"
    }
 
    grid $W.title - -pady 5 -padx 15
    catch {grid [::ttk::separator $W.sep] - -pady 5 -sticky ew}
    grid $W.ah $W.ad -padx 5 -pady 10
    grid $W.ac $W.as -padx 5 -pady 10
 
    button $W.cancel -text Cancel -command [list destroy $W]
    bind $W <space> [list $W.cancel invoke]
    bind $W <Escape> [list $W.cancel invoke]
 
    grid $W.cancel - -pady 15
    CenterWindow $W
    wm deiconify $W
    grab $W
    tkwait window $W
    return $::ROUND(newSuit)
 }
 proc Winner {who} {
    set W .top
    destroy $W
 
    set ::ROUND(newSuit) "x"
 
    toplevel $W
    wm withdraw $W
    wm title $W "Winner"
    wm transient $W .
    wm resizable $W 0 0
 
    set txt "$::GAME(name,$who) Wins!"
    label $W.title -text $txt -font {Times 24 bold} -fg red
    button $W.ok -text "OK" -command [list destroy $W]
    bind $W <space> [list $W.ok invoke]
 
    grid $W.title -pady 15 -padx 15
    grid $W.ok -pady {0 15}
    CenterWindow $W
    wm deiconify $W
    #grab $W
    tkwait window $W
    return
 }
 proc MustPass {} {
    set W .top
    destroy $W
 
    #set bg $::CLRS(tableau)
 
    toplevel $W ;#-bg $bg
    wm withdraw $W
    wm title $W "Pass"
    wm attributes $W -toolwindow 1
    wm transient $W .
    wm resizable $W 0 0
 
    set txt "You must pass"
    label $W.title -text $txt -font {Times 24 bold} -fg red ;#-bg $bg
    button $W.ok -text "OK" -command [list destroy $W]
    bind $W <space> [list $W.ok invoke]
 
    grid $W.title -pady 10 -padx 15
    grid $W.ok -pady {0 15}
    CenterWindow $W
    wm deiconify $W
    grab $W
    tkwait window $W
    return
 }
 proc YesNo {msg} {
    set W .top
    destroy $W
 
    #set bg $::CLRS(tableau)
    set ::S(yesno) yes
 
    toplevel $W ;#-bg $bg
    wm withdraw $W
    wm title $W " "
    #wm attributes $W -toolwindow 1
    wm transient $W .
    wm resizable $W 0 0
 
    label $W.icon -image ::img::quest ;#-bg $bg
    label $W.title -text $msg -font {Helvetica 12} ;#-bg $bg
    frame $W.buttons ;#-bg $bg
    button $W.yes -text "Yes" -command "set ::S(yesno) yes; destroy $W"
    button $W.no -text "No" -command "set ::S(yesno) no; destroy $W"
    bind $W <space> [list $W.yes invoke]
    bind $W <y> [list $W.yes invoke]
    bind $W <n> [list $W.no invoke]
    bind $W <Escape> [list $W.no invoke]
 
    grid $W.icon $W.title -pady 10 -padx 5 -sticky w
    grid $W.buttons -
    grid $W.yes $W.no -pady {10 15} -padx 5 -in $W.buttons
    grid columnconfigure $W 1 -weight 1
    CenterWindow $W
    wm deiconify $W
    grab $W
    tkwait window $W
    return $::S(yesno)
 }
 
 
 proc CenterWindow {w {W .}} {
    update idletasks                            ;# Need to get geometry correct
    set wh [winfo reqheight $w]        ; set ww [winfo reqwidth $w]
    set sw [winfo width $W]            ; set sh [winfo height $W]
    set sy [winfo y $W]                ; set sx [winfo x $W]
    set x [expr {$sx + ($sw - $ww)/2}] ; set y [expr {$sy + ($sh - $wh)/2}]
 
    incr y -130
    if {$x < 0} { set x 0 }            ; if {$y < 0} {set y 0}
 
    wm geometry $w +$x+$y
 }
 
 proc ScoreHands {} {
    global CARDS GAME
 
    set winner {}
    set best 99999
    set sum 0
    foreach who {s w n e} {
        set GAME(score,$who) 0
        set GAME(held,$who) [ScoreOneHand $CARDS($who)]
        incr sum $GAME(held,$who)
        if {$GAME(held,$who) < $best} {
            set winner $who
            set best $GAME(held,$who)
        }
    }
 
    incr sum -$GAME(held,$winner)               ;# Possibly non-zero
    set GAME(score,$winner) $sum
    incr GAME(total,$winner) $sum
    if {$GAME(total,$winner) > $GAME(total,$GAME(leader))} {
        set GAME(leader) $winner
    }
    return $winner
 }
 proc ScoreOneHand {cards} {
    global RULES
 
    set total 0
    foreach card $cards {
        foreach {value suit} [split $card ""] break
        switch -- $value {
            a { incr total 1 }
            2 { incr total [expr {$RULES(2Draw2) ? 25 : 2}] }
            8 { incr total 50 }
            t { incr total 10 }
            j { incr total [expr {$RULES(JSkip) ? 25 : 10}] }
            q { incr total 10 }
            k { incr total [expr {$RULES(KReverse) ? 25 : 10}] }
            default { incr total $value }
        }
    }
    return $total
 }
 ##+##########################################################################
 #
 # Help -- a simple help screen
 #
 proc Help {} {
    catch {destroy .help}
    toplevel .help
    wm title .help "$::S(title) Help"
    wm transient .help .
 
    set t .help.t
    text $t -relief raised -wrap word -width 70 -height 29 \
        -padx 10 -pady 10 -cursor {} -yscrollcommand {.help.sb set}
    scrollbar .help.sb -orient vertical -command [list $t yview]
    button .help.dismiss -text Dismiss -command {destroy .help}
    pack .help.dismiss -side bottom -pady 10
    pack .help.sb -side right -fill y
    pack $t -side top -expand 1 -fill both
 
    set bold "[font actual [$t cget -font]] -weight bold"
    set italic "[font actual [$t cget -font]] -slant italic"
    $t tag config title -justify center -foregr red -font "Times 20 bold"
    $t tag configure title2 -justify center -font "Times 12 bold"
    $t tag configure header -font $bold -spacing3 5
    $t tag configure bold -font $bold
    $t tag configure italic -font $italic
    $t tag configure n -lmargin1 10 -lmargin2 10
    $t tag configure bullet -lmargin1 20 -lmargin2 35 -tabs 35
 
    $t insert end "$::S(title)\n" title "by Keith Vetter\n\n" title2
 
    set txt "$::S(title) is a card game for two or more players. "
    append txt "The object is to get rid of all your cards to the "
    append txt "discard pile by matching the suit or rank of the "
    append txt "previous discard.\n\n"
    $t insert end "Introduction\n" header $txt
 
    set txt "There are a huge number of variations of this game, with "
    append txt "almost as many different names, such as Crates, Switch, "
    append txt "Swedish Rummy, Last One, Mau-Mau, Tschausepp or  Pesten. "
    append txt "Uno is a specialized version of this game.\n\n"
    $t insert end $txt
 
    set txt "Starting with the player to dealer's left, and continuing "
    append txt "clockwise, each player in turn must either play a legal card "
    append txt "face up on top of the discard pile, or draw a card from the "
    append txt "undealt stock. Legal plays are:\n\n"
    $t insert end "Basic Game\n" header $txt
 
    set txt "if the top card of the discard pile is not an eight, you may play "
    append txt "any card which matches the rank or suit of the previous card "
    append txt "(for example if the top card was the jack of spades you could "
    append txt "play any jack or any spade)\n"
    $t insert end \u25cf\t$txt bullet
    set txt "an eight may be played on any card, and the player of the eight "
    append txt "must nominate a suit, which must be played next\n"
    $t insert end \u25cf\t$txt bullet
    set txt "if an eight is on top of the pile, you may play any card of the "
    append txt "suit nominated by the person who played the eight\n"
    $t insert end \u25cf\t$txt bullet
    $t insert end \n
 
    set txt "This program implements a few of the more common variations "
    append txt "of the game.\n"
    $t insert end "Variations\n" header $txt
    set txt "Only draw once if you cannot play\n"
    $t insert end \u25cf\t$txt bullet
    set txt "Jack played skips next player's turn\n"
    $t insert end \u25cf\t$txt bullet
    set txt "King changes direction\n"
    $t insert end \u25cf\t$txt bullet
    set txt "Two makes next player draw two cards\n\n"
    $t insert end \u25cf\t$txt bullet
 
    set txt "Use the right button to draw a card because it will not "
    append txt "draw if you already have a card you can play.\n"
    $t insert end "Inside Information\n" header $txt
 
    $t config -state disabled
 }
 proc About {} {
    set txt "$::S(title)\n\nby Keith Vetter\nJanuary 2007"
    tk_messageBox -icon info -message $txt -title "About $::S(title)"
 }
 
 proc ShowHistory {} {
    if {[winfo exists .history]} return
 
    toplevel .history
    wm title .history "$::S(title) History"
    wm transient .history .
 
    set t .history.t
    text $t -relief raised -wrap word -width 50 -height 29 \
        -padx 10 -pady 10 -cursor {} -yscrollcommand {.history.sb set}
    scrollbar .history.sb -orient vertical -command [list $t yview]
    button .history.dismiss -text Dismiss -command {destroy .history}
    pack .history.dismiss -side bottom -pady 10
    pack .history.sb -side right -fill y
    pack $t -side top -expand 1 -fill both
 
    set bold "[font actual [$t cget -font]] -weight bold"
    set tabs {1.1i center 2i center 2.5i center}
    set tabs2 {.75i left 2i center 2.5i center}
    $t tag configure colHeader -font $bold -underline 1 -tabs $tabs
    $t tag configure data -tabs $tabs2
 
    $t delete 0.0 end
    $t insert end "Player\tCard Played\tNext Suit\tDraws\n" colHeader
 
    foreach move $::ROUND(moves) {
        foreach {who card draws suit} $move break
        set name $::GAME(name,$who)
        if {$draws == 0} {set draws ""}
        set card [Card2Name $card]
        set suit $::GAME($suit)
 
        $t insert end "$name\t$card\t$suit\t$draws\n" data
    }
    $t see end
    $t config -state disabled
 
    set x [expr {[winfo x .]+[winfo width .]+10}]
    if {$x < [winfo screenwidth .] - 100} {
        wm geom .history "+$x+[winfo y .]"
    }
 }
 
 proc AddHistory {who card draws suit} {
    lappend ::ROUND(moves) [list $who $card $draws $suit]
    set t .history.t
 
    if {! [winfo exists $t]} return
 
    set name $::GAME(name,$who)
    if {$draws == 0} {set draws ""}
    set card [Card2Name $card]
    set suit $::GAME($suit)
 
    $t config -state normal
    $t insert end "$name\t$card\t$suit\t$draws\n" data
    $t see end
    $t config -state disabled
 }
 proc ClearHistory {} {
    set ::ROUND(moves) {}
    set t .history.t
    if {! [winfo exists $t]} return
    $t config -state normal
    $t delete 0.0 end
    $t insert end "Player\tCard Played\tNext Suit\tDraws\n" colHeader
    $t config -state disabled
 }
 ################################################################
 # Card images from Patience card game, see
 #   http://uebb.cs.tu-berlin.de/~krischan/patience/patience-english.html
 #   http://www.tcl.tk/starkits/patience.kit
 
 namespace eval ::img {}
 image create photo ::img::2c -format gif -data {
    R0lGODlhRwBgALMAANnZ2QAAAP///////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
    AAAAACH5BAEAAAAALAAAAABHAGAAAwT/EEgZqr046817niBQCWRpnmiqrixahUErz3QdTHGt7/wt
    lhiecEi65QQaolI3Kh6byygLeqJKryar84jtIrlbr/hb1QotY2fW3LukoWjyMCmGP8HMzNgenOvr
    d31+cYBeaIdsRIlnHnhKWoQ2jYs7VoI0k5R5ZZEzmY5+nJoubjGXUXZfpqArcTmdqK8dg2lyHoyw
    V023tY+BSKq9S5CjwjLErMaSym/JzIrOz4zShtHUm9e61tme29wtxd9T3uIq4eUp5+hl66Htbe/w
    8djzmOTz6vH57/vt/ev/0AUsN1BcwW8HuSXMtvBaQ2oPpUV8NpFZRWUXjWUUtrFXx1ofgYcRq0cK
    T0hcwAidrDRLDqBcx1pehBmTg5oursJsQgTkHrhSqvKdWviJZSeimYxa8tkqqVFSOBtFrbaqarVm
    NLsJmkgHl5ubVL9OA8v1z1iVTLUejDRz7VKSnKDC1clursu6c1OBhdvViN2gTyj8NYdjcBUYaSH6
    CCHik+PHjUJEAAA7}
 image create photo ::img::2d -format gif -data {
    R0lGODlhRwBgALMAANnZ2QAAAP////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
    AAAAACH5BAEAAAAALAAAAABHAGAAAwT/EEgZqr046817niBQCWRpnmiqrixahUErz3QdTHGt7/wt
    loNgkEcskm45gXBpbOpGpGF04KzKoCipdetKmoTcsAkL1IrDZKW5ST2XyGBr3I2Nr3fL9rmuv9fy
    flV8eUWAc1yDTESGgU1pVYyHVo9skZJOaXqFlmJwjTSRe0mERqGdOYaVpKdTq5uXW1CpTrCxo4qQ
    bm9etbqOXkq+osLElMSIwMdoycq2zXTMz5jR0kbG1UXX2D3U2zva3jbd4TTg5Ffj5y3m6ivs7Snv
    8Cfy87v23+n4Y/r7R/3+6uETaI/gPIPwELZTqI7hOYfkIIaT6I3iNovYMFbTKI3jM4/NiEAqE3mM
    ZDGA+0yG0SRA5ZZDJFmWwiWy1x9A/3S5WoSzJcqbO/H05GjqlRaijGiZ0WhJJh56P1s0/cRNTFNW
    VpPyXIV0Fg+vHr1+7aMHZFAdUubUpAqUnzCnW6H6O3HJpap4UasFsjuzzL25rWj+AKxGLQXC7nAg
    dgEjb0YfIUR4mEy5cocQEQAAOw==}
 image create photo ::img::2h -format gif -data {
    R0lGODlhRwBgALMAANnZ2QAAAP////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
    AAAAACH5BAEAAAAALAAAAABHAGAAAwT/EEgZqr046817niBQCWRpnmiqrixahUErz3QdTHGt7/wt
    loNgkEcskm45gXBpbOpGpGF04KzKoCipdetKmoTcsAkL1IrDZKWZx5yunWSwcTmkU7dY+Vtmp/bx
    SVp7LX2FgGV0bIV2h25tOouMVmlOkYmTXlaWg0SUlZtceXWchJFoOUyPO4tiUKxFf62ohnOqobOx
    tXdnopeVZyVxtsBVaXLEt1nIssvNns3J0MTP0sWZ1Y3Yp9rM3NHemODZ4k3U5DbX5zvm6lfp7TTs
    8Cvy8yn19if4+cHv/Cr7/gXkNzBfQXsH5yWEt7BdQ3UPz0UkN1FcRXAXvWXktlFbR2wfk6uFlDYS
    Wkln/vjt6vcvxbEjKef5EnByJZFcJV+uojVyJiSeMXUNm/Hq46ufo6R0tKTIj5aNm2yWC7qT6bgq
    UUk9oVojq1QWOLnS8Ir0UUayXXc9FUuUUa62bliGcesz7cqlx4a2tXlS05u+n74CbjJocK0ycls6
    OoZEMaKnFByz8PFDsgsYbClSxuyhs+fPHEJEAAA7}
 image create photo ::img::2s -format gif -data {
    R0lGODlhRwBgALMAANnZ2QAAAP///////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
    AAAAACH5BAEAAAAALAAAAABHAGAAAwT/EEgZqr046817niBQCWRpnmiqrixahUErz3QdTHGt7/wt
    lhiecEi65QQaolI3Kh6byygLeqJKryar84jtIrlbr/hb1Q7BXqrluh6Tw+/zxQ2to22ZsT0o5Ij3
    cz0daXdEHmaGhXIeXYh9h46CLouHWFZtO5CRmVx8TEExeWxPop9NOYGjW6WPilGnG4mYhKuebkt2
    SHG3uGCzvL1lrsCfxLebxonJesPLj8600JbN0njVqtev1NktyNzd298q3uLj4eVl6M/qnOzt7tbw
    NOTy9PD27vjs+ur86P7lAIoT+I0gN4PZEF5TWI2hNIfQIDqTuIxiMovGMDa6dC4hR3lZfELF0agt
    ya6Nv0yJwphSJR+HgVC1BOeJYZ5QtualOqlEU0c4QH6u8HnGhVBzkKahHKR0GqOmTmMJqnl0itSp
    qSiaXDeyKk2BsEgdUzhLo9eQvs5m1EKyZIq2wd6qBZbLCcigNX/c/YLJx9yHOPa+hfGXro8QInwq
    XnwoRAQAOw==}
 image create photo ::img::3c -format gif -data {
    R0lGODlhRwBgALMAANnZ2QAAAP///////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
    AAAAACH5BAEAAAAALAAAAABHAGAAAwT/EEgZqr046817niBQCWRpnmiqrixahUErz3QdTHGt7/wt
    khqecCi45YoZolI3Auaay2gLWqJKr66jE8tNUTHdMNKUVFrEW6+2d0Fbq2tmuQutx21zrh08DIa/
    bWaBf3eCMWdneoV9HotCb4lyjY47Vnx4k1iWgzSTb0SbkZgjh5xRdkillU1Pn4JOHIyUr6kbj6aa
    rbFoS3tFqbyncaLBtGSuxavJvMjLvbPOt9GE03TQ1XjYudpXzdzZ38/h4uOg17fnbG643emjxO1i
    ftbyedv18PGKpfz0uR6K/jW6J8WTOxbeJA3U1w5RrYMIIUZ8AssfPmYSZVyyWE5dR2kfmz2GlDNS
    WUlwJ2ckTJmG5ZSM5VaylBkOHs1vNmEWcxjp5jSAY/D5hGUr6EV0RYe+pAiMJKIjSleA4Td0o1Fh
    mRSuiaom67sTXLN4xZRlX4eA+4DlM2Zt7Vc4Qt1qnBNWqj2SLeuqmCcSrE67cufu/Qv4GSe9yTYi
    XrbJ5bGyjoOicjzPCOUyPghj8/EjMlgYmndyBm2wtGkPISIAADs=}
 image create photo ::img::3d -format gif -data {
    R0lGODlhRwBgALMAANnZ2QAAAP////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
    AAAAACH5BAEAAAAALAAAAABHAGAAAwT/EEgZqr046817niBQCWRpnmiqrixahUErz3QdTHGt7/wt
    koOgcMArGgW3nGAoPDp1IyBxOX1aW1FT8MplZaXdcOrLFJuRSurQWj1/te1i84xWbY9lt/JOxTPj
    XFl/gDSDfF1ka0aGhE9vbIyNR49OkXOBaUtPlmKJkoWGZoKKi6GdOYOVf3pSeX6Xp62kr3R1sp86
    uI5psLVXb7q+O5TCiJnFYcTIVsrLTs3ORtDRPcfUz9bX0tna1d2/3N824eIz0+Ve5OjpvsGT6rR0
    53KzyfA8qaL3uab2Zoz6xHDy18XSIWb7QAEkGGYhw4L9jJ3JF2tiPYl0ej3852veOhcJoD+W8Chy
    ZMiSJEvaUkkjJcqTIl3GhPlRZk2a62zmxHktjk5qsH7KcDeUlFAWGvGtWinw4o58R1NQpJcn6gmH
    VPlYhTOVqomtt5biOQHWIFFzPKVGqtgw4tNZYMMmnUExrlw/JbSmXeGKngq7eQ8q/bsXKSS4hYX1
    BWyRbGLFgBi3BUNCMpe6P1gGrkpBswwfmT2PgfG4I2jSHlKrXs0hRAQAOw==}
 image create photo ::img::3h -format gif -data {
    R0lGODlhRwBgALMAANnZ2QAAAP////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
    AAAAACH5BAEAAAAALAAAAABHAGAAAwT/EEgZqr046817niBQCWRpnmiqrixahUErz3QdTHGt7/wt
    koOgcMArGgW3nGAoPDp1IyBxOX1aW1FT8MplZaXdcOrLFJuRSurQuJZuu19tVcck1uFpOa9uv1+z
    b1R7fHxcgH50hIhPZG07iotOcU+QZX95VpWBVpOUmnglTU1FlWFRa46PhGKnq2yRl26wiaOsOYqe
    c6ZKhZlnJI21v7FyusOMmMbHkpjLu87DndDE07bVZtLXR9naRdzdO9/gNs3jPeXmUOjpNOLsXuuv
    gamc8YOoltRXhb31YZrCmP0DqMybPVqf9GUiaOggQlwNxQAEJRHSMzMQKWKchWxYvou/swJqDBnN
    4bsxJk+ecKfSRcqWwF7CZAmzBM2aaHCS09lOZsubNYHO9AnOmNCim3LyDJXqKJ1cjpzSEFkDolQZ
    Hx+2ucqin9ZRXFVkrCoKLNGuFlX1qRL2xMSIA0vB5UKw4Lm4CckKa8v07VREfGXJ/cvU5tkU/DiK
    LRhY8FqqaFU0ltXX7opFk898zBxSF+eNLpcWFhRTtJqoP5b28nHYnI/Upk28ptB62osQtD3o3s2b
    Q4gIADs=}
 image create photo ::img::3s -format gif -data {
    R0lGODlhRwBgALMAANnZ2QAAAP///////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
    AAAAACH5BAEAAAAALAAAAABHAGAAAwT/EEgZqr046817niBQCWRpnmiqrixahUErz3QdTHGt7/wt
    khqecCi45YoZolI3Auaay2gLWqJKr66jE8tNUTHdMNKUXGrD1uq5l8a2x0SwGEpf28rdupwdzGv3
    Ox5+XB5vQ4ZChXZxi4mKjWwuh49uZxaOipVkF3yXMXhRepyBl0VOiJFIfZOQZk8bjKVor6tioUcj
    n622TJaovKQnssC3xMC/xozJtsjLqc6Eu9DB05rVV83XMtnaLNzdKt/gWcfH0qy84jSA0XOg1tG1
    2Od3HIOVgvBSmfqu/Pv0tlGah69QPyVJdI0CGO/JqYAC06lbB7HexIjjlGWctJFjx2cfku+EpDaS
    YkmRJ2dczLhyXMtlw+CkVONr5hZdamzak+knZq8+L1f4/FkmKE2HqiquMpo0V1OlC3n6M8hHWEWh
    A3uQm/evWMGdBL/COjhVnsU/V6eM7SSL6SZ2vXJucTcU5Va6rsKlXXcrqltmfvdOs/IX8N2ZTerY
    fIrrB+KiFBaHwyFZGAzBzl6EoPCos+fOISIAADs=}
 image create photo ::img::4c -format gif -data {
    R0lGODlhRwBgALMAANnZ2QAAAP///////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
    AAAAACH5BAEAAAAALAAAAABHAGAAAwT/EEgZqr046817niBQCWRpnmiqrixahUErz3QdTHGt7/wt
    ujmecHgLlizDpHBkuiifNiMGSm0xBchrddvMIbFGLpfJYX2JWh15s5ounb0wKX3SxN1qOdicucPz
    QHRHfTt2hXJ/KXiHZ4B5MVmCiiORem2WKh6SXR5RgYGafJqYdWGLYKOioTNpp6ObqKsyrYlzTpC1
    k1mxpKWDqHucc7a9g17Ejp26So3JHbqwqsWTxGxiVVe7zdfMiNHccZ/gW9/jUOXm3enm6Otv7uDt
    8I7zY9P19PhU8vpW9/2z/gHkM/CcwILUECbhp7BLQzQP30U8NJFiRU8XaTCMuPFhx4YfuBWGRDiy
    YMmBJwGm7LdSX0t8L+vFnDcTXk13N9flxEZn576eB2VSAmYrIy9CHU9F2abs47ZH0Azx++IFHVVk
    vyL9WjpUKShIvEo1a/eKVFlOtLgqy/QKral/Zy+lEuZLrTVpdwMyAvZ0WaV8j5LmMubtjVd/h3Nt
    NBS4b7C6jAYjlvzYoWHBfctU3rtwk2afBrGCfkIpW1CXiUZ3S2vUmIsfrTdjoRC7DY7ar0Go7hYC
    R9nfwDWFiAAAOw==}
 image create photo ::img::4d -format gif -data {
    R0lGODlhRwBgALMAANnZ2QAAAP////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
    AAAAACH5BAEAAAAALAAAAABHAGAAAwT/EEgZqr046817niBQCWRpnmiqrixahUErz3QdTHGt7/wt
    ooMBb0gk3XKmoLDI1I2SyqZ09iQpg9PsqhrFar+mZ1TgBYPF1ytr2WT3cmm1alyk76rQtXyYHuJL
    ZUBxfIN3SIB2iHFuM4uBVIdWiZKLO46MMn8tl496l06RnpyNnJ1bkZhQnzSloKqifTqrNkixKbOs
    joaUe4K2soWuZMG3vZbGNGi/xanAzZm1yLdTz9CvZth/1dhMmtzZod9m3uJf5OVZ5+hS6uvd4e7s
    8PHv9Gfz9n74+bv8U+3+ku0LCIlgE4AGWSBMqGIhQxcDH6ZwKLEExYoCLlbUKJHjQ48Mu0EmFGmQ
    JEGTAVH6U8mPZT6X9mDSkxmPpjub63Ci01mOpzif34ByE0rtBNE2gUBuY0WKjsdJx7ZVyhjRl6lc
    UBXJ0Tg1qjReYy7iakrshC2xupyVNZu0Kti1K1rFNeq21FW2cgvWyCuDrzW1y/qmxYsJbVescJFx
    hSs4MKKJblXdbTzZ1NPJTeOmVVpU89SjRLyEjewPi1PS/H6BJvRoNY9JRzAKckFBNhUcthXCQN3S
    RwgRHoILH94hRAQAOw==}
 image create photo ::img::4h -format gif -data {
    R0lGODlhRwBgALMAANnZ2QAAAP////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
    AAAAACH5BAEAAAAALAAAAABHAGAAAwT/EEgZqr046817niBQCWRpnmiqrixahUErz3QdTHGt7/wt
    ooMBb0gk3XKmoLDI1I2SyqZ09iQpg9PsqhrFar+mZ1TgBYPF1+tJbR3P2GQ3NZeGx9X1d/oub1Wh
    a3l1SyuDfH1bSIBQg3ksjYZzQHKQjoWVdix/bWWHlS2YmYk0oYiBpTSbj6F6mDaKoKwyqKlIXZ2c
    jTWur7l8k5G7uk50w6eirch+xcHHhDx7PcyWwE2mkrnXJc9F3MSMuGZTm9riRare5lKq6mbs7V/v
    8Fny8+uw9lr1+ef4/Pf/zvgL2I+gvoEGpSUch3BhL4dM9kFcNrFgxSESL6bIqPEEx44l0j6CFCAS
    ZMmOJzWmvLiyYsuJLyHGdDhzYc2ENw3mJLgzYM9/P/kFzTfUXtF5R+El1eJt6ZQ+Tq3ZaZkOWqxo
    JBuuqiqMKyQjWlVghabsa1ayY7siM1vSrNq0v9iI5JWsGac7IcNuk3X1U623xrb6xTarFNdsgynW
    TZzC8DNRHB33pfvLo15PbsUaDrTxsiG7wPBQi9MZsKfFp/dGmutGWePWfdheduhlTFQmWNzc7jZ1
    9sJMu4kgOjKSs0cKxWX4+JFcxXIKvm0+B+GhuvXrHkJEAAA7}
 image create photo ::img::4s -format gif -data {
    R0lGODlhRwBgALMAANnZ2QAAAP///////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
    AAAAACH5BAEAAAAALAAAAABHAGAAAwT/EEgZqr046817niBQCWRpnmiqrixahUErz3QdTHGt7/wt
    ujmecHgLlizDpHBkuiifNiMGSm0xBchrddvMIbFGLpfJYYWJSfJm9U1rdW9SvNvuOe2puTyz5O/i
    dydlcGuEQIAdUYM0enkeZ44eUYqJMo+QKo2Cl5hHnIxnkJyde5egm6GfZqqWUoGlWWCvkbF+rZ5T
    dF6wM3dedVa/GmyavcXEsLmHx8TAp7K2YlVXIzHM0oZ02NJvzttP199K4eJEpOVQ5Oh/5+tu7tjq
    8MbzYvL1q/hb9/qO/VT8/nURCK4dwXwHzSVUuBBPQ3YPIUacNPFZxVsXMWZEuBFZR48fr/2FFDly
    U0kgJ02m9LSSZUswL2G+DHiQJjxgNt3hNCiwmsyfFQfdU2bHG7Rc/IwqauYnnC9erchAxRXoGh9r
    RGn5jHZ0oDFTq8Bq8xr1UTCxTVB+NRuWrcayi9rGDUZpbia3b+Fylbt3FtC1WfV68ytvWFG/LlWy
    UwqXI9nFBTsJ5ZkHIN8vOdGp+fWxGjXK/4hmLjdrtDhnRToCotDSx4+TrimADh0bxKjbuC+FiAAA
    Ow==}
 image create photo ::img::5c -format gif -data {
    R0lGODlhRwBgALMAANnZ2QAAAP///////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
    AAAAACH5BAEAAAAALAAAAABHAGAAAwT/EEgZqr046817niBQCWRpnmiqrixahUErz3QdTHGt7/wt
    khqecCi45YoZolI3Ah6XUFoTGa3Opkmr1oTNbrXTUzhlUZaF41Kaexli0MfuKrijM+P4ude2l+Lf
    KnZ8gHdsZ3qHdW09T1cjZYkskI9renceMh6VZI1InZqRYqCdgY2ETqCSo36ikaOkaquOrWlvMael
    kJ6bLnmTrUCofjnEvL2oG7lmxpa7grGhw8ycyM9fRF23ntdVtdPcfL2w4HDk5t/mbuPpUOjsiu/X
    7vGs9GDr9oz5VvP7zf5L+gE8Bi5aFIHS8KnjZq2dQnW4Dj6EE9FhwUVbEKq6RWliPX6a0kDeSyVx
    ZMiSIElaNKmt4sKMTYp5nHVxZiGGGO8NDGhzpyif2HoCdTK0XFF4R28m/bg0k9ChGn1GfRdqKruq
    T68+2ka0KSYqFBFG/KrR4DBOHLoOCsbVKTFhsbbJGbTVpaG6OZ39TNhh48lqex2pRPtXLxu6X3MV
    bhsXcbIWgyHbnMRxImXGTiGKzUvricCGkl3a+dxHMGe1cxXZRXQarOvNZkNvqlQ2amzaWal6sZpu
    d+58qZsSdC189A/hzmJSQC4JB3MyMH7rDoHjlfXrmkJEAAA7}
 image create photo ::img::5d -format gif -data {
    R0lGODlhRwBgALMAANnZ2QAAAP////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
    AAAAACH5BAEAAAAALAAAAABHAGAAAwT/EEgZqr046817niBQCWRpnmiqrixahUErz3QdTHGt7/wt
    CoOgcMArGkm33FB4bO5GQKJz+lRKqVgZdHnNektb7ncsgJ6Csu5RrTOb0CxmU96zluCq5XpYDN/Z
    f3o8XIAtYYIohHg0ioUrZoiJijuNVTqNiy2YjilumpucgZg2OXdxo4yoNG50KZWXk22lkWexNa+k
    JIQru4NillG0ta2UfHW6v7yZvqGPs8aaVM3Ob8tkVJ7T18fb3WWl3mSe4V7j5Fjm51Pp6k3s7Ubv
    8Nzz2OD17vf48fr79P78umkLeI1YuX7SoH2RZ6TXQoRzbGVhyCzZRIgNVaHDWBGXvS+byx6O8bhx
    pMSSJoV9JKNyJUtrKAt2owiQWk2CN//lzLUTWE+eP1dxDGqCJlGjQZH+VNqT6U6nOaHWUyMVXiup
    A+PMQATVYLFQvZy23KpQkiCmDmGNDTt0mEWyad1eUUoyzclhRduKinuq7psTRkFNEwwU7l1lfm3e
    Otz37d68Xx1/4hsMGlrJdlviwSO2rFqYUf6A0WvWiVfRnUgnkvZJRVVyDl/D5qq6JufaAG8Trcb1
    x+7KcnzgvunD928XMIbPexGCgofn0KN3CBEBADs=}
 image create photo ::img::5h -format gif -data {
    R0lGODlhRwBgALMAANnZ2QAAAP////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
    AAAAACH5BAEAAAAALAAAAABHAGAAAwT/EEgZqr046817niBQCWRpnmiqrixahUErz3QdTHGt7/wt
    koOgcMArGgW3nGAoPDp1IyDxSYUqg9XsLLpkar8nLhMLBnNPZNOwtKa1u+mtEj1le8czPJ4mrsfH
    RIAtgoJydod2gHsrioUyfV6JjU0sk5GPc5dSlnEpnJSYbp91KqOkLGeDnHmrfHOqlqyxrolwKLOy
    ilabgaCSmrnAoXCLasU1jjY5jaVvPMKGxNCbT767vNa3VafX2GVlqdnfVKlL4+Cv59/l6mbp7V/s
    8Fny8+Tv9vf56Pvu/fH4/hWpJ3AHwYLKEOr78sZZlYM79EwzAhGZxIk9Aj4bpaWiqE8d5jVG5EhP
    pA5TIRm2KqkS10OTI5kBLCNzJs1jLL9hdOKxiLic47jZVHikJ9EURo+GgakUKdOmS6FmlGrwKVUk
    VqkmlboVatemX/9xC7vPGll7msIKfQbrzdefFtdKa9N1ZyWHv+hmnSv3LjSZSWt+xLlG78lJcXXR
    6VWnJ0gZj6MFU9xWcAuPKP2uvMw0MyOSv0xgBt0sMt8So017Ip0mTerCOBfD1tS68dOLcI3NttYJ
    tdWGuWVLurX2LDxHxo9fSp7P9V6Fzq/KBpVEet4pPp4f9fHDugruFLT3exEivIfz6NNzCBEBADs=}
 image create photo ::img::5s -format gif -data {
    R0lGODlhRwBgALMAANnZ2QAAAP///////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
    AAAAACH5BAEAAAAALAAAAABHAGAAAwT/EEgZqr046817niBQCWRpnmiqrixahUErz3QdTHGt7/wt
    ChqecEi65YLEpG4EzCmfy6MTSm0xM9WsS4rRepspJmtKJEfD5pNFuRZenWJ0232hF+Hpe7eH3b33
    W0g2G354c2odgxxnNB5xK455aIqJMpGDjZGSeo6ZLnKdY5qeJoecHlajM3GApzGvraAjsHWrhrUl
    tVybuW27mE2CgWyPwIuyZbiMx19QYrNgzVSPptLEiLzWjNrNxdxV3t/O2eJ25Vrh58nqWensfO/T
    5PGW80P25l/V4PhR++P6+qDrZ0uYvIHMDvJDxa9dKIXjLkF8ookgJIsqKjaUV4fWv3wRwo9wcijt
    I0WM9UwmcUePVMt1L2HGBDlzW02bN13m1LmzXk9gP30GFTpUVNFeZFjWNKX0JbRnKL8daxqIKjJZ
    ujCqTHkRiVVdI1OKDJZUIFUsHlmiJUtN2VlVXR8iRZRJYlyGarbUlYs1odG9fjPy/VuwUiq8RAsb
    FBWYbal+jRkLfAzIKlJllP5B7UVn692LnO/csyyHMN17zlIJPiqI9DuzUdltPvo49NDWP2738RE7
    no/ctHPB6C319/CKyJN7CBEBADs=}
 image create photo ::img::6c -format gif -data {
    R0lGODlhRwBgALMAANnZ2QAAAP///////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
    AAAAACH5BAEAAAAALAAAAABHAGAAAwT/EEgZqr046817niBQCWRpnmiqrixahUErz3QdTHGt7/wt
    mheecEi65YpBolI3Qh6X0FlTMI1aWdPMdXvKarlcb6masijNQjESm+y1mUd1+QvHuMfxZ5du49O8
    dioaboFwQG9zaIRkf3oyZpCMgiORjmx1HY8elpMujJuKiZuNe6FUoJxOo1J6haoebKCkh6ankLaS
    pZS4qZ54tqelRU6NOca5nbx+eL2azStNsJ61xciXyq5gZ3kx3dbahsLgV5/f4+Hn4+bp2+zqz+5D
    6/F39GHw9uj5UfP7rP5W+gG8NrCdPIHTDh6kxophC4SvIA7aARHbIofQ8OnCOCnbvzSI6PpwTCYS
    2EhilfQ5y/Rw1ceGLkVJ0yQy5jSbGWvOlMmSpk4qvFZ2CzqrJFBgDYchLUpom8Y9CysSpfi04Byr
    BrGC1KqQaz2vKsH6FMuUbEuzZdGSVFtLqr22Vd/uUuQ2nTSpHqs5uhuXmVOegRCiOYZvMLFfkX79
    9DbSDmMy2fqh6jWZFmSNlTPKYnZZZ0/AG8QdwsRBaOi0LRkvTW1SIN6QemNVqTiRdK7atJeZ5iQn
    d97UsIOtGX4xaqrefQ8vJCgHLe7kctvU3ddcrfLp7lwZsY4LCAXugnCA7wIDutwQOCarX78pRAQA
    Ow==}
 image create photo ::img::6d -format gif -data {
    R0lGODlhRwBgALMAANnZ2QAAAP////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
    AAAAACH5BAEAAAAALAAAAABHAGAAAwT/EEgZqr046817niBQCWRpnmiqrixahUErz3QdTHGt7/wt
    moPggEcskm45kjBobO5GSqZzaktKqdgWVLC8Zr9Ha3cIBm+vXhSZun6KS2lgnCgkntdz7tLZ7b2j
    KWNtO4JucGNqgoM0iossW3p1iYU8jTqQLY15K5qOKpicnTqdmyeYnpGKhJpVcqiWlaqtUZKTiLGU
    NFC5J7yrfZc5vq6lM8DBtHuhqKPFn2K1nFnMj0mRZdgCp9nYoNxl3t9f4eJY5OVT5+hN6utF7e5+
    8WbW8+n19uz4+e/7/PL/nMALWK0ItVH96DgzttCFPxbHDCpD1izir4m6HgaSddGiFo226TwyHFaQ
    EauKHGUMJIUSlkqQxEhCPDljYDKRMlzWhBkTYw2dLzs23Ihzhc1D0RQm3amUzVATR4FMS0jQSNSq
    UHliTXF1qzatXrOGNTR2VlmmZ9Gm/bg2aNuSb5/FhWMKLMFoXblMzTSx69Kmy5RdLWry700pUWWO
    9IlUsF2ghW+FLHEU8uKieMGKailZTd3IKXOyVCva8kzTXB+HBs04VZvKqy8zzpW4s1BHaNYMbt1S
    RW7KdpE6fYVHd3C6WJj9DvOW9nF7kvPyuyIdOvXn8yIiaY6XwlwXOL5ThoF93osQFDyoX8++Q4gI
    ADs=}
 image create photo ::img::6h -format gif -data {
    R0lGODlhRwBgALMAANnZ2QAAAP////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
    AAAAACH5BAEAAAAALAAAAABHAGAAAwT/EEgZqr046817niBQCWRpnmiqrixahUErz3QdTHGt7/wt
    moPggEcskm45kjBobO5GSqZzaktKqdgWVLC8Zr9Ha3cIBm+v3ihaWFuW3NU3mTtXs8czPJ52nnvH
    Q4AtgoIzfXJAgIUriotaYl2JjXCMk5SPkmmWlymbbIZJg551naN8oaKWeZtxNJ6rqqdygWl0jW2T
    OlBunLZ7uI6gdpEowa6/rbeln0TETznKy07Mz7O9J6RF2a3DZWVbat7fqFzi4+boYeno4Otm5O5Y
    7fHy8PRO8/f49vpF+f3++AGsNnDKv4K6BCIUBswPtVQOa7E4WCwSskq8nMmgmOnOxYoW/z+q4Ggt
    FkZWDGWM2tYxV0qIJlWslAUL5cmYExW2NLbM5UuYimpG26hz5zWZPn+qDKpjqNKlGhs+fApV4rGp
    VKFOs0rUCMsdX7suNEJy7IqyZlOgTXtiLdsSbt8KiPuWLlu7afGa1TuW70K/9LIBdvdwcDqNesO2
    AToHL9amXJXZjQr5seSi2ERWxXoZLFOpvTJKcYuTRWmPjTH7coq09FnVrzZ/FiubdebYtBnP7okT
    MeaZpk2VvIIW+M2ka+D+1qN5OC2NydVdRf34NnVNDpVXjqg4k7WKiKTL3al9vHXiqs2iN9+6PPtu
    cH+892XCR/q7OOarhXF/4IsQFHgg4AaABHYQQgQAOw==}
 image create photo ::img::6s -format gif -data {
    R0lGODlhRwBgALMAANnZ2QAAAP///////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
    AAAAACH5BAEAAAAALAAAAABHAGAAAwT/EEgZqr046817niBQCWRpnmiqrixahUErz3QdTHGt7/wt
    mheecEi65YpBolI3Qh6X0FlTMI1aWdPMdXvKarlcb6maehLNzKN4ZVm2hWsqepyE19P0fPm70/TU
    fEAbfYN4dG9dHTaKi4seUh5zKmRYkZCPNJSTkZqCnJloc5ydh5aQiaGjLaOSLk8YqG0xgXtBs7Cn
    TndyTTm7m726jby0nm6kq76Froh/zcMcYFtit9LTZs/WUGTZ2krI3lHg4cfk2uPmQ+jpf+xg6+7D
    8Vbw8zL19pVn4metyf6X1AEEhs9TQTnOfl1SmIyQnzQP5S2MeI8RKEcWK2HKNXGZxowN3ztG+7gx
    ZMVPJEGyGairZC1TFUHZIgZOyy2GrjAWEXbSF0+ODo+x3GOnm8yDB/PlVFqO6behTjdF7TdVYFU7
    V9tlNbT1YlevX2OGFTvWSaKyh86WHVENydpCSHH2lDQyqVFHKx/CS6IMHd+fLeP8k0UToM3CsV4N
    ZTXYJS+1c1UmlpzqqOPJI8lGpphXslTLHjtn1rxZLmbTkEHfJYiLWZWCnFWzFowRqutWcewmTbtS
    D0J1/PS5HT42t217EXez46N8Hu23an5Az0IB7R0f0tECgXE834sQFFiJHx8pRAQAOw==}
 image create photo ::img::7c -format gif -data {
    R0lGODlhRwBgALMAANnZ2QAAAP///////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
    AAAAACH5BAEAAAAALAAAAABHAGAAAwT/EEgZqr046817niBQCWRpnmiqrixahUErz3QdTHGt7/wt
    khqecCi45YoZolI3Ah6byygLaqJKryerE8vNHkva7lUbdpVpliH5q8KoL0LrGZzcBe3sudON5zPz
    bCl3f342gDOFhHptgS1pj4t7SDFphoocMh6RW16BmpWMn2iAoHuaU5+NgqRyqaiiiKyecJRwjrST
    m0h0k7tVTTmlr0CSlrmDnUrCxh6ry6PPmcEdYmNPI7Wq1T2z2oTba97Qun/gdVzkl+mx5olS64bR
    S/C32b1Y9Cuw7+J9p/zoXAHEJzBKvlDYjhEUU2lav3Lb7jF8GEqfLTMUzbyRVw+ex3Px+y4a88cR
    YclVcUCOO6kxJUtnH/v0egnJ3shYzTpiGhUyp0lq7FYC/blTWs+hMH3eulREoc6m7izKbCqxHrGq
    Rjcqo8dVJFNuEcNyEmuObMSDZlGlrYZ2LUq3AeHGlWuNbl27BjPiXdaWLF+9cB9J7MsWaNeXGMNt
    GMsNcLLEd9I1LCYtGOVdkHj1hOo1KWdhiXSl8jb6F+iMpS3uc6oZ5z+ii023FIoMdlRGMmtCm0nu
    sO9+rVx2rjz8lxfhiOncbs34qOPas5tvRr70uFYiJ9fghWh8e1Dr3quDD497LOGz54yQV23Lh2Py
    Pn6sRwPjvdwXISiM3s9fU4gIADs=}
 image create photo ::img::7d -format gif -data {
    R0lGODlhRwBgALMAANnZ2QAAAP////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
    AAAAACH5BAEAAAAALAAAAABHAGAAAwT/EEgZqr046817niBQCWRpnmiqrixahUErz3QdTHGt7/wt
    koOgcMArGgW3nGAoPDp1IyBR+qzKoqegdbvCmrTcsMlLFZuRyhKYNbW2d+TlO9Ws1uFpeYv55OOz
    c4B+RUxrNGSGgoWEhYktiIFqjZEyk5QqcSuWjnubNnmam5d0oqNjeZeiO6qHaXcoloyNUEqDirY1
    sZ9SuJK9uYu0vEOhr7KcjzmzxW7Iyb7OalymXa7RZ0eIYdROmVvGYd52xGfiTsti5ka64aDj6Fzq
    PKzx7kel3Lvbnu1m7PX+JpmRdwycFYIFsSGUhQ1NwyUPF2aZZkSir2b5TliUY1DHr2ce9oMVvObC
    nop/wOBdMUlKJQ2UIGfQe8lvBsJSIWeyWKizUs2VOUUG/YiJJSyB85C2WiWUKdGiSTumJFmS4bsi
    G4FQxGr0YZWsXvWFLdd1bMWyZnugTSuMbT+3AOFuASu3at2va+9W0/uELtw5ftm+Apuxks87WaXm
    ZBNs41OZ5FqSs+hyasdlEmFCrsxxTWalQyMffcPz52bQE0/RNN2pJ9TVqA/H3mtZdG3Fhj5zbt0U
    kOrQhW9dy513WPDRJIlb7ZMccHFp3yBrfF43UWCzjq6PzU7d7Row2r1i/sGXdxMf3fn6IF/eBoz0
    bF+EoOChvv37HUJEAAA7}
 image create photo ::img::7h -format gif -data {
    R0lGODlhRwBgALMAANnZ2QAAAP////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
    AAAAACH5BAEAAAAALAAAAABHAGAAAwT/EEgZqr046817niBQCWRpnmiqrixahUErz3QdTHGt7/wt
    koOgcMArGgW3nGAoPDp1IyBR+qzKoqegdbvCmrTcsMlLFZuRyhIYNVQ3aW3pekZeTrNMe7zFJPZt
    aXYpfX5/LIR6ey1kc26EhiuPiHSBjXKSb5GYiiyMd1+bmSqhop2BmqR8pJ+mNakyr5SuoTOxV0pN
    pYmTtZhQOW2cu8KqvDRRkoOQOsbHwI+jxHDSi8/NoKw8us6O1EBW2YDYltNr3kWe4b3BeVx16rB/
    10d1R6vwPaf2q+76Rvf9uADcUm/fpjAF/9EKGOYgQn9OkolJGHEZQzPtzFB8so0gRHBn/0psDOmR
    WaZz47r9msUO5bCX3Na1PIdoXoqRlxyiWnirHM9otlrJ1An0p9B4Qdnwk+VTYjFfMYdCQwqVaVOL
    h6pavdpxZ8aoLF0q/Qo2LL6nZ1XgVJa2mJG1g0C+/UiyZN26cO+io6vXSd6+KwFr5Cs4X+GJhA+L
    U2yXcZW/jtUmjqzGxWTKpSAr/qr5W5WzvDp3Lec1jmayJjtKhGwTLbnVl4eNZot1Jom8RF2jzrUG
    blLaTntyxQp86tasv8fl7pJ4YOngbk6sdV50uaAxzZc+Nw5KevY8rXNqmdfIN3jUxWHisZz6jthE
    KpWxpzxtPn1VN2MzJtdZsLk7/QEW2h0P9z13GwUF9oBDgjbAoB9jL4RAgQcUVmhhByFEAAA7}
 image create photo ::img::7s -format gif -data {
    R0lGODlhRwBgALMAANnZ2QAAAP///////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
    AAAAACH5BAEAAAAALAAAAABHAGAAAwT/EEgZqr046817niBQCWRpnmiqrixahUErz3QdTHGt7/wt
    khqecCi45YoZolI3Ah6byygLaqJKryerE8vNHkva7lUbdkm/OzI6ZVm2hdZy9ULEwNFyp72XTOPX
    c0FMG35eKx42HYOJiDIeeYY0j4Auj4mSk5RgmZhmlZMtmZqRm2uioZwzVHulbTF9h3avrKitb61A
    eqO4RbqXSIJskI7DKk0cxnRDtL/IYlhQI7PPXHHFqtRbgWfXd9TM0LvLsNXifMHhXY3p4evc5e5R
    3cSgY+aY9e/2+fL3qrLAbvWDl6OgwIHf5hVaNkWZsTr+vEQUNnHTnYODMP475zBjx04e9MGhQreR
    ESF8J0H+i5eMZSyTzkYqUinTZSBLJenhjMWvIUqbtmYS+/kqIKQksz6+RJkr4MqCvmhmdKPQIseK
    trxl24qE69aqXn+FFQN27FCz6rCi9bmWXVt9bxHGpTp36py6jEjhfTlN296WfcCK/Al4T1mNdikG
    9qfMYLHGUYM+uYfU6K7K5IzefQpUF8uD10417Nl0s87OlmPWIkqycMqznF/zFAo79mDFrf1aham0
    Zm/dwG1f/B1cMPHTq037UVsqufI0Z2rv/ptMGPWlla5Xt66d1CrmYdEZ6X7zlg/wc338ID8FBvqx
    L0JQEEW//qMQEQAAOw==}
 image create photo ::img::8c -format gif -data {
    R0lGODlhRwBgALMAANnZ2QAAAP///////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
    AAAAACH5BAEAAAAALAAAAABHAGAAAwT/EEgZqr046817niBQCWRpnmiqrixahUErz3QdTHGt7/wt
    lhiecEi65QQaolI3Kh6byygLSj1Kr6cq0IrtQpGXrni7Da4sS7RQ6zyHh+YdG6xK9jJ3cjtll+P9
    ZW8uf35xNlaGg2prgkxcLWiRX5Ajko9Tl3UemVmbh4qdm5xOojSThqKTip4zp42po2ClrVyJQTGJ
    mpGyqm5kkiZqOYsywqSOpBt8vY6xvrx9gc5uxJ/QhGNpT5Wy2Veq1d7aoOLf0+VKzOjmcOqm7piM
    4YfzxefB2PSN73e5tP6U+u17BzCewHurEOoh2K3eMlyV4HXSx+FfB2v2ZlFjZY8gR10f/w1mDJnw
    Ii2KSKBZxKWSH70ixxim7IaxkDaFC5tJ3IiTzjpvO38yEpotKFFkB4kUFGkzndGJL2c6JDfsqdFb
    LSntWgp1pAetJDV5/IpJY8CVJnmmPYs2mlq3TDM2vBoRIsKn0pQOPFlor1e8PnVOfZun72CQhwfJ
    A5y3cL+b7Y6KYSz5WeVmii9j7qq5bMpFlNeRZcy1LDiTlBN7LmnGapOq94zRbANsz8rPfkNxs7Uv
    KCywZJPVOvfbdPCstoGvfRgyHN3jb/PF1To3dt3ZfA3rnYoKJ9y2iOdQJC3dtvix5AHOSR+64Pqe
    2OUZP9/ZOL762enjzxw4tND3+yn3xBwPAfIEBAUFyoFDgqbAAJ9kL4RAASwUVrhJCBEAADs=}
 image create photo ::img::8d -format gif -data {
    R0lGODlhRwBgALMAANnZ2QAAAP////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
    AAAAACH5BAEAAAAALAAAAABHAGAAAwT/EEgZqr046817niBQCWRpnmiqrixahUErz3QdTHGt7/wt
    loNgkEcskm45gXBpbOpGpGF04KzKoErq1MpVYaXZrtiEzQrHaMF3CU5pre/dGhg/nat3eRLcNrGd
    f3p0gyhsfTqGdVd7hoWJijOPkCtlgXaPRJJPSTKShy2ekyllLKGfKqaiJ6SioTuuNJWnZo08mjaM
    eZeJmZi4U5a7TEW8m8DDbsjEyrE5xaiziNGUudNKXaosstlpRaxi3E2k4NZG41zBYud4tWPrTbfq
    nOi+8mOwXe+9+Fb6+/Vc/P1L128eHIABDR4kWLAbw4YOy3lTGKlip4n7FhIR6EjXwB4U/1c8s9Wu
    mbSRNeLN4EgHJQ2Vi1J6ejXTZCRTJ2FSe8mvE86VITsi9Klzp0yXN5Ea5akU1FBtQZM9TMosJk2P
    JLFavaoRJDGLoDBGDCcWzVQnLK9WhUiuqbmoA9eihavW7Ua6R2smvKd3L1+7d80+nZsGcODCcquk
    zdpNDd6v2FY9bsyUzGQ/kZ3mWdyyK7RAnGmRFZm4GGfDn+WanlyUaEk/yBa31vwadpy0PV03rcMy
    Vd7Zkn/Xpo3acc6zpJEGkz2YeNVnp4czXcvnTWjkuqERMs6YXas3YEJHyZx682XKyduIR39p+3r2
    28Ofhw/b/Xz6xzb/wP/xCAX++eAAoBJiMNwH4AshUODBggw22EEIEQAAOw==}
 image create photo ::img::8h -format gif -data {
    R0lGODlhRwBgALMAANnZ2QAAAP////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
    AAAAACH5BAEAAAAALAAAAABHAGAAAwT/EEgZqr046817niBQCWRpnmiqrixahUErz3QdTHGt7/wt
    loNgkEcskm45gXBpbOpGpGF04KzKoErq1MpVYaXZrtiEzQrHaMF3CQaep+0WE66lrd0nNlU/4/Pt
    SWBtent/K4Rmc1eBdYOEiCyPkItubCaShiqYljNlnJWbdZqhcStlkaSiKamqpkkypH2hNq9ys7C3
    nYyFrZs1vrR0iSiSO8VPOcd5mb/MunSfy29E0cGJ1ZelxtrP0NxAVq3W0Gljp9PlXKdK6ea17Wjr
    8GLy8+rvqILotvrfKfWrLDkLyGSgF3wECxoEdWZSC4DSco2K1Q0XxUOpANFgxU8iC4jZ/y5O9Oiq
    GbCOyihtJJkw5UOEIx2iXPgPZkxFK2Wq1KFTFradPHFu26eRmj+fRUBGCmdEqb2kNp82jSqViNOq
    yIyI47G14lAnRIsOPZqPbE2uNDH+fDl2rdq0LqiGfGSS7jiLmHzmFYvX5c2eB3OynHuSrd7CLfcC
    LYuYWEavjBX/tbv4bcO0iADHrTsE7jVeYQPXBTVa2F2sVa6ihrx6amuum1+bPKH6dbTaeZhGroO7
    Ethvx3pf0yqU4ZzemncnfoPb70yiCqXUbmzZ2WXecr0lN76dTPbP3cF7PpKd427KhvtKXo5+eImr
    5qunnAT/sXz0+t6X94OZf7T85HEGmj9Z/u0DoBrfDWOaXqRFNI1wWN2W4GoHQihVhROihqFsh4GB
    BId9vUcBiFbhQOITMGS42gshUODBizDG2EEIEQAAOw==}
 image create photo ::img::8s -format gif -data {
    R0lGODlhRwBgALMAANnZ2QAAAP///////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
    AAAAACH5BAEAAAAALAAAAABHAGAAAwT/EEgZqr046817niBQCWRpnmiqrixahUErz3QdTHGt7/wt
    lhiecEi65QQaolI3Kh6byygLSj1Kr6cq0IrtQpGXrni7DU6lXOZzPf0KLUOtc2V+h3vseSqJr9vW
    fmUZOxyEVoFOhTQean+MMh5ubY4dM5FpdJh7l5qCj5BpmJydiZGLXHBZnC2jpyaBgzGDbWGyiCpV
    sKk5d6y7pX+lt4lLqXjCvarGfZKWvBtjXmy20dLK1WJuy9hRzdzW39jelmhE476kzumZdttq7s7M
    8KDDk++zlPW466+Vp4qu/vlDNxBUPmj0CvoS+GnfpYAJG256GE+dKVoXDVocYSvZRDgd/+e54AcM
    SUmCRU5q7FPsnD1DIiPaCSeOJM1jN8e4zDlTnjmPEGG2tKmKUkowO5HyUrlwoyylLmNBJZl0KkCH
    GZtGVDiS4kqCErtmfbmVD1iEFZ2axXhVq1qgmdq6fUvUalUyMOGWxZm3br+Y7NoNjeMXSDnCPLMV
    ThyYsdB+jllCjuyKmh7KZ3cV1gcWq5m715SIVHT3zrOkppmarSoVn+enrqFOLov2tdxtrFex5Wqy
    KN3YYsPuO7g2Lu/hDGsbl9v4t03hfkDbrct8td/iyTXJAdNO+t9x270TE30u/OLexTLjxSxzPfvG
    298j535Z/qb14nmu/mHfMxAK/TGBQxKAlsBwnn4+hCDCKAw2GEkIEQAAOw==}
 image create photo ::img::9c -format gif -data {
    R0lGODlhRwBgALMAANnZ2QAAAP///////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
    AAAAACH5BAEAAAAALAAAAABHAGAAAwT/EEgZqr046817niBQCWRpnmiqrixahUErz3QdTHGt7/wt
    lhiecEi65QQaolI3Kh6byygLSj1Kr6cq0Irtap3dMNgZXFmWZyEUWU61exc1d6tKwt+09XZOjt/9
    TFZ4JnY7hTaCaWaAf3wyei1nkpCLMZOOdZguHpp7HYibXJyKmaN5ooyjlISqp1mprVOxj6ikbJK3
    q6+4g4t0k6w5wrqhRWSBfYd7aMSyyRmhzbK2rrnKYkRVlrfYV5DU3Urf0uGg5eXk59mdlczsmXLg
    p/KR77uMiL31jen39L6GoPGzxypev2gEC+bj9m8Xw4P9TNHyYG4ip2DBLs5Ip+oJoI7V/yxStNYE
    5EaCQSx9FGgNScuQJ4Ud80QqzbCEBzGW0tUQYEBbl7hlTEgHi0RvRKdplJJT6UimSSstjdL0ZTKX
    b/Tti1fMpVCdcALJ/LrModeeCmOOUFkTFi98ztQ+3Tk3rshPTvHSmjfVzaytcjcEvuYz5kOUaxPj
    jKpVpJyBBtG+gkwZ2U+4g8M2Wid5MldxVdmoCxd69F7TnDehTu159UK2RV0P9lO1cT1qI0N3LuWX
    w5h5xsjeDt72YWzHbMmltHo17e2+CPUyFz2b8FDpeDj+7d0XN+K6dAXDnHj4tWLLl6M2l+qc726a
    PGFVFotZ+O989Z/LW1U7v+Pw7S0EmjImhZRm2hfUyVYRggqeFJuBoyEIoToF/tCge0BQcKE4OGyo
    BgzqufZCCBR0ZOKJnIQQAQA7}
 image create photo ::img::9d -format gif -data {
    R0lGODlhRwBgALMAANnZ2QAAAP////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
    AAAAACH5BAEAAAAALAAAAABHAGAAAwT/EEgZqr046817niBQCWRpnmiqrixahUErz3QdTHGt7/wt
    loNgkEcskm45gXBpbOpGpGF04KzKoErq1MpVYaXZrtj01YbH4/LSnGI73bZklqkSWu09uQl8Wr/p
    T3pTcHOAPGt8M1iFhIh4O46JLYuGe5FEkYQriy2Zkp2ecTSejzKknymcmoyIkKE0lKispTWZgUCV
    uI6Yl6Kzda1Fu7e/wLSHuVc5w8Z3sixqz1Fdq5Nyx2hcqtncnNzdgt9o3uJp4TPVkEXkptKj7qnn
    LH5N9MS1wbz2sPJtva7MFPVDYQtZQGX4Cib8hxDdqYUKrUHM9y6ixInY2h28WJFinxUW/zl2zDgH
    pMeGOvb1STYI3gl2oFZt1EUEZieTM6fVHKjvZBWbPXMaAQrwlTaeRYWuQ5qUZROiBn06gdpmnlSd
    efRZJVkya9KtW12SYarLqZKwXOOlZIhRrACqLVWONOuCLKmmcjcxPZXO0l2BbdMSNIrSoVKcV9UG
    Dkr3Jdm4blfmhfY47h/BdbVWwZwZE7Wl5cTBDe2V9LjKpus4Tn15rLDPMcGMprn52bDZjC7Lul35
    MFpUvNf69pfT3uiQhq+Wgvs38O7VyZEbI0zZeV/JbKsvjjrZ0PHs0ZPtmz18OjZsuCdDBOYFddfW
    5tngxrr5t5n5rMHIdp/fzH7WvOBSAid+qel3H38F5oMEgNwNSAGDVvjwA4RDwYAgay+EQIEHHHbo
    YQchRAAAOw==}
 image create photo ::img::9h -format gif -data {
    R0lGODlhRwBgALMAANnZ2QAAAP////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
    AAAAACH5BAEAAAAALAAAAABHAGAAAwT/EEgZqr046817niBQCWRpnmiqrixahUErz3QdTHGt7/wt
    loNgkEcskm45gXBpbOpGpGF04KzKoErq1MpVYaXZrtj01YbH4/LSDBS2wTLmFH5NZuVv95q92t/d
    NFgncHtUhS2HhzOCbyaFj4iPfot2a4OSliyYmXWOgJ6bdCihny2MfaR8o6mBdpGbM6Q2rpqhsbat
    jaVzkDSws7x/q4o1kjtQxsN4OsTAf5yXu8zLzskp0jvYlHnaQFaqzrzgaE6M3eRGp+PoTafsaO7v
    YvHyXPTXn9S1YPos99F6oKFiMmnbLUvN8CEsaIqWilTrxGHKdRDXQIsNfbHah9GfQ4Ud/5X96qRx
    JEdrJCuivLjS47SWLBmmLCkzTq9wxWqqFDUz5y481ARS5PFzYVCeBonwSSQzYkYuELv8exky3Uel
    G61M9Vm1yNaHIm9683r1FcCV51wSPYq2X8+dS8U+Q6qWq8CEMOvCZUvH5NuYePt2TfF1bkIlYQ+v
    +Br15MSkrwZLzOuiLCjJhuUutsztMWDNXjhPNhw5oNDQdg2dDjsXp01+aS/neSK6Hlnb6Arjpr3b
    iSrdvaOdAB5cHJna176VBkN8jm+6yZqvVvmwF3HFr/tFRz6ZbvXDBAHp9utYqOkShWVlp1w5Nfaz
    oFHvfd+d/nGa5OG3XMY46/eO0PSn3lFnzWAjYHjTjVbgOOkZFVtrTQXIHVAPBmPhZZ801xts6HFX
    3Bkgargbh0d4WByJAoiIGzFIfEiVGT6Y6OJwOMzoFQwyFvdCCBR44OOPQHYQQgQAOw==}
 image create photo ::img::9s -format gif -data {
    R0lGODlhRwBgALMAANnZ2QAAAP///////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
    AAAAACH5BAEAAAAALAAAAABHAGAAAwT/EEgZqr046817niBQCWRpnmiqrixahUErz3QdTHGt7/wt
    lhiecEi65QQaolI3Kh6byygLSj1Kr6cq0Irtap3dMNgZnEq5TGtmCh1a3Ohxqiykp+dtU7K33rXt
    eht+gndbeYaEMx6Fih5xLo42j3iLMo6TkDSXh1mbmmhxm5hIno2doKUrop+Bb61vMX2qQbGAs4iu
    iEVko7y7pJwqTRyzvS25g7y2ykTLljnEYlhatdJeXMjWZ9jB2nDe4N2WZ83GlEvZknUX5emmg87H
    suppe5L2rPeJz9H5jZXyAD7T14+NQHmfLgWM9I4fQyCnHiL8JxHZqoYLR9Rix0xZLGDu//Do+8UR
    ZC6O0EKKXBdqn6FvfLIdjMfm2kF05hJ2uDYtVRRx8CTi7KnwCtB6sEzmHEgUmq+eLLuppHmLZTGp
    R4XlRPl0IUmVmShqVJrx47yaYncaFFrV4c2Ib1e6VXs1bti0+Oq6RIv3rFa7d/uCheuXr06qkPIy
    RTr4b0l6QZfCXQdHcmKYdchhBoeTG+dtnj+XQ0Jqi+jKfbImVk0pWDTWpzrrdcWaK0iKX/PYU71m
    4+DeZF+pMXdx9l6ZxH22fovqMF3HgAMR3Lucutbpiqtnv479cVlnj2ErbUw4pB3x46Oa54TeZDus
    3GPK1ivdjebZpk9TltNe/5fS+vGRHySAATLyX4HOPfEDggQBQQGD6OAAoRswWIbgCyFQIMqGHDoS
    QgQAOw==}
 image create photo ::img::ac -format gif -data {
    R0lGODlhRwBgALMAANnZ2QAAAP///////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
    AAAAACH5BAEAAAAALAAAAABHAGAAAwT/EEgZqr046817niBQCWRpnmiqrixahUErz3QdTHGt7/wt
    urygsHTLnYzDpA1Jsiifs9FRCq2mqM0Y1srdjrbcKpYKDivHGXPXyFGL2cyyu5e7EJ3zpNSeledp
    fn9QgYJnTAJ4hUNefIpBjImOO5CEkipkWl+Hlix7HZyAdZ+gMp5tpC2YWoiVqGCRqKmHsLErrbW2
    m7ihu0K3vVPAdMKTusSXxscuycomv8fPxNHC0zq0b3MYatVRaWHcpd5rbhpm4OHXT+fIme3jax5W
    61Me81nw9djy9fas33bt+vn7V6fPO3ICgyFMZ6hZN4fhIMqS2IkZxISWMErS6IijIo+FbkAKEvlm
    lkVctEjq+cIKTrN4A6GNUulr5klSmjLdkajN2U1Xje5dDBrTYcqfMinmepmID81HTfE8haqwqLQN
    O42Ks3o1q1CtVqfWDIsU56uyoI4q3VSE4iwKSl3giEsEBtq0PkKI4Me3r98XICIAADs=}
 image create photo ::img::ad -format gif -data {
    R0lGODlhRwBgALMAANnZ2QAAAP////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
    AAAAACH5BAEAAAAALAAAAABHAGAAAwT/EEgZqr046817niBQCWRpnmiqrixahUErz3QdTHGt7/wt
    ngOecGi65UxBorJ3JA2eyyhthIRKryuqM2jFektaAbT79Wq75LL0/Gwn1Veqew6P59Lp+nDkLvX1
    SnxtfoOARGGGX4iJWItvjIdNYnmQOmF0lUJsmJmWR3OUnSybf6JTTZymM4iFqqcoj64yi7KetZG3
    e5K5r7w7tL6ju8HCxDbDxinAySfLzGDIz9DSxXqxZtFSrYrZS6mN3USg11HO4uPkgeFC6Om4X+2h
    uvDx8kxl9dhq7dz76P3+vq1ZN0TgQGv21AFyV46gMXPPIDKTmIziQ4fELGbEGExjR46+dDyGBMlL
    ZEmSuUyKuqYy0zYBLSGliplo3LRnNknQNJQTJspKM38CTbOTEUuhsoqaUoqv1R+m9NAUgkoPyBuq
    XvjpRLoQVBGuCAl9lTYmFtaqRMF2PUrtpU9qYpT9IOuCAty6du/qhKEW0IsQFDwIHky4Q4gIADs=}
 image create photo ::img::ah -format gif -data {
    R0lGODlhRwBgALMAANnZ2QAAAP////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
    AAAAACH5BAEAAAAALAAAAABHAGAAAwT/EEgZqr046817niBQCWRpnmiqrixahUErz3QdTHGt7/wt
    ogOecFi65U5BonI3Qg6Sy2iraXpCpVjXkfQUdLPg4tYb/IbBVHLJfJamrfB2lgqvy91Htvq+bMa5
    VnxKfoGAeoI6aYhhiotzY45YdF2FkT05cX+WiZh1lZs0hJ5XoDKinqU2eaipoVt2ra5OpLEsjbS1
    K425qrxDu76mkMHCxEzDxrrIySnAzFrPM87RYtRTy9YC09bbQpqaeGGorOFZo2SwUd06o+2S2Dzt
    5+VY8uR98Dv26fji+7i/8un79+jMPjQC47lDKGcew4bgCt759HDinXXPMDLTmIyjMY/Ef0AGE+mL
    JC+TuVDWUhmLZSuXi2jBFERx5kRwNts4zOlvHk8w8kj8NLdwaL1Af4weLWNGqSCnfKBeTAjqWyGp
    3iolpVqVVFOum4IKBRv2HtYhZticRcv0xNqse6pZo6iNbFeZdqs2+zHXBYVse/8CLgIj76YXISh4
    WMy4cYcQEQAAOw==}
 image create photo ::img::as -format gif -data {
    R0lGODlhRwBgALMAANnZ2QAAAP///////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
    AAAAACH5BAEAAAAALAAAAABHAGAAAwT/EEgZqr046817niBQCWRpnmiqrixahUErz3QdTHGt7/wt
    njmecEi6BUtHotKWtCyftJHJCa2upMUY1srNTrXJbhVLDouXZcyZK+Wsx7mtQP4eji5Iap141+P3
    fGaAcINrdIVQdIKITECHjFFHapA9QRqUO20bmI1zm5wzmpdob2Vznk96XXKqga2EX4tMk2yyrmCP
    gWJ4uLaZvr99vVa5QrzHxTrJyk6Xf2jAoc3TwtEsy9LVp8jWKtgt3J7Dz8bdKeF94sN25o7ad6jh
    5bfq8enyv+zvwuL15JHl9jVTN+4VuHbcqvVauA5gMILUtimM2GkWLoIStWCkZu1bnoX27kLeQ1Yx
    Ekhe/QpSlMZsHcmLf0iynJUy4caX3zzWVNnBH7+ZJnfePMnP4LluHD/C00hLpgydHJ0V7WnUBdKJ
    CbM6PdiSIVatDbm2zEIFpyhRJbOxinm2yb9rCD1YStMzrclPGMnidRjwHy29VeEayrCr3d3A7M64
    qVV4MSxQSnRCPjo5smFKrSSDCqMZ0tK5leGO6oxoMelCpi+XJuwltOgtpxllVu3Zqut5t/PlZrZb
    qW9UvevpbR18bZ7ggJ/FBjSKeHHQx5F7MS495JfqZG1jf7Uc9bkf211QwO4NB3kgMGivDoFDrvv3
    8D+AiAAAOw==}
 image create photo ::img::jc -format gif -data {
    R0lGODlhRwBgALMAANnZ2QAAAP////8AAAD/AP//AAD//////wAAAAAAAAAAAAAAAAAAAAAAAAAA
    AAAAACH5BAEAAAAALAAAAABHAGAAAwT/EEgZqr046817niBQCWRpnmiqrixahUErz3QdTHGt7/wt
    mheecEi65UpBolI3OjWXUNkTeYxaU9Ni9crVurbda1YwDkfHT4967Wk130ewdjAI0Ot4vJ1ul6v8
    VF5kcX4VfId7fYhfcoCCGUh1WIZ1hheVfYxoboRTiU4EBHt3pKVZGk6cbndVAaJsaJBAqiyyAqFl
    ZAUBu7uaFqm1rZ4FxXG4hb28jUmzwlTAWsbQu8DWyr7QgzHRZLTbacXZSNXcIxXYnR1FtObc0uNF
    463pWmvezxy601TzQPXg2jgaFDAIunnKkPxblg0WvhXnNuxDuMweOYZwrAVk94ygOXvz/9AlW8ar
    4RuLHCFWMRDAwD9+JXl560YyJphuzlQC8SRSns0vvcrRbKawI0RxOUpWkxSJZLmZMwbmImcsqSU+
    Flgh/VjJ6B+pFQfpGVWJVQZfZrHEm+TmoVhFxTB19Yh2QIEBBKmC5WRwLCl3XmIKsBs3INJvfx4p
    shM3aeDDcYsZ5qdTWNjFZNNwqxqD8N3Ja7+0vbyYMCaCdcTVvYsXw2Gvk2D6ZbVtsM0RpUDvraWL
    21jGd88NUj2NDmvdiGMLxZRZUh9lwDy3vvC68lHOGEwv00N8WuQCyGG72Fo783aMGAaLk5ua8lc3
    1ZNqR9r9sPFDhJXuvu6L0F8LxghlTf9WplT3Xi3kvQNce/Wp9oZxrDG43x+HKWhecOXsYlccpWBi
    IFsIVgXVfMYwRcZcRZjWlX7JjTeNgv9VKBwQpsz0oWghVjPTgjWdyMdDhjS2441OSLXVJY2dNIo5
    JSbpmnsg8gfjXzuVtxWVChJZZY7mQGjiW00hZRpUB4VWJHycdRgHhgAyRglWZGoZCJd3xGWiUg02
    GRyZLIrnhJimeBDUJWmx06d1FAbI2h7H4UmcftqldOiBUmIF3GdnnbcUbQPKKYiUQXw3kYPc8aiB
    p3mBGt164CjjXB6W9gGgjn6+JOBgdtExqohdOqlHb25FmeituVGnYXn//brPVJ8Om97/fa2R6lGQ
    wY3lU7A4qoobq7N+NIdZyvZYK1W3isriSSc2Zm1eE6qFXWfcvmiVb+BmYguliQ6jnq41WSWXurLO
    0u54zNzRWwbg1jsXSS2eqdJ0w5UYKyJwoMostljs6FQmTfU5qbAZFzmUsQwXGWBST2kzJ0ST3HRb
    SO8MKg+UW1zcCUfR2JSQWjSlLBwcbW3kTsUYqVz0zP1JZHNB+vS2s6RP/6TP0g45HRbUxMiLCtVs
    +PQ0kGv9pDE+SzNtC0Y6Dng10uoQEnR5EdFTtNriLtv2yomJXAbahbgiCrnD6MvbTun9efQXoUCD
    E8gu6L242Rz8HcmP46ZkD1Fidai5Zd81U3453iETjoZclxD4+IltW/U24S7koYge+OWimWKrr7Kk
    67AmUsicQFsGy+/3NCu8GWe4THwXsRzPRfLKW8F881A8Dz0RmBsxvRJE+TDQ9T3gwL3zMGz/vUoh
    4AD8+eh/AEIEADs=}
 image create photo ::img::jd -format gif -data {
    R0lGODlhRwBgALMAANnZ2QAAAP////8AAP8A////AP///////wAAAAAAAAAAAAAAAAAAAAAAAAAA
    AAAAACH5BAEAAAAALAAAAABHAGAAAwT/EEgZqr046817niBQCWRpnmiqrixahUErz3QdTHGt7/wt
    moPggEcskm65knBobOpGp6BzSoMCmdSsyqrEar8lLkkKLgvEArL5i1Z73nBPC0p2rwJDYTrP36fR
    W3M5dVhJKXh+Uop5f4ZKh4JjS4VzWGp+jSl6J44uSUsmgKGTpEKde5thkSwWrHGdBJMEoat3AQWn
    Rxe4W4axpLNHtWOct7lnFbi8h76lwWfDqcjLh8rGyDG7g6Wbx7olvwPPyYbl1rjZIxa83JPQriTh
    QcHkYebG1O9ny+1k3siS3E1Llw/fNVVHqMkTMm7VQnq78u0zSCthkoXzENoCxzDMgAIg/1uFOpdE
    5MF4sipu7OKFnMiRFKu9FKixVxROH9EkI2kvmwBl1KQJg+dK4j6S6DyFzOelJrNKRo1JxTWk3B+Q
    RosNYxYV6y2qpiwswXBnwD9RHqNq6Gc2G7pOUrcqLYenFYZSGXi93GdWLs5l6+rafTNwJ5S4RG29
    1dZ2sAZs174KvtU38ZacGqhmgOZTrEtyppJa5uqZMRyzbUMerWC2QOWVttRNBs26LmrbdSeuC4kY
    diDOmk3jcU38o3G9qndTPstcdvDAbW9Lz204nUu/FQM/p117et/db/kyF8S6dWDh3qkT5N3bJiuA
    5kM25n78eDrOX5W9dq8YTxCpw2EQXP96AH123WhzjWGQcQJONl2B0C2HXVr+mccacc4J9qA6S7mF
    1jdFDbKgaxnkFB2GjoElIYJ/VQggZti4ZmJ3AlpTlWi+kaagjSVSNqNgkBkT2n5PsWLif4tZV5uM
    2y0ppEXjhXgVgJ5F52N4yTQGVmtEegKVfwBCVtyS810YHyK6TagLcpIVOF1dSWVJImhIdqmVkZot
    5iZuTl7AoI1QqlnYeXu+aeE6WrqII3+XARVngcWNCeddklFVoKCfeXUfboZSCaCKexVZll47YZle
    Y4c6GZ4+jJI2GG9nnKqhpxZChmlO7K3GV6T19emZXkPlOFd+2sTK6bGT+inbhwDhKVj/crzd9kaq
    ky0qai9bUolOY5zhp2ySiEY56q9sOrYZpeC2d62O07wVJ2HfmkTirQVxWCIpZJUGk7jYwlVPee1s
    4MK8LI5yzF1hAdyao3BZ62XBYXhVFS0WotOVnaGcpQlMsBaDVFfMhoxCKpV6GzE+DmfpSFMiX0Fy
    PTJZ48mBAWU8hwkPwaRLSTxlnN9r4YyjMUrAnFyTQRJJdgHRHTV7B0dFW3R0z4EiVgqIT6PCjdTB
    TiSzPSfnkLPTgbAlRZivxtR1b0GD/Z7WV+u2rNcnDcyFNC0LgJE4Nscc6r439Z213s4IzkmSdzh8
    5+CEL/FMT3C4wi8kLl/ikdkYux1QaCFDu8wME5eokXmwpGD9W+DFMLJIInl48wnoTOQtSB+rL9L6
    4ISYzswrvMfRxcNraGE52cFPMTyzxetw/D/J17B881Q8D30ToITyw/RFVH8EBdizgUP3VPiAA/Pg
    9xLC+L2nrz4GIUQAADs=}
 image create photo ::img::jh -format gif -data {
    R0lGODlhRwBgALMAANnZ2QAAAP////8AAP8A////AAAA/////wAAAAAAAAAAAAAAAAAAAAAAAAAA
    AAAAACH5BAEAAAAALAAAAABHAGAAAwT/EEgZqr046817niBQCWRpnmiqrixahUErz3QdTHGt7/wt
    moPggEcskm65knBobOpGp6BzSoMCmdSsyqrEar8lLkkKLgvEArL5i1Z73nBPC0p2rwJSYTo97OeT
    MoApdExuORYmeH57eXxpOUIEJQR6R3OQS1h4hwWAikpASiOZkpRLlixWp2EDnJ2smbFBo7F8mWeX
    c61HBa9HcbSytYIuxCcYZ71JAZ3NzIKYwrfGiZilZDF9vMvOzr+4ttJ61GHZeqfZe9/Jz94jMTmm
    4gOS5N/SuPDb293EBpPzJIG7Y07WmQvJfLVbOIiEPGEC7R0U8DDSmV0JuS305WKMNIED/7dEW7WJ
    F8eNz8oJMKBKWKJcHitd5OSp3ytEIWOuCgMzZqJdOA+i5MgTxa1jPcccw5ioVyeU1ajJXJZ0EFOT
    KFMiVcGkQit9qSSWbMrMpiIvGazOyllMFzRlZZ+dnVVBmVNjY8WKvWrSrldhcbX+8nqoqgu+Qi/A
    lVX3btGZqAi6rdanrFO4iu0+jTyY7bG9hzAMaXy59OVRON/lM7wUJ12vQk3fDYYwMVjJqVqp4XOh
    8gY/X/8WXh32koXdr/EwWi6ktyZkeufM/tSlt4bg1McgGo77juanyIMz3fT3CpTzrMneXeyFLtCv
    4evqU108rPxe2JEThm/esic0n80RBv9+pJWnHXntkaZMPkGJ1BN5pmUnXnWy/RddKpZY8NR1omCB
    HQY3JZaeSgMSBUtnvA1CVIOD6DXfgtApsgxdtrHDIIDVGEdWRtvB846PjcGzIo4kEqRaSoF9c5aP
    v8AYYm3diXTkTXAp2dxEBzk531hRtliTkBsy2WNiWv4ygIlt2fcikD+udQSN0GF2JpoB2rfjYV0R
    gtdiVdZn5Jq/dSjKBuBhNiKKfZ2mxoQeWTbbnFA6qGY+pcE2KH+N+ocHZkSuY2RT7AGxn6WZeoXZ
    gn5uMZGQBmb6Xqu8BebfoeCcl12sXJJ362uaXXhHhqTiqqt1x7WH3WapNpRWqWcxx4j/c/2xmOav
    w8lYrG8c5mcsl5JSW5tzoylYKWrFDoZYndQyaG6WslWYzbLctiggi6HBxam4yvj2k6+qQhaZo+Bl
    EuSy+9J6CHZkafpXc+041prBb+7pF2VfNfMUqqzwq+yVxTD5mU3eFJxsR4RB8qsLZmEcMcSRyfSZ
    IP3M+nAoOWIYxU4vHWOWFdtd5XKnORm01XZm3cnlUVierBPSY/LDEFYrh1MJ0ElUdBQ1Q3Gj0C5W
    05N0v10vEZGKUGVUIz5UOxTQYwOWrdV8UqMjFkXzBDG2mEUnrU1BwIUrYN1TY5l120qN5tE1ef4N
    eFc6l202MiMjtXi4wJR4sMYdGWTQdsLzaH35FYYIKDXi4yinFCiNGs1ULV83FBNI8rzpyCK0X5Va
    EnUkbvMMyp0zuy0p9uvI8FQDY3zlHk27Rha7ebo8Fc23/nwT0QM9fQ3VS3Q9Ddlv7wTOZ/zgfRE4
    +6D9+E/ggD4VPuBw/vothuD+8fTXj0EIEQAAOw==}
 image create photo ::img::js -format gif -data {
    R0lGODlhRwBgALMAANnZ2QAAAP////8AAP//AAAA/wD//////wAAAAAAAAAAAAAAAAAAAAAAAAAA
    AAAAACH5BAEAAAAALAAAAABHAGAAAwT/EEgZqr046817niBQCWRpnmiqrixahUErz3QdTHGt7/wt
    mheecEi65UpBolI3OjWXUNkTeYxaU9Ni9crVurbda1YwDkfHT4967Wk138d4fBAY2Ot1uv5+Z7pz
    cEhFBARzeXh8h31YKmBOgBiCAYUDhUh0FZiZFotfjo5AclMxk3WWl3apqqqfSUB/bmSUp1psnq5F
    sCyAhFu+hcClt5GCu75OVC5kvKXBjxzFK6Ojg7S5pKTBzrUducZUFpKzVQUu2sLc0GS6Gt6T1p/n
    p2yksNByr1jykGvr3/fV8C0TUK6ZwXTdQCUDWKpSFUgF9yFcl8GfNEgUAcky9dCcwV7Y/95w83bR
    hIEABl41hJemlzZC1pZ90lUr37tjQFzKo0UsX8ldMqedwLQTnRSajSyOuFBOAKtCBm/SUOgF6MCg
    F1ZVcPkO6lSkjPiFpFcx1jegITOSXSrT6k9pbYN8nHsubhmLjagu00QRq616m8DovXtpU1AyqxJr
    jZsqXNuzF/GwxVbJDgHLmCsDRsyJKOGqFz0fzuPwsulJje0e6vr5qjTPlgBzNE2odB/Ad27iwjJ4
    a6mxKy2jrnx7qQWYIHv/OYcNqlzj2Poed+4brMdgF6DGls49A3KQMb8s/+1Zt+rRMrkeb80e5gg6
    1KmT/Q6e/WDnd7S776HeNx3rz8QAn/9v/ilmIHz0bdVJXn8cop97a/kmHyX/QZbXZb8R6JxX+BhH
    HzCsAJhTKsAkGF0ay2xIYIH2uVEaBthF+B2LLe6C3YekHaiVig2lqNwuA67XC38QUkigiFQ8iFyE
    K/Yo4Y8XxaebbNDZVZ9k2CE5yFYzRrLZlxtl+GR4j7gxoXPSpRWOdx5GpWV6S665FInCXaaZfD6i
    aSFv02XyH262wWTbZBtBVeFbF4KUm5okonaanX+uaWiNUfrJyZfE2akpZoReSmle/KS2po6JjcUZ
    Hm8KJlmaa7GKSaqgxrXPrKauCWtkarWqJl68mWUMk3KKBGVSM3D5kp+NtXPVsIwUW5//djmSUMBz
    ktwqRYlz1VEmOGztqUyAcXCF7ZA+BUTSY6AR+4wTSx4LzojCVHFSSslYlYRYKUqEDBIYbjdQdK4l
    VRFwzNQ1rUb8Dpirl4P5pQ5dMRSEkbkLU4uWLYUe1CxoBMsZCz1b1vUtxWI5xh5Cyma8jQlNDaKw
    KGk07HBZKse7WU7zhPKQzDM7xu9cXqgazbkBb9zzdRoPLUvO3u7Lrc9Pt5FwvNY+jQWpqU3t70jp
    Gv3u1ZpoIhmqLlM9UdEjO+0EH3oo4ja/TC87MVw2sN12Io0dimJVgfwK7N8+o6GXGUIITngXhh8u
    htCKW5F441A8DjkRuxkxuRK4+DD4FeU7+PAD52fAsDnoeYWAA+Co0xNCBAA7}
 image create photo ::img::kc -format gif -data {
    R0lGODlhRwBgALMAANnZ2QAAAP//////AP8AAAD//////////wAAAAAAAAAAAAAAAAAAAAAAAAAA
    AAAAACH5BAEAAAAALAAAAABHAGAAAwT/EEgZqr046817niBQCWRpnmiqrixahUErz3QdTHGt7/wt
    XgIgb0i8xYBColI3CuaayyitOYJKryyqBcvNPq3dcEkLFne1TpNnzfa00GlSbjqoB+qDux3Pz6fm
    KnBxgGNlQXkViHcWe3aBb0dbSC5JagSXmJmXjIRqkE5Vkicafx6YnXJBn1mjGaVtr6hqsmOtGJSP
    t6NBBLRygFu1tmVHuaAuvL5xoFBzkqHOzMzFxbsBvavTwmy/z5Gq1Z7XylTHT9Md4MKp1Mjjnxzg
    sOHA6p1H2F7oom3tqbX+xOVbAc3VF35CqgWzp8rawEBf5P071jDYwUIMF4J7WMpEgQAF/zxRumex
    GcOGG8kBs0JSIztj9s6908dqShWU3yJF6lWFI66aMmRmTEMtEz6Vb6ZUzEjv2oBTybI98mLyaEWe
    1wjUgTqTIDmIHXqd4mlUE6KoNAna2mQnEiJNmipoNZpS6h9LcdtykhtX7latMn22SuqEgADDiA+d
    XaRoU6KsUIkKnpXUAtxTehlnyJPJj7nJGLNgPUw6cS+9eTLbmbtJWleIb7BePnUHK6Lbfp/mQwL6
    V2zLpYMz4pm6D2TAhXsiFW3ZqGW5ix5D58uV93KvbRGvvIDb+FzP09F6fcMna8TCp6WPc6pbp6Te
    yyDqxWYeXffVmPxsgG9oFqn61EX3Fv91rVnkW1oQOVZSN9wxht9T+m13HVikFNKGVu0R5cyEHVWU
    QWtj0HZBft8wyOFIzRyhG1bNPWSeKx7a9ZOGvGDI4hr+VTgeVSsdwpoeqUWnCxl89RfajhcdR5Z0
    nDlWo3u67EjQjZKseNoe6r1Hn21nIfgHfbdktdV0Ar54oHnlyTgKmDzJAeGVeJQZJS+HJdKllIGA
    qaWItnGyZIsK8kcOm1VYCWScbykSnGnPqWmJe3JcMqacjb01m2wnrgkpZE/pwV2Qdl6zKGmNeumC
    nm4apQgnq+J3mSimajpIXs2x6pYfptV5TqyPVqTbpEr2+Wmw9fAaYlH5kXWpdE7g51L/pr0mEpdz
    Ym1CJYzIGBspPpK2Bx079OHkUrZ4fsntXFW1oxBKhJV76rnh5jTUrkE5eiwobSKEkzzKiOSurBGt
    K0s4FhLjH2XM7TtUNwyOdJe/B05JMD8SMezhrgsFPMigBL/UlFDaQMnOBvGZy67H7EYDZTorP/Pb
    yQtPRM08+4Ty8j0nycwvjjLdVPK7MKurkzY1D1nwhje7s/OmFppjkolH5tmxOTC/NAzOTUdtcks+
    z3g0GNAWHAuOKD5rr9WnKhhP2WC75jJQLjR2KYhXu+NNiWr9gagifHPyysMpRjzVKH3sXdzh/foL
    h5Em9uO4GxgJYkYYCSU++RALXk55LeaaY2Hzz50XcR7joc+AhCQilK7E6RZQoDrlOLzuOQyWy15K
    CDg8rvvuH4AQAQA7}
 image create photo ::img::kd -format gif -data {
    R0lGODlhRwBgALMAANnZ2QAAAP////8AAP//AP8A/wAA/////wAAAAAAAAAAAAAAAAAAAAAAAAAA
    AAAAACH5BAEAAAAALAAAAABHAGAAAwT/EEgZqr046817niBQCWRpnmiqrixahUErz3QdTHGt7/wt
    DsCBICjkGY+3GHEYPDp7OSBJ+qzaokKqddsaMbXccMrbFJtdWPDZTM4WSZ643NPFTt+5LmFPCPD9
    fIGCeSeEY3Z3cClvJYAWfRV7gIJ9jV5eKyNLS4ZfLkREkI5/jZUCAQOdhUpNnCegqxqhj5eScKl1
    XSYFoAWxHKB5jreqJpgqebygA76NaKcacLYYuSaMpyXKvcbQzjHRp6ZZ2CzHZYpfy1oW5N/Y7jmY
    48WW2UHN2OrLJAYu7//xTMGrpg1IszT60BUC+C9cJWrlEJZJpu4gMobupAnEFZFEQWYK/z8ahBOg
    n7+BGYed4piJ4kiFAj7iIzkiHkZy4eKxREboHM47PtGxU4QSJztU9Ei+WvhKTb2TNwvtPKQLxTVn
    sYgylJq0Wzma1RQWzWhs6rOv8I51M/TNZlGuYS/WbPiuE6axY8yuqoP3J5o5ZbuqfUaWpClLGWxp
    jJch7hi60Gh1gDYtksBpjv21uwAkkoXOR79Jqll5dGam0FL5QaV6dSrQcy6E83s2U2oiq9v26aya
    km9RjTtGDLYaEmzQN1MCly08E+5JfXanEmVD+iXBgkEHuiDqMJ2c1tueDrwdw8OH0CmJrjAg/OC9
    Ef/I9kx/dOL1ktqzHtpSj31h9AXIWv9nl1mGSnjjleKeJd19Fsx53G2QoDRIwWaYZBoUyNluu2FX
    xx6vtRYZJNI9uB4t+qXo4XAg7ldTbsvRQiFrHQbXXzm8tdjBYTMC02JnE67E2yPaBcRWg5y99uOK
    LWEwXZE9RkhfZDkSoFqQSFnpx3QR3rYMjKHt1x4kWD65pXmMcYAkTUPySFVE98noGnG55YYYgW7W
    xhOB05Fo5HMCUkfTJEzytJ+WkkCYoZ9Tmmdac4Ye2ptovwGHJHd/6GWMh+xxKdBkPVoqH5CQvtnp
    alfMWdyoQRR6yH1ajeWii9F12qqrfyVWaXkh2ukZcbTBZxt6sTmYpbHG3YWlI5S2Ncz/i6fSB9uL
    ML1pm0rMNuvsBsttWpi1kQ6lkkMSGkMmN+KV+gkhxX6V3HubdqFXX17FKwxA3+qZl11RzYUuW3Pl
    KywyZuF171NNVqvvulANFJlmVj2mLlwL0RvvIk4Zcg28jeDCn8GIKQwLNyX4xDExFHrTb2SGyERy
    TPcgTHBAAiWXggFeiAQSOi7XO/NiKr+lmc74SETFySw3G+tWTOkzkUfb+PyYcm5FZYJJTrsC9UtS
    +zOOUja7JU/WMJks2BBo5zToUUYVRjRWJQ/8KmmfNjYYIW8rLDfD5HYMKAcn9Kz3xc7RzFh3f0NU
    8hLcbNIE0kilrFF0iKvTSVD5tPL4Xoof/5Ztd3leRY4WR589xq5/pE6KDHlQUTpfxcb+XSKvr7EG
    40jb7sREXeluBO69+66DFLULb4XrReRufAuOS5HE8rtr3hkF0LOBQ/Vc+IBD8NjzFML2socv/gsg
    RAAAOw==}
 image create photo ::img::kh -format gif -data {
    R0lGODlhRwBgALMAANnZ2QAAAP////8AAP//AP8A/////////wAAAAAAAAAAAAAAAAAAAAAAAAAA
    AAAAACH5BAEAAAAALAAAAABHAGAAAwT/EEgZqr046817niBQCWRpnmiqrixahUErz3QdTHGt7/wt
    DsCBICjkGY+3GHEYPDp7OSBJ+qzaokKqddsaMbXccMrbFJtdWPDZTM4WSZ643NPFTt+5WYCwJ/D9
    f359gHwqeYZ2d3AlQQUlBWUWfBWTe5KUhyeZaF9uUmlAjpBLAoOEp31eXiabmkpNS69EnqQBs0So
    cIKadV2dt7NwHLM5qautrMglssDBpYgbhaXFvUyiVMzNkYbPMcXSls8sI0uxAqPaodMW6yPe64KX
    4ivkzeLozY7e7vzd8JOL5iH6Ze5cugH65h16x3BXQGXCDN5KSALfrUV5FvorliEgPVDb/xjZw7iM
    lT9xtoJQG5fHmUCCeBSu2thNw0tOIt/cdHmS20ZbQAcAhTjthM6bXzjty8SwFDB2LH2lwHPBY8mm
    04hZHUMUogWh1DLSfFhBKJOuXbliABu2ZsZ3wlLO5Cp1WVmOQPaRdOuKLdSPdVWZFZaXY9FUD4UK
    rYTWFztvZvGyBUhpV7EBfCbPxfnRT2SncOVamkRoIeah8qKOI6Dy8kLRpEtnZA2UceNxhaECRdna
    lMNStMFirlSNnt/dcmsWPgUOdG5jxRFVUul0cPXFslGKLjv8Nj3Wp7lDzpvV927CfnF5NwQE0PGs
    YKehkrwW8+L1Y4ZnjqdqzvavuEgD2P9qgmhWlQkHadAedpu50gUgtpQm4BBytJNSEBDi5wKEmk2o
    CRGvcUdbhhpqwqGErbBD3VIRYshficmcaFtHa/FTI4nWDcSSKRzYNV9ccsk2VHT5YXJBLsJkFk43
    zL1InmrG+dVkId/Udsx8l5w34EeTcehXktkBiYGQRLrQpZI0omZjNCPGU6YrlYFnH41N/MVKIJ4N
    AqNdetr3HhwgfmfJXRC+GaNnIPr31Z2mYOchZ9Lt9xyA2sBpZG2/6fidnJP+FweQebq3py4tHlcY
    mBnCt2aEiI4KXKLiZeRoge6smBt4jzpI4HOn1oQKdYBG1htAUEZ6QV6fATffqeNBVqP/oXzmGZSA
    vk33pLNiPrklNJgoRq15g/YKqGSnQUvqsXvkyONo4mH0GasNJlPHdOmGleqlvWK7FFLy7miJYish
    1o+qshq2FaRqfTXXY3vVGh9oC5tLsFjHuHOSwh25IHFKEFtMElwXozbOxsG29vFNHP11VEnFqvXU
    WHzWhEIZvCCoK5dBDRnayIfwZBXNRfFsU1MhXpUTKSz/YpdUFw7WlkZ7wQQGSNikZaEqMCskTjqO
    LGKROvGyPBuVWVMskTZdZxOL1Rzx99M6cMfw9SxpSy1E2Bgx5jZDVWFwNtfPlFNnWksWnrVJdl+E
    xTVF4K3duRv4dFBB244RLTjE9Jh4fDCuMuWQb9pQTUudnZTu+Cb9CTJlaXc08nfjpa9d14aXVmI7
    VK5XRHMiTEQ08hjM6Qnh8EQh3vvxpyuqfIUiIV/8GkfU8jz0RkQyPfU6SI+9GFJUvT0XVHj//ROC
    fyLC+E6ULxQF6LOBQ/tc+IDD9fCjEcL8y+ev/wsgRAAAOw==}
 image create photo ::img::ks -format gif -data {
    R0lGODlhRwBgALMAANnZ2QAAAP//////AP8AAAD//////////wAAAAAAAAAAAAAAAAAAAAAAAAAA
    AAAAACH5BAEAAAAALAAAAABHAGAAAwT/EEgZqr046817niBQCWRpnmiqrixahUErz3QdTHGt7/wt
    XgIgb0i8xYBColI3CuaayyitOYJKryyqBcvNPq3dcEkLFne1TpNnzfa00GlSbhYY2O/4fH5+4qfg
    cX5jf3oDdYeGiWWDXk5VW4KOf4iHBAGWmJeRjCuPnkcuSSWZmASmp6ebcqqrb30ZLqiWHJ2LaqxB
    txqvGCqLh7hgfnNug6CboH2GwXxbjGzGub1ILstvxElfxdLSR5+EtmPaQt7Q3Mly0crhrbTla+nH
    aupq1o3ujvDnuZzoY/a18k0TeKzXPmxP+NVjF6hgunwPsx0kxm0dMxMFAhSYF0oQpIlf/+LIAeir
    mRWPohLK+8OPGMlJrugcbBkt4UiGOGVAUplG3hdrwK7FLBk0Ik1nFoAWDZilpCECy3YeDfK0AlBL
    L0MNFWc1addd3qIq/Sq0qThFwKpSiuoVa5VUWV/FrGAKQ9Wnsy6gFfvW68Wml+x8BVbJFB67mq7C
    xclsQF29X/FCTerYLVlNfst2guq4q6K7lzjjqbtM8eK/mydDHsxWA+gjeQ0y7VTZcx3BpaFg4wv7
    tmDGb+zERpvWZsvcvcUK1uyLs+07lQ7to3oZqyGq1xtlMQyZt/SH1C3TjS1JO+3Hn6HnVniEb1RZ
    omBu7+yVLXLXgzdwKvmGe3H1nhVyn/9s8WnlBWb1+dXaaonwxh5zLHWTG26BWZBKZJSR48xsRI3z
    W3Hj5dVZgyDSZJ4vxhBGIWEZ3EccXRvydyBCiE0m4IQrllYXhC5w5ReGG4zY3QVQWcIjL6FdSElX
    D/4H4DLcHalLPo915VY/3r1Ym5T/XHebJk6sdxBoT1rVGZcjfVhVmEw+SJ2KLDqHpiOHGcmabmcF
    +Nl42XE4SQZ2RrcgYnfqteOJk0i2I4aG5UFaYmvRJRxqThEZVlvOWXXagKHFdcs1il4qnpnCPVro
    pArJWMt7l2K44KOjhkbFnFYuKmiLS1o24Um0ssjmZRy4WCCliYL51ZUOfVKHZSgiGor/UlGtksy0
    ebJD7LOtxnPOSp7o1GufPFE0kz9m+YntM6nOw60uZZhkEqjvkjFuu79gpNGnXvRZkzgzSWsTOe00
    BG+P2uw7ThUEdQNWYx65qe20bSgMC2P6agtev20UtPDAfTiMccQHA1Lpn+X0VBFBu7CXDcME7/QR
    Oua4i++qDTdjMLsppzsMywZ2FB8t+8lXiyodwOdzjOn2rOofssBHytEtf5PTZpqQEmkkSMfjsjdb
    vbJnentE2KNIIoutzI1o48KRwCJ1mPHb+rQTkhlmaEg33UipfXcPee99Btdt+70EHAwJrtPWQYhg
    uBJIXEDB4mH4oDjkV0hOgd6UlxQCCQ5wd+75ByBEAAA7}
 image create photo ::img::qc -format gif -data {
    R0lGODlhRwBgALMAANnZ2QAAAP//////AP8AAAD//////////wAAAAAAAAAAAAAAAAAAAAAAAAAA
    AAAAACH5BAEAAAAALAAAAABHAGAAAwT/EEgZqr046817niBQCWRpnmiqrixahUErz3QdTHGt7/wt
    khiecFi65TTE5G4kYDZzymiL6XRKr64j1IrtPoFbqLdLDY/H5aLWw25zplo1cECv2wkVQnM/Evfg
    YHJPdoR4AXp9T34pFoyAihdATYQVA4aIgVxZjSeLnWGce5N1AZaXfJKeakEmqoKtVHN3l4hioZuR
    rY+fkrJ0BKeisCtIuixWt1sDlYaHYDEXeMS5xtOrVUXLpnmYZYeLjeHYx6Djpb/NesJh0tdvwiqx
    4b3n24eYRWrtkB7wjNAb+Cy7x62XQQvt3EAD9KbSMmAIDSoCggcivw7+slycxw2hOlcE/y0GAcjJ
    VaAvAA96pAhKES2S9MZZK1EgQIFqLvVtefaNICxPJr+sqrZyULKBeTryBLcr3jNgTwhY0nbh4S+C
    32QE1dTJJb5DpqiGtQQNYtaTOP/BSapBqilgbslGq3jEbFqN5MDSGal31sJS36T1tChRLbm9pGL2
    7AmGqmC4hAvjJWYH8DI+feCSrBcKIcytWyHjIcVRquBJgCv5gUa6KSPRo6n+1Txor6GBE88lIjcF
    9m3Sni04vi18by7QU8TeI17ZofFSxDmvy8jrsGXAZutRqmoWqbeFvI/JzgDMe4aB9kLuBj9zGnpC
    A8tXVQ1ds7pmI1270PbcOVbhqb2Fnf8AEO3DXjygPTeebeYhtY1xkLGC3DHNKPfeYtfVZ9lDJNCV
    T3jEdHeeY+gBSFZ/zmQnWXUhEsiNZsV9Yx50G4Zk34GGteiiOgTGllpVDUZDUYfUIAhHhF/g91CB
    miGmWzd6FDhhiPe4uIeP/C3J5I/OZAajfp/kQSSRAGKAIn9VEnnflE4FZh+WYHGZVH+iibmPkcc8
    FaWZVtFn2Wi6makUiE6xtKaT8qmGlI/XjXdnjoViEOGTUs0nHKMZBgqmLltUtKeWDnIJEXD+XUao
    IxusCVmogdoDX4lsopqKmx6xqkF6gpraXpslWZpocfB51Ghqm+azE2epVeqcg6TEN+r/dcUq5h99
    o9LJJ4SwxepCbZ8li2wTtAGEZrbR1nbZaqGeCy5ZmPlXZ7mfNbMKqeCKlEijiZ26bRHvykhsVMEd
    4Yum+nZF0SVl+ctHeYX0AaRc2hoMBmG0RlOHaFe1VSSkjrA42GPoiFVeQj3OU/BdLrzkFqAmmjaC
    itQNk2eYVJilpC30dSivRMls9Y8tNh/HrxM7S1TTTa8UOpEo4QTtcKc5ZLcTSkJxZUx+I21JjM7C
    /hWQ1ca6Ue9ZyZBJkHEbOTxF2sUs9mEvNhPXbgZCba3Q0FNLEne+ApsMtrTvsJR31LXupVJnPj+T
    myZuU703YG+zUrfS7lApDuF5lPj2idJoUb7RrnBzU9mHXP3tTzE/D7P36Ewznrg7f4O3EC1ZmlqO
    GTP/ZLraV2a+rLqfT95xmFrdG8Mlr6Jddxq5C5HS7Jknbzvuuytk/d3Lx3EGGdQHtf0S3X+PRRXa
    ix8F+Z2bTwT6wqvvPN1N/OB+EhJSML8XPsh///kweL//NCHAwfUGSMAPgCACADs=}
 image create photo ::img::qd -format gif -data {
    R0lGODlhRwBgALMAANnZ2QAAAP////8AAP//AP8A/////////wAAAAAAAAAAAAAAAAAAAAAAAAAA
    AAAAACH5BAEAAAAALAAAAABHAGAAAwT/EEgZqr046817niBQCWRpnmiqrixahUErz3QdTHGt7/wt
    koNgkEcslm45odLI3I0EQ+CgSZ09o9Bpdau6arPc8MlbworDZOn5nAYLPPC4p9WOxgKEvF4fCObu
    b3g5PXRJX3YkeHsVBH0DgJB5gypfJpMpXkpaf3uLfkd3jJcnQi6FZUuJR4uCn2+qFo2UqUenpIiJ
    nY19oZYXsicFmgWWtrequZKtj6NvzMAlwpoDxMgrT2Vjq6yPiSMXzIIm0sO1LNhZlYOKop+h737i
    UtOlr+eD5NX2b9zo+46xYtCbtq9LDnJBqnHa1chdsURCRM0baM3gxHoLlXUDZM3RM3z0//Q180UC
    ITVYkna5W/fEo8SSIc1dA5nQHDuAFccoeSnApL6CmCbV61jBFS9QdxrGg5bODFAXlyoVxOmtGzJB
    AOWhkvp0zEiZVPntmsTOGc9spu7RgRjuGx8MkgKdPWesizNmct8pUqZXK1Jtau/Fe3XBFzYLgZgy
    2vVwJp2VeQt7fcd41WJIdTE9klX4GwfCPPfGlZsZqkQMoD0jXg0tYC5/UAsJ4ryasG3UN72Kha37
    3lhgq2tn2I3YF+Ov3uioFNU3ePHZnpG2LD35I9+xwxOfru2No2PB7S4X93q9b3fbga99LJqYL9yx
    m/UCD9SV5D2szKb80sWwKNb203lnkf9v4fUBBVYZvKXfb9jdRp0lv/kHhXb7MbdgI3H18seDtYTS
    kIELCrSYgge+lV19oMgWUDf6ibMefv6NdduG6dkVCXshHigafPEhOBxy9N33C4gUbiAEAfH1OCOQ
    vBUDSSsTLkOPHkr2qAGH3SVoYDtUDuRiid+g991MmIXXEJLxbMDYFFZKNqaNarYTTifsffmRgzVi
    ktyTrfiHoEr8jKBfm02mSFeW+zWkI51bysImL8ehmNyhGu4W13ru/Tcoc34FtRafN8G4V5yPQsoc
    lniKpx2m/BWWH6eoVhooa7yIl6AyOsIYa2qIzpqbaTf1iFeepoyn16yVccCgqEwy2ev/ntD1ugGF
    dxKrzamGlfVjXqT5WtmbQWV4yWWROQhqoDJaaxwnxtJmXmfl+hhrS3RaFmYH9HX24a5J9beuasB2
    docr4KblDa72dsutdKANpq5M542BHWUmHlvURrta0WCosYhrgVEZk+LCcrsZNtpd64S8lcQXv7TO
    sCg3BkRv19wy1KwRuXuEVVmlvLKhNUdTzmseWaUnymXtkw/QdsE0jUgqGXXYwNZx5rQQCjl7tRJQ
    X2x0ygOPOF9TGGk9EEZRf+2kHwyN7dOkNZ+9BIIEj1vrIjItDXfTcn+BXzikUY3VyUKZUag1JtVk
    b60Am7Wjz2gxfXRPMUEoIVRsj+izi1N7T0451yOjluLd9SJzc+cGX9SFjDQC1DbhW2Fx+FOnsxwd
    WzvyYTpBQQYt8jkZ3pb547ujgjpgPUT6B9v8We2GG7PLIf30dWwC5Bo8YGHH9djroL313XPx/fHh
    EzF+7+Uzcf7s6c9ATyI/tK9+Kj5wL78OPsR/PxX5U2D//kEJAQ6oR8ACfgAEEQAAOw==}
 image create photo ::img::qh -format gif -data {
    R0lGODlhRwBgALMAANnZ2QAAAP////8AAP//AP8A/////////wAAAAAAAAAAAAAAAAAAAAAAAAAA
    AAAAACH5BAEAAAAALAAAAABHAGAAAwT/EEgZqr046817niBQCWRpnmiqrixahUErz3QdTHGt7/wt
    koNgkEcslm45odLI3I0EQ+CgSZ09o9Bpdau6arPc8MlbworDZOn5nAYLPPC4p9WO5lajWM4yIPj9
    d1Z0SV92LHlviXwEAYBlQQUlBUJHg1JKWoFjFm93i3+EQpGTS4mHd5iVXYymngF9jaFLmEOaLraU
    preMgXmvfaxZtMO6XbZux28EA8cXwLLDS8lH0yTNjcyc2hVBjtHE1Z1So4Yuy9l6vnywAqTfkMUp
    I7OUthXnnibpr3fu0ZHxbgmjFRAbO2v6Oj0h4W8YwHDzohU8F6zYHk6P/qnCE6MhPHsU/y/2Urhw
    YKqNxi6V0mTQURdrF0wQS3gqIxaWIdUdCYZBZimaHH1+iWfw3p6dFTNklGdJ5pgxy2LF0gdooQYg
    L2seghqDl9R7XpP23KoVzyYCyiz88TrVVUlfKOVB1BdrmQC2GOx6RdmIkUuIc62tbaSMLai7G6gK
    yVc2q1qjdvt6q1rS4rK/Tc1KXuvXz5RXoNIhFH3BkZ7Mxh6DLR3a6OkjQSSrDriJDufBIl1LpRv7
    cCdWgAfpbksSMiJu6DAWfh300O2qJGH6ffKL2eG8RxvLna5bnKLdenovfsPMO226tp+f5neRlzXx
    fbKJs4pabt3uRQWvh49OEcLz1KR3m/8vnpWH0S8tyYdIK/XtUhqBfSW3B38GUkddg1ANmA4vUfXl
    jHXxGagLPwDCNAiHe91jXYey8YOPTsjJp505g/WHTVGG4RXbPrQEd4pRsSmConUtAiIEcORhUplA
    zhm5428R1nXkOq0luWNFKTkXY4WS7WgQLIw8416MsmHIm5JCLlYVKGGuuR+RymWJR4++eLnaY92A
    xuNmWMo1yGL7KJRnNq09A8s+bvqoWXmjJXkZgmrxcuiYfLrUnFkKwRTelEEWJyaEs834FIN1htSp
    Nt1Q+lyfTGJ6FI+DijiVo4gat2RtZM2XTohhMuoaTLKuqmhW8xnIqazgmajafcMylVb/TLKNB6V7
    0YE1oJmVeEjNh8cxC+2zw2E7GrXRyijdshauyiqumn0FSqejfbUZa+g264KQbM3XyoaexQBMZ9fa
    O2qEWLIU6WeDQcHdXiWaR2x1BWuAVourIZbwf5c6BoilI96jMAdogfmWuB07HNO4rFHGCrVxtUps
    asq5a5haaY2asbMoZKKUphxL1SZLJwzlMM5CbRuzpXtIehBKuZiYq01DjTVrpmrlafNJQ98r1E/F
    YUyj1TTNdCtQJnHdUy/UhXSvRwNEMvZGbDcdnUU7gZ3QN1mPGrcodC2IcUv2lF1PYHvD8542QP3C
    ciX01DJX4XwXBa06dofddjt2zPVOmioR2qiOns2Q7O/muUQZJ2zrmmJGgFuRXnqBcFGzuOVC5303
    QWL71R+pqeuC9dv/YULOSmvtruvb0GROR0YAYX7Txjb6BzwhjziNKQ187r5eYFgo/6Mc4IOvxvjA
    r0FE9zqbHwb61qtPBfu2u88D/OXLTwP94dg/g9g/6M/EST7In/+cgIMBbsEHOBCgAY0RggSG74EQ
    3EAIIgAAOw==}
 image create photo ::img::qs -format gif -data {
    R0lGODlhRwBgALMAANnZ2QAAAP////8AAP//AAD//////////wAAAAAAAAAAAAAAAAAAAAAAAAAA
    AAAAACH5BAEAAAAALAAAAABHAGAAAwT/EEgZqr046817niBQCWRpnmiqrixahUErz3QdTHGt7/wt
    khiecFi65TTE5G4kYDZzymiL6XRKr64j1IrtPoFbqLdLDY/H5aLWw25zplo1kDWqNwWDAKFC6O9t
    cGByd4QmQTEjeX16iylihoFPQYSPX4hHeIx+fycWjpGSVXOddpSKfJyGFy6gaph6j5eQAYp7jaqT
    Ra2DiKmWWQO1fmFIunSxnU2+tKGhwbCMaxvGK1aeurCGA5LctM+20m+FKlWrYMNF21u636lto9Xh
    ZeDphWLep2DvlaShh5pHgtmDFCyPvDf8VPlb1WuLujXanh2cllAOQmUOv5DD80yfp0sM/yPZKWMO
    JMh0MQpKG1WyVYEABVShY9YSiEGON0nxqyjI1SwqD7O52pNSIi4u4xzxfDJTHVGifGA1UrmUGrml
    qP5cWCQVGtd7/ARaVTqFW6hNGIZpyElColisWJvk6SZ1E7gyBRW1reUtaZayXutEA8dVX0GMOdw+
    3MUK1oCvWdGCzIuY6F6bcOE4fiyYsGULhxEDpERg7jHNe4JBtSD5CWWMBgGC9EX22ObCWQVT/rZh
    tdB4qItClaQV395TVK8Bof3XNlHVqxtVOJzct/LlmZ0jUs2au3GJrFOrdMG8n3bhT7lTv8Z6kpbS
    2eNlm/7YlvptsXGJNwk6/lVockEXjf9AoPXU3lbFAKfdHfh8FZRHa6Q2WHuM6fRZgHmBF9wwrZ22
    ICILudGbZOUpdB6DGaao4oqxhYeUefJpRddJHwlGY2TmKCifJsPVeOOPIQ7nYTyQ0cfikSmCGNWL
    JlbzlGQiesCgaBXKxOEiQsq3opLQ+OcIVLZIKKR7iYQ3XkNMDrLjgWz2lF87jJzZZZUoZRDgnK7g
    pwh3fRiFp47kcIaJP2NOh5Me3vX5UJZXTcEcPnxdIBBVpQmK6Fx/NkoHbb2BNqlEYW5V6ZJekgeW
    p8iJlVyXWxHIaG1OptXpp37KZuYpafYUa1oOCpVXZ2q1imupnQjKYLCcJMcUYWnxlqv/RtXc9FZg
    OOUXWbCo5EMsLoqdU5S1qHRV5FMgDnkVnGKJV2tUdt3FEKZ0jtKtGi2K6huUEG1rlVj9ZMAVs9F8
    pFa8fp0LKsBL/oHpwOZ+opM1xpFqyHCmfYRLkxtlUYmRrq3TzMKFlfBSTGpmXFNJv5o2Y7l2/pIG
    HQsx6N5hFZVZhIwIxSUiGOP59IXK84UoGGBu8EwgJHN0pAxuFOlcNGxKw5PSFndB+HI1VhcT7tFS
    Z3JzyP6U7PA+Xcl5ksoYjXPds8RMs3RU4Jnk9c3ljsX2UbnwuN/GbKUdR3NY483FYBKqTUssMpqF
    scN4k0duxXNcx5Ir5ZSlseNoqSOIXizJUNLy3YyrcSVNXEpOia5XZywDjo5NOXTglUP7X5S0Swlt
    6mdIEfuzuS9hhuy9K7F7VcHTMHzxuv/OO/Krf/4D80m4RwH0XvjwPPVRWE8B8dhfFQIOtYcvvgUh
    RAAAOw==}
 image create photo ::img::tc -format gif -data {
    R0lGODlhRwBgALMAANnZ2QAAAP///////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
    AAAAACH5BAEAAAAALAAAAABHAGAAAwT/EEgZqr046817niBQCWRpnmiqrixahUErz3QdTHGt7/wt
    CiOghUcsAn9C4cXItOVGwWBzuorGrNRsCovVekncZ+6rDYPHLmlxSDQnt8t1fOdWlzTtTE/8tp8x
    eYB0fHppgoOHTmd/aCeJiH4zkVVQlY0sQ5mTKpuGHZIel5SGjqGdSqE0dommp62icKVsjB4tr6qN
    j4BXc3+yUKiwsYuaJmxiub1KYL6KwYWynNDRebTTtHCP2HvW2jJ4ZFKZy4GnRn6ziMvpVOjm2Z9l
    wnum8vL1We/Zxq3885j/pKXbFcyfvlL0eh1r1o0bJHZ3JoHTcTCit4vXQJULSAmiRie8/0KCXFfx
    ID5bqXDhOikw5TeOzzigZAlwpcuWtT6CGufN05WCKkcCYfjyCdGXcmB2lLPxnLKgZKKmkUqVX9Wr
    Fa86fOjUI9JATbx+XcmM3M6yYoftBNbz18+2U9fm7Hizptx4dOeitKkXXt9RfDfcnTj2rCalh83q
    pPgUZNZFDyNhhCstodfLGQsHRrNQMWGojAcuCamGcmWwFm+mtduuXz6lResyeQzw71mEXhKvXoo7
    XGPDZmnH3u2zEO3JjbXlFI65p8flsDuz0xWFqKU32IcPpZ6MpzLqmwXXVv0d5q3xesEPFp8X79Hs
    M923/8za8HWyiZ1xTbopTpfQv8X33FAufEQGW2oDElMggMQVJ0odB27T1DCVQEZPWP0RsqBW1STx
    H4cOVQgfiM6IKByIEJK4ES9gIKEigMRQ8GI+OMwYFgwR2vhCCBS84uOPoYQQAQA7}
 image create photo ::img::td -format gif -data {
    R0lGODlhRwBgALMAANnZ2QAAAP////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
    AAAAACH5BAEAAAAALAAAAABHAGAAAwT/EEgZqr046817niBQCWRpnmiqrixahUErz3QdTHGt7/wt
    CoMBKRjkGY+CW65IJCKftqWwCBRCr6xRdcvFek9appX6LSelXLLZG56OrSn4Va5rp+kl51wdHbr9
    cU1QTXgydlR8VYRIhIkth4smjXo7k44rdop4loUynHU5M5yXK6OdKVqepqcoq6wmqUOlo5W0NLGU
    rZZGn31+uZK7PL23UpG6x3EskzttySfP0KSar6jGgrOs0cHV1nnYy8uN4Ua406LCZbFAe8xm6+3p
    bKFYrur09bZf8DSnxK1H+Knq9I9bOXzogH3bRq0HwhbukF2KWExHwYUqLmZ5mG1cxo4M/1UIDKRR
    XElvCfUNVLmxhqlaJ11wzCjPZc1HM0l6hLlzxkiaIVcqxDkM3JGgInNmy9dN5tEvTZ2umYqSqlUS
    P69iyaoVCteuSL6CPfjUS1QwSoEyJcvzrE63Z9qeM2nUZ1puPW1SNHR3Yd5+N1sCjvn2L6a+9gaz
    PKw3MN29ghWH9Oc4qUXHQ6nVJXqZoWfDkRsTBI20amegpOeatghyc56AfUWDDhs7JeFmtW3Phr3m
    tie0vSsPhpX7dWttQkuIlabNNcbjWIsHzfyLlLvl1amzg17YCnbfEj9T+i78uHU1y192rkxHbGLd
    kC1L3t3d+WqI5VFHw0aFfHyhdY3TX1Ru/8GnCyADFqWdbYEg6F1xiqzV4BYJ8gLVLA5GN9ZRb3CB
    3YbfZBgXiLWI+CGJiPwxIomyefgDi40B4gOEMIKBQ41hwUAjiS+EQIEHQAYpZAchRAAAOw==}
 image create photo ::img::th -format gif -data {
    R0lGODlhRwBgALMAANnZ2QAAAP////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
    AAAAACH5BAEAAAAALAAAAABHAGAAAwT/EEgZqr046817niBQCWRpnmiqrixahUErz3QdTHGt7/wt
    CoMBKRjkGY+CW65IJCKftqWwCBRCr6xRdcvFek9appX6LSelXLLZG56OraVm3EmTD+m0dhpelTfV
    K39udjN6VGSCg4QqiX2LWWiHcImULZSNhZF/c5ePKJ2bmXd3aqCeJ6Z4LVoyqYCfrnk5M6m0plE1
    ta23spx9sJe5nTptYq/BpJN4yLiOoaiCnE7Ryaq9zqfO0tPU2j1SmCmqrnzWzdh84tC6cUis3jrk
    X++/PPJss+1H7Fj0UPxX/P0bVkbgwHDz8u1CNK6bI2nEFLKI5vAZtovXFvqpWIqiQ0h1/2KZSHdP
    hkFgvAKJNCmR0UqXAFecXJcSZk2QIUHZ0plRI7OJN3HmrDQUIcsdP3d+PIp0qVJzTJtCLWpkJtB0
    9l71RIoF67k1YMG0DLvGKtl+Y88mROLVnru0lrTGkxt17tSnVeHavHs1m9CifvcGTmF2JMGnTmXq
    NcwzbuO6jg/3Tfp3smRxLyurjEnzsWbBlDtfVgw4KcnMpBEraljOo8XPgjFWY8xtsInCEJPRZq2M
    LuHFWY2iNeM5IHBhxZ/gLp2YlovjqolKFfulJHI1yz+JNh0ZT3bGuyXfRfZ9djVjhF5vs1M+nOtl
    TslDPw+fof2lG6lkTw7aU+0Sy3GGUntoKgQYFGb8/caccNtJt8px1iFYkx36QYhag+5tUuGCzdEn
    nSRc4NYIg+GtxtAoGwImm2UrgpjiULkpFeMoW7yo1j5vhDjfjbCgaEV5PM7hIwlABrmHjkYa4RGR
    PyQpVY4+7OikTDhMCYUPOEhp5QshUODBl2CG2UEIEQAAOw==}
 image create photo ::img::ts -format gif -data {
    R0lGODlhRwBgALMAANnZ2QAAAP///////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
    AAAAACH5BAEAAAAALAAAAABHAGAAAwT/EEgZqr046817niBQCWRpnmiqrixahUErz3QdTHGt7/wt
    CiOghUcsAn9C4cXItOVGwWBzuorGrNRsCovVekncZ+6rDYPHWyp6Z06qhkx4T+yWnjBG/PxcX5/1
    bBl7SYJ3G4EagXxKfh5OHDp2LR6Sb5ROjx0zlH5VnVucnyWhooYuoJyToTSScqOrJmukrGiAf0NX
    tq6CuUubY4mxcGJ2usO3mIy2hp/BLpW0t8uvrtK+wtXRyteZzllSUG6Rl2Wy0L+O5cxEs9+liORq
    7+Op7nnMuNt3efOW5lHIsBU5pyobNU8GZRBEyI0aNG/aujVUeGgcvYroMP6SCNGfpogU/9MV/Lgx
    o0iPJ1ksxBYPJUlVtOoxTOkpZr5CM6/oK5kRTMCRPhklm9NP5cqaRI/OZFeUjDynUJ9FnbqIKlSl
    zxKaZDoQK8KumYJORPXkJ0Wb4XC6BLLzrMmXZGlaQgs3a0ujdCEZlQkzr9qcHZG+DWxXL8/BY11O
    w3tx8d6/bhs/HEuYMTxRWh33JYpPbDWtm3vgS7usqVR3fJt4DXk3jumRckOaKhdbtjAvqTfmevWl
    NuAulwtPdKx3tcC45zJX9OqLWC1uzc1uA1aUV1slLEk3NOYX4r/Wn6vD+h24kfjco+vO7Z44feXT
    iDVn1xia9Xv3w4fRkQwaeTZe+/HH1ElibRgnDT8JFfjaQa5hRgdwok1RioJWucYHhBUqQkiAGWoI
    BYcdJvNhVSFKVAcSJYZFCAUpqoFDi3HAsGCLL4RAASk45khJCBEAADs=}
 
 image create photo ::img::back -format gif -data {
    R0lGODlhRwBgALMAAAQCBPz+BMTCxAQC/Pz+/Nza3PwC/AAAANAB344A2hYA1AAAd9gYAI7rABYS
    AAAAACH5BAEAAAUALAAAAABHAGAAAwT/sEgJqr046817nmBREWRpnmiqrixahUArz3QNTHGt7/wt
    8sAg65YrDY7I5ECgbDKbySf0KJ2eRsZpVFvlerVIE5akzG6dTTOyS02Tk+IiAR4g1NFnun2u7LL3
    d2ElY3wDdgMGA4F5fwGIioVrkmWOiYtxJkeHdY53kUxVc5ujhluhhp2khoNymgQGe7CGsFK1r6Kw
    dbK3tWu3s7FvmFmjqaWSp8WQx23JqcarJIRhlct9k3SPi9iN2oXDb5qckW151Ht42Ofb4OSi6b1l
    zNzqmvPRBNPy12Hm9vz/ysFxI01OKFnqfiVEKBCYOYVU2i0ZWO/exH4VyV0MOFHixngD/zWC/GNx
    pKuCmRpuXCcSIMt0Aj0K7GappUpU3uDBYZUSWchnyz6tFAXUk6kyPNXM/HVLFy4CI5nmkgo1Y9Jw
    zX5CMibU2dagR3eiVAOSWk6ANK0xEpuvlcpG6FyuFBfXnxSPJuXZ/JimJD18005lhClU78Mt7Q4W
    1sRwaGPFDx/LxHh4sMvFlAWNxVpqb1l7nge7uxoJ0N6bpmHORVUXsFucNXVSOrt2duyTbVMqM+qz
    3+53vUEX5eORxNRdtLhRdQosKvJgxEmL+8obNU5OYC9fVyXz0G1/ttVCSXtJ+ku5UFKDWa0etz7f
    sq1YrB0S6WaNpzWKBYOZo3uDcDwWoP9+AgjACxsOLfSJRIJZp4VS+1TWBl5/1SeffqDF94RMfqQx
    Djbt3fWhXHeZN5OHZxFXTSAq0lahaz1l5dtwJtBYwnDzgGJfbhDa8hxzy1EFDJDJoWaicj8K2ZSS
    xz31GYxK6TgjdSfYSAKOXe34Hl/hsTjdbS1+9yKH6IV43kbt1VPifSdah2FnD/rVJoMUOWgFZxEm
    hBhpkCk4nnEkIAiRYwse6d9Q/OFZJ3sE8cgZcPSlN9+LGbK1ZZo3edjaFHCxY6J34mVqlpiqwaZW
    cViCRxSVcgrHKpTCLPmcc08RWdVSScISHZvbcRWWq9hVN5FXwe7q6Dcrhtalstl8Nxn/pnN1ehp7
    I/4XI5xoiaZhX6PxumhD/bWaY19aAhiGgOdiNmif4EomXYOMameZhB2Zl5eF9JHE7IYmdkjJptFq
    us1bmh0b6ZehctlswmVNNqxWxY5LLClZWvoakrVSReuQGlvlrYzAUvxrZ6kGZy1ZGSUb36gMJ9Rv
    mdWqKfC0axqssL7bGpZtOXRmRpK8btLLRGIDRqYuuowdXejHh8L7s9DkWnwtpBXivDOj3dpM18AB
    /8u1v3p46i2oX6fsYpsLl8frbxJDLLLJq0YMa3RNNocxx7PeLWusa5cMMsmsVhwyNN2pfDXLZaNm
    +Nxh0zyzatJKrVSP4xFUKnuPGsrpNRfrIShquSd0LjoYnle0Yz4/CKH66j7IsfrrOviQOuy0yyA7
    Ba7XrntbIeDgwe/AB99BCBEAADs=}
 
 image create photo ::img::s -data {
    R0lGODlhDwAPALMAANnZ2QAAAP///////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
    AAAAACH5BAEAAAIALAAAAAAPAA8AAwQkUMgpAr00aHy155IncmLZlWaIouo6unAsz1ZtjlVrYR+o
    75MIADs=}
 image create photo ::img::h -data {
    R0lGODlhDwAPALMAANnZ2QAAAP////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
    AAAAACH5BAEAAAIALAAAAAAPAA8AAwQjUIhBh5z11rwp7l8njmRpnmRYSqjFmtc7xppIx+CNezrt
    0hEAOw==}
 image create photo ::img::c -data {
    R0lGODlhDwAPALMAANnZ2QAAAP///////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
    AAAAACH5BAEAAAIALAAAAAAPAA8AAwQmUMgZ6ry3apz15oL3caIFhh64rSZaiu4rz7QcB+FNmbh7
    jr/UJQIAOw==}
 image create photo ::img::d -data {
    R0lGODlhDwAPALMAANnZ2QAAAP////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
    AAAAACH5BAEAAAIALAAAAAAPAA8AAwQkUMgpBr10aHy155IncmKJlWOGptVqhu6mrqdLomD75To/
    WZgIADs=}
 
 image create photo ::img::quest -data {
    R0lGODlhIAAgALMAAAAAAAAA/4SEhMbGxvf/Mf//////////////////////////////////////
    /////yH5BAEAAAQALAAAAAAgACAAAAS2kMhJibj41s0nHkUoDljXXaCoqqRgUkK6zqP7CnS+AiY+
    D4GgUKbibXwrYEoYIIqMHmcoqGLSBlBLzlrgzgC22FZYAJKvYG3ODPLS0khd+awDX+Qieh2Dnzb7
    dnE6VIAffYdldmo6bHiBFlJVej+PizRuXyUTAIxBkSGBNpuImZoVAJ9roSYAqH1YqzetrkmzGaI3
    F7MyoaYvHhicoLe/sk8axcnCisnKBczNxa3I0cW+1bm/EQAAOw==}
 
 ##+##########################################################################
 #
 # GetBestMove -- computers AI for determining which card to play
 #
 # returns [list $move $draws $newSuit]
 #     move    : which card to move, e.g. kh
 #     draws   : how many cards were drawn from the deck
 #     newSuit : for an 8, which suit should be current
 #
 # Data Structures:
 #     CARD($who)  : cards in players hand
 #     ROUND(move) : list of every play so far, each entry is
 #                    [list who move draws suit]
 #
 # Possible ideas:
 #   o don't reverse if previous player has 1 card and played an 8
 #   o change suit if any previous player has 1 card and played an 8
 #   o play card that has most like-value cards already played
 #   o always play "special" card if possible
 
 proc GetBestMove {who} {
    global ROUND CARDS RULES S
 
    set draws 0
    while {1} {
        foreach {all suits values eights} [GetLegalMoves $who] break
        if {$all ne {}} break                   ;# Move available
 
        if {$RULES(Draw1) && $draws > 0} break
        set newCard [Draw $who]
        if {$newCard eq {}} break               ;# Empty deck
        incr draws
    }
 
    if {$all eq {}} {return [list cant $draws ?]} ;# No legal move
    if {[llength $all] - [llength $eights] == 1} { ;# Only 1 non-eight move
        return [list [lindex $all 0] $draws ?]
    }
 
    if {$values eq {} && $suits eq {}} {        ;# Only eights
        # Pick suit with most points
        set newSuit [lindex [SuitTally $who] 0 0]
        return [list [lindex $eights 0] $draws $newSuit]
    }
 
    if {$values eq {}} {                        ;# Only suit match
        # TODO: pick best value of the cards in this suit
        set best [lindex [SortHandByScore $suits] 0]
        return [list [lindex $suits 0] $draws ?] ;# Return largest value
    }
 
    if {$suits eq {}} {                         ;# Only value match
        # TODO: pick best suit
        set best [lindex $values [expr {int(rand()*[llength $values])}]]
        return [list $best $draws ?]
    }
 
    # Here we have choice of both value and suit
    # Always switch to a new suit (for now)
    set best [lindex $values [expr {int(rand()*[llength $values])}]]
    return [list $best $draws ?]
 }
 
 ################################################################
 DoDisplay
 NewGame
 
 return

Comments edit

uniquename 2013aug01

This GUI deserves an image to show the nice quality of the gameboard and the playing cards --- the backs of the cards as well as the faces.