r4506 - in developers/erin_yueh/pythonEFL-sudoku: . data data/puzzle data/theme data/theme/image src src/sudoku

erin_yueh at docs.openmoko.org erin_yueh at docs.openmoko.org
Fri Jul 4 10:13:33 CEST 2008


Author: erin_yueh
Date: 2008-07-04 10:13:32 +0200 (Fri, 04 Jul 2008)
New Revision: 4506

Added:
   developers/erin_yueh/pythonEFL-sudoku/data/puzzle/
   developers/erin_yueh/pythonEFL-sudoku/data/puzzle/1000
   developers/erin_yueh/pythonEFL-sudoku/data/puzzle/solver.py
   developers/erin_yueh/pythonEFL-sudoku/data/puzzle/sudoku.py
   developers/erin_yueh/pythonEFL-sudoku/data/theme/image/
   developers/erin_yueh/pythonEFL-sudoku/data/theme/image/gtk-clear.png
   developers/erin_yueh/pythonEFL-sudoku/data/theme/image/gtk-ok.png
   developers/erin_yueh/pythonEFL-sudoku/data/theme/image/gtk-redo.png
   developers/erin_yueh/pythonEFL-sudoku/data/theme/image/gtk-select-color.png
   developers/erin_yueh/pythonEFL-sudoku/data/theme/image/gtk-undo-ltr.png
   developers/erin_yueh/pythonEFL-sudoku/data/theme/sudoku.edc
   developers/erin_yueh/pythonEFL-sudoku/src/sudoku/__init__.py
   developers/erin_yueh/pythonEFL-sudoku/src/sudoku/solver.py
Modified:
   developers/erin_yueh/pythonEFL-sudoku/setup.py
   developers/erin_yueh/pythonEFL-sudoku/src/sudoku_ui.py
Log:
add puzzle theme file and read a puzzle (Erin Yueh)


Added: developers/erin_yueh/pythonEFL-sudoku/data/puzzle/1000
===================================================================
--- developers/erin_yueh/pythonEFL-sudoku/data/puzzle/1000	                        (rev 0)
+++ developers/erin_yueh/pythonEFL-sudoku/data/puzzle/1000	2008-07-04 08:13:32 UTC (rev 4506)
@@ -0,0 +1,1000 @@
+002758064300010700700003910001037802027005406000002170078000090200600547065070001
+000700060700931200004020900900457602500019040471802500098100700007090008102608430
+362008000000307060009601020031462000007105236000000450028074910010000642493010507
+000025009000830005500049007000400891040000003108397500009070310750100900630900000
+083700000007065000010423000000382700870050300059047020530904006200008070708030004
+400010072328090500010000030043060297682001340097402160030000080001200703005000400
+309410762876009000401005308100040030600053000000186000010000900060090000590030000
+059000142000400760000129058003786204070930500090002073267840000900061080400097025
+030560801140070000600800700060198000000006104010700902001050620097621008520083417
+000314002703829650012005430900040108300008007020060305000730024006002700007400500
+603400000800000000040630005530070900710006354080309010028503000005000008100200030
+012000703600712584000000602240150030001004900000200147100000000074020069806400070
+300400000500009007407036200000608500000073000030000098160005920004002800000960301
+604182000000030806800076234400020700000000000370600400510290070007000049046010000
+000097008000005009708400506000106304070200800960583010009008000036000087080000950
+060357420403860000000900386000100609680079010951000000090401060000280194000090000
+640000000017590403800070501000700000100400800050930100060351700000020010021047056
+420609008978300510006008209094030680000406925862500000680123754200800093143005800
+980000400630009001500003006297008000000090000100750020000000372006305189300280640
+056000800782053090010082500601038009805100003000006105000060910007015240060290350
+830406000704830000050000300000004090000010708000200400090000800347082000000590043
+000109050153080607490500821002800504680024000704000086070600300240390008360240910
+005980600760400305400053870973010408002800000580000009031709002050040900094030167
+298103000410005037000049800001000092050207008600080304700012000500000209002000073
+080000500402100987050400236040039602006010000090504300007091804000380009900600000
+079530000003709000004002903807056312301000548000100706000005007015028439000071200
+000040900208039046460008000080705600020060080510080000700002060002003000840697012
+200000070040080000310004000621007000470008060500612740002005307100800094000000000
+715006890840000006000008702000000920009074000030802000000040073000701200000609008
+001073490847900002309004010753090001000702050000035900100309000230100849006028030
+000064125580002006001507003400380090020670000000205068072010009009708200045026837
+007005000520030040800207031900000068008000005002008470213000700465003020000520000
+430000600000040037765000040007306580000080370053407006092154000081790420004060910
+017056400028100030604092180090280070070503001000960024000725040240010059065400208
+300000700067540023204007080021930467405006000006200030603780000540060072000000806
+000000400700000320008010007006307104000802063039000000907100200582904031300620800
+008000006003974805004000701040007308320006070007500214000735192000000600509000080
+005302000080006302004008906060031008107900260548007100416800029009074600270100005
+000509408000060572007820610000608000050047301002030960743980000201003090005716200
+000902004000150000000084070058010269160200307700006405376521908040008520285409701
+003900000840500709709480200005800000060000842004000500090005371001708026072040950
+905007008010000020004100000040000670389760250000000830000572086000904500700000490
+108052079020000560006003284400006010089004003000080000090465837000090006000837192
+200350000340000005795000000028000900603000407904013000002109070000805000009030514
+040000023100203079902000140304005760007400301801020400218604000000052030453700210
+690007000074603189010080000000290730089304200000001896001036007007910008806000900
+972158306000004010810960257500047100401000060000516490300000000009070538100000924
+000104923030876100000009000103060485050000000000531269400600702300400006629703541
+140006090025000000070380020400209600962450071007000000010000030706534000000000409
+000002503100004029000109087967008004308045206042670900006000800854007300201400705
+087000560600700003400608900960384715004067030703219040106005320040002000500000007
+057000000006000000400000000745009000638000070020746305063008050500200807004013090
+250800900190570000078913625900080000060020409000406003000149008009000542000257091
+002407180300200945160509000800310009739054201015090430401620307620070800007043002
+100060040508000006000305000000003010354002800010000000081000000760280109005000008
+800000102790800563360050478400007800170485000086010734035100280000020007240090050
+432709008580000600000010030390500020070080500150032400000200705000100000907050310
+860257300040000050005904671072400060406805120083090000607008000008506207000709506
+264057000009600001307829060086090000500008600900501080040386000608402300103970006
+803602497000030000005000000086007914301080070007516000000103000700040001038065000
+001630027000401000080000001000070106500906208100200070608027300310800760700300800
+000050008004000700009800014087324190405009207090080040970630000108290000000700009
+000059000080720500052100379721500600035060900006802730070005090204000850590048007
+000600023230000076080031000000000752045762001000509000100400537063105040407803010
+004003080060020104100400506700002045532000960406709200000014028200376009005000071
+200100040810054000400020503326000159708591062005630080600000000000000000080000037
+000030020009000003300000080951200360402000001000070249690002514200900030708003602
+020610903030000060010379020302160800000080000000400006000900070053021094260730000
+008135020010000540005840193560000000000070300003450200100096002200000060000010004
+600192003530004009207050640150008702900000405002000100009010000806907050000086010
+307210004000940010041053792009730040075090000000406079928001036000020105010800007
+300000800058309702060502100600090450080000000004800627010000000040000070006930004
+040007921790420863201930400003004000814000059000100000080360192059740638632800547
+060030208210000300004000905800040500406078032501000004007000009349600721102704600
+500003209900020004284796005020000706700301052069257140093510000400670503057030000
+023960045007200096900040720704100263185603900000070500549030000060794852070510409
+573020486016000093029008710037000000900200650050600030008000000005080361060005908
+053000100100030906000168000800004761300600000006050209030080605500790000001043090
+009610487008059301007834009006000000053040290710596003600203000000400630004905002
+076001458489700000000000796064080500000003009130020000510070300043810900002000000
+370000286000710030094062500480037195003925008750041023100296054500000062020504000
+010038240600100000708625010000470000000050400200813567000000658956300004000567030
+045000631300860402000000000001007894768240000904008000400900056000400300000000040
+000975824000000570702000001008000010190060302274010008840732100910000283000008007
+850346000009500000046001005030700001700432906000000000004603500001004090000907012
+001640080040090607075200000008070000064001003010489006200900178150802000089700502
+010060000745310680000507340000000423160000900904035008801006590007008030056003810
+018695270270380510504720060000862450001003700840910032000059346003008000952400007
+000000015000009048005104309400306800006041000300700461040000006500030090619000003
+030600009800000704617920350000006573001300000002800096200068901106450800708103605
+076400008000001003305872600820000030000020005650000020509000002401090000782000350
+000170098070090000810026053200700500900604037000900846700509300605830472001000085
+008000004030000006040027100300169087090780360807000905072038600400070509010450008
+008501009100460000000002070400016000000780904900000056026049010040650092090008643
+009003000300760095017004006740002918000008050001040370000300529932085067106007003
+005970406174050800600300250000692001060140080300000000050430600700800340000065100
+300060009000891702910300060800034000050072048700058021081046003090000410473000086
+906080200000200060100706080200509030800023000600807012400600005021935000069000320
+000960000700824009049300628900008003080009206654230800000182300000003080200506471
+987012060345009071610305000108503742090700008200100600800004007000081000020030009
+008530600036010420070260000000000005800001004000050801010046950054800172780025000
+190400360800000205630071894060127000003000000204890006076004500050000002420056073
+300000008400180765000007003000800004800002350007059001054000830783000190126030047
+320000000060020003040008000000409000604207830070860000000005042400000500002600080
+019406730427530608008100005163000950040963200000750064800040070304608029051097040
+230010086000090140000670059003986000652100938900300600300825000570030001824700005
+307005000900006054000802900005620300040050000000083640100500402000109508560248703
+006792100903468270200100940009240018450817060000009400631024090000080021800001600
+100093000450670100803402000027836004089000230040020680238154709000360050705200340
+003061800081700350609000400946308125130004008020600040000200000060040001092000000
+608403001007008030000020048003506400160280007570001860402050006706102090910007204
+148000760500070000300000000000702691014000800009080240906830010700605000400020306
+081600300006003710037009400062080039054900200810060000008200903900700801020590004
+060200594019407082420000730176000000804900007902170006241003070700800005000719003
+789000300000001050615923080067005040008006000140000000396057408000309060074600003
+500001800008000200071000000097000048400008627802075009745163982080507001000000050
+083624000040050602602000080000000005007560194516400000970006201460290000230740006
+050080100040060830308010000000020087930800025702050900820706000571000064000005070
+306000200900000480050009061230670158605090300007001026702900510500000802048007039
+000760513000000820200308064400080600079004000603500089184030706000849035395000240
+003024000000813260024569010901200007080000000307056809100302508000001602472000000
+920001400057800310000205000000368000000050073342009508760100925280000000130927040
+037268040205010000960354721004587203703100408000043075406935010081000050000001034
+401736200027510800000000001003050400000047308248603050070062503000080970000300014
+000940800072030196003601500020109030000200715001300009009000652305008040204006307
+760402850005037960804000270000083702587024000300706000000000390002000086903648107
+070002006053764001600030870000008054000597610390040782520070130010083567736000408
+000000000804023519050700860406070000500006000208305047045968720100000980080000400
+247030698006708000501629340020095016700000004150076032870054060000100405010063870
+900281000300900004000543980536000740000000150017650002800090673000007428003020500
+000043000409020000570108002358000070700950000020000460005419036097036280034070950
+640090000200006000000702006000019000020607800106000009000180095098000600400900087
+871200000005900000000300000080000096004093800003000704700006040000000000310427068
+000000000500208906009140800040320000000985002002060381000793010080602750190004003
+710638009469000038003041700907006001200000806086017092070860503602070900308052600
+000010673000002104000360090420931850300000000705048302000000430030400560009003000
+906305070200760301031002608094627010052001700070504006000203100000800005000000800
+029005683050000104001000059542000308000050060000200005000008936803640070065900040
+870302005039000020000000008010274000007090140086510209700085604068409701045000802
+972800346014300008803246790040970000090000200760020000086000900007089000509010800
+040056092560000048800074000013408600406090031900000004270080006051002900390105000
+090000873702010050300000000020098637906170248830000000570030100600900084048061390
+703000840609700050058400076010070600004800107087106004000200003432610985070059002
+209080061400310090000200845890407006000002000005000000170800530500020008980070020
+592040138000000000304205600018900704030000000009072800007594000060320080000600207
+090400730000000018100000000019006200000100590304080001006001009000960020000008056
+892746000031009000400010000749030602050460007006007543007008016000500000080074000
+100070425083415600000000000000084200470000900309050084802500703000001000907000501
+200370060010080000030000020000039004703200091500060000400520300071000000350748900
+000560007006741000000093000020005000060900820100284039019000200700108000000009000
+100006200000090046645802903006200304402900000053600700201345809560700431090000007
+791403605000000020030087194054016800912308546807205000003004200020130000089700000
+340050200020000030085013000170000320030570109000130080003068072000300860400020050
+609180070820953006004002009005490000000030000900807030060200801001369007002010600
+359006010000000003004103000498000605100345007500908102930600204000400070247089000
+720010069536049008089506007000000003915608040670000105060001004307200050400307920
+040605137761000490903700006200056070030200058075089024000108049489562003507004800
+813070056070581004000000870000709065704300098950004000000698000000100040100247603
+301000004090000000000000900038160240006290837000005090570002400003500170004700520
+100000070250003604800200095000870006720046000635120748580000060096001827000600010
+000302000037900010900710000000100000000007081000005300300000164100569020826400700
+000000000009620380270395006090200670000000005760000803020460000006107402310000768
+513002000604731200072060000380000700700609000409308052207000014000003000006187500
+870400500005700206009120300906300070230897615187604900000040002621073000040000730
+704600500580040000196508000018006027029300054357210800003100040240800790000000080
+043000170002060900000300004760001480390048265000003090070009000230500800819006507
+000390508530800079097254001456908203709103005300002947105009730000080000004601850
+600358740078200006004106020403500000090081400800040000200067000000832004300015800
+400071009003520410000400287100056003065039000002080765510062374004905620086000900
+500403697000002431100970000070005100061029045009100863010290076000000004008704010
+400502870807013000000007043006900714701000602904000300058749200600001537170005080
+200000067070246800500090000807305200090064030053020700040100009000070000000003000
+007020500000000420016954700000200007109763040764000093070800950900000080483000600
+007500068600702130150068020078000006016030402030070809000081640321004507060050091
+048290351219003060050017000502000897000000000000000002006000130030600900195000470
+485000020207040890300027006536902100940000360701630980000000030003008500004009218
+010063002002001500006004001001000750400000900307000014000000000003642100140309607
+028106004410200968000005007530700006682054371174008209267580400000062700800417690
+000000402502008001807160030058006000230791856000584723400870165080405390075003008
+240800009000400060060010040302094080050130007100026395008300076725600004030070812
+240170003001425060009300012920003000807094500004000070068040000000061090092537186
+690004050150000046743516809004800007207600400860473000000047003026130070300000004
+504000003092560017870300600026104050035600090900003704643800079007030040280475006
+024006000508034000100900000350000000000083402840100050000300510090070048000040009
+070000080010050030500000000080006540060000800704080020006031400020600351100400708
+370002800008304200064070590001003005080900302906200007050021639090800001140000720
+007158043901260078830049016600490700020007000400002100700305090300800651004916007
+700308695000000400800000701170000000605893000090270000200006300030500100061030870
+000007300300820000067040008006490031008170024031260079270084000650000400004600703
+020001040040600000510007836291076304600000512054000000930045008407138009105000003
+008014007079835600430690000500460009064000235000950000090701052000320704042000900
+000600050060050231020007000492065007581009060607000590006800170100026000000000000
+643008000010590040000703600020065030007000000059201008175004000200957184000600300
+260700480000120000007090030000610004006200870100380000000870010008001003012043050
+930040152510000000000007003001200400206005070385401600024006537803002960600034200
+080003620060207900042000005076000510050130706291506403800005037005329804604700059
+170239805408010369053000000000302900000000406009000253060000000804107002005600000
+047000682600072040800056000760001025300020006200030000036508000000060053020347960
+030000526002080704400000800005000071206009005709853000504000130903000068160437050
+050089002008040100060027304000000920000960010906003800010604000600000048000030070
+060009008851760420090020000905300002007000000000001300009280640020006800070030200
+000016057596007010000259003000690000907048030680003002710325806065700109000060070
+793041805060809400004230079000000004200480001001090760415067300900008146030000900
+050426007790310420240000030070062300905003064002100098180040602000230049420670500
+204003050009470821058609074800030009000000247016002000080001000091057003503980002
+025000060807000150009030020080260001092100008560900204008301746904506300000040000
+051030004680970302000050691097004526510000709020000038040160980800040000000205000
+400002300010609042720001050680305000945000000032040097001904200003508061064210070
+620500310040080020097300086000000092070050003009120754000600000930008041000005008
+000040039107082004060150007039270600000006070006413802600900703000060008910700000
+090030502000040600080562009360000900009375000700609120040720890930000060805400071
+400203060017089520000070000862500931000602000000008040000000079004000006006020000
+004000006806059024920007380080710500507004010140965000400006070000478060700020090
+000509326300006700060000000734908600200467093000100400005030000000680000082794100
+750014083280093000034002900000106302003020040472008001045200730000000504000400096
+000400030690000000500923010809030072206091804700000369080000000000207003020300091
+970050860405908712810070000050097108700005004300201907023780400000403000040000001
+307009405000000010196040870470601002630520087521000300063002541010450006704316000
+001700852800016790070802106047008610005671029109200007706100000513000060400503001
+000000080209000001000600940826305407937041200000000090700004630000007100010083570
+091530060205106000000007000503600100418905020009010705004000001100063000950001000
+500780001090300806003040572100056700000000000000090000401007260970561000300000100
+907302501000010000002058300094070030783509400000843009006080040400000058820000103
+540000820263850190108607050010706080002519403056000001430008700800900030629100040
+064103000000600002005042960500300000497026008300907004609050003073260845802000006
+401070002008294760026831940079058000060703009054900037617009053000302000000510000
+000000700530090004407130000000000642194006300286304019000403000940007200021809405
+320760584004080000087000293018607935763951000459800701805190000900000000070208000
+000590203035100009094006001001670002009200506300900870043765020020009000907012005
+060000000750600300021540906906820170140305698005000023094768230683219050007000060
+800015000002040100500060004020006501000100096060500800000750309000090415005080000
+008416079170020000304080000007540068002060597605090403700000900200004001051000030
+085140007003985060040200080004501200300000000000098100051029003032807609800354002
+612580004703200008800300501000050346000064200067000159900610070300708002000420090
+700030600348200051000057430687325000010008367003070528004080200070460010000002040
+470980020000650007052000006507800462600004871004100059960240700308096015005010690
+007032040904086253050900000400009071500470900091020400103005720005147090009203010
+000200407075600003402580910300070008040008000006005074703000690004700301001000742
+800600250104895300000012009600080000307020564002506000001259000273460105098103040
+000005047040078095700000200400807020000600000028500973002006010160080050804700002
+000000500000000030700035491002059670004080000030100809090068004400321050000004300
+980000010000780002000690040098006301030000060006900008570800030640070185800005074
+019405308038096005000028000907632000620900780000017000100003040070540600060000000
+050100900003020006000008000018000607340000085607800040470200800000703254030489760
+000150000000096300492003010000785000705040092080309507014030068000008970003000000
+307040001006107082000509306605004000000001504401000000000000163563000790019080040
+982000750600548900040700608500000382401000507820000006056034070008675001700029000
+080060049046107503005094006023006004500010000090040100060500421400080907019002000
+001200006090005010200000709024100050000940030000560000050000000062750890740309165
+380070205040280370000905000104760900603859010090000056430010020020603540507408030
+100089060864100070009602400530894610400020790000000054010007038740000106200016507
+370000009400000060000780400000006000700810030068070042203060190800240007500038024
+060400080902706354047000100053900021010038570020104009095080740204500608000301295
+029030708070060000163287045257000100801726003900050007080005000300002809694070051
+800370016009050003200800000100008340400000009937201000090100000001900430070400291
+050300002810264070003850400007605003100023907030000048090000000704590000300000000
+605008020704060090900300000163429008000600301007010000002731000396200010000500230
+000431670006000000000090485008000000000300100500710900453000800710800060000003501
+001840527276035800005007010000480170134700900000000400007318604008500030000000000
+010040705070500048000000206000730090090286050506010087709000800000063409064079003
+690070010083000756070265003010000605300506100069000872000000360000000421040000090
+602008019300127600500360872700590283920004100000003406000000008000806031835012700
+370000108100078940080000670608712054517380206003090017730060080845100709060040030
+861090002000000349009002006000040800980050070172389465700034528235700900490005600
+700000002800000000000020000109002468084160053605800107068071000321090000957083000
+060002070921703500058094260070000020000008040300610000609400008010986430280071006
+091080706000001040480020500000000105000047000020615300008190437013452060960300001
+000075600763201000000006200000004020000000000075002193600140902004500800108920360
+053100708014000903086700040098005407000498002302007050060970280000001300800050090
+008200001460007320090403060030000056100350247254600009000790000000030070020040080
+804100000200087405007940800453790000010000000006005103605204380320070541100530000
+400000057080706020006109348008007092000020870000980005042800000061470000930612084
+078030029190700008305080741000017002720060000580000160600008003219350870000290010
+602089004009603100800000069025090300001047002000010607500961003004050910096002870
+000000680820040010500080004000205908054800100060070003000000500300792000002050890
+010000900008360500560410320130924007405000000987030460043691005002050600601000009
+290501670000409310000600000920716003301895200000030196706950401400008050010007960
+005379006010000075000010320800003000000798060060050030000042050001600000200580600
+008360500209000030360057020000270009792000468031089050820706040617400000945128073
+005000003008005004000301000010047028000000490084219070020004036840020950657003000
+005600020006900100020473056800160007003040000074300000000206010901004205000091004
+210973548030020761504600003060050380001002005025007904102306007749210800053000100
+090006438040800002000900710010000027000200040980071050069105200153702004200034091
+730600209205900700009000800000076590000090000400300062084700005002810007000204681
+570000000300950010900600000800260400040009102235700000009002000080006001753000269
+000000300900603008000040905406081000281000046500062000140000003000014257000806009
+070160034300000002089000701007004000800930400031000090060800009700306000198200307
+506000082003000970007200356001903020000580000060400000085700103000050260670102840
+000463000351900640007050002024805301010600000030214509100090000075001004800000710
+400530028000800030003040096005084000830002509100395082000900074700450203040768050
+056000090000008000400007200042530089030901005070000100800005900500283070000009000
+546009078100004005000000600704300001003090702008007030431052000860940017000160050
+000037000000900320070050090050864910600001000430029768027085034010400000046010209
+004006901090400075000009608930084006000500719021060400000090060200000190050601000
+000000293209000000000090180000000679682971040070360000400007038030520467000040502
+900000050048500321003700609100600008004000090006901005051269070007000960600870510
+560000700130020084402801003217980436000030810680400509000209008800603197006100040
+700620038305040019000390004170000600000962187608510093980174050050009076000000900
+010694825206008900908001460605010070100073040074060080090080600801030704507106090
+004000875675000930300700406500120648061900020700386059903000001056200700000061090
+104090083805003607600000420090034700060520009000160030380900100010040008007201350
+060270305705830162100000800070002950506090200020050700001000020083904001490100080
+019020570000140090007000010900000085000004031080900000090402000500800140408610003
+908061027000900840425700009000014000580300004000050010379540081860100435100030070
+960000520030100948085097301000001409076400000094503000009802030308765204752004006
+004900008926018007073000401080070519000621804041000002000500080069703020250100000
+062000000080093067705048000100000740000000359940305000009000070206009000000706000
+000708540000003900246000703020000008009184007000230009900815070007062805000407000
+000000050590060700003510060068000004004000120059048030930001846047030010020450000
+260700094074108005000904800406501070000009060000280051605092010000640280800007000
+090000300563020018210003500050200084049700000082340001000002905901056827005000136
+010000050834205600905010000498000700701500930000900016140859062050040100009000500
+040020506509467102006050847604010009800506000301902050060100080208670015900080004
+058703001007840002302100000009001700205007930006200100020300460000910000000004200
+003400200041050063520000840000003408068074105230000670000630000002040380010007000
+410007806600010709009020003973048005000900200801500004204109680000000050300000400
+503000006146085002208017450000050094000890607009270510710508060932001005085029701
+300087000467000803028060007234070000091230080705090300910700006000029100843100270
+785620400013089570049750000002806154001004260064015007030900605000500709500100040
+018042079947138260326790040600051007000000010701089030009000750100003400470026901
+036900085502348690908700100090870002203100806800003901009000210100000000405280730
+490002106036471920500908407070080209600194000040000001000250300203706094059840602
+000300000492005100300900670000000004000020000124000800800107000000000917000090300
+040906810600010400800002060050600007069705320000380000000050070005107239710294506
+901026008058394720700518964300070582010203670020000403200149005405602090003850046
+001060700900000800600834000028000300796203080000007000410608023307002000209305178
+000930006861027053903805417050000004000208005300000791400002670690084130217603500
+605103047731049000902805631308050062050032019100900050000304070574000300003597100
+005392400006080093000000500000600740402017005960008000204160380078034900190805020
+245700000700209001098364700020800500806003004309047260510072009000900047900400005
+010840000400000081093065070080306040600950000935400060000004026068273405500690800
+030061000604000837508743069000600900060078301080900004000000405000000080096407010
+000085409307160500000020760400690002970001653000000900000016074000000805083000006
+600000700070020508092076100067098025900050670000760001839540216026001000751000009
+000046090000030205021800400519604382400005971038000054840001023275063009093020040
+010490500080050600000006314030000070800900100001607000047381906000000000190000708
+005040800948017300073000500007405900000629700000871025700000040450000009082090107
+001203000040010093000008000006189052984000006215004980690801074020006315100300009
+705020000830000590062030001170000000000170003000000175390001050421980307000043908
+070030900008000307010905000200450090007069000560300070095780000086590003000000500
+004008050678040010052610000009060800200083000000459102301076000006000570000000043
+300074200000960000700002008671005980230780060985000400800200349019003070000090010
+800004001000700000040005002508040107002500000037006940300290610000003009009400003
+200040093803500701470000806021030078900100000004050000632000080000086357750091200
+986200001023891070070056000207460803690703040300018000702049308030000000845037020
+006000705072410080003257000001300200040000800260000000028040109037080540100923000
+420000005039806047700100300970050000602008090004031002005013984040000001090004036
+009700130002000000300600702400000000930010000215070000060907001194350060827061350
+000000892039040000070806043043109086000578000900004000300000150000900360000357900
+700083069006700403083000000000102034000007051010400000060000005000026710150008006
+900701806002090040601000795060340900400000062008620430529400071047150000000003200
+060200085720609403080700290090006100306408902047102630070000804802064000004827069
+300000007005003600621900053103026009700000001060791835200000000008207010510009324
+008500096003700058065090000049200015320915080000407903090350002102070039534009860
+100900008040830010080000503300647090478329600096000004001063000050702000030491005
+400090036613000089790600140000070308800031075340806901070320800280004050034500297
+278600059016050004905810632800492016000070940090300507500000061760081000430900780
+600902004000054169549001007083020010402735090706180300190647023360000471074503906
+074005603000170005005640010408060702096000058000200000087000004000807309502490000
+091702000060104009000900601703609000040000003200070000630008907500496318910037060
+700308000008006003010090867006003905400980210009000704605832009927040300001050602
+003500600215008300000003008000356000002040000004280065071004500450000020020905000
+080000360370581009000000085000005170030140090051697000198004003763012054400903010
+240508600000000000036004090020000000371000004060042000008030910000600003010009060
+300006042800000000004021508030800000080200000009700080240600150000143000708000060
+000060007100250040030741200003098400600100905000070381001400093090000000300900000
+412300000000400800000009000000020060340000120509006000060001400930000012700034089
+190000037003079050740302000400265090306047000000030470071003000824001763030000810
+000452901519607040040031000032095070607003000004270013000560190005700200860020400
+030072810819050000025080690200705100071800000003029006308500000060098500057210468
+358607040400023056200400830020010480700000913100000607000270504594108070072045100
+000006004004200000080004056900520478240900010071340209010005000007609045400812037
+000085000005007048000310020371864000050900076096050010060178200000040080807009600
+906701340302004810514006000039100700008290103000038400700009000000000000063502904
+612000040000603005007040600736080000080170030020060070164030000000000367070806000
+000004700200005038008620019070080000021050000000300000102000040506000900090203000
+057800060800500403006702180280650701019000050075000932938070004020980007701245090
+000607008702090504000000200080146790190870056020509401400715809278060000050200647
+700010900052049107001000030170086205800450001045100309238090710007000052006078003
+103500080850070906070200030420103000510000340300040500000405693005600200204000150
+205900071910000800007000500092008000003000000000000400004193000000760043069800007
+000000001000079650000352000006800070780940500095020000510000000000560009009030820
+008630000000007450047020030006712004021300697705090003809243005100805902000179008
+200070000018094600604320859107008500000910287050230004700109040503742910000600700
+562000709009027501010085300204508167000731000071000030000002003006850200003400658
+039607040760004000080300790000900018000408350800053600000039080900700263305800000
+000090010086543000052000306060900700801052060070360291007600820600475100000821600
+069003702053892060800760300140006900000010428090430050620045070070001240304070500
+087000000902087046100950800200500068070200005030641000460039200820400000710826000
+040106090319002050506030140007580900000009000904601087068010430403867215000004600
+709000000620000500080075402000030050100250006592100040043009605906080700005000000
+300568901076021004108407260297000400000006709631040000405000128809052040000084605
+400380097701000803000005400030000674108000000002093058560070900097100000014008060
+000000360003009500102056498260000984004900005058060003001083200030200001700000009
+100700409005419826090025301000380100000060005031950007000503908008200510600091040
+000069054200410039704003810000000005000004007345697020408000691010286003600941000
+000000184480200065300480029601720953790050010003010200200040000500109802008002490
+000000840000704000194030507018005000435000700060001359800000206023400000750926000
+086004090009670450070030006010002009490000030600001800003006940040020060060943210
+000085000007302501500017800000000604700400003060000200012094000070008040900061020
+300000059001050400000094301000000560090530780030008900203000090000007035007300200
+009040085300002000600815092000651803560900124803400050000500008006178000085000017
+435000001900004070800100950003000000001049060074035189050000207020000400040300816
+002080301000005607000300020400200800906000200000000040000000156690702400138650072
+843000000179600004000470030060007893930040000020001040000710480080960310000083679
+130800050806002010000017308009301000384006100010009683903125800008970560000400930
+001005794900207000067804050590086003816420000703109268108600000005030000600501037
+264008000109050700005293601610305090083904000092000006340500000750800910901600000
+900025300000000200002637980800003000314590078020140530030080120209071854100006090
+003060002041080000600005041065800230078040010300206008030070024000094306004020007
+004307800380906540675804090046100900013049270000063008000030000207090681461200050
+008050620070012008000046001307008160000100030000007204000270496009584312230091857
+100008200009020000000069010806902130904003602730600409087100904005094001401037000
+800006900390042016000903008940000000080369000630050280079081000000000002468000090
+071000082000720400904568317090000100805000706003007090150439068302080904089270031
+810459060729060005060800000000903487098270003007500001042030978005700316070090000
+094520670060008050800000010070000890000000030589600000206000003007000460000016705
+007000230050080000460020000000000002014802000925040008003074600001008000048915723
+000000000800705213031260000007491530609300120000680749704506892028070000305009470
+021780050970205000000040021042050007053000200097030000360071002000060075700000396
+604590378079203000100000000003050107001060000007000000010040269046025003000609000
+462800037013050928090270000380900072601005049040000006000000684074009000106000790
+600904008000020704007300200000009487241700095000046002090007500500100800000005021
+001000407070506300920748156000160020104025000080900004000001005006080701002400009
+200460000300070960060930400020300640030047009100000030000000506618704302003280074
+087250900406008300590301400800602730003405009009083010700006090008030146164800573
+024005000580020049601008020060500000108000290740109080805090670470000032016807004
+000905876008007054507068902000001700070050000080702000050106200800300600000020300
+060090835002810740007000010091006284406982000320050070609030507215068093040000100
+000000140400370000008000000000053609000280000000019420010500060650040000004130952
+000020140540307820090410050025690008009053416036080005080100000750000360000000080
+000950083081706025500200700050173200000000847706800001205400318800010900179020054
+230501070005006420010240008040013789003000000070400000080300060750062394000090800
+987562431000910800501000070100700260270080019040020700810076590609200100000000020
+000590600000748025000610904467020090080900716519300048900060000106200400740035800
+930006004001085270572040306000469708009813560810000000007100400305070001180502607
+004000900020350067673249105008005203450732801007981654300020010005004326002010000
+840050791009061305015090000508700016002000809100900000670089004900020107050070060
+085009140074518002000243000009405031008000090063070008951024076830000020040007309
+007020094200104750504090610000643087043000926700080000008436005370000001000000839
+000920004090008100520034907007502000002309000904006210009060840005100692268000070
+000840056263915040085002913847209000320006074056000009004000690918000032000500400
+900000000206000010000002047000406050080000429007029681700045068063801502500000004
+001520807005006200002400030020000950074105300050098470407000000009057064500902700
+200340010678950002040007000064008200190273006000400105003005601910630004500104937
+003402079009350061000890402184070300370000004026100080008643010600020048412780653
+050468000000300650600700980090000040420103768000800092082971000041000070000084000
+507800000010000890084700302900005000035078000400010000109000085750009000826407000
+268070300059000710001460090013047060540006100000012845004730000180020037307004600
+000000000420003001030072504600058100907000205001260948004509300063010809000320010
+060008007900405031004003200017280300000300070009006018400091085006007023001000094
+038074060750000200090015037000000000010002090870100050001400385307008904580001020
+004892070001063500000507640030000000900000400006040987859704103003008000000006000
+069030001000001003001008200040080000180623950530074802004357020803206705720010006
+030000650051267009460350002603900500517830206020010000296105003100020960304680120
+874520000060000042230000700700605000120900057050210000007052900300400060500060000
+003010457570000621100720003706000518010000006030080700000270380090864070080003260
+000000000000649000000002109009706000200000640056300098000013086980067534060805200
+400009008500400609698520000700200000030106007080000246000042800821900405946800032
+400000000009002000500300080000900025300470010000106370240600000073251946190000000
+009035000087001002600000000760000125058312706020060384315006007074153000006008000
+051208679002359080840006302000004003070001806000000045580623090000890560000010200
+005001900030754062000082035000040001504000623608203500801006379000000006360107400
+020001000913050600580392007060109300240000051000040902700005410190006780608417200
+000030800270800000000002700000006930000005001008300007900500462164000509802069100
+800004006350706024600103805030860109002030607960007230496270000010008002078009000
+009108200080060001046073009030921000001050030000030008027380090413000580508000000
+043000802172498060800010409204870105006501298000930040009720301300160000001000700
+090000000258961030103002609004280000705000000006004300430000805500000027801000400
+000042050000509200420870090908067000042000000001290004010080062009750438073004510
+000030920020590300319208074030002800000080250280300100002000730090600000000020095
+008097043400608700069030250040002000007900500000050480805000020900480000674010805
+058073096000008130630100070215706000000201009007040000020004800000000000049060521
+641830009000001020523070000004000630850600002000740008406320105100400203200007000
+093087000741063005608005073804000029169500007075030040000024050000398160080051794
+925080700080090504370050002090860070807001900000000600238619000100030000000000010
+050000800000800000823509067000001000040205600705938002600057080302604500000080900
+060870005008090700007000081000900040000040618845610907324589000071400000009167000
+020500009600302080487900305000009003203000900798400000800000590000890207000653000
+305906102900000407000400030050040020604201070200000040469100050037090210500687300
+000376901032900480160002750000859207000721008208600009403100860007008000090000370
+080046305900003020004500000010002580030805146050010200671030000043057900000001000
+005000000081906073790040015368729501040100738057483026014000000806000059000670400
+164030080700481265000070401030800047400007392007040000940000000520600870378000006
+050801067147659800368704500001047685730500291586912004000493120419080053000070946
+700402090193000400084600005400125630020086000010374008001030980040500070000801050
+806000710009000040000001000040009001000100472781246030000012398008003100003900250
+000540067270080351036000008000497502000015000053026000000004700020001004140060903
+010000700209547861040008900004603000370004600096700080903062107001309208000000006
+842071930003000600070308104701000000389547061020010857098065013100002000465039002
+180570400740000280520030060030900701250100093001356804800000072010085946407060518
+060502008380706095002180430030007849010405600000360001007903100100074300043020900
+000098600002031000090652000809000000076040038300809200104007060600900703907000000
+930005000100006050520047301007408000810060524002050000200001045060800200401000007
+390000425200950006006400000000506090850709360000000071900170608005092007108360059
+000547002000008700010900350001000203000716080875000001000405620750000409090000835
+603800000871064502002000080500000790000340206027050041016570000200406300700002000
+090321450005000300100086090700003000000068000006057009571030000060800973000072000
+605901000000000000000580000507060930000000000094010678483090000206854000709000006
+000104080000803000018070240700058406630240000489001000002000050060012003893065120
+900037000008100070050096030815670004604200000009400700100000650500000307097005000
+108050030907001000065309781010824007004070023000000640420017090009460000001038002
+830200006206004093009053020005060007100802504600045912971028630062130040340096270
+000010400004305690907864210100000009520690040706040032365071800001250900009400351
+500070608006530200480169007000600500304000700610740800060002000040950180857016030
+805400700400805906000062085001050000026940150094201060100024670040509300009007000
+845200700001058000060010000000582004007900152000741300000105000350670200010029030
+006083000000009482000001060780040006030810500100600038017000020008230970090070854
+837415296600007518521000004003000020100850940009000060302500007010000009900700002
+600201397200436501031097400507000043062054000000000000900308700000720008700040600
+040617500900850064500092380080720053706900008054008000670001040402509006000064070
+300000000001835000000740053090308624040050300000006570000970836000002740704583219
+010006000000100020300027000000064107602003908001958460004001000060040071000030000
+600000020000000940074286130507320000289040700103078500002760090036000278090802004
+800901234000000570009407816045306000000208140000000000000025000500040300014083050
+010058700000096051047302000200064390400020100705000600003040070002671003070805000
+005000400180040000600000319006794030403600000809000706300408027000000050090500083
+930006050460105903200000146003870600098002470002540090006700510754200060019650700
+940726105006001040217300980694813050001000460002460890065070000000049000000000674
+096013000057060104041050003030690841070128359910000002000000008400086000100204000
+710008003406190020000006190897502030100000708003000912000000270970620385020070600
+158030700000000000020005908002090583840003179310070002900400007000001496004780020
+020980005000060000089010460218007034004030056560490080002009040041300500000000020
+023450000000030450008007039000500013000100042015000008000000170671085004254900380
+000001200002904100015000708008000030300000000000009080859460002020000600030090804
+010600040400319708803425609120900050007800132000000007500090300600001075700500064
+600831002000000810001006030060000500005000091049000007000180900900004100010003200
+005470013190005020000000005300500280582000106000008500901000472000250390008000051
+900740680514000297000500030350904000081060950790310020248073000670452018000890702
+600000050108345007007200093076000002400023670280709030902508741015400380804000500
+584930127097108050063050984010860005000400800008001000000310002732680410001020008
+008510000400008013120600004840000306003009200059802001207001835531086902084005000
+008020409000000318900104000360290000000000040000400603846000020100060730030901500
+020910087000000000000723956013008504000001000000530010100495070000160400457302009
+002400000005908640047003008000049003009807000000000000804000700090780410201304000
+006087000100300704908502000500098021090650437700423805210076040080215376607800012
+000002049050000078028950306090805430000260080500000690849126053030004001007500004
+009831500004205073001700002003487651080300027006500389000000708908000230350000900
+030001407004300100070948005127004000649503700083010246306075892092006501700190000
+140200090039400000700390014407063029351029840902080057090002470816907005070035000
+260035090047026100503007000900300080380200507710650903009562300008000200425000609
+890576201070020006600403700410000025050001984900004073036002400509607300100930007
+070463801104208900680000200000759002765100000930000005000004786800507010397080000
+036200800000430005059700003003672051214005300060004028020003000698527034005108702
+700050100050180079001600538079000060020060000005800040587046300002375080006208700
+000000170080600042706520000800060050010050087000018963160070034000089000258006709
+007080069000917004091000023623090070080073052170206908002060000019000306460000000
+495000003210000000786513020800600300600009001039002040000000207324090000050326004
+001023000293750400580164023120000060970200800300817250050302108000005302830401000
+058000200360209005120470008016024053200503680583060421002140000470392800801750042
+600450809913072000054900000100040050086500300340726900400007000000600083739200401
+009107005854003002700500400036000008005006200180070654007090001000054007000031540
+030970080200000700018003004870039460050004020460057010000008109900316050105000040
+801030000046050000230460870370080906629300718508906000007008090003520087000703000
+907045080003000600058603297692000000800092700000006942316007020289001470000800036
+000040683862375410000000000605427100290610300400953000980701030003584976000000040
+070000100520041900000070000918000005400080319350000400730100250040257803005430000
+290104058075003020004200300002806000750392040906741580601020730300010065500009000
+150062049003040000694170235301900700040700000760080352908010560000007001400630078
+104600089000954000970300240410700060060083002007046001300071004600400107040209803
+200003698036029471001600032307000905000007000029130080000800004060402010042000857
+800005006740008000900600071050736240064009008000500003007001300400862507500300604
+000083000000642300032901640305000400018400050009130068003050176150069830480007500
+200030814004008690800090273000910006630005082500802431950007100006080007700451060
+095002000000950608060004500009040806628090000040078010300400100954700380100080960
+907604018008093040302071090700100020496732001200008476070000104600017500000000702
+007000000600000340204070180000041003503902000000538021040000700000000490060057030
+710502308090000021000000697400807050500000900832940006080009462920486710607001030
+690080305045600020008050600064903270002007504007200903400008000000501430000496000
+305060280014723609000800041903608700480200530702000890030000160046080005508900020
+000720300106003008000406009002580001090267583680000724063800140054000090007642830
+080015004020600008000809026538070040040002837079483005002051400090000500800060070
+000730059007005618600000437860500090900320006700960100083250000200009503590000742
+300000017087020000100706080836209000502600030400500860058060049710900050060400100
+405003600000504900130020704002000040307200509014035072001400306250006080009087205
+900050106105700000300006000098065001010007900530008264750089402040520080001304000
+008104090902365047000890130070200000100047380050083000409006013607050420501408700
+200140307040790000000200004000402000025060840900007030470009508098671020310854906
+009562000030708006080300000000007964207690038064830021091003080375406210608001047
+050000483300000790000008610100745800800900070400030000013009040509487361640013000
+006002009059080040010004600067408301000763000000209407130600958570900036092005074
+100500002000070000080900100810000006407030091609205000000100607700300809900008020
+090240180001700005604018230709460308065309001000007400182603594900520000500000010
+417009000300406900090573400675340810004100307001000004782604193103007065560001700
+059000800004500706007030000000090000900160502068253000731680005800015030500000681
+605000012801000400049215870500430690010670040000059030007108905008040003250793080
+160080900050904006000200540017860490490032800000040013600050030823600050540320009
+762503140001847256005006379004060891230108560180904000927000603600029005008600027
+709020150024500009800941200000090006200700008900068010092000607600009030000630905
+060008190201600070500204863000805900000006000007001058700980000618050000903007400
+005004873000032000030050160700026000082005609563090007006500701007019506050687294
+030040600140080000090300054000005203053000106007000540085000327200004065069750408
+030018000680720003104300002360000420708000009001032708092001060000080004406000005
+007000000084500170510790400200004095000057028090800714001200980000376540050100000
+010278000400010875897400030200087504705024900000150702320001000054000127100002000
+060009000042081056050040020000100500004050030185060009600035412010600000003900060
+019500700457210039360749025801065097600097018005002003176904000003621074940070600
+450000000208054630001826000009040871000301906800007000567030008083005207024008593
+020010840400070000010400000009035600003001408002800000084050100000000500205090384
+025100096000562070000009520206005900007920600510680300700291030938000014102400760
+300250000000000900008709236030590460000030829600020500004172005000000070020300600
+000000000369000200280000134006130058027896300010000020000045010000001070051900003
+097208034030947000000136597054820009100690003060003000700000008480019020920480670
+069831000000009630300000000570100000010570962094008157005007820000905376087200510
+000000045957040102300500860280164090000702610716905204100620950009300006600009071
+235907100000805070600000902060700514503000807170050009346200780791080023000300601
+006000308200000904000000600403500020600318040057460109009070000748023090001904000
+730020001000070030290001870540080910800100000001400307957000100100002090062000000
+689000700000350000503000000300910807000068000807000590000081009006079082098630005
+004580692890000031050000740083600910470015000100800000007002800000900170900078253
+010802300803100602700000400200000037560073980300080000028904705040700090037600800
+900180700000009260006700009780502140005060000000810020248000300300000415500040680
+000009001230180960100000280300900807087600000540870019000001400001090008700000006
+386000509010860003200309010703001000901000030060730190847000000102000080005000000
+269401578081526490400879216920700304070060009043902650002600045304000061057008000
+040000069000500280009004000792006040008000700300400008004963000000040030003080000
+000370910057000403039051007560023009003010600002569138005100006010200000978000021
+000000000008009420010670800826000305050280096009006078480960003395807002267015004
+070900004009008030030045009004231950003450000025870010360107800508300190007004000
+009001020700000400052046100978060010300790860020810007600028790204950601197000205
+720038000004072890036005200510304020003060040002080039305806017000700000000143980
+003087004090430802018560007041056708000348000860009003604093120520800000137005080
+000000000030206107090078002060590208759830041040160009604009700000641020013785000
+002000009000205407046709020320104006001000094804900000000003900497028630000491750
+041087329000109040080400060060598001810204090070360804007006532230000900006020000
+030090000000387062805200000006020107200100080180000000549800076300000200021053049
+180090703007005004050230010040089002008572300025006000803960420514728009096000000
+000000470740023009000094002000008027407000850060070000603045090000236010210987034
+104980067000000000900000040000000000091872006860051900510060000600000700040090000
+018300007400008530009054800935000402080541300741230005800012700090083054063070290
+009038746800900000001040900492815000150060400080407500005783160203690805678201000
+015003604648920537007406120000207900000800061859064200481000359070040000020508040
+106300002800521060003806400960000504700002039004000008090015040008607195005900006
+830020000670140002200396074065080240082400160497260500000500003000010400000002090
+009500000075120908013070002350410270000095004900800560092701843086002090000048625
+197836052000049000004100698000420000000365180010098230368910720050000903400000860
+470060090381090002009000017700000689296053074048679200820030041000910003913000800
+002900103005000000803501000320400500140005832080000000030250400268703915050810300
+509060030007008210814703005080079146000030708000000052900305001100000680300610570
+157084096080005002002790100900050070070008504000047689030410007090032001000009030
+908541200007009000051002409020003000009000080105067324010790630002300000000004900
+007301490005960000000570300080049000000613802176000900000495000200030708003200140
+000020005000078090200004006506003708309761000020400069054000802602047051018030040
+985200017200900000030700800503006901649000008708520046002098700300600080090407523
+500163700140950680000204190000000010004801507319572000205010400476000050900700302
+000300009249500003603090000027000010004000600500200904302107008400832000000904030
+742000800000942006090087241200001058800560000509208014000000000906050087001700495
+009000023300906008825030406000364007438000269007200130000400000000502040040610005
+085000036030090008200638975001080000403900000800700090300016004020300017048502309
+902600000000490600400087539309800074645070090000904200034000901700040803000060705
+004300060020790000000065402000000208200408017080120009008001023513276080040003106
+801300000095010000020589000108427506940653180650001200080200061009178040510000070
+040060000027400065605030240800017090260040350090050000089300070076194003402000010
+824000603030200080701060000000000000270000315040100007000001006006370004310006058
+200617000000985073000243860459032010306000025007504038940020657503090000802001304
+407901000010000000093607040825300090640080203730005004370060400002000005104003072
+070832000065041207320000480040060093000029054003104600010000360904506870007000940
+284300190301029000000014003035281976928000000700000040100698030003500060562130000
+050000200000002603400367000300005817581003029927048356230700004064009185108000730
+603000710400000000080000430060470200804260100027001040300000580205703964908000002
+105090080000003205927008631000000576000900000001020000608000000010307400050001907
+000400923000010008040200016070008030000634207936127000400060002000000364013002070
+801570302020009000074103000007830009908042001400701000063257980085904063040060000
+004090070651403280000801050306107008048209760000086001009620030080000012000018005
+015629084000500600008000502106098200000060000874030096700000328000800057509300060
+541070003060000020289000574000090065325681490090050002007000059812035000000420018
+670010200000509710501000400902607001700981504000000900309478100205090070087300040
+269437080801000207000820604000304728004070900078002301092000873007200000050709012
+009008405000007000317509806000100030034200700701960500000030600000000004000406280
+120800903000402016400000280891047000200950000000008009004580092009603104002794068
+512006043389452600740009580600700000000000400075690000027935008000047009900000000
+024009031017300960690701085000400100000807000975000648708062003250034876036070000
+000070305057000000318456000740000020000000519091000037100500000000142000209030050
+065013000004560139003020600501009084070200561000001000350190007000085910900340806
+986000700003950086251060400027546819010379624690001075502007008070005031108003540
+752090003039070260060004905605043089840012756001000342500000020006401000294500001
+000941050000067000040080690400070312670003900301000076509000000204096105000532069
+060000012104607000000092470000400000002509004407206198000700000070004003600823007
+004036092000000000006000000390080600600500019051600020060070000780000900000258070
+000009600000004380072000010006040728200097040000028009000060800890415000000903470
+703100009065004087418670532071390040000002600002740300130068020040913806506427013
+005367210401020360006000000080000040030040080004800000200000003143706025758030096
+928000000017490300060080500050002903790060400030050076000800005205679134003045800
+008050000102000040309000610000008204940607130800010579694200701007000000001900450
+570000000006000005200051030630090020050017006008362007820976510390100762760000009
+630200409042906500905400200400008907078094165000062040000600854094027001086105002
+058470003010000720030280000005600000000902000349010080576009000003150000192860305
+206704901100200865009601000008010000010000500620840300000090250492300080000000600
+000027014020060700000148002600712408000000000009600271017000300000071805200539007
+902700514051000986684900300000670251026130070007002630000800195019306002070090003
+370012040004000200000094000400000796017940300200357010008000904000089000040063100
+071004020642090508000672000000120900183960005260000017008419063016000092000086004
+178900000004001039039000001960580403000209008800300000090000080003160000000708304
+280074509705210060036590700104050000603709421079140350040001270912837640360400090
+200001570000035048100700000000000600010970000700000800801309200042680901609000000
+170002000000000029009000006940060275003900080065017000000100300000003002310750008
+004500306600301000832609501210900005463000720080720610948153000320007158000000030
+400001006385060200100000400042010080000005712000907004200108000600009100800036900
+100075206056012047702040000000091000608204073970006020361020508000563710007100030
+000008004000006310837400069000901053010005206080000901001000835028053640500067190
+856003140000000080003010000921600004000030000000000000305040076018069020060370900
+105800037809040000267509800093051400020008301080270509000005006052000093974006205
+086013400450020800000640059240105003308069001060370008097000310003000074610030080
+013057000802060500045002800000078124070040036021030008237005609050700380006403000
+800007090309060070000000542080154209001376000430009067000090300960580714000640005
+207600000600029071500407206300950004054070368020306090070005643005000000000000050
+000030010000080047000720006210040700000090100007108423001002094083000271700000005
+700000000063085200509073000007009001900000000216050000305290060000506013601038500
+005897004080056070009000200041635802506008000000400050400180630003740500007563000
+649300500205400017170000030002504109307200040004070000450003780786000090000748000
+804350020006840001007106040501973400000060008029080000000400670165020300400600000
+400060200000002030392105046074590100069430005030607498503280000721000084980700002
+128605079560400081349017620005960010006200090073108246690042007000501002802000000
+028467000004301700067502834032600008009000010010000003570200049240900007003070052
+800009042000000090002418050380000070000705000006300008540126700679804015103507684
+009000000000000024800209036004592803082630040030108069500004390270900400408000052
+001600059000100837089054160912836700050040298000529306043005070195007023027903500
+508600900401509820009708640804090501600070000000405090700960054140000030050143060
+000840002200000500040012000720163000406058709850070026080600971004007205070590403
+900002410267010090500009200106000034350970002400630905020180000000207040000345000
+800700010000308600007501800400650080506200000731000200354000927092000108108930400
+003800007090005003607100000009040100040008070000052006800000530904000001001089000
+310400008080100025000609010000806200048302000200000030000004007002930146004068392
+002057169000096703069000004086000000300000600075804001450000810620701400000045002
+306000709210090030070036502009614000060207000480903000701520904690071080840369007
+895040000001002034002507008439700182000000450000020073010005000500000001206070340
+000000809040800070000000006000060000908200000002000003580000607196473008703005010
+406020098009000360103600000300070210007015036510006900600004500800902140030001609
+152486003079030000438700100006309000000004057080610000800000020301048579000963000
+205830607000091050908060200020070060580000102090000405000008003050000704040703520
+750004103000052678006710000473120005000000009090408000800306207000501300000207010
+387000240002708009000003700048516003030280650600000020800362400006409300003070560
+004087029026050804070000000090803705100560098680270040050100007000000000801730000
+020000805536001407000006000014500070005012000062007590051008006603170042000620158
+593007800000506930607090005479050010136809072050000493925004000040900056008000240
+003004760082000004000962003210006009000000800000000306007080090109050608050420100
+000000090008930060097040053702506938053000600901382504080709345420100009000804016
+000600205050071098060000007006000054009080070571946820600100300190800702000260080
+080762001342008000670054028917840006406020000820000007098400562004609010003080794
+005400608000800000040061000027000000104090700060274013000040087601732450400085030
+009400083203000000500302900000006700897003106625817439031004890082030605900020041
+070100006108000000326407580000920003009600050000075400000700600002069100600208975
+079000023030280406604300900080605047500020891497000000300002600706100209002003708
+000902005740156009965070200106780090007009006308461000600020910070600003510090008
+501090000307050090000000584906570400000000072734008900810300009000089000690400025
+600300902109260008000900041500002860000685720860790004400520187758030006001070030
+800000963007003050000009087400806100000200600009000700050900000108465000042038510
+025106000009053201713928000200400530500071000000500090068210900050634710137090624
+396040070700080000480005913060009001239008507140067000000701008815300004000094002
+305010000001006800006250070590030200130002400000100507859300701000000082203000900
+300904020800002003524803961000008000437100658000050310640005107000090536700601480
+000320000608409000002000040000094720003006900789235061321067054004182300000040010
+410800703607031000305600000060009107100070090003180502204000001800000009000010254
+001050060075238940003001070000006080308920706000000124157062008032000000400079030
+408000172521000938007120460000034091000071000140600723035849207000050309900312080
+060201090000030002020600348010090700907108006846000021403060800601784205582010600
+000300009001500000643009507200005708070080105000030904000050070000894052000701000
+000070000370000050005304801700400310900783405040020700100000500000608100809250000
+603000805900700130704380906062900000497018200831050000000100308000820510008039042
+623009100901400200045000630308501062100600053000347910230900000400016307007200590
+172800005930105640460009708300900061000603027816700500251086079000000080000230050
+005090000300000000900625080104000068530286091068904573050409812000071009600052004
+203850704490031850050000210000000108000002000501760930700000000900607021180020007
+006403800548001900201000000800000000025000148103500000300080600680030405009065280
+105000639096000402702060050200537100070010523000000064029674000003090247000000986
+060001000009650100203040750900037001050028060400006800005703000040005300700900015
+030090040002050709070483265003804052068900004924300670006049107051608490490201506
+347009500500028000000043000684100027153200006702006805005070040070060250008000700
+290000000000000006506871003020308519014560002000217000039000125062705000005100000
+060435000042070000000002670200000060000024001493001000075043000620000349834609200
+670809002230700059900402700406573900520008060090206000849000230002000600060320000
+706153020098002317031070050050000000320000005004000063000805630083706500065000082
+540900001209040007760180040300819000800020000006537000000064720400201800000708000
+400607003302000094100040000000520941005431006600000532086013400040908020291000000
+100850643068001527503260901042608005850000014310002800730180402680025000004736100
+000009730200008000005000000029507006010000029006010000008090200700806010900020008
+090020804310698000250407000509046170070300480001870069840060090907053000160904702
+002000018000002700468091503006008350010060087009003601000610035807005106001309000
+050804030980651004100073000005100080040000317016030542520700460037008150400060000
+107009045000170009600530000060098020200040761000000000015900070700003502000000003
+005090008931850762000230051450372189302010605817009000500000020008040500070605800
+164050980089064700053010040908406017316790024470082306500000000047020030800000270
+053400080007300006082150040376090854094070001000064039000940300738602005020735608
+900806017000010000106057002021070809038190006600280070314908025805700100097501408
+000006708007000090918000036000080004091004005706200380085710060604020051030040027
+000002000009000400000000100400000309052390600000204008080609230021705986690020000
+103709068000300000000206300800000700000070006297600005760005480000968200000000000
+072000634048963025030700009400689002025071496603002170001090200000000980089437061
+735090018900004070002170000890000702070020640024005090051980300349010507007003109
+000200009002700080000080702006003201821000506935000000289000000007008060560070008
+200000037087430001930005020090021048075894203040070010420610300003908070700050400
+000003040040500000639002070350029600070600390006000000007300026020070431063000050
+800300020309006057050029630034601200000700000002003900200568093500000064670934010
+260000104100000298804001700020100009010905027739000561580040910900056840040010070
+700206080800370501400189007090800010000000002100700800040000106071000258302000409
+037090000000000000002450637090560400000310000000000376000073850509100260300005700
+100020065820000071000051030687295400912043700054018029078036090231400000500102307
+000230080809060023005007601000370000003018000090040005040000002000000900300480006
+907504082058209374200870910000600140861040030074090820702000400000020000100080203
+030000976000070230000309000750002694602004000008603107070800009240000710000040062
+080003059097002830003080201240000516709600300000210000901000020870020060600000043
+090300000008002400051006009000060013600038002030001040020000080107609200080054067
+360200840000604500000003020120030700043708296000002030815306002600807051700120300
+417060502905020000000005090198000000020009610356400000072000904849007060000804000
+650007400403010780087406251068270095700000600039600800814500903072100064000700000
+000057381430812905001009002300205010600000000000070809760000008009040000200068137
+000302070130000080079010003900081060608074095040000020751020000062100750304000200
+700310040840000710000974080300602894900043500004009000102030906006000370073090021
+300008000050020070002709038900580007000201300000007800069010700000065000000002000
+400509000690308452005706003000100860706893214189064300908072536000030000004600901
+038794105002006000750300006000120060200000570900005001001409000003587600807200000
+001000905986003012205000800000400578004050160007038020000309650659010300300670090
+803040075054700630000500400502419307001070002067080001200007516310800794009004200
+920067854000810309003504201300001520095000010710258403039706085152080037600130900
+020057006038612094005834027040000000803520741500700008002400835000005410000080600
+740850000005003620020001580002900301000500209379206000608079100097005030031048700
+507039080001840003806250010010000040420300000308005020160500497003000601050670032
+715006208483000670006000005800500014500093800169000007020870060047600003000031002
+794800120308900064160403000030210050500000000200040917070104005000607301800030070
+800001093900830104041769000080352040209000051000100000000928400008000327006573809
+000080400006070502004060800678201000009843007000090008000400320350900000040030010
+015304008008270001400081000029600417034010000000005283952047006740106000086050000
+000500038050000260020800405060483092800605310532000684405016023079240000216357800
+647000259002504060010000040700012080004000900160780000029041600000020091050900324
+400352960370410000020000030902503700050000094000109000230790186610004009897601040
+300502601640001000205607480961020008008009002000013796003106024006090050504070003
+102900400350070090804050067007000010215436900400807605041700500028609701060581040
+054308690907400003800970040300090402090010006600003001200140069000602034401500700
+200040695045600017006005420003051060000236900460879100807003040600584000000000006
+000234800800070004003190602050860000008910360009043280085006700004000500607301000
+060010408054000319000924657010000982403270560825160700000301000000792036370840090
+021000007970000008083000009100003076307600980608704100210060734800020560060130002
+800003000400100739009000500580010200000700068601008075190005000065071090700609800
+023600580000300020809045103700020010900000800406500790600800230050472908200030050
+710000590536720480982010073408002000000000000050007209000000020003200956260078034
+930827000086030402207000090090070004040006010025000000000700049068090031000080206
+002060019000928600097000800246309170008000020010046398009600780870000000060890250
+829034701630170000100020800000007000760000910200800070008710246400200500002640109
+000108306200009075600327000563000087480076013007080000000830000391702804006005702
+040680000290007648786249001014030000600500304030800000000070005460920180300400000
+070049650060370090319006400027405000903680004040003010000560002082907000605204038
+090800050000700009800924000903506000674080315000030060540308006007000803368470001
+000059000030008469096003080500000000020060530680001007007000000950300010008405000
+000200000586300002720000401650093000004025600003600009000930240300860910190400368
+500000932396850000100930580050000470010049058904000000800005060035106000400000810
+000067004000502860000000000400300000903206700027009010018704000005020000006803201
+035000010961342005207100000600051000000480001000603900310270500750800062800000000
+007609120462380050000057060700000080084126009029073640000000408210034590000010000
+092460000030029000058301000800010350000000014000080000075002480980053007210007095
+574030002000040001600070483907405300000000007008000090800290140040356829095000736
+062095430043000200089040067010476000496000000000052000020700000601000008000060002
+034906050000008960090052310080000701409070608001000005000001070140593200000027143
+360280005280000060000060082008000700643000500001435000034027050956300217100050308
+920008104000000826010050907159072300000430079004000200065800002090006080078003690
+090023751107045900530070002471038600365200010002010500700002148000007090246189000
+054890007027403160390170045500030700030001094009040050603004000000315000485200003
+800010706500890300000007090940150037000900081108670004004700029250006070700000000
+000390026830601700600082300564039200900060000300504008745000009006058007000906452
+002100400400209510070054062706000800008040000340078601004013089001002006027090135
+310002000540001060960007000025700091800000027000509480054080070600975002001206835
+000410050450000070817900024200076000305000208601850090090003017003090680764081002
+005010083038692701761800000080000500000060910193058007600580302050900000070320140
+060105478504002010000600030007023100000000000008900002000407003200039800040208500
+508019000913406500060308419050600870700000390080090060000067050800005647075103902
+000001960908200000060000010201658097000002540000304801000403600007925100080100205
+000050400000000900531904782009010300410830070703500800050028000900600003000300500
+786042103310685702000100000004000020000406005050000001501200090923000504060509200
+009041260420087000801600347207005980183000076090803400012706830700900002508004710
+000000254010982000320004109000005762460279801000030045070150400048300097053400600
+090004200000100009024905000085760090000030014000800070940250000008010905570308001
+000006890906210570501009040200783410170942306030100000050691004607030005094527000
+090103280721056004000200516053000860600005000100360000945030000200000400018090620
+920300507007804906010005403102608700000410000400009060200703608706002030309180204
+600700000007004200009003807001500008352080104708030090800360001200000670416205003
+060850012000006050501470869040700200057020000200360047705000900086000420300209000
+800000200000002007009057010040000795900005184501498300083000000600003870002500400
+782503000000000325053000847698000403300900001100430000000001000009000608810020750
+000604001000020400008005000036000020900500038800060000200000346070036080600002510
+000000048801070020024010603103000950090100007702359010009030060607090005000761092
+000000300060000010510963004080300107607090000030720500000034000306007450070009200
+000090040000200070009700080070020800008017000690583207000105020000036005300942068
+000002800700804100008000794040780000809246030627015940002500400006498005004100300
+020040091501060040000003056103000608900012037602000004307200060065071400409306075
+016795003740301209908000071620908700083000010000002000357069108862107390100050600
+405300090200010070070089051730000680600090702042000009020048510100907028080031004
+390005000280300540400002000040090028720000105863000900000000406000000050904658203
+300526870008000020250008360705000000400630058800000010000740031040060007500013400
+300000009706408010082030675009004008008510007001000546000845200923071050800293001
+010240000006009000000005084890020003201708956000904000000400310003501072004390008
+400100079820500000050000006000380702000092065205000090003670820008034650060801030
+900681740000070000716495230190000004504000620080050900060000400009060580250040006
+030601900900735400005042030401000002500000643800400009150800004080100097740000281
+020000430508249000000018000780902000005100280302684509053896040006730020070000306
+000040000027036410000001800500170600000008000006405301600050000139700006050600030
+000362094438001006090004013105020907870049005062000040320605080607000401519008000
+780300960030007854920800700002610000510400007008000106200100009840005621063094508
+008000906002000000003500010580100070200007005000050002034078500070040008800060004
+582006000010004020460952710000149380000580001800060040007000003600021804000070100
+001609500000084201000027964004790600700310092100000007059001800010952000400063109
+020000609009040501000000000400580910810609305960030827306017050200060000000020100
+000900020200800000970002010480536000060270584007090103000300700000000950094065830
+605710000010060038030200010070004062406000589000008307060000050107840003042051070
+500000830010600500309452107000070000000041350800060409075000013108030040023010706
+780020300001000000024500006430000200615000000800413000240050098190002000008940030
+800090470040700008060080003604057000075008000003604007308045000000000801029060045
+970031250200000010010400970001300002840962130002500700709800501400009000186253490
+007002090000000300932000000408000007700250801500874239000098603659300008301460072
+000430009070000504001790080000010050000620000010350090100003740004200008708006000
+579000023010900740463172058002000600700003800006018000000700060605380210007001304
+000950000031746800524138697050010000316409008009500321102600700460000000795081060
+684090000321076985570030061750804319008300700140709608000502000030000094400900020
+800069007070000050430000002710090045002040800043200090097482560254010008600035020
+792000000000100000381059240209000000078042351100070092510000020023701005847095003
+613890570400000000002010000340080700059067430000005600160729053938601047520348960
+056000000701290000320610400009038042100500689000460001890000000200381000400926800
+063270000018960020275084096026500030597003080030000605602400300700130040300752809
+000008040403005000900360075075080402200000800108002006300040508840000967000800000
+000100607821006040009450103907000400145203070300000591006947010408630050790010200
+080060001300250000490003020000340608200671300000500700905130800806407090700000000
+000002003000005004300000008400007000010080532290150000063740000507290086820530701
+340901876109080200082000309507609002800005791000017060930008127020100004050002000
+100890004648310729009004008900071000704038000000502071300120405081753000005409007
+450326000200007040700085609004000063170200590005060714000608052501700000602004987
+001000020000105809902840010103000005080002040407050300000300900008519070679084153
+107003065584070000060050100010005372473800000602000000796408030231590600000060000
+050000060300700081087010350210000873040107000093060105008000539009308400004000700
+073200600090108050510000209051000030364007892709380105006000304000000020105030900
+090740060064020007307090002026080400010005000070200010000059030630000750000300090
+006500700000301800009080050080007005005600107307915400578092000003806000900100584
+060098005218700000970010800193070080000002004407061509002000901030140000001020040
+005900010300405008008301700070634001060082070184009030017000000056203100009510820
+070481006000070890000305074630008000907210348148003000020100007000527031700830000
+410780350000000084900543000140027090362800007007004000050000030200658901000231040
+000700400380000020100402000037080005000000307500200004702301089850090000400800603
+000702008000560000083041000102005974008400030004619852037890501940003000000204009
+395078164000613005167009308580930040609002581004000600900827006000304800478560200
+700041000000000701051720600600910324504000090000800000030102905290000100100090400
+000092800000075139390010070000000008405067302000021546030780000809203600700100400
+061480900075200004409075003830900005127000039500300821008009500912004376000000000
+000040000280760100940802000094030008008520070000907406350408000400650001860071050
+002000034005003968000000201000200700070095086059000003301900000590040000000060000
+040103600309060100006907843015306070630004080080000006293000400060830000001609320
+000030060050100380208500071682340010349610020100008000004086007801050000003400850
+000410500008057102104290008407805000030720400820003070700030856300600900900500300
+008000903025300600670050014091846570860003100254079036080430060006790400000600300
+013074065649015073200060004000402000000700050000000000506140820100500340400006010
+816000002000200130000005006027093001901000367004000029008950013102370400050001200
+009000000430051080075908003046009001093106470008320009300000214050017000820063005
+004006970600010352302050400801070009420000510700160823003085096107000005058600030
+350710690000030720000080050000690012130428000000100400000071946695002180014009200
+300064120142000970065002004000040000071009400400801200000007002723490501019000607
+064208009079000380000090040400061703600920008820040000902030057700000001500002034
+000852000873001042290004106024590378500073014067000290700185000400620050900007060
+290076058400530000510002000005007006060000500009165807052013004034058000801040030
+470083005000719008000004073050000790091000002740100500000046020067020800000370000
+700600108020590036000004905260087010000900567190060000384009071976003402510706890
+071030009034000070200054006000400208000020100480060703806001500000540601700680942
+410780200000000709097300008875190000001042000200007831150478906760001084980030105
+100060000000400000094051600908520010000817000510694302000046007200000000000200860
+060000800048030097305018020830250964006000000429160008003076000080390075097504003
+760200340002300608190060270240003106009000400000094000500002060000650830004000020
+000100650500406089702050000200091400009568200006700900981000520407000090020000004
+612004005000000060800500000560012478200000513001000009920073054000009086006805000
+358460127100700480049200000286031700010004002090082631900100000000025010621090350
+006081400500060007200050030000000640000000580054690070435978060000034708010006090
+040070050096000030205600708650000300071946080084025100460500003000403000000008400
+070000460015009200246800015063008540084306090000014080030700009402103000001690800
+040000300090000451005370009030401090704003516100000200070210900060040070050030002
+080604020000800300074000000807300010000000804145008730400700100703012000001080072
+000900503095804000204030879541690720003008090002001630100000056400309210000506300
+107000524400060010080120769000500002795230486000846000000652000631008000204013008
+090853006502019800000400000470081000900500078800374169200030004001290000000600020
+109005400004000500000000960007000025096180000020050600040000007600008000050427006
+004105709930000000570080302403900800105068007706000000000704960309000001007500020
+120008900300170520074620080000285610900000035000931470000893000000507000698002053
+000000000104950700720100040010007492070000800400680007050703000047000905060045300
+524100837678000001000870000005000709000029000792650408050060084036000200187045000
+100005602030000080528030094670002800003900006002100049045800900007419563961000428
+103680200800040673467200008301000402029008100600300897000570006200906754070000000
+042300001000506207035021460000200005000000980510060004920730800070150309053000100
+153007098809130500072000036916350000340001005205704310030000000021009000600000700
+107020506009080320200510040000700000090000070720008010900060030032005009000000050
+047200038008030000100480002010052060000978020000164003000093200435806710000501000
+651920470900001063003000109465108900090000035080205600004310706016850304030760002
+000060349970023016800019700308190267059600408007080190001000023062030004000207680
+417008600023050814000601720900800302385270069264130507796400200502786031030090006
+704005890985060027010978006570600008000080579021709000290816040000590080058430002
+740010200000020501015070403074032985102006030580007602460503807008760059057080000
+430280009600104700080637020900000007000050964706940203302400070070310090800000340
+036487920472109000100300067759028310020504000001703850064800009000040078080031000
+000000005035960142020000760061800007890030651070006489007003000000005010200140000
+000090170100000000370651080700030965608000402090160007907002008406085003000706091
+053700400800009700709003650006500017501008360340167985260845000190000000005000070
+000000050500069000780004069001098543000005002045100000160000075820051306000300001
+032400816604530020000620000250800300700000280003215600408000160361000002005003478
+009840312801036070540710698386200750290050864104000900070100089030087006608020507
+430208901100904832098100000304000018000812503820040070003007486600009105500000390
+802010750603045008000020000350000012089030600200400039000364090506271000130509007
+900060087054070600068003020020600904340500061091704203000300500009800710006952300
+000060002021078509046250173950000036013006085680034290030080010105640300000000007

Added: developers/erin_yueh/pythonEFL-sudoku/data/puzzle/solver.py
===================================================================
--- developers/erin_yueh/pythonEFL-sudoku/data/puzzle/solver.py	                        (rev 0)
+++ developers/erin_yueh/pythonEFL-sudoku/data/puzzle/solver.py	2008-07-04 08:13:32 UTC (rev 4506)
@@ -0,0 +1,252 @@
+#!/usr/bin/python
+
+import sys
+
+class SudokuSolver:
+    def __init__(self):
+        self.puzzle = None
+
+        self.row = [False] * 90
+        self.col = [False] * 90
+        self.grp = [False] * 90
+
+        self.steps = []
+        for i in xrange(9):
+            self.steps.append([])
+
+        self.scores = [-1] * 81
+
+        self.tries = []
+        for i in xrange(81):
+            self.tries.append([])
+
+        self.relatives = []
+        for r in xrange(9):
+            for c in xrange(9):
+                tmp = []
+                for x in xrange(9):
+                    if x != c:
+                        tmp.append(r * 9 + x)
+                for y in xrange(9):
+                    if y != r:
+                        tmp.append(y * 9 + c)
+                gr = (r / 3) * 3
+                gc = (c / 3) * 3
+                for y in xrange(gr, gr + 3):
+                    for x in xrange(gc, gc + 3):
+                        if y != r and x != c:
+                            tmp.append(y * 9 + x)
+
+                self.relatives.append(tmp)
+
+    def _verify(self):
+        print "verify"
+        for r in xrange(9):
+            for c in xrange(9):
+                s = self.scores[r * 9 + c]
+                if s == -1:
+                    continue
+
+                tmp = []
+                for n in xrange(1, 10):
+                    if not (self.row[r * 10 + n] or self.col[c * 10 + n] or self.grp[((r / 3) * 3 + (c / 3)) * 10 + n]):
+                        tmp.append(n)
+
+                if len(tmp) - 1 != s:
+                    print "(%d, %d) has score %d, instead of %d" % (r, c, len(tmp) - 1, s)
+                    return False
+
+                
+                old = self.tries[r * 9 + c][:]
+                old.sort()
+                if old != tmp:
+                    print "(%d, %d) has tries", tmp, "instead of", old
+
+                try:
+                    self.steps[s].index(r * 9 + c)
+                except:
+                    print "(%d, %d) @ %d is not a step" % (r, c, s)
+                    return False
+
+        return True
+
+    def _try(self, pos, n):
+        positions = []
+        for p in self.relatives[pos]:
+            if self.scores[p] >= 0 and n in self.tries[p]:
+                if len(self.tries[p]) == 1:
+                    return False
+
+                positions.append(p)
+
+        r = pos / 9
+        c = pos % 9
+        self.row[r * 10 + n] = True
+        self.col[c * 10 + n] = True
+        self.grp[((r / 3) * 3 + (c / 3)) * 10 + n] = True
+
+        self.puzzle[r][c] = n
+
+        for p in positions:
+            self.tries[p].remove(n)
+            s = self.scores[p]
+            self.scores[p] -= 1
+            self.steps[s - 1][:0] = [p]
+            self.steps[s].remove(p)
+
+        return True
+
+    def _undo(self, pos, n):
+        r = pos / 9
+        c = pos % 9
+        self.row[r * 10 + n] = False
+        self.col[c * 10 + n] = False
+        self.grp[((r / 3) * 3 + (c / 3)) * 10 + n] = False
+
+        self.puzzle[r][c] = 0
+
+        for p in self.relatives[pos]:
+            old_score = self.scores[p]
+            if old_score == -1:
+                continue
+
+            if n not in self.tries[p]:
+                y = p / 9
+                x = p % 9
+                if not (self.row[y * 10 + n] or self.col[x * 10 + n] or self.grp[((y / 3) * 3 + (x / 3)) * 10 + n]):
+                    self.tries[p][:0] = [n]
+                    self.scores[p] += 1
+                    self.steps[old_score + 1][:0] = [p]
+                    self.steps[old_score].remove(p)
+
+    def _solve(self):
+        pos = 81
+        for score in xrange(9):
+            if self.steps[score]:
+                pos = self.steps[score].pop()
+                break
+        if pos >= 81:
+            return True
+
+        self.scores[pos] = -1
+
+        for n in self.tries[pos]:
+            if self._try(pos, n):
+                if self._solve():
+                    return True
+                self._undo(pos, n)
+
+        self.scores[pos] = score
+        self.steps[score].append(pos)
+
+        return False
+
+    def _analyze(self):
+        for i in xrange(90):
+            self.row[i] = False
+            self.col[i] = False
+            self.grp[i] = False
+
+        for r in xrange(9):
+            for c in xrange(9):
+                pos = r * 9 + c
+                v = self.puzzle[r][c]
+                if v:
+                    if self.row[r * 10 + v] or self.col[c * 10 + v] or self.grp[((r / 3) * 3 + (c / 3)) * 10 + v]:
+                        return False
+
+                    self.row[r * 10 + v] = True
+                    self.col[c * 10 + v] = True
+                    self.grp[((r / 3) * 3 + (c / 3)) * 10 + v] = True
+
+                    self.scores[pos] = -1
+
+        for i in xrange(9):
+            self.steps[i] = []
+
+        for r in xrange(9):
+            for c in xrange(9):
+                pos = r * 9 + c
+                v = self.puzzle[r][c]
+                if not v:
+                    tries = []
+                    for n in xrange(1, 10):
+                        if not (self.row[r * 10 + n] or self.col[c * 10 + n] or self.grp[((r / 3) * 3 + (c / 3)) * 10 + n]):
+                            tries.append(n)
+
+                    if not tries:
+                        return False
+                    
+                    score = len(tries) - 1
+
+                    self.tries[pos] = tries
+                    self.scores[pos] = score
+                    self.steps[score].append(pos)
+
+        while (self.steps[0]):
+            pos = self.steps[0].pop()
+            r = pos / 9
+            c = pos % 9
+
+            v = self.tries[pos].pop()
+
+            self.row[r * 10 + v] = True
+            self.col[c * 10 + v] = True
+            self.grp[((r / 3) * 3 + (c / 3)) * 10 + v] = True
+            self.puzzle[r][c] = v
+
+            self.scores[pos] = -1
+
+            for p in self.relatives[pos]:
+                s = self.scores[p]
+                if s > 0 and v in self.tries[p]:
+                    self.tries[p].remove(v)
+                    self.scores[p] -= 1
+                    self.steps[s - 1][:0] = [p]
+                    self.steps[s].remove(p)
+
+        return True
+
+    def solve(self, puzzle):
+        self.puzzle = puzzle
+
+        if not self._analyze():
+            return False
+
+        return self._solve()
+
+def parse_file():
+    lines = sys.stdin.readlines()
+
+    puzzles = []
+    for l in lines:
+        if (len(l) != 82):
+            print "xxx"
+            continue
+
+        p = []
+        for i in xrange(9):
+            t = []
+            for j in xrange(9):
+                t.append(int(l[i * 9 + j]))
+            p.append(t)
+        puzzles.append(p)
+
+    return puzzles
+
+def main():
+    solver = SudokuSolver()
+    puzzles = parse_file()
+
+    for p in puzzles:
+        if (solver.solve(p)):
+            pass
+            for i in xrange(9):
+                print p[i]
+            print
+        else:
+            print "no solution"
+        
+
+if __name__ == "__main__":
+    main()

Added: developers/erin_yueh/pythonEFL-sudoku/data/puzzle/sudoku.py
===================================================================
--- developers/erin_yueh/pythonEFL-sudoku/data/puzzle/sudoku.py	                        (rev 0)
+++ developers/erin_yueh/pythonEFL-sudoku/data/puzzle/sudoku.py	2008-07-04 08:13:32 UTC (rev 4506)
@@ -0,0 +1,252 @@
+#!/usr/bin/python
+
+import sys
+
+class SudokuSolver:
+    def __init__(self):
+        self.puzzle = None
+
+        self.row = [False] * 90
+        self.col = [False] * 90
+        self.grp = [False] * 90
+
+        self.steps = []
+        for i in xrange(9):
+            self.steps.append([])
+
+        self.scores = [-1] * 81
+
+        self.tries = []
+        for i in xrange(81):
+            self.tries.append([])
+
+        self.relatives = []
+        for r in xrange(9):
+            for c in xrange(9):
+                tmp = []
+                for x in xrange(9):
+                    if x != c:
+                        tmp.append(r * 9 + x)
+                for y in xrange(9):
+                    if y != r:
+                        tmp.append(y * 9 + c)
+                gr = (r / 3) * 3
+                gc = (c / 3) * 3
+                for y in xrange(gr, gr + 3):
+                    for x in xrange(gc, gc + 3):
+                        if y != r and x != c:
+                            tmp.append(y * 9 + x)
+
+                self.relatives.append(tmp)
+
+    def _verify(self):
+        print "verify"
+        for r in xrange(9):
+            for c in xrange(9):
+                s = self.scores[r * 9 + c]
+                if s == -1:
+                    continue
+
+                tmp = []
+                for n in xrange(1, 10):
+                    if not (self.row[r * 10 + n] or self.col[c * 10 + n] or self.grp[((r / 3) * 3 + (c / 3)) * 10 + n]):
+                        tmp.append(n)
+
+                if len(tmp) - 1 != s:
+                    print "(%d, %d) has score %d, instead of %d" % (r, c, len(tmp) - 1, s)
+                    return False
+
+                
+                old = self.tries[r * 9 + c][:]
+                old.sort()
+                if old != tmp:
+                    print "(%d, %d) has tries", tmp, "instead of", old
+
+                try:
+                    self.steps[s].index(r * 9 + c)
+                except:
+                    print "(%d, %d) @ %d is not a step" % (r, c, s)
+                    return False
+
+        return True
+
+    def _try(self, pos, n):
+        positions = []
+        for p in self.relatives[pos]:
+            if self.scores[p] >= 0 and n in self.tries[p]:
+                if len(self.tries[p]) == 1:
+                    return False
+
+                positions.append(p)
+
+        r = pos / 9
+        c = pos % 9
+        self.row[r * 10 + n] = True
+        self.col[c * 10 + n] = True
+        self.grp[((r / 3) * 3 + (c / 3)) * 10 + n] = True
+
+        self.puzzle[r][c] = n
+
+        for p in positions:
+            self.tries[p].remove(n)
+            s = self.scores[p]
+            self.scores[p] -= 1
+            self.steps[s - 1][:0] = [p]
+            self.steps[s].remove(p)
+
+        return True
+
+    def _undo(self, pos, n):
+        r = pos / 9
+        c = pos % 9
+        self.row[r * 10 + n] = False
+        self.col[c * 10 + n] = False
+        self.grp[((r / 3) * 3 + (c / 3)) * 10 + n] = False
+
+        self.puzzle[r][c] = 0
+
+        for p in self.relatives[pos]:
+            old_score = self.scores[p]
+            if old_score == -1:
+                continue
+
+            if n not in self.tries[p]:
+                y = p / 9
+                x = p % 9
+                if not (self.row[y * 10 + n] or self.col[x * 10 + n] or self.grp[((y / 3) * 3 + (x / 3)) * 10 + n]):
+                    self.tries[p][:0] = [n]
+                    self.scores[p] += 1
+                    self.steps[old_score + 1][:0] = [p]
+                    self.steps[old_score].remove(p)
+
+    def _solve(self):
+        pos = 81
+        for score in xrange(9):
+            if self.steps[score]:
+                pos = self.steps[score].pop()
+                break
+        if pos >= 81:
+            return True
+
+        self.scores[pos] = -1
+
+        for n in self.tries[pos]:
+            if self._try(pos, n):
+                if self._solve():
+                    return True
+                self._undo(pos, n)
+
+        self.scores[pos] = score
+        self.steps[score].append(pos)
+
+        return False
+
+    def _analyze(self):
+        for i in xrange(90):
+            self.row[i] = False
+            self.col[i] = False
+            self.grp[i] = False
+
+        for r in xrange(9):
+            for c in xrange(9):
+                pos = r * 9 + c
+                v = self.puzzle[r][c]
+                if v:
+                    if self.row[r * 10 + v] or self.col[c * 10 + v] or self.grp[((r / 3) * 3 + (c / 3)) * 10 + v]:
+                        return False
+
+                    self.row[r * 10 + v] = True
+                    self.col[c * 10 + v] = True
+                    self.grp[((r / 3) * 3 + (c / 3)) * 10 + v] = True
+
+                    self.scores[pos] = -1
+
+        for i in xrange(9):
+            self.steps[i] = []
+
+        for r in xrange(9):
+            for c in xrange(9):
+                pos = r * 9 + c
+                v = self.puzzle[r][c]
+                if not v:
+                    tries = []
+                    for n in xrange(1, 10):
+                        if not (self.row[r * 10 + n] or self.col[c * 10 + n] or self.grp[((r / 3) * 3 + (c / 3)) * 10 + n]):
+                            tries.append(n)
+
+                    if not tries:
+                        return False
+                    
+                    score = len(tries) - 1
+
+                    self.tries[pos] = tries
+                    self.scores[pos] = score
+                    self.steps[score].append(pos)
+
+        while (self.steps[0]):
+            pos = self.steps[0].pop()
+            r = pos / 9
+            c = pos % 9
+
+            v = self.tries[pos].pop()
+
+            self.row[r * 10 + v] = True
+            self.col[c * 10 + v] = True
+            self.grp[((r / 3) * 3 + (c / 3)) * 10 + v] = True
+            self.puzzle[r][c] = v
+
+            self.scores[pos] = -1
+
+            for p in self.relatives[pos]:
+                s = self.scores[p]
+                if s > 0 and v in self.tries[p]:
+                    self.tries[p].remove(v)
+                    self.scores[p] -= 1
+                    self.steps[s - 1][:0] = [p]
+                    self.steps[s].remove(p)
+
+        return True
+
+    def solve(self, puzzle):
+        self.puzzle = puzzle
+
+        if not self._analyze():
+            return False
+
+        return self._solve()
+
+def parse_file():
+    lines = sys.stdin.readlines()
+
+    puzzles = []
+    for l in lines:
+        if (len(l) != 82):
+            print "xxx"
+            continue
+
+        p = []
+        for i in xrange(9):
+            t = []
+            for j in xrange(9):
+                t.append(int(l[i * 9 + j]))
+            p.append(t)
+        puzzles.append(p)
+
+    return puzzles
+
+def main():
+    solver = SudokuSolver()
+    puzzles = parse_file()
+
+    for p in puzzles:
+        if (solver.solve(p)):
+            pass
+            for i in xrange(9):
+                print p[i]
+            print
+        else:
+            print "no solution"
+        
+
+if __name__ == "__main__":
+    main()

Added: developers/erin_yueh/pythonEFL-sudoku/data/theme/image/gtk-clear.png
===================================================================
(Binary files differ)


Property changes on: developers/erin_yueh/pythonEFL-sudoku/data/theme/image/gtk-clear.png
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: developers/erin_yueh/pythonEFL-sudoku/data/theme/image/gtk-ok.png
===================================================================
(Binary files differ)


Property changes on: developers/erin_yueh/pythonEFL-sudoku/data/theme/image/gtk-ok.png
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: developers/erin_yueh/pythonEFL-sudoku/data/theme/image/gtk-redo.png
===================================================================
(Binary files differ)


Property changes on: developers/erin_yueh/pythonEFL-sudoku/data/theme/image/gtk-redo.png
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: developers/erin_yueh/pythonEFL-sudoku/data/theme/image/gtk-select-color.png
===================================================================
(Binary files differ)


Property changes on: developers/erin_yueh/pythonEFL-sudoku/data/theme/image/gtk-select-color.png
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: developers/erin_yueh/pythonEFL-sudoku/data/theme/image/gtk-undo-ltr.png
===================================================================
(Binary files differ)


Property changes on: developers/erin_yueh/pythonEFL-sudoku/data/theme/image/gtk-undo-ltr.png
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: developers/erin_yueh/pythonEFL-sudoku/data/theme/sudoku.edc
===================================================================
--- developers/erin_yueh/pythonEFL-sudoku/data/theme/sudoku.edc	                        (rev 0)
+++ developers/erin_yueh/pythonEFL-sudoku/data/theme/sudoku.edc	2008-07-04 08:13:32 UTC (rev 4506)
@@ -0,0 +1,1693 @@
+/* define what images we need */
+images {
+	image: "gtk-clear.png" COMP;
+	image: "gtk-ok.png" COMP;
+	image: "gtk-redo.png" COMP;
+	image: "gtk-undo-ltr.png" COMP;
+	image: "gtk-select-color.png" COMP;
+}
+/* start collections */
+collections {
+	group {
+		name: "pythonEFL-sudoku/background";
+		parts {
+			part {
+				name: "bg";
+				type: RECT;
+				description {
+					state: "default" 0.0;
+					color: 0 0 0 255;
+					rel1 {
+						relative: 0.0 0.0;
+						offset: 0 0;
+					}
+					rel2 {
+						relative: 1.0 1.0;
+						offset: 0 0;
+					}
+				}
+				description {
+					state: "white" 0.0;
+					inherit: "default" 0.0;
+					color: 255 255 255 255;
+				}
+			}
+		    part { 
+		        name: "swallow";
+                type: SWALLOW;
+                description {
+                    state: "default" 0.0;
+                    color: 0 255 255 255;
+                    rel1 {
+                        relative: 0.0 0.0;
+                        offset: 0 0;
+                        to: "bg";
+                    }
+                    rel2 {
+						relative: 0.0 0.75;
+						offset: 0 0;
+						offset: 0 0;
+					}
+                } 
+            }
+		} /* end of parts */
+		/* programs - where we react to events/signals */
+		programs {
+			program {
+				name: "show1";
+				signal: "show";
+				in: 1.0 0.0;
+				action: STATE_SET "default" 0.0;
+				target: "bg";
+				after: "show2";
+			}
+			program {
+				name: "show2";
+				in: 1.0 0.0;
+				action: STATE_SET "default2" 0.0;
+				target: "bg";
+				after: "show1";
+			}
+		}
+	} /* end of group */
+	
+	group {
+		name: "pythonEFL-sudoku/panel";
+		parts {
+			part {
+				name: "puzzle";
+				type: SWALLOW;
+				description {
+					state: "default" 0.0;
+					color: 0 0 0 255;
+					rel1 {
+						relative: 0.0 0.0;
+						offset: 0 0;
+					}
+					rel2 {
+						relative: 1.0 0.75;
+						offset: 0 0;
+					}
+				}
+			}
+			part { 
+			    name: "create";
+                description { 
+                    state: "default" 0.0;
+                    min: 36 36;
+                    max: 36 36;
+                    rel1 {
+                       to: "puzzle";
+                       relative: 0.0 1.0;
+                       offset: 0 20;
+                    }
+                    rel2 {
+                       to: "puzzle";
+                       relative: 0.0 1.0;
+                       offset: 40 20;
+                    }
+                    image.normal: "gtk-select-color.png";
+                 }
+            }
+            part { 
+			    name: "undo";
+                description { 
+                    state: "default" 0.0;
+                    min: 36 36;
+                    max: 36 36;
+                    rel1 {
+                       to: "puzzle";
+                       relative: 0.0 1.0;
+                       offset: 40 20;
+                    }
+                    rel2 {
+                       to: "puzzle";
+                       relative: 0.0 1.0;
+                       offset: 80 20;
+                    }
+                    image.normal: "gtk-undo-ltr.png";
+                 }
+            }
+            part { 
+			    name: "redo";
+                description { 
+                    state: "default" 0.0;
+                    min: 36 36;
+                    max: 36 36;
+                    rel1 {
+                       to: "puzzle";
+                       relative: 0.0 1.0;
+                       offset: 80 20;
+                    }
+                    rel2 {
+                       to: "puzzle";
+                       relative: 0.0 1.0;
+                       offset: 120 20;
+                    }
+                    image.normal: "gtk-redo.png";
+                 }
+            }
+            part { 
+			    name: "clear";
+                description { 
+                    state: "default" 0.0;
+                    min: 36 36;
+                    max: 36 36;
+                    rel1 {
+                       to: "puzzle";
+                       relative: 0.0 1.0;
+                       offset: 120 20;
+                    }
+                    rel2 {
+                       to: "puzzle";
+                       relative: 0.0 1.0;
+                       offset: 160 20;
+                    }
+                    image.normal: "gtk-clear.png";
+                 }
+            }
+            part { 
+			    name: "solve";
+                description { 
+                    state: "default" 0.0;
+                    min: 36 36;
+                    max: 36 36;
+                    rel1 {
+                       to: "puzzle";
+                       relative: 0.0 1.0;
+                       offset: 160 20;
+                    }
+                    rel2 {
+                       to: "puzzle";
+                       relative: 0.0 1.0;
+                       offset: 200 20;
+                    }
+                    image.normal: "gtk-ok.png";
+                 }
+            }
+		} /* end of parts */
+		/* programs - where we react to events/signals */
+		programs {
+			program {
+				name: "show1";
+				signal: "show";
+				in: 1.0 0.0;
+				action: STATE_SET "default" 0.0;
+				target: "puzzle";
+				after: "show2";
+			}
+			program {
+				name: "show2";
+				in: 1.0 0.0;
+				action: STATE_SET "default2" 0.0;
+				target: "puzzle";
+				after: "show1";
+			}
+		}
+	} /* end of group */
+    /* display 81 buttons for puzzle */
+    group {
+		name: "pythonEFL-sudoku/board";
+		parts {
+			/* row 0 */
+			part { 
+				name: "button0";
+		        type: RECT;
+		        mouse_events: 1;
+        		description { 
+        			state: "default" 0.0;
+		            color: 0 150 150 150;
+        		    rel1 {
+        		       relative: 0.0 0.0;
+        		       offset: 5 0;
+        		    }
+        		    rel2 {
+        		       relative: 0.0 0.0;
+        		       offset: 50 50;
+        		    }
+        		    align: 0.0 1.0;
+        		}
+      		}
+			part { 
+				name: "button1";
+		        type: RECT;
+		        mouse_events: 1;
+        		description { 
+        			state: "default" 0.0;
+		            color: 200 200 200 150;
+        		    rel1 {
+        		       relative: 0.0 0.0;
+        		       offset: 55 0;
+        		    }
+        		    rel2 {
+        		       relative: 0.0 0.0;
+        		       offset: 100 50;
+        		    }
+        		    align: 0.0 1.0;
+        		}
+      		}
+      		part { 
+				name: "button2";
+		        type: RECT;
+		        mouse_events: 1;
+        		description { 
+        			state: "default" 0.0;
+		            color: 0 150 150 150;
+        		    rel1 {
+        		       relative: 0.0 0.0;
+        		       offset: 105 0;
+        		    }
+        		    rel2 {
+        		       relative: 0.0 0.0;
+        		       offset: 150 50;
+        		    }
+        		    align: 0.0 1.0;
+        		}
+      		}
+			part { 
+				name: "button3";
+		        type: RECT;
+		        mouse_events: 1;
+        		description { 
+        			state: "default" 0.0;
+		            color: 200 200 200 150;
+        		    rel1 {
+        		       relative: 0.0 0.0;
+        		       offset: 155 0;
+        		    }
+        		    rel2 {
+        		       relative: 0.0 0.0;
+        		       offset: 200 50;
+        		    }
+        		    align: 0.0 1.0;
+        		}
+      		}
+      		part { 
+				name: "button4";
+		        type: RECT;
+		        mouse_events: 1;
+        		description { 
+        			state: "default" 0.0;
+		            color: 0 150 150 150;
+        		    rel1 {
+        		       relative: 0.0 0.0;
+        		       offset: 205 0;
+        		    }
+        		    rel2 {
+        		       relative: 0.0 0.0;
+        		       offset: 250 50;
+        		    }
+        		    align: 0.0 1.0;
+        		}
+      		}
+			part { 
+				name: "button5";
+		        type: RECT;
+		        mouse_events: 1;
+        		description { 
+        			state: "default" 0.0;
+		            color: 200 200 200 150;
+        		    rel1 {
+        		       relative: 0.0 0.0;
+        		       offset: 255 0;
+        		    }
+        		    rel2 {
+        		       relative: 0.0 0.0;
+        		       offset: 300 50;
+        		    }
+        		    align: 0.0 1.0;
+        		}
+      		}
+      		part { 
+				name: "button6";
+		        type: RECT;
+		        mouse_events: 1;
+        		description { 
+        			state: "default" 0.0;
+		            color: 0 150 150 150;
+        		    rel1 {
+        		       relative: 0.0 0.0;
+        		       offset: 305 0;
+        		    }
+        		    rel2 {
+        		       relative: 0.0 0.0;
+        		       offset: 350 50;
+        		    }
+        		    align: 0.0 1.0;
+        		}
+      		}
+			part { 
+				name: "button7";
+		        type: RECT;
+		        mouse_events: 1;
+        		description { 
+        			state: "default" 0.0;
+		            color: 200 200 200 150;
+        		    rel1 {
+        		       relative: 0.0 0.0;
+        		       offset: 355 0;
+        		    }
+        		    rel2 {
+        		       relative: 0.0 0.0;
+        		       offset: 400 50;
+        		    }
+        		    align: 0.0 1.0;
+        		}
+      		}
+      		part { 
+				name: "button8";
+		        type: RECT;
+		        mouse_events: 1;
+        		description { 
+        			state: "default" 0.0;
+		            color: 0 150 150 150;
+        		    rel1 {
+        		       relative: 0.0 0.0;
+        		       offset: 405 0;
+        		    }
+        		    rel2 {
+        		       relative: 0.0 0.0;
+        		       offset: 450 50;
+        		    }
+        		    align: 0.0 1.0;
+        		}
+      		}
+      		/* end of row 0 */
+      		/* row 2*/
+      		part { 
+				name: "button18";
+		        type: RECT;
+		        mouse_events: 1;
+        		description { 
+        			state: "default" 0.0;
+		            color: 0 150 150 150;
+        		    rel1 {
+        		       relative: 0.0 0.0;
+        		       offset: 5 100;
+        		    }
+        		    rel2 {
+        		       relative: 0.0 0.0;
+        		       offset: 50 150;
+        		    }
+        		    align: 0.0 1.0;
+        		}
+      		}
+			part { 
+				name: "button19";
+		        type: RECT;
+		        mouse_events: 1;
+        		description { 
+        			state: "default" 0.0;
+		            color: 200 200 200 150;
+        		    rel1 {
+        		       relative: 0.0 0.0;
+        		       offset: 55 100;
+        		    }
+        		    rel2 {
+        		       relative: 0.0 0.0;
+        		       offset: 100 150;
+        		    }
+        		    align: 0.0 1.0;
+        		}
+      		}
+      		part { 
+				name: "button20";
+		        type: RECT;
+		        mouse_events: 1;
+        		description { 
+        			state: "default" 0.0;
+		            color: 0 150 150 150;
+        		    rel1 {
+        		       relative: 0.0 0.0;
+        		       offset: 105 100;
+        		    }
+        		    rel2 {
+        		       relative: 0.0 0.0;
+        		       offset: 150 150;
+        		    }
+        		    align: 0.0 1.0;
+        		}
+      		}
+			part { 
+				name: "button21";
+		        type: RECT;
+		        mouse_events: 1;
+        		description { 
+        			state: "default" 0.0;
+		            color: 200 200 200 150;
+        		    rel1 {
+        		       relative: 0.0 0.0;
+        		       offset: 155 100;
+        		    }
+        		    rel2 {
+        		       relative: 0.0 0.0;
+        		       offset: 200 150;
+        		    }
+        		    align: 0.0 1.0;
+        		}
+      		}
+      		part { 
+				name: "button22";
+		        type: RECT;
+		        mouse_events: 1;
+        		description { 
+        			state: "default" 0.0;
+		            color: 0 150 150 150;
+        		    rel1 {
+        		       relative: 0.0 0.0;
+        		       offset: 205 100;
+        		    }
+        		    rel2 {
+        		       relative: 0.0 0.0;
+        		       offset: 250 150;
+        		    }
+        		    align: 0.0 1.0;
+        		}
+      		}
+			part { 
+				name: "button23";
+		        type: RECT;
+		        mouse_events: 1;
+        		description { 
+        			state: "default" 0.0;
+		            color: 200 200 200 150;
+        		    rel1 {
+        		       relative: 0.0 0.0;
+        		       offset: 255 100;
+        		    }
+        		    rel2 {
+        		       relative: 0.0 0.0;
+        		       offset: 300 150;
+        		    }
+        		    align: 0.0 1.0;
+        		}
+      		}
+      		part { 
+				name: "button24";
+		        type: RECT;
+		        mouse_events: 1;
+        		description { 
+        			state: "default" 0.0;
+		            color: 0 150 150 150;
+        		    rel1 {
+        		       relative: 0.0 0.0;
+        		       offset: 305 100;
+        		    }
+        		    rel2 {
+        		       relative: 0.0 0.0;
+        		       offset: 350 150;
+        		    }
+        		    align: 0.0 1.0;
+        		}
+      		}
+			part { 
+				name: "button25";
+		        type: RECT;
+		        mouse_events: 1;
+        		description { 
+        			state: "default" 0.0;
+		            color: 200 200 200 150;
+        		    rel1 {
+        		       relative: 0.0 0.0;
+        		       offset: 355 100;
+        		    }
+        		    rel2 {
+        		       relative: 0.0 0.0;
+        		       offset: 400 150;
+        		    }
+        		    align: 0.0 1.0;
+        		}
+      		}
+      		part { 
+				name: "button26";
+		        type: RECT;
+		        mouse_events: 1;
+        		description { 
+        			state: "default" 0.0;
+		            color: 0 150 150 150;
+        		    rel1 {
+        		       relative: 0.0 0.0;
+        		       offset: 405 100;
+        		    }
+        		    rel2 {
+        		       relative: 0.0 0.0;
+        		       offset: 450 150;
+        		    }
+        		    align: 0.0 1.0;
+        		}
+      		}
+      		/* end of row 2*/
+      		/* row 4 */
+      		part { 
+				name: "button36";
+		        type: RECT;
+		        mouse_events: 1;
+        		description { 
+        			state: "default" 0.0;
+		            color: 0 150 150 150;
+        		    rel1 {
+        		       relative: 0.0 0.0;
+        		       offset: 5 200;
+        		    }
+        		    rel2 {
+        		       relative: 0.0 0.0;
+        		       offset: 50 250;
+        		    }
+        		    align: 0.0 1.0;
+        		}
+      		}
+			part { 
+				name: "button37";
+		        type: RECT;
+		        mouse_events: 1;
+        		description { 
+        			state: "default" 0.0;
+		            color: 200 200 200 150;
+        		    rel1 {
+        		       relative: 0.0 0.0;
+        		       offset: 55 200;
+        		    }
+        		    rel2 {
+        		       relative: 0.0 0.0;
+        		       offset: 100 250;
+        		    }
+        		    align: 0.0 1.0;
+        		}
+      		}
+      		part { 
+				name: "button38";
+		        type: RECT;
+		        mouse_events: 1;
+        		description { 
+        			state: "default" 0.0;
+		            color: 0 150 150 150;
+        		    rel1 {
+        		       relative: 0.0 0.0;
+        		       offset: 105 200;
+        		    }
+        		    rel2 {
+        		       relative: 0.0 0.0;
+        		       offset: 150 250;
+        		    }
+        		    align: 0.0 1.0;
+        		}
+      		}
+			part { 
+				name: "button39";
+		        type: RECT;
+		        mouse_events: 1;
+        		description { 
+        			state: "default" 0.0;
+		            color: 200 200 200 150;
+        		    rel1 {
+        		       relative: 0.0 0.0;
+        		       offset: 155 200;
+        		    }
+        		    rel2 {
+        		       relative: 0.0 0.0;
+        		       offset: 200 250;
+        		    }
+        		    align: 0.0 1.0;
+        		}
+      		}
+      		part { 
+				name: "button40";
+		        type: RECT;
+		        mouse_events: 1;
+        		description { 
+        			state: "default" 0.0;
+		            color: 0 150 150 150;
+        		    rel1 {
+        		       relative: 0.0 0.0;
+        		       offset: 205 200;
+        		    }
+        		    rel2 {
+        		       relative: 0.0 0.0;
+        		       offset: 250 250;
+        		    }
+        		    align: 0.0 1.0;
+        		}
+      		}
+			part { 
+				name: "button41";
+		        type: RECT;
+		        mouse_events: 1;
+        		description { 
+        			state: "default" 0.0;
+		            color: 200 200 200 150;
+        		    rel1 {
+        		       relative: 0.0 0.0;
+        		       offset: 255 200;
+        		    }
+        		    rel2 {
+        		       relative: 0.0 0.0;
+        		       offset: 300 250;
+        		    }
+        		    align: 0.0 1.0;
+        		}
+      		}
+      		part { 
+				name: "button42";
+		        type: RECT;
+		        mouse_events: 1;
+        		description { 
+        			state: "default" 0.0;
+		            color: 0 150 150 150;
+        		    rel1 {
+        		       relative: 0.0 0.0;
+        		       offset: 305 200;
+        		    }
+        		    rel2 {
+        		       relative: 0.0 0.0;
+        		       offset: 350 250;
+        		    }
+        		    align: 0.0 1.0;
+        		}
+      		}
+			part { 
+				name: "button43";
+		        type: RECT;
+		        mouse_events: 1;
+        		description { 
+        			state: "default" 0.0;
+		            color: 200 200 200 150;
+        		    rel1 {
+        		       relative: 0.0 0.0;
+        		       offset: 355 200;
+        		    }
+        		    rel2 {
+        		       relative: 0.0 0.0;
+        		       offset: 400 250;
+        		    }
+        		    align: 0.0 1.0;
+        		}
+      		}
+      		part { 
+				name: "button44";
+		        type: RECT;
+		        mouse_events: 1;
+        		description { 
+        			state: "default" 0.0;
+		            color: 0 150 150 150;
+        		    rel1 {
+        		       relative: 0.0 0.0;
+        		       offset: 405 200;
+        		    }
+        		    rel2 {
+        		       relative: 0.0 0.0;
+        		       offset: 450 250;
+        		    }
+        		    align: 0.0 1.0;
+        		}
+      		}
+      		/* end of row4*/
+      		/* row 6 */
+      		part { 
+				name: "button54";
+		        type: RECT;
+		        mouse_events: 1;
+        		description { 
+        			state: "default" 0.0;
+		            color: 0 150 150 150;
+        		    rel1 {
+        		       relative: 0.0 0.0;
+        		       offset: 5 300;
+        		    }
+        		    rel2 {
+        		       relative: 0.0 0.0;
+        		       offset: 50 350;
+        		    }
+        		    align: 0.0 1.0;
+        		}
+      		}
+			part { 
+				name: "button55";
+		        type: RECT;
+		        mouse_events: 1;
+        		description { 
+        			state: "default" 0.0;
+		            color: 200 200 200 150;
+        		    rel1 {
+        		       relative: 0.0 0.0;
+        		       offset: 55 300;
+        		    }
+        		    rel2 {
+        		       relative: 0.0 0.0;
+        		       offset: 100 350;
+        		    }
+        		    align: 0.0 1.0;
+        		}
+      		}
+      		part { 
+				name: "button56";
+		        type: RECT;
+		        mouse_events: 1;
+        		description { 
+        			state: "default" 0.0;
+		            color: 0 150 150 150;
+        		    rel1 {
+        		       relative: 0.0 0.0;
+        		       offset: 105 300;
+        		    }
+        		    rel2 {
+        		       relative: 0.0 0.0;
+        		       offset: 150 350;
+        		    }
+        		    align: 0.0 1.0;
+        		}
+      		}
+			part { 
+				name: "button57";
+		        type: RECT;
+		        mouse_events: 1;
+        		description { 
+        			state: "default" 0.0;
+		            color: 200 200 200 150;
+        		    rel1 {
+        		       relative: 0.0 0.0;
+        		       offset: 155 300;
+        		    }
+        		    rel2 {
+        		       relative: 0.0 0.0;
+        		       offset: 200 350;
+        		    }
+        		    align: 0.0 1.0;
+        		}
+      		}
+      		part { 
+				name: "button58";
+		        type: RECT;
+		        mouse_events: 1;
+        		description { 
+        			state: "default" 0.0;
+		            color: 0 150 150 150;
+        		    rel1 {
+        		       relative: 0.0 0.0;
+        		       offset: 205 300;
+        		    }
+        		    rel2 {
+        		       relative: 0.0 0.0;
+        		       offset: 250 350;
+        		    }
+        		    align: 0.0 1.0;
+        		}
+      		}
+			part { 
+				name: "button59";
+		        type: RECT;
+		        mouse_events: 1;
+        		description { 
+        			state: "default" 0.0;
+		            color: 200 200 200 150;
+        		    rel1 {
+        		       relative: 0.0 0.0;
+        		       offset: 255 300;
+        		    }
+        		    rel2 {
+        		       relative: 0.0 0.0;
+        		       offset: 300 350;
+        		    }
+        		    align: 0.0 1.0;
+        		}
+      		}
+      		part { 
+				name: "button60";
+		        type: RECT;
+		        mouse_events: 1;
+        		description { 
+        			state: "default" 0.0;
+		            color: 0 150 150 150;
+        		    rel1 {
+        		       relative: 0.0 0.0;
+        		       offset: 305 300;
+        		    }
+        		    rel2 {
+        		       relative: 0.0 0.0;
+        		       offset: 350 350;
+        		    }
+        		    align: 0.0 1.0;
+        		}
+      		}
+			part { 
+				name: "button61";
+		        type: RECT;
+		        mouse_events: 1;
+        		description { 
+        			state: "default" 0.0;
+		            color: 200 200 200 150;
+        		    rel1 {
+        		       relative: 0.0 0.0;
+        		       offset: 355 300;
+        		    }
+        		    rel2 {
+        		       relative: 0.0 0.0;
+        		       offset: 400 350;
+        		    }
+        		    align: 0.0 1.0;
+        		}
+      		}
+      		part { 
+				name: "button62";
+		        type: RECT;
+		        mouse_events: 1;
+        		description { 
+        			state: "default" 0.0;
+		            color: 0 150 150 150;
+        		    rel1 {
+        		       relative: 0.0 0.0;
+        		       offset: 405 300;
+        		    }
+        		    rel2 {
+        		       relative: 0.0 0.0;
+        		       offset: 450 350;
+        		    }
+        		    align: 0.0 1.0;
+        		}
+      		}
+      		/* end of row6*/
+      		/* row 8 */
+      		part { 
+				name: "button72";
+		        type: RECT;
+		        mouse_events: 1;
+        		description { 
+        			state: "default" 0.0;
+		            color: 0 150 150 150;
+        		    rel1 {
+        		       relative: 0.0 0.0;
+        		       offset: 5 400;
+        		    }
+        		    rel2 {
+        		       relative: 0.0 0.0;
+        		       offset: 50 450;
+        		    }
+        		    align: 0.0 1.0;
+        		}
+      		}
+			part { 
+				name: "button73";
+		        type: RECT;
+		        mouse_events: 1;
+        		description { 
+        			state: "default" 0.0;
+		            color: 200 200 200 150;
+        		    rel1 {
+        		       relative: 0.0 0.0;
+        		       offset: 55 400;
+        		    }
+        		    rel2 {
+        		       relative: 0.0 0.0;
+        		       offset: 100 450;
+        		    }
+        		    align: 0.0 1.0;
+        		}
+      		}
+      		part { 
+				name: "button74";
+		        type: RECT;
+		        mouse_events: 1;
+        		description { 
+        			state: "default" 0.0;
+		            color: 0 150 150 150;
+        		    rel1 {
+        		       relative: 0.0 0.0;
+        		       offset: 105 400;
+        		    }
+        		    rel2 {
+        		       relative: 0.0 0.0;
+        		       offset: 150 450;
+        		    }
+        		    align: 0.0 1.0;
+        		}
+      		}
+			part { 
+				name: "button75";
+		        type: RECT;
+		        mouse_events: 1;
+        		description { 
+        			state: "default" 0.0;
+		            color: 200 200 200 150;
+        		    rel1 {
+        		       relative: 0.0 0.0;
+        		       offset: 155 400;
+        		    }
+        		    rel2 {
+        		       relative: 0.0 0.0;
+        		       offset: 200 450;
+        		    }
+        		    align: 0.0 1.0;
+        		}
+      		}
+      		part { 
+				name: "button76";
+		        type: RECT;
+		        mouse_events: 1;
+        		description { 
+        			state: "default" 0.0;
+		            color: 0 150 150 150;
+        		    rel1 {
+        		       relative: 0.0 0.0;
+        		       offset: 205 400;
+        		    }
+        		    rel2 {
+        		       relative: 0.0 0.0;
+        		       offset: 250 450;
+        		    }
+        		    align: 0.0 1.0;
+        		}
+      		}
+			part { 
+				name: "button77";
+		        type: RECT;
+		        mouse_events: 1;
+        		description { 
+        			state: "default" 0.0;
+		            color: 200 200 200 150;
+        		    rel1 {
+        		       relative: 0.0 0.0;
+        		       offset: 255 400;
+        		    }
+        		    rel2 {
+        		       relative: 0.0 0.0;
+        		       offset: 300 450;
+        		    }
+        		    align: 0.0 1.0;
+        		}
+      		}
+      		part { 
+				name: "button78";
+		        type: RECT;
+		        mouse_events: 1;
+        		description { 
+        			state: "default" 0.0;
+		            color: 0 150 150 150;
+        		    rel1 {
+        		       relative: 0.0 0.0;
+        		       offset: 305 400;
+        		    }
+        		    rel2 {
+        		       relative: 0.0 0.0;
+        		       offset: 350 450;
+        		    }
+        		    align: 0.0 1.0;
+        		}
+      		}
+			part { 
+				name: "button79";
+		        type: RECT;
+		        mouse_events: 1;
+        		description { 
+        			state: "default" 0.0;
+		            color: 200 200 200 150;
+        		    rel1 {
+        		       relative: 0.0 0.0;
+        		       offset: 355 400;
+        		    }
+        		    rel2 {
+        		       relative: 0.0 0.0;
+        		       offset: 400 450;
+        		    }
+        		    align: 0.0 1.0;
+        		}
+      		}
+      		part { 
+				name: "button80";
+		        type: RECT;
+		        mouse_events: 1;
+        		description { 
+        			state: "default" 0.0;
+		            color: 0 150 150 150;
+        		    rel1 {
+        		       relative: 0.0 0.0;
+        		       offset: 405 400;
+        		    }
+        		    rel2 {
+        		       relative: 0.0 0.0;
+        		       offset: 450 450;
+        		    }
+        		    align: 0.0 1.0;
+        		}
+      		}
+      		/* end of row8*/
+			/* row 1 */
+			part { 
+				name: "button9";
+		        type: RECT;
+		        mouse_events: 1;
+        		description { 
+        			state: "default" 0.0;
+		            color: 200 200 200 150;
+        		    rel1 {
+        		       relative: 0.0 0.0;
+        		       offset: 5 50;
+        		    }
+        		    rel2 {
+        		       relative: 0.0 0.0;
+        		       offset: 50 100;
+        		    }
+        		    align: 0.0 1.0;
+        		}
+      		}
+			part { 
+				name: "button10";
+		        type: RECT;
+		        mouse_events: 1;
+        		description { 
+        			state: "default" 0.0;
+		            color: 0 150 150 150;
+        		    rel1 {
+        		       relative: 0.0 0.0;
+        		       offset: 55 50;
+        		    }
+        		    rel2 {
+        		       relative: 0.0 0.0;
+        		       offset: 100 100;
+        		    }
+        		    align: 0.0 1.0;
+        		}
+      		}
+      		part { 
+				name: "button11";
+		        type: RECT;
+		        mouse_events: 1;
+        		description { 
+        			state: "default" 0.0;
+		            color: 200 200 200 150;
+        		    rel1 {
+        		       relative: 0.0 0.0;
+        		       offset: 105 50;
+        		    }
+        		    rel2 {
+        		       relative: 0.0 0.0;
+        		       offset: 150 100;
+        		    }
+        		    align: 0.0 1.0;
+        		}
+      		}
+			part { 
+				name: "button12";
+		        type: RECT;
+		        mouse_events: 1;
+        		description { 
+        			state: "default" 0.0;
+		            color: 0 150 150 150;
+        		    rel1 {
+        		       relative: 0.0 0.0;
+        		       offset: 155 50;
+        		    }
+        		    rel2 {
+        		       relative: 0.0 0.0;
+        		       offset: 200 100;
+        		    }
+        		    align: 0.0 1.0;
+        		}
+      		}
+      		part { 
+				name: "button13";
+		        type: RECT;
+		        mouse_events: 1;
+        		description { 
+        			state: "default" 0.0;
+		            color: 200 200 200 150;
+        		    rel1 {
+        		       relative: 0.0 0.0;
+        		       offset: 205 50;
+        		    }
+        		    rel2 {
+        		       relative: 0.0 0.0;
+        		       offset: 250 100;
+        		    }
+        		    align: 0.0 1.0;
+        		}
+      		}
+			part { 
+				name: "button14";
+		        type: RECT;
+		        mouse_events: 1;
+        		description { 
+        			state: "default" 0.0;
+		            color: 0 150 150 150;
+        		    rel1 {
+        		       relative: 0.0 0.0;
+        		       offset: 255 50;
+        		    }
+        		    rel2 {
+        		       relative: 0.0 0.0;
+        		       offset: 300 100;
+        		    }
+        		    align: 0.0 1.0;
+        		}
+      		}
+      		part { 
+				name: "button15";
+		        type: RECT;
+		        mouse_events: 1;
+        		description { 
+        			state: "default" 0.0;
+		            color: 200 200 200 150;
+        		    rel1 {
+        		       relative: 0.0 0.0;
+        		       offset: 305 50;
+        		    }
+        		    rel2 {
+        		       relative: 0.0 0.0;
+        		       offset: 350 100;
+        		    }
+        		    align: 0.0 1.0;
+        		}
+      		}
+			part { 
+				name: "button16";
+		        type: RECT;
+		        mouse_events: 1;
+        		description { 
+        			state: "default" 0.0;
+		            color: 0 150 150 150;
+        		    rel1 {
+        		       relative: 0.0 0.0;
+        		       offset: 355 50;
+        		    }
+        		    rel2 {
+        		       relative: 0.0 0.0;
+        		       offset: 400 100;
+        		    }
+        		    align: 0.0 1.0;
+        		}
+      		}
+      		part { 
+				name: "button17";
+		        type: RECT;
+		        mouse_events: 1;
+        		description { 
+        			state: "default" 0.0;
+		            color: 200 200 200 150;
+        		    rel1 {
+        		       relative: 0.0 0.0;
+        		       offset: 405 50;
+        		    }
+        		    rel2 {
+        		       relative: 0.0 0.0;
+        		       offset: 450 100;
+        		    }
+        		    align: 0.0 1.0;
+        		}
+      		}
+      		/* end of row 1 */  
+			/* row 3 */
+			part { 
+				name: "button27";
+		        type: RECT;
+		        mouse_events: 1;
+        		description { 
+        			state: "default" 0.0;
+		            color: 200 200 200 150;
+        		    rel1 {
+        		       relative: 0.0 0.0;
+        		       offset: 5 150;
+        		    }
+        		    rel2 {
+        		       relative: 0.0 0.0;
+        		       offset: 50 200;
+        		    }
+        		    align: 0.0 1.0;
+        		}
+      		}
+			part { 
+				name: "button28";
+		        type: RECT;
+		        mouse_events: 1;
+        		description { 
+        			state: "default" 0.0;
+		            color: 0 150 150 150;
+        		    rel1 {
+        		       relative: 0.0 0.0;
+        		       offset: 55 150;
+        		    }
+        		    rel2 {
+        		       relative: 0.0 0.0;
+        		       offset: 100 200;
+        		    }
+        		    align: 0.0 1.0;
+        		}
+      		}
+      		part { 
+				name: "button29";
+		        type: RECT;
+		        mouse_events: 1;
+        		description { 
+        			state: "default" 0.0;
+		            color: 200 200 200 150;
+        		    rel1 {
+        		       relative: 0.0 0.0;
+        		       offset: 105 150;
+        		    }
+        		    rel2 {
+        		       relative: 0.0 0.0;
+        		       offset: 150 200;
+        		    }
+        		    align: 0.0 1.0;
+        		}
+      		}
+			part { 
+				name: "button30";
+		        type: RECT;
+		        mouse_events: 1;
+        		description { 
+        			state: "default" 0.0;
+		            color: 0 150 150 150;
+        		    rel1 {
+        		       relative: 0.0 0.0;
+        		       offset: 155 150;
+        		    }
+        		    rel2 {
+        		       relative: 0.0 0.0;
+        		       offset: 200 200;
+        		    }
+        		    align: 0.0 1.0;
+        		}
+      		}
+      		part { 
+				name: "button31";
+		        type: RECT;
+		        mouse_events: 1;
+        		description { 
+        			state: "default" 0.0;
+		            color: 200 200 200 150;
+        		    rel1 {
+        		       relative: 0.0 0.0;
+        		       offset: 205 150;
+        		    }
+        		    rel2 {
+        		       relative: 0.0 0.0;
+        		       offset: 250 200;
+        		    }
+        		    align: 0.0 1.0;
+        		}
+      		}
+			part { 
+				name: "button32";
+		        type: RECT;
+		        mouse_events: 1;
+        		description { 
+        			state: "default" 0.0;
+		            color: 0 150 150 150;
+        		    rel1 {
+        		       relative: 0.0 0.0;
+        		       offset: 255 150;
+        		    }
+        		    rel2 {
+        		       relative: 0.0 0.0;
+        		       offset: 300 200;
+        		    }
+        		    align: 0.0 1.0;
+        		}
+      		}
+      		part { 
+				name: "button33";
+		        type: RECT;
+		        mouse_events: 1;
+        		description { 
+        			state: "default" 0.0;
+		            color: 200 200 200 150;
+        		    rel1 {
+        		       relative: 0.0 0.0;
+        		       offset: 305 150;
+        		    }
+        		    rel2 {
+        		       relative: 0.0 0.0;
+        		       offset: 350 200;
+        		    }
+        		    align: 0.0 1.0;
+        		}
+      		}
+			part { 
+				name: "button34";
+		        type: RECT;
+		        mouse_events: 1;
+        		description { 
+        			state: "default" 0.0;
+		            color: 0 150 150 150;
+        		    rel1 {
+        		       relative: 0.0 0.0;
+        		       offset: 355 150;
+        		    }
+        		    rel2 {
+        		       relative: 0.0 0.0;
+        		       offset: 400 200;
+        		    }
+        		    align: 0.0 1.0;
+        		}
+      		}
+      		part { 
+				name: "button35";
+		        type: RECT;
+		        mouse_events: 1;
+        		description { 
+        			state: "default" 0.0;
+		            color: 200 200 200 150;
+        		    rel1 {
+        		       relative: 0.0 0.0;
+        		       offset: 405 150;
+        		    }
+        		    rel2 {
+        		       relative: 0.0 0.0;
+        		       offset: 450 200;
+        		    }
+        		    align: 0.0 1.0;
+        		}
+      		}
+      		/* end of row 3 */  
+			/* row 5 */
+			part { 
+				name: "button45";
+		        type: RECT;
+		        mouse_events: 1;
+        		description { 
+        			state: "default" 0.0;
+		            color: 200 200 200 150;
+        		    rel1 {
+        		       relative: 0.0 0.0;
+        		       offset: 5 250;
+        		    }
+        		    rel2 {
+        		       relative: 0.0 0.0;
+        		       offset: 50 300;
+        		    }
+        		    align: 0.0 1.0;
+        		}
+      		}
+			part { 
+				name: "button46";
+		        type: RECT;
+		        mouse_events: 1;
+        		description { 
+        			state: "default" 0.0;
+		            color: 0 150 150 150;
+        		    rel1 {
+        		       relative: 0.0 0.0;
+        		       offset: 55 250;
+        		    }
+        		    rel2 {
+        		       relative: 0.0 0.0;
+        		       offset: 100 300;
+        		    }
+        		    align: 0.0 1.0;
+        		}
+      		}
+      		part { 
+				name: "button47";
+		        type: RECT;
+		        mouse_events: 1;
+        		description { 
+        			state: "default" 0.0;
+		            color: 200 200 200 150;
+        		    rel1 {
+        		       relative: 0.0 0.0;
+        		       offset: 105 250;
+        		    }
+        		    rel2 {
+        		       relative: 0.0 0.0;
+        		       offset: 150 300;
+        		    }
+        		    align: 0.0 1.0;
+        		}
+      		}
+			part { 
+				name: "button48";
+		        type: RECT;
+		        mouse_events: 1;
+        		description { 
+        			state: "default" 0.0;
+		            color: 0 150 150 150;
+        		    rel1 {
+        		       relative: 0.0 0.0;
+        		       offset: 155 250;
+        		    }
+        		    rel2 {
+        		       relative: 0.0 0.0;
+        		       offset: 200 300;
+        		    }
+        		    align: 0.0 1.0;
+        		}
+      		}
+      		part { 
+				name: "button49";
+		        type: RECT;
+		        mouse_events: 1;
+        		description { 
+        			state: "default" 0.0;
+		            color: 200 200 200 150;
+        		    rel1 {
+        		       relative: 0.0 0.0;
+        		       offset: 205 250;
+        		    }
+        		    rel2 {
+        		       relative: 0.0 0.0;
+        		       offset: 250 300;
+        		    }
+        		    align: 0.0 1.0;
+        		}
+      		}
+			part { 
+				name: "button50";
+		        type: RECT;
+		        mouse_events: 1;
+        		description { 
+        			state: "default" 0.0;
+		            color: 0 150 150 150;
+        		    rel1 {
+        		       relative: 0.0 0.0;
+        		       offset: 255 250;
+        		    }
+        		    rel2 {
+        		       relative: 0.0 0.0;
+        		       offset: 300 300;
+        		    }
+        		    align: 0.0 1.0;
+        		}
+      		}
+      		part { 
+				name: "button51";
+		        type: RECT;
+		        mouse_events: 1;
+        		description { 
+        			state: "default" 0.0;
+		            color: 200 200 200 150;
+        		    rel1 {
+        		       relative: 0.0 0.0;
+        		       offset: 305 250;
+        		    }
+        		    rel2 {
+        		       relative: 0.0 0.0;
+        		       offset: 350 300;
+        		    }
+        		    align: 0.0 1.0;
+        		}
+      		}
+			part { 
+				name: "button52";
+		        type: RECT;
+		        mouse_events: 1;
+        		description { 
+        			state: "default" 0.0;
+		            color: 0 150 150 150;
+        		    rel1 {
+        		       relative: 0.0 0.0;
+        		       offset: 355 250;
+        		    }
+        		    rel2 {
+        		       relative: 0.0 0.0;
+        		       offset: 400 300;
+        		    }
+        		    align: 0.0 1.0;
+        		}
+      		}
+      		part { 
+				name: "button53";
+		        type: RECT;
+		        mouse_events: 1;
+        		description { 
+        			state: "default" 0.0;
+		            color: 200 200 200 150;
+        		    rel1 {
+        		       relative: 0.0 0.0;
+        		       offset: 405 250;
+        		    }
+        		    rel2 {
+        		       relative: 0.0 0.0;
+        		       offset: 450 300;
+        		    }
+        		    align: 0.0 1.0;
+        		}
+      		}
+      		/* end of row 5 */ 
+      		/* row 7 */
+			part { 
+				name: "button63";
+		        type: RECT;
+		        mouse_events: 1;
+        		description { 
+        			state: "default" 0.0;
+		            color: 200 200 200 150;
+        		    rel1 {
+        		       relative: 0.0 0.0;
+        		       offset: 5 350;
+        		    }
+        		    rel2 {
+        		       relative: 0.0 0.0;
+        		       offset: 50 400;
+        		    }
+        		    align: 0.0 1.0;
+        		}
+      		}
+			part { 
+				name: "button64";
+		        type: RECT;
+		        mouse_events: 1;
+        		description { 
+        			state: "default" 0.0;
+		            color: 0 150 150 150;
+        		    rel1 {
+        		       relative: 0.0 0.0;
+        		       offset: 55 350;
+        		    }
+        		    rel2 {
+        		       relative: 0.0 0.0;
+        		       offset: 100 400;
+        		    }
+        		    align: 0.0 1.0;
+        		}
+      		}
+      		part { 
+				name: "button65";
+		        type: RECT;
+		        mouse_events: 1;
+        		description { 
+        			state: "default" 0.0;
+		            color: 200 200 200 150;
+        		    rel1 {
+        		       relative: 0.0 0.0;
+        		       offset: 105 350;
+        		    }
+        		    rel2 {
+        		       relative: 0.0 0.0;
+        		       offset: 150 400;
+        		    }
+        		    align: 0.0 1.0;
+        		}
+      		}
+			part { 
+				name: "button66";
+		        type: RECT;
+		        mouse_events: 1;
+        		description { 
+        			state: "default" 0.0;
+		            color: 0 150 150 150;
+        		    rel1 {
+        		       relative: 0.0 0.0;
+        		       offset: 155 350;
+        		    }
+        		    rel2 {
+        		       relative: 0.0 0.0;
+        		       offset: 200 400;
+        		    }
+        		    align: 0.0 1.0;
+        		}
+      		}
+      		part { 
+				name: "button67";
+		        type: RECT;
+		        mouse_events: 1;
+        		description { 
+        			state: "default" 0.0;
+		            color: 200 200 200 150;
+        		    rel1 {
+        		       relative: 0.0 0.0;
+        		       offset: 205 350;
+        		    }
+        		    rel2 {
+        		       relative: 0.0 0.0;
+        		       offset: 250 400;
+        		    }
+        		    align: 0.0 1.0;
+        		}
+      		}
+			part { 
+				name: "button68";
+		        type: RECT;
+		        mouse_events: 1;
+        		description { 
+        			state: "default" 0.0;
+		            color: 0 150 150 150;
+        		    rel1 {
+        		       relative: 0.0 0.0;
+        		       offset: 255 350;
+        		    }
+        		    rel2 {
+        		       relative: 0.0 0.0;
+        		       offset: 300 400;
+        		    }
+        		    align: 0.0 1.0;
+        		}
+      		}
+      		part { 
+				name: "button69";
+		        type: RECT;
+		        mouse_events: 1;
+        		description { 
+        			state: "default" 0.0;
+		            color: 200 200 200 150;
+        		    rel1 {
+        		       relative: 0.0 0.0;
+        		       offset: 305 350;
+        		    }
+        		    rel2 {
+        		       relative: 0.0 0.0;
+        		       offset: 350 400;
+        		    }
+        		    align: 0.0 1.0;
+        		}
+      		}
+			part { 
+				name: "button70";
+		        type: RECT;
+		        mouse_events: 1;
+        		description { 
+        			state: "default" 0.0;
+		            color: 0 150 150 150;
+        		    rel1 {
+        		       relative: 0.0 0.0;
+        		       offset: 355 350;
+        		    }
+        		    rel2 {
+        		       relative: 0.0 0.0;
+        		       offset: 400 400;
+        		    }
+        		    align: 0.0 1.0;
+        		}
+      		}
+      		part { 
+				name: "button71";
+		        type: RECT;
+		        mouse_events: 1;
+        		description { 
+        			state: "default" 0.0;
+		            color: 200 200 200 150;
+        		    rel1 {
+        		       relative: 0.0 0.0;
+        		       offset: 405 350;
+        		    }
+        		    rel2 {
+        		       relative: 0.0 0.0;
+        		       offset: 450 400;
+        		    }
+        		    align: 0.0 1.0;
+        		}
+      		}
+      		/* end of row 7 */       		    		    		      		
+		} /* end of parts */
+
+	} /* end of group */
+} /* end of collections */
+
+

Modified: developers/erin_yueh/pythonEFL-sudoku/setup.py
===================================================================
--- developers/erin_yueh/pythonEFL-sudoku/setup.py	2008-07-03 16:23:41 UTC (rev 4505)
+++ developers/erin_yueh/pythonEFL-sudoku/setup.py	2008-07-04 08:13:32 UTC (rev 4506)
@@ -3,7 +3,7 @@
 import sys
 import os
 
-#os.system("edje_cc ./data/theme/dummy.edc")
+os.system("edje_cc ./data/theme/sudoku.edc -id ./data/theme/image/ -fd ./data/theme/fonts/")
 
 from ez_setup import use_setuptools
 use_setuptools('0.6c3')
@@ -27,9 +27,11 @@
     install_requires=['python-evas>=0.2.1'],
     setup_requires=['python-evas>=0.2.1'],
     data_files=[
-    ('python-sudoku/image', 
+    ('sudoku/image', 
     	['data/image/dummy.png']),
-	('pythonEFL-sudoku', ['data/theme/dummy.edj']),
+     ('sudoku/puzzle', 
+    	['data/puzzle/1000']),    
+	('sudoku', ['data/theme/sudoku.edj']),
 	('applications', ['data/pythonEFL-sudoku.desktop'])
 ]
 )

Added: developers/erin_yueh/pythonEFL-sudoku/src/sudoku/__init__.py
===================================================================

Added: developers/erin_yueh/pythonEFL-sudoku/src/sudoku/solver.py
===================================================================
--- developers/erin_yueh/pythonEFL-sudoku/src/sudoku/solver.py	                        (rev 0)
+++ developers/erin_yueh/pythonEFL-sudoku/src/sudoku/solver.py	2008-07-04 08:13:32 UTC (rev 4506)
@@ -0,0 +1,252 @@
+#!/usr/bin/python
+
+import sys
+
+class SudokuSolver:
+    def __init__(self):
+        self.puzzle = None
+
+        self.row = [False] * 90
+        self.col = [False] * 90
+        self.grp = [False] * 90
+
+        self.steps = []
+        for i in xrange(9):
+            self.steps.append([])
+
+        self.scores = [-1] * 81
+
+        self.tries = []
+        for i in xrange(81):
+            self.tries.append([])
+
+        self.relatives = []
+        for r in xrange(9):
+            for c in xrange(9):
+                tmp = []
+                for x in xrange(9):
+                    if x != c:
+                        tmp.append(r * 9 + x)
+                for y in xrange(9):
+                    if y != r:
+                        tmp.append(y * 9 + c)
+                gr = (r / 3) * 3
+                gc = (c / 3) * 3
+                for y in xrange(gr, gr + 3):
+                    for x in xrange(gc, gc + 3):
+                        if y != r and x != c:
+                            tmp.append(y * 9 + x)
+
+                self.relatives.append(tmp)
+
+    def _verify(self):
+        print "verify"
+        for r in xrange(9):
+            for c in xrange(9):
+                s = self.scores[r * 9 + c]
+                if s == -1:
+                    continue
+
+                tmp = []
+                for n in xrange(1, 10):
+                    if not (self.row[r * 10 + n] or self.col[c * 10 + n] or self.grp[((r / 3) * 3 + (c / 3)) * 10 + n]):
+                        tmp.append(n)
+
+                if len(tmp) - 1 != s:
+                    print "(%d, %d) has score %d, instead of %d" % (r, c, len(tmp) - 1, s)
+                    return False
+
+                
+                old = self.tries[r * 9 + c][:]
+                old.sort()
+                if old != tmp:
+                    print "(%d, %d) has tries", tmp, "instead of", old
+
+                try:
+                    self.steps[s].index(r * 9 + c)
+                except:
+                    print "(%d, %d) @ %d is not a step" % (r, c, s)
+                    return False
+
+        return True
+
+    def _try(self, pos, n):
+        positions = []
+        for p in self.relatives[pos]:
+            if self.scores[p] >= 0 and n in self.tries[p]:
+                if len(self.tries[p]) == 1:
+                    return False
+
+                positions.append(p)
+
+        r = pos / 9
+        c = pos % 9
+        self.row[r * 10 + n] = True
+        self.col[c * 10 + n] = True
+        self.grp[((r / 3) * 3 + (c / 3)) * 10 + n] = True
+
+        self.puzzle[r][c] = n
+
+        for p in positions:
+            self.tries[p].remove(n)
+            s = self.scores[p]
+            self.scores[p] -= 1
+            self.steps[s - 1][:0] = [p]
+            self.steps[s].remove(p)
+
+        return True
+
+    def _undo(self, pos, n):
+        r = pos / 9
+        c = pos % 9
+        self.row[r * 10 + n] = False
+        self.col[c * 10 + n] = False
+        self.grp[((r / 3) * 3 + (c / 3)) * 10 + n] = False
+
+        self.puzzle[r][c] = 0
+
+        for p in self.relatives[pos]:
+            old_score = self.scores[p]
+            if old_score == -1:
+                continue
+
+            if n not in self.tries[p]:
+                y = p / 9
+                x = p % 9
+                if not (self.row[y * 10 + n] or self.col[x * 10 + n] or self.grp[((y / 3) * 3 + (x / 3)) * 10 + n]):
+                    self.tries[p][:0] = [n]
+                    self.scores[p] += 1
+                    self.steps[old_score + 1][:0] = [p]
+                    self.steps[old_score].remove(p)
+
+    def _solve(self):
+        pos = 81
+        for score in xrange(9):
+            if self.steps[score]:
+                pos = self.steps[score].pop()
+                break
+        if pos >= 81:
+            return True
+
+        self.scores[pos] = -1
+
+        for n in self.tries[pos]:
+            if self._try(pos, n):
+                if self._solve():
+                    return True
+                self._undo(pos, n)
+
+        self.scores[pos] = score
+        self.steps[score].append(pos)
+
+        return False
+
+    def _analyze(self):
+        for i in xrange(90):
+            self.row[i] = False
+            self.col[i] = False
+            self.grp[i] = False
+
+        for r in xrange(9):
+            for c in xrange(9):
+                pos = r * 9 + c
+                v = self.puzzle[r][c]
+                if v:
+                    if self.row[r * 10 + v] or self.col[c * 10 + v] or self.grp[((r / 3) * 3 + (c / 3)) * 10 + v]:
+                        return False
+
+                    self.row[r * 10 + v] = True
+                    self.col[c * 10 + v] = True
+                    self.grp[((r / 3) * 3 + (c / 3)) * 10 + v] = True
+
+                    self.scores[pos] = -1
+
+        for i in xrange(9):
+            self.steps[i] = []
+
+        for r in xrange(9):
+            for c in xrange(9):
+                pos = r * 9 + c
+                v = self.puzzle[r][c]
+                if not v:
+                    tries = []
+                    for n in xrange(1, 10):
+                        if not (self.row[r * 10 + n] or self.col[c * 10 + n] or self.grp[((r / 3) * 3 + (c / 3)) * 10 + n]):
+                            tries.append(n)
+
+                    if not tries:
+                        return False
+                    
+                    score = len(tries) - 1
+
+                    self.tries[pos] = tries
+                    self.scores[pos] = score
+                    self.steps[score].append(pos)
+
+        while (self.steps[0]):
+            pos = self.steps[0].pop()
+            r = pos / 9
+            c = pos % 9
+
+            v = self.tries[pos].pop()
+
+            self.row[r * 10 + v] = True
+            self.col[c * 10 + v] = True
+            self.grp[((r / 3) * 3 + (c / 3)) * 10 + v] = True
+            self.puzzle[r][c] = v
+
+            self.scores[pos] = -1
+
+            for p in self.relatives[pos]:
+                s = self.scores[p]
+                if s > 0 and v in self.tries[p]:
+                    self.tries[p].remove(v)
+                    self.scores[p] -= 1
+                    self.steps[s - 1][:0] = [p]
+                    self.steps[s].remove(p)
+
+        return True
+
+    def solve(self, puzzle):
+        self.puzzle = puzzle
+
+        if not self._analyze():
+            return False
+
+        return self._solve()
+
+def parse_file():
+    lines = sys.stdin.readlines()
+
+    puzzles = []
+    for l in lines:
+        if (len(l) != 82):
+            print "xxx"
+            continue
+
+        p = []
+        for i in xrange(9):
+            t = []
+            for j in xrange(9):
+                t.append(int(l[i * 9 + j]))
+            p.append(t)
+        puzzles.append(p)
+
+    return puzzles
+
+def main():
+    solver = SudokuSolver()
+    puzzles = parse_file()
+
+    for p in puzzles:
+        if (solver.solve(p)):
+            pass
+            for i in xrange(9):
+                print p[i]
+            print
+        else:
+            print "no solution"
+        
+
+if __name__ == "__main__":
+    main()

Modified: developers/erin_yueh/pythonEFL-sudoku/src/sudoku_ui.py
===================================================================
--- developers/erin_yueh/pythonEFL-sudoku/src/sudoku_ui.py	2008-07-03 16:23:41 UTC (rev 4505)
+++ developers/erin_yueh/pythonEFL-sudoku/src/sudoku_ui.py	2008-07-04 08:13:32 UTC (rev 4506)
@@ -0,0 +1,105 @@
+#!/usr/bin/python
+
+import ecore.evas
+import ecore
+import edje
+import random
+import etk
+
+WINDOW_WIDTH = 455
+WINDOW_HEIGHT = 640
+
+def button_cb(zoom_in, emission, source):
+    print 'emission,source:',emission,source
+    
+    return True
+
+    
+def puzzle_but_number_cb(zoom_in, emission, source):
+    print 'emission,source:',emission,source
+    
+    return True
+    
+def get_puzzle():
+    
+        file_name = "/usr/share/sudoku/puzzle/1000"
+        fIn = open(file_name, 'r')
+        fIn.seek(82*(random.randint(1, 1000)))
+        l = fIn.readline()
+    
+        if (len(l) != 82):
+            print "xxx"
+
+        p = []
+        for i in xrange(9):
+            t = []
+            for j in xrange(9):
+                t.append(int(l[i * 9 + j]))
+            p.append(t)
+        
+        
+        return p
+    
+def main():
+
+    global ee
+
+    ee = ecore.evas.SoftwareX11(w=455, h=640)
+    ee.title_set('sudoku')
+    ee.size_min_set(WINDOW_WIDTH,WINDOW_HEIGHT)
+    canvas = ee.evas
+    
+    # create a background 
+    bg = edje.Edje(canvas, file="/usr/share/sudoku/sudoku.edj", group="pythonEFL-sudoku/background")
+    bg.pos = (0, 0)
+    bg.size = canvas.size
+    bg.show()
+    ee.data["bg"] = bg
+
+    # create puzzle and icons
+    area = edje.Edje(canvas, file="/usr/share/sudoku/sudoku.edj", group="pythonEFL-sudoku/panel")
+    area.pos = (0, 0)
+    area.size = canvas.size
+    area.show()
+    area.data["area"] = area
+    # set a signal callback for all buttons
+    area.signal_callback_add("mouse,clicked,*", "*", button_cb)
+
+    # create puzzle and icons
+    board = edje.Edje(canvas, file="/usr/share/sudoku/sudoku.edj", group="pythonEFL-sudoku/board")
+    board.signal_callback_add("mouse,clicked,*", "*", puzzle_but_number_cb)
+    board.pos = (0, 0)
+    #test.size = canvas.size
+    board.show()
+    
+    puzzle = get_puzzle()
+    print puzzle
+    
+    element_w = 480 / 9
+    element_h = 480 / 9 
+    # put all elements to Text objects
+    for i in xrange (9):
+        for j in xrange(9):
+            x = 5 + (element_w * (i))
+            y = 5 + (element_h * (j))
+            #print i,j
+            value = puzzle[i][j]
+            display = str(value)
+            addr = i*9 + j
+            text = canvas.Text(text=display, font=("sans serif", 16), color=(0,255,255,255))
+            #print i,j,x,y
+            text.pos_set(x,y)
+            text.show()
+            text_data = "button" + str(addr)
+            ee.data[text_data] = text
+            print 'TRY:',text_data, ee.data[text_data]
+            
+    
+    
+    ee.show()
+    #ecore.animator_add(animate_line)
+    #ecore.animator_frametime_set(1.0 / 30.0)   
+    ecore.main_loop_begin()
+    
+if __name__ == "__main__":
+	main()
\ No newline at end of file





More information about the commitlog mailing list